summaryrefslogtreecommitdiff
path: root/src/arch/x86
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/x86')
-rw-r--r--src/arch/x86/acpi_device.c22
-rw-r--r--src/arch/x86/include/arch/acpi_device.h2
2 files changed, 24 insertions, 0 deletions
diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c
index 5c77953bc2..1d79170487 100644
--- a/src/arch/x86/acpi_device.c
+++ b/src/arch/x86/acpi_device.c
@@ -18,6 +18,8 @@
#include <device/device.h>
#include <device/path.h>
#include <stdlib.h>
+#include <crc_byte.h>
+
#if CONFIG(GENERIC_GPIO_LIB)
#include <gpio.h>
#endif
@@ -98,6 +100,19 @@ const char *acpi_device_hid(const struct device *dev)
return NULL;
}
+/*
+ * Generate unique ID based on the ACPI path.
+ * Collisions on the same _HID are possible but very unlikely.
+ */
+uint32_t acpi_device_uid(struct device *dev)
+{
+ const char *path = acpi_device_path(dev);
+ if (!path)
+ return 0;
+
+ return CRC(path, strlen(path), crc32_byte);
+}
+
/* Recursive function to find the root device and print a path from there */
static ssize_t acpi_device_path_fill(const struct device *dev, char *buf,
size_t buf_len, size_t cur)
@@ -192,6 +207,13 @@ int acpi_device_status(const struct device *dev)
return ACPI_STATUS_DEVICE_ALL_ON;
}
+
+/* Write the unique _UID based on ACPI device path. */
+void acpi_device_write_uid(struct device *dev)
+{
+ acpigen_write_name_integer("_UID", acpi_device_uid(dev));
+}
+
/* ACPI 6.1 section 6.4.3.6: Extended Interrupt Descriptor */
void acpi_device_write_interrupt(const struct acpi_irq *irq)
{
diff --git a/src/arch/x86/include/arch/acpi_device.h b/src/arch/x86/include/arch/acpi_device.h
index 382ef1546b..0a702c9329 100644
--- a/src/arch/x86/include/arch/acpi_device.h
+++ b/src/arch/x86/include/arch/acpi_device.h
@@ -62,10 +62,12 @@ struct acpi_dp {
struct device;
const char *acpi_device_name(const struct device *dev);
const char *acpi_device_hid(const struct device *dev);
+uint32_t acpi_device_uid(struct device *dev);
const char *acpi_device_path(const struct device *dev);
const char *acpi_device_scope(const struct device *dev);
const char *acpi_device_path_join(const struct device *dev, const char *name);
int acpi_device_status(const struct device *dev);
+void acpi_device_write_uid(struct device *dev);
/*
* ACPI Descriptor for extended Interrupt()