From 7f6d3afb1d6abb8336052a5a01f2c686efee9c65 Mon Sep 17 00:00:00 2001 From: Clemens Zeidler Date: Mon, 19 Oct 2009 19:00:26 +0000 Subject: [PATCH] Add ns_handle_to_pathname acpi function to the acpi module. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33663 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/drivers/ACPI.h | 2 + .../kernel/bus_managers/acpi/acpi_busman.c | 53 +++++++++++-------- .../kernel/bus_managers/acpi/acpi_module.c | 13 ++--- .../kernel/bus_managers/acpi/acpi_priv.h | 15 +++--- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h index d765ac7b7b..1446fa480c 100644 --- a/headers/os/drivers/ACPI.h +++ b/headers/os/drivers/ACPI.h @@ -209,6 +209,8 @@ struct acpi_module_info { acpi_object_type **_returnValue); status_t (*get_object_typed)(const char *path, acpi_object_type **_returnValue, uint32 objectType); + status_t (*ns_handle_to_pathname)(acpi_handle targetHandle, + acpi_data *buffer); /* Control method execution and data acquisition */ diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c b/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c index c8e25a097f..80679cf45f 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_busman.c @@ -110,13 +110,13 @@ acpi_std_ops(int32 op,...) ERROR("ACPI disabled\n"); return ENOSYS; } - + if (gDPC->new_dpc_queue(&gDPCHandle, "acpi_task", B_NORMAL_PRIORITY) != B_OK) { ERROR("failed to create os execution queue\n"); return B_ERROR; } - + AcpiGbl_EnableInterpreterSlack = true; // AcpiGbl_CreateOSIMethod = true; @@ -146,7 +146,7 @@ acpi_std_ops(int32 op,...) AcpiFormatException(status)); goto err; } - + /* Install the default address space handlers. */ status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_SYSTEM_MEMORY, ACPI_DEFAULT_HANDLER, NULL, NULL); @@ -155,7 +155,7 @@ acpi_std_ops(int32 op,...) AcpiFormatException(status)); goto err; } - + status = AcpiInstallAddressSpaceHandler(ACPI_ROOT_OBJECT, ACPI_ADR_SPACE_SYSTEM_IO, ACPI_DEFAULT_HANDLER, NULL, NULL); if (ACPI_FAILURE(status)) { @@ -172,10 +172,10 @@ acpi_std_ops(int32 op,...) goto err; } - flags = acpiAvoidFullInit ? + flags = acpiAvoidFullInit ? ACPI_NO_DEVICE_INIT | ACPI_NO_OBJECT_INIT : ACPI_FULL_INITIALIZATION; - + // FreeBSD seems to pass in the above flags here as // well but specs don't define ACPI_NO_DEVICE_INIT // and ACPI_NO_OBJECT_INIT here. @@ -185,7 +185,7 @@ acpi_std_ops(int32 op,...) AcpiFormatException(status)); goto err; } - + status = AcpiInitializeObjects(flags); if (ACPI_FAILURE(status)) { ERROR("AcpiInitializeObjects failed (%s)\n", @@ -258,17 +258,17 @@ remove_notify_handler(acpi_handle device, uint32 handlerType, (ACPI_NOTIFY_HANDLER)handler) == AE_OK ? B_OK : B_ERROR; } - + status_t enable_gpe(acpi_handle handle, uint32 gpeNumber, uint32 flags) -{ +{ return AcpiEnableGpe(handle, gpeNumber, flags) == AE_OK ? B_OK : B_ERROR; } status_t set_gpe_type(acpi_handle handle, uint32 gpeNumber, uint8 type) -{ +{ return AcpiSetGpeType(handle, gpeNumber, type) == AE_OK ? B_OK : B_ERROR; } @@ -276,7 +276,7 @@ set_gpe_type(acpi_handle handle, uint32 gpeNumber, uint8 type) status_t install_gpe_handler(acpi_handle handle, uint32 gpeNumber, uint32 type, acpi_event_handler handler, void *data) -{ +{ return AcpiInstallGpeHandler(handle, gpeNumber, type, (ACPI_EVENT_HANDLER)handler, data) == AE_OK ? B_OK : B_ERROR; } @@ -290,11 +290,11 @@ remove_gpe_handler(acpi_handle handle, uint32 gpeNumber, == AE_OK ? B_OK : B_ERROR; } - + status_t install_address_space_handler(acpi_handle handle, uint32 spaceId, acpi_adr_space_handler handler, acpi_adr_space_setup setup, void *data) -{ +{ return AcpiInstallAddressSpaceHandler(handle, spaceId, (ACPI_ADR_SPACE_HANDLER)handler, (ACPI_ADR_SPACE_SETUP)setup, data) == AE_OK ? B_OK : B_ERROR; @@ -304,11 +304,11 @@ install_address_space_handler(acpi_handle handle, uint32 spaceId, status_t remove_address_space_handler(acpi_handle handle, uint32 spaceId, acpi_adr_space_handler handler) -{ +{ return AcpiRemoveAddressSpaceHandler(handle, spaceId, (ACPI_ADR_SPACE_HANDLER)handler) == AE_OK ? B_OK : B_ERROR; } - + void enable_fixed_event(uint32 event) @@ -425,7 +425,7 @@ get_device_hid(const char *path, char *hid, size_t bufferLength) if (bufferLength < ACPI_DEVICE_ID_LENGTH) return B_BUFFER_OVERFLOW; - + infoBuffer.Pointer = &info; infoBuffer.Length = sizeof(ACPI_OBJECT); info.String.Pointer = hid; @@ -510,6 +510,14 @@ get_object_typed(const char* path, acpi_object_type** _returnValue, } +status_t +ns_handle_to_pathname(acpi_handle targetHandle, acpi_data *buffer) +{ + status_t status = AcpiNsHandleToPathname(targetHandle, buffer); + return status == AE_OK ? B_OK : B_ERROR; +} + + status_t evaluate_object(const char* object, acpi_object_type* returnValue, size_t bufferLength) @@ -524,7 +532,7 @@ evaluate_object(const char* object, acpi_object_type* returnValue, returnValue != NULL ? &buffer : NULL); if (status == AE_BUFFER_OVERFLOW) dprintf("evaluate_object: the passed buffer is too small!\n"); - + return status == AE_OK ? B_OK : B_ERROR; } @@ -534,12 +542,12 @@ evaluate_method(acpi_handle handle, const char* method, acpi_objects *args, acpi_data *returnValue) { ACPI_STATUS status; - + status = AcpiEvaluateObject(handle, (ACPI_STRING)method, (ACPI_OBJECT_LIST*)args, (ACPI_BUFFER*)returnValue); if (status == AE_BUFFER_OVERFLOW) dprintf("evaluate_method: the passed buffer is too small!\n"); - + return status == AE_OK ? B_OK : B_ERROR; } @@ -605,14 +613,14 @@ reboot(void) return B_UNSUPPORTED; status = AcpiWrite(AcpiGbl_FADT.ResetValue, &AcpiGbl_FADT.ResetRegister); - + if (status != AE_OK) { ERROR("Reset failed, status = %d\n", status); return B_ERROR; } - + snooze(1000000); - ERROR("Reset failed, timeout\n"); + ERROR("Reset failed, timeout\n"); return B_ERROR; } @@ -647,6 +655,7 @@ struct acpi_module_info gACPIModule = { get_object_type, get_object, get_object_typed, + ns_handle_to_pathname, evaluate_object, evaluate_method, prepare_sleep_state, diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_module.c b/src/add-ons/kernel/bus_managers/acpi/acpi_module.c index 4190f6113d..77586bba2b 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_module.c +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_module.c @@ -91,14 +91,14 @@ acpi_enumerate_child_devices(device_node *node, const char *root) device_attr attrs[] = { // info about device { B_DEVICE_BUS, B_STRING_TYPE, { string: "acpi" }}, - + // location on ACPI bus { ACPI_DEVICE_PATH_ITEM, B_STRING_TYPE, { string: result }}, - + // info about the device { ACPI_DEVICE_HID_ITEM, B_STRING_TYPE, { string: hid }}, { ACPI_DEVICE_TYPE_ITEM, B_UINT32_TYPE, { ui32: type }}, - + // consumer specification /*{ B_DRIVER_MAPPING, B_STRING_TYPE, { string: "hid_%" ACPI_DEVICE_HID_ITEM "%" }}, @@ -107,14 +107,14 @@ acpi_enumerate_child_devices(device_node *node, const char *root) { B_DEVICE_FLAGS, B_UINT32_TYPE, { ui32: /*B_FIND_CHILD_ON_DEMAND|*/B_FIND_MULTIPLE_CHILDREN }}, { NULL } }; - + if (type == ACPI_TYPE_DEVICE) get_device_hid(result, hid, sizeof(hid)); - + if (gDeviceManager->register_node(node, ACPI_DEVICE_MODULE_NAME, attrs, NULL, &deviceNode) == B_OK) acpi_enumerate_child_devices(deviceNode, result); - + break; } default: @@ -216,6 +216,7 @@ static struct acpi_root_info sACPIRootModule = { get_object_type, get_object, get_object_typed, + ns_handle_to_pathname, evaluate_object, evaluate_method, }; diff --git a/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h b/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h index f9642f523a..c997341501 100644 --- a/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h +++ b/src/add-ons/kernel/bus_managers/acpi/acpi_priv.h @@ -29,7 +29,7 @@ extern device_manager_info *gDeviceManager; typedef struct acpi_device_cookie { char *path; // path acpi_handle handle; - uint32 type; // type + uint32 type; // type device_node *node; char name[32]; // name (for fast log) } acpi_device_cookie; @@ -38,10 +38,10 @@ typedef struct acpi_device_cookie { // ACPI root. typedef struct acpi_root_info { driver_module_info info; - + status_t (*get_handle)(acpi_handle parent, char *pathname, acpi_handle *retHandle); - + /* Global Lock */ status_t (*acquire_global_lock)(uint16 timeout, uint32 *handle); status_t (*release_global_lock)(uint32 handle); @@ -74,7 +74,7 @@ typedef struct acpi_root_info { status_t (*remove_address_space_handler)(acpi_handle handle, uint32 spaceId, acpi_adr_space_handler handler); - + /* Fixed Event Management */ void (*enable_fixed_event) (uint32 event); @@ -102,6 +102,8 @@ typedef struct acpi_root_info { acpi_object_type **_returnValue); status_t (*get_object_typed)(const char *path, acpi_object_type **_returnValue, uint32 objectType); + status_t (*ns_handle_to_pathname)(acpi_handle targetHandle, + acpi_data *buffer); /* Control method execution and data acquisition */ @@ -128,14 +130,14 @@ status_t install_notify_handler(acpi_handle device, uint32 handlerType, acpi_notify_handler handler, void *context); status_t remove_notify_handler(acpi_handle device, uint32 handlerType, acpi_notify_handler handler); - + status_t enable_gpe(acpi_handle handle, uint32 gpeNumber, uint32 flags); status_t set_gpe_type(acpi_handle handle, uint32 gpeNumber, uint8 type); status_t install_gpe_handler(acpi_handle handle, uint32 gpeNumber, uint32 type, acpi_event_handler handler, void *data); status_t remove_gpe_handler(acpi_handle handle, uint32 gpeNumber, acpi_event_handler address); - + status_t install_address_space_handler(acpi_handle handle, uint32 spaceId, acpi_adr_space_handler handler, acpi_adr_space_setup setup, void *data); status_t remove_address_space_handler(acpi_handle handle, uint32 spaceId, @@ -161,6 +163,7 @@ uint32 get_object_type(const char *path); status_t get_object(const char *path, acpi_object_type **return_value); status_t get_object_typed(const char *path, acpi_object_type **return_value, uint32 object_type); +status_t ns_handle_to_pathname(acpi_handle targetHandle, acpi_data *buffer); status_t evaluate_object(const char* object, acpi_object_type *returnValue, size_t bufferLength);