diff options
| -rw-r--r-- | Documentation/admin-guide/kernel-parameters.txt | 6 | ||||
| -rw-r--r-- | arch/x86/include/asm/pci_x86.h | 1 | ||||
| -rw-r--r-- | arch/x86/pci/common.c | 5 | ||||
| -rw-r--r-- | arch/x86/pci/fixup.c | 7 | 
4 files changed, 18 insertions, 1 deletions
| diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index 6571fbfdb2a1..619638362416 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3094,6 +3094,12 @@  		pcie_scan_all	Scan all possible PCIe devices.  Otherwise we  				only look for one device below a PCIe downstream  				port. +		big_root_window	Try to add a big 64bit memory window to the PCIe +				root complex on AMD CPUs. Some GFX hardware +				can resize a BAR to allow access to all VRAM. +				Adding the window is slightly risky (it may +				conflict with unreported devices), so this +				taints the kernel.  	pcie_aspm=	[PCIE] Forcibly enable or disable PCIe Active State Power  			Management. diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h index 7a5d6695abd3..eb66fa9cd0fc 100644 --- a/arch/x86/include/asm/pci_x86.h +++ b/arch/x86/include/asm/pci_x86.h @@ -38,6 +38,7 @@ do {						\  #define PCI_NOASSIGN_ROMS	0x80000  #define PCI_ROOT_NO_CRS		0x100000  #define PCI_NOASSIGN_BARS	0x200000 +#define PCI_BIG_ROOT_WINDOW	0x400000  extern unsigned int pci_probe;  extern unsigned long pirq_table_addr; diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 7a5350d08cef..563049c483a1 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -594,6 +594,11 @@ char *__init pcibios_setup(char *str)  	} else if (!strcmp(str, "nocrs")) {  		pci_probe |= PCI_ROOT_NO_CRS;  		return NULL; +#ifdef CONFIG_PHYS_ADDR_T_64BIT +	} else if (!strcmp(str, "big_root_window")) { +		pci_probe |= PCI_BIG_ROOT_WINDOW; +		return NULL; +#endif  	} else if (!strcmp(str, "earlydump")) {  		pci_early_dump_regs = 1;  		return NULL; diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c index e663d6bf1328..8bad19c7473d 100644 --- a/arch/x86/pci/fixup.c +++ b/arch/x86/pci/fixup.c @@ -667,6 +667,9 @@ static void pci_amd_enable_64bit_bar(struct pci_dev *dev)  	struct resource *res, *conflict;  	struct pci_dev *other; +	if (!(pci_probe & PCI_BIG_ROOT_WINDOW)) +		return; +  	/* Check that we are the only device of that type */  	other = pci_get_device(dev->vendor, dev->device, NULL);  	if (other != dev || @@ -714,7 +717,9 @@ static void pci_amd_enable_64bit_bar(struct pci_dev *dev)  		res->start = conflict->end + 1;  	} -	dev_info(&dev->dev, "adding root bus resource %pR\n", res); +	dev_info(&dev->dev, "adding root bus resource %pR (tainting kernel)\n", +		 res); +	add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);  	base = ((res->start >> 8) & AMD_141b_MMIO_BASE_MMIOBASE_MASK) |  		AMD_141b_MMIO_BASE_RE_MASK | AMD_141b_MMIO_BASE_WE_MASK; | 
