32136568a9
I've encountered a serious problem with PCI config space access on Au1x000 platforms with recent 2.6.x-kernel. With 2.4.31 the same hardware works fine. So I was looking for the differences: Symptoms: - no PCI-device is seen on bootup though two or three cards are present - lspci output is empty - OR: lspci shows 20 times the same device (- OR: in some slot-configurations it worked anyhow) System(s): 1. platform with Au1500 and three PCI-devices (actually a mycable XXS1500 with backplane for three PCI-devices) 2. platform with Au1550 and two PCI-devices (custom board) Debugging: I digged down to the config_access() of the au1xxx-processors in arch/mips/pci/ops-au1000.c and switched on DEBUG. The code of config_access() seems to be almost the same as of the 2.4.x-kernel. But the "pci_cfg_vm->addr" returned by get_vm_area(0x2000, 0) once on booting is different. That's of course not forbidden. But the alignment seems to be wrong. In my case, I received: 2.4.31: pci_cfg_vm->addr = c0000000 2.6.18-rc5: pci_cfg_vm->addr = c0101000 To make it short: With 2.6.x it fails on the first config-access with: "PCI ERR detected: status 83a00356". Fixup: My fix is now, to use the VM_IOREMAP-flag in the get_vm_area call. This flag seems to be introduced in mm/vmalloc.c a long time ago (in 2.6.7-bk13, I found in gitweb). Now, the returned address is pci_cfg_vm->addr = c0104000 and everything works fine. Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
||
---|---|---|
.. | ||
fixup-atlas.c | ||
fixup-au1000.c | ||
fixup-capcella.c | ||
fixup-cobalt.c | ||
fixup-ddb5477.c | ||
fixup-emma2rh.c | ||
fixup-ev64120.c | ||
fixup-ev96100.c | ||
fixup-excite.c | ||
fixup-ip32.c | ||
fixup-ite8172g.c | ||
fixup-ivr.c | ||
fixup-jaguar.c | ||
fixup-jmr3927.c | ||
fixup-malta.c | ||
fixup-mpc30x.c | ||
fixup-ocelot3.c | ||
fixup-ocelot-c.c | ||
fixup-ocelot-g.c | ||
fixup-ocelot.c | ||
fixup-pnx8550.c | ||
fixup-rbtx4927.c | ||
fixup-sb1250.c | ||
fixup-sni.c | ||
fixup-tb0219.c | ||
fixup-tb0226.c | ||
fixup-tb0287.c | ||
fixup-tx4938.c | ||
fixup-vr4133.c | ||
fixup-wrppmc.c | ||
fixup-yosemite.c | ||
Makefile | ||
ops-au1000.c | ||
ops-bonito64.c | ||
ops-bridge.c | ||
ops-ddb5477.c | ||
ops-emma2rh.c | ||
ops-gt64111.c | ||
ops-gt64120.c | ||
ops-gt96100.c | ||
ops-it8172.c | ||
ops-mace.c | ||
ops-marvell.c | ||
ops-msc.c | ||
ops-nile4.c | ||
ops-pnx8550.c | ||
ops-sni.c | ||
ops-titan-ht.c | ||
ops-titan.c | ||
ops-tx3927.c | ||
ops-tx4927.c | ||
ops-tx4938.c | ||
ops-vr41xx.c | ||
pci-bcm1480.c | ||
pci-bcm1480ht.c | ||
pci-ddb5477.c | ||
pci-emma2rh.c | ||
pci-ev96100.c | ||
pci-excite.c | ||
pci-ip27.c | ||
pci-ip32.c | ||
pci-jmr3927.c | ||
pci-lasat.c | ||
pci-ocelot-c.c | ||
pci-ocelot-g.c | ||
pci-ocelot.c | ||
pci-sb1250.c | ||
pci-vr41xx.c | ||
pci-vr41xx.h | ||
pci-yosemite.c | ||
pci.c |