Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems

The following error can be observed at boot:
[ 3.717920] ACPI Error: No handler for Region [SYSI] (00000000ab9e62c5) [IPMI] (20230628/evregion-130)
[ 3.717928] ACPI Error: Region IPMI (ID=7) has no handler (20230628/exfldio-261)

[ 3.717936] No Local Variables are initialized for Method [_GHL]

[ 3.717938] No Arguments are initialized for method [_GHL]

[ 3.717940] ACPI Error: Aborting method \_SB.PMI0._GHL due to previous error (AE_NOT_EXIST) (20230628/psparse-529)
[ 3.717949] ACPI Error: Aborting method \_SB.PMI0._PMC due to previous error (AE_NOT_EXIST) (20230628/psparse-529)
[ 3.717957] ACPI: \_SB_.PMI0: _PMC evaluation failed: AE_NOT_EXIST

On Dell systems several methods of acpi_power_meter access variables in
IPMI region [0], so wait until IPMI space handler is installed by
acpi_ipmi and also wait until SMI is selected to make the space handler
fully functional.

Since the dependency is inside BIOS's ASL code and it's not
discoverable, so use this fixup is a hack to workaround BIOS issue.

[0] https://www.dell.com/support/manuals/en-us/redhat-enterprise-linux-v8.0/rhel8_rn_pub/advanced-configuration-and-power-interface-acpi-error-messages-displayed-in-dmesg?guid=guid-0d5ae482-1977-42cf-b417-3ed5c3f5ee62

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Link: https://lore.kernel.org/r/20240320084317.366853-2-kai.heng.feng@canonical.com
[groeck: Simplified added code]
Signed-off-by: Guenter Roeck <linux@roeck-us.net>

authored by

Kai-Heng Feng and committed by
Guenter Roeck
71113b9b 670e98a3

+16
+16
drivers/hwmon/acpi_power_meter.c
··· 883 883 strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS); 884 884 device->driver_data = resource; 885 885 886 + #if IS_REACHABLE(CONFIG_ACPI_IPMI) 887 + /* 888 + * On Dell systems several methods of acpi_power_meter access 889 + * variables in IPMI region, so wait until IPMI space handler is 890 + * installed by acpi_ipmi and also wait until SMI is selected to make 891 + * the space handler fully functional. 892 + */ 893 + if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) { 894 + struct acpi_device *ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1); 895 + 896 + if (ipi_device && acpi_wait_for_acpi_ipmi()) 897 + dev_warn(&device->dev, "Waiting for ACPI IPMI timeout"); 898 + acpi_dev_put(ipi_device); 899 + } 900 + #endif 901 + 886 902 res = read_capabilities(resource); 887 903 if (res) 888 904 goto exit_free;