IXP4xx: Extend PCI MMIO indirect address space to 1 GB.
Krzysztof Hałasa [Sun, 15 Nov 2009 17:02:10 +0000 (18:02 +0100)]
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>

arch/arm/mach-ixp4xx/Kconfig
arch/arm/mach-ixp4xx/common-pci.c
arch/arm/mach-ixp4xx/include/mach/hardware.h
arch/arm/mach-ixp4xx/include/mach/io.h

index 264f4d5..9e5070d 100644 (file)
@@ -179,21 +179,21 @@ config IXP4XX_INDIRECT_PCI
        help
           IXP4xx provides two methods of accessing PCI memory space:
 
-          1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB).
+          1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB).
              To access PCI via this space, we simply ioremap() the BAR
              into the kernel and we can use the standard read[bwl]/write[bwl]
              macros. This is the preferred method due to speed but it
-             limits the system to just 64MB of PCI memory. This can be 
+             limits the system to just 64MB of PCI memory. This can be
              problematic if using video cards and other memory-heavy devices.
-          
-          2) If > 64MB of memory space is required, the IXP4xx can be 
-            configured to use indirect registers to access PCI This allows 
-            for up to 128MB (0x48000000 to 0x4fffffff) of memory on the bus. 
-            The disadvantage of this is that every PCI access requires 
-            three local register accesses plus a spinlock, but in some 
-            cases the performance hit is acceptable. In addition, you cannot 
-            mmap() PCI devices in this case due to the indirect nature
-            of the PCI window.
+
+         2) If > 64MB of memory space is required, the IXP4xx can be
+            configured to use indirect registers to access the whole PCI
+            memory space. This currently allows for up to 1 GB (0x10000000
+            to 0x4FFFFFFF) of memory on the bus. The disadvantage of this
+            is that every PCI access requires three local register accesses
+            plus a spinlock, but in some cases the performance hit is
+            acceptable. In addition, you cannot mmap() PCI devices in this
+            case due to the indirect nature of the PCI window.
 
          By default, the direct method is used. Choose this option if you
          need to use the indirect method instead. If you don't know
index 70afcfe..c4a0159 100644 (file)
@@ -481,11 +481,7 @@ int ixp4xx_setup(int nr, struct pci_sys_data *sys)
 
        res[1].name = "PCI Memory Space";
        res[1].start = PCIBIOS_MIN_MEM;
-#ifndef CONFIG_IXP4XX_INDIRECT_PCI
-       res[1].end = 0x4bffffff;
-#else
-       res[1].end = 0x4fffffff;
-#endif
+       res[1].end = PCIBIOS_MAX_MEM;
        res[1].flags = IORESOURCE_MEM;
 
        request_resource(&ioport_resource, &res[0]);
index f58a43a..f822b22 100644 (file)
 #define __ASM_ARCH_HARDWARE_H__
 
 #define PCIBIOS_MIN_IO         0x00001000
-#define PCIBIOS_MIN_MEM                (cpu_is_ixp43x() ? 0x40000000 : 0x48000000)
+#ifdef CONFIG_IXP4XX_INDIRECT_PCI
+#define PCIBIOS_MIN_MEM                0x10000000 /* 1 GB of indirect PCI MMIO space */
+#define PCIBIOS_MAX_MEM                0x4FFFFFFF
+#else
+#define PCIBIOS_MIN_MEM                0x48000000 /* 64 MB of PCI MMIO space */
+#define PCIBIOS_MAX_MEM                0x4BFFFFFF
+#endif
 
 /*
  * We override the standard dma-mask routines for bouncing.
index 0e601fe..6ea7e2f 100644 (file)
@@ -26,22 +26,20 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data);
 /*
  * IXP4xx provides two methods of accessing PCI memory space:
  *
- * 1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB).
+ * 1) A direct mapped window from 0x48000000 to 0x4BFFFFFF (64MB).
  *    To access PCI via this space, we simply ioremap() the BAR
  *    into the kernel and we can use the standard read[bwl]/write[bwl]
  *    macros. This is the preffered method due to speed but it
- *    limits the system to just 64MB of PCI memory. This can be 
- *    problamatic if using video cards and other memory-heavy
- *    targets.
- *
- * 2) If > 64MB of memory space is required, the IXP4xx can be configured
- *    to use indirect registers to access PCI (as we do below for I/O
- *    transactions). This allows for up to 128MB (0x48000000 to 0x4fffffff)
- *    of memory on the bus. The disadvantage of this is that every 
- *    PCI access requires three local register accesses plus a spinlock,
- *    but in some cases the performance hit is acceptable. In addition,
- *    you cannot mmap() PCI devices in this case.
+ *    limits the system to just 64MB of PCI memory. This can be
+ *    problematic if using video cards and other memory-heavy targets.
  *
+ * 2) If > 64MB of memory space is required, the IXP4xx can use indirect
+ *    registers to access the whole 4 GB of PCI memory space (as we do below
+ *    for I/O transactions). This allows currently for up to 1 GB (0x10000000
+ *    to 0x4FFFFFFF) of memory on the bus. The disadvantage of this is that
+ *    every PCI access requires three local register accesses plus a spinlock,
+ *    but in some cases the performance hit is acceptable. In addition, you
+ *    cannot mmap() PCI devices in this case.
  */
 #ifndef        CONFIG_IXP4XX_INDIRECT_PCI