x86/PCI: Disable E820 reserved region clipping via quirks
authorHans de Goede <hdegoede@redhat.com>
Thu, 19 May 2022 15:21:49 +0000 (17:21 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 19 May 2022 21:55:46 +0000 (16:55 -0500)
To avoid unusable space that some firmware includes in PCI host bridge
_CRS, Linux currently excludes E820 reserved regions from _CRS windows; see
4dc2287c1805 ("x86: avoid E820 regions when allocating address space").

However, some systems supply E820 reserved regions that cover the entire
memory window from _CRS, so clipping them out leaves no space for hot-added
or uninitialized PCI devices.

For example, from a Lenovo IdeaPad 3 15IIL 81WE:

  BIOS-e820: [mem 0x4bc50000-0xcfffffff] reserved
  pci_bus 0000:00: root bus resource [mem 0x65400000-0xbfffffff window]
  pci 0000:00:15.0: BAR 0: [mem 0x00000000-0x00000fff 64bit]
  pci 0000:00:15.0: BAR 0: no space for [mem size 0x00001000 64bit]

Add quirks to disable the E820 clipping for machines known to do this.

A single DMI_PRODUCT_VERSION "IIL" quirk matches all the below:

  Lenovo IdeaPad 3 14IIL05
  Lenovo IdeaPad 3 15IIL05
  Lenovo IdeaPad 3 17IIL05
  Lenovo IdeaPad 5 14IIL05
  Lenovo IdeaPad 5 15IIL05
  Lenovo IdeaPad Slim 7 14IIL05
  Lenovo IdeaPad Slim 7 15IIL05
  Lenovo IdeaPad S145-15IIL
  Lenovo IdeaPad S340-14IIL
  Lenovo IdeaPad S340-15IIL
  Lenovo IdeaPad C340-15IIL
  Lenovo BS145-15IIL
  Lenovo V14-IIL
  Lenovo V15-IIL
  Lenovo V17-IIL
  Lenovo Yoga C940-14IIL
  Lenovo Yoga S740-14IIL
  Lenovo Yoga Slim 7 14IIL05
  Lenovo Yoga Slim 7 15IIL05

in addition to the following that don't actually need it because they have
no E820 reserved regions that overlap _CRS windows:

  Lenovo IdeaPad Flex 5 14IIL05
  Lenovo IdeaPad Flex 5 15IIL05
  Lenovo ThinkBook 14-IIL
  Lenovo ThinkBook 15-IIL
  Lenovo Yoga S940-14IIL

Other quirks match these:

  Acer Spin 5 (SP513-54N)

  Clevo X170KM-G Barebone

Link: https://bugzilla.kernel.org/show_bug.cgi?id=206459
Link: https://bugzilla.kernel.org/show_bug.cgi?id=214259
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1868899
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1871793
Link: https://bugs.launchpad.net/bugs/1878279
Link: https://bugs.launchpad.net/bugs/1880172
Link: https://bugs.launchpad.net/bugs/1884232
Link: https://bugs.launchpad.net/bugs/1921649
Link: https://bugs.launchpad.net/bugs/1931715
Link: https://bugs.launchpad.net/bugs/1932069
Link: https://lore.kernel.org/r/20220519152150.6135-3-hdegoede@redhat.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Benoit Grégoire <benoitg@coeus.ca>
Cc: Hui Wang <hui.wang@canonical.com>
arch/x86/pci/acpi.c

index c61c815..cd8f47c 100644 (file)
@@ -43,6 +43,14 @@ static int __init set_ignore_seg(const struct dmi_system_id *id)
        return 0;
 }
 
+static int __init set_no_e820(const struct dmi_system_id *id)
+{
+       printk(KERN_INFO "PCI: %s detected: not clipping E820 regions from _CRS\n",
+              id->ident);
+       pci_use_e820 = false;
+       return 0;
+}
+
 static const struct dmi_system_id pci_crs_quirks[] __initconst = {
        /* http://bugzilla.kernel.org/show_bug.cgi?id=14183 */
        {
@@ -137,6 +145,51 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "HP xw9300 Workstation"),
                },
        },
+
+       /*
+        * Many Lenovo models with "IIL" in their DMI_PRODUCT_VERSION have
+        * an E820 reserved region that covers the entire 32-bit host
+        * bridge memory window from _CRS.  Using the E820 region to clip
+        * _CRS means no space is available for hot-added or uninitialized
+        * PCI devices.  This typically breaks I2C controllers for touchpads
+        * and hot-added Thunderbolt devices.  See the commit log for
+        * models known to require this quirk and related bug reports.
+        */
+       {
+               .callback = set_no_e820,
+               .ident = "Lenovo *IIL* product version",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "IIL"),
+               },
+       },
+
+       /*
+        * The Acer Spin 5 (SP513-54N) has the same E820 reservation covering
+        * the entire _CRS 32-bit window issue as the Lenovo *IIL* models.
+        * See https://bugs.launchpad.net/bugs/1884232
+        */
+       {
+               .callback = set_no_e820,
+               .ident = "Acer Spin 5 (SP513-54N)",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Spin SP513-54N"),
+               },
+       },
+
+       /*
+        * Clevo X170KM-G barebones have the same E820 reservation covering
+        * the entire _CRS 32-bit window issue as the Lenovo *IIL* models.
+        * See https://bugzilla.kernel.org/show_bug.cgi?id=214259
+        */
+       {
+               .callback = set_no_e820,
+               .ident = "Clevo X170KM-G Barebone",
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_NAME, "X170KM-G"),
+               },
+       },
        {}
 };