From 472ec9cd7ecb3d283bc05941c7dbb54a10813614 Mon Sep 17 00:00:00 2001 From: Duncan Laurie Date: Sat, 23 Jun 2012 16:13:42 -0700 Subject: ELOG: Add support for generating SMBIOS type15 table This standared SMBIOS 0able describes the location and format of the event log to the OS and applications. In this case the pointer is a 32bit physical address pointer to the log in memory mapped flash. Look for SMBIOS type15 entry with 'dmidecode -t 15' Handle 0x0004, DMI type 15, 23 bytes System Event Log Area Length: 4095 bytes Header Start Offset: 0x0000 Header Length: 8 bytes Data Start Offset: 0x0008 Access Method: Memory-mapped physical 32-bit address Access Address: 0xFFB6F000 Status: Valid, Not Full Change Token: 0x00000000 Header Format: OEM-specific Supported Log Type Descriptors: 0 Change-Id: I1e7729e604000f197e26e69991a2867e869197a6 Signed-off-by: Duncan Laurie Reviewed-on: http://review.coreboot.org/1314 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich --- src/drivers/elog/elog.c | 29 +++++++++++++++++++++++++++++ src/drivers/elog/elog_internal.h | 15 +++++++++++++++ 2 files changed, 44 insertions(+) (limited to 'src/drivers') 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 #include #include +#include #include #include #include @@ -676,6 +677,34 @@ static int elog_spi_init(void) return elog_spi ? 0 : -1; } +/* + * 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 */ 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, -- cgit v1.2.3