Merge tag 'pm-6.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull power management fix from Rafael Wysocki:
"Fix a sparse warning triggered by the TPMI interface recently added to
the Intel RAPL power capping driver (Zhang Rui)"

* tag 'pm-6.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
powercap: intel_rapl: Fix a sparse warning in TPMI interface

+58 -52
+7 -7
drivers/powercap/intel_rapl_common.c
··· 818 818 return -EINVAL; 819 819 820 820 ra.reg = rd->regs[rpi->id]; 821 - if (!ra.reg) 821 + if (!ra.reg.val) 822 822 return -EINVAL; 823 823 824 824 /* non-hardware data are collected by the polling thread */ ··· 830 830 ra.mask = rpi->mask; 831 831 832 832 if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra)) { 833 - pr_debug("failed to read reg 0x%llx for %s:%s\n", ra.reg, rd->rp->name, rd->name); 833 + pr_debug("failed to read reg 0x%llx for %s:%s\n", ra.reg.val, rd->rp->name, rd->name); 834 834 return -EIO; 835 835 } 836 836 ··· 920 920 ra.mask = ~0; 921 921 if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra)) { 922 922 pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", 923 - ra.reg, rd->rp->name, rd->name); 923 + ra.reg.val, rd->rp->name, rd->name); 924 924 return -ENODEV; 925 925 } 926 926 ··· 948 948 ra.mask = ~0; 949 949 if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra)) { 950 950 pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", 951 - ra.reg, rd->rp->name, rd->name); 951 + ra.reg.val, rd->rp->name, rd->name); 952 952 return -ENODEV; 953 953 } 954 954 ··· 1135 1135 ra.mask = ~0; 1136 1136 if (rd->rp->priv->read_raw(get_rid(rd->rp), &ra)) { 1137 1137 pr_err("Failed to read power unit REG 0x%llx on %s:%s, exit.\n", 1138 - ra.reg, rd->rp->name, rd->name); 1138 + ra.reg.val, rd->rp->name, rd->name); 1139 1139 return -ENODEV; 1140 1140 } 1141 1141 ··· 1411 1411 struct rapl_defaults *defaults = get_defaults(rd->rp); 1412 1412 int ret; 1413 1413 1414 - if (!rd->regs[RAPL_DOMAIN_REG_UNIT]) { 1415 - if (!rd->rp->priv->reg_unit) { 1414 + if (!rd->regs[RAPL_DOMAIN_REG_UNIT].val) { 1415 + if (!rd->rp->priv->reg_unit.val) { 1416 1416 pr_err("No valid Unit register found\n"); 1417 1417 return -ENODEV; 1418 1418 }
+25 -24
drivers/powercap/intel_rapl_msr.c
··· 34 34 35 35 static struct rapl_if_priv rapl_msr_priv_intel = { 36 36 .type = RAPL_IF_MSR, 37 - .reg_unit = MSR_RAPL_POWER_UNIT, 38 - .regs[RAPL_DOMAIN_PACKAGE] = { 39 - MSR_PKG_POWER_LIMIT, MSR_PKG_ENERGY_STATUS, MSR_PKG_PERF_STATUS, 0, MSR_PKG_POWER_INFO }, 40 - .regs[RAPL_DOMAIN_PP0] = { 41 - MSR_PP0_POWER_LIMIT, MSR_PP0_ENERGY_STATUS, 0, MSR_PP0_POLICY, 0 }, 42 - .regs[RAPL_DOMAIN_PP1] = { 43 - MSR_PP1_POWER_LIMIT, MSR_PP1_ENERGY_STATUS, 0, MSR_PP1_POLICY, 0 }, 44 - .regs[RAPL_DOMAIN_DRAM] = { 45 - MSR_DRAM_POWER_LIMIT, MSR_DRAM_ENERGY_STATUS, MSR_DRAM_PERF_STATUS, 0, MSR_DRAM_POWER_INFO }, 46 - .regs[RAPL_DOMAIN_PLATFORM] = { 47 - MSR_PLATFORM_POWER_LIMIT, MSR_PLATFORM_ENERGY_STATUS, 0, 0, 0}, 37 + .reg_unit.msr = MSR_RAPL_POWER_UNIT, 38 + .regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_LIMIT].msr = MSR_PKG_POWER_LIMIT, 39 + .regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_STATUS].msr = MSR_PKG_ENERGY_STATUS, 40 + .regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_PERF].msr = MSR_PKG_PERF_STATUS, 41 + .regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_INFO].msr = MSR_PKG_POWER_INFO, 42 + .regs[RAPL_DOMAIN_PP0][RAPL_DOMAIN_REG_LIMIT].msr = MSR_PP0_POWER_LIMIT, 43 + .regs[RAPL_DOMAIN_PP0][RAPL_DOMAIN_REG_STATUS].msr = MSR_PP0_ENERGY_STATUS, 44 + .regs[RAPL_DOMAIN_PP0][RAPL_DOMAIN_REG_POLICY].msr = MSR_PP0_POLICY, 45 + .regs[RAPL_DOMAIN_PP1][RAPL_DOMAIN_REG_LIMIT].msr = MSR_PP1_POWER_LIMIT, 46 + .regs[RAPL_DOMAIN_PP1][RAPL_DOMAIN_REG_STATUS].msr = MSR_PP1_ENERGY_STATUS, 47 + .regs[RAPL_DOMAIN_PP1][RAPL_DOMAIN_REG_POLICY].msr = MSR_PP1_POLICY, 48 + .regs[RAPL_DOMAIN_DRAM][RAPL_DOMAIN_REG_LIMIT].msr = MSR_DRAM_POWER_LIMIT, 49 + .regs[RAPL_DOMAIN_DRAM][RAPL_DOMAIN_REG_STATUS].msr = MSR_DRAM_ENERGY_STATUS, 50 + .regs[RAPL_DOMAIN_DRAM][RAPL_DOMAIN_REG_PERF].msr = MSR_DRAM_PERF_STATUS, 51 + .regs[RAPL_DOMAIN_DRAM][RAPL_DOMAIN_REG_INFO].msr = MSR_DRAM_POWER_INFO, 52 + .regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_LIMIT].msr = MSR_PLATFORM_POWER_LIMIT, 53 + .regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_STATUS].msr = MSR_PLATFORM_ENERGY_STATUS, 48 54 .limits[RAPL_DOMAIN_PACKAGE] = BIT(POWER_LIMIT2), 49 55 .limits[RAPL_DOMAIN_PLATFORM] = BIT(POWER_LIMIT2), 50 56 }; 51 57 52 58 static struct rapl_if_priv rapl_msr_priv_amd = { 53 59 .type = RAPL_IF_MSR, 54 - .reg_unit = MSR_AMD_RAPL_POWER_UNIT, 55 - .regs[RAPL_DOMAIN_PACKAGE] = { 56 - 0, MSR_AMD_PKG_ENERGY_STATUS, 0, 0, 0 }, 57 - .regs[RAPL_DOMAIN_PP0] = { 58 - 0, MSR_AMD_CORE_ENERGY_STATUS, 0, 0, 0 }, 60 + .reg_unit.msr = MSR_AMD_RAPL_POWER_UNIT, 61 + .regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_STATUS].msr = MSR_AMD_PKG_ENERGY_STATUS, 62 + .regs[RAPL_DOMAIN_PP0][RAPL_DOMAIN_REG_STATUS].msr = MSR_AMD_CORE_ENERGY_STATUS, 59 63 }; 60 64 61 65 /* Handles CPU hotplug on multi-socket systems. ··· 103 99 104 100 static int rapl_msr_read_raw(int cpu, struct reg_action *ra) 105 101 { 106 - u32 msr = (u32)ra->reg; 107 - 108 - if (rdmsrl_safe_on_cpu(cpu, msr, &ra->value)) { 109 - pr_debug("failed to read msr 0x%x on cpu %d\n", msr, cpu); 102 + if (rdmsrl_safe_on_cpu(cpu, ra->reg.msr, &ra->value)) { 103 + pr_debug("failed to read msr 0x%x on cpu %d\n", ra->reg.msr, cpu); 110 104 return -EIO; 111 105 } 112 106 ra->value &= ra->mask; ··· 114 112 static void rapl_msr_update_func(void *info) 115 113 { 116 114 struct reg_action *ra = info; 117 - u32 msr = (u32)ra->reg; 118 115 u64 val; 119 116 120 - ra->err = rdmsrl_safe(msr, &val); 117 + ra->err = rdmsrl_safe(ra->reg.msr, &val); 121 118 if (ra->err) 122 119 return; 123 120 124 121 val &= ~ra->mask; 125 122 val |= ra->value; 126 123 127 - ra->err = wrmsrl_safe(msr, val); 124 + ra->err = wrmsrl_safe(ra->reg.msr, val); 128 125 } 129 126 130 127 static int rapl_msr_write_raw(int cpu, struct reg_action *ra) ··· 172 171 173 172 if (id) { 174 173 rapl_msr_priv->limits[RAPL_DOMAIN_PACKAGE] |= BIT(POWER_LIMIT4); 175 - rapl_msr_priv->regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_PL4] = 174 + rapl_msr_priv->regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_PL4].msr = 176 175 MSR_VR_CURRENT_CONFIG; 177 176 pr_info("PL4 support detected.\n"); 178 177 }
+8 -9
drivers/powercap/intel_rapl_tpmi.c
··· 59 59 60 60 static int tpmi_rapl_read_raw(int id, struct reg_action *ra) 61 61 { 62 - if (!ra->reg) 62 + if (!ra->reg.mmio) 63 63 return -EINVAL; 64 64 65 - ra->value = readq((void __iomem *)ra->reg); 65 + ra->value = readq(ra->reg.mmio); 66 66 67 67 ra->value &= ra->mask; 68 68 return 0; ··· 72 72 { 73 73 u64 val; 74 74 75 - if (!ra->reg) 75 + if (!ra->reg.mmio) 76 76 return -EINVAL; 77 77 78 - val = readq((void __iomem *)ra->reg); 78 + val = readq(ra->reg.mmio); 79 79 80 80 val &= ~ra->mask; 81 81 val |= ra->value; 82 82 83 - writeq(val, (void __iomem *)ra->reg); 83 + writeq(val, ra->reg.mmio); 84 84 return 0; 85 85 } 86 86 ··· 138 138 enum tpmi_rapl_register reg_index; 139 139 enum rapl_domain_reg_id reg_id; 140 140 int tpmi_domain_size, tpmi_domain_flags; 141 - u64 *tpmi_rapl_regs = trp->base + offset; 142 - u64 tpmi_domain_header = readq((void __iomem *)tpmi_rapl_regs); 141 + u64 tpmi_domain_header = readq(trp->base + offset); 143 142 144 143 /* Domain Parent bits are ignored for now */ 145 144 tpmi_domain_version = tpmi_domain_header & 0xff; ··· 179 180 return -EINVAL; 180 181 } 181 182 182 - if (trp->priv.regs[domain_type][RAPL_DOMAIN_REG_UNIT]) { 183 + if (trp->priv.regs[domain_type][RAPL_DOMAIN_REG_UNIT].mmio) { 183 184 pr_warn(FW_BUG "Duplicate Domain type %d\n", tpmi_domain_type); 184 185 return -EINVAL; 185 186 } ··· 217 218 default: 218 219 continue; 219 220 } 220 - trp->priv.regs[domain_type][reg_id] = (u64)&tpmi_rapl_regs[reg_index]; 221 + trp->priv.regs[domain_type][reg_id].mmio = trp->base + offset + reg_index * 8; 221 222 } 222 223 223 224 return 0;
+8 -8
drivers/thermal/intel/int340x_thermal/processor_thermal_rapl.c
··· 57 57 58 58 static int rapl_mmio_read_raw(int cpu, struct reg_action *ra) 59 59 { 60 - if (!ra->reg) 60 + if (!ra->reg.mmio) 61 61 return -EINVAL; 62 62 63 - ra->value = readq((void __iomem *)ra->reg); 63 + ra->value = readq(ra->reg.mmio); 64 64 ra->value &= ra->mask; 65 65 return 0; 66 66 } ··· 69 69 { 70 70 u64 val; 71 71 72 - if (!ra->reg) 72 + if (!ra->reg.mmio) 73 73 return -EINVAL; 74 74 75 - val = readq((void __iomem *)ra->reg); 75 + val = readq(ra->reg.mmio); 76 76 val &= ~ra->mask; 77 77 val |= ra->value; 78 - writeq(val, (void __iomem *)ra->reg); 78 + writeq(val, ra->reg.mmio); 79 79 return 0; 80 80 } 81 81 ··· 92 92 for (domain = RAPL_DOMAIN_PACKAGE; domain < RAPL_DOMAIN_MAX; domain++) { 93 93 for (reg = RAPL_DOMAIN_REG_LIMIT; reg < RAPL_DOMAIN_REG_MAX; reg++) 94 94 if (rapl_regs->regs[domain][reg]) 95 - rapl_mmio_priv.regs[domain][reg] = 96 - (u64)proc_priv->mmio_base + 95 + rapl_mmio_priv.regs[domain][reg].mmio = 96 + proc_priv->mmio_base + 97 97 rapl_regs->regs[domain][reg]; 98 98 rapl_mmio_priv.limits[domain] = rapl_regs->limits[domain]; 99 99 } 100 100 rapl_mmio_priv.type = RAPL_IF_MMIO; 101 - rapl_mmio_priv.reg_unit = (u64)proc_priv->mmio_base + rapl_regs->reg_unit; 101 + rapl_mmio_priv.reg_unit.mmio = proc_priv->mmio_base + rapl_regs->reg_unit; 102 102 103 103 rapl_mmio_priv.read_raw = rapl_mmio_read_raw; 104 104 rapl_mmio_priv.write_raw = rapl_mmio_write_raw;
+10 -4
include/linux/intel_rapl.h
··· 100 100 101 101 #define RAPL_DOMAIN_NAME_LENGTH 16 102 102 103 + union rapl_reg { 104 + void __iomem *mmio; 105 + u32 msr; 106 + u64 val; 107 + }; 108 + 103 109 struct rapl_domain { 104 110 char name[RAPL_DOMAIN_NAME_LENGTH]; 105 111 enum rapl_domain_type id; 106 - u64 regs[RAPL_DOMAIN_REG_MAX]; 112 + union rapl_reg regs[RAPL_DOMAIN_REG_MAX]; 107 113 struct powercap_zone power_zone; 108 114 struct rapl_domain_data rdd; 109 115 struct rapl_power_limit rpl[NR_POWER_LIMITS]; ··· 122 116 }; 123 117 124 118 struct reg_action { 125 - u64 reg; 119 + union rapl_reg reg; 126 120 u64 mask; 127 121 u64 value; 128 122 int err; ··· 149 143 enum rapl_if_type type; 150 144 struct powercap_control_type *control_type; 151 145 enum cpuhp_state pcap_rapl_online; 152 - u64 reg_unit; 153 - u64 regs[RAPL_DOMAIN_MAX][RAPL_DOMAIN_REG_MAX]; 146 + union rapl_reg reg_unit; 147 + union rapl_reg regs[RAPL_DOMAIN_MAX][RAPL_DOMAIN_REG_MAX]; 154 148 int limits[RAPL_DOMAIN_MAX]; 155 149 int (*read_raw)(int id, struct reg_action *ra); 156 150 int (*write_raw)(int id, struct reg_action *ra);