X-Git-Url: http://git.ozo.com/?a=blobdiff_plain;f=target%2Flinux%2Fifxmips%2Ffiles%2Farch%2Fmips%2Fpci%2Fpci-ifxmips.c;h=64f37d556415c2c9a35181103468cc7be31e994a;hb=907087e56e1bb5f276e245e858e787447b44e96c;hp=47bb1e612630576030ebf4550594256434c351aa;hpb=88731c199b6c0d769cd768213bd85e31069d8804;p=openwrt-10.03%2F.git diff --git a/target/linux/ifxmips/files/arch/mips/pci/pci-ifxmips.c b/target/linux/ifxmips/files/arch/mips/pci/pci-ifxmips.c index 47bb1e612..64f37d556 100644 --- a/target/linux/ifxmips/files/arch/mips/pci/pci-ifxmips.c +++ b/target/linux/ifxmips/files/arch/mips/pci/pci-ifxmips.c @@ -4,11 +4,11 @@ #include #include #include -#include -#include -#include #include #include +#include +#include +#include #define IFXMIPS_PCI_MEM_BASE 0x18000000 #define IFXMIPS_PCI_MEM_SIZE 0x02000000 @@ -49,6 +49,8 @@ static struct pci_controller ifxmips_pci_controller = .io_offset = 0x00000000UL, }; +/* the cpu can can generate the 33Mhz or rely on an external clock the cgu needs the + proper setting, otherwise the cpu hangs. we have no way of runtime detecting this */ u32 ifxmips_pci_mapped_cfg; int ifxmips_pci_external_clock = 0; @@ -87,6 +89,17 @@ pcibios_plat_dev_init(struct pci_dev *dev) return 0; } +static u32 calc_bar11mask(void) +{ + u32 mem, bar11mask; + + /* BAR11MASK value depends on available memory on system. */ + mem = num_physpages * PAGE_SIZE; + bar11mask = (0x0ffffff0 & ~((1 << (fls(mem) -1)) -1)) | 8; + + return bar11mask; +} + static void __init ifxmips_pci_startup(void) { @@ -136,7 +149,7 @@ ifxmips_pci_startup(void) ifxmips_w32(0x19800000, PCI_CR_FCI_ADDR_MAP6); ifxmips_w32(0x19c00000, PCI_CR_FCI_ADDR_MAP7); ifxmips_w32(0x1ae00000, PCI_CR_FCI_ADDR_MAP11hg); - ifxmips_w32(0x0e000008, PCI_CR_BAR11MASK); + ifxmips_w32(calc_bar11mask(), PCI_CR_BAR11MASK); ifxmips_w32(0, PCI_CR_PCI_ADDR_MAP11); ifxmips_w32(0, PCI_CS_BASE_ADDR1); #ifdef CONFIG_SWAP_IO_SPACE