diff options
| author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2008-11-09 06:18:36 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-11-09 06:18:36 -0500 |
| commit | ebb4c65869db7213280ad9c510637683939b5ff8 (patch) | |
| tree | e9aa372c806fad73a04ba2f9d16d1f17491a11cf /arch | |
| parent | 7bfc0b2e266dd4cd3d3f27a3ad31bf79974190b1 (diff) | |
[ARM] iop: iop3xx needs registers mapped uncached+unbuffered
Mikael Pettersson reported:
The 2.6.28-rc kernels fail to detect PCI device 0000:00:01.0
(the first ethernet port) on my Thecus n2100 XScale box.
There is however still a strange "ghost" device that gets partially
detected in 2.6.28-rc2 vanilla.
The IOP321 manual says:
The user designates the memory region containing the OCCDR as
non-cacheable and non-bufferable from the IntelR XScaleTM core.
This guarantees that all load/stores to the OCCDR are only of
DWORD quantities.
Ensure that the OCCDR is so mapped.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/arm/include/asm/mach/map.h | 13 | ||||
| -rw-r--r-- | arch/arm/mm/mmu.c | 6 | ||||
| -rw-r--r-- | arch/arm/plat-iop/setup.c | 5 |
3 files changed, 16 insertions, 8 deletions
diff --git a/arch/arm/include/asm/mach/map.h b/arch/arm/include/asm/mach/map.h index cb1139ac194..39d949b63e8 100644 --- a/arch/arm/include/asm/mach/map.h +++ b/arch/arm/include/asm/mach/map.h | |||
| @@ -19,12 +19,13 @@ struct map_desc { | |||
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | /* types 0-3 are defined in asm/io.h */ | 21 | /* types 0-3 are defined in asm/io.h */ |
| 22 | #define MT_CACHECLEAN 4 | 22 | #define MT_UNCACHED 4 |
| 23 | #define MT_MINICLEAN 5 | 23 | #define MT_CACHECLEAN 5 |
| 24 | #define MT_LOW_VECTORS 6 | 24 | #define MT_MINICLEAN 6 |
| 25 | #define MT_HIGH_VECTORS 7 | 25 | #define MT_LOW_VECTORS 7 |
| 26 | #define MT_MEMORY 8 | 26 | #define MT_HIGH_VECTORS 8 |
| 27 | #define MT_ROM 9 | 27 | #define MT_MEMORY 9 |
| 28 | #define MT_ROM 10 | ||
| 28 | 29 | ||
| 29 | #ifdef CONFIG_MMU | 30 | #ifdef CONFIG_MMU |
| 30 | extern void iotable_init(struct map_desc *, int); | 31 | extern void iotable_init(struct map_desc *, int); |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index e63db11f16a..7f36c825718 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -208,6 +208,12 @@ static struct mem_type mem_types[] = { | |||
| 208 | .prot_sect = PROT_SECT_DEVICE, | 208 | .prot_sect = PROT_SECT_DEVICE, |
| 209 | .domain = DOMAIN_IO, | 209 | .domain = DOMAIN_IO, |
| 210 | }, | 210 | }, |
| 211 | [MT_UNCACHED] = { | ||
| 212 | .prot_pte = PROT_PTE_DEVICE, | ||
| 213 | .prot_l1 = PMD_TYPE_TABLE, | ||
| 214 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | ||
| 215 | .domain = DOMAIN_IO, | ||
| 216 | }, | ||
| 211 | [MT_CACHECLEAN] = { | 217 | [MT_CACHECLEAN] = { |
| 212 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, | 218 | .prot_sect = PMD_TYPE_SECT | PMD_SECT_XN, |
| 213 | .domain = DOMAIN_KERNEL, | 219 | .domain = DOMAIN_KERNEL, |
diff --git a/arch/arm/plat-iop/setup.c b/arch/arm/plat-iop/setup.c index 4689db638e9..9e573e78176 100644 --- a/arch/arm/plat-iop/setup.c +++ b/arch/arm/plat-iop/setup.c | |||
| @@ -16,14 +16,15 @@ | |||
| 16 | #include <asm/hardware/iop3xx.h> | 16 | #include <asm/hardware/iop3xx.h> |
| 17 | 17 | ||
| 18 | /* | 18 | /* |
| 19 | * Standard IO mapping for all IOP3xx based systems | 19 | * Standard IO mapping for all IOP3xx based systems. Note that |
| 20 | * the IOP3xx OCCDR must be mapped uncached and unbuffered. | ||
| 20 | */ | 21 | */ |
| 21 | static struct map_desc iop3xx_std_desc[] __initdata = { | 22 | static struct map_desc iop3xx_std_desc[] __initdata = { |
| 22 | { /* mem mapped registers */ | 23 | { /* mem mapped registers */ |
| 23 | .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, | 24 | .virtual = IOP3XX_PERIPHERAL_VIRT_BASE, |
| 24 | .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), | 25 | .pfn = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE), |
| 25 | .length = IOP3XX_PERIPHERAL_SIZE, | 26 | .length = IOP3XX_PERIPHERAL_SIZE, |
| 26 | .type = MT_DEVICE, | 27 | .type = MT_UNCACHED, |
| 27 | }, { /* PCI IO space */ | 28 | }, { /* PCI IO space */ |
| 28 | .virtual = IOP3XX_PCI_LOWER_IO_VA, | 29 | .virtual = IOP3XX_PCI_LOWER_IO_VA, |
| 29 | .pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA), | 30 | .pfn = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA), |
