diff options
Diffstat (limited to 'src/drivers')
-rw-r--r-- | src/drivers/elog/elog.c | 29 | ||||
-rw-r--r-- | src/drivers/elog/elog_internal.h | 15 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c index 8e56b85242..9c0fa930ad 100644 --- a/src/drivers/elog/elog.c +++ b/src/drivers/elog/elog.c @@ -20,6 +20,7 @@ #include <arch/acpi.h> #include <console/console.h> #include <pc80/mc146818rtc.h> +#include <smbios.h> #include <spi.h> #include <spi_flash.h> #include <stdint.h> @@ -677,6 +678,34 @@ static int elog_spi_init(void) } /* + * Fill out SMBIOS Type 15 table entry so the + * event log can be discovered at runtime. + */ +int elog_smbios_write_type15(unsigned long *current, int handle) +{ + struct smbios_type15 *t = (struct smbios_type15 *)*current; + int len = sizeof(struct smbios_type15); + + memset(t, 0, len); + t->type = SMBIOS_EVENT_LOG; + t->length = len - 2; + t->handle = handle; + t->area_length = elog_get_flash()->total_size - 1; + t->header_offset = 0; + t->data_offset = sizeof(struct elog_header); + t->access_method = SMBIOS_EVENTLOG_ACCESS_METHOD_MMIO32; + t->log_status = SMBIOS_EVENTLOG_STATUS_VALID; + t->change_token = 0; + t->address = (u32)elog_get_flash()->backing_store; + t->header_format = ELOG_HEADER_TYPE_OEM; + t->log_type_descriptors = 0; + t->log_type_descriptor_length = 2; + + *current += len; + return len; +} + +/* * Clear the entire event log */ int elog_clear(void) diff --git a/src/drivers/elog/elog_internal.h b/src/drivers/elog/elog_internal.h index 2a6a0b7fc4..6d9a0d4bb5 100644 --- a/src/drivers/elog/elog_internal.h +++ b/src/drivers/elog/elog_internal.h @@ -32,6 +32,21 @@ struct elog_header { #define ELOG_SIGNATURE 0x474f4c45 /* 'ELOG' */ #define ELOG_VERSION 1 +/* SMBIOS event log header */ +struct event_header { + u8 type; + u8 length; + u8 year; + u8 month; + u8 day; + u8 hour; + u8 minute; + u8 second; +} __attribute__ ((packed)); + +/* SMBIOS Type 15 related constants */ +#define ELOG_HEADER_TYPE_OEM 0x88 + typedef enum elog_descriptor_type { ELOG_DESCRIPTOR_UNKNOWN, ELOG_DESCRIPTOR_MEMORY, |