summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/soc/intel/common/block/cse/cse.c57
-rw-r--r--src/soc/intel/common/block/include/intelblocks/cse.h32
2 files changed, 89 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/cse/cse.c b/src/soc/intel/common/block/cse/cse.c
index 1aa3454f6f..9a4cd45bc8 100644
--- a/src/soc/intel/common/block/cse/cse.c
+++ b/src/soc/intel/common/block/cse/cse.c
@@ -1213,6 +1213,63 @@ void cse_enable_ptt(bool state)
}
}
+static enum cb_err send_get_fpt_partition_info_cmd(enum fpt_partition_id id,
+ struct fw_version_resp *resp)
+{
+ enum cse_tx_rx_status ret;
+ struct fw_version_msg {
+ struct mkhi_hdr hdr;
+ enum fpt_partition_id partition_id;
+ } __packed msg = {
+ .hdr = {
+ .group_id = MKHI_GROUP_ID_GEN,
+ .command = GEN_GET_IMAGE_FW_VERSION,
+ },
+ .partition_id = id,
+ };
+
+ /*
+ * Prerequisites:
+ * 1) HFSTS1 CWS is Normal
+ * 2) HFSTS1 COM is Normal
+ * 3) Only sent after DID (accomplished by compiling this into ramstage)
+ */
+
+ if (cse_is_hfs1_com_soft_temp_disable() || !cse_is_hfs1_cws_normal() ||
+ !cse_is_hfs1_com_normal()) {
+ printk(BIOS_ERR,
+ "HECI: Prerequisites not met for Get Image Firmware Version command\n");
+ return CB_ERR;
+ }
+
+ size_t resp_size = sizeof(struct fw_version_resp);
+ ret = heci_send_receive(&msg, sizeof(msg), resp, &resp_size, HECI_MKHI_ADDR);
+
+ if (ret || resp->hdr.result) {
+ printk(BIOS_ERR, "CSE: Failed to get partition information for %d: 0x%x\n",
+ id, resp->hdr.result);
+ return CB_ERR;
+ }
+
+ return CB_SUCCESS;
+}
+
+enum cb_err cse_get_fpt_partition_info(enum fpt_partition_id id, struct fw_version_resp *resp)
+{
+ if (vboot_recovery_mode_enabled()) {
+ printk(BIOS_WARNING,
+ "CSE: Skip sending Get Image Info command during recovery mode!\n");
+ return CB_ERR;
+ }
+
+ if (id == FPT_PARTITION_NAME_ISHC && !CONFIG(DRIVERS_INTEL_ISH)) {
+ printk(BIOS_WARNING, "CSE: Info request denied, no ISH partition\n");
+ return CB_ERR;
+ }
+
+ return send_get_fpt_partition_info_cmd(id, resp);
+}
+
#if ENV_RAMSTAGE
/*
diff --git a/src/soc/intel/common/block/include/intelblocks/cse.h b/src/soc/intel/common/block/include/intelblocks/cse.h
index b39ae7f8fa..6b708cab1e 100644
--- a/src/soc/intel/common/block/include/intelblocks/cse.h
+++ b/src/soc/intel/common/block/include/intelblocks/cse.h
@@ -49,6 +49,7 @@
#define MKHI_BUP_COMMON_GET_BOOT_PARTITION_INFO 0x1c
#define MKHI_BUP_COMMON_SET_BOOT_PARTITION_INFO 0x1d
#define MKHI_BUP_COMMON_DATA_CLEAR 0x20
+#define GEN_GET_IMAGE_FW_VERSION 0x1c
/* Get boot performance command id */
#define MKHI_BUP_COMMON_GET_BOOT_PERF_DATA 0x8
@@ -85,6 +86,12 @@ enum {
PCI_ME_HFSTS6 = 0x6C,
};
+/* CSE partition list */
+enum fpt_partition_id {
+ FPT_PARTITION_NAME_UNDEFINED = 0x0,
+ FPT_PARTITION_NAME_ISHC = 0x43485349,
+};
+
/* MKHI Message Header */
struct mkhi_hdr {
uint8_t group_id;
@@ -118,6 +125,25 @@ struct me_fw_ver_resp {
struct me_version fitc;
} __packed;
+/* Module data from manifest */
+struct flash_partition_data {
+ enum fpt_partition_id partition_id;
+ uint8_t reserved1[8];
+ struct fw_version version;
+ uint32_t vendor_id;
+ uint32_t tcb_svn;
+ uint32_t arb_svn;
+ uint32_t vcn;
+ uint32_t reserved2[13];
+};
+
+/* Response header for partition information request */
+struct fw_version_resp {
+ struct mkhi_hdr hdr;
+ uint32_t module_count;
+ struct flash_partition_data manifest_data;
+};
+
/* CSE RX and TX error status */
enum cse_tx_rx_status {
/*
@@ -502,4 +528,10 @@ void cse_enable_ptt(bool state);
*/
enum cb_err cse_get_fw_feature_state(uint32_t *feature_state);
+/*
+ * The function sends a HECI command to get the partition information of the shared ID.
+ * The retrieved partition is stored in the memory pointed to by the resp pointer.
+ * The function returns 0 on success and < 0 on failure.
+ */
+enum cb_err cse_get_fpt_partition_info(enum fpt_partition_id id, struct fw_version_resp *resp);
#endif // SOC_INTEL_COMMON_CSE_H