Merge tag 'pm-6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management fixes from Rafael Wysocki:
"These address two issues in the TPMI module of the Intel RAPL power
capping driver and one issue in the processor part of the Intel
int340x thermal driver, update a CPU ID list and register definitions
needed for RAPL PL4 support and remove some unused code.
Specifics:
- Fix the TPMI_RAPL_REG_DOMAIN_INFO register offset in the TPMI part
of the Intel RAPL power capping driver, make it ignore minor
hardware version mismatches (which only indicate exposing
additional features) and update register definitions in it to
enable PL4 support (Zhang Rui)
- Add Arrow Lake-U to the list of processors supporting PL4 in the
MSR part of the Intel RAPL power capping driver (Sumeet Pawnikar)
- Remove excess pci_disable_device() calls from the processor part of
the int340x thermal driver to address a warning triggered during
module unload and remove unused CPU hotplug code related to RAPL
support from it (Zhang Rui)"
* tag 'pm-6.12-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
thermal: intel: int340x: processor: Add MMIO RAPL PL4 support
thermal: intel: int340x: processor: Remove MMIO RAPL CPU hotplug support
powercap: intel_rapl_msr: Add PL4 support for Arrowlake-U
powercap: intel_rapl_tpmi: Ignore minor version change
thermal: intel: int340x: processor: Fix warning during module unload
powercap: intel_rapl_tpmi: Fix bogus register reading
This commit is contained in:
@@ -147,6 +147,7 @@ static const struct x86_cpu_id pl4_support_ids[] = {
|
||||
X86_MATCH_VFM(INTEL_RAPTORLAKE_P, NULL),
|
||||
X86_MATCH_VFM(INTEL_METEORLAKE, NULL),
|
||||
X86_MATCH_VFM(INTEL_METEORLAKE_L, NULL),
|
||||
X86_MATCH_VFM(INTEL_ARROWLAKE_U, NULL),
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define TPMI_RAPL_VERSION 1
|
||||
#define TPMI_RAPL_MAJOR_VERSION 0
|
||||
#define TPMI_RAPL_MINOR_VERSION 1
|
||||
|
||||
/* 1 header + 10 registers + 5 reserved. 8 bytes for each. */
|
||||
#define TPMI_RAPL_DOMAIN_SIZE 128
|
||||
@@ -154,11 +155,21 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
|
||||
tpmi_domain_size = tpmi_domain_header >> 16 & 0xff;
|
||||
tpmi_domain_flags = tpmi_domain_header >> 32 & 0xffff;
|
||||
|
||||
if (tpmi_domain_version != TPMI_RAPL_VERSION) {
|
||||
pr_warn(FW_BUG "Unsupported version:%d\n", tpmi_domain_version);
|
||||
if (tpmi_domain_version == TPMI_VERSION_INVALID) {
|
||||
pr_warn(FW_BUG "Invalid version\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (TPMI_MAJOR_VERSION(tpmi_domain_version) != TPMI_RAPL_MAJOR_VERSION) {
|
||||
pr_warn(FW_BUG "Unsupported major version:%ld\n",
|
||||
TPMI_MAJOR_VERSION(tpmi_domain_version));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (TPMI_MINOR_VERSION(tpmi_domain_version) > TPMI_RAPL_MINOR_VERSION)
|
||||
pr_info("Ignore: Unsupported minor version:%ld\n",
|
||||
TPMI_MINOR_VERSION(tpmi_domain_version));
|
||||
|
||||
/* Domain size: in unit of 128 Bytes */
|
||||
if (tpmi_domain_size != 1) {
|
||||
pr_warn(FW_BUG "Invalid Domain size %d\n", tpmi_domain_size);
|
||||
@@ -181,7 +192,7 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
|
||||
pr_warn(FW_BUG "System domain must support Domain Info register\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO);
|
||||
tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO * 8);
|
||||
if (!(tpmi_domain_info & TPMI_RAPL_DOMAIN_ROOT))
|
||||
return 0;
|
||||
domain_type = RAPL_DOMAIN_PLATFORM;
|
||||
|
||||
@@ -416,7 +416,6 @@ err_del_legacy:
|
||||
if (!pci_info->no_legacy)
|
||||
proc_thermal_remove(proc_priv);
|
||||
proc_thermal_mmio_remove(pdev, proc_priv);
|
||||
pci_disable_device(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -438,7 +437,6 @@ static void proc_thermal_pci_remove(struct pci_dev *pdev)
|
||||
proc_thermal_mmio_remove(pdev, pci_info->proc_priv);
|
||||
if (!pci_info->no_legacy)
|
||||
proc_thermal_remove(proc_priv);
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
@@ -13,48 +13,12 @@ static struct rapl_if_priv rapl_mmio_priv;
|
||||
|
||||
static const struct rapl_mmio_regs rapl_mmio_default = {
|
||||
.reg_unit = 0x5938,
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = { 0x59a0, 0x593c, 0x58f0, 0, 0x5930},
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = { 0x59a0, 0x593c, 0x58f0, 0, 0x5930, 0x59b0},
|
||||
.regs[RAPL_DOMAIN_DRAM] = { 0x58e0, 0x58e8, 0x58ec, 0, 0},
|
||||
.limits[RAPL_DOMAIN_PACKAGE] = BIT(POWER_LIMIT2),
|
||||
.limits[RAPL_DOMAIN_PACKAGE] = BIT(POWER_LIMIT2) | BIT(POWER_LIMIT4),
|
||||
.limits[RAPL_DOMAIN_DRAM] = BIT(POWER_LIMIT2),
|
||||
};
|
||||
|
||||
static int rapl_mmio_cpu_online(unsigned int cpu)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
|
||||
/* mmio rapl supports package 0 only for now */
|
||||
if (topology_physical_package_id(cpu))
|
||||
return 0;
|
||||
|
||||
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (!rp) {
|
||||
rp = rapl_add_package_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (IS_ERR(rp))
|
||||
return PTR_ERR(rp);
|
||||
}
|
||||
cpumask_set_cpu(cpu, &rp->cpumask);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rapl_mmio_cpu_down_prep(unsigned int cpu)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
int lead_cpu;
|
||||
|
||||
rp = rapl_find_package_domain_cpuslocked(cpu, &rapl_mmio_priv, true);
|
||||
if (!rp)
|
||||
return 0;
|
||||
|
||||
cpumask_clear_cpu(cpu, &rp->cpumask);
|
||||
lead_cpu = cpumask_first(&rp->cpumask);
|
||||
if (lead_cpu >= nr_cpu_ids)
|
||||
rapl_remove_package_cpuslocked(rp);
|
||||
else if (rp->lead_cpu == cpu)
|
||||
rp->lead_cpu = lead_cpu;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rapl_mmio_read_raw(int cpu, struct reg_action *ra)
|
||||
{
|
||||
if (!ra->reg.mmio)
|
||||
@@ -82,6 +46,7 @@ static int rapl_mmio_write_raw(int cpu, struct reg_action *ra)
|
||||
int proc_thermal_rapl_add(struct pci_dev *pdev, struct proc_thermal_device *proc_priv)
|
||||
{
|
||||
const struct rapl_mmio_regs *rapl_regs = &rapl_mmio_default;
|
||||
struct rapl_package *rp;
|
||||
enum rapl_domain_reg_id reg;
|
||||
enum rapl_domain_type domain;
|
||||
int ret;
|
||||
@@ -109,25 +74,38 @@ int proc_thermal_rapl_add(struct pci_dev *pdev, struct proc_thermal_device *proc
|
||||
return PTR_ERR(rapl_mmio_priv.control_type);
|
||||
}
|
||||
|
||||
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "powercap/rapl:online",
|
||||
rapl_mmio_cpu_online, rapl_mmio_cpu_down_prep);
|
||||
if (ret < 0) {
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
rapl_mmio_priv.control_type = NULL;
|
||||
return ret;
|
||||
/* Register a RAPL package device for package 0 which is always online */
|
||||
rp = rapl_find_package_domain(0, &rapl_mmio_priv, false);
|
||||
if (rp) {
|
||||
ret = -EEXIST;
|
||||
goto err;
|
||||
}
|
||||
|
||||
rp = rapl_add_package(0, &rapl_mmio_priv, false);
|
||||
if (IS_ERR(rp)) {
|
||||
ret = PTR_ERR(rp);
|
||||
goto err;
|
||||
}
|
||||
rapl_mmio_priv.pcap_rapl_online = ret;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
rapl_mmio_priv.control_type = NULL;
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(proc_thermal_rapl_add);
|
||||
|
||||
void proc_thermal_rapl_remove(void)
|
||||
{
|
||||
struct rapl_package *rp;
|
||||
|
||||
if (IS_ERR_OR_NULL(rapl_mmio_priv.control_type))
|
||||
return;
|
||||
|
||||
cpuhp_remove_state(rapl_mmio_priv.pcap_rapl_online);
|
||||
rp = rapl_find_package_domain(0, &rapl_mmio_priv, false);
|
||||
if (rp)
|
||||
rapl_remove_package(rp);
|
||||
powercap_unregister_control_type(rapl_mmio_priv.control_type);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(proc_thermal_rapl_remove);
|
||||
|
||||
Reference in New Issue
Block a user