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>
This commit is contained in:
parent
cba362221b
commit
ed5b9fa0d1
4 changed files with 29 additions and 29 deletions
|
@ -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
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -18,7 +18,13 @@
|
|||
#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.
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue