From 8f6d605714a4155991a2bd404c63f8f1725536f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 30 Mar 2020 11:29:46 +0200 Subject: [PATCH] acpi: add walk_namespace bus and device method Change-Id: I03fa43e0ba9b37f6db43f6ff16bbca892684cc49 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2446 Reviewed-by: Adrien Destugues --- headers/os/drivers/ACPI.h | 14 ++++++++++++++ src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h | 4 ++++ .../kernel/bus_managers/acpi/BusManager.cpp | 12 ++++++++++++ src/add-ons/kernel/bus_managers/acpi/Device.cpp | 11 +++++++++++ 4 files changed, 41 insertions(+) diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h index a5f3b7e814..d6a958a821 100644 --- a/headers/os/drivers/ACPI.h +++ b/headers/os/drivers/ACPI.h @@ -174,6 +174,9 @@ typedef void (*acpi_notify_handler)(acpi_handle device, uint32 value, typedef acpi_status (*acpi_walk_resources_callback)(acpi_resource* resource, void* context); +typedef acpi_status (*acpi_walk_callback) (acpi_handle object, uint32 nestingLevel, + void *context, void** returnValue); + struct acpi_module_info { module_info info; @@ -240,6 +243,12 @@ struct acpi_module_info { char *result, size_t length, void **_counter); status_t (*get_next_object)(uint32 objectType, acpi_handle parent, acpi_handle* currentChild); + status_t (*walk_namespace)(acpi_handle busDeviceHandle, + uint32 objectType, uint32 maxDepth, + acpi_walk_callback descendingCallback, + acpi_walk_callback ascendingCallback, void* context, + void** returnValue); + status_t (*get_device)(const char *hid, uint32 index, char *result, size_t resultLength); @@ -337,6 +346,11 @@ typedef struct acpi_device_module_info { uint32 (*get_object_type)(acpi_device device); status_t (*get_object)(acpi_device device, const char *path, acpi_object_type **_returnValue); + status_t (*walk_namespace)(acpi_device device, + uint32 objectType, uint32 maxDepth, + acpi_walk_callback descendingCallback, + acpi_walk_callback ascendingCallback, + void* context, void** returnValue); /* Control method execution and data acquisition */ status_t (*evaluate_method)(acpi_device device, const char *method, diff --git a/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h b/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h index b4b2e24046..6f834f35bb 100644 --- a/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h +++ b/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h @@ -221,6 +221,10 @@ status_t get_object(const char* path, acpi_object_type** _returnValue); status_t get_object_typed(const char* path, acpi_object_type** _returnValue, uint32 object_type); status_t ns_handle_to_pathname(acpi_handle targetHandle, acpi_data* buffer); +status_t walk_namespace(acpi_handle busDeviceHandle, uint32 objectType, + uint32 maxDepth, acpi_walk_callback descendingCallback, + acpi_walk_callback ascendingCallback, void* context, void** returnValue); + status_t evaluate_object(acpi_handle handle, const char* object, acpi_objects* args, acpi_object_type* returnValue, size_t bufferLength); diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp index 6882862455..ebd92bfa47 100644 --- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp @@ -733,6 +733,17 @@ walk_resources(acpi_handle busDeviceHandle, char* method, } +status_t +walk_namespace(acpi_handle busDeviceHandle, uint32 objectType, + uint32 maxDepth, acpi_walk_callback descendingCallback, + acpi_walk_callback ascendingCallback, void* context, void** returnValue) +{ + return AcpiWalkNamespace(objectType, busDeviceHandle, maxDepth, + (ACPI_WALK_CALLBACK)descendingCallback, + (ACPI_WALK_CALLBACK)ascendingCallback, context, returnValue); +} + + status_t prepare_sleep_state(uint8 state, void (*wakeFunc)(void), size_t size) { @@ -866,6 +877,7 @@ struct acpi_module_info gACPIModule = { remove_fixed_event_handler, get_next_entry, get_next_object, + walk_namespace, get_device, get_device_info, get_object_type, diff --git a/src/add-ons/kernel/bus_managers/acpi/Device.cpp b/src/add-ons/kernel/bus_managers/acpi/Device.cpp index 3a9dfbbc58..a818494985 100644 --- a/src/add-ons/kernel/bus_managers/acpi/Device.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/Device.cpp @@ -84,6 +84,16 @@ acpi_walk_resources(acpi_device device, char *method, } +static status_t +acpi_walk_namespace(acpi_device device, uint32 objectType, uint32 maxDepth, + acpi_walk_callback descendingCallback, + acpi_walk_callback ascendingCallback, void* context, void** returnValue) +{ + return walk_namespace(device->handle, objectType, maxDepth, + descendingCallback, ascendingCallback, context, returnValue); +} + + static status_t acpi_device_init_driver(device_node *node, void **cookie) { @@ -162,6 +172,7 @@ acpi_device_module_info gACPIDeviceModule = { acpi_remove_address_space_handler, acpi_get_object_type, acpi_get_object, + acpi_walk_namespace, acpi_evaluate_method, acpi_walk_resources };