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 <rizwan.qureshi@intel.com>
Signed-off-by: Sridhar Siricilla <sridhar.siricilla@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/35229
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: V Sowmya <v.sowmya@intel.com>
This commit is contained in:
Sridhar Siricilla 2019-08-31 16:12:21 +05:30 committed by Subrata Banik
parent d59ae09832
commit e30a0e63b5
2 changed files with 129 additions and 0 deletions

View File

@ -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)

View File

@ -113,6 +113,20 @@ uint8_t wait_cse_sec_override_mode(void);
*/
int send_heci_reset_req_message(uint8_t rst_type);
/*
* Send HMRFPO_ENABLE command.
* returns 0 on failure and 1 on success.
*/
int send_hmrfpo_enable_msg(void);
/*
* Send HMRFPO_GET_STATUS command.
* returns -1 on failure and 0 (DISABLED)/ 1 (LOCKED)/ 2 (ENABLED)
* on success.
*/
int send_hmrfpo_get_status_msg(void);
#define BIOS_HOST_ADDR 0x00
#define HECI_MKHI_ADDR 0x07
@ -121,4 +135,9 @@ int send_heci_reset_req_message(uint8_t rst_type);
#define HOST_RESET_ONLY 2
#define CSE_RESET_ONLY 3
/*HMRFPO Status types */
#define MKHI_HMRFPO_DISABLED 0
#define MKHI_HMRFPO_LOCKED 1
#define MKHI_HMRFPO_ENABLED 2
#endif // SOC_INTEL_COMMON_MSR_H