From: Srinivas Pandruvada Date: Wed, 7 Jan 2026 06:16:49 +0000 (-0800) Subject: platform/x86: ISST: Optimize suspend/resume callbacks X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=932ca9b7b47c08479e52c1605f73474ed27e3e4f;p=thirdparty%2Flinux.git platform/x86: ISST: Optimize suspend/resume callbacks If SST-CP or SST-PP is not supported then don't store configuration during suspend callback and restore during resume callback. Signed-off-by: Srinivas Pandruvada Link: https://patch.msgid.link/20260107061649.1634737-1-srinivas.pandruvada@linux.intel.com Reviewed-by: Ilpo Järvinen Signed-off-by: Ilpo Järvinen --- diff --git a/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c b/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c index f71d7df03f358..9c078c8acb505 100644 --- a/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c +++ b/drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c @@ -1721,6 +1721,9 @@ void tpmi_sst_dev_remove(struct auxiliary_device *auxdev) } EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, "INTEL_TPMI_SST"); +#define SST_PP_CAP_CP_ENABLE BIT(0) +#define SST_PP_CAP_PP_ENABLE BIT(1) + void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) { struct tpmi_sst_struct *tpmi_sst = auxiliary_get_drvdata(auxdev); @@ -1741,6 +1744,9 @@ void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) if (!pd_info || !pd_info->sst_base) continue; + if (!(pd_info->sst_header.cap_mask & SST_PP_CAP_CP_ENABLE)) + goto process_pp_suspend; + cp_base = pd_info->sst_base + pd_info->sst_header.cp_offset; pd_info->saved_sst_cp_control = readq(cp_base + SST_CP_CONTROL_OFFSET); memcpy_fromio(pd_info->saved_clos_configs, cp_base + SST_CLOS_CONFIG_0_OFFSET, @@ -1748,6 +1754,10 @@ void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) memcpy_fromio(pd_info->saved_clos_assocs, cp_base + SST_CLOS_ASSOC_0_OFFSET, sizeof(pd_info->saved_clos_assocs)); +process_pp_suspend: + if (!(pd_info->sst_header.cap_mask & SST_PP_CAP_PP_ENABLE)) + continue; + pd_info->saved_pp_control = readq(pd_info->sst_base + pd_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); @@ -1775,6 +1785,9 @@ void tpmi_sst_dev_resume(struct auxiliary_device *auxdev) if (!pd_info || !pd_info->sst_base) continue; + if (!(pd_info->sst_header.cap_mask & SST_PP_CAP_CP_ENABLE)) + goto process_pp_resume; + cp_base = pd_info->sst_base + pd_info->sst_header.cp_offset; writeq(pd_info->saved_sst_cp_control, cp_base + SST_CP_CONTROL_OFFSET); memcpy_toio(cp_base + SST_CLOS_CONFIG_0_OFFSET, pd_info->saved_clos_configs, @@ -1782,6 +1795,10 @@ void tpmi_sst_dev_resume(struct auxiliary_device *auxdev) memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, pd_info->saved_clos_assocs, sizeof(pd_info->saved_clos_assocs)); +process_pp_resume: + if (!(pd_info->sst_header.cap_mask & SST_PP_CAP_PP_ENABLE)) + continue; + writeq(pd_info->saved_pp_control, power_domain_info->sst_base + pd_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); }