forked from mirrors/linux
		
	 b018fc9800
			
		
	
	
		b018fc9800
		
	
	
	
	
		
			
			- Add a new framework for CPU idle time injection (Daniel Lezcano).
 
  - Add AVS support to the armada-37xx cpufreq driver (Gregory CLEMENT).
 
  - Add support for current CPU frequency reporting to the ACPI CPPC
    cpufreq driver (George Cherian).
 
  - Rework the cooling device registration in the imx6q/thermal
    driver (Bastian Stender).
 
  - Make the pcc-cpufreq driver refuse to work with dynamic
    scaling governors on systems with many CPUs to avoid
    scalability issues with it (Rafael Wysocki).
 
  - Fix the intel_pstate driver to report different maximum CPU
    frequencies on systems where they really are different and to
    ignore the turbo active ratio if hardware-managend P-states (HWP)
    are in use; make it use the match_string() helper (Xie Yisheng,
    Srinivas Pandruvada).
 
  - Fix a minor deferred probe issue in the qcom-kryo cpufreq
    driver (Niklas Cassel).
 
  - Add a tracepoint for the tracking of frequency limits changes
    (from Andriod) to the cpufreq core (Ruchi Kandoi).
 
  - Fix a circular lock dependency between CPU hotplug and sysfs
    locking in the cpufreq core reported by lockdep (Waiman Long).
 
  - Avoid excessive error reports on driver registration failures
    in the ARM cpuidle driver (Sudeep Holla).
 
  - Add a new device links flag to the driver core to make links go
    away automatically on supplier driver removal (Vivek Gautam).
 
  - Eliminate potential race condition between system-wide power
    management transitions and system shutdown (Pingfan Liu).
 
  - Add a quirk to save NVS memory on system suspend for the ASUS
    1025C laptop (Willy Tarreau).
 
  - Make more systems use suspend-to-idle (instead of ACPI S3) by
    default (Tristian Celestin).
 
  - Get rid of stack VLA usage in the low-level hibernation code on
    64-bit x86 (Kees Cook).
 
  - Fix error handling in the hibernation core and mark an expected
    fall-through switch in it (Chengguang Xu, Gustavo Silva).
 
  - Extend the generic power domains (genpd) framework to support
    attaching a device to a power domain by name (Ulf Hansson).
 
  - Fix device reference counting and user limits initialization in
    the devfreq core (Arvind Yadav, Matthias Kaehlcke).
 
  - Fix a few issues in the rk3399_dmc devfreq driver and improve its
    documentation (Enric Balletbo i Serra, Lin Huang, Nick Milner).
 
  - Drop a redundant error message from the exynos-ppmu devfreq driver
    (Markus Elfring).
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
 iQIcBAABCAAGBQJbcqOqAAoJEILEb/54YlRxOxMP/2ZFvnXU0pey/VX/+TelLMS7
 /ROVGQ+s75QP1c9P/3BjvnXc0dsMRLRFPog+7wyoG/2DbEIV25COyAYsmSE0TRni
 XUaZO6YAx4/e3pm2AfamYbLCPvjw85eucHg5QJQ4b1mSVRNJOsNv+fUo6lmxwvnm
 j9kHvfttFeIhoa/3wa7hbhPKLln46atnpVSxCIceY7L5EFNhkKBvQt6B5yx9geb9
 QMY6ohgkyN+bnK9QySXX+trcWpzx1uGX0apI07NkX7n9QGFdU4lCW8lsAf8jMC3g
 PPValTsUQsdRONUJJsrgqBioq4tvtgQWibyS2tfRrOGXYvHpJNpGmHVplfsrf/SE
 cvlsciR47YbmrXZuqg/r8hql+qefNN16/rnZIZ9VnbcG806VBy2z8IzI5wcdWR7p
 vzxhbCqVqOHcEdEwRwvuM2io67MWvkGtKsbCP+33DBh8SubpsECpKN4nIDboa3SE
 CJ15RUqXnF6enmmfCKOoHZeu7iXWDz6Pi71XmRzaj9DqbITVV281IerqLgV3rbal
 BVa53+202iD0IP+2b7KedGe/5ALlI97ffN0gB+L/eB832853DKSZQKzcvvpRhEN7
 Iv2crnUwuQED9ns8P7hzp1Bk9CFCAOLW8UM43YwZRPWnmdeSsPJusJ5lzkAf7bss
 wfsFoUE3RaY4msnuHyCh
 =kv2M
 -----END PGP SIGNATURE-----
Merge tag 'pm-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management updates from Rafael Wysocki:
 "These add a new framework for CPU idle time injection, to be used by
  all of the idle injection code in the kernel in the future, fix some
  issues and add a number of relatively small extensions in multiple
  places.
  Specifics:
   - Add a new framework for CPU idle time injection (Daniel Lezcano).
   - Add AVS support to the armada-37xx cpufreq driver (Gregory
     CLEMENT).
   - Add support for current CPU frequency reporting to the ACPI CPPC
     cpufreq driver (George Cherian).
   - Rework the cooling device registration in the imx6q/thermal driver
     (Bastian Stender).
   - Make the pcc-cpufreq driver refuse to work with dynamic scaling
     governors on systems with many CPUs to avoid scalability issues
     with it (Rafael Wysocki).
   - Fix the intel_pstate driver to report different maximum CPU
     frequencies on systems where they really are different and to
     ignore the turbo active ratio if hardware-managend P-states (HWP)
     are in use; make it use the match_string() helper (Xie Yisheng,
     Srinivas Pandruvada).
   - Fix a minor deferred probe issue in the qcom-kryo cpufreq driver
     (Niklas Cassel).
   - Add a tracepoint for the tracking of frequency limits changes (from
     Andriod) to the cpufreq core (Ruchi Kandoi).
   - Fix a circular lock dependency between CPU hotplug and sysfs
     locking in the cpufreq core reported by lockdep (Waiman Long).
   - Avoid excessive error reports on driver registration failures in
     the ARM cpuidle driver (Sudeep Holla).
   - Add a new device links flag to the driver core to make links go
     away automatically on supplier driver removal (Vivek Gautam).
   - Eliminate potential race condition between system-wide power
     management transitions and system shutdown (Pingfan Liu).
   - Add a quirk to save NVS memory on system suspend for the ASUS 1025C
     laptop (Willy Tarreau).
   - Make more systems use suspend-to-idle (instead of ACPI S3) by
     default (Tristian Celestin).
   - Get rid of stack VLA usage in the low-level hibernation code on
     64-bit x86 (Kees Cook).
   - Fix error handling in the hibernation core and mark an expected
     fall-through switch in it (Chengguang Xu, Gustavo Silva).
   - Extend the generic power domains (genpd) framework to support
     attaching a device to a power domain by name (Ulf Hansson).
   - Fix device reference counting and user limits initialization in the
     devfreq core (Arvind Yadav, Matthias Kaehlcke).
   - Fix a few issues in the rk3399_dmc devfreq driver and improve its
     documentation (Enric Balletbo i Serra, Lin Huang, Nick Milner).
   - Drop a redundant error message from the exynos-ppmu devfreq driver
     (Markus Elfring)"
* tag 'pm-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (35 commits)
  PM / reboot: Eliminate race between reboot and suspend
  PM / hibernate: Mark expected switch fall-through
  cpufreq: intel_pstate: Ignore turbo active ratio in HWP
  cpufreq: Fix a circular lock dependency problem
  cpu/hotplug: Add a cpus_read_trylock() function
  x86/power/hibernate_64: Remove VLA usage
  cpufreq: trace frequency limits change
  cpufreq: intel_pstate: Show different max frequency with turbo 3 and HWP
  cpufreq: pcc-cpufreq: Disable dynamic scaling on many-CPU systems
  cpufreq: qcom-kryo: Silently error out on EPROBE_DEFER
  cpufreq / CPPC: Add cpuinfo_cur_freq support for CPPC
  cpufreq: armada-37xx: Add AVS support
  dt-bindings: marvell: Add documentation for the Armada 3700 AVS binding
  PM / devfreq: rk3399_dmc: Fix duplicated opp table on reload.
  PM / devfreq: Init user limits from OPP limits, not viceversa
  PM / devfreq: rk3399_dmc: fix spelling mistakes.
  PM / devfreq: rk3399_dmc: do not print error when get supply and clk defer.
  dt-bindings: devfreq: rk3399_dmc: move interrupts to be optional.
  PM / devfreq: rk3399_dmc: remove wait for dcf irq event.
  dt-bindings: clock: add rk3399 DDR3 standard speed bins.
  ...
		
	
			
		
			
				
	
	
		
			192 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * include/linux/cpu.h - generic cpu definition
 | |
|  *
 | |
|  * This is mainly for topological representation. We define the 
 | |
|  * basic 'struct cpu' here, which can be embedded in per-arch 
 | |
|  * definitions of processors.
 | |
|  *
 | |
|  * Basic handling of the devices is done in drivers/base/cpu.c
 | |
|  *
 | |
|  * CPUs are exported via sysfs in the devices/system/cpu
 | |
|  * directory. 
 | |
|  */
 | |
| #ifndef _LINUX_CPU_H_
 | |
| #define _LINUX_CPU_H_
 | |
| 
 | |
| #include <linux/node.h>
 | |
| #include <linux/compiler.h>
 | |
| #include <linux/cpumask.h>
 | |
| #include <linux/cpuhotplug.h>
 | |
| 
 | |
| struct device;
 | |
| struct device_node;
 | |
| struct attribute_group;
 | |
| 
 | |
| struct cpu {
 | |
| 	int node_id;		/* The node which contains the CPU */
 | |
| 	int hotpluggable;	/* creates sysfs control file if hotpluggable */
 | |
| 	struct device dev;
 | |
| };
 | |
| 
 | |
| extern void boot_cpu_init(void);
 | |
| extern void boot_cpu_hotplug_init(void);
 | |
| extern void cpu_init(void);
 | |
| extern void trap_init(void);
 | |
| 
 | |
| extern int register_cpu(struct cpu *cpu, int num);
 | |
| extern struct device *get_cpu_device(unsigned cpu);
 | |
| extern bool cpu_is_hotpluggable(unsigned cpu);
 | |
| extern bool arch_match_cpu_phys_id(int cpu, u64 phys_id);
 | |
| extern bool arch_find_n_match_cpu_physical_id(struct device_node *cpun,
 | |
| 					      int cpu, unsigned int *thread);
 | |
| 
 | |
| extern int cpu_add_dev_attr(struct device_attribute *attr);
 | |
| extern void cpu_remove_dev_attr(struct device_attribute *attr);
 | |
| 
 | |
| extern int cpu_add_dev_attr_group(struct attribute_group *attrs);
 | |
| extern void cpu_remove_dev_attr_group(struct attribute_group *attrs);
 | |
| 
 | |
| extern ssize_t cpu_show_meltdown(struct device *dev,
 | |
| 				 struct device_attribute *attr, char *buf);
 | |
| extern ssize_t cpu_show_spectre_v1(struct device *dev,
 | |
| 				   struct device_attribute *attr, char *buf);
 | |
| extern ssize_t cpu_show_spectre_v2(struct device *dev,
 | |
| 				   struct device_attribute *attr, char *buf);
 | |
| extern ssize_t cpu_show_spec_store_bypass(struct device *dev,
 | |
| 					  struct device_attribute *attr, char *buf);
 | |
| extern ssize_t cpu_show_l1tf(struct device *dev,
 | |
| 			     struct device_attribute *attr, char *buf);
 | |
| 
 | |
| extern __printf(4, 5)
 | |
| struct device *cpu_device_create(struct device *parent, void *drvdata,
 | |
| 				 const struct attribute_group **groups,
 | |
| 				 const char *fmt, ...);
 | |
| #ifdef CONFIG_HOTPLUG_CPU
 | |
| extern void unregister_cpu(struct cpu *cpu);
 | |
| extern ssize_t arch_cpu_probe(const char *, size_t);
 | |
| extern ssize_t arch_cpu_release(const char *, size_t);
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * These states are not related to the core CPU hotplug mechanism. They are
 | |
|  * used by various (sub)architectures to track internal state
 | |
|  */
 | |
| #define CPU_ONLINE		0x0002 /* CPU is up */
 | |
| #define CPU_UP_PREPARE		0x0003 /* CPU coming up */
 | |
| #define CPU_DEAD		0x0007 /* CPU dead */
 | |
| #define CPU_DEAD_FROZEN		0x0008 /* CPU timed out on unplug */
 | |
| #define CPU_POST_DEAD		0x0009 /* CPU successfully unplugged */
 | |
| #define CPU_BROKEN		0x000B /* CPU did not die properly */
 | |
| 
 | |
| #ifdef CONFIG_SMP
 | |
| extern bool cpuhp_tasks_frozen;
 | |
| int cpu_up(unsigned int cpu);
 | |
| void notify_cpu_starting(unsigned int cpu);
 | |
| extern void cpu_maps_update_begin(void);
 | |
| extern void cpu_maps_update_done(void);
 | |
| 
 | |
| #else	/* CONFIG_SMP */
 | |
| #define cpuhp_tasks_frozen	0
 | |
| 
 | |
| static inline void cpu_maps_update_begin(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| static inline void cpu_maps_update_done(void)
 | |
| {
 | |
| }
 | |
| 
 | |
| #endif /* CONFIG_SMP */
 | |
| extern struct bus_type cpu_subsys;
 | |
| 
 | |
| #ifdef CONFIG_HOTPLUG_CPU
 | |
| extern void cpus_write_lock(void);
 | |
| extern void cpus_write_unlock(void);
 | |
| extern void cpus_read_lock(void);
 | |
| extern void cpus_read_unlock(void);
 | |
| extern int  cpus_read_trylock(void);
 | |
| extern void lockdep_assert_cpus_held(void);
 | |
| extern void cpu_hotplug_disable(void);
 | |
| extern void cpu_hotplug_enable(void);
 | |
| void clear_tasks_mm_cpumask(int cpu);
 | |
| int cpu_down(unsigned int cpu);
 | |
| 
 | |
| #else /* CONFIG_HOTPLUG_CPU */
 | |
| 
 | |
| static inline void cpus_write_lock(void) { }
 | |
| static inline void cpus_write_unlock(void) { }
 | |
| static inline void cpus_read_lock(void) { }
 | |
| static inline void cpus_read_unlock(void) { }
 | |
| static inline int  cpus_read_trylock(void) { return true; }
 | |
| static inline void lockdep_assert_cpus_held(void) { }
 | |
| static inline void cpu_hotplug_disable(void) { }
 | |
| static inline void cpu_hotplug_enable(void) { }
 | |
| #endif	/* !CONFIG_HOTPLUG_CPU */
 | |
| 
 | |
| /* Wrappers which go away once all code is converted */
 | |
| static inline void cpu_hotplug_begin(void) { cpus_write_lock(); }
 | |
| static inline void cpu_hotplug_done(void) { cpus_write_unlock(); }
 | |
| static inline void get_online_cpus(void) { cpus_read_lock(); }
 | |
| static inline void put_online_cpus(void) { cpus_read_unlock(); }
 | |
| 
 | |
| #ifdef CONFIG_PM_SLEEP_SMP
 | |
| extern int freeze_secondary_cpus(int primary);
 | |
| static inline int disable_nonboot_cpus(void)
 | |
| {
 | |
| 	return freeze_secondary_cpus(0);
 | |
| }
 | |
| extern void enable_nonboot_cpus(void);
 | |
| #else /* !CONFIG_PM_SLEEP_SMP */
 | |
| static inline int disable_nonboot_cpus(void) { return 0; }
 | |
| static inline void enable_nonboot_cpus(void) {}
 | |
| #endif /* !CONFIG_PM_SLEEP_SMP */
 | |
| 
 | |
| void cpu_startup_entry(enum cpuhp_state state);
 | |
| 
 | |
| void cpu_idle_poll_ctrl(bool enable);
 | |
| 
 | |
| /* Attach to any functions which should be considered cpuidle. */
 | |
| #define __cpuidle	__attribute__((__section__(".cpuidle.text")))
 | |
| 
 | |
| bool cpu_in_idle(unsigned long pc);
 | |
| 
 | |
| void arch_cpu_idle(void);
 | |
| void arch_cpu_idle_prepare(void);
 | |
| void arch_cpu_idle_enter(void);
 | |
| void arch_cpu_idle_exit(void);
 | |
| void arch_cpu_idle_dead(void);
 | |
| 
 | |
| int cpu_report_state(int cpu);
 | |
| int cpu_check_up_prepare(int cpu);
 | |
| void cpu_set_state_online(int cpu);
 | |
| void play_idle(unsigned long duration_ms);
 | |
| 
 | |
| #ifdef CONFIG_HOTPLUG_CPU
 | |
| bool cpu_wait_death(unsigned int cpu, int seconds);
 | |
| bool cpu_report_death(void);
 | |
| void cpuhp_report_idle_dead(void);
 | |
| #else
 | |
| static inline void cpuhp_report_idle_dead(void) { }
 | |
| #endif /* #ifdef CONFIG_HOTPLUG_CPU */
 | |
| 
 | |
| enum cpuhp_smt_control {
 | |
| 	CPU_SMT_ENABLED,
 | |
| 	CPU_SMT_DISABLED,
 | |
| 	CPU_SMT_FORCE_DISABLED,
 | |
| 	CPU_SMT_NOT_SUPPORTED,
 | |
| };
 | |
| 
 | |
| #if defined(CONFIG_SMP) && defined(CONFIG_HOTPLUG_SMT)
 | |
| extern enum cpuhp_smt_control cpu_smt_control;
 | |
| extern void cpu_smt_disable(bool force);
 | |
| extern void cpu_smt_check_topology_early(void);
 | |
| extern void cpu_smt_check_topology(void);
 | |
| #else
 | |
| # define cpu_smt_control		(CPU_SMT_ENABLED)
 | |
| static inline void cpu_smt_disable(bool force) { }
 | |
| static inline void cpu_smt_check_topology_early(void) { }
 | |
| static inline void cpu_smt_check_topology(void) { }
 | |
| #endif
 | |
| 
 | |
| #endif /* _LINUX_CPU_H_ */
 |