soc/intel/common: Check prerequisites for GLOBAL_RESET command

Check prerequisites before sending GLOBAL RESET command to CSE.

TEST=Verified on hatch.

Change-Id: Ia583e4033f15ec20e942202fa78e7884cf370ce4
Signed-off-by: Sridhar Siricilla <sridhar.siricilla@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38800
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
Sridhar Siricilla 2020-02-07 11:59:30 +05:30 committed by Patrick Georgi
parent d16187ed2a
commit 59c7cb7d37
1 changed files with 28 additions and 0 deletions

View File

@ -608,6 +608,28 @@ uint32_t me_read_config32(int offset)
return pci_read_config32(PCH_DEV_CSE, offset); return pci_read_config32(PCH_DEV_CSE, offset);
} }
static bool cse_is_global_reset_allowed(void)
{
/*
* Allow sending GLOBAL_RESET command only if:
* - CSE's current working state is Normal and current operation mode is Normal.
* - (or) CSE's current working state is normal and current operation mode can
* be Soft Temp Disable or Security Override Mode if CSE's Firmware SKU is
* Custom.
*/
if (!cse_is_hfs1_cws_normal())
return false;
if (cse_is_hfs1_com_normal())
return true;
if (cse_is_hfs3_fw_sku_custom()) {
if (cse_is_hfs1_com_soft_temp_disable() || cse_is_hfs1_com_secover_mei_msg())
return true;
}
return false;
}
/* /*
* Sends GLOBAL_RESET_REQ cmd to CSE.The reset type can be GLOBAL_RESET/CSE_RESET_ONLY. * Sends GLOBAL_RESET_REQ cmd to CSE.The reset type can be GLOBAL_RESET/CSE_RESET_ONLY.
*/ */
@ -631,11 +653,17 @@ int cse_request_global_reset(enum rst_req_type rst_type)
size_t reply_size; size_t reply_size;
printk(BIOS_DEBUG, "HECI: Global Reset(Type:%d) Command\n", rst_type); printk(BIOS_DEBUG, "HECI: Global Reset(Type:%d) Command\n", rst_type);
if (!(rst_type == GLOBAL_RESET || rst_type == CSE_RESET_ONLY)) { if (!(rst_type == GLOBAL_RESET || rst_type == CSE_RESET_ONLY)) {
printk(BIOS_ERR, "HECI: Unsupported reset type is requested\n"); printk(BIOS_ERR, "HECI: Unsupported reset type is requested\n");
return 0; return 0;
} }
if (!cse_is_global_reset_allowed()) {
printk(BIOS_ERR, "HECI: CSE does not meet required prerequisites\n");
return 0;
}
heci_reset(); heci_reset();
reply_size = sizeof(reply); reply_size = sizeof(reply);