From de60e5b84f4f6a960d713a416fa07d0431804c5e Mon Sep 17 00:00:00 2001 From: Furquan Shaikh Date: Fri, 30 Nov 2018 18:32:46 -0800 Subject: soc/intel/apollolake: Add support to print ME version This change adds support to print ME version if UART_DEBUG is enabled. Check for UART_DEBUG is necessary because talking to ME to get the firmware version adds ~0.6 seconds to boot time. TEST=Verified on octopus that ME version printed is correct. Change-Id: I41217371558da1af694a2705e005429155d62838 Signed-off-by: Furquan Shaikh Reviewed-on: https://review.coreboot.org/c/29989 Reviewed-by: Justin TerAvest Tested-by: build bot (Jenkins) --- src/soc/intel/apollolake/cse.c | 84 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 11 deletions(-) diff --git a/src/soc/intel/apollolake/cse.c b/src/soc/intel/apollolake/cse.c index cfb3b8a841..26249bc9aa 100644 --- a/src/soc/intel/apollolake/cse.c +++ b/src/soc/intel/apollolake/cse.c @@ -42,6 +42,9 @@ #define READ_FILE_FLAG_EMULATED (1 << 2) #define READ_FILE_FLAG_HW (1 << 3) +#define MKHI_GROUP_ID_GEN 0xff +#define GET_FW_VERSION 0x02 + #define MCA_MAX_FILE_PATH_SIZE 64 #define FUSE_LOCK_FILE "/fpf/intel/SocCfgLock" @@ -55,6 +58,17 @@ static enum fuse_flash_state { #define FPF_STATUS_FMAP "FPF_STATUS" +union mkhi_header { + uint32_t data; + struct { + uint32_t group_id: 8; + uint32_t command: 7; + uint32_t is_response: 1; + uint32_t reserved: 8; + uint32_t result: 8; + } __packed fields; +}; + /* * Read file from CSE internal filesystem. * size is maximum length of provided buffer buff, which is updated with actual @@ -67,17 +81,6 @@ static int read_cse_file(const char *path, void *buff, size_t *size, int res; size_t reply_size; - union mkhi_header { - uint32_t data; - struct { - uint32_t group_id: 8; - uint32_t command: 7; - uint32_t is_response: 1; - uint32_t reserved: 8; - uint32_t result: 8; - } __packed fields; - }; - struct mca_command { union mkhi_header mkhi_hdr; char file_name[MCA_MAX_FILE_PATH_SIZE]; @@ -192,6 +195,63 @@ static uint32_t dump_status(int index, int reg_addr) return reg; } +static void dump_cse_version(void) +{ + int res; + size_t reply_size; + + struct fw_version_cmd { + union mkhi_header mkhi_hdr; + } __packed msg; + + struct version { + uint16_t minor; + uint16_t major; + uint16_t build; + uint16_t hotfix; + } __packed; + + struct fw_version_response { + union mkhi_header mkhi_hdr; + struct version code; + struct version nftp; + struct version fitc; + } __packed rsp; + + /* + * Print ME version only if UART debugging is enabled. Else, it takes + * ~0.6 second to talk to ME and get this information. + */ + if (!IS_ENABLED(CONFIG_UART_DEBUG)) + return; + + msg.mkhi_hdr.fields.group_id = MKHI_GROUP_ID_GEN; + msg.mkhi_hdr.fields.command = GET_FW_VERSION; + + res = heci_send(&msg, sizeof(msg), BIOS_HOST_ADDR, HECI_MKHI_ADDR); + + if (!res) { + printk(BIOS_ERR, "Failed to send HECI message.\n"); + return; + } + + reply_size = sizeof(rsp); + res = heci_receive(&rsp, &reply_size); + + if (!res) { + printk(BIOS_ERR, "Failed to receive HECI reply.\n"); + return; + } + + if (rsp.mkhi_hdr.fields.result != 0) { + printk(BIOS_ERR, "Failed to get ME version.\n"); + return; + } + + printk(BIOS_DEBUG, "ME: Version: %d.%d.%d.%d\n", rsp.code.major, + rsp.code.minor, rsp.code.hotfix, rsp.code.build); +} + static void dump_cse_state(void) { uint32_t fwsts1; @@ -222,6 +282,8 @@ static void dump_cse_state(void) printk(BIOS_DEBUG, "unknown"); } printk(BIOS_DEBUG, "\n"); + + dump_cse_version(); } #define PCR_PSFX_T0_SHDW_PCIEN 0x1C -- cgit v1.2.3