Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 294738
b: refs/heads/master
c: b07f2eb
h: refs/heads/master
v: v3
  • Loading branch information
Yinghai Lu authored and Jesse Barnes committed Feb 24, 2012
1 parent 6dabc23 commit 0d3a476
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eb572e7c76f154d75f90a783924f88afc34d5fec
refs/heads/master: b07f2ebc109b607789f648dedcff4b125f9afec6
13 changes: 13 additions & 0 deletions trunk/drivers/pci/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,19 @@ config PCI_DEBUG

When in doubt, say N.

config PCI_REALLOC_ENABLE_AUTO
bool "Enable PCI resource re-allocation detection"
depends on PCI
help
Say Y here if you want the PCI core to detect if PCI resource
re-allocation needs to be enabled. You can always use pci=realloc=on
or pci=realloc=off to override it. Note this feature is a no-op
unless PCI_IOV support is also enabled; in that case it will
automatically re-allocate PCI resources if SR-IOV BARs have not
been allocated by the BIOS.

When in doubt, say N.

config PCI_STUB
tristate "PCI Stub driver"
depends on PCI
Expand Down
28 changes: 28 additions & 0 deletions trunk/drivers/pci/setup-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -1294,6 +1294,31 @@ static bool __init pci_realloc_enabled(void)
return pci_realloc_enable >= user_enabled;
}

static void __init pci_realloc_detect(void)
{
#if defined(CONFIG_PCI_IOV) && defined(CONFIG_PCI_REALLOC_ENABLE_AUTO)
struct pci_dev *dev = NULL;

if (pci_realloc_enable != undefined)
return;

for_each_pci_dev(dev) {
int i;

for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) {
struct resource *r = &dev->resource[i];

/* Not assigned, or rejected by kernel ? */
if (r->flags && !r->start) {
pci_realloc_enable = auto_enabled;

return;
}
}
}
#endif
}

/*
* first try will not touch pci bridge res
* second and later try will clear small leaf bridge res
Expand All @@ -1315,6 +1340,7 @@ pci_assign_unassigned_resources(void)
int pci_try_num = 1;

/* don't realloc if asked to do so */
pci_realloc_detect();
if (pci_realloc_enabled()) {
int max_depth = pci_get_max_depth();

Expand Down Expand Up @@ -1349,6 +1375,8 @@ pci_assign_unassigned_resources(void)
if (tried_times >= pci_try_num) {
if (pci_realloc_enable == undefined)
printk(KERN_INFO "Some PCI device resources are unassigned, try booting with pci=realloc\n");
else if (pci_realloc_enable == auto_enabled)
printk(KERN_INFO "Automatically enabled pci realloc, if you have problem, try booting with pci=realloc=off\n");

free_list(&fail_head);
goto enable_and_dump;
Expand Down

0 comments on commit 0d3a476

Please sign in to comment.