From d5a6e89b8ff788cdcc0f195857ff042be1bf3116 Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Fri, 25 Aug 2006 21:53:54 +0000 Subject: add basic support for the Magicbox boards git-svn-id: svn://svn.openwrt.org/openwrt/branches/buildroot-ng/openwrt@4672 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches/001-magicbox_support.patch | 508 +++++++++++++++++++++ 1 file changed, 508 insertions(+) create mode 100644 target/linux/magicbox-2.6/patches/001-magicbox_support.patch (limited to 'target/linux/magicbox-2.6/patches') diff --git a/target/linux/magicbox-2.6/patches/001-magicbox_support.patch b/target/linux/magicbox-2.6/patches/001-magicbox_support.patch new file mode 100644 index 0000000000..57d3b31081 --- /dev/null +++ b/target/linux/magicbox-2.6/patches/001-magicbox_support.patch @@ -0,0 +1,508 @@ +diff -Nur linux-2.6.17/arch/ppc/platforms/4xx/Kconfig linux-2.6.17-owrt/arch/ppc/platforms/4xx/Kconfig +--- linux-2.6.17/arch/ppc/platforms/4xx/Kconfig 2006-06-18 03:49:35.000000000 +0200 ++++ linux-2.6.17-owrt/arch/ppc/platforms/4xx/Kconfig 2006-08-25 23:33:05.000000000 +0200 +@@ -52,6 +52,12 @@ + help + This option enables support for the IBM PPC405GP evaluation board. + ++config MAGICBOX ++ bool "MagicBox" ++ select WANT_EARLY_SERIAL ++ help ++ This option enables support for the IBM PPC405EP evaluation board. ++ + config XILINX_ML300 + bool "Xilinx-ML300" + help +@@ -173,7 +179,7 @@ + + config IBM_OCP + bool +- depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT ++ depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT || MAGICBOX + default y + + config IBM_EMAC4 +@@ -183,7 +189,7 @@ + + config BIOS_FIXUP + bool +- depends on BUBINGA || EP405 || SYCAMORE || WALNUT ++ depends on BUBINGA || EP405 || SYCAMORE || WALNUT || MAGICBOX + default y + + # OAK doesn't exist but wanted to keep this around for any future 403GCX boards +@@ -194,7 +200,7 @@ + + config 405EP + bool +- depends on BUBINGA ++ depends on BUBINGA || MAGICBOX + default y + + config 405GP +diff -Nur linux-2.6.17/arch/ppc/platforms/4xx/magicbox.c linux-2.6.17-owrt/arch/ppc/platforms/4xx/magicbox.c +--- linux-2.6.17/arch/ppc/platforms/4xx/magicbox.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.17-owrt/arch/ppc/platforms/4xx/magicbox.c 2006-08-25 23:33:05.000000000 +0200 +@@ -0,0 +1,249 @@ ++/* ++ * Support for IBM PPC 405EP-based MagicBox board ++ * Copyright (C) 2006 Karol Lewandowski ++ * ++ * Heavily based on bubinga.c ++ * ++ * Author: SAW (IBM), derived from walnut.c. ++ * Maintained by MontaVista Software ++ * ++ * 2003 (c) MontaVista Softare Inc. This file is licensed under the ++ * terms of the GNU General Public License version 2. This program is ++ * licensed "as is" without any warranty of any kind, whether express ++ * or implied. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#undef DEBUG ++ ++#ifdef DEBUG ++#define DBG(x...) printk(x) ++#else ++#define DBG(x...) ++#endif ++ ++extern bd_t __res; ++ ++/* Some IRQs unique to board ++ * Used by the generic 405 PCI setup functions in ppc4xx_pci.c ++ */ ++int __init ++ppc405_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) ++{ ++ static char pci_irq_table[][4] = ++ /* ++ * PCI IDSEL/INTPIN->INTLINE ++ * A B C D ++ */ ++ { ++ {28, 28, 28, 28}, /* IDSEL 1 - PCI slot 1 */ ++ {29, 29, 29, 29}, /* IDSEL 2 - PCI slot 2 */ ++ {30, 30, 30, 30}, /* IDSEL 3 - PCI slot 3 */ ++ {31, 31, 31, 31}, /* IDSEL 4 - PCI slot 4 */ ++ }; ++ ++ const long min_idsel = 1, max_idsel = 4, irqs_per_slot = 4; ++ return PCI_IRQ_TABLE_LOOKUP; ++}; ++ ++ ++/* The serial clock for the chip is an internal clock determined by ++ * different clock speeds/dividers. ++ * Calculate the proper input baud rate and setup the serial driver. ++ */ ++static void __init ++magicbox_early_serial_map(void) ++{ ++ u32 uart_div; ++ int uart_clock; ++ struct uart_port port; ++ ++ /* Calculate the serial clock input frequency ++ * ++ * The base baud is the PLL OUTA (provided in the board info ++ * structure) divided by the external UART Divisor, divided ++ * by 16. ++ */ ++ uart_div = (mfdcr(DCRN_CPC0_UCR_BASE) & DCRN_CPC0_UCR_U0DIV); ++ uart_clock = __res.bi_procfreq / uart_div; ++ ++ /* Setup serial port access */ ++ memset(&port, 0, sizeof(port)); ++ port.membase = (void*)ACTING_UART0_IO_BASE; ++ port.irq = ACTING_UART0_INT; ++ port.uartclk = uart_clock; ++ port.regshift = 0; ++ port.iotype = SERIAL_IO_MEM; ++ port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; ++ port.line = 0; ++ ++ if (early_serial_setup(&port) != 0) { ++ printk("Early serial init of port 0 failed\n"); ++ } ++ ++ port.membase = (void*)ACTING_UART1_IO_BASE; ++ port.irq = ACTING_UART1_INT; ++ port.line = 1; ++ ++ if (early_serial_setup(&port) != 0) { ++ printk("Early serial init of port 1 failed\n"); ++ } ++} ++ ++void __init ++bios_fixup(struct pci_controller *hose, struct pcil0_regs *pcip) ++{ ++ unsigned int bar_response, bar; ++ /* ++ * Expected PCI mapping: ++ * ++ * PLB addr PCI memory addr ++ * --------------------- --------------------- ++ * 0000'0000 - 7fff'ffff <--- 0000'0000 - 7fff'ffff ++ * 8000'0000 - Bfff'ffff ---> 8000'0000 - Bfff'ffff ++ * ++ * PLB addr PCI io addr ++ * --------------------- --------------------- ++ * e800'0000 - e800'ffff ---> 0000'0000 - 0001'0000 ++ * ++ * The following code is simplified by assuming that the bootrom ++ * has been well behaved in following this mapping. ++ */ ++ ++#ifdef DEBUG ++ int i; ++ ++ printk("ioremap PCLIO_BASE = 0x%x\n", pcip); ++ printk("PCI bridge regs before fixup \n"); ++ for (i = 0; i <= 3; i++) { ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha))); ++ } ++ printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms))); ++ printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la))); ++ printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms))); ++ printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la))); ++ ++#endif ++ ++ /* added for IBM boot rom version 1.15 bios bar changes -AK */ ++ ++ /* Disable region first */ ++ out_le32((void *) &(pcip->pmm[0].ma), 0x00000000); ++ /* PLB starting addr, PCI: 0x80000000 */ ++ out_le32((void *) &(pcip->pmm[0].la), 0x80000000); ++ /* PCI start addr, 0x80000000 */ ++ out_le32((void *) &(pcip->pmm[0].pcila), PPC405_PCI_MEM_BASE); ++ /* 512MB range of PLB to PCI */ ++ out_le32((void *) &(pcip->pmm[0].pciha), 0x00000000); ++ /* Enable no pre-fetch, enable region */ ++ out_le32((void *) &(pcip->pmm[0].ma), ((0xffffffff - ++ (PPC405_PCI_UPPER_MEM - ++ PPC405_PCI_MEM_BASE)) | 0x01)); ++ ++ /* Disable region one */ ++ out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].la), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].pcila), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].pciha), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); ++ out_le32((void *) &(pcip->ptm1ms), 0x00000001); ++ ++ /* Disable region two */ ++ out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].la), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].pcila), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].pciha), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); ++ out_le32((void *) &(pcip->ptm2ms), 0x00000000); ++ out_le32((void *) &(pcip->ptm2la), 0x00000000); ++ ++ /* Zero config bars */ ++ for (bar = PCI_BASE_ADDRESS_1; bar <= PCI_BASE_ADDRESS_2; bar += 4) { ++ early_write_config_dword(hose, hose->first_busno, ++ PCI_FUNC(hose->first_busno), bar, ++ 0x00000000); ++ early_read_config_dword(hose, hose->first_busno, ++ PCI_FUNC(hose->first_busno), bar, ++ &bar_response); ++ DBG("BUS %d, device %d, Function %d bar 0x%8.8x is 0x%8.8x\n", ++ hose->first_busno, PCI_SLOT(hose->first_busno), ++ PCI_FUNC(hose->first_busno), bar, bar_response); ++ } ++ /* end work arround */ ++ ++#ifdef DEBUG ++ printk("PCI bridge regs after fixup \n"); ++ for (i = 0; i <= 3; i++) { ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha))); ++ } ++ printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms))); ++ printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la))); ++ printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms))); ++ printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la))); ++ ++#endif /* DEBUG */ ++} ++ ++void __init ++magicbox_setup_arch(void) ++{ ++ ppc4xx_setup_arch(); ++ ++ ibm_ocp_set_emac(0, 1); ++ ++ magicbox_early_serial_map(); ++ ++ /* Identify the system */ ++ printk("MagicBox port (C) 2005 Karol Lewandowski \n"); ++} ++ ++void __init ++magicbox_map_io(void) ++{ ++ ppc4xx_map_io(); ++} ++ ++void __init ++platform_init(unsigned long r3, unsigned long r4, unsigned long r5, ++ unsigned long r6, unsigned long r7) ++{ ++ ppc4xx_init(r3, r4, r5, r6, r7); ++ ++ ppc_md.setup_arch = magicbox_setup_arch; ++ ppc_md.setup_io_mappings = magicbox_map_io; ++ ++#ifdef CONFIG_KGDB ++ ppc_md.early_serial_map = bubinga_early_serial_map; ++#endif ++ ++} +diff -Nur linux-2.6.17/arch/ppc/platforms/4xx/magicbox.h linux-2.6.17-owrt/arch/ppc/platforms/4xx/magicbox.h +--- linux-2.6.17/arch/ppc/platforms/4xx/magicbox.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.17-owrt/arch/ppc/platforms/4xx/magicbox.h 2006-08-25 23:33:05.000000000 +0200 +@@ -0,0 +1,47 @@ ++/* ++ * Support for IBM PPC 405EP-based MagicBox board ++ * ++ * Heavily based on bubinga.h ++ * ++ * ++ * Author: SAW (IBM), derived from walnut.h. ++ * Maintained by MontaVista Software ++ * ++ * 2003 (c) MontaVista Softare Inc. This file is licensed under the ++ * terms of the GNU General Public License version 2. This program is ++ * licensed "as is" without any warranty of any kind, whether express ++ * or implied. ++ */ ++ ++#ifdef __KERNEL__ ++#ifndef __MAGICBOX_H__ ++#define __MAGICBOX_H__ ++ ++#include ++#include ++#include ++ ++/* Memory map for the "MagicBox" 405EP evaluation board -- generic 4xx. */ ++ ++/* The UART clock is based off an internal clock - ++ * define BASE_BAUD based on the internal clock and divider(s). ++ * Since BASE_BAUD must be a constant, we will initialize it ++ * using clock/divider values which OpenBIOS initializes ++ * for typical configurations at various CPU speeds. ++ * The base baud is calculated as (FWDA / EXT UART DIV / 16) ++ */ ++#define BASE_BAUD 0 ++ ++/* Flash */ ++#define PPC40x_FPGA_BASE 0xF0300000 ++#define PPC40x_FPGA_REG_OFFS 1 /* offset to flash map reg */ ++#define PPC40x_FLASH_ONBD_N(x) (x & 0x02) ++#define PPC40x_FLASH_SRAM_SEL(x) (x & 0x01) ++#define PPC40x_FLASH_LOW 0xFFF00000 ++#define PPC40x_FLASH_HIGH 0xFFF80000 ++#define PPC40x_FLASH_SIZE 0x80000 ++ ++#define PPC4xx_MACHINE_NAME "MagicBox" ++ ++#endif /* __MAGICBOX_H__ */ ++#endif /* __KERNEL__ */ +diff -Nur linux-2.6.17/arch/ppc/platforms/4xx/Makefile linux-2.6.17-owrt/arch/ppc/platforms/4xx/Makefile +--- linux-2.6.17/arch/ppc/platforms/4xx/Makefile 2006-06-18 03:49:35.000000000 +0200 ++++ linux-2.6.17-owrt/arch/ppc/platforms/4xx/Makefile 2006-08-25 23:33:05.000000000 +0200 +@@ -13,6 +13,7 @@ + obj-$(CONFIG_REDWOOD_6) += redwood6.o + obj-$(CONFIG_SYCAMORE) += sycamore.o + obj-$(CONFIG_WALNUT) += walnut.o ++obj-$(CONFIG_MAGICBOX) += magicbox.o + obj-$(CONFIG_XILINX_ML300) += xilinx_ml300.o + obj-$(CONFIG_XILINX_ML403) += xilinx_ml403.o + +diff -Nur linux-2.6.17/drivers/mtd/maps/Kconfig linux-2.6.17-owrt/drivers/mtd/maps/Kconfig +--- linux-2.6.17/drivers/mtd/maps/Kconfig 2006-06-18 03:49:35.000000000 +0200 ++++ linux-2.6.17-owrt/drivers/mtd/maps/Kconfig 2006-08-25 23:33:05.000000000 +0200 +@@ -323,6 +323,15 @@ + Walnut board. If you have one of these boards and would like to + use the flash chips on it, say 'Y'. + ++config MTD_MAGICMAP ++ tristate "Flash device mapped on IBM 405EP MagicBox" ++ depends on MTD_CFI && MTD_PARTITIONS && 40x && MAGICBOX ++ help ++ This enables access routines for the flash chips on the IBM 405EP ++ MagicBox board. If you have one of these boards and would like to ++ use the flash chips on it, say 'Y'. ++ ++ + config MTD_EBONY + tristate "Flash devices mapped on IBM 440GP Ebony" + depends on MTD_JEDECPROBE && EBONY +diff -Nur linux-2.6.17/drivers/mtd/maps/magicmap.c linux-2.6.17-owrt/drivers/mtd/maps/magicmap.c +--- linux-2.6.17/drivers/mtd/maps/magicmap.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.17-owrt/drivers/mtd/maps/magicmap.c 2006-08-25 23:33:05.000000000 +0200 +@@ -0,0 +1,102 @@ ++/* ++ * magicmap.c: Copyleft 2005 Karol Lewandowski ++ * ++ * Mapping for MagicBox flash. ++ * Based on walnut.c. ++ * ++ * Heikki Lindholm ++ * ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static struct mtd_info *flash; ++ ++static struct map_info magic_map = { ++ .name = "Magically mapped flash", ++ .phys = 0xffc00000, ++ .size = 0x400000, ++ .bankwidth = 2, ++}; ++ ++static struct mtd_partition magic_partitions[] = { ++ { ++ .name = "kernel", ++ .offset = 0x0, ++ .size = 0x0e0000, ++ }, ++ { ++ .name = "ramdisk", ++ .offset = 0x0e0000, ++ .size = 0x2c0000, ++ }, ++ { ++ .name = "persistent", ++ .offset = 0x3a0000, ++ .size = 0x020000, ++ }, ++ { ++ .name = "bootloader", ++ .offset = 0x3c0000, ++ .size = 0x040000, ++ .mask_flags = MTD_WRITEABLE, ++ }, ++}; ++ ++int __init init_magic(void) ++{ ++ magic_map.virt = ++ (void __iomem *)ioremap(magic_map.phys, magic_map.size); ++ ++ if (!magic_map.virt) { ++ printk("Failed to ioremap flash.\n"); ++ return -EIO; ++ } ++ ++ simple_map_init(&magic_map); ++ ++ flash = do_map_probe("cfi_probe", &magic_map); ++ if (flash) { ++ flash->owner = THIS_MODULE; ++ add_mtd_partitions(flash, magic_partitions, ++ ARRAY_SIZE(magic_partitions)); ++ } else { ++ printk("map probe failed for flash\n"); ++ return -ENXIO; ++ } ++ ++ return 0; ++} ++ ++static void __exit cleanup_magic(void) ++{ ++ if (flash) { ++ del_mtd_partitions(flash); ++ map_destroy(flash); ++ } ++ ++ if (magic_map.virt) { ++ iounmap((void *)magic_map.virt); ++ magic_map.virt = NULL; ++ } ++} ++ ++module_init(init_magic); ++module_exit(cleanup_magic); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Karol Lewandowski"); ++MODULE_DESCRIPTION("MTD map and partitions for IBM 405EP MagicBox boards"); +diff -Nur linux-2.6.17/drivers/mtd/maps/Makefile linux-2.6.17-owrt/drivers/mtd/maps/Makefile +--- linux-2.6.17/drivers/mtd/maps/Makefile 2006-06-18 03:49:35.000000000 +0200 ++++ linux-2.6.17-owrt/drivers/mtd/maps/Makefile 2006-08-25 23:33:05.000000000 +0200 +@@ -58,6 +58,7 @@ + obj-$(CONFIG_MTD_BEECH) += beech-mtd.o + obj-$(CONFIG_MTD_ARCTIC) += arctic-mtd.o + obj-$(CONFIG_MTD_WALNUT) += walnut.o ++obj-$(CONFIG_MTD_MAGICMAP) += magicmap.o + obj-$(CONFIG_MTD_H720X) += h720x-flash.o + obj-$(CONFIG_MTD_SBC8240) += sbc8240.o + obj-$(CONFIG_MTD_NOR_TOTO) += omap-toto-flash.o +diff -Nur linux-2.6.17/include/asm-ppc/ibm4xx.h linux-2.6.17-owrt/include/asm-ppc/ibm4xx.h +--- linux-2.6.17/include/asm-ppc/ibm4xx.h 2006-06-18 03:49:35.000000000 +0200 ++++ linux-2.6.17-owrt/include/asm-ppc/ibm4xx.h 2006-08-25 23:33:05.000000000 +0200 +@@ -19,6 +19,10 @@ + + #ifdef CONFIG_40x + ++#if defined(CONFIG_MAGICBOX) ++#include ++#endif ++ + #if defined(CONFIG_BUBINGA) + #include + #endif -- cgit v1.2.3