]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86/amd/pmf: Preserve custom BIOS inputs for evaluating the policies
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Mon, 1 Sep 2025 11:01:38 +0000 (16:31 +0530)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 11 Sep 2025 08:03:44 +0000 (11:03 +0300)
The current code fails to send multiple BIOS input data to the PMF-TA
for policy condition evaluation. Only the most recent BIOS input data is
properly sent to the PMF-TA, while previous inputs are overwritten with
the zeros.

To address this issue, the BIOS input data should be stored and passed on
to the PMF-TA.

Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com>
Tested-by: Yijun Shen <Yijun.Shen@Dell.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://patch.msgid.link/20250901110140.2519072-8-Shyam-sundar.S-k@amd.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/amd/pmf/pmf.h
drivers/platform/x86/amd/pmf/spc.c

index 647993e94674c487b9279d2f0659577b405967bc..6d2579f8cff44af7abe0b465a84b00f1db22bf4c 100644 (file)
@@ -354,6 +354,10 @@ enum power_modes_v2 {
        POWER_MODE_V2_MAX,
 };
 
+struct pmf_bios_inputs_prev {
+       u32 custom_bios_inputs[10];
+};
+
 struct amd_pmf_dev {
        void __iomem *regbase;
        void __iomem *smu_virt_addr;
@@ -400,6 +404,7 @@ struct amd_pmf_dev {
        struct mutex cb_mutex;
        u32 notifications;
        struct apmf_sbios_req_v1 req1;
+       struct pmf_bios_inputs_prev cb_prev; /* To preserve custom BIOS inputs */
 };
 
 struct apmf_sps_prop_granular_v2 {
index 1b612e79a3d8e612f605b9f6154cb186a3c5fb84..aeead2477a077b36d37db1cbcc0ed1b1fa67930f 100644 (file)
@@ -142,12 +142,18 @@ static void amd_pmf_update_bios_inputs(struct amd_pmf_dev *pdev, u32 pending_req
                if (!(pending_req & inputs[i].bit_mask))
                        continue;
                amd_pmf_set_ta_custom_bios_input(in, i, custom_policy[i]);
+               pdev->cb_prev.custom_bios_inputs[i] = custom_policy[i];
        }
 }
 
 static void amd_pmf_get_custom_bios_inputs(struct amd_pmf_dev *pdev,
                                           struct ta_pmf_enact_table *in)
 {
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(custom_bios_inputs); i++)
+               amd_pmf_set_ta_custom_bios_input(in, i, pdev->cb_prev.custom_bios_inputs[i]);
+
        if (!(pdev->req.pending_req || pdev->req1.pending_req))
                return;