platform/x86/intel/pmc: Remove simple init functions
Remove simple init functions to avoid duplicate code. Store init function performing architecture specific action in the corresponding pmc_dev_info structure. Replace init function with pmc_dev_info structure in X86_MATCH_VFM() of core.c. Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com> Link: https://lore.kernel.org/r/20250207225615.401235-5-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>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -691,17 +691,18 @@ static int arl_resume(struct pmc_dev *pmcdev)
|
||||
return cnl_resume(pmcdev);
|
||||
}
|
||||
|
||||
static struct pmc_dev_info arl_pmc_dev = {
|
||||
static int arl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
{
|
||||
arl_d3_fixup();
|
||||
return generic_core_init(pmcdev, pmc_dev_info);
|
||||
}
|
||||
|
||||
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,
|
||||
.init = arl_core_init,
|
||||
};
|
||||
|
||||
int arl_core_init(struct pmc_dev *pmcdev)
|
||||
{
|
||||
arl_d3_fixup();
|
||||
return generic_core_init(pmcdev, &arl_pmc_dev);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -1388,29 +1388,29 @@ int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
}
|
||||
|
||||
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),
|
||||
X86_MATCH_VFM(INTEL_KABYLAKE_L, spt_core_init),
|
||||
X86_MATCH_VFM(INTEL_KABYLAKE, spt_core_init),
|
||||
X86_MATCH_VFM(INTEL_CANNONLAKE_L, cnp_core_init),
|
||||
X86_MATCH_VFM(INTEL_ICELAKE_L, icl_core_init),
|
||||
X86_MATCH_VFM(INTEL_ICELAKE_NNPI, icl_core_init),
|
||||
X86_MATCH_VFM(INTEL_COMETLAKE, cnp_core_init),
|
||||
X86_MATCH_VFM(INTEL_COMETLAKE_L, cnp_core_init),
|
||||
X86_MATCH_VFM(INTEL_TIGERLAKE_L, tgl_l_core_init),
|
||||
X86_MATCH_VFM(INTEL_TIGERLAKE, tgl_core_init),
|
||||
X86_MATCH_VFM(INTEL_ATOM_TREMONT, tgl_l_core_init),
|
||||
X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, icl_core_init),
|
||||
X86_MATCH_VFM(INTEL_ROCKETLAKE, tgl_core_init),
|
||||
X86_MATCH_VFM(INTEL_ALDERLAKE_L, tgl_l_core_init),
|
||||
X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, tgl_l_core_init),
|
||||
X86_MATCH_VFM(INTEL_ALDERLAKE, adl_core_init),
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, tgl_l_core_init),
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE, adl_core_init),
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE_S, adl_core_init),
|
||||
X86_MATCH_VFM(INTEL_METEORLAKE_L, mtl_core_init),
|
||||
X86_MATCH_VFM(INTEL_ARROWLAKE, arl_core_init),
|
||||
X86_MATCH_VFM(INTEL_LUNARLAKE_M, lnl_core_init),
|
||||
X86_MATCH_VFM(INTEL_SKYLAKE_L, &spt_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_SKYLAKE, &spt_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_KABYLAKE_L, &spt_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_KABYLAKE, &spt_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_CANNONLAKE_L, &cnp_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ICELAKE_L, &icl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ICELAKE_NNPI, &icl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_COMETLAKE, &cnp_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_COMETLAKE_L, &cnp_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_TIGERLAKE_L, &tgl_l_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_TIGERLAKE, &tgl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ATOM_TREMONT, &tgl_l_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ATOM_TREMONT_L, &icl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ROCKETLAKE, &tgl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ALDERLAKE_L, &tgl_l_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ATOM_GRACEMONT, &tgl_l_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_ALDERLAKE, &adl_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, &tgl_l_pmc_dev),
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE, &adl_pmc_dev),
|
||||
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_LUNARLAKE_M, &lnl_pmc_dev),
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -1494,7 +1494,7 @@ static int pmc_core_probe(struct platform_device *pdev)
|
||||
static bool device_initialized;
|
||||
struct pmc_dev *pmcdev;
|
||||
const struct x86_cpu_id *cpu_id;
|
||||
int (*core_init)(struct pmc_dev *pmcdev);
|
||||
struct pmc_dev_info *pmc_dev_info;
|
||||
struct pmc *primary_pmc;
|
||||
int ret;
|
||||
|
||||
@@ -1514,7 +1514,7 @@ static int pmc_core_probe(struct platform_device *pdev)
|
||||
if (!cpu_id)
|
||||
return -ENODEV;
|
||||
|
||||
core_init = (int (*)(struct pmc_dev *))cpu_id->driver_data;
|
||||
pmc_dev_info = (struct pmc_dev_info *)cpu_id->driver_data;
|
||||
|
||||
/* Primary PMC */
|
||||
primary_pmc = devm_kzalloc(&pdev->dev, sizeof(*primary_pmc), GFP_KERNEL);
|
||||
@@ -1536,11 +1536,16 @@ static int pmc_core_probe(struct platform_device *pdev)
|
||||
* Sunrisepoint PCH regmap can't be used. Use Cannon Lake PCH regmap
|
||||
* in this case.
|
||||
*/
|
||||
if (core_init == spt_core_init && !pci_dev_present(pmc_pci_ids))
|
||||
core_init = cnp_core_init;
|
||||
if (pmc_dev_info == &spt_pmc_dev && !pci_dev_present(pmc_pci_ids))
|
||||
pmc_dev_info = &cnp_pmc_dev;
|
||||
|
||||
mutex_init(&pmcdev->lock);
|
||||
ret = core_init(pmcdev);
|
||||
|
||||
if (pmc_dev_info->init)
|
||||
ret = pmc_dev_info->init(pmcdev, pmc_dev_info);
|
||||
else
|
||||
ret = generic_core_init(pmcdev, pmc_dev_info);
|
||||
|
||||
if (ret) {
|
||||
pmc_core_clean_structure(pdev);
|
||||
return ret;
|
||||
|
||||
@@ -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
|
||||
* @init: Function to perform platform specific init action
|
||||
*/
|
||||
struct pmc_dev_info {
|
||||
u8 pci_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);
|
||||
int (*init)(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info);
|
||||
};
|
||||
|
||||
extern const struct pmc_bit_map msr_map[];
|
||||
@@ -613,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 cnl_suspend(struct pmc_dev *pmcdev);
|
||||
int cnl_resume(struct pmc_dev *pmcdev);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -550,14 +550,15 @@ static int lnl_resume(struct pmc_dev *pmcdev)
|
||||
return cnl_resume(pmcdev);
|
||||
}
|
||||
|
||||
static struct pmc_dev_info lnl_pmc_dev = {
|
||||
static int lnl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
{
|
||||
lnl_d3_fixup();
|
||||
return generic_core_init(pmcdev, pmc_dev_info);
|
||||
}
|
||||
|
||||
struct pmc_dev_info lnl_pmc_dev = {
|
||||
.map = &lnl_socm_reg_map,
|
||||
.suspend = cnl_suspend,
|
||||
.resume = lnl_resume,
|
||||
.init = lnl_core_init,
|
||||
};
|
||||
|
||||
int lnl_core_init(struct pmc_dev *pmcdev)
|
||||
{
|
||||
lnl_d3_fixup();
|
||||
return generic_core_init(pmcdev, &lnl_pmc_dev);
|
||||
}
|
||||
|
||||
@@ -990,17 +990,18 @@ static int mtl_resume(struct pmc_dev *pmcdev)
|
||||
return cnl_resume(pmcdev);
|
||||
}
|
||||
|
||||
static struct pmc_dev_info mtl_pmc_dev = {
|
||||
static int mtl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
{
|
||||
mtl_d3_fixup();
|
||||
return generic_core_init(pmcdev, pmc_dev_info);
|
||||
}
|
||||
|
||||
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,
|
||||
.init = mtl_core_init,
|
||||
};
|
||||
|
||||
int mtl_core_init(struct pmc_dev *pmcdev)
|
||||
{
|
||||
mtl_d3_fixup();
|
||||
return generic_core_init(pmcdev, &mtl_pmc_dev);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -285,19 +285,7 @@ free_acpi_obj:
|
||||
ACPI_FREE(out_obj);
|
||||
}
|
||||
|
||||
static struct pmc_dev_info tgl_l_pmc_dev = {
|
||||
.map = &tgl_reg_map,
|
||||
.suspend = cnl_suspend,
|
||||
.resume = cnl_resume,
|
||||
};
|
||||
|
||||
static struct pmc_dev_info tgl_pmc_dev = {
|
||||
.map = &tgl_h_reg_map,
|
||||
.suspend = cnl_suspend,
|
||||
.resume = cnl_resume,
|
||||
};
|
||||
|
||||
static int tgl_core_generic_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
static int tgl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -309,12 +297,16 @@ static int tgl_core_generic_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pm
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tgl_l_core_init(struct pmc_dev *pmcdev)
|
||||
{
|
||||
return tgl_core_generic_init(pmcdev, &tgl_l_pmc_dev);
|
||||
}
|
||||
struct pmc_dev_info tgl_l_pmc_dev = {
|
||||
.map = &tgl_reg_map,
|
||||
.suspend = cnl_suspend,
|
||||
.resume = cnl_resume,
|
||||
.init = tgl_core_init,
|
||||
};
|
||||
|
||||
int tgl_core_init(struct pmc_dev *pmcdev)
|
||||
{
|
||||
return tgl_core_generic_init(pmcdev, &tgl_pmc_dev);
|
||||
}
|
||||
struct pmc_dev_info tgl_pmc_dev = {
|
||||
.map = &tgl_h_reg_map,
|
||||
.suspend = cnl_suspend,
|
||||
.resume = cnl_resume,
|
||||
.init = tgl_core_init,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user