Re: [PATCH 2/2] x86/PCI: limit the size of the 64bit window to 256GB v2

From: Christian KÃnig
Date: Wed Jan 10 2018 - 13:15:07 EST


Am 10.01.2018 um 19:02 schrieb Bjorn Helgaas:
[+cc linux-pci, previous cc list]

On Wed, Jan 10, 2018 at 01:25:51PM +0100, Christian KÃnig wrote:
Avoid problems with BIOS implementations which don't report all used
resources to the OS by only allocating a 256GB window directly below the
hardware limit.

v2: cleanup code a bit more, update comment and explain the hw limit
Fixes a silent reboot loop reported by Aaro Koskinen
<aaro.koskinen@xxxxxx> on an AMD-based MSI MS-7699/760GA-P43(FX)
system.

Link: https://lkml.kernel.org/r/20180105220412.fzpwqe4zljdawr36@xxxxxxxxxxxxxxxxxxxxxxxxx
Reported-by: Aaro Koskinen <aaro.koskinen@xxxxxx>

Signed-off-by: Christian KÃnig <christian.koenig@xxxxxxx>
---
arch/x86/pci/fixup.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
index a91280da2ea1..9c1c98d7e3a7 100644
--- a/arch/x86/pci/fixup.c
+++ b/arch/x86/pci/fixup.c
@@ -662,10 +662,11 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x2033, quirk_no_aersid);
*/
static void pci_amd_enable_64bit_bar(struct pci_dev *dev)
{
- unsigned i;
u32 base, limit, high;
- struct resource *res, *conflict;
struct pci_dev *other;
+ struct resource *res;
+ unsigned i;
+ int r;
if (!(pci_probe & PCI_BIG_ROOT_WINDOW))
return;
@@ -702,19 +703,17 @@ static void pci_amd_enable_64bit_bar(struct pci_dev *dev)
if (!res)
return;
+ /* Allocate a 256GB window directly below the 0xfd00000000 hw limit */
Can you include a citation for the hardware limit in the changelog?
I'll try to dig it up myself if you don't beat me to it.

Sure, no problem. The first one in the series is ok as it is?

Christian.


res->name = "PCI Bus 0000:00";
res->flags = IORESOURCE_PREFETCH | IORESOURCE_MEM |
IORESOURCE_MEM_64 | IORESOURCE_WINDOW;
- res->start = 0x100000000ull;
+ res->start = 0xbd00000000ull;
res->end = 0xfd00000000ull - 1;
- /* Just grab the free area behind system memory for this */
- while ((conflict = request_resource_conflict(&iomem_resource, res))) {
- if (conflict->end >= res->end) {
- kfree(res);
- return;
- }
- res->start = conflict->end + 1;
+ r = request_resource(&iomem_resource, res);
+ if (r) {
+ kfree(res);
+ return;
}
dev_info(&dev->dev, "adding root bus resource %pR\n", res);
--
2.11.0