seq_printf(s, "%-10s %-15s\n", "Substate", "Residency");
- pmc_for_each_mode(mode, pmcdev) {
+ pmc_for_each_mode(mode, pmc) {
seq_printf(s, "%-10s %-15llu\n", pmc_lpm_modes[mode],
adjust_lpm_residency(pmc, offset + (4 * mode), lpm_adj_x2));
}
enum header_type type)
{
struct pmc_dev *pmcdev = s->private;
+ struct pmc *pmc = pmcdev->pmcs[pmc_index];
u8 mode;
seq_printf(s, "%40s |", "Element");
- pmc_for_each_mode(mode, pmcdev)
+ pmc_for_each_mode(mode, pmc)
seq_printf(s, " %9s |", pmc_lpm_modes[mode]);
if (type == HEADER_STATUS) {
counter = pmc_core_reg_read(pmc, offset);
seq_printf(s, "pmc%u: %34s |", pmc_idx, map->name);
- pmc_for_each_mode(mode, pmcdev) {
+ pmc_for_each_mode(mode, pmc) {
bool required = *lpm_req_regs & BIT(mode);
seq_printf(s, " %9s |", required ? "Required" : " ");
* show an element if it's required for at least one of the
* enabled low power modes
*/
- pmc_for_each_mode(mode, pmcdev)
+ pmc_for_each_mode(mode, pmc)
req_mask |= lpm_req_regs[mp + (mode * num_maps)];
/* Get the last latched status for this map */
seq_printf(s, "pmc%d: %34s |", pmc_idx, map[i].name);
/* Loop over the enabled states and display if required */
- pmc_for_each_mode(mode, pmcdev) {
+ pmc_for_each_mode(mode, pmc) {
bool required = lpm_req_regs[mp + (mode * num_maps)] &
bit_mask;
seq_printf(s, " %9s |", required ? "Required" : " ");
c10 = true;
}
- pmc_for_each_mode(mode, pmcdev) {
+ pmc_for_each_mode(mode, pmc) {
if ((BIT(mode) & reg) && !c10)
seq_printf(s, " [%s]", pmc_lpm_modes[mode]);
else
mode = sysfs_match_string(pmc_lpm_modes, buf);
/* Check string matches enabled mode */
- pmc_for_each_mode(m, pmcdev)
+ pmc_for_each_mode(m, pmc)
if (mode == m)
break;
return true;
}
-void pmc_core_get_low_power_modes(struct pmc_dev *pmcdev)
+static void pmc_core_pmc_get_low_power_modes(struct pmc_dev *pmcdev, struct pmc *pmc)
{
- struct pmc *pmc = pmcdev->pmcs[PMC_IDX_MAIN];
u8 pri_order[LPM_MAX_NUM_MODES] = LPM_DEFAULT_PRI;
u8 mode_order[LPM_MAX_NUM_MODES];
u32 lpm_pri;
* Lower byte is enough to cover the number of lpm modes for all
* platforms and hence mask the upper 3 bytes.
*/
- pmcdev->num_lpm_modes = hweight32(lpm_en & 0xFF);
+ pmc->num_lpm_modes = hweight32(lpm_en & 0xFF);
/* Read 32 bit LPM_PRI register */
lpm_pri = pmc_core_reg_read(pmc, pmc->map->lpm_priority_offset);
if (!(BIT(mode) & lpm_en))
continue;
- pmcdev->lpm_en_modes[i++] = mode;
+ pmc->lpm_en_modes[i++] = mode;
+ }
+}
+
+static void pmc_core_get_low_power_modes(struct pmc_dev *pmcdev)
+{
+ unsigned int pmc_idx;
+
+ for (pmc_idx = 0; pmc_idx < ARRAY_SIZE(pmcdev->pmcs); pmc_idx++) {
+ struct pmc *pmc;
+
+ pmc = pmcdev->pmcs[pmc_idx];
+ if (!pmc)
+ continue;
+
+ pmc_core_pmc_get_low_power_modes(pmcdev, pmc);
}
}
return -ENOMEM;
mode_offset = LPM_HEADER_OFFSET + LPM_MODE_OFFSET;
- pmc_for_each_mode(mode, pmcdev) {
+ pmc_for_each_mode(mode, pmc) {
u32 *req_offset = pmc->lpm_req_regs + (mode * num_maps);
int m;
* specific attributes
* @lpm_req_regs: List of substate requirements
* @ltr_ign: Holds LTR ignore data while suspended
+ * @num_lpm_modes: Count of enabled modes
+ * @lpm_en_modes: Array of enabled modes from lowest to highest priority
*
* pmc contains info about one power management controller device.
*/
const struct pmc_reg_map *map;
u32 *lpm_req_regs;
u32 ltr_ign;
+ u8 num_lpm_modes;
+ u8 lpm_en_modes[LPM_MAX_NUM_MODES];
};
/**
* @pkgc_res_cnt: Array of PKGC residency counters
* @num_of_pkgc: Number of PKGC
* @s0ix_counter: S0ix residency (step adjusted)
- * @num_lpm_modes: Count of enabled modes
- * @lpm_en_modes: Array of enabled modes from lowest to highest priority
* @suspend: Function to perform platform specific suspend
* @resume: Function to perform platform specific resume
*
struct mutex lock; /* generic mutex lock for PMC Core */
u64 s0ix_counter;
- u8 num_lpm_modes;
- u8 lpm_en_modes[LPM_MAX_NUM_MODES];
void (*suspend)(struct pmc_dev *pmcdev);
int (*resume)(struct pmc_dev *pmcdev);
int pmc_core_resume_common(struct pmc_dev *pmcdev);
int get_primary_reg_base(struct pmc *pmc);
-void pmc_core_get_low_power_modes(struct pmc_dev *pmcdev);
void pmc_core_punit_pmt_init(struct pmc_dev *pmcdev, u32 *guids);
void pmc_core_set_device_d3(unsigned int device);
extern const struct file_operations pmc_core_substate_req_regs_fops;
extern const struct file_operations pmc_core_substate_blk_req_fops;
-#define pmc_for_each_mode(mode, pmcdev) \
+#define pmc_for_each_mode(mode, pmc) \
for (unsigned int __i = 0, __cond; \
- __cond = __i < (pmcdev)->num_lpm_modes, \
- __cond && ((mode) = (pmcdev)->lpm_en_modes[__i]), \
+ __cond = __i < (pmc)->num_lpm_modes, \
+ __cond && ((mode) = (pmc)->lpm_en_modes[__i]), \
__cond; \
__i++)