diff options
author | Krzysztof Hałasa <khc@pm.waw.pl> | 2009-11-15 12:02:10 -0500 |
---|---|---|
committer | Krzysztof Hałasa <khc@pm.waw.pl> | 2009-12-05 10:58:39 -0500 |
commit | ed5b9fa0d1c5ad1e01ff56b9acd3ff52bc783f66 (patch) | |
tree | d3068a6963c1e15d039323462a399175942fc08c /arch | |
parent | cba362221b12b102dff1f21b291fdc7b93e24a18 (diff) |
IXP4xx: Extend PCI MMIO indirect address space to 1 GB.
IXP4xx CPUs can indirectly access the whole 4 GB PCI MMIO address space (using
the non-prefetch registers). Previously the available space depended on the CPU
variant, since one of the IXP43x platforms needed more than the usual 128 MB.
1 GB should be enough for everyone, and if not, we can trivially increase it.
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-ixp4xx/Kconfig | 22 | ||||
-rw-r--r-- | arch/arm/mach-ixp4xx/common-pci.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-ixp4xx/include/mach/hardware.h | 8 | ||||
-rw-r--r-- | arch/arm/mach-ixp4xx/include/mach/io.h | 22 |
4 files changed, 29 insertions, 29 deletions
diff --git a/arch/arm/mach-ixp4xx/Kconfig b/arch/arm/mach-ixp4xx/Kconfig index 264f4d59f898..9e5070da17ae 100644 --- a/arch/arm/mach-ixp4xx/Kconfig +++ b/arch/arm/mach-ixp4xx/Kconfig | |||
@@ -179,21 +179,21 @@ config IXP4XX_INDIRECT_PCI | |||
179 | help | 179 | help |
180 | IXP4xx provides two methods of accessing PCI memory space: | 180 | IXP4xx provides two methods of accessing PCI memory space: |
181 | 181 | ||
182 | 1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB). | 182 | 1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB). |
183 | To access PCI via this space, we simply ioremap() the BAR | 183 | To access PCI via this space, we simply ioremap() the BAR |
184 | into the kernel and we can use the standard read[bwl]/write[bwl] | 184 | into the kernel and we can use the standard read[bwl]/write[bwl] |
185 | macros. This is the preferred method due to speed but it | 185 | macros. This is the preferred method due to speed but it |
186 | limits the system to just 64MB of PCI memory. This can be | 186 | limits the system to just 64MB of PCI memory. This can be |
187 | problematic if using video cards and other memory-heavy devices. | 187 | problematic if using video cards and other memory-heavy devices. |
188 | 188 | ||
189 | 2) If > 64MB of memory space is required, the IXP4xx can be | 189 | 2) If > 64MB of memory space is required, the IXP4xx can be |
190 | configured to use indirect registers to access PCI This allows | 190 | configured to use indirect registers to access the whole PCI |
191 | for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus. | 191 | memory space. This currently allows for up to 1 GB (0x10000000 |
192 | The disadvantage of this is that every PCI access requires | 192 | to 0x4FFFFFFF) of memory on the bus. The disadvantage of this |
193 | three local register accesses plus a spinlock, but in some | 193 | is that every PCI access requires three local register accesses |
194 | cases the performance hit is acceptable. In addition, you cannot | 194 | plus a spinlock, but in some cases the performance hit is |
195 | mmap() PCI devices in this case due to the indirect nature | 195 | acceptable. In addition, you cannot mmap() PCI devices in this |
196 | of the PCI window. | 196 | case due to the indirect nature of the PCI window. |
197 | 197 | ||
198 | By default, the direct method is used. Choose this option if you | 198 | By default, the direct method is used. Choose this option if you |
199 | need to use the indirect method instead. If you don't know | 199 | need to use the indirect method instead. If you don't know |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 70afcfe5b881..c4a01594c761 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
@@ -481,11 +481,7 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys) | |||
481 | 481 | ||
482 | res[1].name = "PCI Memory Space"; | 482 | res[1].name = "PCI Memory Space"; |
483 | res[1].start = PCIBIOS_MIN_MEM; | 483 | res[1].start = PCIBIOS_MIN_MEM; |
484 | #ifndef CONFIG_IXP4XX_INDIRECT_PCI | 484 | res[1].end = PCIBIOS_MAX_MEM; |
485 | res[1].end = 0x4bffffff; | ||
486 | #else | ||
487 | res[1].end = 0x4fffffff; | ||
488 | #endif | ||
489 | res[1].flags = IORESOURCE_MEM; | 485 | res[1].flags = IORESOURCE_MEM; |
490 | 486 | ||
491 | request_resource(&ioport_resource, &res[0]); | 487 | request_resource(&ioport_resource, &res[0]); |
diff --git a/arch/arm/mach-ixp4xx/include/mach/hardware.h b/arch/arm/mach-ixp4xx/include/mach/hardware.h index f58a43a23966..f822b223b7e0 100644 --- a/arch/arm/mach-ixp4xx/include/mach/hardware.h +++ b/arch/arm/mach-ixp4xx/include/mach/hardware.h | |||
@@ -18,7 +18,13 @@ | |||
18 | #define __ASM_ARCH_HARDWARE_H__ | 18 | #define __ASM_ARCH_HARDWARE_H__ |
19 | 19 | ||
20 | #define PCIBIOS_MIN_IO 0x00001000 | 20 | #define PCIBIOS_MIN_IO 0x00001000 |
21 | #define PCIBIOS_MIN_MEM (cpu_is_ixp43x() ? 0x40000000 : 0x48000000) | 21 | #ifdef CONFIG_IXP4XX_INDIRECT_PCI |
22 | #define PCIBIOS_MIN_MEM 0x10000000 /* 1 GB of indirect PCI MMIO space */ | ||
23 | #define PCIBIOS_MAX_MEM 0x4FFFFFFF | ||
24 | #else | ||
25 | #define PCIBIOS_MIN_MEM 0x48000000 /* 64 MB of PCI MMIO space */ | ||
26 | #define PCIBIOS_MAX_MEM 0x4BFFFFFF | ||
27 | #endif | ||
22 | 28 | ||
23 | /* | 29 | /* |
24 | * We override the standard dma-mask routines for bouncing. | 30 | * We override the standard dma-mask routines for bouncing. |
diff --git a/arch/arm/mach-ixp4xx/include/mach/io.h b/arch/arm/mach-ixp4xx/include/mach/io.h index 0e601fe50162..6ea7e2fb2701 100644 --- a/arch/arm/mach-ixp4xx/include/mach/io.h +++ b/arch/arm/mach-ixp4xx/include/mach/io.h | |||
@@ -26,22 +26,20 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); | |||
26 | /* | 26 | /* |
27 | * IXP4xx provides two methods of accessing PCI memory space: | 27 | * IXP4xx provides two methods of accessing PCI memory space: |
28 | * | 28 | * |
29 | * 1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB). | 29 | * 1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB). |
30 | * To access PCI via this space, we simply ioremap() the BAR | 30 | * To access PCI via this space, we simply ioremap() the BAR |
31 | * into the kernel and we can use the standard read[bwl]/write[bwl] | 31 | * into the kernel and we can use the standard read[bwl]/write[bwl] |
32 | * macros. This is the preffered method due to speed but it | 32 | * macros. This is the preffered method due to speed but it |
33 | * limits the system to just 64MB of PCI memory. This can be | 33 | * limits the system to just 64MB of PCI memory. This can be |
34 | * problamatic if using video cards and other memory-heavy | 34 | * problematic if using video cards and other memory-heavy targets. |
35 | * targets. | ||
36 | * | ||
37 | * 2) If > 64MB of memory space is required, the IXP4xx can be configured | ||
38 | * to use indirect registers to access PCI (as we do below for I/O | ||
39 | * transactions). This allows for up to 128MB (0x48000000 to 0x4fffffff) | ||
40 | * of memory on the bus. The disadvantage of this is that every | ||
41 | * PCI access requires three local register accesses plus a spinlock, | ||
42 | * but in some cases the performance hit is acceptable. In addition, | ||
43 | * you cannot mmap() PCI devices in this case. | ||
44 | * | 35 | * |
36 | * 2) If > 64MB of memory space is required, the IXP4xx can use indirect | ||
37 | * registers to access the whole 4 GB of PCI memory space (as we do below | ||
38 | * for I/O transactions). This allows currently for up to 1 GB (0x10000000 | ||
39 | * to 0x4FFFFFFF) of memory on the bus. The disadvantage of this is that | ||
40 | * every PCI access requires three local register accesses plus a spinlock, | ||
41 | * but in some cases the performance hit is acceptable. In addition, you | ||
42 | * cannot mmap() PCI devices in this case. | ||
45 | */ | 43 | */ |
46 | #ifndef CONFIG_IXP4XX_INDIRECT_PCI | 44 | #ifndef CONFIG_IXP4XX_INDIRECT_PCI |
47 | 45 | ||