* [PATCH 1/2] platform/x86: ISST: Add missing write block check [not found] <20251229183450.823244-1-srinivas.pandruvada@linux.intel.com> @ 2025-12-29 18:34 ` Srinivas Pandruvada 2025-12-29 18:34 ` [PATCH 2/2] platform/x86: ISST: Store and restore all domains data Srinivas Pandruvada 1 sibling, 0 replies; 4+ messages in thread From: Srinivas Pandruvada @ 2025-12-29 18:34 UTC (permalink / raw) To: hansg, ilpo.jarvinen Cc: platform-driver-x86, linux-kernel, Srinivas Pandruvada, stable If writes are blocked, then return error during SST-CP enable command. Add missing write block check in this code path. Fixes: 8bed9ff7dbcc ("platform/x86: ISST: Process read/write blocked feature status") Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Cc: <stable@vger.kernel.org> --- drivers/platform/x86/intel/speed_select_if/isst_tpmi_core.c | 3 +++ 1 file changed, 3 insertions(+) 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 34bff2f65a83..f587709ddd47 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 @@ -612,6 +612,9 @@ static long isst_if_core_power_state(void __user *argp) return -EINVAL; if (core_power.get_set) { + if (power_domain_info->write_blocked) + return -EPERM; + _write_cp_info("cp_enable", core_power.enable, SST_CP_CONTROL_OFFSET, SST_CP_ENABLE_START, SST_CP_ENABLE_WIDTH, SST_MUL_FACTOR_NONE) _write_cp_info("cp_prio_type", core_power.priority_type, SST_CP_CONTROL_OFFSET, -- 2.52.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] platform/x86: ISST: Store and restore all domains data [not found] <20251229183450.823244-1-srinivas.pandruvada@linux.intel.com> 2025-12-29 18:34 ` [PATCH 1/2] platform/x86: ISST: Add missing write block check Srinivas Pandruvada @ 2025-12-29 18:34 ` Srinivas Pandruvada 2026-01-06 9:44 ` Ilpo Järvinen 1 sibling, 1 reply; 4+ messages in thread From: Srinivas Pandruvada @ 2025-12-29 18:34 UTC (permalink / raw) To: hansg, ilpo.jarvinen Cc: platform-driver-x86, linux-kernel, Srinivas Pandruvada, stable The suspend/resume callbacks currently only store and restore the configuration for power domain 0. However, other power domains may also have modified configurations that need to be preserved across suspend/ resume cycles. Extend the store/restore functionality to handle all power domains. Fixes: 91576acab020 ("platform/x86: ISST: Add suspend/resume callbacks") Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> CC: stable@vger.kernel.org --- .../intel/speed_select_if/isst_tpmi_core.c | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) 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 f587709ddd47..47026bb3e1af 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 @@ -1723,55 +1723,68 @@ EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, "INTEL_TPMI_SST"); void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) { struct tpmi_sst_struct *tpmi_sst = auxiliary_get_drvdata(auxdev); - struct tpmi_per_power_domain_info *power_domain_info; + struct tpmi_per_power_domain_info *power_domain_info, *pd_info; struct oobmsm_plat_info *plat_info; void __iomem *cp_base; + int num_resources, i; plat_info = tpmi_get_platform_data(auxdev); if (!plat_info) return; power_domain_info = tpmi_sst->power_domain_info[plat_info->partition]; + num_resources = tpmi_sst->number_of_power_domains[plat_info->partition]; - cp_base = power_domain_info->sst_base + power_domain_info->sst_header.cp_offset; - power_domain_info->saved_sst_cp_control = readq(cp_base + SST_CP_CONTROL_OFFSET); + for (i = 0; i < num_resources; i++) { + pd_info = &power_domain_info[i]; + if (!pd_info || !pd_info->sst_base) + continue; - memcpy_fromio(power_domain_info->saved_clos_configs, cp_base + SST_CLOS_CONFIG_0_OFFSET, - sizeof(power_domain_info->saved_clos_configs)); + cp_base = pd_info->sst_base + pd_info->sst_header.cp_offset; - memcpy_fromio(power_domain_info->saved_clos_assocs, cp_base + SST_CLOS_ASSOC_0_OFFSET, - sizeof(power_domain_info->saved_clos_assocs)); + 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, + sizeof(pd_info->saved_clos_configs)); + memcpy_fromio(pd_info->saved_clos_assocs, cp_base + SST_CLOS_ASSOC_0_OFFSET, + sizeof(pd_info->saved_clos_assocs)); - power_domain_info->saved_pp_control = readq(power_domain_info->sst_base + - power_domain_info->sst_header.pp_offset + - SST_PP_CONTROL_OFFSET); + pd_info->saved_pp_control = readq(pd_info->sst_base + + pd_info->sst_header.pp_offset + + SST_PP_CONTROL_OFFSET); + } } EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_suspend, "INTEL_TPMI_SST"); void tpmi_sst_dev_resume(struct auxiliary_device *auxdev) { struct tpmi_sst_struct *tpmi_sst = auxiliary_get_drvdata(auxdev); - struct tpmi_per_power_domain_info *power_domain_info; + struct tpmi_per_power_domain_info *power_domain_info, *pd_info; struct oobmsm_plat_info *plat_info; void __iomem *cp_base; + int num_resources, i; plat_info = tpmi_get_platform_data(auxdev); if (!plat_info) return; power_domain_info = tpmi_sst->power_domain_info[plat_info->partition]; + num_resources = tpmi_sst->number_of_power_domains[plat_info->partition]; - cp_base = power_domain_info->sst_base + power_domain_info->sst_header.cp_offset; - writeq(power_domain_info->saved_sst_cp_control, cp_base + SST_CP_CONTROL_OFFSET); - - memcpy_toio(cp_base + SST_CLOS_CONFIG_0_OFFSET, power_domain_info->saved_clos_configs, - sizeof(power_domain_info->saved_clos_configs)); + for (i = 0; i < num_resources; i++) { + pd_info = &power_domain_info[i]; + if (!pd_info || !pd_info->sst_base) + continue; - memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, power_domain_info->saved_clos_assocs, - sizeof(power_domain_info->saved_clos_assocs)); + 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, + sizeof(pd_info->saved_clos_configs)); + memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, pd_info->saved_clos_assocs, + sizeof(pd_info->saved_clos_assocs)); - writeq(power_domain_info->saved_pp_control, power_domain_info->sst_base + - power_domain_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); + writeq(pd_info->saved_pp_control, power_domain_info->sst_base + + pd_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); + } } EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_resume, "INTEL_TPMI_SST"); -- 2.52.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] platform/x86: ISST: Store and restore all domains data 2025-12-29 18:34 ` [PATCH 2/2] platform/x86: ISST: Store and restore all domains data Srinivas Pandruvada @ 2026-01-06 9:44 ` Ilpo Järvinen 2026-01-06 23:24 ` srinivas pandruvada 0 siblings, 1 reply; 4+ messages in thread From: Ilpo Järvinen @ 2026-01-06 9:44 UTC (permalink / raw) To: Srinivas Pandruvada; +Cc: Hans de Goede, platform-driver-x86, LKML, stable On Mon, 29 Dec 2025, Srinivas Pandruvada wrote: > The suspend/resume callbacks currently only store and restore the > configuration for power domain 0. However, other power domains may also > have modified configurations that need to be preserved across suspend/ > resume cycles. > > Extend the store/restore functionality to handle all power domains. > > Fixes: 91576acab020 ("platform/x86: ISST: Add suspend/resume callbacks") > Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> > CC: stable@vger.kernel.org > --- > .../intel/speed_select_if/isst_tpmi_core.c | 53 ++++++++++++------- > 1 file changed, 33 insertions(+), 20 deletions(-) > > 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 f587709ddd47..47026bb3e1af 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 > @@ -1723,55 +1723,68 @@ EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, "INTEL_TPMI_SST"); > void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) > { > struct tpmi_sst_struct *tpmi_sst = auxiliary_get_drvdata(auxdev); > - struct tpmi_per_power_domain_info *power_domain_info; > + struct tpmi_per_power_domain_info *power_domain_info, *pd_info; > struct oobmsm_plat_info *plat_info; > void __iomem *cp_base; > + int num_resources, i; > > plat_info = tpmi_get_platform_data(auxdev); > if (!plat_info) > return; > > power_domain_info = tpmi_sst->power_domain_info[plat_info->partition]; > + num_resources = tpmi_sst->number_of_power_domains[plat_info->partition]; > > - cp_base = power_domain_info->sst_base + power_domain_info->sst_header.cp_offset; > - power_domain_info->saved_sst_cp_control = readq(cp_base + SST_CP_CONTROL_OFFSET); > + for (i = 0; i < num_resources; i++) { > + pd_info = &power_domain_info[i]; > + if (!pd_info || !pd_info->sst_base) > + continue; > > - memcpy_fromio(power_domain_info->saved_clos_configs, cp_base + SST_CLOS_CONFIG_0_OFFSET, > - sizeof(power_domain_info->saved_clos_configs)); > + cp_base = pd_info->sst_base + pd_info->sst_header.cp_offset; > > - memcpy_fromio(power_domain_info->saved_clos_assocs, cp_base + SST_CLOS_ASSOC_0_OFFSET, > - sizeof(power_domain_info->saved_clos_assocs)); > + 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, > + sizeof(pd_info->saved_clos_configs)); > + memcpy_fromio(pd_info->saved_clos_assocs, cp_base + SST_CLOS_ASSOC_0_OFFSET, > + sizeof(pd_info->saved_clos_assocs)); > > - power_domain_info->saved_pp_control = readq(power_domain_info->sst_base + > - power_domain_info->sst_header.pp_offset + > - SST_PP_CONTROL_OFFSET); > + pd_info->saved_pp_control = readq(pd_info->sst_base + > + pd_info->sst_header.pp_offset + > + SST_PP_CONTROL_OFFSET); > + } > } > EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_suspend, "INTEL_TPMI_SST"); > > void tpmi_sst_dev_resume(struct auxiliary_device *auxdev) > { > struct tpmi_sst_struct *tpmi_sst = auxiliary_get_drvdata(auxdev); > - struct tpmi_per_power_domain_info *power_domain_info; > + struct tpmi_per_power_domain_info *power_domain_info, *pd_info; > struct oobmsm_plat_info *plat_info; > void __iomem *cp_base; > + int num_resources, i; > > plat_info = tpmi_get_platform_data(auxdev); > if (!plat_info) > return; > > power_domain_info = tpmi_sst->power_domain_info[plat_info->partition]; > + num_resources = tpmi_sst->number_of_power_domains[plat_info->partition]; > > - cp_base = power_domain_info->sst_base + power_domain_info->sst_header.cp_offset; > - writeq(power_domain_info->saved_sst_cp_control, cp_base + SST_CP_CONTROL_OFFSET); > - > - memcpy_toio(cp_base + SST_CLOS_CONFIG_0_OFFSET, power_domain_info->saved_clos_configs, > - sizeof(power_domain_info->saved_clos_configs)); > + for (i = 0; i < num_resources; i++) { > + pd_info = &power_domain_info[i]; > + if (!pd_info || !pd_info->sst_base) > + continue; > > - memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, power_domain_info->saved_clos_assocs, > - sizeof(power_domain_info->saved_clos_assocs)); > + 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, > + sizeof(pd_info->saved_clos_configs)); > + memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, pd_info->saved_clos_assocs, > + sizeof(pd_info->saved_clos_assocs)); Why is the use of empty lines inconsistent between suspend and resume? > - writeq(power_domain_info->saved_pp_control, power_domain_info->sst_base + > - power_domain_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); > + writeq(pd_info->saved_pp_control, power_domain_info->sst_base + > + pd_info->sst_header.pp_offset + SST_PP_CONTROL_OFFSET); > + } > } > EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_resume, "INTEL_TPMI_SST"); > > -- i. ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] platform/x86: ISST: Store and restore all domains data 2026-01-06 9:44 ` Ilpo Järvinen @ 2026-01-06 23:24 ` srinivas pandruvada 0 siblings, 0 replies; 4+ messages in thread From: srinivas pandruvada @ 2026-01-06 23:24 UTC (permalink / raw) To: Ilpo Järvinen; +Cc: Hans de Goede, platform-driver-x86, LKML, stable On Tue, 2026-01-06 at 11:44 +0200, Ilpo Järvinen wrote: > On Mon, 29 Dec 2025, Srinivas Pandruvada wrote: > > > The suspend/resume callbacks currently only store and restore the > > configuration for power domain 0. However, other power domains may > > also > > have modified configurations that need to be preserved across > > suspend/ > > resume cycles. > > > > Extend the store/restore functionality to handle all power domains. > > > > Fixes: 91576acab020 ("platform/x86: ISST: Add suspend/resume > > callbacks") > > Signed-off-by: Srinivas Pandruvada > > <srinivas.pandruvada@linux.intel.com> > > CC: stable@vger.kernel.org > > --- > > .../intel/speed_select_if/isst_tpmi_core.c | 53 ++++++++++++--- > > ---- > > 1 file changed, 33 insertions(+), 20 deletions(-) > > > > 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 f587709ddd47..47026bb3e1af 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 > > @@ -1723,55 +1723,68 @@ EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_remove, > > "INTEL_TPMI_SST"); > > void tpmi_sst_dev_suspend(struct auxiliary_device *auxdev) > > { > > struct tpmi_sst_struct *tpmi_sst = > > auxiliary_get_drvdata(auxdev); > > - struct tpmi_per_power_domain_info *power_domain_info; > > + struct tpmi_per_power_domain_info *power_domain_info, > > *pd_info; > > struct oobmsm_plat_info *plat_info; > > void __iomem *cp_base; > > + int num_resources, i; > > > > plat_info = tpmi_get_platform_data(auxdev); > > if (!plat_info) > > return; > > > > power_domain_info = tpmi_sst->power_domain_info[plat_info- > > >partition]; > > + num_resources = tpmi_sst- > > >number_of_power_domains[plat_info->partition]; > > > > - cp_base = power_domain_info->sst_base + power_domain_info- > > >sst_header.cp_offset; > > - power_domain_info->saved_sst_cp_control = readq(cp_base + > > SST_CP_CONTROL_OFFSET); > > + for (i = 0; i < num_resources; i++) { > > + pd_info = &power_domain_info[i]; > > + if (!pd_info || !pd_info->sst_base) > > + continue; > > > > - memcpy_fromio(power_domain_info->saved_clos_configs, > > cp_base + SST_CLOS_CONFIG_0_OFFSET, > > - sizeof(power_domain_info- > > >saved_clos_configs)); > > + cp_base = pd_info->sst_base + pd_info- > > >sst_header.cp_offset; > > > > - memcpy_fromio(power_domain_info->saved_clos_assocs, > > cp_base + SST_CLOS_ASSOC_0_OFFSET, > > - sizeof(power_domain_info- > > >saved_clos_assocs)); > > + 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, > > + sizeof(pd_info- > > >saved_clos_configs)); > > + memcpy_fromio(pd_info->saved_clos_assocs, cp_base > > + SST_CLOS_ASSOC_0_OFFSET, > > + sizeof(pd_info->saved_clos_assocs)); > > > > - power_domain_info->saved_pp_control = > > readq(power_domain_info->sst_base + > > - > > power_domain_info->sst_header.pp_offset + > > - > > SST_PP_CONTROL_OFFSET); > > + pd_info->saved_pp_control = readq(pd_info- > > >sst_base + > > + pd_info- > > >sst_header.pp_offset + > > + > > SST_PP_CONTROL_OFFSET); > > + } > > } > > EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_suspend, "INTEL_TPMI_SST"); > > > > void tpmi_sst_dev_resume(struct auxiliary_device *auxdev) > > { > > struct tpmi_sst_struct *tpmi_sst = > > auxiliary_get_drvdata(auxdev); > > - struct tpmi_per_power_domain_info *power_domain_info; > > + struct tpmi_per_power_domain_info *power_domain_info, > > *pd_info; > > struct oobmsm_plat_info *plat_info; > > void __iomem *cp_base; > > + int num_resources, i; > > > > plat_info = tpmi_get_platform_data(auxdev); > > if (!plat_info) > > return; > > > > power_domain_info = tpmi_sst->power_domain_info[plat_info- > > >partition]; > > + num_resources = tpmi_sst- > > >number_of_power_domains[plat_info->partition]; > > > > - cp_base = power_domain_info->sst_base + power_domain_info- > > >sst_header.cp_offset; > > - writeq(power_domain_info->saved_sst_cp_control, cp_base + > > SST_CP_CONTROL_OFFSET); > > - > > - memcpy_toio(cp_base + SST_CLOS_CONFIG_0_OFFSET, > > power_domain_info->saved_clos_configs, > > - sizeof(power_domain_info- > > >saved_clos_configs)); > > + for (i = 0; i < num_resources; i++) { > > + pd_info = &power_domain_info[i]; > > + if (!pd_info || !pd_info->sst_base) > > + continue; > > > > - memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, > > power_domain_info->saved_clos_assocs, > > - sizeof(power_domain_info->saved_clos_assocs)); > > + 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, > > + sizeof(pd_info->saved_clos_configs)); > > + memcpy_toio(cp_base + SST_CLOS_ASSOC_0_OFFSET, > > pd_info->saved_clos_assocs, > > + sizeof(pd_info->saved_clos_assocs)); > > Why is the use of empty lines inconsistent between suspend and > resume? I will fix that. Thanks, Srinivas > > > - writeq(power_domain_info->saved_pp_control, > > power_domain_info->sst_base + > > - power_domain_info- > > >sst_header.pp_offset + SST_PP_CONTROL_OFFSET); > > + writeq(pd_info->saved_pp_control, > > power_domain_info->sst_base + > > + pd_info->sst_header.pp_offset + > > SST_PP_CONTROL_OFFSET); > > + } > > } > > EXPORT_SYMBOL_NS_GPL(tpmi_sst_dev_resume, "INTEL_TPMI_SST"); > > > > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-01-06 23:24 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20251229183450.823244-1-srinivas.pandruvada@linux.intel.com>
2025-12-29 18:34 ` [PATCH 1/2] platform/x86: ISST: Add missing write block check Srinivas Pandruvada
2025-12-29 18:34 ` [PATCH 2/2] platform/x86: ISST: Store and restore all domains data Srinivas Pandruvada
2026-01-06 9:44 ` Ilpo Järvinen
2026-01-06 23:24 ` srinivas pandruvada
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox