Message ID | 20220801133831.3006674-6-acelan.kao@canonical.com |
---|---|
State | New |
Headers | show |
Series | [1/6,SRU,Jammy] x86/PCI: Eliminate remove_e820_regions() common subexpressions | expand |
On 01.08.22 15:38, AceLan Kao wrote: > From: Hans de Goede <hdegoede@redhat.com> > > BguLink: https://bugs.launchpad.net/bugs/1884232 ^ there's a typo here that needs to be fixed when the patch is applied. > > 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 Lenovo Yoga C940-14IIL > Link: https://bugzilla.kernel.org/show_bug.cgi?id=214259 Clevo X170KM Barebone > Link: https://bugzilla.redhat.com/show_bug.cgi?id=1868899 Lenovo IdeaPad 3 15IIL05 > Link: https://bugzilla.redhat.com/show_bug.cgi?id=1871793 Lenovo IdeaPad 5 14IIL05 > Link: https://bugs.launchpad.net/bugs/1878279 Lenovo IdeaPad 5 14IIL05 > Link: https://bugs.launchpad.net/bugs/1880172 Lenovo IdeaPad 3 14IIL05 > Link: https://bugs.launchpad.net/bugs/1884232 Acer Spin SP513-54N > Link: https://bugs.launchpad.net/bugs/1921649 Lenovo IdeaPad S145 > Link: https://bugs.launchpad.net/bugs/1931715 Lenovo IdeaPad S145 > Link: https://bugs.launchpad.net/bugs/1932069 Lenovo BS145-15IIL > 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> > (cherry picked from commit d341838d776abadb3ac48abdd2f1f40df5a4fc10) > Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com> > --- > arch/x86/pci/acpi.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 53 insertions(+) > > diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c > index 0e48151c1fdc..ec80ca67b9e3 100644 > --- a/arch/x86/pci/acpi.c > +++ b/arch/x86/pci/acpi.c > @@ -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"), > + }, > + }, > {} > }; >
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0e48151c1fdc..ec80ca67b9e3 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -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"), + }, + }, {} };