Unverified Commit 1e508af6 authored by Xi Pardee's avatar Xi Pardee Committed by Ilpo Järvinen
Browse files

platform/x86:intel/pmc: Move telemetry endpoint register handling



Move telemetry endpoint handling to pmc_core_get_telem_info(). This
is a preparation patch to introduce a new table to obtain Low Power
Mode substate requirement data for platforms starting from Panther
Lake.

Signed-off-by: default avatarXi Pardee <xi.pardee@linux.intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://patch.msgid.link/20250910210629.11198-3-xi.pardee@linux.intel.com


Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent feae929d
Loading
Loading
Loading
Loading
+25 −26
Original line number Diff line number Diff line
@@ -1399,36 +1399,23 @@ static u32 pmc_core_find_guid(struct pmc_info *list, const struct pmc_reg_map *m
 * +----+---------------------------------------------------------+
 *
 */
static int pmc_core_get_lpm_req(struct pmc_dev *pmcdev, struct pmc *pmc, struct pci_dev *pcidev)
static int pmc_core_pmt_get_lpm_req(struct pmc_dev *pmcdev, struct pmc *pmc,
				    struct telem_endpoint *ep)
{
	struct telem_endpoint *ep;
	const u8 *lpm_indices;
	int num_maps, mode_offset = 0;
	int ret, mode;
	int lpm_size;
	u32 guid;

	lpm_indices = pmc->map->lpm_reg_index;
	num_maps = pmc->map->lpm_num_maps;
	lpm_size = LPM_MAX_NUM_MODES * num_maps;

	guid = pmc_core_find_guid(pmcdev->regmap_list, pmc->map);
	if (!guid)
		return -ENXIO;

	ep = pmt_telem_find_and_register_endpoint(pcidev, guid, 0);
	if (IS_ERR(ep)) {
		dev_dbg(&pmcdev->pdev->dev, "couldn't get telem endpoint %pe", ep);
		return -EPROBE_DEFER;
	}

	pmc->lpm_req_regs = devm_kzalloc(&pmcdev->pdev->dev,
					 lpm_size * sizeof(u32),
					 GFP_KERNEL);
	if (!pmc->lpm_req_regs) {
		ret = -ENOMEM;
		goto unregister_ep;
	}
	if (!pmc->lpm_req_regs)
		return -ENOMEM;

	mode_offset = LPM_HEADER_OFFSET + LPM_MODE_OFFSET;
	pmc_for_each_mode(mode, pmcdev) {
@@ -1442,23 +1429,21 @@ static int pmc_core_get_lpm_req(struct pmc_dev *pmcdev, struct pmc *pmc, struct
			if (ret) {
				dev_err(&pmcdev->pdev->dev,
					"couldn't read Low Power Mode requirements: %d\n", ret);
				goto unregister_ep;
				return ret;
			}
			++req_offset;
		}
		mode_offset += LPM_REG_COUNT + LPM_MODE_OFFSET;
	}

unregister_ep:
	pmt_telem_unregister_endpoint(ep);

	return ret;
}

static int pmc_core_ssram_get_lpm_reqs(struct pmc_dev *pmcdev, int func)
static int pmc_core_get_telem_info(struct pmc_dev *pmcdev, int func)
{
	struct pci_dev *pcidev __free(pci_dev_put) = NULL;
	struct telem_endpoint *ep;
	unsigned int i;
	u32 guid;
	int ret;

	pcidev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(20, func));
@@ -1466,10 +1451,24 @@ static int pmc_core_ssram_get_lpm_reqs(struct pmc_dev *pmcdev, int func)
		return -ENODEV;

	for (i = 0; i < ARRAY_SIZE(pmcdev->pmcs); ++i) {
		if (!pmcdev->pmcs[i])
		struct pmc *pmc;

		pmc = pmcdev->pmcs[i];
		if (!pmc)
			continue;

		ret = pmc_core_get_lpm_req(pmcdev, pmcdev->pmcs[i], pcidev);
		guid = pmc_core_find_guid(pmcdev->regmap_list, pmc->map);
		if (!guid)
			return -ENXIO;

		ep = pmt_telem_find_and_register_endpoint(pcidev, guid, 0);
		if (IS_ERR(ep)) {
			dev_dbg(&pmcdev->pdev->dev, "couldn't get telem endpoint %pe", ep);
			return -EPROBE_DEFER;
		}

		ret = pmc_core_pmt_get_lpm_req(pmcdev, pmc, ep);
		pmt_telem_unregister_endpoint(ep);
		if (ret)
			return ret;
	}
@@ -1583,7 +1582,7 @@ int generic_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_info)
		pmc_core_punit_pmt_init(pmcdev, pmc_dev_info->dmu_guid);

	if (ssram) {
		ret = pmc_core_ssram_get_lpm_reqs(pmcdev, pmc_dev_info->pci_func);
		ret = pmc_core_get_telem_info(pmcdev, pmc_dev_info->pci_func);
		if (ret)
			goto unmap_regbase;
	}