diff options
author | Alexander Bigga <ab@mycable.de> | 2006-08-29 10:48:34 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2006-09-27 08:37:38 -0400 |
commit | 32136568a9828c27c07eedb8d2b3e3d9fe8d87ba (patch) | |
tree | 97b07246b93d46b9ad9bcc654a1178077d503053 /arch/mips/pci/ops-au1000.c | |
parent | 898d229107f7aa8ea45685c11e2930783755f9ba (diff) |
[MIPS] Fix for pci config_access on alchemy au1x000
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>
Diffstat (limited to 'arch/mips/pci/ops-au1000.c')
-rw-r--r-- | arch/mips/pci/ops-au1000.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/arch/mips/pci/ops-au1000.c b/arch/mips/pci/ops-au1000.c index 0c0c1e6519f9..8ae46481fcb7 100644 --- a/arch/mips/pci/ops-au1000.c +++ b/arch/mips/pci/ops-au1000.c | |||
@@ -110,7 +110,7 @@ static int config_access(unsigned char access_type, struct pci_bus *bus, | |||
110 | if (first_cfg) { | 110 | if (first_cfg) { |
111 | /* reserve a wired entry for pci config accesses */ | 111 | /* reserve a wired entry for pci config accesses */ |
112 | first_cfg = 0; | 112 | first_cfg = 0; |
113 | pci_cfg_vm = get_vm_area(0x2000, 0); | 113 | pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP); |
114 | if (!pci_cfg_vm) | 114 | if (!pci_cfg_vm) |
115 | panic (KERN_ERR "PCI unable to get vm area\n"); | 115 | panic (KERN_ERR "PCI unable to get vm area\n"); |
116 | pci_cfg_wired_entry = read_c0_wired(); | 116 | pci_cfg_wired_entry = read_c0_wired(); |