Commit 5cbba605 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull power management updates from Rafael Wysocki:
 "These address some PCI device power management issues, add new
  hardware support to the RAPL power capping driver, add HWP guaranteed
  performance change notification support to the intel_pstate driver,
  replace deprecated CPU-hotplug functions in a few places, update CPU
  PM notifiers to use raw spinlocks, update the PM domains framework
  (new DT property support, Kconfig fix), do a couple of cleanups in
  code related to system sleep, and improve the energy model and the
  schedutil cpufreq governor.

  Specifics:

   - Address 3 PCI device power management issues (Rafael Wysocki).

   - Add Power Limit4 support for Alder Lake to the Intel RAPL power
     capping driver (Sumeet Pawnikar).

   - Add HWP guaranteed performance change notification support to the
     intel_pstate driver (Srinivas Pandruvada).

   - Replace deprecated CPU-hotplug functions in code related to power
     management (Sebastian Andrzej Siewior).

   - Update CPU PM notifiers to use raw spinlocks (Valentin Schneider).

   - Add support for 'required-opps' DT property to the generic power
     domains (genpd) framework and use this property for I2C on ARM64
     sc7180 (Rajendra Nayak).

   - Fix Kconfig issue related to genpd (Geert Uytterhoeven).

   - Increase energy calculation precision in the Energy Model (Lukasz
     Luba).

   - Fix kobject deletion in the exit code of the schedutil cpufreq
     governor (Kevin Hao).

   - Unmark some functions as kernel-doc in the PM core to avoid
     false-positive documentation build warnings (Randy Dunlap).

   - Check RTC features instead of ops in suspend_test Alexandre
     Belloni)"

* tag 'pm-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  PM: domains: Fix domain attach for CONFIG_PM_OPP=n
  powercap: Add Power Limit4 support for Alder Lake SoC
  cpufreq: intel_pstate: Process HWP Guaranteed change notification
  thermal: intel: Allow processing of HWP interrupt
  notifier: Remove atomic_notifier_call_chain_robust()
  PM: cpu: Make notifier chain use a raw_spinlock_t
  PM: sleep: unmark 'state' functions as kernel-doc
  arm64: dts: sc7180: Add required-opps for i2c
  PM: domains: Add support for 'required-opps' to set default perf state
  opp: Don't print an error if required-opps is missing
  cpufreq: schedutil: Use kobject release() method to free sugov_tunables
  PM: EM: Increase energy calculation precision
  PM: sleep: check RTC features instead of ops in suspend_test
  PM: sleep: s2idle: Replace deprecated CPU-hotplug functions
  cpufreq: Replace deprecated CPU-hotplug functions
  powercap: intel_rapl: Replace deprecated CPU-hotplug functions
  PCI: PM: Enable PME if it can be signaled from D3cold
  PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently
  PCI: Use pci_update_current_state() in pci_enable_device_flags()
parents 9b2eacd8 fe583359
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -786,6 +786,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -838,6 +840,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -890,6 +894,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -924,6 +930,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -976,6 +984,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1010,6 +1020,8 @@
						<&aggre1_noc MASTER_QUP_0 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1075,6 +1087,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1127,6 +1141,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1161,6 +1177,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1213,6 +1231,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1247,6 +1267,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

@@ -1299,6 +1321,8 @@
						<&aggre2_noc MASTER_QUP_1 0 &mc_virt SLAVE_EBI1 0>;
				interconnect-names = "qup-core", "qup-config",
							"qup-memory";
				power-domains = <&rpmhpd SC7180_CX>;
				required-opps = <&rpmhpd_opp_low_svs>;
				status = "disabled";
			};

+28 −2
Original line number Diff line number Diff line
@@ -2604,6 +2604,12 @@ static void genpd_dev_pm_detach(struct device *dev, bool power_off)

	dev_dbg(dev, "removing from PM domain %s\n", pd->name);

	/* Drop the default performance state */
	if (dev_gpd_data(dev)->default_pstate) {
		dev_pm_genpd_set_performance_state(dev, 0);
		dev_gpd_data(dev)->default_pstate = 0;
	}

	for (i = 1; i < GENPD_RETRY_MAX_MS; i <<= 1) {
		ret = genpd_remove_device(pd, dev);
		if (ret != -EAGAIN)
@@ -2643,6 +2649,7 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
{
	struct of_phandle_args pd_args;
	struct generic_pm_domain *pd;
	int pstate;
	int ret;

	ret = of_parse_phandle_with_args(dev->of_node, "power-domains",
@@ -2681,10 +2688,29 @@ static int __genpd_dev_pm_attach(struct device *dev, struct device *base_dev,
		genpd_unlock(pd);
	}

	if (ret)
	if (ret) {
		genpd_remove_device(pd, dev);
		return -EPROBE_DEFER;
	}

	return ret ? -EPROBE_DEFER : 1;
	/* Set the default performance state */
	pstate = of_get_required_opp_performance_state(dev->of_node, index);
	if (pstate < 0 && pstate != -ENODEV && pstate != -EOPNOTSUPP) {
		ret = pstate;
		goto err;
	} else if (pstate > 0) {
		ret = dev_pm_genpd_set_performance_state(dev, pstate);
		if (ret)
			goto err;
		dev_gpd_data(dev)->default_pstate = pstate;
	}
	return 1;

err:
	dev_err(dev, "failed to set required performance state for power-domain %s: %d\n",
		pd->name, ret);
	genpd_remove_device(pd, dev);
	return ret;
}

/**
+2 −2
Original line number Diff line number Diff line
@@ -163,9 +163,9 @@ static ssize_t store_cpb(struct cpufreq_policy *policy, const char *buf,
	if (ret || val > 1)
		return -EINVAL;

	get_online_cpus();
	cpus_read_lock();
	set_boost(policy, val);
	put_online_cpus();
	cpus_read_unlock();

	return count;
}
+3 −3
Original line number Diff line number Diff line
@@ -2654,18 +2654,18 @@ int cpufreq_boost_trigger_state(int state)
	cpufreq_driver->boost_enabled = state;
	write_unlock_irqrestore(&cpufreq_driver_lock, flags);

	get_online_cpus();
	cpus_read_lock();
	for_each_active_policy(policy) {
		ret = cpufreq_driver->set_boost(policy, state);
		if (ret)
			goto err_reset_state;
	}
	put_online_cpus();
	cpus_read_unlock();

	return 0;

err_reset_state:
	put_online_cpus();
	cpus_read_unlock();

	write_lock_irqsave(&cpufreq_driver_lock, flags);
	cpufreq_driver->boost_enabled = !state;
+2 −2
Original line number Diff line number Diff line
@@ -418,7 +418,7 @@ static void od_set_powersave_bias(unsigned int powersave_bias)
	default_powersave_bias = powersave_bias;
	cpumask_clear(&done);

	get_online_cpus();
	cpus_read_lock();
	for_each_online_cpu(cpu) {
		struct cpufreq_policy *policy;
		struct policy_dbs_info *policy_dbs;
@@ -442,7 +442,7 @@ static void od_set_powersave_bias(unsigned int powersave_bias)
		od_tuners = dbs_data->tuners;
		od_tuners->powersave_bias = default_powersave_bias;
	}
	put_online_cpus();
	cpus_read_unlock();
}

void od_register_powersave_bias_handler(unsigned int (*f)
Loading