linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/6] Add Arrow Lake U/H support
@ 2025-01-10  0:26 Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 1/6] platform/x86:intel/pmc: Make tgl_core_generic_init() static Xi Pardee
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

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(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v4 1/6] platform/x86:intel/pmc: Make tgl_core_generic_init() static
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum Xi Pardee
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

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.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
 drivers/platform/x86/intel/pmc/core.h |  1 -
 drivers/platform/x86/intel/pmc/tgl.c  | 22 +++++++++++-----------
 2 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index b9d3291d0bf2c..a1886d8e1ef3e 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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);
diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
index e0580de180773..4fec43d212d01 100644
--- a/drivers/platform/x86/intel/pmc/tgl.c
+++ b/drivers/platform/x86/intel/pmc/tgl.c
@@ -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);
+}
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 1/6] platform/x86:intel/pmc: Make tgl_core_generic_init() static Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  2025-01-10 11:30   ` Ilpo Järvinen
  2025-01-10  0:26 ` [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms Xi Pardee
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

Remove 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.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
---
 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(-)

diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
index 05dec4f5019f3..ad976cc83ecae 100644
--- a/drivers/platform/x86/intel/pmc/arl.c
+++ b/drivers/platform/x86/intel/pmc/arl.c
@@ -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;
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index a1886d8e1ef3e..a0f6cc427ddca 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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
diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
index be029f12cdf40..09b13df90d685 100644
--- a/drivers/platform/x86/intel/pmc/lnl.c
+++ b/drivers/platform/x86/intel/pmc/lnl.c
@@ -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();
 
diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
index 02949fed76e91..07687a3e436d5 100644
--- a/drivers/platform/x86/intel/pmc/mtl.c
+++ b/drivers/platform/x86/intel/pmc/mtl.c
@@ -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;
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 1/6] platform/x86:intel/pmc: Make tgl_core_generic_init() static Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  2025-01-10 11:38   ` Ilpo Järvinen
  2025-01-10  0:26 ` [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback Xi Pardee
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

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>
---
 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(-)

diff --git a/drivers/platform/x86/intel/pmc/adl.c b/drivers/platform/x86/intel/pmc/adl.c
index e7878558fd909..ac37f4ece9c70 100644
--- a/drivers/platform/x86/intel/pmc/adl.c
+++ b/drivers/platform/x86/intel/pmc/adl.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
index ad976cc83ecae..dedf752237ca0 100644
--- a/drivers/platform/x86/intel/pmc/arl.c
+++ b/drivers/platform/x86/intel/pmc/arl.c
@@ -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;
 }
diff --git a/drivers/platform/x86/intel/pmc/cnp.c b/drivers/platform/x86/intel/pmc/cnp.c
index fc5193fdf8a88..6d268058e40b9 100644
--- a/drivers/platform/x86/intel/pmc/cnp.c
+++ b/drivers/platform/x86/intel/pmc/cnp.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
index 3e7f99ac8c941..64b1c15e0c81d 100644
--- a/drivers/platform/x86/intel/pmc/core.c
+++ b/drivers/platform/x86/intel/pmc/core.c
@@ -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),
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index a0f6cc427ddca..80adae582ce5f 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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);
diff --git a/drivers/platform/x86/intel/pmc/icl.c b/drivers/platform/x86/intel/pmc/icl.c
index 71b0fd6cb7d84..0e4565dea0452 100644
--- a/drivers/platform/x86/intel/pmc/icl.c
+++ b/drivers/platform/x86/intel/pmc/icl.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
index 09b13df90d685..2e6d4fddd2858 100644
--- a/drivers/platform/x86/intel/pmc/lnl.c
+++ b/drivers/platform/x86/intel/pmc/lnl.c
@@ -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;
 }
diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
index 07687a3e436d5..3bc0b64d19141 100644
--- a/drivers/platform/x86/intel/pmc/mtl.c
+++ b/drivers/platform/x86/intel/pmc/mtl.c
@@ -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;
 }
diff --git a/drivers/platform/x86/intel/pmc/spt.c b/drivers/platform/x86/intel/pmc/spt.c
index ab993a69e33ee..ab5f66fcb0c30 100644
--- a/drivers/platform/x86/intel/pmc/spt.c
+++ b/drivers/platform/x86/intel/pmc/spt.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
index 4fec43d212d01..bc3cb949c672e 100644
--- a/drivers/platform/x86/intel/pmc/tgl.c
+++ b/drivers/platform/x86/intel/pmc/tgl.c
@@ -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);
 }
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
                   ` (2 preceding siblings ...)
  2025-01-10  0:26 ` [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  2025-01-10 11:50   ` Ilpo Järvinen
  2025-01-10  0:26 ` [PATCH v4 5/6] platform/x86/intel/pmc: Remove init functions per architecture Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 6/6] platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core driver Xi Pardee
  5 siblings, 1 reply; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

Add 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.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
---
 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(-)

diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
index dedf752237ca0..9ff90d32a635f 100644
--- a/drivers/platform/x86/intel/pmc/arl.c
+++ b/drivers/platform/x86/intel/pmc/arl.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
index 64b1c15e0c81d..45efe0e948831 100644
--- a/drivers/platform/x86/intel/pmc/core.c
+++ b/drivers/platform/x86/intel/pmc/core.c
@@ -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);
 
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index 80adae582ce5f..9430e4209ce97 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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);
 
diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
index 2e6d4fddd2858..957d7a9062397 100644
--- a/drivers/platform/x86/intel/pmc/lnl.c
+++ b/drivers/platform/x86/intel/pmc/lnl.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
index 3bc0b64d19141..2a7d79dd37d6a 100644
--- a/drivers/platform/x86/intel/pmc/mtl.c
+++ b/drivers/platform/x86/intel/pmc/mtl.c
@@ -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);
 }
diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
index bc3cb949c672e..29a9109afc782 100644
--- a/drivers/platform/x86/intel/pmc/tgl.c
+++ b/drivers/platform/x86/intel/pmc/tgl.c
@@ -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);
 }
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 5/6] platform/x86/intel/pmc: Remove init functions per architecture
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
                   ` (3 preceding siblings ...)
  2025-01-10  0:26 ` [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  2025-01-10  0:26 ` [PATCH v4 6/6] platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core driver Xi Pardee
  5 siblings, 0 replies; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

Remove 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.

Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
---
 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(-)

diff --git a/drivers/platform/x86/intel/pmc/adl.c b/drivers/platform/x86/intel/pmc/adl.c
index ac37f4ece9c70..de361a316d51d 100644
--- a/drivers/platform/x86/intel/pmc/adl.c
+++ b/drivers/platform/x86/intel/pmc/adl.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
index 9ff90d32a635f..a55381640c23b 100644
--- a/drivers/platform/x86/intel/pmc/arl.c
+++ b/drivers/platform/x86/intel/pmc/arl.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/cnp.c b/drivers/platform/x86/intel/pmc/cnp.c
index 6d268058e40b9..f147ec51c7fd0 100644
--- a/drivers/platform/x86/intel/pmc/cnp.c
+++ b/drivers/platform/x86/intel/pmc/cnp.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
index 45efe0e948831..d2ce52366b1c4 100644
--- a/drivers/platform/x86/intel/pmc/core.c
+++ b/drivers/platform/x86/intel/pmc/core.c
@@ -1390,29 +1390,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),
 	{}
 };
 
@@ -1496,7 +1496,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;
 
@@ -1516,7 +1516,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);
@@ -1538,11 +1538,11 @@ 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);
+	ret = generic_core_init(pmcdev, pmc_dev_info);
 	if (ret) {
 		pmc_core_clean_structure(pdev);
 		return ret;
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index 9430e4209ce97..771f06b193c66 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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);
diff --git a/drivers/platform/x86/intel/pmc/icl.c b/drivers/platform/x86/intel/pmc/icl.c
index 0e4565dea0452..6952c8ef58a01 100644
--- a/drivers/platform/x86/intel/pmc/icl.c
+++ b/drivers/platform/x86/intel/pmc/icl.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
index 957d7a9062397..bbe707c37703f 100644
--- a/drivers/platform/x86/intel/pmc/lnl.c
+++ b/drivers/platform/x86/intel/pmc/lnl.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
index 2a7d79dd37d6a..fe10726962733 100644
--- a/drivers/platform/x86/intel/pmc/mtl.c
+++ b/drivers/platform/x86/intel/pmc/mtl.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/spt.c b/drivers/platform/x86/intel/pmc/spt.c
index ab5f66fcb0c30..956b2ec1c7510 100644
--- a/drivers/platform/x86/intel/pmc/spt.c
+++ b/drivers/platform/x86/intel/pmc/spt.c
@@ -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);
-}
diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
index 29a9109afc782..c2f935cb29a7a 100644
--- a/drivers/platform/x86/intel/pmc/tgl.c
+++ b/drivers/platform/x86/intel/pmc/tgl.c
@@ -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);
-}
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v4 6/6] platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core driver
  2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
                   ` (4 preceding siblings ...)
  2025-01-10  0:26 ` [PATCH v4 5/6] platform/x86/intel/pmc: Remove init functions per architecture Xi Pardee
@ 2025-01-10  0:26 ` Xi Pardee
  5 siblings, 0 replies; 12+ messages in thread
From: Xi Pardee @ 2025-01-10  0:26 UTC (permalink / raw)
  To: xi.pardee, rajvi0912, irenic.rajneesh, david.e.box, hdegoede,
	ilpo.jarvinen, platform-driver-x86, linux-kernel, linux-pm

Add Arrow Lake U and Arrow Lake H support in intel_pmc_core driver.

Signed-off-by: Rajvi Jingar <rajvi.jingar@linux.intel.com>
Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
---
 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(+)

diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
index a55381640c23b..49b35aaa09d4b 100644
--- a/drivers/platform/x86/intel/pmc/arl.c
+++ b/drivers/platform/x86/intel/pmc/arl.c
@@ -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	0x2625030
 
 static 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();
+}
+
diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
index d2ce52366b1c4..ce4308dccc773 100644
--- a/drivers/platform/x86/intel/pmc/core.c
+++ b/drivers/platform/x86/intel/pmc/core.c
@@ -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),
 	{}
 };
diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
index 771f06b193c66..78a4f429d3c1c 100644
--- a/drivers/platform/x86/intel/pmc/core.h
+++ b/drivers/platform/x86/intel/pmc/core.h
@@ -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);
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum
  2025-01-10  0:26 ` [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum Xi Pardee
@ 2025-01-10 11:30   ` Ilpo Järvinen
  0 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2025-01-10 11:30 UTC (permalink / raw)
  To: Xi Pardee
  Cc: rajvi0912, irenic.rajneesh, david.e.box, Hans de Goede,
	platform-driver-x86, LKML, linux-pm

[-- Attachment #1: Type: text/plain, Size: 2511 bytes --]

On Thu, 9 Jan 2025, Xi Pardee wrote:

> Remove 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.
> 
> Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

-- 
 i.

> ---
>  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(-)
> 
> diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
> index 05dec4f5019f3..ad976cc83ecae 100644
> --- a/drivers/platform/x86/intel/pmc/arl.c
> +++ b/drivers/platform/x86/intel/pmc/arl.c
> @@ -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;
> diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
> index a1886d8e1ef3e..a0f6cc427ddca 100644
> --- a/drivers/platform/x86/intel/pmc/core.h
> +++ b/drivers/platform/x86/intel/pmc/core.h
> @@ -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
> diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
> index be029f12cdf40..09b13df90d685 100644
> --- a/drivers/platform/x86/intel/pmc/lnl.c
> +++ b/drivers/platform/x86/intel/pmc/lnl.c
> @@ -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();
>  
> diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
> index 02949fed76e91..07687a3e436d5 100644
> --- a/drivers/platform/x86/intel/pmc/mtl.c
> +++ b/drivers/platform/x86/intel/pmc/mtl.c
> @@ -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;
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms
  2025-01-10  0:26 ` [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms Xi Pardee
@ 2025-01-10 11:38   ` Ilpo Järvinen
  0 siblings, 0 replies; 12+ messages in thread
From: Ilpo Järvinen @ 2025-01-10 11:38 UTC (permalink / raw)
  To: Xi Pardee
  Cc: rajvi0912, irenic.rajneesh, david.e.box, Hans de Goede,
	platform-driver-x86, LKML, linux-pm

[-- Attachment #1: Type: text/plain, Size: 13898 bytes --]

On Thu, 9 Jan 2025, Xi Pardee wrote:

> 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>
> ---
>  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(-)
> 
> diff --git a/drivers/platform/x86/intel/pmc/adl.c b/drivers/platform/x86/intel/pmc/adl.c
> index e7878558fd909..ac37f4ece9c70 100644
> --- a/drivers/platform/x86/intel/pmc/adl.c
> +++ b/drivers/platform/x86/intel/pmc/adl.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
> index ad976cc83ecae..dedf752237ca0 100644
> --- a/drivers/platform/x86/intel/pmc/arl.c
> +++ b/drivers/platform/x86/intel/pmc/arl.c
> @@ -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;
>  }
> diff --git a/drivers/platform/x86/intel/pmc/cnp.c b/drivers/platform/x86/intel/pmc/cnp.c
> index fc5193fdf8a88..6d268058e40b9 100644
> --- a/drivers/platform/x86/intel/pmc/cnp.c
> +++ b/drivers/platform/x86/intel/pmc/cnp.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
> index 3e7f99ac8c941..64b1c15e0c81d 100644
> --- a/drivers/platform/x86/intel/pmc/core.c
> +++ b/drivers/platform/x86/intel/pmc/core.c
> @@ -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),
> diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
> index a0f6cc427ddca..80adae582ce5f 100644
> --- a/drivers/platform/x86/intel/pmc/core.h
> +++ b/drivers/platform/x86/intel/pmc/core.h
> @@ -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?

> + * @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.

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>

-- 
 i.


> +	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);
> diff --git a/drivers/platform/x86/intel/pmc/icl.c b/drivers/platform/x86/intel/pmc/icl.c
> index 71b0fd6cb7d84..0e4565dea0452 100644
> --- a/drivers/platform/x86/intel/pmc/icl.c
> +++ b/drivers/platform/x86/intel/pmc/icl.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
> index 09b13df90d685..2e6d4fddd2858 100644
> --- a/drivers/platform/x86/intel/pmc/lnl.c
> +++ b/drivers/platform/x86/intel/pmc/lnl.c
> @@ -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;
>  }
> diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
> index 07687a3e436d5..3bc0b64d19141 100644
> --- a/drivers/platform/x86/intel/pmc/mtl.c
> +++ b/drivers/platform/x86/intel/pmc/mtl.c
> @@ -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;
>  }
> diff --git a/drivers/platform/x86/intel/pmc/spt.c b/drivers/platform/x86/intel/pmc/spt.c
> index ab993a69e33ee..ab5f66fcb0c30 100644
> --- a/drivers/platform/x86/intel/pmc/spt.c
> +++ b/drivers/platform/x86/intel/pmc/spt.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
> index 4fec43d212d01..bc3cb949c672e 100644
> --- a/drivers/platform/x86/intel/pmc/tgl.c
> +++ b/drivers/platform/x86/intel/pmc/tgl.c
> @@ -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);
>  }
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
  2025-01-10  0:26 ` [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback Xi Pardee
@ 2025-01-10 11:50   ` Ilpo Järvinen
  2025-01-14 16:39     ` Xi Pardee
  0 siblings, 1 reply; 12+ messages in thread
From: Ilpo Järvinen @ 2025-01-10 11:50 UTC (permalink / raw)
  To: Xi Pardee
  Cc: rajvi0912, irenic.rajneesh, david.e.box, Hans de Goede,
	platform-driver-x86, LKML, linux-pm

On Thu, 9 Jan 2025, Xi Pardee wrote:

> Add 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.
> 
> Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
> ---
>  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(-)
> 
> diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
> index dedf752237ca0..9ff90d32a635f 100644
> --- a/drivers/platform/x86/intel/pmc/arl.c
> +++ b/drivers/platform/x86/intel/pmc/arl.c
> @@ -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;
> +}

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);

-- 
 i.

> +
> +int arl_core_init(struct pmc_dev *pmcdev)
> +{
> +	return generic_core_init(pmcdev, &arl_pmc_dev);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/core.c b/drivers/platform/x86/intel/pmc/core.c
> index 64b1c15e0c81d..45efe0e948831 100644
> --- a/drivers/platform/x86/intel/pmc/core.c
> +++ b/drivers/platform/x86/intel/pmc/core.c
> @@ -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);
>  
> diff --git a/drivers/platform/x86/intel/pmc/core.h b/drivers/platform/x86/intel/pmc/core.h
> index 80adae582ce5f..9430e4209ce97 100644
> --- a/drivers/platform/x86/intel/pmc/core.h
> +++ b/drivers/platform/x86/intel/pmc/core.h
> @@ -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);
>  
> diff --git a/drivers/platform/x86/intel/pmc/lnl.c b/drivers/platform/x86/intel/pmc/lnl.c
> index 2e6d4fddd2858..957d7a9062397 100644
> --- a/drivers/platform/x86/intel/pmc/lnl.c
> +++ b/drivers/platform/x86/intel/pmc/lnl.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/mtl.c b/drivers/platform/x86/intel/pmc/mtl.c
> index 3bc0b64d19141..2a7d79dd37d6a 100644
> --- a/drivers/platform/x86/intel/pmc/mtl.c
> +++ b/drivers/platform/x86/intel/pmc/mtl.c
> @@ -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);
>  }
> diff --git a/drivers/platform/x86/intel/pmc/tgl.c b/drivers/platform/x86/intel/pmc/tgl.c
> index bc3cb949c672e..29a9109afc782 100644
> --- a/drivers/platform/x86/intel/pmc/tgl.c
> +++ b/drivers/platform/x86/intel/pmc/tgl.c
> @@ -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);
>  }
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
  2025-01-10 11:50   ` Ilpo Järvinen
@ 2025-01-14 16:39     ` Xi Pardee
  2025-01-14 23:13       ` Xi Pardee
  0 siblings, 1 reply; 12+ messages in thread
From: Xi Pardee @ 2025-01-14 16:39 UTC (permalink / raw)
  To: Ilpo Järvinen
  Cc: rajvi0912, irenic.rajneesh, david.e.box, Hans de Goede,
	platform-driver-x86, LKML, linux-pm


On 1/10/2025 3:50 AM, Ilpo Järvinen wrote:
> On Thu, 9 Jan 2025, Xi Pardee wrote:
>
>> Add 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.
>>
>> Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
>> ---
>>   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(-)
>>
>> diff --git a/drivers/platform/x86/intel/pmc/arl.c b/drivers/platform/x86/intel/pmc/arl.c
>> index dedf752237ca0..9ff90d32a635f 100644
>> --- a/drivers/platform/x86/intel/pmc/arl.c
>> +++ b/drivers/platform/x86/intel/pmc/arl.c
>> @@ -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;
>> +}
> 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);


Thanks for the feedback. I will change back to init function per 
architect in next version.

Xi


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback
  2025-01-14 16:39     ` Xi Pardee
@ 2025-01-14 23:13       ` Xi Pardee
  0 siblings, 0 replies; 12+ messages in thread
From: Xi Pardee @ 2025-01-14 23:13 UTC (permalink / raw)
  To: Ilpo Järvinen
  Cc: rajvi0912, irenic.rajneesh, david.e.box, Hans de Goede,
	platform-driver-x86, LKML, linux-pm

Hi,

Thanks for the feedback. I will send out a new version on rc1 of 6.14 cycle.

Xi

On 1/14/2025 8:39 AM, Xi Pardee wrote:
>
> On 1/10/2025 3:50 AM, Ilpo Järvinen wrote:
>> On Thu, 9 Jan 2025, Xi Pardee wrote:
>>
>>> Add 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.
>>>
>>> Signed-off-by: Xi Pardee <xi.pardee@linux.intel.com>
>>> ---
>>>   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(-)
>>>
>>> diff --git a/drivers/platform/x86/intel/pmc/arl.c 
>>> b/drivers/platform/x86/intel/pmc/arl.c
>>> index dedf752237ca0..9ff90d32a635f 100644
>>> --- a/drivers/platform/x86/intel/pmc/arl.c
>>> +++ b/drivers/platform/x86/intel/pmc/arl.c
>>> @@ -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;
>>> +}
>> 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);
>
>
> Thanks for the feedback. I will change back to init function per 
> architect in next version.
>
> Xi
>
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-01-14 23:13 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-10  0:26 [PATCH v4 0/6] Add Arrow Lake U/H support Xi Pardee
2025-01-10  0:26 ` [PATCH v4 1/6] platform/x86:intel/pmc: Make tgl_core_generic_init() static Xi Pardee
2025-01-10  0:26 ` [PATCH v4 2/6] platform/x86/intel/pmc: Remove duplicate enum Xi Pardee
2025-01-10 11:30   ` Ilpo Järvinen
2025-01-10  0:26 ` [PATCH v4 3/6] platform/x86:intel/pmc: Create generic_core_init() for all platforms Xi Pardee
2025-01-10 11:38   ` Ilpo Järvinen
2025-01-10  0:26 ` [PATCH v4 4/6] platform/x86/intel/pmc: Create architecture specific callback Xi Pardee
2025-01-10 11:50   ` Ilpo Järvinen
2025-01-14 16:39     ` Xi Pardee
2025-01-14 23:13       ` Xi Pardee
2025-01-10  0:26 ` [PATCH v4 5/6] platform/x86/intel/pmc: Remove init functions per architecture Xi Pardee
2025-01-10  0:26 ` [PATCH v4 6/6] platform/x86/intel/pmc: Add Arrow Lake U/H support to intel_pmc_core driver Xi Pardee

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).