diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/acpi_device.c | 22 | ||||
-rw-r--r-- | src/arch/x86/include/arch/acpi_device.h | 2 |
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() |