acpi_thermal: implement B_GET_DEVICE_NAME
Get the name from the _STR method of the ACPI object. Convert from UTF16 as needed. In cases where the ACPI implementation provides multiple zones, this allows to differenciate them. Change-Id: If349207dcfd22cc9c3baf50b8f8d63d56dc62f21 Reviewed-on: https://review.haiku-os.org/c/haiku/+/9739 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
f80d1b0293
commit
b543cfa664
@@ -1,5 +1,7 @@
|
|||||||
SubDir HAIKU_TOP src add-ons kernel drivers power acpi_thermal ;
|
SubDir HAIKU_TOP src add-ons kernel drivers power acpi_thermal ;
|
||||||
|
|
||||||
|
UsePrivateKernelHeaders ;
|
||||||
|
|
||||||
KernelAddon acpi_thermal :
|
KernelAddon acpi_thermal :
|
||||||
acpi_thermal.c
|
acpi_thermal.c
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <ACPI.h>
|
#include <ACPI.h>
|
||||||
|
|
||||||
|
#include <util/convertutf.h>
|
||||||
|
|
||||||
#include "acpi_thermal.h"
|
#include "acpi_thermal.h"
|
||||||
|
|
||||||
#define ACPI_THERMAL_MODULE_NAME "drivers/power/acpi_thermal/driver_v1"
|
#define ACPI_THERMAL_MODULE_NAME "drivers/power/acpi_thermal/driver_v1"
|
||||||
@@ -156,18 +159,53 @@ status_t
|
|||||||
acpi_thermal_control(void* _cookie, uint32 op, void* arg, size_t len)
|
acpi_thermal_control(void* _cookie, uint32 op, void* arg, size_t len)
|
||||||
{
|
{
|
||||||
acpi_thermal_device_info* device = (acpi_thermal_device_info*)_cookie;
|
acpi_thermal_device_info* device = (acpi_thermal_device_info*)_cookie;
|
||||||
status_t err = B_ERROR;
|
status_t err = B_DEV_INVALID_IOCTL;
|
||||||
|
|
||||||
acpi_thermal_type* att = NULL;
|
switch (op) {
|
||||||
|
case B_GET_DEVICE_NAME: {
|
||||||
|
acpi_data buffer;
|
||||||
|
|
||||||
|
buffer.pointer = NULL;
|
||||||
|
buffer.length = ACPI_ALLOCATE_BUFFER;
|
||||||
|
|
||||||
|
err = device->acpi->evaluate_method (device->acpi_cookie, "_STR",
|
||||||
|
NULL, &buffer);
|
||||||
|
|
||||||
|
if (err != B_OK) {
|
||||||
|
dprintf("acpi_thermal: could not get zone name: %s\n", strerror(err));
|
||||||
|
free(buffer.pointer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
acpi_object_type* object = (acpi_object_type*)buffer.pointer;
|
||||||
|
if (object->object_type == ACPI_TYPE_STRING) {
|
||||||
|
err = user_strlcpy((char*)arg, object->string.string, min(object->string.len, len));
|
||||||
|
free(buffer.pointer);
|
||||||
|
} else if (object->object_type == ACPI_TYPE_BUFFER) {
|
||||||
|
char utf8[256];
|
||||||
|
ssize_t bytes = utf16le_to_utf8(object->buffer.buffer, object->buffer.length / 2,
|
||||||
|
utf8, sizeof(utf8));
|
||||||
|
free(buffer.pointer);
|
||||||
|
if (bytes < 0) {
|
||||||
|
err = bytes;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = user_strlcpy((char*)arg, utf8, min((size_t)bytes, len));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err > 0)
|
||||||
|
err = B_OK;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case drvOpGetThermalType: {
|
||||||
acpi_object_type object;
|
acpi_object_type object;
|
||||||
|
acpi_thermal_type* att = NULL;
|
||||||
|
|
||||||
acpi_data buffer;
|
acpi_data buffer;
|
||||||
buffer.pointer = &object;
|
buffer.pointer = &object;
|
||||||
buffer.length = sizeof(object);
|
buffer.length = sizeof(object);
|
||||||
|
|
||||||
switch (op) {
|
|
||||||
case drvOpGetThermalType: {
|
|
||||||
att = (acpi_thermal_type*)arg;
|
att = (acpi_thermal_type*)arg;
|
||||||
|
|
||||||
// Read basic temperature thresholds.
|
// Read basic temperature thresholds.
|
||||||
|
|||||||
Reference in New Issue
Block a user