* [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected
@ 2024-01-04 2:48 Kai-Heng Feng
2024-01-04 2:48 ` [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Kai-Heng Feng @ 2024-01-04 2:48 UTC (permalink / raw)
To: jdelvare, linux
Cc: Kai-Heng Feng, Rafael J. Wysocki, Len Brown, Robert Moore,
linux-acpi, linux-kernel, acpica-devel
The function of acpi_power_meter module on Dell system requires IPMI
handler is installed and SMI is selected.
So add a helper to let acpi_power_meter know when IPMI handler and SMI
are ready.
Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
---
v3:
- New patch.
drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++-
include/acpi/acpi_bus.h | 5 +++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c
index 0555f68c2dfd..54862cab7171 100644
--- a/drivers/acpi/acpi_ipmi.c
+++ b/drivers/acpi/acpi_ipmi.c
@@ -23,6 +23,8 @@ MODULE_LICENSE("GPL");
#define IPMI_TIMEOUT (5000)
#define ACPI_IPMI_MAX_MSG_LENGTH 64
+static struct completion smi_selected;
+
struct acpi_ipmi_device {
/* the device list attached to driver_data.ipmi_devices */
struct list_head head;
@@ -463,8 +465,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(&smi_selected);
+ }
list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices);
mutex_unlock(&driver_data.ipmi_lock);
@@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ);
+
+ return ret > 0 ? 0 : -ETIMEDOUT;
+}
+EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi);
+
static int __init acpi_ipmi_init(void)
{
int result;
acpi_status status;
+ init_completion(&smi_selected);
if (acpi_disabled)
return 0;
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 1216d72c650f..afa6e4d4bf46 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -821,11 +821,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] 10+ messages in thread* [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems 2024-01-04 2:48 [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng @ 2024-01-04 2:48 ` Kai-Heng Feng 2024-01-05 8:09 ` kernel test robot 2024-01-04 13:34 ` [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Rafael J. Wysocki 2024-01-04 17:25 ` Rafael J. Wysocki 2 siblings, 1 reply; 10+ messages in thread From: Kai-Heng Feng @ 2024-01-04 2:48 UTC (permalink / raw) To: jdelvare, linux; +Cc: Kai-Heng Feng, linux-hwmon, linux-kernel 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. [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> --- v3: - Use helper. - Use return value to print warning message. v2: - Use completion instead of request_module(). drivers/hwmon/acpi_power_meter.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_meter.c index 703666b95bf4..33fb9626633d 100644 --- a/drivers/hwmon/acpi_power_meter.c +++ b/drivers/hwmon/acpi_power_meter.c @@ -883,6 +883,12 @@ static int acpi_power_meter_add(struct acpi_device *device) strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS); device->driver_data = resource; + if (dmi_match(DMI_SYS_VENDOR, "Dell Inc.") && + acpi_dev_get_first_match_dev("IPI0001", NULL, -1)) { + if (acpi_wait_for_acpi_ipmi()) + dev_warn(&device->dev, "Waiting for ACPI IPMI timeout"); + } + res = read_capabilities(resource); if (res) goto exit_free; -- 2.34.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems 2024-01-04 2:48 ` [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng @ 2024-01-05 8:09 ` kernel test robot 0 siblings, 0 replies; 10+ messages in thread From: kernel test robot @ 2024-01-05 8:09 UTC (permalink / raw) To: Kai-Heng Feng, jdelvare, linux Cc: oe-kbuild-all, Kai-Heng Feng, linux-hwmon, linux-kernel Hi Kai-Heng, kernel test robot noticed the following build errors: [auto build test ERROR on rafael-pm/linux-next] [also build test ERROR on groeck-staging/hwmon-next rafael-pm/acpi-bus rafael-pm/devprop linus/master v6.7-rc8 next-20240104] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Kai-Heng-Feng/hwmon-acpi_power_meter-Ensure-IPMI-space-handler-is-ready-on-Dell-systems/20240104-105227 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20240104024819.848979-2-kai.heng.feng%40canonical.com patch subject: [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems config: i386-randconfig-r133-20240104 (https://download.01.org/0day-ci/archive/20240105/202401051544.T4aBavV5-lkp@intel.com/config) compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240105/202401051544.T4aBavV5-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202401051544.T4aBavV5-lkp@intel.com/ All errors (new ones prefixed by >>): >> ld.lld: error: undefined symbol: acpi_wait_for_acpi_ipmi >>> referenced by acpi_power_meter.c:888 (drivers/hwmon/acpi_power_meter.c:888) >>> drivers/hwmon/acpi_power_meter.o:(acpi_power_meter_add) in archive vmlinux.a -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 2:48 [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng 2024-01-04 2:48 ` [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng @ 2024-01-04 13:34 ` Rafael J. Wysocki 2024-01-04 15:42 ` Corey Minyard 2024-01-05 4:24 ` Kai-Heng Feng 2024-01-04 17:25 ` Rafael J. Wysocki 2 siblings, 2 replies; 10+ messages in thread From: Rafael J. Wysocki @ 2024-01-04 13:34 UTC (permalink / raw) To: Kai-Heng Feng Cc: jdelvare, linux, Rafael J. Wysocki, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng <kai.heng.feng@canonical.com> wrote: > > The function of acpi_power_meter module on Dell system requires IPMI > handler is installed and SMI is selected. Does the firmware use _DEP to let the OS know about this dependency? > So add a helper to let acpi_power_meter know when IPMI handler and SMI > are ready. > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > --- > v3: > - New patch. > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > include/acpi/acpi_bus.h | 5 +++++ > 2 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > index 0555f68c2dfd..54862cab7171 100644 > --- a/drivers/acpi/acpi_ipmi.c > +++ b/drivers/acpi/acpi_ipmi.c > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > #define IPMI_TIMEOUT (5000) > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > +static struct completion smi_selected; > + > struct acpi_ipmi_device { > /* the device list attached to driver_data.ipmi_devices */ > struct list_head head; > @@ -463,8 +465,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(&smi_selected); > + } > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > mutex_unlock(&driver_data.ipmi_lock); > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > + > + return ret > 0 ? 0 : -ETIMEDOUT; What will happen if the IPMI driver is unloaded after this has returned 0? > +} > +EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi); > + > static int __init acpi_ipmi_init(void) > { > int result; > acpi_status status; > + init_completion(&smi_selected); > > if (acpi_disabled) > return 0; > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > index 1216d72c650f..afa6e4d4bf46 100644 > --- a/include/acpi/acpi_bus.h > +++ b/include/acpi/acpi_bus.h > @@ -821,11 +821,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__*/ > -- ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 13:34 ` [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Rafael J. Wysocki @ 2024-01-04 15:42 ` Corey Minyard 2024-01-04 17:11 ` Rafael J. Wysocki 2024-01-05 4:24 ` Kai-Heng Feng 1 sibling, 1 reply; 10+ messages in thread From: Corey Minyard @ 2024-01-04 15:42 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Kai-Heng Feng, jdelvare, linux, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 04, 2024 at 02:34:52PM +0100, Rafael J. Wysocki wrote: > On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng > <kai.heng.feng@canonical.com> wrote: > > > > The function of acpi_power_meter module on Dell system requires IPMI > > handler is installed and SMI is selected. > > Does the firmware use _DEP to let the OS know about this dependency? > > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > > are ready. > > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > --- > > v3: > > - New patch. > > > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > > include/acpi/acpi_bus.h | 5 +++++ > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > > index 0555f68c2dfd..54862cab7171 100644 > > --- a/drivers/acpi/acpi_ipmi.c > > +++ b/drivers/acpi/acpi_ipmi.c > > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > > #define IPMI_TIMEOUT (5000) > > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > > > +static struct completion smi_selected; > > + > > struct acpi_ipmi_device { > > /* the device list attached to driver_data.ipmi_devices */ > > struct list_head head; > > @@ -463,8 +465,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(&smi_selected); > > + } > > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > > mutex_unlock(&driver_data.ipmi_lock); > > > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > > + > > + return ret > 0 ? 0 : -ETIMEDOUT; > > What will happen if the IPMI driver is unloaded after this has returned 0? The IPMI driver can't be unloaded if it has a user. I've been following this, but I know little about ACPI. Beyond this solution, the only other solution I could come up with was to start the IPMI driver earlier. But then you are in a chicken-and-egg situation (https://dictionary.cambridge.org/dictionary/english/chicken-and-egg-situation). Which was the reason for the SPMI table, but that's really kind of useless for this, even if the SPMI table existed. -corey > > > +} > > +EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi); > > + > > static int __init acpi_ipmi_init(void) > > { > > int result; > > acpi_status status; > > + init_completion(&smi_selected); > > > > if (acpi_disabled) > > return 0; > > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > > index 1216d72c650f..afa6e4d4bf46 100644 > > --- a/include/acpi/acpi_bus.h > > +++ b/include/acpi/acpi_bus.h > > @@ -821,11 +821,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__*/ > > -- > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 15:42 ` Corey Minyard @ 2024-01-04 17:11 ` Rafael J. Wysocki 2024-01-04 17:30 ` Corey Minyard 0 siblings, 1 reply; 10+ messages in thread From: Rafael J. Wysocki @ 2024-01-04 17:11 UTC (permalink / raw) To: minyard Cc: Rafael J. Wysocki, Kai-Heng Feng, jdelvare, linux, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 4, 2024 at 4:42 PM Corey Minyard <minyard@acm.org> wrote: > > On Thu, Jan 04, 2024 at 02:34:52PM +0100, Rafael J. Wysocki wrote: > > On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng > > <kai.heng.feng@canonical.com> wrote: > > > > > > The function of acpi_power_meter module on Dell system requires IPMI > > > handler is installed and SMI is selected. > > > > Does the firmware use _DEP to let the OS know about this dependency? > > > > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > > > are ready. > > > > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > > --- > > > v3: > > > - New patch. > > > > > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > > > include/acpi/acpi_bus.h | 5 +++++ > > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > > > index 0555f68c2dfd..54862cab7171 100644 > > > --- a/drivers/acpi/acpi_ipmi.c > > > +++ b/drivers/acpi/acpi_ipmi.c > > > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > > > #define IPMI_TIMEOUT (5000) > > > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > > > > > +static struct completion smi_selected; > > > + > > > struct acpi_ipmi_device { > > > /* the device list attached to driver_data.ipmi_devices */ > > > struct list_head head; > > > @@ -463,8 +465,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(&smi_selected); > > > + } > > > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > > > mutex_unlock(&driver_data.ipmi_lock); > > > > > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > > > + > > > + return ret > 0 ? 0 : -ETIMEDOUT; > > > > What will happen if the IPMI driver is unloaded after this has returned 0? > > The IPMI driver can't be unloaded if it has a user. Because of the use of the exported symbol, right? > I've been following this, but I know little about ACPI. Beyond this > solution, the only other solution I could come up with was to start the > IPMI driver earlier. But then you are in a chicken-and-egg situation > (https://dictionary.cambridge.org/dictionary/english/chicken-and-egg-situation). > Which was the reason for the SPMI table, but that's really kind of > useless for this, even if the SPMI table existed. Fine. Let me reply to the patch with some more comments then. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 17:11 ` Rafael J. Wysocki @ 2024-01-04 17:30 ` Corey Minyard 0 siblings, 0 replies; 10+ messages in thread From: Corey Minyard @ 2024-01-04 17:30 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Kai-Heng Feng, jdelvare, linux, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 04, 2024 at 06:11:29PM +0100, Rafael J. Wysocki wrote: > On Thu, Jan 4, 2024 at 4:42 PM Corey Minyard <minyard@acm.org> wrote: > > > > On Thu, Jan 04, 2024 at 02:34:52PM +0100, Rafael J. Wysocki wrote: > > > On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng > > > <kai.heng.feng@canonical.com> wrote: > > > > > > > > The function of acpi_power_meter module on Dell system requires IPMI > > > > handler is installed and SMI is selected. > > > > > > Does the firmware use _DEP to let the OS know about this dependency? > > > > > > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > > > > are ready. > > > > > > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > > > --- > > > > v3: > > > > - New patch. > > > > > > > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > > > > include/acpi/acpi_bus.h | 5 +++++ > > > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > > > > index 0555f68c2dfd..54862cab7171 100644 > > > > --- a/drivers/acpi/acpi_ipmi.c > > > > +++ b/drivers/acpi/acpi_ipmi.c > > > > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > > > > #define IPMI_TIMEOUT (5000) > > > > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > > > > > > > +static struct completion smi_selected; > > > > + > > > > struct acpi_ipmi_device { > > > > /* the device list attached to driver_data.ipmi_devices */ > > > > struct list_head head; > > > > @@ -463,8 +465,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(&smi_selected); > > > > + } > > > > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > > > > mutex_unlock(&driver_data.ipmi_lock); > > > > > > > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > > > > + > > > > + return ret > 0 ? 0 : -ETIMEDOUT; > > > > > > What will happen if the IPMI driver is unloaded after this has returned 0? > > > > The IPMI driver can't be unloaded if it has a user. > > Because of the use of the exported symbol, right? I wasn't thinking that, but yes, that would do it. It also keep track of users and doesn't allow the driver to be unloaded if anything has registered as a user, either. -corey > > > I've been following this, but I know little about ACPI. Beyond this > > solution, the only other solution I could come up with was to start the > > IPMI driver earlier. But then you are in a chicken-and-egg situation > > (https://dictionary.cambridge.org/dictionary/english/chicken-and-egg-situation). > > Which was the reason for the SPMI table, but that's really kind of > > useless for this, even if the SPMI table existed. > > Fine. > > Let me reply to the patch with some more comments then. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 13:34 ` [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Rafael J. Wysocki 2024-01-04 15:42 ` Corey Minyard @ 2024-01-05 4:24 ` Kai-Heng Feng 1 sibling, 0 replies; 10+ messages in thread From: Kai-Heng Feng @ 2024-01-05 4:24 UTC (permalink / raw) To: Rafael J. Wysocki Cc: jdelvare, linux, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 4, 2024 at 9:35 PM Rafael J. Wysocki <rafael@kernel.org> wrote: > > On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng > <kai.heng.feng@canonical.com> wrote: > > > > The function of acpi_power_meter module on Dell system requires IPMI > > handler is installed and SMI is selected. > > Does the firmware use _DEP to let the OS know about this dependency? No. _DEP is missing. Kai-Heng > > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > > are ready. > > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > --- > > v3: > > - New patch. > > > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > > include/acpi/acpi_bus.h | 5 +++++ > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > > index 0555f68c2dfd..54862cab7171 100644 > > --- a/drivers/acpi/acpi_ipmi.c > > +++ b/drivers/acpi/acpi_ipmi.c > > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > > #define IPMI_TIMEOUT (5000) > > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > > > +static struct completion smi_selected; > > + > > struct acpi_ipmi_device { > > /* the device list attached to driver_data.ipmi_devices */ > > struct list_head head; > > @@ -463,8 +465,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(&smi_selected); > > + } > > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > > mutex_unlock(&driver_data.ipmi_lock); > > > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > > + > > + return ret > 0 ? 0 : -ETIMEDOUT; > > What will happen if the IPMI driver is unloaded after this has returned 0? > > > +} > > +EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi); > > + > > static int __init acpi_ipmi_init(void) > > { > > int result; > > acpi_status status; > > + init_completion(&smi_selected); > > > > if (acpi_disabled) > > return 0; > > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > > index 1216d72c650f..afa6e4d4bf46 100644 > > --- a/include/acpi/acpi_bus.h > > +++ b/include/acpi/acpi_bus.h > > @@ -821,11 +821,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__*/ > > -- ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 2:48 [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng 2024-01-04 2:48 ` [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng 2024-01-04 13:34 ` [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Rafael J. Wysocki @ 2024-01-04 17:25 ` Rafael J. Wysocki 2024-01-05 4:54 ` Kai-Heng Feng 2 siblings, 1 reply; 10+ messages in thread From: Rafael J. Wysocki @ 2024-01-04 17:25 UTC (permalink / raw) To: Kai-Heng Feng Cc: jdelvare, linux, Rafael J. Wysocki, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng <kai.heng.feng@canonical.com> wrote: > > The function of acpi_power_meter module on Dell system requires IPMI > handler is installed and SMI is selected. > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > are ready. The changelog is a bit terse. It could describe the problem at hand in more detail, for example. Also it wouldn't hurt to provide a Link: tag pointing to a place where some extra details could be found. > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > --- > v3: > - New patch. > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > include/acpi/acpi_bus.h | 5 +++++ > 2 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > index 0555f68c2dfd..54862cab7171 100644 > --- a/drivers/acpi/acpi_ipmi.c > +++ b/drivers/acpi/acpi_ipmi.c > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > #define IPMI_TIMEOUT (5000) > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > +static struct completion smi_selected; > + > struct acpi_ipmi_device { > /* the device list attached to driver_data.ipmi_devices */ > struct list_head head; > @@ -463,8 +465,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(&smi_selected); It looks like the new completion is at least related to driver_data, so should it be a member of the latter? > + } > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > mutex_unlock(&driver_data.ipmi_lock); > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); Why does it wait for 2 ticks and not 3 or 5? Also it would be nice to have a symbol defined for this timeout value. > + > + return ret > 0 ? 0 : -ETIMEDOUT; if (ret <= 0) return -ETIMEDOUT; return 0; pretty please. > +} > +EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi); > + > static int __init acpi_ipmi_init(void) > { > int result; > acpi_status status; Empty line here, please. > + init_completion(&smi_selected); Does it really make sense to initialize it when ACPI is disabled? > > if (acpi_disabled) > return 0; > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > index 1216d72c650f..afa6e4d4bf46 100644 > --- a/include/acpi/acpi_bus.h > +++ b/include/acpi/acpi_bus.h > @@ -821,11 +821,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__*/ > -- ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected 2024-01-04 17:25 ` Rafael J. Wysocki @ 2024-01-05 4:54 ` Kai-Heng Feng 0 siblings, 0 replies; 10+ messages in thread From: Kai-Heng Feng @ 2024-01-05 4:54 UTC (permalink / raw) To: Rafael J. Wysocki Cc: jdelvare, linux, Len Brown, Robert Moore, linux-acpi, linux-kernel, acpica-devel On Fri, Jan 5, 2024 at 1:25 AM Rafael J. Wysocki <rafael@kernel.org> wrote: > > On Thu, Jan 4, 2024 at 3:48 AM Kai-Heng Feng > <kai.heng.feng@canonical.com> wrote: > > > > The function of acpi_power_meter module on Dell system requires IPMI > > handler is installed and SMI is selected. > > > > So add a helper to let acpi_power_meter know when IPMI handler and SMI > > are ready. > > The changelog is a bit terse. > > It could describe the problem at hand in more detail, for example. > > Also it wouldn't hurt to provide a Link: tag pointing to a place where > some extra details could be found. OK. Will add more info in next revision. > > > Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com> > > --- > > v3: > > - New patch. > > > > drivers/acpi/acpi_ipmi.c | 17 ++++++++++++++++- > > include/acpi/acpi_bus.h | 5 +++++ > > 2 files changed, 21 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/acpi/acpi_ipmi.c b/drivers/acpi/acpi_ipmi.c > > index 0555f68c2dfd..54862cab7171 100644 > > --- a/drivers/acpi/acpi_ipmi.c > > +++ b/drivers/acpi/acpi_ipmi.c > > @@ -23,6 +23,8 @@ MODULE_LICENSE("GPL"); > > #define IPMI_TIMEOUT (5000) > > #define ACPI_IPMI_MAX_MSG_LENGTH 64 > > > > +static struct completion smi_selected; > > + > > struct acpi_ipmi_device { > > /* the device list attached to driver_data.ipmi_devices */ > > struct list_head head; > > @@ -463,8 +465,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(&smi_selected); > > It looks like the new completion is at least related to driver_data, > so should it be a member of the latter? Sure thing. > > > + } > > list_add_tail(&ipmi_device->head, &driver_data.ipmi_devices); > > mutex_unlock(&driver_data.ipmi_lock); > > > > @@ -578,10 +582,21 @@ 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(&smi_selected, 2 * HZ); > > Why does it wait for 2 ticks and not 3 or 5? > > Also it would be nice to have a symbol defined for this timeout value. Sure. Will add a define and comment. > > > + > > + return ret > 0 ? 0 : -ETIMEDOUT; > > if (ret <= 0) > return -ETIMEDOUT; > > return 0; > > pretty please. OK. > > > +} > > +EXPORT_SYMBOL_GPL(acpi_wait_for_acpi_ipmi); > > + > > static int __init acpi_ipmi_init(void) > > { > > int result; > > acpi_status status; > > Empty line here, please. OK. > > > + init_completion(&smi_selected); > > Does it really make sense to initialize it when ACPI is disabled? OK, will move it further down. Kai-Heng > > > > > if (acpi_disabled) > > return 0; > > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > > index 1216d72c650f..afa6e4d4bf46 100644 > > --- a/include/acpi/acpi_bus.h > > +++ b/include/acpi/acpi_bus.h > > @@ -821,11 +821,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__*/ > > -- ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-01-05 8:10 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-01-04 2:48 [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Kai-Heng Feng 2024-01-04 2:48 ` [PATCH v3 2/2] hwmon: (acpi_power_meter) Ensure IPMI space handler is ready on Dell systems Kai-Heng Feng 2024-01-05 8:09 ` kernel test robot 2024-01-04 13:34 ` [PATCH v3 1/2] ACPI: IPMI: Add helper to wait for when SMI is selected Rafael J. Wysocki 2024-01-04 15:42 ` Corey Minyard 2024-01-04 17:11 ` Rafael J. Wysocki 2024-01-04 17:30 ` Corey Minyard 2024-01-05 4:24 ` Kai-Heng Feng 2024-01-04 17:25 ` Rafael J. Wysocki 2024-01-05 4:54 ` Kai-Heng Feng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox