ec/lenovo/h8: Add h8_build_id_and_function_spec_version()
The function reads the Build ID and the supported function specification version from the running EC firmware, and stores a text representation in the provided output buffer. Change-Id: I3b647d7f315c9b4922fa9a9c5167a80f6d82e753 Signed-off-by: Peter Stuge <peter@stuge.se> Reviewed-on: http://review.coreboot.org/3617 Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Tested-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
3d06488dbf
commit
77a5abe780
|
@ -26,6 +26,7 @@
|
||||||
#include "h8.h"
|
#include "h8.h"
|
||||||
#include "chip.h"
|
#include "chip.h"
|
||||||
#include <pc80/mc146818rtc.h>
|
#include <pc80/mc146818rtc.h>
|
||||||
|
#include <string.h>
|
||||||
#include <kconfig.h>
|
#include <kconfig.h>
|
||||||
|
|
||||||
#if IS_ENABLED (CONFIG_BOARD_LENOVO_X201)
|
#if IS_ENABLED (CONFIG_BOARD_LENOVO_X201)
|
||||||
|
@ -57,17 +58,12 @@ void h8_wlan_enable(int on)
|
||||||
|
|
||||||
static void h8_log_ec_version(void)
|
static void h8_log_ec_version(void)
|
||||||
{
|
{
|
||||||
unsigned char ecfw[9], c;
|
char ecfw[17];
|
||||||
|
u8 len;
|
||||||
u16 fwvh, fwvl;
|
u16 fwvh, fwvl;
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i = 0; i < 8; i++) {
|
len = h8_build_id_and_function_spec_version(ecfw, sizeof ecfw - 1);
|
||||||
c = ec_read(0xf0 + i);
|
ecfw[len] = 0;
|
||||||
if (c < 0x20 || c > 0x7f)
|
|
||||||
break;
|
|
||||||
ecfw[i] = c;
|
|
||||||
}
|
|
||||||
ecfw[i] = '\0';
|
|
||||||
|
|
||||||
fwvh = ec_read(0xe9);
|
fwvh = ec_read(0xe9);
|
||||||
fwvl = ec_read(0xe8);
|
fwvl = ec_read(0xe8);
|
||||||
|
@ -114,6 +110,30 @@ int h8_ultrabay_device_present(void)
|
||||||
return ec_read(H8_STATUS1) & 0x5 ? 0 : 1;
|
return ec_read(H8_STATUS1) & 0x5 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u8 h8_build_id_and_function_spec_version(char *buf, u8 buf_len)
|
||||||
|
{
|
||||||
|
u8 i, c;
|
||||||
|
char str[16 + 1]; /* 16 ASCII chars + \0 */
|
||||||
|
|
||||||
|
/* Build ID */
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
c = ec_read(0xf0 + i);
|
||||||
|
if (c < 0x20 || c > 0x7f) {
|
||||||
|
i = sprintf(str, "*INVALID");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
str[i] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EC firmware function specification version */
|
||||||
|
i += sprintf(str + i, "-%u.%u", ec_read(0xef), ec_read(0xeb));
|
||||||
|
|
||||||
|
i = MIN(buf_len, i);
|
||||||
|
memcpy(buf, str, i);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
static void h8_enable(device_t dev)
|
static void h8_enable(device_t dev)
|
||||||
{
|
{
|
||||||
struct ec_lenovo_h8_config *conf = dev->chip_info;
|
struct ec_lenovo_h8_config *conf = dev->chip_info;
|
||||||
|
|
|
@ -27,6 +27,7 @@ void h8_usb_power_enable(int on);
|
||||||
void h8_enable_event(int event);
|
void h8_enable_event(int event);
|
||||||
void h8_disable_event(int event);
|
void h8_disable_event(int event);
|
||||||
int h8_ultrabay_device_present(void);
|
int h8_ultrabay_device_present(void);
|
||||||
|
u8 h8_build_id_and_function_spec_version(char *buf, u8 buf_len);
|
||||||
|
|
||||||
/* EC registers */
|
/* EC registers */
|
||||||
#define H8_CONFIG0 0x00
|
#define H8_CONFIG0 0x00
|
||||||
|
|
Loading…
Reference in New Issue