diff mbox series

[v5,2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems

Message ID 20240320084317.366853-2-kai.heng.feng@canonical.com (mailing list archive)
State Accepted
Headers show
Series [v5,1/2] ACPI: IPMI: Add helper to wait for when SMI is selected | expand

Commit Message

Kai-Heng Feng March 20, 2024, 8:43 a.m. UTC
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>
---
v5:
 - Check CONFIG_ACPI_IPMI to fix link error.
 - Use acpi_dev_put() to balance reference count.
 - Wording.
 - Add comment to explain the rationale.

v4:
 - No change.

v3:
 - Use helper.
 - Use return value to print warning message.

v2:
 - Use completion instead of request_module().

 drivers/hwmon/acpi_power_meter.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

Comments

Guenter Roeck March 20, 2024, 6:01 p.m. UTC | #1
On Wed, Mar 20, 2024 at 04:43:17PM +0800, Kai-Heng Feng wrote:
> 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>

Applied to hwmon-next.

Please note that I'll push the branch after the commit window closed.

Thanks,
Guenter
Andy Shevchenko March 25, 2024, 12:38 p.m. UTC | #2
On Wed, Mar 20, 2024 at 04:43:17PM +0800, Kai-Heng Feng wrote:
> 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.

...

> +	if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) {
> +		ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
> +
> +		if (ipi_device) {
> +			if (acpi_wait_for_acpi_ipmi())
> +				dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
> +			acpi_dev_put(ipi_device);
> +		}

Can be written as

	if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) {
		ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
		if (ipi_device && acpi_wait_for_acpi_ipmi())
			dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
		acpi_dev_put(ipi_device);

> +	}
Guenter Roeck March 25, 2024, 2:40 p.m. UTC | #3
On 3/25/24 05:38, Andy Shevchenko wrote:
> On Wed, Mar 20, 2024 at 04:43:17PM +0800, Kai-Heng Feng wrote:
>> 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.
> 
> ...
> 
>> +	if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) {
>> +		ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
>> +
>> +		if (ipi_device) {
>> +			if (acpi_wait_for_acpi_ipmi())
>> +				dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
>> +			acpi_dev_put(ipi_device);
>> +		}
> 
> Can be written as
> 
> 	if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) {
> 		ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
> 		if (ipi_device && acpi_wait_for_acpi_ipmi())
> 			dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
> 		acpi_dev_put(ipi_device);
> 
>> +	}
> 

Ah yes, acpi_dev_put() checks if the parameter is NULL. Good point.
I'll make that change, no need to resend.

Thanks,
Guenter
diff mbox series

Patch

diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c
index 703666b95bf4..b34cb57f2a0e 100644
--- a/drivers/hwmon/acpi_power_meter.c
+++ b/drivers/hwmon/acpi_power_meter.c
@@ -868,6 +868,9 @@  static int acpi_power_meter_add(struct acpi_device *device)
 {
 	int res;
 	struct acpi_power_meter_resource *resource;
+#if IS_REACHABLE(CONFIG_ACPI_IPMI)
+	struct acpi_device *ipi_device;
+#endif
 
 	if (!device)
 		return -EINVAL;
@@ -883,6 +886,24 @@  static int acpi_power_meter_add(struct acpi_device *device)
 	strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS);
 	device->driver_data = resource;
 
+#if IS_REACHABLE(CONFIG_ACPI_IPMI)
+	/*
+	 * On Dell systems several methods of acpi_power_meter access
+	 * variables in IPMI region, 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.
+	 */
+	if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.")) {
+		ipi_device = acpi_dev_get_first_match_dev("IPI0001", NULL, -1);
+
+		if (ipi_device) {
+			if (acpi_wait_for_acpi_ipmi())
+				dev_warn(&device->dev, "Waiting for ACPI IPMI timeout");
+			acpi_dev_put(ipi_device);
+		}
+	}
+#endif
+
 	res = read_capabilities(resource);
 	if (res)
 		goto exit_free;