Hi Armin,I like this idea. Returning a negative errno on error would allow drivers to
Thank you for your work on this.
On 4/26/23 23:28, Armin Wolf wrote:
Currently, the WMI driver core knows how many instances of a givenI would prefer this to have a normal kernel function prototype
WMI object exist, but WMI drivers cannot access this information.
At the same time, some current and upcoming WMI drivers want to
have access to this information. Add wmi_instance_count() and
wmidev_instance_count() to allow WMI drivers to get the number of
WMI object instances.
Signed-off-by: Armin Wolf <W_Armin@xxxxxx>
---
drivers/platform/x86/wmi.c | 40 ++++++++++++++++++++++++++++++++++++++
include/linux/acpi.h | 2 ++
include/linux/wmi.h | 2 ++
3 files changed, 44 insertions(+)
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
index c226dd4163a1..7c1a904dec5f 100644
--- a/drivers/platform/x86/wmi.c
+++ b/drivers/platform/x86/wmi.c
@@ -263,6 +263,46 @@ int set_required_buffer_size(struct wmi_device *wdev, u64 length)
}
EXPORT_SYMBOL_GPL(set_required_buffer_size);
+/**
+ * wmi_instance_count - Get number of WMI object instances
+ * @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
+ * @instance_count: variable to hold the instance count
+ *
+ * Get the number of WMI object instances.
+ *
+ * Returns: acpi_status signaling success or error.
+ */
+acpi_status wmi_instance_count(const char *guid_string, u8 *instance_count)
+{
+ struct wmi_block *wblock;
+ acpi_status status;
+
+ status = find_guid(guid_string, &wblock);
+ if (ACPI_FAILURE(status))
+ return status;
+
+ *instance_count = wmidev_instance_count(&wblock->dev);
+
+ return AE_OK;
+}
+EXPORT_SYMBOL_GPL(wmi_instance_count);
which returns -errno rather then returning an acpi_status. E.g. :
/**
* wmi_instance_count - Get number of WMI object instances
* @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
*
* Get the number of WMI object instances.
*
* Returns: The number of WMI object instances, 0 if the GUID is not found.
*/
int wmi_instance_count(const char *guid_string)
{
struct wmi_block *wblock;
acpi_status status;
status = find_guid(guid_string, &wblock);
if (ACPI_FAILURE(status))
return 0;
return wmidev_instance_count(&wblock->dev);
}
EXPORT_SYMBOL_GPL(wmi_instance_count);
This will also allow this to completely replace
the get_instance_count() function in dell-wmi-sysman.
Note I have just gone with always returning 0 here
on error. I guess you could look at the status and
return 0 for not-found and -errno for other errors
but I don't think any callers will care for the difference,
so just always returning 0 seems easier for callers to
deal with.
As always this is just a suggestion, let me know if
you think this is a bad idea.
Regards,
Hans
+
+/**
+ * wmidev_instance_count - Get number of WMI object instances
+ * @wdev: A wmi bus device from a driver
+ *
+ * Get the number of WMI object instances.
+ *
+ * Returns: Number of WMI object instances.
+ */
+u8 wmidev_instance_count(struct wmi_device *wdev)
+{
+ struct wmi_block *wblock = container_of(wdev, struct wmi_block, dev);
+
+ return wblock->gblock.instance_count;
+}
+EXPORT_SYMBOL_GPL(wmidev_instance_count);
+
/**
* wmi_evaluate_method - Evaluate a WMI method (deprecated)
* @guid_string: 36 char string of the form fa50ff2b-f2e8-45de-83fa-65417f2f49ba
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index efff750f326d..ab2a4b23e7a3 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -412,6 +412,8 @@ extern bool acpi_is_pnp_device(struct acpi_device *);
typedef void (*wmi_notify_handler) (u32 value, void *context);
+acpi_status wmi_instance_count(const char *guid, u8 *instance_count);
+
extern acpi_status wmi_evaluate_method(const char *guid, u8 instance,
u32 method_id,
const struct acpi_buffer *in,
diff --git a/include/linux/wmi.h b/include/linux/wmi.h
index c1a3bd4e4838..763bd382cf2d 100644
--- a/include/linux/wmi.h
+++ b/include/linux/wmi.h
@@ -35,6 +35,8 @@ extern acpi_status wmidev_evaluate_method(struct wmi_device *wdev,
extern union acpi_object *wmidev_block_query(struct wmi_device *wdev,
u8 instance);
+u8 wmidev_instance_count(struct wmi_device *wdev);
+
extern int set_required_buffer_size(struct wmi_device *wdev, u64 length);
/**
--
2.30.2