]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86:intel/pmc: Move telemetry endpoint register handling
authorXi Pardee <xi.pardee@linux.intel.com>
Wed, 10 Sep 2025 21:06:22 +0000 (14:06 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 11 Sep 2025 08:23:53 +0000 (11:23 +0300)
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: Xi Pardee <xi.pardee@linux.intel.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://patch.msgid.link/20250910210629.11198-3-xi.pardee@linux.intel.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/pmc/core.c

index 7d55af8e303cf4db86d9064e1bf6d58031aaed57..a1ab0e31eca7b47a8b2a33757458cdf138ad2aa4 100644 (file)
@@ -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;
        }