summaryrefslogtreecommitdiff
path: root/src/soc/intel
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/intel')
-rw-r--r--src/soc/intel/common/block/cse/cse_lite.c24
-rw-r--r--src/soc/intel/common/block/include/intelblocks/cse.h5
2 files changed, 29 insertions, 0 deletions
diff --git a/src/soc/intel/common/block/cse/cse_lite.c b/src/soc/intel/common/block/cse/cse_lite.c
index 8e8e221687..bfa01e4dee 100644
--- a/src/soc/intel/common/block/cse/cse_lite.c
+++ b/src/soc/intel/common/block/cse/cse_lite.c
@@ -1122,6 +1122,30 @@ static void initiate_psr_data_backup(void)
backup_psr_data();
}
+/*
+ * Check if a CSE Firmware update is required
+ * returns true if an update is required, false otherwise
+ */
+bool is_cse_fw_update_required(void)
+{
+ struct fw_version cbfs_rw_version;
+
+ if (!is_cse_fw_update_enabled())
+ return false;
+
+ /*
+ * First, check if cse_bp_info_rsp global structure is populated.
+ * If not, it implies that cse_fill_bp_info() function is not called.
+ */
+ if (!is_cse_bp_info_valid(&cse_bp_info_rsp))
+ return false;
+
+ if (get_cse_ver_from_cbfs(&cbfs_rw_version) == CB_ERR)
+ return false;
+
+ return !!cse_compare_sub_part_version(&cbfs_rw_version, cse_get_rw_version());
+}
+
static uint8_t cse_fw_update(void)
{
struct region_device target_rdev;
diff --git a/src/soc/intel/common/block/include/intelblocks/cse.h b/src/soc/intel/common/block/include/intelblocks/cse.h
index f84dba86f1..3db13248d2 100644
--- a/src/soc/intel/common/block/include/intelblocks/cse.h
+++ b/src/soc/intel/common/block/include/intelblocks/cse.h
@@ -611,4 +611,9 @@ enum cb_err cse_get_fw_feature_state(uint32_t *feature_state);
/* Fills the CSE Boot Partition Info response */
void cse_fill_bp_info(void);
+/*
+ * Check if a CSE Firmware update is required
+ * Returns true if an update is required, false otherwise
+ */
+bool is_cse_fw_update_required(void);
#endif // SOC_INTEL_COMMON_CSE_H