diff options
Diffstat (limited to 'target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch')
| -rw-r--r-- | target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch | 127 | 
1 files changed, 85 insertions, 42 deletions
diff --git a/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch b/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch index 538ef69a1..686f2d2af 100644 --- a/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch +++ b/target/linux/linux-2.6/patches/brcm/001-bcm947xx.patch @@ -1247,7 +1247,7 @@ diff -urN linux.old/arch/mips/bcm947xx/broadcom/linux_osl.c linux.dev/arch/mips/  +  diff -urN linux.old/arch/mips/bcm947xx/broadcom/nvram.c linux.dev/arch/mips/bcm947xx/broadcom/nvram.c  --- linux.old/arch/mips/bcm947xx/broadcom/nvram.c	1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/arch/mips/bcm947xx/broadcom/nvram.c	2005-12-17 21:41:45.656819500 +0100 ++++ linux.dev/arch/mips/bcm947xx/broadcom/nvram.c	2005-12-18 04:59:36.185204500 +0100  @@ -0,0 +1,165 @@  +/*  + * NVRAM variable manipulation (Linux kernel half) @@ -1294,7 +1294,7 @@ diff -urN linux.old/arch/mips/bcm947xx/broadcom/nvram.c linux.dev/arch/mips/bcm9  +extern spinlock_t bcm947xx_sbh_lock;  +static int cfe_env;  + -+extern char *cfe_env_get(unsigned char *nv_buf, char *name); ++extern char *cfe_env_get(char *nv_buf, const char *name);  +		  +  +/* Convenience */ @@ -2458,8 +2458,8 @@ diff -urN linux.old/arch/mips/bcm947xx/broadcom/sbmips.c linux.dev/arch/mips/bcm  +  diff -urN linux.old/arch/mips/bcm947xx/broadcom/sbpci.c linux.dev/arch/mips/bcm947xx/broadcom/sbpci.c  --- linux.old/arch/mips/bcm947xx/broadcom/sbpci.c	1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/arch/mips/bcm947xx/broadcom/sbpci.c	2005-12-15 23:50:31.846688500 +0100 -@@ -0,0 +1,531 @@ ++++ linux.dev/arch/mips/bcm947xx/broadcom/sbpci.c	2005-12-18 05:36:53.351735500 +0100 +@@ -0,0 +1,533 @@  +/*  + * Low-Level PCI and SB support for BCM47xx  + * @@ -2873,9 +2873,11 @@ diff -urN linux.old/arch/mips/bcm947xx/broadcom/sbpci.c linux.dev/arch/mips/bcm9  +			subclass = PCI_MEMORY_RAM;  +			break;  +		case SB_PCI: ++#if 0  +			class = PCI_CLASS_BRIDGE;  +			subclass = PCI_BRIDGE_PCI;  +			break; ++#endif  +		case SB_MIPS:  +		case SB_MIPS33:  +			class = PCI_CLASS_CPU; @@ -11219,8 +11221,8 @@ diff -urN linux.old/arch/mips/bcm947xx/irq.c linux.dev/arch/mips/bcm947xx/irq.c  +}  diff -urN linux.old/arch/mips/bcm947xx/pci.c linux.dev/arch/mips/bcm947xx/pci.c  --- linux.old/arch/mips/bcm947xx/pci.c	1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/arch/mips/bcm947xx/pci.c	2005-12-17 18:11:52.350836000 +0100 -@@ -0,0 +1,92 @@ ++++ linux.dev/arch/mips/bcm947xx/pci.c	2005-12-18 04:44:18.736590500 +0100 +@@ -0,0 +1,91 @@  +#include <linux/kernel.h>  +#include <linux/init.h>  +#include <linux/pci.h> @@ -11263,7 +11265,6 @@ diff -urN linux.old/arch/mips/bcm947xx/pci.c linux.dev/arch/mips/bcm947xx/pci.c  +	.write  = sb_pci_write_config,  +};  + -+  +static struct resource sb_pci_mem_resource = {  +	.name   = "SB PCI Memory resources",  +	.start  = SB_ENUM_BASE, @@ -11273,8 +11274,8 @@ diff -urN linux.old/arch/mips/bcm947xx/pci.c linux.dev/arch/mips/bcm947xx/pci.c  +  +static struct resource sb_pci_io_resource = {  +	.name   = "SB PCI I/O resources", -+	.start  = 0x100, -+	.end    = 0x1FF, ++	.start  = 0x000, ++	.end    = 0x0FF,  +	.flags  = IORESOURCE_IO,  +};  + @@ -11287,27 +11288,27 @@ diff -urN linux.old/arch/mips/bcm947xx/pci.c linux.dev/arch/mips/bcm947xx/pci.c  +static struct resource ext_pci_mem_resource = {  +	.name   = "Ext PCI Memory resources",  +	.start  = 0x40000000, -+	.end    = 0x40ffffff, ++	.end    = 0x7fffffff,  +	.flags  = IORESOURCE_MEM,  +};  +  +static struct resource ext_pci_io_resource = {  +	.name   = "Ext PCI I/O resources", -+	.start  = 0x200, -+	.end    = 0x2FF, ++	.start  = 0x100, ++	.end    = 0x1FF,  +	.flags  = IORESOURCE_IO,  +};  +  +static struct pci_controller bcm47xx_ext_pci_controller = {  +	.pci_ops        = &sb_pci_ops, -+	.mem_resource   = &ext_pci_mem_resource,  +	.io_resource    = &ext_pci_io_resource, ++	.mem_resource   = &ext_pci_mem_resource, ++	.mem_offset		= 0x24000000,  +};  +  +void bcm47xx_pci_init(void)  +{  +	sbpci_init(sbh); -+  +	set_io_port_base((unsigned long) ioremap_nocache(SB_PCI_MEM, 0x04000000));  +  +	register_pci_controller(&bcm47xx_sb_pci_controller); @@ -11378,7 +11379,7 @@ diff -urN linux.old/arch/mips/bcm947xx/prom.c linux.dev/arch/mips/bcm947xx/prom.  +}  diff -urN linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setup.c  --- linux.old/arch/mips/bcm947xx/setup.c	1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/arch/mips/bcm947xx/setup.c	2005-12-17 22:14:27.619043750 +0100 ++++ linux.dev/arch/mips/bcm947xx/setup.c	2005-12-18 04:58:53.946564750 +0100  @@ -0,0 +1,155 @@  +/*  + *  Copyright (C) 2004 Florian Schirmer (jolt@tuxbox.org) @@ -11423,6 +11424,8 @@ diff -urN linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setu  +#include <sbpci.h>  +#include <sbconfig.h>  +#include <bcmdevs.h> ++#include <bcmutils.h> ++#include <bcmnvram.h>  +  +extern void bcm47xx_pci_init(void);  +extern void bcm47xx_time_init(void); @@ -11504,13 +11507,11 @@ diff -urN linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setu  +	char *s;  +	int i;  +	 -+	sbh = sb_kattach(); ++	sbh = (void *) sb_kattach();  +	sb_mips_init(sbh);  +  +	bcm47xx_pci_init();  + -+	set_io_port_base((unsigned long) ioremap_nocache(SB_PCI_MEM, 0x04000000)); -+  +	sb_serial_init(sbh, serial_add);  +	boardflags = getintvar(NULL, "boardflags");  + @@ -11695,16 +11696,14 @@ diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile   # These are still pretty much in the old state, watch, go blind.  diff -urN linux.old/arch/mips/pci/fixup-bcm47xx.c linux.dev/arch/mips/pci/fixup-bcm47xx.c  --- linux.old/arch/mips/pci/fixup-bcm47xx.c	1970-01-01 01:00:00.000000000 +0100 -+++ linux.dev/arch/mips/pci/fixup-bcm47xx.c	2005-12-15 12:57:27.945158000 +0100 -@@ -0,0 +1,23 @@ ++++ linux.dev/arch/mips/pci/fixup-bcm47xx.c	2005-12-18 04:42:58.079549750 +0100 +@@ -0,0 +1,78 @@  +#include <linux/init.h>  +#include <linux/pci.h> -+ -+/* Do platform specific device initialization at pci_enable_device() time */ -+int pcibios_plat_dev_init(struct pci_dev *dev) -+{ -+	return 0; -+} ++#include <typedefs.h> ++#include <sbconfig.h> ++#include <bcmdevs.h> ++#include <pcicfg.h>  +  +int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)  +{ @@ -11717,22 +11716,66 @@ diff -urN linux.old/arch/mips/pci/fixup-bcm47xx.c linux.dev/arch/mips/pci/fixup-  +	return irq + 2;  +}  + -+struct pci_fixup pcibios_fixups[] = { -+	{ 0 } -+}; -diff -urN linux.old/arch/mips/pci/pci.c linux.dev/arch/mips/pci/pci.c ---- linux.old/arch/mips/pci/pci.c	2005-12-15 13:26:49.814003000 +0100 -+++ linux.dev/arch/mips/pci/pci.c	2005-12-17 18:08:13.553162000 +0100 -@@ -307,7 +307,8 @@ - 	if (res->flags & IORESOURCE_IO) - 		offset = hose->io_offset; - 	else if (res->flags & IORESOURCE_MEM) --		offset = hose->mem_offset; -+//		offset = hose->mem_offset; -+		offset = 0x24000000; -  - 	res->start = region->start + offset; - 	res->end = region->end + offset; ++u32 pci_iobase = 0x100; ++u32 pci_membase = SB_PCI_DMA; ++ ++static void bcm47xx_fixup_device(struct pci_dev *d) ++{ ++	struct resource *res; ++	int pos, size; ++	u32 *base; ++ ++	if (d->bus->number == 0) ++		return; ++	 ++	printk("PCI: Fixing up device %s\n", pci_name(d)); ++ ++	/* Fix up resource bases */ ++	for (pos = 0; pos < 6; pos++) { ++		res = &d->resource[pos]; ++		base = ((res->flags & IORESOURCE_IO) ? &pci_iobase : &pci_membase); ++		if (res->end) { ++			size = res->end - res->start + 1; ++			if (*base & (size - 1)) ++				*base = (*base + size) & ~(size - 1); ++			res->start = *base; ++			res->end = res->start + size - 1; ++			*base += size; ++			pci_write_config_dword(d, PCI_BASE_ADDRESS_0 + (pos << 2), res->start); ++		} ++		/* Fix up PCI bridge BAR0 only */ ++		if (d->bus->number == 1 && PCI_SLOT(d->devfn) == 0) ++			break; ++	} ++	/* Fix up interrupt lines */ ++	if (pci_find_device(VENDOR_BROADCOM, SB_PCI, NULL)) ++		d->irq = (pci_find_device(VENDOR_BROADCOM, SB_PCI, NULL))->irq; ++	pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq); ++} ++ ++static void bcm47xx_fixup_bridge(struct pci_dev *dev) ++{ ++	if (dev->bus->number != 1 || PCI_SLOT(dev->devfn) != 0) ++		return; ++	 ++	printk("PCI: fixing up bridge\n"); ++ ++	/* Enable PCI bridge bus mastering and memory space */ ++	pci_set_master(dev); ++	pcibios_enable_device(dev, ~0); ++	 ++	/* Enable PCI bridge BAR1 prefetch and burst */ ++	pci_write_config_dword(dev, PCI_BAR1_CONTROL, 3); ++} ++ ++/* Do platform specific device initialization at pci_enable_device() time */ ++int pcibios_plat_dev_init(struct pci_dev *dev) ++{ ++	bcm47xx_fixup_device(dev); ++	return 0; ++} ++ ++DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, bcm47xx_fixup_bridge);  diff -urN linux.old/include/asm-mips/bootinfo.h linux.dev/include/asm-mips/bootinfo.h  --- linux.old/include/asm-mips/bootinfo.h	2005-12-15 13:26:49.818001250 +0100  +++ linux.dev/include/asm-mips/bootinfo.h	2005-12-15 12:57:27.969147500 +0100  | 
