Add Arrow Lake U/H support
Subsystems (2)
Xi Pardee
maintainerv4 cover Add Arrow Lake U/H support
This patch series contains six patches to add Arrow Lake U/H support in intel_pmc_core driver.
The first five patches are preparation patches. The second patch creates a generic init function for all platforms. The fourth patch create a callback field that allows platform specific action to be done in generic init function. The fifth patch removes all per architecture init functions.
v4->v3:
- Remove all per architecture init functions and replace with pmc_dev_info structures in x86_cpu_id structure in core.c.
- Remove fixup field and add arch_specific field in pmc_dev_info structure.
- Move ssram init comment to be function comment.
- Remove ssram field in pmc_dev_info structure.
- Captilize PMC
- Remove PMC_IDX_SOC
v3->v2:
- Create a generic init function for all platforms
v2->v1:
- Create an info structure for platform variation information
- Make generic init function to static in tgl.c
- Fix typo
Xi Pardee (6):
platform/x86:intel/pmc: Make tgl_core_generic_init() static platform/x86/intel/pmc: Remove duplicate enum platform/x86:intel/pmc: Create generic_core_init() for all platforms platform/x86/intel/pmc: Create architecture specific callback platform/x86/intel/pmc: Remove init functions per architecture platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core
driver
drivers/platform/x86/intel/pmc/adl.c | 22 ++---- drivers/platform/x86/intel/pmc/arl.c | 78 +++++++++++-------- drivers/platform/x86/intel/pmc/cnp.c | 21 ++---- drivers/platform/x86/intel/pmc/core.c | 103 +++++++++++++++++++------- drivers/platform/x86/intel/pmc/core.h | 52 ++++++++++--- drivers/platform/x86/intel/pmc/icl.c | 18 +---- drivers/platform/x86/intel/pmc/lnl.c | 24 ++---- drivers/platform/x86/intel/pmc/mtl.c | 44 +++-------- drivers/platform/x86/intel/pmc/spt.c | 18 +---- drivers/platform/x86/intel/pmc/tgl.c | 40 ++++------ 10 files changed, 210 insertions(+), 210 deletions(-)
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH v4 1/6 platform/x86:intel/pmc: Make tgl_core_generic_init() static
Make tgl_core_generic_init() a static function as the function has no callers outside of tgl.c. Remove the prototype in core.h and reorder the code in tgl.c.
--- drivers/platform/x86/intel/pmc/core.h | 1 - drivers/platform/x86/intel/pmc/tgl.c | 22 +++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-)
drivers/platform/x86/intel/pmc/core.h +0 -1
@@ -597,7 +597,6 @@ int cnp_core_init(struct pmc_dev *pmcdev);int icl_core_init (struct pmc_dev *pmcdev);int tgl_core_init (struct pmc_dev *pmcdev);int tgl_l_core_init (struct pmc_dev *pmcdev); -int tgl_core_generic_init (struct pmc_dev *pmcdev,int pch_tp);int adl_core_init (struct pmc_dev *pmcdev);int mtl_core_init (struct pmc_dev *pmcdev);int arl_core_init (struct pmc_dev *pmcdev);
drivers/platform/x86/intel/pmc/tgl.c +11 -11
@@ -285,17 +285,7 @@ void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev)ACPI_FREE (out_obj); } -int tgl_l_core_init (struct pmc_dev *pmcdev) -{ -return tgl_core_generic_init (pmcdev,PCH_LP ); -} - -int tgl_core_init (struct pmc_dev *pmcdev) -{ -return tgl_core_generic_init (pmcdev,PCH_H ); -} - -int tgl_core_generic_init (struct pmc_dev *pmcdev,int pch_tp) +static int tgl_core_generic_init (struct pmc_dev *pmcdev,int pch_tp) {struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];int ret;
@@ -317,3 +307,13 @@ int tgl_core_generic_init(struct pmc_dev *pmcdev, int pch_tp)return 0 ; } + +int tgl_l_core_init (struct pmc_dev *pmcdev) +{ +return tgl_core_generic_init (pmcdev,PCH_LP ); +} + +int tgl_core_init (struct pmc_dev *pmcdev) +{ +return tgl_core_generic_init (pmcdev,PCH_H ); +}
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH v4 2/6 platform/x86/intel/pmc: Remove duplicate enum
In reply to Xi PardeeRemove duplicate enum PMC_IDX_SOC. PMC_IDX_SOC has the same value as PMC_IDX_MAIN. Replace it with PMC_IDX_MAIN to avoid confusion.
--- drivers/platform/x86/intel/pmc/arl.c | 2 +- drivers/platform/x86/intel/pmc/core.h | 1 - drivers/platform/x86/intel/pmc/lnl.c | 2 +- drivers/platform/x86/intel/pmc/mtl.c | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-)
drivers/platform/x86/intel/pmc/arl.c +1 -1
@@ -693,7 +693,7 @@ static int arl_resume(struct pmc_dev *pmcdev)int arl_core_init (struct pmc_dev *pmcdev) { -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];int ret;int func =0 ;bool ssram_init = true;
drivers/platform/x86/intel/pmc/core.h +0 -1
@@ -430,7 +430,6 @@ struct pmc_dev {enum pmc_index {PMC_IDX_MAIN , -PMC_IDX_SOC =PMC_IDX_MAIN ,PMC_IDX_IOE ,PMC_IDX_PCH ,PMC_IDX_MAX
drivers/platform/x86/intel/pmc/lnl.c +1 -1
@@ -553,7 +553,7 @@ static int lnl_resume(struct pmc_dev *pmcdev)int lnl_core_init (struct pmc_dev *pmcdev) {int ret; -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];lnl_d3_fixup ();
drivers/platform/x86/intel/pmc/mtl.c +1 -1
@@ -992,7 +992,7 @@ static int mtl_resume(struct pmc_dev *pmcdev)int mtl_core_init (struct pmc_dev *pmcdev) { -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];int ret;int func =2 ;bool ssram_init = true;
Signature · 1 line
2.43.0
Re: [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum
Quoted 4 lines · Xi Pardee
Remove duplicate enum
PMC_IDX_SOC.PMC_IDX_SOChas the same value asPMC_IDX_MAIN. Replace it withPMC_IDX_MAINto avoid confusion.Signed-off-by Xi Pardee <[email protected]>
Signature · 1 line
i.
Quoted 59 lines
--- drivers/platform/x86/intel/pmc/arl.c | 2 +- drivers/platform/x86/intel/pmc/core.h | 1 - drivers/platform/x86/intel/pmc/lnl.c | 2 +- drivers/platform/x86/intel/pmc/mtl.c | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-)drivers/platform/x86/intel/pmc/arl.c +1
-1@@ -693,7 +693,7 @@ static int arl_resume(struct pmc_dev *pmcdev)int arl_core_init (struct pmc_dev *pmcdev) { -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];int ret;int func =0 ;bool ssram_init = true;drivers/platform/x86/intel/pmc/core.h +0
-1@@ -430,7 +430,6 @@ struct pmc_dev {enum pmc_index {PMC_IDX_MAIN , -PMC_IDX_SOC =PMC_IDX_MAIN ,PMC_IDX_IOE ,PMC_IDX_PCH ,PMC_IDX_MAX drivers/platform/x86/intel/pmc/lnl.c +1
-1@@ -553,7 +553,7 @@ static int lnl_resume(struct pmc_dev *pmcdev)int lnl_core_init (struct pmc_dev *pmcdev) {int ret; -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];lnl_d3_fixup ();drivers/platform/x86/intel/pmc/mtl.c +1
-1@@ -992,7 +992,7 @@ static int mtl_resume(struct pmc_dev *pmcdev)int mtl_core_init (struct pmc_dev *pmcdev) { -struct pmc *pmc = pmcdev->pmcs[PMC_IDX_SOC ]; +struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN ];int ret;int func =2 ;bool ssram_init = true;
Xi Pardee
maintainerPATCH v4 3/6 platform/x86:intel/pmc: Create generic_core_init() for all platforms
In reply to Xi PardeeCreate 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.
--- drivers/platform/x86/intel/pmc/adl.c | 21 +++++-------- drivers/platform/x86/intel/pmc/arl.c | 43 ++++++++------------------- drivers/platform/x86/intel/pmc/cnp.c | 21 +++++-------- drivers/platform/x86/intel/pmc/core.c | 42 ++++++++++++++++++++++++++ drivers/platform/x86/intel/pmc/core.h | 22 ++++++++++++++ drivers/platform/x86/intel/pmc/icl.c | 17 ++++------- drivers/platform/x86/intel/pmc/lnl.c | 18 +++++------ drivers/platform/x86/intel/pmc/mtl.c | 42 ++++++++------------------ drivers/platform/x86/intel/pmc/spt.c | 17 ++++------- drivers/platform/x86/intel/pmc/tgl.c | 31 +++++++++---------- 10 files changed, 138 insertions(+), 136 deletions(-)
drivers/platform/x86/intel/pmc/adl.c +7 -14
@@ -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); }
drivers/platform/x86/intel/pmc/arl.c +13 -30
53 lines not on this page · raw message
drivers/platform/x86/intel/pmc/cnp.c +7 -14
@@ -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); }
drivers/platform/x86/intel/pmc/core.c +42 -0
48 lines not on this page · raw message
drivers/platform/x86/intel/pmc/core.h +22 -0
@@ -435,6 +435,27 @@ enum pmc_index { PMC_IDX_MAX }; +/** +* struct pmc_dev_info - Structure to keep PMC device info +* @func: Function number of the primary PMC +* @dmu_guid: DMU 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 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);
drivers/platform/x86/intel/pmc/icl.c +5 -12
@@ -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); }
drivers/platform/x86/intel/pmc/lnl.c +8 -10
@@ -550,22 +550,20 @@ 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); + ret =generic_core_init (pmcdev, &lnl_pmc_dev);if (ret)return ret; -pmc_core_get_low_power_modes (pmcdev); - +lnl_d3_fixup ();return 0 ; }
drivers/platform/x86/intel/pmc/mtl.c +13 -29
52 lines not on this page · raw message
drivers/platform/x86/intel/pmc/spt.c +5 -12
@@ -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); }
drivers/platform/x86/intel/pmc/tgl.c +16 -15
@@ -285,35 +285,36 @@ void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev)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); }
Signature · 1 line
2.43.0
Re: [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms
Quoted 201 lines · Xi Pardee
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 <[email protected]>--- drivers/platform/x86/intel/pmc/adl.c | 21 +++++-------- drivers/platform/x86/intel/pmc/arl.c | 43 ++++++++------------------- drivers/platform/x86/intel/pmc/cnp.c | 21 +++++-------- drivers/platform/x86/intel/pmc/core.c | 42 ++++++++++++++++++++++++++ drivers/platform/x86/intel/pmc/core.h | 22 ++++++++++++++ drivers/platform/x86/intel/pmc/icl.c | 17 ++++------- drivers/platform/x86/intel/pmc/lnl.c | 18 +++++------ drivers/platform/x86/intel/pmc/mtl.c | 42 ++++++++------------------ drivers/platform/x86/intel/pmc/spt.c | 17 ++++------- drivers/platform/x86/intel/pmc/tgl.c | 31 +++++++++---------- 10 files changed, 138 insertions(+), 136 deletions(-)drivers/platform/x86/intel/pmc/adl.c +7
-14@@ -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); }drivers/platform/x86/intel/pmc/arl.c +13
-30@@ -691,40 +691,23 @@ static int arl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } +static struct pmc_dev_info arl_pmc_dev = { + .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; - } + ret =generic_core_init (pmcdev, &arl_pmc_dev); +if (ret) +return ret; +arl_d3_fixup ();return 0 ; }drivers/platform/x86/intel/pmc/cnp.c +7
-14@@ -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); }drivers/platform/x86/intel/pmc/core.c +42
-0@@ -1344,6 +1344,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->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),drivers/platform/x86/intel/pmc/core.h +0
-0
drivers/platform/x86/intel/pmc/core.h enum pmc_index { · line 441
Quoted 7 lines
drivers/platform/x86/intel/pmc/core.h +4
-0@@ -435,6 +435,27 @@ enum pmc_index { PMC_IDX_MAX }; +/** +* struct pmc_dev_info - Structure to keep PMC device info +* @func: Function number of the primary PMC +* @dmu_guid: DMU GUID
Perhaps write DMU in open form as it's non-obvious acronym?
drivers/platform/x86/intel/pmc/core.h enum pmc_index { · line 451
Quoted 10 lines
drivers/platform/x86/intel/pmc/core.h +10
-0+* @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 func;
I'd consider renaming func to pci_func because name "func" associates to C functions.
Signature · 1 line
i.
Quoted 223 lines
drivers/platform/x86/intel/pmc/core.h +8
-0+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);drivers/platform/x86/intel/pmc/icl.c +5
-12@@ -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); }drivers/platform/x86/intel/pmc/lnl.c +8
-10@@ -550,22 +550,20 @@ 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); + ret =generic_core_init (pmcdev, &lnl_pmc_dev);if (ret)return ret; -pmc_core_get_low_power_modes (pmcdev); - +lnl_d3_fixup ();return 0 ; }drivers/platform/x86/intel/pmc/mtl.c +13
-29@@ -990,39 +990,23 @@ static int mtl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } +static struct pmc_dev_info mtl_pmc_dev = { + .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); + ret =generic_core_init (pmcdev, &mtl_pmc_dev); +if (ret) +return ret; +mtl_d3_fixup ();return 0 ; }drivers/platform/x86/intel/pmc/spt.c +5
-12@@ -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); }drivers/platform/x86/intel/pmc/tgl.c +16
-15@@ -285,35 +285,36 @@ void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev)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); }
Xi Pardee
maintainerPATCH v4 4/6 platform/x86/intel/pmc: Create architecture specific callback
In reply to Xi PardeeAdd architecture specific callback field in pmc_dev_info structure. Architecture specific action could be handled in this callback instead of per architecture init functions. Convert Arrow Lake, Lunar Lake, Meteor Lake and Tiger Lake platforms to use this field.
--- drivers/platform/x86/intel/pmc/arl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/core.c | 3 +++ drivers/platform/x86/intel/pmc/core.h | 7 +++++++ drivers/platform/x86/intel/pmc/lnl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/mtl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/tgl.c | 15 +++++---------- 6 files changed, 36 insertions(+), 34 deletions(-)
drivers/platform/x86/intel/pmc/arl.c +7 -8
@@ -698,16 +698,15 @@ static struct pmc_dev_info arl_pmc_dev = { .map = &arl_socs_reg_map, .suspend = cnl_suspend, .resume = arl_resume, + .arch_specific = arl_specific_init, }; -int arl_core_init (struct pmc_dev *pmcdev) +void arl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, &arl_pmc_dev); -if (ret) -return ret; -arl_d3_fixup (); -return 0 ; +} + +int arl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &arl_pmc_dev); }
drivers/platform/x86/intel/pmc/core.c +3 -0
@@ -1380,6 +1380,9 @@ int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)if (pmc_dev_info->dmu_guid)pmc_core_punit_pmt_init (pmcdev, pmc_dev_info->dmu_guid); +if (pmc_dev_info->arch_specific) + pmc_dev_info->arch_specific (pmcdev); +if (ssram)return pmc_core_ssram_get_lpm_reqs (pmcdev);
drivers/platform/x86/intel/pmc/core.h +7 -0
@@ -446,6 +446,7 @@ enum pmc_index {* specific attributes of the primary PMC * @suspend: Function to perform platform specific suspend * @resume: Function to perform platform specific resume +* @arch_specific: Function to perform platform specific init action */ struct pmc_dev_info {u8 func;
@@ -454,6 +455,7 @@ struct pmc_dev_info {const struct pmc_reg_map *map;void (*suspend)(struct pmc_dev *pmcdev);int (*resume)(struct pmc_dev *pmcdev); +void (*arch_specific)(struct pmc_dev *pmcdev); };extern const struct pmc_bit_map msr_map[];
@@ -623,6 +625,11 @@ int mtl_core_init(struct pmc_dev *pmcdev);int arl_core_init (struct pmc_dev *pmcdev);int lnl_core_init (struct pmc_dev *pmcdev); +void arl_specific_init (struct pmc_dev *pmcdev); +void mtl_specific_init (struct pmc_dev *pmcdev); +void lnl_specific_init (struct pmc_dev *pmcdev); +void tgl_specific_init (struct pmc_dev *pmcdev); +void cnl_suspend (struct pmc_dev *pmcdev);int cnl_resume (struct pmc_dev *pmcdev);
drivers/platform/x86/intel/pmc/lnl.c +7 -8
@@ -554,16 +554,15 @@ static struct pmc_dev_info lnl_pmc_dev = { .map = &lnl_socm_reg_map, .suspend = cnl_suspend, .resume = lnl_resume, + .arch_specific = lnl_specific_init, }; -int lnl_core_init (struct pmc_dev *pmcdev) +void lnl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, &lnl_pmc_dev); -if (ret) -return ret; -lnl_d3_fixup (); -return 0 ; +} + +int lnl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &lnl_pmc_dev); }
drivers/platform/x86/intel/pmc/mtl.c +7 -8
@@ -997,16 +997,15 @@ static struct pmc_dev_info mtl_pmc_dev = { .map = &mtl_socm_reg_map, .suspend = cnl_suspend, .resume = mtl_resume, + .arch_specific = mtl_specific_init, }; -int mtl_core_init (struct pmc_dev *pmcdev) +void mtl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, &mtl_pmc_dev); -if (ret) -return ret; -mtl_d3_fixup (); -return 0 ; +} + +int mtl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &mtl_pmc_dev); }
drivers/platform/x86/intel/pmc/tgl.c +5 -10
@@ -289,32 +289,27 @@ static struct pmc_dev_info tgl_l_pmc_dev = { .map = &tgl_reg_map, .suspend = cnl_suspend, .resume = cnl_resume, + .arch_specific = tgl_specific_init, };static struct pmc_dev_info tgl_pmc_dev = { .map = &tgl_h_reg_map, .suspend = cnl_suspend, .resume = cnl_resume, + .arch_specific = tgl_specific_init, }; -static int tgl_core_generic_init (struct pmc_dev *pmcdev,struct pmc_dev_info *pmc_dev_info) +void tgl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, pmc_dev_info); -if (ret) -return ret; -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, &tgl_l_pmc_dev); +return generic_core_init (pmcdev, &tgl_l_pmc_dev); }int tgl_core_init (struct pmc_dev *pmcdev) { -return tgl_core_generic_init (pmcdev, &tgl_pmc_dev); +return generic_core_init (pmcdev, &tgl_pmc_dev); }
Signature · 1 line
2.43.0
Ilpo Järvinen
maintainerRe: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
Quoted 28 lines · Xi Pardee
Add architecture specific callback field in
pmc_dev_infostructure. Architecture specific action could be handled in this callback instead of per architecture init functions. Convert Arrow Lake, Lunar Lake, Meteor Lake and Tiger Lake platforms to use this field.Signed-off-by Xi Pardee <[email protected]>--- drivers/platform/x86/intel/pmc/arl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/core.c | 3 +++ drivers/platform/x86/intel/pmc/core.h | 7 +++++++ drivers/platform/x86/intel/pmc/lnl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/mtl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/tgl.c | 15 +++++---------- 6 files changed, 36 insertions(+), 34 deletions(-)drivers/platform/x86/intel/pmc/arl.c +2
-1@@ -698,16 +698,15 @@ static struct pmc_dev_info arl_pmc_dev = { .map = &arl_socs_reg_map, .suspend = cnl_suspend, .resume = arl_resume, + .arch_specific = arl_specific_init, }; -int arl_core_init (struct pmc_dev *pmcdev) +void arl_specific_init (struct pmc_dev *pmcdev)
drivers/platform/x86/intel/pmc/arl.c static struct pmc_dev_info arl_pmc_dev = { · line 707
Quoted 10 lines
drivers/platform/x86/intel/pmc/arl.c +1
-7{ -int ret; - - ret =generic_core_init (pmcdev, &arl_pmc_dev); -if (ret) -return ret; -arl_d3_fixup (); -return 0 ; +}
As I tried to explain already earlier I think the older form is better here because it would allow arch specific things in any order:
void xx_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
{
int ret;
xx_pre_fixup();
ret = generic_core_init(pmcdev, pmc_dev_info);
if (ret)
return ret;
xx_post_fixup();
return 0;
}If you make it a callback, you have pick either pre or post but cannot do both with a single callback. My suggestion would also allow replacing generic_core_init() completely if needed in future.
Note how I pass the info parameter above to xx_init() so it can call into generic_core_init(). In the core, you'd do this to pick which init function to use:
if (pmc_dev_info->init) ret = pmc_dev_info->init(pmcdev, pmc_dev_info); else ret = generic_core_init(pmcdev, pmc_dev_info);
Signature · 1 line
i.
Quoted 150 lines
drivers/platform/x86/intel/pmc/arl.c +4
-0+ +int arl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &arl_pmc_dev); }drivers/platform/x86/intel/pmc/core.c +3
-0@@ -1380,6 +1380,9 @@ int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)if (pmc_dev_info->dmu_guid)pmc_core_punit_pmt_init (pmcdev, pmc_dev_info->dmu_guid); +if (pmc_dev_info->arch_specific) + pmc_dev_info->arch_specific (pmcdev); +if (ssram)return pmc_core_ssram_get_lpm_reqs (pmcdev);drivers/platform/x86/intel/pmc/core.h +7
-0@@ -446,6 +446,7 @@ enum pmc_index {* specific attributes of the primary PMC * @suspend: Function to perform platform specific suspend * @resume: Function to perform platform specific resume +* @arch_specific: Function to perform platform specific init action */ struct pmc_dev_info {u8 func;@@ -454,6 +455,7 @@ struct pmc_dev_info {const struct pmc_reg_map *map;void (*suspend)(struct pmc_dev *pmcdev);int (*resume)(struct pmc_dev *pmcdev); +void (*arch_specific)(struct pmc_dev *pmcdev); };extern const struct pmc_bit_map msr_map[];@@ -623,6 +625,11 @@ int mtl_core_init(struct pmc_dev *pmcdev);int arl_core_init (struct pmc_dev *pmcdev);int lnl_core_init (struct pmc_dev *pmcdev); +void arl_specific_init (struct pmc_dev *pmcdev); +void mtl_specific_init (struct pmc_dev *pmcdev); +void lnl_specific_init (struct pmc_dev *pmcdev); +void tgl_specific_init (struct pmc_dev *pmcdev); +void cnl_suspend (struct pmc_dev *pmcdev);int cnl_resume (struct pmc_dev *pmcdev);drivers/platform/x86/intel/pmc/lnl.c +7
-8@@ -554,16 +554,15 @@ static struct pmc_dev_info lnl_pmc_dev = { .map = &lnl_socm_reg_map, .suspend = cnl_suspend, .resume = lnl_resume, + .arch_specific = lnl_specific_init, }; -int lnl_core_init (struct pmc_dev *pmcdev) +void lnl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, &lnl_pmc_dev); -if (ret) -return ret; -lnl_d3_fixup (); -return 0 ; +} + +int lnl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &lnl_pmc_dev); }drivers/platform/x86/intel/pmc/mtl.c +7
-8@@ -997,16 +997,15 @@ static struct pmc_dev_info mtl_pmc_dev = { .map = &mtl_socm_reg_map, .suspend = cnl_suspend, .resume = mtl_resume, + .arch_specific = mtl_specific_init, }; -int mtl_core_init (struct pmc_dev *pmcdev) +void mtl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, &mtl_pmc_dev); -if (ret) -return ret; -mtl_d3_fixup (); -return 0 ; +} + +int mtl_core_init (struct pmc_dev *pmcdev) +{ +return generic_core_init (pmcdev, &mtl_pmc_dev); }drivers/platform/x86/intel/pmc/tgl.c +5
-10@@ -289,32 +289,27 @@ static struct pmc_dev_info tgl_l_pmc_dev = { .map = &tgl_reg_map, .suspend = cnl_suspend, .resume = cnl_resume, + .arch_specific = tgl_specific_init, };static struct pmc_dev_info tgl_pmc_dev = { .map = &tgl_h_reg_map, .suspend = cnl_suspend, .resume = cnl_resume, + .arch_specific = tgl_specific_init, }; -static int tgl_core_generic_init (struct pmc_dev *pmcdev,struct pmc_dev_info *pmc_dev_info) +void tgl_specific_init (struct pmc_dev *pmcdev) { -int ret; - - ret =generic_core_init (pmcdev, pmc_dev_info); -if (ret) -return ret; -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, &tgl_l_pmc_dev); +return generic_core_init (pmcdev, &tgl_l_pmc_dev); }int tgl_core_init (struct pmc_dev *pmcdev) { -return tgl_core_generic_init (pmcdev, &tgl_pmc_dev); +return generic_core_init (pmcdev, &tgl_pmc_dev); }
Xi Pardee
maintainerRe: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
Quoted 62 lines · Ilpo Järvinen
Quoted 28 lines · Xi Pardee
Add architecture specific callback field in
pmc_dev_infostructure. Architecture specific action could be handled in this callback instead of per architecture init functions. Convert Arrow Lake, Lunar Lake, Meteor Lake and Tiger Lake platforms to use this field.Signed-off-by Xi Pardee <[email protected]>--- drivers/platform/x86/intel/pmc/arl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/core.c | 3 +++ drivers/platform/x86/intel/pmc/core.h | 7 +++++++ drivers/platform/x86/intel/pmc/lnl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/mtl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/tgl.c | 15 +++++---------- 6 files changed, 36 insertions(+), 34 deletions(-)drivers/platform/x86/intel/pmc/arl.c +2
-1@@ -698,16 +698,15 @@ static struct pmc_dev_info arl_pmc_dev = { .map = &arl_socs_reg_map, .suspend = cnl_suspend, .resume = arl_resume, + .arch_specific = arl_specific_init, }; -int arl_core_init (struct pmc_dev *pmcdev) +void arl_specific_init (struct pmc_dev *pmcdev)drivers/platform/x86/intel/pmc/arl.c static struct pmc_dev_info arl_pmc_dev = { · line 707
Quoted 10 lines
drivers/platform/x86/intel/pmc/arl.c +1
-7{ -int ret; - - ret =generic_core_init (pmcdev, &arl_pmc_dev); -if (ret) -return ret; -arl_d3_fixup (); -return 0 ; +}As I tried to explain already earlier I think the older form is better here because it would allow arch specific things in any order:
void
xx_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info){ int ret; xx_pre_fixup(); ret = generic_core_init(pmcdev, pmc_dev_info); if (ret) return ret; xx_post_fixup(); return 0; }If you make it a callback, you have pick either pre or post but cannot do both with a single callback. My suggestion would also allow replacing
generic_core_init()completely if needed in future.
Quoted 8 lines
Note how I pass the info parameter above to
xx_init()so it can call intogeneric_core_init(). In the core, you'd do this to pick which init function to use:if (pmc_dev_info->init) ret = pmc_dev_info->init(pmcdev, pmc_dev_info); else ret = generic_core_init(pmcdev, pmc_dev_info);
Thanks for the feedback. I will change back to init function per architect in next version.
Xi
Xi Pardee
maintainerRe: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
Hi,
Thanks for the feedback. I will send out a new version on rc1 of 6.14 cycle.
Xi
Quoted 78 lines · Xi Pardee
Quoted 61 lines · Ilpo Järvinen
Quoted 27 lines · Xi Pardee
Add architecture specific callback field in
pmc_dev_infostructure. Architecture specific action could be handled in this callback instead of per architecture init functions. Convert Arrow Lake, Lunar Lake, Meteor Lake and Tiger Lake platforms to use this field.Signed-off-by Xi Pardee <[email protected]>---
drivers/platform/x86/intel/pmc/arl.c | 15 +++++++--------drivers/platform/x86/intel/pmc/core.c| 3 +++drivers/platform/x86/intel/pmc/core.h| 7 +++++++drivers/platform/x86/intel/pmc/lnl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/mtl.c | 15 +++++++-------- drivers/platform/x86/intel/pmc/tgl.c | 15 +++++---------- 6 files changed, 36 insertions(+), 34 deletions(-)drivers/platform/x86/intel/pmc/arl.c +2
-0@@ -698,16 +698,15 @@ static struct pmc_dev_info arl_pmc_dev = { .map = &arl_socs_reg_map, .suspend = cnl_suspend, .resume = arl_resume, + .arch_specific = arl_specific_init, }; -int arl_core_init(struct pmc_dev *pmcdev) +void arl_specific_init(struct pmc_dev *pmcdev)drivers/platform/x86/intel/pmc/arl.c static struct pmc_dev_info arl_pmc_dev = { · line 707
Quoted 10 lines
drivers/platform/x86/intel/pmc/arl.c +1
-7{ - int ret; - - ret = generic_core_init(pmcdev, &arl_pmc_dev); - if (ret) - return ret; - arl_d3_fixup(); - return 0; +}As I tried to explain already earlier I think the older form is better here because it would allow arch specific things in any order:
void
xx_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info){
int ret;xx_pre_fixup();
ret =
generic_core_init(pmcdev, pmc_dev_info); if (ret)
return ret;xx_post_fixup();
return 0;
}If you make it a callback, you have pick either pre or post but cannot do both with a single callback. My suggestion would also allow replacing
generic_core_init()completely if needed in future.Quoted 8 lines
Note how I pass the info parameter above to
xx_init()so it can call intogeneric_core_init(). In the core, you'd do this to pick which init function to use:if (
pmc_dev_info->init)
ret =pmc_dev_info->init(pmcdev, pmc_dev_info); else
ret =generic_core_init(pmcdev, pmc_dev_info);Thanks for the feedback. I will change back to init function per architect in next version.
Xi
Xi Pardee
maintainerPATCH v4 5/6 platform/x86/intel/pmc: Remove init functions per architecture
In reply to Xi PardeeRemove all init functions for each architecture. The architecture specific information for generic init function is stored in the corresponding pmc_dev_info structure and this structure is stored in X86_MATCH_VFM() instead of init function.
--- drivers/platform/x86/intel/pmc/adl.c | 7 +--- drivers/platform/x86/intel/pmc/arl.c | 7 +--- drivers/platform/x86/intel/pmc/cnp.c | 6 +-- drivers/platform/x86/intel/pmc/core.c | 56 +++++++++++++-------------- drivers/platform/x86/intel/pmc/core.h | 19 ++++----- drivers/platform/x86/intel/pmc/icl.c | 7 +--- drivers/platform/x86/intel/pmc/lnl.c | 7 +--- drivers/platform/x86/intel/pmc/mtl.c | 7 +--- drivers/platform/x86/intel/pmc/spt.c | 7 +--- drivers/platform/x86/intel/pmc/tgl.c | 14 +------ 10 files changed, 47 insertions(+), 90 deletions(-)
drivers/platform/x86/intel/pmc/adl.c +1 -6
@@ -311,13 +311,8 @@ 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 = { +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) -{ -return generic_core_init (pmcdev, &adl_pmc_dev); -}
drivers/platform/x86/intel/pmc/arl.c +1 -6
@@ -691,7 +691,7 @@ static int arl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } -static struct pmc_dev_info arl_pmc_dev = { +struct pmc_dev_info arl_pmc_dev = { .func =0 , .dmu_guid =ARL_PMT_DMU_GUID , .regmap_list = arl_pmc_info_list,
@@ -705,8 +705,3 @@ void arl_specific_init(struct pmc_dev *pmcdev) {arl_d3_fixup (); } - -int arl_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &arl_pmc_dev); -}
drivers/platform/x86/intel/pmc/cnp.c +1 -5
@@ -274,13 +274,9 @@ int cnl_resume(struct pmc_dev *pmcdev)return pmc_core_resume_common (pmcdev); } -static struct pmc_dev_info cnp_pmc_dev = { +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) -{ -return generic_core_init (pmcdev, &cnp_pmc_dev); -}
drivers/platform/x86/intel/pmc/core.c +28 -28
82 lines not on this page · raw message
drivers/platform/x86/intel/pmc/core.h +10 -9
@@ -615,15 +615,16 @@ 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); -int tgl_core_init (struct pmc_dev *pmcdev); -int tgl_l_core_init (struct pmc_dev *pmcdev); -int adl_core_init (struct pmc_dev *pmcdev); -int mtl_core_init (struct pmc_dev *pmcdev); -int arl_core_init (struct pmc_dev *pmcdev); -int lnl_core_init (struct pmc_dev *pmcdev); + +extern struct pmc_dev_info spt_pmc_dev; +extern struct pmc_dev_info cnp_pmc_dev; +extern struct pmc_dev_info icl_pmc_dev; +extern struct pmc_dev_info tgl_l_pmc_dev; +extern struct pmc_dev_info tgl_pmc_dev; +extern struct pmc_dev_info adl_pmc_dev; +extern struct pmc_dev_info mtl_pmc_dev; +extern struct pmc_dev_info arl_pmc_dev; +extern struct pmc_dev_info lnl_pmc_dev;void arl_specific_init (struct pmc_dev *pmcdev);void mtl_specific_init (struct pmc_dev *pmcdev);
drivers/platform/x86/intel/pmc/icl.c +1 -6
@@ -50,11 +50,6 @@ const struct pmc_reg_map icl_reg_map = { .etr3_offset = ETR3_OFFSET, }; -static struct pmc_dev_info icl_pmc_dev = { +struct pmc_dev_info icl_pmc_dev = { .map = &icl_reg_map, }; - -int icl_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &icl_pmc_dev); -}
drivers/platform/x86/intel/pmc/lnl.c +1 -6
@@ -550,7 +550,7 @@ static int lnl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } -static struct pmc_dev_info lnl_pmc_dev = { +struct pmc_dev_info lnl_pmc_dev = { .map = &lnl_socm_reg_map, .suspend = cnl_suspend, .resume = lnl_resume,
@@ -561,8 +561,3 @@ void lnl_specific_init(struct pmc_dev *pmcdev) {lnl_d3_fixup (); } - -int lnl_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &lnl_pmc_dev); -}
drivers/platform/x86/intel/pmc/mtl.c +1 -6
@@ -990,7 +990,7 @@ static int mtl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } -static struct pmc_dev_info mtl_pmc_dev = { +struct pmc_dev_info mtl_pmc_dev = { .func =2 , .dmu_guid =MTL_PMT_DMU_GUID , .regmap_list = mtl_pmc_info_list,
@@ -1004,8 +1004,3 @@ void mtl_specific_init(struct pmc_dev *pmcdev) {mtl_d3_fixup (); } - -int mtl_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &mtl_pmc_dev); -}
drivers/platform/x86/intel/pmc/spt.c +1 -6
@@ -134,11 +134,6 @@ const struct pmc_reg_map spt_reg_map = { .pm_vric1_offset = SPT_PMC_VRIC1_OFFSET, }; -static struct pmc_dev_info spt_pmc_dev = { +struct pmc_dev_info spt_pmc_dev = { .map = &spt_reg_map, }; - -int spt_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &spt_pmc_dev); -}
drivers/platform/x86/intel/pmc/tgl.c +2 -12
@@ -285,14 +285,14 @@ void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev)ACPI_FREE (out_obj); } -static struct pmc_dev_info tgl_l_pmc_dev = { +struct pmc_dev_info tgl_l_pmc_dev = { .map = &tgl_reg_map, .suspend = cnl_suspend, .resume = cnl_resume, .arch_specific = tgl_specific_init, }; -static struct pmc_dev_info tgl_pmc_dev = { +struct pmc_dev_info tgl_pmc_dev = { .map = &tgl_h_reg_map, .suspend = cnl_suspend, .resume = cnl_resume,
@@ -303,13 +303,3 @@ void tgl_specific_init(struct pmc_dev *pmcdev) {pmc_core_get_tgl_lpm_reqs (pmcdev->pdev); } - -int tgl_l_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &tgl_l_pmc_dev); -} - -int tgl_core_init (struct pmc_dev *pmcdev) -{ -return generic_core_init (pmcdev, &tgl_pmc_dev); -}
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH v4 6/6 platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core driver
In reply to Xi PardeeAdd Arrow Lake U and Arrow Lake H support in intel_pmc_core driver.
--- drivers/platform/x86/intel/pmc/arl.c | 37 +++++++++++++++++++++++++++ drivers/platform/x86/intel/pmc/core.c | 2 ++ drivers/platform/x86/intel/pmc/core.h | 2 ++ 3 files changed, 41 insertions(+)
drivers/platform/x86/intel/pmc/arl.c +37 -0
@@ -16,6 +16,7 @@#define IOEP_LPM_REQ_GUID 0x5077612#define SOCS_LPM_REQ_GUID 0x8478657#define PCHS_LPM_REQ_GUID 0x9684572 +#define SOCM_LPM_REQ_GUID 0x2625030static const u8 ARL_LPM_REG_INDEX [] = {0 ,4 ,5 ,6 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,20 };
@@ -650,6 +651,7 @@ const struct pmc_reg_map arl_pchs_reg_map = { .etr3_offset = ETR3_OFFSET, }; +#define PMC_DEVID_SOCM 0x777f#define PMC_DEVID_SOCS 0xae7f#define PMC_DEVID_IOEP 0x7ecf#define PMC_DEVID_PCHS 0x7f27
@@ -669,11 +671,17 @@ static struct pmc_info arl_pmc_info_list[] = { .devid = PMC_DEVID_PCHS, .map = &arl_pchs_reg_map, }, + { + .guid = SOCM_LPM_REQ_GUID, + .devid = PMC_DEVID_SOCM, + .map = &mtl_socm_reg_map, + }, {} };#define ARL_NPU_PCI_DEV 0xad1d#define ARL_GNA_PCI_DEV 0xae4c +#define ARL_H_GNA_PCI_DEV 0x774c/* * Set power state of select devices that do not have drivers to D3 * so that they do not block Package C entry.
@@ -684,6 +692,12 @@ static void arl_d3_fixup(void)pmc_core_set_device_d3 (ARL_GNA_PCI_DEV ); } +static void arl_h_d3_fixup (void ) +{ +pmc_core_set_device_d3 (ARL_NPU_PCI_DEV ); +pmc_core_set_device_d3 (ARL_H_GNA_PCI_DEV ); +} +static int arl_resume (struct pmc_dev *pmcdev) {arl_d3_fixup ();
@@ -691,6 +705,13 @@ static int arl_resume(struct pmc_dev *pmcdev)return cnl_resume (pmcdev); } +static int arl_h_resume (struct pmc_dev *pmcdev) +{ +arl_h_d3_fixup (); + +return cnl_resume (pmcdev); +} +struct pmc_dev_info arl_pmc_dev = { .func =0 , .dmu_guid =ARL_PMT_DMU_GUID ,
@@ -701,7 +722,23 @@ struct pmc_dev_info arl_pmc_dev = { .arch_specific = arl_specific_init, }; +struct pmc_dev_info arl_h_pmc_dev = { + .func =2 , + .dmu_guid =ARL_PMT_DMU_GUID , + .regmap_list = arl_pmc_info_list, + .map = &mtl_socm_reg_map, + .suspend = cnl_suspend, + .resume = arl_h_resume, + .arch_specific = arl_h_specific_init, +}; +void arl_specific_init (struct pmc_dev *pmcdev) {arl_d3_fixup (); } + +void arl_h_specific_init (struct pmc_dev *pmcdev) +{ +arl_h_d3_fixup (); +} +
drivers/platform/x86/intel/pmc/core.c +2 -0
@@ -1412,6 +1412,8 @@ static const struct x86_cpu_id intel_pmc_core_ids[] = {X86_MATCH_VFM (INTEL_RAPTORLAKE_S , &adl_pmc_dev),X86_MATCH_VFM (INTEL_METEORLAKE_L , &mtl_pmc_dev),X86_MATCH_VFM (INTEL_ARROWLAKE , &arl_pmc_dev), +X86_MATCH_VFM (INTEL_ARROWLAKE_H , &arl_h_pmc_dev), +X86_MATCH_VFM (INTEL_ARROWLAKE_U , &arl_h_pmc_dev), X86_MATCH_VFM(INTEL_LUNARLAKE_M, &lnl_pmc_dev), {} };
drivers/platform/x86/intel/pmc/core.h +2 -0
@@ -624,9 +624,11 @@ extern struct pmc_dev_info tgl_pmc_dev;extern struct pmc_dev_info adl_pmc_dev;extern struct pmc_dev_info mtl_pmc_dev;extern struct pmc_dev_info arl_pmc_dev; +extern struct pmc_dev_info arl_h_pmc_dev;extern struct pmc_dev_info lnl_pmc_dev;void arl_specific_init (struct pmc_dev *pmcdev); +void arl_h_specific_init (struct pmc_dev *pmcdev);void mtl_specific_init (struct pmc_dev *pmcdev);void lnl_specific_init (struct pmc_dev *pmcdev);void tgl_specific_init (struct pmc_dev *pmcdev);
Signature · 1 line
2.43.0