提交 4516a618 编写于 作者: A Atsushi Nemoto 提交者: Greg Kroah-Hartman

PCI: Make CARDBUS_MEM_SIZE and CARDBUS_IO_SIZE boot options

CARDBUS_MEM_SIZE was increased to 64MB on 2.6.20-rc2, but larger size might
result in allocation failure for the reserving itself on some platforms
(for example typical 32bit MIPS).  Make it (and CARDBUS_IO_SIZE too)
customizable by "pci=" option for such platforms.
Signed-off-by: NAtsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Daniel Ritz <daniel.ritz@gmx.ch>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 26ba05e4
...@@ -1275,6 +1275,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1275,6 +1275,12 @@ and is between 256 and 4096 characters. It is defined in the file
This sorting is done to get a device This sorting is done to get a device
order compatible with older (<= 2.4) kernels. order compatible with older (<= 2.4) kernels.
nobfsort Don't sort PCI devices into breadth-first order. nobfsort Don't sort PCI devices into breadth-first order.
cbiosize=nn[KMG] The fixed amount of bus space which is
reserved for the CardBus bridge's IO window.
The default value is 256 bytes.
cbmemsize=nn[KMG] The fixed amount of bus space which is
reserved for the CardBus bridge's memory
window. The default value is 64 megabytes.
pcmv= [HW,PCMCIA] BadgePAD 4 pcmv= [HW,PCMCIA] BadgePAD 4
......
...@@ -21,6 +21,12 @@ ...@@ -21,6 +21,12 @@
unsigned int pci_pm_d3_delay = 10; unsigned int pci_pm_d3_delay = 10;
#define DEFAULT_CARDBUS_IO_SIZE (256)
#define DEFAULT_CARDBUS_MEM_SIZE (64*1024*1024)
/* pci=cbmemsize=nnM,cbiosize=nn can override this */
unsigned long pci_cardbus_io_size = DEFAULT_CARDBUS_IO_SIZE;
unsigned long pci_cardbus_mem_size = DEFAULT_CARDBUS_MEM_SIZE;
/** /**
* pci_bus_max_busnr - returns maximum PCI bus number of given bus' children * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children
* @bus: pointer to PCI bus structure to search * @bus: pointer to PCI bus structure to search
...@@ -1333,6 +1339,10 @@ static int __devinit pci_setup(char *str) ...@@ -1333,6 +1339,10 @@ static int __devinit pci_setup(char *str)
if (*str && (str = pcibios_setup(str)) && *str) { if (*str && (str = pcibios_setup(str)) && *str) {
if (!strcmp(str, "nomsi")) { if (!strcmp(str, "nomsi")) {
pci_no_msi(); pci_no_msi();
} else if (!strncmp(str, "cbiosize=", 9)) {
pci_cardbus_io_size = memparse(str + 9, &str);
} else if (!strncmp(str, "cbmemsize=", 10)) {
pci_cardbus_mem_size = memparse(str + 10, &str);
} else { } else {
printk(KERN_ERR "PCI: Unknown option `%s'\n", printk(KERN_ERR "PCI: Unknown option `%s'\n",
str); str);
......
...@@ -36,13 +36,6 @@ ...@@ -36,13 +36,6 @@
#define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1)) #define ROUND_UP(x, a) (((x) + (a) - 1) & ~((a) - 1))
/*
* FIXME: IO should be max 256 bytes. However, since we may
* have a P2P bridge below a cardbus bridge, we need 4K.
*/
#define CARDBUS_IO_SIZE (256)
#define CARDBUS_MEM_SIZE (64*1024*1024)
static void __devinit static void __devinit
pbus_assign_resources_sorted(struct pci_bus *bus) pbus_assign_resources_sorted(struct pci_bus *bus)
{ {
...@@ -415,12 +408,12 @@ pci_bus_size_cardbus(struct pci_bus *bus) ...@@ -415,12 +408,12 @@ pci_bus_size_cardbus(struct pci_bus *bus)
* Reserve some resources for CardBus. We reserve * Reserve some resources for CardBus. We reserve
* a fixed amount of bus space for CardBus bridges. * a fixed amount of bus space for CardBus bridges.
*/ */
b_res[0].start = CARDBUS_IO_SIZE; b_res[0].start = pci_cardbus_io_size;
b_res[0].end = b_res[0].start + CARDBUS_IO_SIZE - 1; b_res[0].end = b_res[0].start + pci_cardbus_io_size - 1;
b_res[0].flags |= IORESOURCE_IO; b_res[0].flags |= IORESOURCE_IO;
b_res[1].start = CARDBUS_IO_SIZE; b_res[1].start = pci_cardbus_io_size;
b_res[1].end = b_res[1].start + CARDBUS_IO_SIZE - 1; b_res[1].end = b_res[1].start + pci_cardbus_io_size - 1;
b_res[1].flags |= IORESOURCE_IO; b_res[1].flags |= IORESOURCE_IO;
/* /*
...@@ -440,16 +433,16 @@ pci_bus_size_cardbus(struct pci_bus *bus) ...@@ -440,16 +433,16 @@ pci_bus_size_cardbus(struct pci_bus *bus)
* twice the size. * twice the size.
*/ */
if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) { if (ctrl & PCI_CB_BRIDGE_CTL_PREFETCH_MEM0) {
b_res[2].start = CARDBUS_MEM_SIZE; b_res[2].start = pci_cardbus_mem_size;
b_res[2].end = b_res[2].start + CARDBUS_MEM_SIZE - 1; b_res[2].end = b_res[2].start + pci_cardbus_mem_size - 1;
b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH; b_res[2].flags |= IORESOURCE_MEM | IORESOURCE_PREFETCH;
b_res[3].start = CARDBUS_MEM_SIZE; b_res[3].start = pci_cardbus_mem_size;
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE - 1; b_res[3].end = b_res[3].start + pci_cardbus_mem_size - 1;
b_res[3].flags |= IORESOURCE_MEM; b_res[3].flags |= IORESOURCE_MEM;
} else { } else {
b_res[3].start = CARDBUS_MEM_SIZE * 2; b_res[3].start = pci_cardbus_mem_size * 2;
b_res[3].end = b_res[3].start + CARDBUS_MEM_SIZE * 2 - 1; b_res[3].end = b_res[3].start + pci_cardbus_mem_size * 2 - 1;
b_res[3].flags |= IORESOURCE_MEM; b_res[3].flags |= IORESOURCE_MEM;
} }
} }
......
...@@ -854,5 +854,8 @@ extern int pci_pci_problems; ...@@ -854,5 +854,8 @@ extern int pci_pci_problems;
#define PCIPCI_ALIMAGIK 32 /* Need low latency setting */ #define PCIPCI_ALIMAGIK 32 /* Need low latency setting */
#define PCIAGP_FAIL 64 /* No PCI to AGP DMA */ #define PCIAGP_FAIL 64 /* No PCI to AGP DMA */
extern unsigned long pci_cardbus_io_size;
extern unsigned long pci_cardbus_mem_size;
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* LINUX_PCI_H */ #endif /* LINUX_PCI_H */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册