pci-v4.15-fixes-2
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJaWRZvAAoJEFmIoMA60/r8JqoP/22/st7YsJjk9kJE0DCIUSjv yP0iyAfyPyfnhqgDtLfpb41Q4+sjR7C2xKUW8tfqUKXR4Gb+7zUXEYKb+qcco0T5 NJj5VWS5MnIGJHdHMqoqzswIsNSe1SDccsxAwSzY3CvmG9Mkg+BHmBAzEZBmsDcD 6S1AtLrvUOcEUyBrgfBYpi8cQFsnrFsaG7seY5EqkuTcjKvbebBQKawzarYOppqQ j8QIQ19f2B9q4rGV98HabtJZqb+ll5S1swBbEz6P6MJ6gy1IhADdfLlhTtpH0gXH Xb9gpcyA7rrrxPzVo85gFgyFR3ATE96aTURrDqSjsumGwer+UtqIH/KJjcA12vMF ObZRVHPRO0F4l9mbOJV7F0o7QgOEwmKcdHjhTh9jlOjV3XgPCTEGJJ4ihpw3cdjH bVeaoloPgAT6wTtkWK4mI8RYgwZUYQQxKFzc/0pK4BpNghoX8wigZvoH+ey+HQ1u 1KC8797zDUBquRBKZc9c8hFK+s7KkFj7FsKLAZs8k6MVPYHDjpF1CjqzCecVMKim tHRhlH/l+NTnKCh9D5HfmstPAtB/dojXE1dF+BI/I651FFpZVmvDNoMPq8/kOdM1 Mj9SjCMmYYMnkNxLHUJO4j6mWEMyj/YJsZRBK+qpIa6F/sRYy2/P1tA2bT5UbgWr zAhHadF6dyri20PEjZuL =Qi1b -----END PGP SIGNATURE----- Merge tag 'pci-v4.15-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci Pull PCI fixes from Bjorn Helgaas: "Fix AMD boot regression due to 64-bit window conflicting with system memory (Christian König)" * tag 'pci-v4.15-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: x86/PCI: Move and shrink AMD 64-bit window to avoid conflict x86/PCI: Add "pci=big_root_window" option for AMD 64-bit windows
This commit is contained in:
commit
8e66791a80
|
@ -3097,6 +3097,12 @@
|
||||||
pcie_scan_all Scan all possible PCIe devices. Otherwise we
|
pcie_scan_all Scan all possible PCIe devices. Otherwise we
|
||||||
only look for one device below a PCIe downstream
|
only look for one device below a PCIe downstream
|
||||||
port.
|
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
|
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
||||||
Management.
|
Management.
|
||||||
|
|
|
@ -38,6 +38,7 @@ do { \
|
||||||
#define PCI_NOASSIGN_ROMS 0x80000
|
#define PCI_NOASSIGN_ROMS 0x80000
|
||||||
#define PCI_ROOT_NO_CRS 0x100000
|
#define PCI_ROOT_NO_CRS 0x100000
|
||||||
#define PCI_NOASSIGN_BARS 0x200000
|
#define PCI_NOASSIGN_BARS 0x200000
|
||||||
|
#define PCI_BIG_ROOT_WINDOW 0x400000
|
||||||
|
|
||||||
extern unsigned int pci_probe;
|
extern unsigned int pci_probe;
|
||||||
extern unsigned long pirq_table_addr;
|
extern unsigned long pirq_table_addr;
|
||||||
|
|
|
@ -594,6 +594,11 @@ char *__init pcibios_setup(char *str)
|
||||||
} else if (!strcmp(str, "nocrs")) {
|
} else if (!strcmp(str, "nocrs")) {
|
||||||
pci_probe |= PCI_ROOT_NO_CRS;
|
pci_probe |= PCI_ROOT_NO_CRS;
|
||||||
return NULL;
|
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")) {
|
} else if (!strcmp(str, "earlydump")) {
|
||||||
pci_early_dump_regs = 1;
|
pci_early_dump_regs = 1;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -662,10 +662,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2033, quirk_no_aersid);
|
||||||
*/
|
*/
|
||||||
static void pci_amd_enable_64bit_bar(struct pci_dev *dev)
|
static void pci_amd_enable_64bit_bar(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
unsigned i;
|
|
||||||
u32 base, limit, high;
|
u32 base, limit, high;
|
||||||
struct resource *res, *conflict;
|
|
||||||
struct pci_dev *other;
|
struct pci_dev *other;
|
||||||
|
struct resource *res;
|
||||||
|
unsigned i;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!(pci_probe & PCI_BIG_ROOT_WINDOW))
|
||||||
|
return;
|
||||||
|
|
||||||
/* Check that we are the only device of that type */
|
/* Check that we are the only device of that type */
|
||||||
other = pci_get_device(dev->vendor, dev->device, NULL);
|
other = pci_get_device(dev->vendor, dev->device, NULL);
|
||||||
|
@ -699,22 +703,25 @@ static void pci_amd_enable_64bit_bar(struct pci_dev *dev)
|
||||||
if (!res)
|
if (!res)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate a 256GB window directly below the 0xfd00000000 hardware
|
||||||
|
* limit (see AMD Family 15h Models 30h-3Fh BKDG, sec 2.4.6).
|
||||||
|
*/
|
||||||
res->name = "PCI Bus 0000:00";
|
res->name = "PCI Bus 0000:00";
|
||||||
res->flags = IORESOURCE_PREFETCH | IORESOURCE_MEM |
|
res->flags = IORESOURCE_PREFETCH | IORESOURCE_MEM |
|
||||||
IORESOURCE_MEM_64 | IORESOURCE_WINDOW;
|
IORESOURCE_MEM_64 | IORESOURCE_WINDOW;
|
||||||
res->start = 0x100000000ull;
|
res->start = 0xbd00000000ull;
|
||||||
res->end = 0xfd00000000ull - 1;
|
res->end = 0xfd00000000ull - 1;
|
||||||
|
|
||||||
/* Just grab the free area behind system memory for this */
|
r = request_resource(&iomem_resource, res);
|
||||||
while ((conflict = request_resource_conflict(&iomem_resource, res))) {
|
if (r) {
|
||||||
if (conflict->end >= res->end) {
|
kfree(res);
|
||||||
kfree(res);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
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) |
|
base = ((res->start >> 8) & AMD_141b_MMIO_BASE_MMIOBASE_MASK) |
|
||||||
AMD_141b_MMIO_BASE_RE_MASK | AMD_141b_MMIO_BASE_WE_MASK;
|
AMD_141b_MMIO_BASE_RE_MASK | AMD_141b_MMIO_BASE_WE_MASK;
|
||||||
|
|
Loading…
Reference in New Issue