]> www.infradead.org Git - users/willy/xarray.git/commitdiff
platform/x86:intel/pmc: Create generic_core_init() for all platforms
authorXi Pardee <xi.pardee@linux.intel.com>
Fri, 7 Feb 2025 22:56:09 +0000 (14:56 -0800)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 10 Feb 2025 11:14:46 +0000 (13:14 +0200)
Create a generic_core_init() function for all architectures to reduce
duplicate code in each architecture file. Create an info structure
to catch the variations between each architecture and pass it to the
generic init function.

Convert all architectures to call the generic core init function.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
Link: https://lore.kernel.org/r/20250207225615.401235-4-xi.pardee@linux.intel.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/intel/pmc/adl.c
drivers/platform/x86/intel/pmc/arl.c
drivers/platform/x86/intel/pmc/cnp.c
drivers/platform/x86/intel/pmc/core.c
drivers/platform/x86/intel/pmc/core.h
drivers/platform/x86/intel/pmc/icl.c
drivers/platform/x86/intel/pmc/lnl.c
drivers/platform/x86/intel/pmc/mtl.c
drivers/platform/x86/intel/pmc/spt.c
drivers/platform/x86/intel/pmc/tgl.c

index e7878558fd9090140e6de7c6ce192e8419eb5306..ac37f4ece9c700fbf9b36716c1b19dc6627b4b70 100644 (file)
@@ -311,20 +311,13 @@ const struct pmc_reg_map adl_reg_map = {
        .pson_residency_counter_step = TGL_PSON_RES_COUNTER_STEP,
 };
 
+static struct pmc_dev_info adl_pmc_dev = {
+       .map = &adl_reg_map,
+       .suspend = cnl_suspend,
+       .resume = cnl_resume,
+};
+
 int adl_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = cnl_resume;
-
-       pmc->map = &adl_reg_map;
-       ret = get_primary_reg_base(pmc);
-       if (ret)
-               return ret;
-
-       pmc_core_get_low_power_modes(pmcdev);
-
-       return 0;
+       return generic_core_init(pmcdev, &adl_pmc_dev);
 }
index ad976cc83ecae90afa96bec18e59c146d566964c..91f8e9ab1c2e6957efa7d8a36aee45d5e4714c2c 100644 (file)
@@ -691,40 +691,17 @@ static int arl_resume(struct pmc_dev *pmcdev)
        return cnl_resume(pmcdev);
 }
 
+static struct pmc_dev_info arl_pmc_dev = {
+       .pci_func = 0,
+       .dmu_guid = ARL_PMT_DMU_GUID,
+       .regmap_list = arl_pmc_info_list,
+       .map = &arl_socs_reg_map,
+       .suspend = cnl_suspend,
+       .resume = arl_resume,
+};
+
 int arl_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-       int func = 0;
-       bool ssram_init = true;
-
        arl_d3_fixup();
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = arl_resume;
-       pmcdev->regmap_list = arl_pmc_info_list;
-
-       /*
-        * If ssram init fails use legacy method to at least get the
-        * primary PMC
-        */
-       ret = pmc_core_ssram_init(pmcdev, func);
-       if (ret) {
-               ssram_init = false;
-               pmc->map = &arl_socs_reg_map;
-
-               ret = get_primary_reg_base(pmc);
-               if (ret)
-                       return ret;
-       }
-
-       pmc_core_get_low_power_modes(pmcdev);
-       pmc_core_punit_pmt_init(pmcdev, ARL_PMT_DMU_GUID);
-
-       if (ssram_init) {
-               ret = pmc_core_ssram_get_lpm_reqs(pmcdev);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
+       return generic_core_init(pmcdev, &arl_pmc_dev);
 }
index fc5193fdf8a88acda4eae8caa752df7e9be878f2..6d268058e40b90652487c0c09fcbef2e287b7b9d 100644 (file)
@@ -274,20 +274,13 @@ int cnl_resume(struct pmc_dev *pmcdev)
        return pmc_core_resume_common(pmcdev);
 }
 
+static struct pmc_dev_info cnp_pmc_dev = {
+       .map = &cnp_reg_map,
+       .suspend = cnl_suspend,
+       .resume = cnl_resume,
+};
+
 int cnp_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = cnl_resume;
-
-       pmc->map = &cnp_reg_map;
-       ret = get_primary_reg_base(pmc);
-       if (ret)
-               return ret;
-
-       pmc_core_get_low_power_modes(pmcdev);
-
-       return 0;
+       return generic_core_init(pmcdev, &cnp_pmc_dev);
 }
index 10f04b9441174cabb1ca625b149bbdd837e1c146..d1cbf49ce5bc9d8f880d90ea5408592c2d968134 100644 (file)
@@ -1345,6 +1345,48 @@ static void pmc_core_dbgfs_register(struct pmc_dev *pmcdev)
        }
 }
 
+/*
+ * When supported, ssram init is used to achieve all available PMCs.
+ * If ssram init fails, this function uses legacy method to at least get the
+ * primary PMC.
+ */
+int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
+{
+       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
+       bool ssram;
+       int ret;
+
+       pmcdev->suspend = pmc_dev_info->suspend;
+       pmcdev->resume = pmc_dev_info->resume;
+
+       ssram = pmc_dev_info->regmap_list != NULL;
+       if (ssram) {
+               pmcdev->regmap_list = pmc_dev_info->regmap_list;
+               ret = pmc_core_ssram_init(pmcdev, pmc_dev_info->pci_func);
+               if (ret) {
+                       dev_warn(&pmcdev->pdev->dev,
+                                "ssram init failed, %d, using legacy init\n", ret);
+                       ssram = false;
+               }
+       }
+
+       if (!ssram) {
+               pmc->map = pmc_dev_info->map;
+               ret = get_primary_reg_base(pmc);
+               if (ret)
+                       return ret;
+       }
+
+       pmc_core_get_low_power_modes(pmcdev);
+       if (pmc_dev_info->dmu_guid)
+               pmc_core_punit_pmt_init(pmcdev, pmc_dev_info->dmu_guid);
+
+       if (ssram)
+               return pmc_core_ssram_get_lpm_reqs(pmcdev);
+
+       return 0;
+}
+
 static const struct x86_cpu_id intel_pmc_core_ids[] = {
        X86_MATCH_VFM(INTEL_SKYLAKE_L,          spt_core_init),
        X86_MATCH_VFM(INTEL_SKYLAKE,            spt_core_init),
index a0f6cc427ddca90a2b4fbad3994f18b107ab12d7..7c9e999ee63184af4d28305378ff1212d414d832 100644 (file)
@@ -435,6 +435,27 @@ enum pmc_index {
        PMC_IDX_MAX
 };
 
+/**
+ * struct pmc_dev_info - Structure to keep PMC device info
+ * @pci_func:          Function number of the primary PMC
+ * @dmu_guid:          Die Management Unit GUID
+ * @regmap_list:       Pointer to a list of pmc_info structure that could be
+ *                     available for the platform. When set, this field implies
+ *                     SSRAM support.
+ * @map:               Pointer to a pmc_reg_map struct that contains platform
+ *                     specific attributes of the primary PMC
+ * @suspend:           Function to perform platform specific suspend
+ * @resume:            Function to perform platform specific resume
+ */
+struct pmc_dev_info {
+       u8 pci_func;
+       u32 dmu_guid;
+       struct pmc_info *regmap_list;
+       const struct pmc_reg_map *map;
+       void (*suspend)(struct pmc_dev *pmcdev);
+       int (*resume)(struct pmc_dev *pmcdev);
+};
+
 extern const struct pmc_bit_map msr_map[];
 extern const struct pmc_bit_map spt_pll_map[];
 extern const struct pmc_bit_map spt_mphy_map[];
@@ -591,6 +612,7 @@ extern void pmc_core_set_device_d3(unsigned int device);
 
 extern int pmc_core_ssram_init(struct pmc_dev *pmcdev, int func);
 
+int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info);
 int spt_core_init(struct pmc_dev *pmcdev);
 int cnp_core_init(struct pmc_dev *pmcdev);
 int icl_core_init(struct pmc_dev *pmcdev);
index 71b0fd6cb7d840e1b2e9c71f3f8d40dd9d93126e..0e4565dea045241072688768345f4ca7a533c2ed 100644 (file)
@@ -50,18 +50,11 @@ const struct pmc_reg_map icl_reg_map = {
        .etr3_offset = ETR3_OFFSET,
 };
 
+static struct pmc_dev_info icl_pmc_dev = {
+       .map = &icl_reg_map,
+};
+
 int icl_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-
-       pmc->map = &icl_reg_map;
-
-       ret = get_primary_reg_base(pmc);
-       if (ret)
-               return ret;
-
-       pmc_core_get_low_power_modes(pmcdev);
-
-       return ret;
+       return generic_core_init(pmcdev, &icl_pmc_dev);
 }
index 09b13df90d685f1cc5c18f5ebd303c49ce825a8b..1142e65225be7aab79bf8d4c4a0bed35944d7475 100644 (file)
@@ -550,22 +550,14 @@ static int lnl_resume(struct pmc_dev *pmcdev)
        return cnl_resume(pmcdev);
 }
 
+static struct pmc_dev_info lnl_pmc_dev = {
+       .map = &lnl_socm_reg_map,
+       .suspend = cnl_suspend,
+       .resume = lnl_resume,
+};
+
 int lnl_core_init(struct pmc_dev *pmcdev)
 {
-       int ret;
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-
        lnl_d3_fixup();
-
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = lnl_resume;
-
-       pmc->map = &lnl_socm_reg_map;
-       ret = get_primary_reg_base(pmc);
-       if (ret)
-               return ret;
-
-       pmc_core_get_low_power_modes(pmcdev);
-
-       return 0;
+       return generic_core_init(pmcdev, &lnl_pmc_dev);
 }
index 07687a3e436d5adf9f721519eabde30b1c320aa8..28ea8fe8a493fffb03b998d65c5f74a08b2398b6 100644 (file)
@@ -990,39 +990,17 @@ static int mtl_resume(struct pmc_dev *pmcdev)
        return cnl_resume(pmcdev);
 }
 
+static struct pmc_dev_info mtl_pmc_dev = {
+       .pci_func = 2,
+       .dmu_guid = MTL_PMT_DMU_GUID,
+       .regmap_list = mtl_pmc_info_list,
+       .map = &mtl_socm_reg_map,
+       .suspend = cnl_suspend,
+       .resume = mtl_resume,
+};
+
 int mtl_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-       int func = 2;
-       bool ssram_init = true;
-
        mtl_d3_fixup();
-
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = mtl_resume;
-       pmcdev->regmap_list = mtl_pmc_info_list;
-
-       /*
-        * If ssram init fails use legacy method to at least get the
-        * primary PMC
-        */
-       ret = pmc_core_ssram_init(pmcdev, func);
-       if (ret) {
-               ssram_init = false;
-               dev_warn(&pmcdev->pdev->dev,
-                        "ssram init failed, %d, using legacy init\n", ret);
-               pmc->map = &mtl_socm_reg_map;
-               ret = get_primary_reg_base(pmc);
-               if (ret)
-                       return ret;
-       }
-
-       pmc_core_get_low_power_modes(pmcdev);
-       pmc_core_punit_pmt_init(pmcdev, MTL_PMT_DMU_GUID);
-
-       if (ssram_init)
-               return pmc_core_ssram_get_lpm_reqs(pmcdev);
-
-       return 0;
+       return generic_core_init(pmcdev, &mtl_pmc_dev);
 }
index ab993a69e33ee204ddc59a246f0ff9e9bed22ff8..ab5f66fcb0c30277a5a96e435ca29a96209bcedb 100644 (file)
@@ -134,18 +134,11 @@ const struct pmc_reg_map spt_reg_map = {
        .pm_vric1_offset = SPT_PMC_VRIC1_OFFSET,
 };
 
+static struct pmc_dev_info spt_pmc_dev = {
+       .map = &spt_reg_map,
+};
+
 int spt_core_init(struct pmc_dev *pmcdev)
 {
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
-
-       pmc->map = &spt_reg_map;
-
-       ret = get_primary_reg_base(pmc);
-       if (ret)
-               return ret;
-
-       pmc_core_get_low_power_modes(pmcdev);
-
-       return ret;
+       return generic_core_init(pmcdev, &spt_pmc_dev);
 }
index 4fec43d212d0183ab38676471b57f9514ddf8b3d..bc3cb949c672e3c83e69977def54beb26e4a3d90 100644 (file)
@@ -285,35 +285,36 @@ free_acpi_obj:
        ACPI_FREE(out_obj);
 }
 
-static int tgl_core_generic_init(struct pmc_dev *pmcdev, int pch_tp)
-{
-       struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
-       int ret;
+static struct pmc_dev_info tgl_l_pmc_dev = {
+       .map = &tgl_reg_map,
+       .suspend = cnl_suspend,
+       .resume = cnl_resume,
+};
 
-       if (pch_tp == PCH_H)
-               pmc->map = &tgl_h_reg_map;
-       else
-               pmc->map = &tgl_reg_map;
+static struct pmc_dev_info tgl_pmc_dev = {
+       .map = &tgl_h_reg_map,
+       .suspend = cnl_suspend,
+       .resume = cnl_resume,
+};
 
-       pmcdev->suspend = cnl_suspend;
-       pmcdev->resume = cnl_resume;
+static int tgl_core_generic_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
+{
+       int ret;
 
-       ret = get_primary_reg_base(pmc);
+       ret = generic_core_init(pmcdev, pmc_dev_info);
        if (ret)
                return ret;
 
-       pmc_core_get_low_power_modes(pmcdev);
        pmc_core_get_tgl_lpm_reqs(pmcdev->pdev);
-
        return 0;
 }
 
 int tgl_l_core_init(struct pmc_dev *pmcdev)
 {
-       return tgl_core_generic_init(pmcdev, PCH_LP);
+       return tgl_core_generic_init(pmcdev, &tgl_l_pmc_dev);
 }
 
 int tgl_core_init(struct pmc_dev *pmcdev)
 {
-       return tgl_core_generic_init(pmcdev, PCH_H);
+       return tgl_core_generic_init(pmcdev, &tgl_pmc_dev);
 }