From e30a0e63b5285bb84ce7cdce5d0c9aabba32c536 Mon Sep 17 00:00:00 2001 From: Sridhar Siricilla Date: Sat, 31 Aug 2019 16:12:21 +0530 Subject: src/soc/intel/common/block/cse: Add hmrfpo related functions to cse lib Below new functions are added: * send_hmrfpo_enable_msg() - Sends HMRFPO Enable command to CSE. This API sets ME in SEC_OVERRIDE mode. The mode prevents CSE to execute SPI I/O cycles to CSE region, and unlocks the CSE region to perfom updates to it. * send_hmrfpo_get_status_msg() - Sends HMRFPO Get Status command to CSE TEST=Verified sending HMRFPO_ENABLE & HMRFPO_GET_STATUS HECI commands on CML RVP & hatch board Change-Id: I559bc4641e12df7ed39b1c97097bf068f9a232db Signed-off-by: Rizwan Qureshi Signed-off-by: Sridhar Siricilla Reviewed-on: https://review.coreboot.org/c/coreboot/+/35229 Tested-by: build bot (Jenkins) Reviewed-by: V Sowmya --- src/soc/intel/common/block/cse/cse.c | 110 +++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) (limited to 'src/soc/intel/common/block/cse/cse.c') diff --git a/src/soc/intel/common/block/cse/cse.c b/src/soc/intel/common/block/cse/cse.c index 01b20501a7..debbf1fbf4 100644 --- a/src/soc/intel/common/block/cse/cse.c +++ b/src/soc/intel/common/block/cse/cse.c @@ -76,6 +76,16 @@ /* RST Origin */ #define GR_ORIGIN_BIOS_POST 2 +#define MKHI_HMRFPO_GROUP_ID 5 + +/* HMRFPO Command Ids */ +#define MKHI_HMRFPO_ENABLE 1 +#define MKHI_HMRFPO_GET_STATUS 3 + +#define ME_HFS_CWS_NORMAL 5 +#define ME_HFS_MODE_NORMAL 0 +#define ME_HFS_TEMP_DISABLE 3 + static struct cse_device { uintptr_t sec_bar; } g_cse; @@ -619,6 +629,106 @@ int send_heci_reset_req_message(uint8_t rst_type) return 0; } +/* Sends HMRFPO Enable command to CSE */ +int send_hmrfpo_enable_msg(void) +{ + struct hmrfpo_enable_msg { + struct mkhi_hdr hdr; + uint32_t nonce[2]; + } __packed; + + /* HMRFPO Enable message */ + struct hmrfpo_enable_msg msg = { + .hdr = { + .group_id = MKHI_HMRFPO_GROUP_ID, + .command = MKHI_HMRFPO_ENABLE, + }, + .nonce = {0}, + }; + + /* HMRFPO Enable response */ + struct hmrfpo_enable_resp { + struct mkhi_hdr hdr; + uint32_t fct_base; + uint32_t fct_limit; + uint8_t status; + uint8_t padding[3]; + } __packed; + + struct hmrfpo_enable_resp resp; + size_t resp_size = sizeof(struct hmrfpo_enable_resp); + union me_hfsts1 hfs1; + + printk(BIOS_DEBUG, "HECI: Send HMRFPO Enable Command\n"); + hfs1.data = me_read_config32(PCI_ME_HFSTS1); + /* + * This command can be run only if: + * - Working state is normal and + * - Operation mode is normal or temporary disable mode. + */ + if (hfs1.fields.working_state != ME_HFS_CWS_NORMAL || + (hfs1.fields.operation_mode != ME_HFS_MODE_NORMAL && + hfs1.fields.operation_mode != ME_HFS_TEMP_DISABLE)) { + printk(BIOS_ERR, "HECI: ME not in required Mode\n"); + goto failed; + } + + if (!heci_send_receive(&msg, sizeof(struct hmrfpo_enable_msg), + &resp, &resp_size)) + goto failed; + + if (resp.hdr.result) { + printk(BIOS_ERR, "HECI: Resp Failed:%d\n", resp.hdr.result); + goto failed; + } + return 1; + +failed: + return 0; +} + +/* + * Sends HMRFPO Get Status command to CSE to get the HMRFPO status. + * The status can be DISABLES/LOCKED/ENABLED + */ +int send_hmrfpo_get_status_msg(void) +{ + struct hmrfpo_get_status_msg { + struct mkhi_hdr hdr; + } __packed; + + struct hmrfpo_get_status_resp { + struct mkhi_hdr hdr; + uint8_t status; + uint8_t padding[3]; + } __packed; + + struct hmrfpo_get_status_msg msg = { + .hdr = { + .group_id = MKHI_HMRFPO_GROUP_ID, + .command = MKHI_HMRFPO_GET_STATUS, + }, + }; + struct hmrfpo_get_status_resp resp; + size_t resp_size = sizeof(struct hmrfpo_get_status_resp); + + printk(BIOS_INFO, "HECI: Sending Get HMRFPO Status Command\n"); + + if (!heci_send_receive(&msg, sizeof(struct hmrfpo_get_status_msg), + &resp, &resp_size)) { + printk(BIOS_ERR, "HECI: HMRFPO send/receive fail\n"); + return -1; + } + + if (resp.hdr.result) { + printk(BIOS_ERR, "HECI: HMRFPO Resp Failed:%d\n", + resp.hdr.result); + return -1; + } + + return resp.status; +} + #if ENV_RAMSTAGE static void update_sec_bar(struct device *dev) -- cgit v1.2.3