Enable SSRAM support in PTL and LNL
Subsystems (2)
Xi Pardee
maintainercover Enable SSRAM support in PTL and LNL
This series enables SSRAM support, including achieving PMC information and low power mode substate requirements from telemetry region, in Lunar Lake and Panther Lake platforms for Intel PMC Core driver.
The first patch enables SSRAM support for Lunar Lake. The next three patches introduces a new table in telemetry region to get substate requirement information for platforms starting from Panther Lake. The last patch enables SSRAM support for Panther Lake.
Xi Pardee (5):
platform/x86:intel/pmc: Enable SSRAM support for Lunar Lake platform/x86:intel/pmc: Move telemetry endpoint register handling platform/x86:intel/pmc: Improve function to show substate header platform/x86:intel/pmc: Show substate requirement for S0ix blockers platform/x86:intel/pmc: Enable SSRAM support for Panther Lake
drivers/platform/x86/intel/pmc/arl.c | 1 + drivers/platform/x86/intel/pmc/core.c | 163 +++++++++++++++++++++----- drivers/platform/x86/intel/pmc/core.h | 14 +++ drivers/platform/x86/intel/pmc/lnl.c | 17 +++ drivers/platform/x86/intel/pmc/mtl.c | 1 + drivers/platform/x86/intel/pmc/ptl.c | 30 +++++ 6 files changed, 194 insertions(+), 32 deletions(-)
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH 1/5 platform/x86:intel/pmc: Enable SSRAM support for Lunar Lake
Enable Lunar Lake platforms to achieve PMC information from Intel PMC SSRAM Telemetry driver and substate requirements data from telemetry region.
--- drivers/platform/x86/intel/pmc/lnl.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
drivers/platform/x86/intel/pmc/lnl.c +16 -0
@@ -13,6 +13,10 @@#include "core.h" +#define SOCM_LPM_REQ_GUID 0x15099748 + +static const u8 LNL_LPM_REG_INDEX [] = {0 ,4 ,5 ,6 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,20 }; +static const struct pmc_bit_map lnl_ltr_show_map[] = { {"SOUTHPORT_A" ,CNP_PMC_LTR_SPA }, {"SOUTHPORT_B" ,CNP_PMC_LTR_SPB },
@@ -528,6 +532,16 @@ static const struct pmc_reg_map lnl_socm_reg_map = { .lpm_live_status_offset = MTL_LPM_LIVE_STATUS_OFFSET, .s0ix_blocker_maps = lnl_blk_maps, .s0ix_blocker_offset = LNL_S0IX_BLOCKER_OFFSET, + .lpm_reg_index = LNL_LPM_REG_INDEX, +}; + +static struct pmc_info lnl_pmc_info_list[] = { + { + .guid =SOCM_LPM_REQ_GUID , + .devid =PMC_DEVID_LNL_SOCM , + .map = &lnl_socm_reg_map, + }, + {} };#define LNL_NPU_PCI_DEV 0x643e
@@ -557,6 +571,8 @@ static int lnl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_in }struct pmc_dev_info lnl_pmc_dev = { + .pci_func =2 , + .regmap_list = lnl_pmc_info_list, .map = &lnl_socm_reg_map, .suspend = cnl_suspend, .resume = lnl_resume,
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH 2/5 platform/x86:intel/pmc: Move telemetry endpoint register handling
In reply to Xi PardeeMove 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.
--- drivers/platform/x86/intel/pmc/core.c | 51 +++++++++++++-------------- 1 file changed, 25 insertions(+), 26 deletions(-)
drivers/platform/x86/intel/pmc/core.c +25 -26
@@ -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, structif (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; }
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH 3/5 platform/x86:intel/pmc: Improve function to show substate header
In reply to Xi PardeeRefactor pmc_core_substate_req_header_show() to accept a new argument. This is a preparation patch to introduce a new way to show Low Power Mode substate requirement data for platforms starting from Panther Lake. Increased the size for the name column as the Low Power Mode requirement register name is longer in newer platforms.
--- drivers/platform/x86/intel/pmc/core.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
drivers/platform/x86/intel/pmc/core.c +9 -6
@@ -828,17 +828,20 @@ static int pmc_core_substate_l_sts_regs_show(struct seq_file *s, void *unused) }DEFINE_SHOW_ATTRIBUTE (pmc_core_substate_l_sts_regs); -static void pmc_core_substate_req_header_show (struct seq_file *s,int pmc_index) +static void pmc_core_substate_req_header_show (struct seq_file *s,int pmc_index,char *name) {struct pmc_dev *pmcdev = s->private;int mode; -seq_printf (s,"%30s |" ,"Element" ); +seq_printf (s,"%40s |" ,"Element" );pmc_for_each_mode (mode, pmcdev)seq_printf (s," %9s |" , pmc_lpm_modes[mode]); -seq_printf (s," %9s |" ,"Status" ); -seq_printf (s," %11s |\n" ,"Live Status" ); +if (!strcmp (name,"Status" )) { +seq_printf (s," %9s |" , name); +seq_printf (s," %11s |\n" ,"Live Status" ); + }else +seq_printf (s," %9s |\n" , name); }static int pmc_core_substate_req_regs_show (struct seq_file *s,void *unused)
@@ -872,7 +875,7 @@ static int pmc_core_substate_req_regs_show(struct seq_file *s, void *unused)continue ;/* Display the header */ -pmc_core_substate_req_header_show (s, pmc_index); +pmc_core_substate_req_header_show (s, pmc_index,"Status" );/* Loop over maps */ for (mp =0 ; mp < num_maps; mp++) {
@@ -910,7 +913,7 @@ static int pmc_core_substate_req_regs_show(struct seq_file *s, void *unused) }/* Display the element name in the first column */ -seq_printf (s,"pmc%d: %26s |" , pmc_index, map[i].name); +seq_printf (s,"pmc%d: %34s |" , pmc_index, map[i].name);/* Loop over the enabled states and display if required */ pmc_for_each_mode (mode, pmcdev) {
Signature · 1 line
2.43.0
Xi Pardee
maintainerPATCH 4/5 platform/x86:intel/pmc: Show substate requirement for S0ix blockers
In reply to Xi PardeeAdd support to read and show S0ix blocker substate requirements. Starting from Panther Lake, substate requirement data is provided based on S0ix blockers instead of all low power mode requirements. For platforms that support this new feature, add support to display substate requirements based on S0ix blockers.
Change the "substate_requirements" attribute of Intel PMC Core driver to show the substate requirements for each S0ix blocker and the corresponding S0ix blocker value.
--- drivers/platform/x86/intel/pmc/arl.c | 1 + drivers/platform/x86/intel/pmc/core.c | 109 ++++++++++++++++++++++++-- drivers/platform/x86/intel/pmc/core.h | 12 +++ drivers/platform/x86/intel/pmc/lnl.c | 1 + drivers/platform/x86/intel/pmc/mtl.c | 1 + 5 files changed, 118 insertions(+), 6 deletions(-)
drivers/platform/x86/intel/pmc/arl.c +1 -0
@@ -732,6 +732,7 @@ struct pmc_dev_info arl_pmc_dev = {struct pmc_dev_info arl_h_pmc_dev = { .pci_func =2 , + .telem_info =SUB_REQ_LPM , .dmu_guid =ARL_PMT_DMU_GUID , .regmap_list = arl_pmc_info_list, .map = &mtl_socm_reg_map,
drivers/platform/x86/intel/pmc/core.c +103 -6
143 lines not on this page · raw message
drivers/platform/x86/intel/pmc/core.h +12 -0
@@ -29,6 +29,10 @@ struct telem_endpoint;#define LPM_REG_COUNT 28#define LPM_MODE_OFFSET 1 +/* Telemetry Endpoint Info bits */ +#define SUB_REQ_LPM 0x01/* Substate requirement for low power mode requirements */ +#define SUB_REQ_BLK 0x02/* Substate requirement for S0ix blockers */ +/* Sunrise Point Power Management Controller PCI Device ID */ #define SPT_PMC_PCI_DEVICE_ID 0x9d21#define SPT_PMC_BASE_ADDR_OFFSET 0x48
@@ -344,6 +348,8 @@ struct pmc_bit_map {* @pm_read_disable_bit: Bit index to read PMC_READ_DISABLE * @slps0_dbg_offset: PWRMBASE offset to SLP_S0_DEBUG_REG* * @s0ix_blocker_offset PWRMBASE offset to S0ix blocker counter +* @num_s0ix_blocker: Number of S0ix blockers +* @blocker_req_offset: Telemetry offset to S0ix blocker low power mode substate requirement table * * Each PCH has unique set of register offsets and bit indexes. This structure * captures them to have a common implementation.
@@ -369,6 +375,8 @@ struct pmc_reg_map {const u32 ltr_ignore_max;const u32 pm_vric1_offset;const u32 s0ix_blocker_offset; +const u32 num_s0ix_blocker; +const u32 blocker_req_offset;/* Low Power Mode registers */ const int lpm_num_maps;const int lpm_num_modes;
@@ -404,6 +412,7 @@ struct pmc_info {* @map: pointer to pmc_reg_map struct that contains platform * specific attributes * @lpm_req_regs: List of substate requirements +* @blk_sub_req_reqs: List of registers showing substate requirements for S0ix blockers * @ltr_ign: Holds LTR ignore data while suspended * * pmc contains info about one power management controller device.
@@ -413,6 +422,7 @@ struct pmc {void __iomem *regbase;const struct pmc_reg_map *map;u32 *lpm_req_regs; +u32 *blk_sub_req_regs;u32 ltr_ign; };
@@ -468,6 +478,7 @@ enum pmc_index {/** * struct pmc_dev_info - Structure to keep PMC device info * @pci_func: Function number of the primary PMC +* @telem_info: Bitmask to indicate which telemetry info is available * @dmu_guid: Die Management Unit GUID * @regmap_list: Pointer to a list of pmc_info structure that could be * available for the platform. When set, this field implies
@@ -480,6 +491,7 @@ enum pmc_index {*/ struct pmc_dev_info {u8 pci_func; +u8 telem_info;u32 dmu_guid;struct pmc_info *regmap_list;const struct pmc_reg_map *map;
drivers/platform/x86/intel/pmc/lnl.c +1 -0
@@ -572,6 +572,7 @@ static int lnl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_instruct pmc_dev_info lnl_pmc_dev = { .pci_func =2 , + .telem_info =SUB_REQ_LPM , .regmap_list = lnl_pmc_info_list, .map = &lnl_socm_reg_map, .suspend = cnl_suspend,
drivers/platform/x86/intel/pmc/mtl.c +1 -0
@@ -994,6 +994,7 @@ static int mtl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_instruct pmc_dev_info mtl_pmc_dev = { .pci_func =2 , + .telem_info =SUB_REQ_LPM , .dmu_guid =MTL_PMT_DMU_GUID , .regmap_list = mtl_pmc_info_list, .map = &mtl_socm_reg_map,
Signature · 1 line
2.43.0
Re: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers
Hi Xi,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Xi-Pardee/platform-x86-intel-pmc-Enable-SSRAM-support-for-Lunar-Lake/20250622-050804 base: linus/master patch link: https://lore.kernel.org/r/20250621210529.237964-5-xi.pardee%40linux.intel.com patch subject: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers config: i386-randconfig-141-20250623 (https://download.01.org/0day-ci/archive/20250624/[email protected]/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/
New smatch warnings:drivers/platform/x86/intel/pmc/core.c:1525 pmc_core_pmt_get_blk_sub_req() error: uninitialized symbol 'ret'. drivers/platform/x86/intel/pmc/core.c:1559 pmc_core_get_telem_info() error: uninitialized symbol 'ret'.
vim +/ret +1525 drivers/platform/x86/intel/pmc/core.c
f3435ca196060d Xi Pardee 2025-06-21 1497 static int pmc_core_pmt_get_blk_sub_req(struct pmc_dev *pmcdev, struct pmc *pmc,
f3435ca196060d Xi Pardee 2025-06-21 1498 struct telem_endpoint *ep)
f3435ca196060d Xi Pardee 2025-06-21 1499 {
f3435ca196060d Xi Pardee 2025-06-21 1500 u32 num_blocker, sample_id;
f3435ca196060d Xi Pardee 2025-06-21 1501 unsigned int index;
f3435ca196060d Xi Pardee 2025-06-21 1502 u32 *req_offset;
f3435ca196060d Xi Pardee 2025-06-21 1503 int ret;
f3435ca196060d Xi Pardee 2025-06-21 1504
f3435ca196060d Xi Pardee 2025-06-21 1505 num_blocker = pmc->map->num_s0ix_blocker;
f3435ca196060d Xi Pardee 2025-06-21 1506 sample_id = pmc->map->blocker_req_offset;
f3435ca196060d Xi Pardee 2025-06-21 1507
f3435ca196060d Xi Pardee 2025-06-21 1508 pmc->blk_sub_req_regs = devm_kzalloc(&pmcdev->pdev->dev,
f3435ca196060d Xi Pardee 2025-06-21 1509 num_blocker * sizeof(u32),Use devm_kcalloc() so we don't have to check if num_blocker can be greater than UINT_MAX / 4 on 32bit systems.
f3435ca196060d Xi Pardee 2025-06-21 1510 GFP_KERNEL); f3435ca196060d Xi Pardee 2025-06-21 1511 if (!pmc->blk_sub_req_regs) f3435ca196060d Xi Pardee 2025-06-21 1512 ret = -ENOMEM;
s/ret = /return /. Otherwise it leads to a NULL pointer dereference.
f3435ca196060d Xi Pardee 2025-06-21 1513
f3435ca196060d Xi Pardee 2025-06-21 1514 req_offset = pmc->blk_sub_req_regs;
f3435ca196060d Xi Pardee 2025-06-21 1515 for (index = 0; index < num_blocker; index++) {smatch doesn't know if num_blocker can be zero.
f3435ca196060d Xi Pardee 2025-06-21 1516 ret = pmt_telem_read32(ep, sample_id, req_offset, 1);
f3435ca196060d Xi Pardee 2025-06-21 1517 if (ret) {
f3435ca196060d Xi Pardee 2025-06-21 1518 dev_err(&pmcdev->pdev->dev,
f3435ca196060d Xi Pardee 2025-06-21 1519 "couldn't read Low Power Mode requirements: %d\n", ret);
f3435ca196060d Xi Pardee 2025-06-21 1520 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1521 }
f3435ca196060d Xi Pardee 2025-06-21 1522 sample_id++;
f3435ca196060d Xi Pardee 2025-06-21 1523 req_offset++;
f3435ca196060d Xi Pardee 2025-06-21 1524 }
f3435ca196060d Xi Pardee 2025-06-21 @1525 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1526 }
f3435ca196060d Xi Pardee 2025-06-21 1527
f3435ca196060d Xi Pardee 2025-06-21 1528 static int pmc_core_get_telem_info(struct pmc_dev *pmcdev, int func, unsigned int telem_info)
78a7491d5cba8b Xi Pardee 2025-04-09 1529 {
b5d46539626833 Xi Pardee 2025-04-25 1530 struct pci_dev *pcidev __free(pci_dev_put) = NULL;
d7bc7e19147769 Xi Pardee 2025-06-21 1531 struct telem_endpoint *ep;
052fabddeaa70b Xi Pardee 2025-04-09 1532 unsigned int i;
d7bc7e19147769 Xi Pardee 2025-06-21 1533 u32 guid;
052fabddeaa70b Xi Pardee 2025-04-09 1534 int ret;
78a7491d5cba8b Xi Pardee 2025-04-09 1535
b5d46539626833 Xi Pardee 2025-04-25 1536 pcidev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(20, func));
b5d46539626833 Xi Pardee 2025-04-25 1537 if (!pcidev)
78a7491d5cba8b Xi Pardee 2025-04-09 1538 return -ENODEV;
78a7491d5cba8b Xi Pardee 2025-04-09 1539
78a7491d5cba8b Xi Pardee 2025-04-09 1540 for (i = 0; i < ARRAY_SIZE(pmcdev->pmcs); ++i) {
d7bc7e19147769 Xi Pardee 2025-06-21 1541 struct pmc *pmc;
d7bc7e19147769 Xi Pardee 2025-06-21 1542
d7bc7e19147769 Xi Pardee 2025-06-21 1543 pmc = pmcdev->pmcs[i];
d7bc7e19147769 Xi Pardee 2025-06-21 1544 if (!pmc)
78a7491d5cba8b Xi Pardee 2025-04-09 1545 continue;
78a7491d5cba8b Xi Pardee 2025-04-09 1546
d7bc7e19147769 Xi Pardee 2025-06-21 1547 guid = pmc_core_find_guid(pmcdev->regmap_list, pmc->map);
d7bc7e19147769 Xi Pardee 2025-06-21 1548 if (!guid)
d7bc7e19147769 Xi Pardee 2025-06-21 1549 return -ENXIO;
d7bc7e19147769 Xi Pardee 2025-06-21 1550
d7bc7e19147769 Xi Pardee 2025-06-21 1551 ep = pmt_telem_find_and_register_endpoint(pcidev, guid, 0);
d7bc7e19147769 Xi Pardee 2025-06-21 1552 if (IS_ERR(ep)) {
d7bc7e19147769 Xi Pardee 2025-06-21 1553 dev_dbg(&pmcdev->pdev->dev, "couldn't get telem endpoint %pe", ep);
d7bc7e19147769 Xi Pardee 2025-06-21 1554 return -EPROBE_DEFER;
d7bc7e19147769 Xi Pardee 2025-06-21 1555 }
d7bc7e19147769 Xi Pardee 2025-06-21 1556
f3435ca196060d Xi Pardee 2025-06-21 1557 if (telem_info & SUB_REQ_LPM)
d7bc7e19147769 Xi Pardee 2025-06-21 1558 ret = pmc_core_pmt_get_lpm_req(pmcdev, pmc, ep);ret is uninitialized on else path. I generally encourage developers to set CONFIG_INIT_STACK_ALL_PATTERN=y for their testing.
78a7491d5cba8b Xi Pardee 2025-04-09 @1559 if (ret)
f3435ca196060d Xi Pardee 2025-06-21 1560 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1561 f3435ca196060d Xi Pardee 2025-06-21 1562 if (telem_info & SUB_REQ_BLK) f3435ca196060d Xi Pardee 2025-06-21 1563 ret = pmc_core_pmt_get_blk_sub_req(pmcdev, pmc, ep); f3435ca196060d Xi Pardee 2025-06-21 1564 if (ret) f3435ca196060d Xi Pardee 2025-06-21 1565 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1566 f3435ca196060d Xi Pardee 2025-06-21 1567 pmt_telem_unregister_endpoint(ep); 78a7491d5cba8b Xi Pardee 2025-04-09 1568 } 78a7491d5cba8b Xi Pardee 2025-04-09 1569 78a7491d5cba8b Xi Pardee 2025-04-09 1570 return 0; f3435ca196060d Xi Pardee 2025-06-21 1571 f3435ca196060d Xi Pardee 2025-06-21 1572 unregister_ep: f3435ca196060d Xi Pardee 2025-06-21 1573 pmt_telem_unregister_endpoint(ep); f3435ca196060d Xi Pardee 2025-06-21 1574 return ret; 78a7491d5cba8b Xi Pardee 2025-04-09 1575 }
Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Xi Pardee
maintainerRe: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers
Hi Dan,
Thanks for reviewing. My responses are in line.
Xi
Quoted 39 lines · Dan Carpenter
Hi Xi,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Xi-Pardee/platform-x86-intel-pmc-Enable-SSRAM-support-for-Lunar-Lake/20250622-050804 base: linus/master patch link: https://lore.kernel.org/r/20250621210529.237964-5-xi.pardee%40linux.intel.com patch subject: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers config: i386-randconfig-141-20250623 (https://download.01.org/0day-ci/archive/20250624/[email protected]/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/New smatch warnings:
drivers/platform/x86/intel/pmc/core.c:1525pmc_core_pmt_get_blk_sub_req()error: uninitialized symbol 'ret'.drivers/platform/x86/intel/pmc/core.c:1559pmc_core_get_telem_info()error: uninitialized symbol 'ret'.vim +/ret +1525
drivers/platform/x86/intel/pmc/core.cf3435ca196060d Xi Pardee 2025-06-21 1497 static int pmc_core_pmt_get_blk_sub_req(struct pmc_dev *pmcdev, struct pmc *pmc, f3435ca196060d Xi Pardee 2025-06-21 1498 struct telem_endpoint *ep) f3435ca196060d Xi Pardee 2025-06-21 1499 { f3435ca196060d Xi Pardee 2025-06-21 1500 u32 num_blocker, sample_id; f3435ca196060d Xi Pardee 2025-06-21 1501 unsigned int index; f3435ca196060d Xi Pardee 2025-06-21 1502 u32 *req_offset; f3435ca196060d Xi Pardee 2025-06-21 1503 int ret; f3435ca196060d Xi Pardee 2025-06-21 1504 f3435ca196060d Xi Pardee 2025-06-21 1505 num_blocker = pmc->map->num_s0ix_blocker; f3435ca196060d Xi Pardee 2025-06-21 1506 sample_id = pmc->map->blocker_req_offset; f3435ca196060d Xi Pardee 2025-06-21 1507 f3435ca196060d Xi Pardee 2025-06-21 1508 pmc->blk_sub_req_regs = devm_kzalloc(&pmcdev->pdev->dev, f3435ca196060d Xi Pardee 2025-06-21 1509 num_blocker * sizeof(u32),
Quoted 2 lines
Use
devm_kcalloc()so we don't have to check ifnum_blockercan be greater thanUINT_MAX/ 4 on 32bit systems.
Will change to use devm_kcalloc() in next version.
Quoted 6 lines
f3435ca196060d Xi Pardee 2025-06-21 1510 GFP_KERNEL); f3435ca196060d Xi Pardee 2025-06-21 1511 if (!pmc->blk_sub_req_regs) f3435ca196060d Xi Pardee 2025-06-21 1512 ret = -ENOMEM;s/ret = /return /. Otherwise it leads to a NULL pointer dereference.
Will change to return in next version
Quoted 6 lines
f3435ca196060d Xi Pardee 2025-06-21 1513 f3435ca196060d Xi Pardee 2025-06-21 1514 req_offset = pmc->blk_sub_req_regs; f3435ca196060d Xi Pardee 2025-06-21 1515 for (index = 0; index < num_blocker; index++) {smatch doesn't know if
num_blockercan be zero.
Will initialize ret to be 0 in next version.
Quoted 45 lines
f3435ca196060d Xi Pardee 2025-06-21 1516 ret = pmt_telem_read32(ep, sample_id, req_offset, 1);
f3435ca196060d Xi Pardee 2025-06-21 1517 if (ret) {
f3435ca196060d Xi Pardee 2025-06-21 1518 dev_err(&pmcdev->pdev->dev,
f3435ca196060d Xi Pardee 2025-06-21 1519 "couldn't read Low Power Mode requirements: %d\n", ret);
f3435ca196060d Xi Pardee 2025-06-21 1520 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1521 }
f3435ca196060d Xi Pardee 2025-06-21 1522 sample_id++;
f3435ca196060d Xi Pardee 2025-06-21 1523 req_offset++;
f3435ca196060d Xi Pardee 2025-06-21 1524 }
f3435ca196060d Xi Pardee 2025-06-21 @1525 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1526 }
f3435ca196060d Xi Pardee 2025-06-21 1527
f3435ca196060d Xi Pardee 2025-06-21 1528 static int pmc_core_get_telem_info(struct pmc_dev *pmcdev, int func, unsigned int telem_info)
78a7491d5cba8b Xi Pardee 2025-04-09 1529 {
b5d46539626833 Xi Pardee 2025-04-25 1530 struct pci_dev *pcidev __free(pci_dev_put) = NULL;
d7bc7e19147769 Xi Pardee 2025-06-21 1531 struct telem_endpoint *ep;
052fabddeaa70b Xi Pardee 2025-04-09 1532 unsigned int i;
d7bc7e19147769 Xi Pardee 2025-06-21 1533 u32 guid;
052fabddeaa70b Xi Pardee 2025-04-09 1534 int ret;
78a7491d5cba8b Xi Pardee 2025-04-09 1535
b5d46539626833 Xi Pardee 2025-04-25 1536 pcidev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(20, func));
b5d46539626833 Xi Pardee 2025-04-25 1537 if (!pcidev)
78a7491d5cba8b Xi Pardee 2025-04-09 1538 return -ENODEV;
78a7491d5cba8b Xi Pardee 2025-04-09 1539
78a7491d5cba8b Xi Pardee 2025-04-09 1540 for (i = 0; i < ARRAY_SIZE(pmcdev->pmcs); ++i) {
d7bc7e19147769 Xi Pardee 2025-06-21 1541 struct pmc *pmc;
d7bc7e19147769 Xi Pardee 2025-06-21 1542
d7bc7e19147769 Xi Pardee 2025-06-21 1543 pmc = pmcdev->pmcs[i];
d7bc7e19147769 Xi Pardee 2025-06-21 1544 if (!pmc)
78a7491d5cba8b Xi Pardee 2025-04-09 1545 continue;
78a7491d5cba8b Xi Pardee 2025-04-09 1546
d7bc7e19147769 Xi Pardee 2025-06-21 1547 guid = pmc_core_find_guid(pmcdev->regmap_list, pmc->map);
d7bc7e19147769 Xi Pardee 2025-06-21 1548 if (!guid)
d7bc7e19147769 Xi Pardee 2025-06-21 1549 return -ENXIO;
d7bc7e19147769 Xi Pardee 2025-06-21 1550
d7bc7e19147769 Xi Pardee 2025-06-21 1551 ep = pmt_telem_find_and_register_endpoint(pcidev, guid, 0);
d7bc7e19147769 Xi Pardee 2025-06-21 1552 if (IS_ERR(ep)) {
d7bc7e19147769 Xi Pardee 2025-06-21 1553 dev_dbg(&pmcdev->pdev->dev, "couldn't get telem endpoint %pe", ep);
d7bc7e19147769 Xi Pardee 2025-06-21 1554 return -EPROBE_DEFER;
d7bc7e19147769 Xi Pardee 2025-06-21 1555 }
d7bc7e19147769 Xi Pardee 2025-06-21 1556
f3435ca196060d Xi Pardee 2025-06-21 1557 if (telem_info & SUB_REQ_LPM)
d7bc7e19147769 Xi Pardee 2025-06-21 1558 ret = pmc_core_pmt_get_lpm_req(pmcdev, pmc, ep);Quoted 2 lines
ret is uninitialized on else path. I generally encourage developers to set
CONFIG_INIT_STACK_ALL_PATTERN=yfor their testing.
Will initialize ret to be 0 in next version. Thanks for your suggestion. Will try this option when testing.
Thanks!
Xi
Quoted 18 lines
78a7491d5cba8bXi Pardee 2025-04-09 @1559 if (ret)f3435ca196060d Xi Pardee 2025-06-21 1560 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1561 f3435ca196060d Xi Pardee 2025-06-21 1562 if (telem_info & SUB_REQ_BLK) f3435ca196060d Xi Pardee 2025-06-21 1563 ret = pmc_core_pmt_get_blk_sub_req(pmcdev, pmc, ep); f3435ca196060d Xi Pardee 2025-06-21 1564 if (ret) f3435ca196060d Xi Pardee 2025-06-21 1565 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1566 f3435ca196060d Xi Pardee 2025-06-21 1567 pmt_telem_unregister_endpoint(ep); 78a7491d5cba8b Xi Pardee 2025-04-09 1568 } 78a7491d5cba8b Xi Pardee 2025-04-09 1569 78a7491d5cba8b Xi Pardee 2025-04-09 1570 return 0; f3435ca196060d Xi Pardee 2025-06-21 1571 f3435ca196060d Xi Pardee 2025-06-21 1572 unregister_ep: f3435ca196060d Xi Pardee 2025-06-21 1573 pmt_telem_unregister_endpoint(ep); f3435ca196060d Xi Pardee 2025-06-21 1574 return ret; 78a7491d5cba8b Xi Pardee 2025-04-09 1575 }
Xi Pardee
maintainerRe: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers
In reply to Dan CarpenterHi Dan,
Thanks for your comments. Responses are in line.
Xi
Quoted 46 lines · Dan Carpenter
Hi Xi,
kernel test robot noticed the following build warnings:
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Xi-Pardee/platform-x86-intel-pmc-Enable-SSRAM-support-for-Lunar-Lake/20250622-050804 base: linus/master patch link: https://lore.kernel.org/r/20250621210529.237964-5-xi.pardee%40linux.intel.com patch subject: [PATCH v1 4/5] platform/x86:intel/pmc: Show substate requirement for S0ix blockers config: i386-randconfig-141-20250623 (https://download.01.org/0day-ci/archive/20250624/[email protected]/config) compiler: gcc-12 (Debian 12.2.0-14) 12.2.0If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]> | Reported-by: Dan Carpenter <[email protected]> | Closes: https://lore.kernel.org/r/[email protected]/New smatch warnings:
drivers/platform/x86/intel/pmc/core.c:1525pmc_core_pmt_get_blk_sub_req()error: uninitialized symbol 'ret'.drivers/platform/x86/intel/pmc/core.c:1559pmc_core_get_telem_info()error: uninitialized symbol 'ret'.vim +/ret +1525
drivers/platform/x86/intel/pmc/core.cf3435ca196060d Xi Pardee 2025-06-21 1497 static int pmc_core_pmt_get_blk_sub_req(struct pmc_dev *pmcdev, struct pmc *pmc, f3435ca196060d Xi Pardee 2025-06-21 1498 struct telem_endpoint *ep) f3435ca196060d Xi Pardee 2025-06-21 1499 { f3435ca196060d Xi Pardee 2025-06-21 1500 u32 num_blocker, sample_id; f3435ca196060d Xi Pardee 2025-06-21 1501 unsigned int index; f3435ca196060d Xi Pardee 2025-06-21 1502 u32 *req_offset; f3435ca196060d Xi Pardee 2025-06-21 1503 int ret; f3435ca196060d Xi Pardee 2025-06-21 1504 f3435ca196060d Xi Pardee 2025-06-21 1505 num_blocker = pmc->map->num_s0ix_blocker; f3435ca196060d Xi Pardee 2025-06-21 1506 sample_id = pmc->map->blocker_req_offset; f3435ca196060d Xi Pardee 2025-06-21 1507 f3435ca196060d Xi Pardee 2025-06-21 1508 pmc->blk_sub_req_regs = devm_kzalloc(&pmcdev->pdev->dev, f3435ca196060d Xi Pardee 2025-06-21 1509 num_blocker * sizeof(u32),Use
devm_kcalloc()so we don't have to check ifnum_blockercan be greater thanUINT_MAX/ 4 on 32bit systems.f3435ca196060d Xi Pardee 2025-06-21 1510 GFP_KERNEL); f3435ca196060d Xi Pardee 2025-06-21 1511 if (!pmc->blk_sub_req_regs) f3435ca196060d Xi Pardee 2025-06-21 1512 ret = -ENOMEM;
Quoted 7 lines
s/ret = /return /. Otherwise it leads to a NULL pointer dereference.
f3435ca196060d Xi Pardee 2025-06-21 1513 f3435ca196060d Xi Pardee 2025-06-21 1514 req_offset = pmc->blk_sub_req_regs; f3435ca196060d Xi Pardee 2025-06-21 1515 for (index = 0; index < num_blocker; index++) {smatch doesn't know if
num_blockercan be zero.
To avoid the warning, return 0 instead when function succeeds in version 2.
Quoted 45 lines
f3435ca196060d Xi Pardee 2025-06-21 1516 ret = pmt_telem_read32(ep, sample_id, req_offset, 1);
f3435ca196060d Xi Pardee 2025-06-21 1517 if (ret) {
f3435ca196060d Xi Pardee 2025-06-21 1518 dev_err(&pmcdev->pdev->dev,
f3435ca196060d Xi Pardee 2025-06-21 1519 "couldn't read Low Power Mode requirements: %d\n", ret);
f3435ca196060d Xi Pardee 2025-06-21 1520 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1521 }
f3435ca196060d Xi Pardee 2025-06-21 1522 sample_id++;
f3435ca196060d Xi Pardee 2025-06-21 1523 req_offset++;
f3435ca196060d Xi Pardee 2025-06-21 1524 }
f3435ca196060d Xi Pardee 2025-06-21 @1525 return ret;
f3435ca196060d Xi Pardee 2025-06-21 1526 }
f3435ca196060d Xi Pardee 2025-06-21 1527
f3435ca196060d Xi Pardee 2025-06-21 1528 static int pmc_core_get_telem_info(struct pmc_dev *pmcdev, int func, unsigned int telem_info)
78a7491d5cba8b Xi Pardee 2025-04-09 1529 {
b5d46539626833 Xi Pardee 2025-04-25 1530 struct pci_dev *pcidev __free(pci_dev_put) = NULL;
d7bc7e19147769 Xi Pardee 2025-06-21 1531 struct telem_endpoint *ep;
052fabddeaa70b Xi Pardee 2025-04-09 1532 unsigned int i;
d7bc7e19147769 Xi Pardee 2025-06-21 1533 u32 guid;
052fabddeaa70b Xi Pardee 2025-04-09 1534 int ret;
78a7491d5cba8b Xi Pardee 2025-04-09 1535
b5d46539626833 Xi Pardee 2025-04-25 1536 pcidev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(20, func));
b5d46539626833 Xi Pardee 2025-04-25 1537 if (!pcidev)
78a7491d5cba8b Xi Pardee 2025-04-09 1538 return -ENODEV;
78a7491d5cba8b Xi Pardee 2025-04-09 1539
78a7491d5cba8b Xi Pardee 2025-04-09 1540 for (i = 0; i < ARRAY_SIZE(pmcdev->pmcs); ++i) {
d7bc7e19147769 Xi Pardee 2025-06-21 1541 struct pmc *pmc;
d7bc7e19147769 Xi Pardee 2025-06-21 1542
d7bc7e19147769 Xi Pardee 2025-06-21 1543 pmc = pmcdev->pmcs[i];
d7bc7e19147769 Xi Pardee 2025-06-21 1544 if (!pmc)
78a7491d5cba8b Xi Pardee 2025-04-09 1545 continue;
78a7491d5cba8b Xi Pardee 2025-04-09 1546
d7bc7e19147769 Xi Pardee 2025-06-21 1547 guid = pmc_core_find_guid(pmcdev->regmap_list, pmc->map);
d7bc7e19147769 Xi Pardee 2025-06-21 1548 if (!guid)
d7bc7e19147769 Xi Pardee 2025-06-21 1549 return -ENXIO;
d7bc7e19147769 Xi Pardee 2025-06-21 1550
d7bc7e19147769 Xi Pardee 2025-06-21 1551 ep = pmt_telem_find_and_register_endpoint(pcidev, guid, 0);
d7bc7e19147769 Xi Pardee 2025-06-21 1552 if (IS_ERR(ep)) {
d7bc7e19147769 Xi Pardee 2025-06-21 1553 dev_dbg(&pmcdev->pdev->dev, "couldn't get telem endpoint %pe", ep);
d7bc7e19147769 Xi Pardee 2025-06-21 1554 return -EPROBE_DEFER;
d7bc7e19147769 Xi Pardee 2025-06-21 1555 }
d7bc7e19147769 Xi Pardee 2025-06-21 1556
f3435ca196060d Xi Pardee 2025-06-21 1557 if (telem_info & SUB_REQ_LPM)
d7bc7e19147769 Xi Pardee 2025-06-21 1558 ret = pmc_core_pmt_get_lpm_req(pmcdev, pmc, ep);Quoted 2 lines
ret is uninitialized on else path. I generally encourage developers to set
CONFIG_INIT_STACK_ALL_PATTERN=yfor their testing.
Changed to only check ret value in the if condition in version 2.
Quoted 18 lines
78a7491d5cba8bXi Pardee 2025-04-09 @1559 if (ret)f3435ca196060d Xi Pardee 2025-06-21 1560 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1561 f3435ca196060d Xi Pardee 2025-06-21 1562 if (telem_info & SUB_REQ_BLK) f3435ca196060d Xi Pardee 2025-06-21 1563 ret = pmc_core_pmt_get_blk_sub_req(pmcdev, pmc, ep); f3435ca196060d Xi Pardee 2025-06-21 1564 if (ret) f3435ca196060d Xi Pardee 2025-06-21 1565 goto unregister_ep; f3435ca196060d Xi Pardee 2025-06-21 1566 f3435ca196060d Xi Pardee 2025-06-21 1567 pmt_telem_unregister_endpoint(ep); 78a7491d5cba8b Xi Pardee 2025-04-09 1568 } 78a7491d5cba8b Xi Pardee 2025-04-09 1569 78a7491d5cba8b Xi Pardee 2025-04-09 1570 return 0; f3435ca196060d Xi Pardee 2025-06-21 1571 f3435ca196060d Xi Pardee 2025-06-21 1572 unregister_ep: f3435ca196060d Xi Pardee 2025-06-21 1573 pmt_telem_unregister_endpoint(ep); f3435ca196060d Xi Pardee 2025-06-21 1574 return ret; 78a7491d5cba8b Xi Pardee 2025-04-09 1575 }
Xi Pardee
maintainerPATCH 5/5 platform/x86:intel/pmc: Enable SSRAM support for Panther Lake
In reply to Xi PardeeEnable Panther Lake platforms to achieve PMC information from Intel PMC SSRAM Telemetry driver and substate requirements data from telemetry region.
--- drivers/platform/x86/intel/pmc/core.h | 2 ++ drivers/platform/x86/intel/pmc/ptl.c | 30 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+)
drivers/platform/x86/intel/pmc/core.h +2 -0
@@ -301,6 +301,8 @@ enum ppfear_regs {#define PTL_PMC_LTR_CUR_ASLT 0x1C28#define PTL_PMC_LTR_CUR_PLT 0x1C2C#define PTL_PCD_PMC_MMIO_REG_LEN 0x31A8 +#define PTL_NUM_S0IX_BLOCKER 106 +#define PTL_BLK_REQ_OFFSET 55/* SSRAM PMC Device ID */ /* LNL */
drivers/platform/x86/intel/pmc/ptl.c +30 -0
@@ -10,6 +10,17 @@#include "core.h" +/* PMC SSRAM PMT Telemetry GUIDS */ +#define PCDP_LPM_REQ_GUID 0x47179370 + +/* +* Die Mapping to Product. +* Product PCDDie +* PTL-H PCD-H +* PTL-P PCD-P +* PTL-U PCD-P +*/ +static const struct pmc_bit_map ptl_pcdp_pfear_map[] = { {"PMC_0" ,BIT (0 )}, {"FUSE_OSSE" ,BIT (1 )},
@@ -515,6 +526,22 @@ static const struct pmc_reg_map ptl_pcdp_reg_map = { .lpm_live_status_offset = MTL_LPM_LIVE_STATUS_OFFSET, .s0ix_blocker_maps = ptl_pcdp_blk_maps, .s0ix_blocker_offset = LNL_S0IX_BLOCKER_OFFSET, + .num_s0ix_blocker = PTL_NUM_S0IX_BLOCKER, + .blocker_req_offset = PTL_BLK_REQ_OFFSET, +}; + +static struct pmc_info ptl_pmc_info_list[] = { + { + .guid =PCDP_LPM_REQ_GUID , + .devid =PMC_DEVID_PTL_PCDH , + .map = &ptl_pcdp_reg_map, + }, + { + .guid =PCDP_LPM_REQ_GUID , + .devid =PMC_DEVID_PTL_PCDP , + .map = &ptl_pcdp_reg_map, + }, + {} };#define PTL_NPU_PCI_DEV 0xb03e
@@ -543,6 +570,9 @@ static int ptl_core_init(struct pmc_dev *pmcdev, struct pmc_dev_info *pmc_dev_in }struct pmc_dev_info ptl_pmc_dev = { + .pci_func =2 , + .telem_info =SUB_REQ_BLK , + .regmap_list = ptl_pmc_info_list, .map = &ptl_pcdp_reg_map, .suspend = cnl_suspend, .resume = ptl_resume,
Signature · 1 line
2.43.0