Commit 80495120 authored by Xi Pardee's avatar Xi Pardee Committed by Hans de Goede
Browse files

platform/x86:intel/pmc: Combine core_init() and core_configure()



Combine core_init() and core_configure() functions to have a
cleaner setup for platforms.

Signed-off-by: default avatarXi Pardee <xi.pardee@intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20230613225347.2720665-3-rajvi.jingar@linux.intel.com


Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 9682cfd1
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -309,17 +309,20 @@ const struct pmc_reg_map adl_reg_map = {
	.lpm_live_status_offset = ADL_LPM_LIVE_STATUS_OFFSET,
};

void adl_core_configure(struct pmc_dev *pmcdev)
int adl_core_init(struct pmc_dev *pmcdev)
{
	int ret;

	pmcdev->map = &adl_reg_map;
	ret = get_primary_reg_base(pmcdev);
	if (ret)
		return ret;

	/* Due to a hardware limitation, the GBE LTR blocks PC10
	 * when a cable is attached. Tell the PMC to ignore it.
	 */
	dev_dbg(&pmcdev->pdev->dev, "ignoring GBE LTR\n");
	pmc_core_send_ltr_ignore(pmcdev, 3);
}

void adl_core_init(struct pmc_dev *pmcdev)
{
	pmcdev->map = &adl_reg_map;
	pmcdev->core_configure = adl_core_configure;
	return 0;
}
+14 −1
Original line number Diff line number Diff line
@@ -204,7 +204,20 @@ const struct pmc_reg_map cnp_reg_map = {
	.etr3_offset = ETR3_OFFSET,
};

void cnp_core_init(struct pmc_dev *pmcdev)
int cnp_core_init(struct pmc_dev *pmcdev)
{
	int ret;

	pmcdev->map = &cnp_reg_map;
	ret = get_primary_reg_base(pmcdev);
	if (ret)
		return ret;

	/* Due to a hardware limitation, the GBE LTR blocks PC10
	 * when a cable is attached. Tell the PMC to ignore it.
	 */
	dev_dbg(&pmcdev->pdev->dev, "ignoring GBE LTR\n");
	pmc_core_send_ltr_ignore(pmcdev, 3);

	return 0;
}
+26 −21
Original line number Diff line number Diff line
@@ -948,6 +948,25 @@ static void pmc_core_get_low_power_modes(struct platform_device *pdev)
	}
}

int get_primary_reg_base(struct pmc_dev *pmcdev)
{
	u64 slp_s0_addr;

	if (lpit_read_residency_count_address(&slp_s0_addr)) {
		pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;

		if (page_is_ram(PHYS_PFN(pmcdev->base_addr)))
			return -ENODEV;
	} else {
		pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset;
	}

	pmcdev->regbase = ioremap(pmcdev->base_addr, pmcdev->map->regmap_length);
	if (!pmcdev->regbase)
		return -ENOMEM;
	return 0;
}

static void pmc_core_dbgfs_unregister(struct pmc_dev *pmcdev)
{
	debugfs_remove_recursive(pmcdev->dbgfs_dir);
@@ -1099,8 +1118,8 @@ static int pmc_core_probe(struct platform_device *pdev)
	static bool device_initialized;
	struct pmc_dev *pmcdev;
	const struct x86_cpu_id *cpu_id;
	void (*core_init)(struct pmc_dev *pmcdev);
	u64 slp_s0_addr;
	int (*core_init)(struct pmc_dev *pmcdev);
	int ret;

	if (device_initialized)
		return -ENODEV;
@@ -1116,7 +1135,7 @@ static int pmc_core_probe(struct platform_device *pdev)
	if (!cpu_id)
		return -ENODEV;

	core_init = (void  (*)(struct pmc_dev *))cpu_id->driver_data;
	core_init = (int (*)(struct pmc_dev *))cpu_id->driver_data;

	/*
	 * Coffee Lake has CPU ID of Kaby Lake and Cannon Lake PCH. So here
@@ -1127,26 +1146,12 @@ static int pmc_core_probe(struct platform_device *pdev)
		core_init = cnp_core_init;

	mutex_init(&pmcdev->lock);
	core_init(pmcdev);


	if (lpit_read_residency_count_address(&slp_s0_addr)) {
		pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;

		if (page_is_ram(PHYS_PFN(pmcdev->base_addr)))
			return -ENODEV;
	} else {
		pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset;
	ret = core_init(pmcdev);
	if (ret) {
		mutex_destroy(&pmcdev->lock);
		return ret;
	}

	pmcdev->regbase = ioremap(pmcdev->base_addr,
				  pmcdev->map->regmap_length);
	if (!pmcdev->regbase)
		return -ENOMEM;

	if (pmcdev->core_configure)
		pmcdev->core_configure(pmcdev);

	pmcdev->pmc_xram_read_bit = pmc_core_check_read_lock_bit(pmcdev);
	pmc_core_get_low_power_modes(pdev);
	pmc_core_do_dmi_quirks(pmcdev);
+8 −11
Original line number Diff line number Diff line
@@ -334,7 +334,6 @@ struct pmc_reg_map {
 * @num_lpm_modes:	Count of enabled modes
 * @lpm_en_modes:	Array of enabled modes from lowest to highest priority
 * @lpm_req_regs:	List of substate requirements
 * @core_configure:	Function pointer to configure the platform
 * @resume:		Function to perform platform specific resume
 *
 * pmc_dev contains info about power management controller device.
@@ -353,7 +352,6 @@ struct pmc_dev {
	int num_lpm_modes;
	int lpm_en_modes[LPM_MAX_NUM_MODES];
	u32 *lpm_req_regs;
	void (*core_configure)(struct pmc_dev *pmcdev);
	int (*resume)(struct pmc_dev *pmcdev);
};

@@ -427,15 +425,14 @@ extern void pmc_core_get_tgl_lpm_reqs(struct platform_device *pdev);
extern int pmc_core_send_ltr_ignore(struct pmc_dev *pmcdev, u32 value);

int pmc_core_resume_common(struct pmc_dev *pmcdev);
void spt_core_init(struct pmc_dev *pmcdev);
void cnp_core_init(struct pmc_dev *pmcdev);
void icl_core_init(struct pmc_dev *pmcdev);
void tgl_core_init(struct pmc_dev *pmcdev);
void adl_core_init(struct pmc_dev *pmcdev);
void mtl_core_init(struct pmc_dev *pmcdev);
void tgl_core_configure(struct pmc_dev *pmcdev);
void adl_core_configure(struct pmc_dev *pmcdev);
void mtl_core_configure(struct pmc_dev *pmcdev);
int get_primary_reg_base(struct pmc_dev *pmcdev);

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 adl_core_init(struct pmc_dev *pmcdev);
int mtl_core_init(struct pmc_dev *pmcdev);

#define pmc_for_each_mode(i, mode, pmcdev)		\
	for (i = 0, mode = pmcdev->lpm_en_modes[i];	\
+2 −1
Original line number Diff line number Diff line
@@ -50,7 +50,8 @@ const struct pmc_reg_map icl_reg_map = {
	.etr3_offset = ETR3_OFFSET,
};

void icl_core_init(struct pmc_dev *pmcdev)
int icl_core_init(struct pmc_dev *pmcdev)
{
	pmcdev->map = &icl_reg_map;
	return get_primary_reg_base(pmcdev);
}
Loading