acpica-devel.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected
@ 2024-03-20  8:43 Kai-Heng Feng
  2024-03-20  8:43 ` [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
  2024-03-20 18:00 ` [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Guenter Roeck
  0 siblings, 2 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2024-03-20  8:43 UTC (permalink / raw)
  To: rafael, lenb, jdelvare, linux
  Cc: robert.moore, linux-acpi, linux-kernel, linux-hwmon,
	acpica-devel, Kai-Heng Feng, Rafael J . Wysocki

On Dell servers, many APCI methods of acpi_power_meter module evaluate
variables inside IPMI region, so the region handler needs to be
installed. In addition to that, the handler needs to be fully
functional, and that depends on SMI being selected.

So add a helper to let acpi_power_meter know when the handler is
installed and ready to be used.

Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
v5:
 - No change.

v4:
 - Wording.
 - Define and comment on timeout value.
 - Move the completion to driver_data.
 - Remove the tenary operator.

v3:
 - New patch.

 drivers/acpi/acpi_ipmi.c | 23 ++++++++++++++++++++++-
 include/acpi/acpi_bus.h  |  5 +++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c
index 0555f68c2dfd..5fba4dab5d08 100644
--- a/drivers/acpi/acpi_ipmi.c
+++ b/drivers/acpi/acpi_ipmi.c
@@ -22,6 +22,8 @@ MODULE_LICENSE("GPL");
 /* the IPMI timeout is 5s */
 #define IPMI_TIMEOUT			(5000)
 #define ACPI_IPMI_MAX_MSG_LENGTH	64
+/* 2s should be suffient for SMI being selected */
+#define ACPI_IPMI_SMI_SELECTION_TIMEOUT	(2 * HZ)
 
 struct acpi_ipmi_device {
 	/* the device list attached to driver_data.ipmi_devices */
@@ -54,6 +56,7 @@ struct ipmi_driver_data {
 	 * to this selected global IPMI system interface.
 	 */
 	struct acpi_ipmi_device *selected_smi;
+	struct completion smi_selection_done;
 };
 
 struct acpi_ipmi_msg {
@@ -463,8 +466,10 @@ static void ipmi_register_bmc(int iface, struct device *dev)
 		if (temp->handle == handle)
 			goto err_lock;
 	}
-	if (!driver_data.selected_smi)
+	if (!driver_data.selected_smi) {
 		driver_data.selected_smi = ipmi_device;
+		complete(&driver_data.smi_selection_done);
+	}
 	list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices);
 	mutex_unlock(&driver_data.ipmi_lock);
 
@@ -578,6 +583,20 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,
 	return status;
 }
 
+int acpi_wait_for_acpi_ipmi(void)
+{
+	long ret;
+
+	ret = wait_for_completion_interruptible_timeout(&driver_data.smi_selection_done,
+							ACPI_IPMI_SMI_SELECTION_TIMEOUT);
+
+	if (ret <= 0)
+		return -ETIMEDOUT;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi);
+
 static int __init acpi_ipmi_init(void)
 {
 	int result;
@@ -586,6 +605,8 @@ static int __init acpi_ipmi_init(void)
 	if (acpi_disabled)
 		return 0;
 
+	init_completion(&driver_data.smi_selection_done);
+
 	status = acpi_install_address_space_handler(ACPI_ROOT_OBJECT,
 						    ACPI_ADR_SPACE_IPMI,
 						    &acpi_ipmi_space_handler,
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 5de954e2b18a..5a69cbd58c5e 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -976,11 +976,16 @@ static inline void acpi_put_acpi_dev(struct acpi_device *adev)
 {
 	acpi_dev_put(adev);
 }
+
+int acpi_wait_for_acpi_ipmi(void);
+
 #else	/* CONFIG_ACPI */
 
 static inline int register_acpi_bus_type(void *bus) { return 0; }
 static inline int unregister_acpi_bus_type(void *bus) { return 0; }
 
+static inline int acpi_wait_for_acpi_ipmi(void) { return 0; }
+
 #endif				/* CONFIG_ACPI */
 
 #endif /*__ACPI_BUS_H__*/
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems
  2024-03-20  8:43 [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng
@ 2024-03-20  8:43 ` Kai-Heng Feng
  2024-03-20 18:01   ` Guenter Roeck
  2024-03-25 12:38   ` Andy Shevchenko
  2024-03-20 18:00 ` [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Guenter Roeck
  1 sibling, 2 replies; 6+ messages in thread
From: Kai-Heng Feng @ 2024-03-20  8:43 UTC (permalink / raw)
  To: rafael, lenb, jdelvare, linux
  Cc: robert.moore, linux-acpi, linux-kernel, linux-hwmon,
	acpica-devel, Kai-Heng Feng

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(+)

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;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected
  2024-03-20  8:43 [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng
  2024-03-20  8:43 ` [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
@ 2024-03-20 18:00 ` Guenter Roeck
  1 sibling, 0 replies; 6+ messages in thread
From: Guenter Roeck @ 2024-03-20 18:00 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: rafael, lenb, jdelvare, robert.moore, linux-acpi, linux-kernel,
	linux-hwmon, acpica-devel, Rafael J . Wysocki

On Wed, Mar 20, 2024 at 04:43:16PM +0800, Kai-Heng Feng wrote:
> On Dell servers, many APCI methods of acpi_power_meter module evaluate
> variables inside IPMI region, so the region handler needs to be
> installed. In addition to that, the handler needs to be fully
> functional, and that depends on SMI being selected.
> 
> So add a helper to let acpi_power_meter know when the handler is
> installed and ready to be used.
> 
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

Applied to hwmon-next.

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

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems
  2024-03-20  8:43 ` [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
@ 2024-03-20 18:01   ` Guenter Roeck
  2024-03-25 12:38   ` Andy Shevchenko
  1 sibling, 0 replies; 6+ messages in thread
From: Guenter Roeck @ 2024-03-20 18:01 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: rafael, lenb, jdelvare, robert.moore, linux-acpi, linux-kernel,
	linux-hwmon, acpica-devel

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems
  2024-03-20  8:43 ` [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
  2024-03-20 18:01   ` Guenter Roeck
@ 2024-03-25 12:38   ` Andy Shevchenko
  2024-03-25 14:40     ` Guenter Roeck
  1 sibling, 1 reply; 6+ messages in thread
From: Andy Shevchenko @ 2024-03-25 12:38 UTC (permalink / raw)
  To: Kai-Heng Feng
  Cc: rafael, lenb, jdelvare, linux, robert.moore, linux-acpi,
	linux-kernel, linux-hwmon, acpica-devel

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);

> +	}

-- 
With Best Regards,
Andy Shevchenko



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems
  2024-03-25 12:38   ` Andy Shevchenko
@ 2024-03-25 14:40     ` Guenter Roeck
  0 siblings, 0 replies; 6+ messages in thread
From: Guenter Roeck @ 2024-03-25 14:40 UTC (permalink / raw)
  To: Andy Shevchenko, Kai-Heng Feng
  Cc: rafael, lenb, jdelvare, robert.moore, linux-acpi, linux-kernel,
	linux-hwmon, acpica-devel

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


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-03-25 14:40 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-20  8:43 [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng
2024-03-20  8:43 ` [PATCH v5 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
2024-03-20 18:01   ` Guenter Roeck
2024-03-25 12:38   ` Andy Shevchenko
2024-03-25 14:40     ` Guenter Roeck
2024-03-20 18:00 ` [PATCH v5 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Guenter Roeck

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).