Messages in this thread Patch in this message | | | From | Nicholas Johnson <> | Subject | [[RFC PATCH v1] 1/1] PCI: Add pci=nobbn to ignore ACPI _BBN method to override host bridge bus window | Date | Mon, 9 Dec 2019 21:30:23 +0000 |
| |
Add pci=nobbn kernel parameter.
Override the host bridge bus resource to [bus 00-ff] when specified.
Update documentation to reflect the above.
Signed-off-by: Nicholas Johnson <nicholas.johnson-opensource@outlook.com.au> --- Documentation/admin-guide/kernel-parameters.txt | 2 ++ arch/x86/include/asm/pci_x86.h | 1 + arch/x86/pci/acpi.c | 11 +++++++++++ arch/x86/pci/common.c | 3 +++ 4 files changed, 17 insertions(+)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index cfe8c2b67..0333d9d63 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3432,6 +3432,8 @@ please report a bug. nocrs [X86] Ignore PCI host bridge windows from ACPI. If you need to use this, please report a bug. + nobbn [X86] Ignore PCI BIOS Bus Number from ACPI. + If you need to use this, please report a bug. routeirq Do IRQ routing for all PCI devices. This is normally done in pci_enable_device(), so this option is a temporary workaround diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index 73bb404f4..179cdd5d1 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h @@ -39,6 +39,7 @@ do { \ #define PCI_ROOT_NO_CRS 0x100000 #define PCI_NOASSIGN_BARS 0x200000 #define PCI_BIG_ROOT_WINDOW 0x400000 +#define PCI_ROOT_NO_BBN 0x800000 extern unsigned int pci_probe; extern unsigned long pirq_table_addr; diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 948656069..fc54a1f3c 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -20,6 +20,7 @@ struct pci_root_info { }; static bool pci_use_crs = true; +static bool pci_use_bbn = true; static bool pci_ignore_seg = false; static int __init set_use_crs(const struct dmi_system_id *id) @@ -156,6 +157,8 @@ void __init pci_acpi_crs_quirks(void) else if (pci_probe & PCI_USE__CRS) pci_use_crs = true; + pci_use_bbn = !(pci_probe & PCI_ROOT_NO_BBN); + printk(KERN_INFO "PCI: %s host bridge windows from ACPI; " "if necessary, use \"pci=%s\" and report a bug\n", pci_use_crs ? "Using" : "Ignoring", @@ -298,6 +301,14 @@ static int pci_acpi_root_prepare_resources(struct acpi_pci_root_info *ci) struct resource_entry *entry, *tmp; int status; + if (!pci_use_bbn){ + dev_printk(KERN_DEBUG, &device->dev, + "host bridge window %pR (ignored)\n", + &ci->root->secondary); + ci->root->secondary.start = 0x00; + ci->root->secondary.end = 0xff; + } + status = acpi_pci_probe_root_resources(ci); if (pci_use_crs) { resource_list_for_each_entry_safe(entry, tmp, &ci->resources) diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 9acab6ac2..9183a999f 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -594,6 +594,9 @@ char *__init pcibios_setup(char *str) } else if (!strcmp(str, "nocrs")) { pci_probe |= PCI_ROOT_NO_CRS; return NULL; + } else if (!strcmp(str, "nobbn")) { + pci_probe |= PCI_ROOT_NO_BBN; + return NULL; #ifdef CONFIG_PHYS_ADDR_T_64BIT } else if (!strcmp(str, "big_root_window")) { pci_probe |= PCI_BIG_ROOT_WINDOW; -- 2.24.0
| |