Merge branches 'pm-core', 'pm-sleep', 'pm-tools' and 'powercap'
* pm-core: PM: runtime: Fix typo in pm_runtime_set_active() helper comment * pm-sleep: PM: sleep: remove unreachable break * pm-tools: cpupower: speed up generating git version string cpupowerutils: fix spelling mistake "dependant" -> "dependent" * powercap: powercap: Fix typo in Kconfig "Plance" -> "Plane" powercap/intel_rapl: enumerate Psys RAPL domain together with package RAPL domain powercap/intel_rapl: Fix domain detection
This commit is contained in:
Коммит
71d47b53de
|
@ -363,7 +363,6 @@ static pm_callback_t pm_op(const struct dev_pm_ops *ops, pm_message_t state)
|
|||
case PM_EVENT_THAW:
|
||||
case PM_EVENT_RECOVER:
|
||||
return ops->thaw;
|
||||
break;
|
||||
case PM_EVENT_RESTORE:
|
||||
return ops->restore;
|
||||
#endif /* CONFIG_HIBERNATE_CALLBACKS */
|
||||
|
|
|
@ -30,7 +30,7 @@ config INTEL_RAPL
|
|||
|
||||
In RAPL, the platform level settings are divided into domains for
|
||||
fine grained control. These domains include processor package, DRAM
|
||||
controller, CPU core (Power Plance 0), graphics uncore (Power Plane
|
||||
controller, CPU core (Power Plane 0), graphics uncore (Power Plane
|
||||
1), etc.
|
||||
|
||||
config IDLE_INJECT
|
||||
|
|
|
@ -544,7 +544,14 @@ static void rapl_init_domains(struct rapl_package *rp)
|
|||
continue;
|
||||
|
||||
rd->rp = rp;
|
||||
rd->name = rapl_domain_names[i];
|
||||
|
||||
if (i == RAPL_DOMAIN_PLATFORM && rp->id > 0) {
|
||||
snprintf(rd->name, RAPL_DOMAIN_NAME_LENGTH, "psys-%d",
|
||||
cpu_data(rp->lead_cpu).phys_proc_id);
|
||||
} else
|
||||
snprintf(rd->name, RAPL_DOMAIN_NAME_LENGTH, "%s",
|
||||
rapl_domain_names[i]);
|
||||
|
||||
rd->id = i;
|
||||
rd->rpl[0].prim_id = PL1_ENABLE;
|
||||
rd->rpl[0].name = pl1_name;
|
||||
|
@ -1112,13 +1119,17 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
|
|||
}
|
||||
/* now register domains as children of the socket/package */
|
||||
for (rd = rp->domains; rd < rp->domains + rp->nr_domains; rd++) {
|
||||
struct powercap_zone *parent = rp->power_zone;
|
||||
|
||||
if (rd->id == RAPL_DOMAIN_PACKAGE)
|
||||
continue;
|
||||
if (rd->id == RAPL_DOMAIN_PLATFORM)
|
||||
parent = NULL;
|
||||
/* number of power limits per domain varies */
|
||||
nr_pl = find_nr_power_limit(rd);
|
||||
power_zone = powercap_register_zone(&rd->power_zone,
|
||||
rp->priv->control_type,
|
||||
rd->name, rp->power_zone,
|
||||
rd->name, parent,
|
||||
&zone_ops[rd->id], nr_pl,
|
||||
&constraint_ops);
|
||||
|
||||
|
@ -1145,67 +1156,6 @@ err_cleanup:
|
|||
return ret;
|
||||
}
|
||||
|
||||
int rapl_add_platform_domain(struct rapl_if_priv *priv)
|
||||
{
|
||||
struct rapl_domain *rd;
|
||||
struct powercap_zone *power_zone;
|
||||
struct reg_action ra;
|
||||
int ret;
|
||||
|
||||
ra.reg = priv->regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_STATUS];
|
||||
ra.mask = ~0;
|
||||
ret = priv->read_raw(0, &ra);
|
||||
if (ret || !ra.value)
|
||||
return -ENODEV;
|
||||
|
||||
ra.reg = priv->regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_LIMIT];
|
||||
ra.mask = ~0;
|
||||
ret = priv->read_raw(0, &ra);
|
||||
if (ret || !ra.value)
|
||||
return -ENODEV;
|
||||
|
||||
rd = kzalloc(sizeof(*rd), GFP_KERNEL);
|
||||
if (!rd)
|
||||
return -ENOMEM;
|
||||
|
||||
rd->name = rapl_domain_names[RAPL_DOMAIN_PLATFORM];
|
||||
rd->id = RAPL_DOMAIN_PLATFORM;
|
||||
rd->regs[RAPL_DOMAIN_REG_LIMIT] =
|
||||
priv->regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_LIMIT];
|
||||
rd->regs[RAPL_DOMAIN_REG_STATUS] =
|
||||
priv->regs[RAPL_DOMAIN_PLATFORM][RAPL_DOMAIN_REG_STATUS];
|
||||
rd->rpl[0].prim_id = PL1_ENABLE;
|
||||
rd->rpl[0].name = pl1_name;
|
||||
rd->rpl[1].prim_id = PL2_ENABLE;
|
||||
rd->rpl[1].name = pl2_name;
|
||||
rd->rp = rapl_find_package_domain(0, priv);
|
||||
|
||||
power_zone = powercap_register_zone(&rd->power_zone, priv->control_type,
|
||||
"psys", NULL,
|
||||
&zone_ops[RAPL_DOMAIN_PLATFORM],
|
||||
2, &constraint_ops);
|
||||
|
||||
if (IS_ERR(power_zone)) {
|
||||
kfree(rd);
|
||||
return PTR_ERR(power_zone);
|
||||
}
|
||||
|
||||
priv->platform_rapl_domain = rd;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rapl_add_platform_domain);
|
||||
|
||||
void rapl_remove_platform_domain(struct rapl_if_priv *priv)
|
||||
{
|
||||
if (priv->platform_rapl_domain) {
|
||||
powercap_unregister_zone(priv->control_type,
|
||||
&priv->platform_rapl_domain->power_zone);
|
||||
kfree(priv->platform_rapl_domain);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rapl_remove_platform_domain);
|
||||
|
||||
static int rapl_check_domain(int cpu, int domain, struct rapl_package *rp)
|
||||
{
|
||||
struct reg_action ra;
|
||||
|
@ -1215,11 +1165,9 @@ static int rapl_check_domain(int cpu, int domain, struct rapl_package *rp)
|
|||
case RAPL_DOMAIN_PP0:
|
||||
case RAPL_DOMAIN_PP1:
|
||||
case RAPL_DOMAIN_DRAM:
|
||||
case RAPL_DOMAIN_PLATFORM:
|
||||
ra.reg = rp->priv->regs[domain][RAPL_DOMAIN_REG_STATUS];
|
||||
break;
|
||||
case RAPL_DOMAIN_PLATFORM:
|
||||
/* PSYS(PLATFORM) is not a CPU domain, so avoid printng error */
|
||||
return -EINVAL;
|
||||
default:
|
||||
pr_err("invalid domain id %d\n", domain);
|
||||
return -EINVAL;
|
||||
|
@ -1228,7 +1176,7 @@ static int rapl_check_domain(int cpu, int domain, struct rapl_package *rp)
|
|||
* values, otherwise skip it.
|
||||
*/
|
||||
|
||||
ra.mask = ~0;
|
||||
ra.mask = ENERGY_STATUS_MASK;
|
||||
if (rp->priv->read_raw(cpu, &ra) || !ra.value)
|
||||
return -ENODEV;
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ static struct rapl_if_priv rapl_msr_priv = {
|
|||
.regs[RAPL_DOMAIN_PLATFORM] = {
|
||||
MSR_PLATFORM_POWER_LIMIT, MSR_PLATFORM_ENERGY_STATUS, 0, 0, 0},
|
||||
.limits[RAPL_DOMAIN_PACKAGE] = 2,
|
||||
.limits[RAPL_DOMAIN_PLATFORM] = 2,
|
||||
};
|
||||
|
||||
/* Handles CPU hotplug on multi-socket systems.
|
||||
|
@ -157,9 +158,6 @@ static int rapl_msr_probe(struct platform_device *pdev)
|
|||
goto out;
|
||||
rapl_msr_priv.pcap_rapl_online = ret;
|
||||
|
||||
/* Don't bail out if PSys is not supported */
|
||||
rapl_add_platform_domain(&rapl_msr_priv);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
|
@ -171,7 +169,6 @@ out:
|
|||
static int rapl_msr_remove(struct platform_device *pdev)
|
||||
{
|
||||
cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online);
|
||||
rapl_remove_platform_domain(&rapl_msr_priv);
|
||||
powercap_unregister_control_type(rapl_msr_priv.control_type);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -79,8 +79,10 @@ struct rapl_power_limit {
|
|||
|
||||
struct rapl_package;
|
||||
|
||||
#define RAPL_DOMAIN_NAME_LENGTH 16
|
||||
|
||||
struct rapl_domain {
|
||||
const char *name;
|
||||
char name[RAPL_DOMAIN_NAME_LENGTH];
|
||||
enum rapl_domain_type id;
|
||||
u64 regs[RAPL_DOMAIN_REG_MAX];
|
||||
struct powercap_zone power_zone;
|
||||
|
@ -152,7 +154,4 @@ struct rapl_package *rapl_find_package_domain(int cpu, struct rapl_if_priv *priv
|
|||
struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv);
|
||||
void rapl_remove_package(struct rapl_package *rp);
|
||||
|
||||
int rapl_add_platform_domain(struct rapl_if_priv *priv);
|
||||
void rapl_remove_platform_domain(struct rapl_if_priv *priv);
|
||||
|
||||
#endif /* __INTEL_RAPL_H__ */
|
||||
|
|
|
@ -479,7 +479,7 @@ static inline int pm_runtime_set_active(struct device *dev)
|
|||
}
|
||||
|
||||
/**
|
||||
* pm_runtime_set_suspended - Set runtime PM status to "active".
|
||||
* pm_runtime_set_suspended - Set runtime PM status to "suspended".
|
||||
* @dev: Target device.
|
||||
*
|
||||
* Set the runtime PM status of @dev to %RPM_SUSPENDED and ensure that
|
||||
|
|
|
@ -51,7 +51,7 @@ DESTDIR ?=
|
|||
# Package-related definitions. Distributions can modify the version
|
||||
# and _should_ modify the PACKAGE_BUGREPORT definition
|
||||
|
||||
VERSION= $(shell ./utils/version-gen.sh)
|
||||
VERSION:= $(shell ./utils/version-gen.sh)
|
||||
LIB_MAJ= 0.0.1
|
||||
LIB_MIN= 0
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ int main (void)
|
|||
printf("\tsmi_cmd=0x?? smi_port=0x?? smi_sig=1\n");
|
||||
printf("\nUnfortunately, you have to know what exactly are "
|
||||
"smi_cmd and smi_port, and this\nis system "
|
||||
"dependant.\n");
|
||||
"dependent.\n");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче