summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSridhar Siricilla <sridhar.siricilla@intel.com>2019-08-31 16:12:21 +0530
committerSubrata Banik <subrata.banik@intel.com>2019-09-19 06:19:51 +0000
commite30a0e63b5285bb84ce7cdce5d0c9aabba32c536 (patch)
tree88416ae882f471c010d6796bb0f1408c2c50c692
parentd59ae09832ea71e4037d4c6d3ac1875878cb5964 (diff)
downloadcoreboot-e30a0e63b5285bb84ce7cdce5d0c9aabba32c536.tar.xz
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>
-rw-r--r--src/soc/intel/common/block/cse/cse.c110
-rw-r--r--src/soc/intel/common/block/include/intelblocks/cse.h19
2 files changed, 129 insertions, 0 deletions
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)
diff --git a/src/soc/intel/common/block/include/intelblocks/cse.h b/src/soc/intel/common/block/include/intelblocks/cse.h
index 1b08b4d4ea..378f41713c 100644
--- a/src/soc/intel/common/block/include/intelblocks/cse.h
+++ b/src/soc/intel/common/block/include/intelblocks/cse.h
@@ -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