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