Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

platform/x86: intel_pmc_core: Fix the slp_s0 counter displayed value

slp_s0 counter value displayed via debugfs interface is calculated by
multiplying the granularity for crystal oscillator tick as 100us with
the value read from using slp_s0 offset. But the granularity of the tick
varies from platform to platform and it needs to be fixed.

Hence, specify granularity of the tick for each platform, so that the
value of the slp_s0 counter is accurate.

Signed-off-by: Gayatri Kammela <gayatri.kammela@intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20201006224702.12697-4-david.e.box@linux.intel.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>

authored by

Gayatri Kammela and committed by
Hans de Goede
025f26de 652036bd

+11 -4
+7 -3
drivers/platform/x86/intel_pmc_core.c
··· 154 154 .ltr_show_sts = spt_ltr_show_map, 155 155 .msr_sts = msr_map, 156 156 .slp_s0_offset = SPT_PMC_SLP_S0_RES_COUNTER_OFFSET, 157 + .slp_s0_res_counter_step = SPT_PMC_SLP_S0_RES_COUNTER_STEP, 157 158 .ltr_ignore_offset = SPT_PMC_LTR_IGNORE_OFFSET, 158 159 .regmap_length = SPT_PMC_MMIO_REG_LEN, 159 160 .ppfear0_offset = SPT_PMC_XRAM_PPFEAR0A, ··· 381 380 static const struct pmc_reg_map cnp_reg_map = { 382 381 .pfear_sts = ext_cnp_pfear_map, 383 382 .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, 383 + .slp_s0_res_counter_step = SPT_PMC_SLP_S0_RES_COUNTER_STEP, 384 384 .slps0_dbg_maps = cnp_slps0_dbg_maps, 385 385 .ltr_show_sts = cnp_ltr_show_map, 386 386 .msr_sts = msr_map, ··· 398 396 static const struct pmc_reg_map icl_reg_map = { 399 397 .pfear_sts = ext_icl_pfear_map, 400 398 .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, 399 + .slp_s0_res_counter_step = ICL_PMC_SLP_S0_RES_COUNTER_STEP, 401 400 .slps0_dbg_maps = cnp_slps0_dbg_maps, 402 401 .ltr_show_sts = cnp_ltr_show_map, 403 402 .msr_sts = msr_map, ··· 561 558 static const struct pmc_reg_map tgl_reg_map = { 562 559 .pfear_sts = ext_tgl_pfear_map, 563 560 .slp_s0_offset = CNP_PMC_SLP_S0_RES_COUNTER_OFFSET, 561 + .slp_s0_res_counter_step = TGL_PMC_SLP_S0_RES_COUNTER_STEP, 564 562 .ltr_show_sts = cnp_ltr_show_map, 565 563 .msr_sts = msr_map, 566 564 .ltr_ignore_offset = CNP_PMC_LTR_IGNORE_OFFSET, ··· 590 586 writel(val, pmcdev->regbase + reg_offset); 591 587 } 592 588 593 - static inline u64 pmc_core_adjust_slp_s0_step(u32 value) 589 + static inline u64 pmc_core_adjust_slp_s0_step(struct pmc_dev *pmcdev, u32 value) 594 590 { 595 - return (u64)value * SPT_PMC_SLP_S0_RES_COUNTER_STEP; 591 + return (u64)value * pmcdev->map->slp_s0_res_counter_step; 596 592 } 597 593 598 594 static int pmc_core_dev_state_get(void *data, u64 *val) ··· 602 598 u32 value; 603 599 604 600 value = pmc_core_reg_read(pmcdev, map->slp_s0_offset); 605 - *val = pmc_core_adjust_slp_s0_step(value); 601 + *val = pmc_core_adjust_slp_s0_step(pmcdev, value); 606 602 607 603 return 0; 608 604 }
+4 -1
drivers/platform/x86/intel_pmc_core.h
··· 30 30 #define SPT_PMC_MPHY_CORE_STS_1 0x1142 31 31 #define SPT_PMC_MPHY_COM_STS_0 0x1155 32 32 #define SPT_PMC_MMIO_REG_LEN 0x1000 33 - #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x64 33 + #define SPT_PMC_SLP_S0_RES_COUNTER_STEP 0x68 34 34 #define PMC_BASE_ADDR_MASK ~(SPT_PMC_MMIO_REG_LEN - 1) 35 35 #define MTPMC_MASK 0xffff0000 36 36 #define PPFEAR_MAX_NUM_ENTRIES 12 ··· 185 185 #define ICL_PPFEAR_NUM_ENTRIES 9 186 186 #define ICL_NUM_IP_IGN_ALLOWED 20 187 187 #define ICL_PMC_LTR_WIGIG 0x1BFC 188 + #define ICL_PMC_SLP_S0_RES_COUNTER_STEP 0x64 188 189 189 190 #define TGL_NUM_IP_IGN_ALLOWED 22 191 + #define TGL_PMC_SLP_S0_RES_COUNTER_STEP 0x7A 190 192 191 193 /* 192 194 * Tigerlake Power Management Controller register offsets ··· 247 245 const struct pmc_bit_map *msr_sts; 248 246 const struct pmc_bit_map **lpm_sts; 249 247 const u32 slp_s0_offset; 248 + const int slp_s0_res_counter_step; 250 249 const u32 ltr_ignore_offset; 251 250 const int regmap_length; 252 251 const u32 ppfear0_offset;