diff options
| author | Linus Torvalds <[email protected]> | 2020-10-23 16:27:03 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2020-10-23 16:27:03 -0700 | 
| commit | 41f762a15a6324f67c3f084ece694c26f196cece (patch) | |
| tree | aa71ab100fbf1ba2cd0f911ba1cc19d133510ee2 /drivers/powercap/intel_rapl_common.c | |
| parent | af995383eb653f875c4e4e2349d5b0b4ba839eaa (diff) | |
| parent | 41c169d9ae2c890552044e129d101995b62c8a02 (diff) | |
Merge tag 'pm-5.10-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more power management updates from Rafael Wysocki:
 "First of all, the adaptive voltage scaling (AVS) drivers go to new
  platform-specific locations as planned (this part was reported to have
  merge conflicts against the new arm-soc updates in linux-next).
  In addition to that, there are some fixes (intel_idle, intel_pstate,
  RAPL, acpi_cpufreq), the addition of on/off notifiers and idle state
  accounting support to the generic power domains (genpd) code and some
  janitorial changes all over.
  Specifics:
   - Move the AVS drivers to new platform-specific locations and get rid
     of the drivers/power/avs directory (Ulf Hansson).
   - Add on/off notifiers and idle state accounting support to the
     generic power domains (genpd) framework (Ulf Hansson, Lina Iyer).
   - Ulf will maintain the PM domain part of cpuidle-psci (Ulf Hansson).
   - Make intel_idle disregard ACPI _CST if it cannot use the data
     returned by that method (Mel Gorman).
   - Modify intel_pstate to avoid leaving useless sysfs directory
     structure behind if it cannot be registered (Chen Yu).
   - Fix domain detection in the RAPL power capping driver and prevent
     it from failing to enumerate the Psys RAPL domain (Zhang Rui).
   - Allow acpi-cpufreq to use ACPI _PSD information with Family 19 and
     later AMD chips (Wei Huang).
   - Update the driver assumptions comment in intel_idle and fix a
     kerneldoc comment in the runtime PM framework (Alexander Monakov,
     Bean Huo).
   - Avoid unnecessary resets of the cached frequency in the schedutil
     cpufreq governor to reduce overhead (Wei Wang).
   - Clean up the cpufreq core a bit (Viresh Kumar).
   - Make assorted minor janitorial changes (Daniel Lezcano, Geert
     Uytterhoeven, Hubert Jasudowicz, Tom Rix).
   - Clean up and optimize the cpupower utility somewhat (Colin Ian
     King, Martin Kaistra)"
* tag 'pm-5.10-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (23 commits)
  PM: sleep: remove unreachable break
  PM: AVS: Drop the avs directory and the corresponding Kconfig
  PM: AVS: qcom-cpr: Move the driver to the qcom specific drivers
  PM: runtime: Fix typo in pm_runtime_set_active() helper comment
  PM: domains: Fix build error for genpd notifiers
  powercap: Fix typo in Kconfig "Plance" -> "Plane"
  cpufreq: schedutil: restore cached freq when next_f is not changed
  acpi-cpufreq: Honor _PSD table setting on new AMD CPUs
  PM: AVS: smartreflex Move driver to soc specific drivers
  PM: AVS: rockchip-io: Move the driver to the rockchip specific drivers
  PM: domains: enable domain idle state accounting
  PM: domains: Add curly braces to delimit comment + statement block
  PM: domains: Add support for PM domain on/off notifiers for genpd
  powercap/intel_rapl: enumerate Psys RAPL domain together with package RAPL domain
  powercap/intel_rapl: Fix domain detection
  intel_idle: Ignore _CST if control cannot be taken from the platform
  cpuidle: Remove pointless stub
  intel_idle: mention assumption that WBINVD is not needed
  MAINTAINERS: Add section for cpuidle-psci PM domain
  cpufreq: intel_pstate: Delete intel_pstate sysfs if failed to register the driver
  ...
Diffstat (limited to 'drivers/powercap/intel_rapl_common.c')
| -rw-r--r-- | drivers/powercap/intel_rapl_common.c | 82 | 
1 files changed, 15 insertions, 67 deletions
diff --git a/drivers/powercap/intel_rapl_common.c b/drivers/powercap/intel_rapl_common.c index 983d75bd5bd1..0b2830efc574 100644 --- a/drivers/powercap/intel_rapl_common.c +++ b/drivers/powercap/intel_rapl_common.c @@ -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;  |