From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2484 ;)
Change subject: acpi: add ACPI_DEVICE_UID_ITEM
......................................................................
acpi: add ACPI_DEVICE_UID_ITEM
---
M headers/os/drivers/ACPI.h
M src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h
M src/add-ons/kernel/bus_managers/acpi/BusManager.cpp
M src/add-ons/kernel/bus_managers/acpi/Module.cpp
M src/add-ons/kernel/bus_managers/acpi/NamespaceDump.cpp
5 files changed, 22 insertions(+), 10 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/84/2484/1
diff --git a/headers/os/drivers/ACPI.h b/headers/os/drivers/ACPI.h
index 479f271..d291a0e 100644
--- a/headers/os/drivers/ACPI.h
+++ b/headers/os/drivers/ACPI.h
@@ -139,8 +139,8 @@
enum {
- ACPI_ALLOCATE_BUFFER = -1,
- ACPI_ALLOCATE_LOCAL_BUFFER = -2,
+ ACPI_ALLOCATE_BUFFER = (acpi_size)-1,
+ ACPI_ALLOCATE_LOCAL_BUFFER = (acpi_size)-2,
};
@@ -253,7 +253,7 @@
size_t resultLength);
status_t (*get_device_info)(const char *path, char** hid,
- char** cidList, size_t cidListLength);
+ char** cidList, size_t cidListLength,
char** uid);
uint32 (*get_object_type)(const char *path);
status_t (*get_object)(const char *path,
acpi_object_type **_returnValue);
@@ -318,6 +318,7 @@
#define ACPI_DEVICE_HID_ITEM "acpi/hid"
#define ACPI_DEVICE_PATH_ITEM "acpi/path"
#define ACPI_DEVICE_TYPE_ITEM "acpi/type"
+#define ACPI_DEVICE_UID_ITEM "acpi/uid"
typedef struct acpi_device_cookie *acpi_device;
diff --git a/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h
b/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h
index 6f834f3..1071c71 100644
--- a/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h
+++ b/src/add-ons/kernel/bus_managers/acpi/ACPIPrivate.h
@@ -113,7 +113,7 @@
size_t resultLength);
status_t (*get_device_info)(const char *path, char **hid,
- char** cidList, size_t cidListCount);
+ char** cidList, size_t cidListCount,
char** uid);
uint32 (*get_object_type)(const char *path);
status_t (*get_object)(const char *path,
acpi_object_type **_returnValue);
@@ -214,7 +214,7 @@
size_t resultLength);
status_t get_device_info(const char* path, char** hid, char** cidList,
- size_t cidListCount);
+ size_t cidListCount, char** uniqueId);
status_t get_device_addr(const char* path, uint32* addr);
uint32 get_object_type(const char* path);
status_t get_object(const char* path, acpi_object_type** _returnValue);
diff --git a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp
b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp
index ebd92bf..a0ed3af 100644
--- a/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp
+++ b/src/add-ons/kernel/bus_managers/acpi/BusManager.cpp
@@ -534,7 +534,7 @@
status_t
get_device_info(const char *path, char** hid, char** cidList,
- size_t cidListCount)
+ size_t cidListCount, char** uid)
{
ACPI_HANDLE handle;
ACPI_DEVICE_INFO *info;
@@ -558,6 +558,9 @@
}
}
+ if ((info->Valid & ACPI_VALID_UID) != 0 && uid != NULL)
+ *uid = strndup(info->UniqueId.String, info->UniqueId.Length);
+
AcpiOsFree(info);
return B_OK;
}
diff --git a/src/add-ons/kernel/bus_managers/acpi/Module.cpp
b/src/add-ons/kernel/bus_managers/acpi/Module.cpp
index 7227c7d..97471b7 100644
--- a/src/add-ons/kernel/bus_managers/acpi/Module.cpp
+++ b/src/add-ons/kernel/bus_managers/acpi/Module.cpp
@@ -86,7 +86,7 @@
case ACPI_TYPE_PROCESSOR:
case ACPI_TYPE_THERMAL:
case ACPI_TYPE_DEVICE: {
- device_attr attrs[15] = {
+ device_attr attrs[16] = {
// info about device
{ B_DEVICE_BUS, B_STRING_TYPE, {
string: "acpi" }},
@@ -103,9 +103,10 @@
uint32 attrCount = 4;
char* hid = NULL;
char* cidList[8] = { NULL };
+ char* uid = NULL;
if (type == ACPI_TYPE_DEVICE) {
- if (get_device_info(result, &hid,
(char**)&cidList, 8)
- == B_OK) {
+ if (get_device_info(result, &hid,
(char**)&cidList, 8,
+ &uid) == B_OK) {
if (hid != NULL) {
attrs[attrCount].name =
ACPI_DEVICE_HID_ITEM;
attrs[attrCount].type =
B_STRING_TYPE;
@@ -118,6 +119,12 @@
attrs[attrCount].value.string = cidList[i];
attrCount++;
}
+ if (uid != NULL) {
+ attrs[attrCount].name =
ACPI_DEVICE_UID_ITEM;
+ attrs[attrCount].type =
B_STRING_TYPE;
+
attrs[attrCount].value.string = uid;
+ attrCount++;
+ }
}
uint32 addr;
if (get_device_addr(result, &addr) ==
B_OK) {
@@ -131,6 +138,7 @@
status_t status =
gDeviceManager->register_node(node,
ACPI_DEVICE_MODULE_NAME, attrs,
NULL, &deviceNode);
free(hid);
+ free(uid);
for (int i = 0; cidList[i] != NULL; i++)
free(cidList[i]);
if (status != B_OK)
diff --git a/src/add-ons/kernel/bus_managers/acpi/NamespaceDump.cpp
b/src/add-ons/kernel/bus_managers/acpi/NamespaceDump.cpp
index 5c489aa..a77bf84 100644
--- a/src/add-ons/kernel/bus_managers/acpi/NamespaceDump.cpp
+++ b/src/add-ons/kernel/bus_managers/acpi/NamespaceDump.cpp
@@ -115,7 +115,7 @@
case ACPI_TYPE_DEVICE:
{
char* hid = NULL;
- device->acpi->get_device_info(result, &hid,
NULL, 0);
+ device->acpi->get_device_info(result, &hid,
NULL, 0, NULL);
strlcat(output, " DEVICE (",
sizeof(output));
if (hid != NULL) {
strlcat(output, hid, sizeof(output));
--
To view, visit https://review.haiku-os.org/c/haiku/+/2484
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I6f1dba7d9d757859375e2339141ba92559d5cf9b
Gerrit-Change-Number: 2484
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange