drivers/elog: provide return status for all operations

Instead of relying on global state to determine if an error
occurred provide the ability to know if an add or shrink
operation is successful. Now the call chains report the
error back up the stack and out to the callers.

BUG=chrome-os-partner:55932

Change-Id: Id4ed4d93e331f1bf16e038df69ef067446d00102
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/16104
Tested-by: build bot (Jenkins)
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Aaron Durbin 2016-08-06 10:02:37 -05:00 committed by Martin Roth
parent 18fedb360f
commit eec1c28bd4
2 changed files with 36 additions and 38 deletions

View File

@ -503,7 +503,7 @@ static size_t elog_do_shrink(size_t requested_size, size_t last_write)
* Shrink the log, deleting old entries and moving the
* remaining ones to the front of the log.
*/
static void elog_shrink_by_size(size_t requested_size)
static int elog_shrink_by_size(size_t requested_size)
{
size_t shrunk_size;
size_t captured_last_write;
@ -528,24 +528,20 @@ static void elog_shrink_by_size(size_t requested_size)
captured_last_write);
/* Add clear event */
elog_add_event_word(ELOG_TYPE_LOG_CLEAR, shrunk_size);
return elog_add_event_word(ELOG_TYPE_LOG_CLEAR, shrunk_size);
}
static int elog_prepare_empty(void)
{
elog_debug("elog_prepare_empty()\n");
elog_shrink_by_size(elog_events_total_space());
if (elog_initialized != ELOG_INITIALIZED)
return -1;
return 0;
return elog_shrink_by_size(elog_events_total_space());
}
static void elog_shrink(void)
static int elog_shrink(void)
{
if (elog_should_shrink())
elog_shrink_by_size(shrink_size);
return elog_shrink_by_size(shrink_size);
return 0;
}
/*
@ -808,7 +804,7 @@ static void elog_fill_timestamp(struct event_header *event)
/*
* Add an event to the log
*/
void elog_add_event_raw(u8 event_type, void *data, u8 data_size)
int elog_add_event_raw(u8 event_type, void *data, u8 data_size)
{
struct event_header *event;
u8 event_size;
@ -817,14 +813,14 @@ void elog_add_event_raw(u8 event_type, void *data, u8 data_size)
/* Make sure ELOG structures are initialized */
if (elog_init() < 0)
return;
return -1;
/* Header + Data + Checksum */
event_size = sizeof(*event) + data_size + 1;
if (event_size > MAX_EVENT_SIZE) {
printk(BIOS_ERR, "ELOG: Event(%X) data size too "
"big (%d)\n", event_type, event_size);
return;
return -1;
}
/* Make sure event data can fit */
@ -832,7 +828,7 @@ void elog_add_event_raw(u8 event_type, void *data, u8 data_size)
if (event == NULL) {
printk(BIOS_ERR, "ELOG: Event(%X) does not fit\n",
event_type);
return;
return -1;
}
/* Fill out event data */
@ -854,37 +850,38 @@ void elog_add_event_raw(u8 event_type, void *data, u8 data_size)
event_type, event_size);
/* Shrink the log if we are getting too full */
elog_shrink();
if (elog_shrink() < 0)
return -1;
/* Ensure the updates hit the non-volatile storage. */
elog_sync_to_nv();
return elog_sync_to_nv();
}
void elog_add_event(u8 event_type)
int elog_add_event(u8 event_type)
{
elog_add_event_raw(event_type, NULL, 0);
return elog_add_event_raw(event_type, NULL, 0);
}
void elog_add_event_byte(u8 event_type, u8 data)
int elog_add_event_byte(u8 event_type, u8 data)
{
elog_add_event_raw(event_type, &data, sizeof(data));
return elog_add_event_raw(event_type, &data, sizeof(data));
}
void elog_add_event_word(u8 event_type, u16 data)
int elog_add_event_word(u8 event_type, u16 data)
{
elog_add_event_raw(event_type, &data, sizeof(data));
return elog_add_event_raw(event_type, &data, sizeof(data));
}
void elog_add_event_dword(u8 event_type, u32 data)
int elog_add_event_dword(u8 event_type, u32 data)
{
elog_add_event_raw(event_type, &data, sizeof(data));
return elog_add_event_raw(event_type, &data, sizeof(data));
}
void elog_add_event_wake(u8 source, u32 instance)
int elog_add_event_wake(u8 source, u32 instance)
{
struct elog_event_data_wake wake = {
.source = source,
.instance = instance
};
elog_add_event_raw(ELOG_TYPE_WAKE_SOURCE, &wake, sizeof(wake));
return elog_add_event_raw(ELOG_TYPE_WAKE_SOURCE, &wake, sizeof(wake));
}

View File

@ -146,23 +146,24 @@ struct elog_event_data_me_extended {
/* Eventlog backing storage must be initialized before calling elog_init(). */
extern int elog_init(void);
extern int elog_clear(void);
extern void elog_add_event_raw(u8 event_type, void *data, u8 data_size);
extern void elog_add_event(u8 event_type);
extern void elog_add_event_byte(u8 event_type, u8 data);
extern void elog_add_event_word(u8 event_type, u16 data);
extern void elog_add_event_dword(u8 event_type, u32 data);
extern void elog_add_event_wake(u8 source, u32 instance);
/* Event addition functions return < 0 on failure and 0 on success. */
extern int elog_add_event_raw(u8 event_type, void *data, u8 data_size);
extern int elog_add_event(u8 event_type);
extern int elog_add_event_byte(u8 event_type, u8 data);
extern int elog_add_event_word(u8 event_type, u16 data);
extern int elog_add_event_dword(u8 event_type, u32 data);
extern int elog_add_event_wake(u8 source, u32 instance);
extern int elog_smbios_write_type15(unsigned long *current, int handle);
#else
/* Stubs to help avoid littering sources with #if CONFIG_ELOG */
static inline int elog_init(void) { return -1; }
static inline int elog_clear(void) { return -1; }
static inline void elog_add_event_raw(void) { return; }
static inline void elog_add_event(u8 event_type) { return; }
static inline void elog_add_event_byte(u8 event_type, u8 data) { return; }
static inline void elog_add_event_word(u8 event_type, u16 data) { return; }
static inline void elog_add_event_dword(u8 event_type, u32 data) { return; }
static inline void elog_add_event_wake(u8 source, u32 instance) { return; }
static inline int elog_add_event_raw(void) { return 0; }
static inline int elog_add_event(u8 event_type) { return 0; }
static inline int elog_add_event_byte(u8 event_type, u8 data) { return 0; }
static inline int elog_add_event_word(u8 event_type, u16 data) { return 0; }
static inline int elog_add_event_dword(u8 event_type, u32 data) { return 0; }
static inline int elog_add_event_wake(u8 source, u32 instance) { return 0; }
static inline int elog_smbios_write_type15(unsigned long *current,
int handle) {
return 0;