mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 06:18:54 +00:00 
			
		
		
		
	 9c9a43ed27
			
		
	
	
		9c9a43ed27
		
	
	
	
	
		
			
			I just stumbled on this bug/feature, this is how to reproduce it: # echo 450000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq # echo 450000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq # echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # cpufreq-info -p 450000 450000 powersave # echo 1800000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq ; echo $? 0 # cpufreq-info -p 450000 450000 powersave Here it is. The kernel refuses to set a min_freq higher than the max_freq but it allows a max_freq lower than min_freq (lowering min_freq also). This behaviour is pretty straightforward (but undocumented) and it doesn't return an error altough failing to accomplish the requested action (set min_freq). The problem (IMO) is basically that userspace is not allowed to set a full policy atomically while the kernel always does that thus it must enforce an ordering on operations. The attached patch returns -EINVAL if trying to increase frequencies starting from scaling_min_freq and documents the correct ordering of writes. Signed-off-by: Mattia Dongili <malattia@linux.it> Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net> Signed-off-by: Dave Jones <davej@redhat.com> --
		
			
				
	
	
		
			189 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|      CPU frequency and voltage scaling code in the Linux(TM) kernel
 | |
| 
 | |
| 
 | |
| 		         L i n u x    C P U F r e q
 | |
| 
 | |
| 			     U S E R   G U I D E
 | |
| 
 | |
| 
 | |
| 		    Dominik Brodowski  <linux@brodo.de>
 | |
| 
 | |
| 
 | |
| 
 | |
|    Clock scaling allows you to change the clock speed of the CPUs on the
 | |
|     fly. This is a nice method to save battery power, because the lower
 | |
|             the clock speed, the less power the CPU consumes.
 | |
| 
 | |
| 
 | |
| Contents:
 | |
| ---------
 | |
| 1. Supported Architectures and Processors
 | |
| 1.1 ARM
 | |
| 1.2 x86
 | |
| 1.3 sparc64
 | |
| 1.4 ppc
 | |
| 1.5 SuperH
 | |
| 
 | |
| 2. "Policy" / "Governor"?
 | |
| 2.1 Policy
 | |
| 2.2 Governor
 | |
| 
 | |
| 3. How to change the CPU cpufreq policy and/or speed
 | |
| 3.1 Preferred interface: sysfs
 | |
| 3.2 Deprecated interfaces
 | |
| 
 | |
| 
 | |
| 
 | |
| 1. Supported Architectures and Processors
 | |
| =========================================
 | |
| 
 | |
| 1.1 ARM
 | |
| -------
 | |
| 
 | |
| The following ARM processors are supported by cpufreq:
 | |
| 
 | |
| ARM Integrator
 | |
| ARM-SA1100
 | |
| ARM-SA1110
 | |
| 
 | |
| 
 | |
| 1.2 x86
 | |
| -------
 | |
| 
 | |
| The following processors for the x86 architecture are supported by cpufreq:
 | |
| 
 | |
| AMD Elan - SC400, SC410
 | |
| AMD mobile K6-2+
 | |
| AMD mobile K6-3+
 | |
| AMD mobile Duron
 | |
| AMD mobile Athlon
 | |
| AMD Opteron
 | |
| AMD Athlon 64
 | |
| Cyrix Media GXm
 | |
| Intel mobile PIII and Intel mobile PIII-M on certain chipsets
 | |
| Intel Pentium 4, Intel Xeon
 | |
| Intel Pentium M (Centrino)
 | |
| National Semiconductors Geode GX
 | |
| Transmeta Crusoe
 | |
| Transmeta Efficeon
 | |
| VIA Cyrix 3 / C3
 | |
| various processors on some ACPI 2.0-compatible systems [*]
 | |
| 
 | |
| [*] Only if "ACPI Processor Performance States" are available
 | |
| to the ACPI<->BIOS interface.
 | |
| 
 | |
| 
 | |
| 1.3 sparc64
 | |
| -----------
 | |
| 
 | |
| The following processors for the sparc64 architecture are supported by
 | |
| cpufreq:
 | |
| 
 | |
| UltraSPARC-III
 | |
| 
 | |
| 
 | |
| 1.4 ppc
 | |
| -------
 | |
| 
 | |
| Several "PowerBook" and "iBook2" notebooks are supported.
 | |
| 
 | |
| 
 | |
| 1.5 SuperH
 | |
| ----------
 | |
| 
 | |
| The following SuperH processors are supported by cpufreq:
 | |
| 
 | |
| SH-3
 | |
| SH-4
 | |
| 
 | |
| 
 | |
| 2. "Policy" / "Governor" ?
 | |
| ==========================
 | |
| 
 | |
| Some CPU frequency scaling-capable processor switch between various
 | |
| frequencies and operating voltages "on the fly" without any kernel or
 | |
| user involvement. This guarantees very fast switching to a frequency
 | |
| which is high enough to serve the user's needs, but low enough to save
 | |
| power.
 | |
| 
 | |
| 
 | |
| 2.1 Policy
 | |
| ----------
 | |
| 
 | |
| On these systems, all you can do is select the lower and upper
 | |
| frequency limit as well as whether you want more aggressive
 | |
| power-saving or more instantly available processing power.
 | |
| 
 | |
| 
 | |
| 2.2 Governor
 | |
| ------------
 | |
| 
 | |
| On all other cpufreq implementations, these boundaries still need to
 | |
| be set. Then, a "governor" must be selected. Such a "governor" decides
 | |
| what speed the processor shall run within the boundaries. One such
 | |
| "governor" is the "userspace" governor. This one allows the user - or
 | |
| a yet-to-implement userspace program - to decide what specific speed
 | |
| the processor shall run at.
 | |
| 
 | |
| 
 | |
| 3. How to change the CPU cpufreq policy and/or speed
 | |
| ====================================================
 | |
| 
 | |
| 3.1 Preferred Interface: sysfs
 | |
| ------------------------------
 | |
| 
 | |
| The preferred interface is located in the sysfs filesystem. If you
 | |
| mounted it at /sys, the cpufreq interface is located in a subdirectory
 | |
| "cpufreq" within the cpu-device directory
 | |
| (e.g. /sys/devices/system/cpu/cpu0/cpufreq/ for the first CPU).
 | |
| 
 | |
| cpuinfo_min_freq :		this file shows the minimum operating
 | |
| 				frequency the processor can run at(in kHz) 
 | |
| cpuinfo_max_freq :		this file shows the maximum operating
 | |
| 				frequency the processor can run at(in kHz) 
 | |
| scaling_driver :		this file shows what cpufreq driver is
 | |
| 				used to set the frequency on this CPU
 | |
| 
 | |
| scaling_available_governors :	this file shows the CPUfreq governors
 | |
| 				available in this kernel. You can see the
 | |
| 				currently activated governor in
 | |
| 
 | |
| scaling_governor,		and by "echoing" the name of another
 | |
| 				governor you can change it. Please note
 | |
| 				that some governors won't load - they only
 | |
| 				work on some specific architectures or
 | |
| 				processors.
 | |
| scaling_min_freq and
 | |
| scaling_max_freq		show the current "policy limits" (in
 | |
| 				kHz). By echoing new values into these
 | |
| 				files, you can change these limits.
 | |
| 				NOTE: when setting a policy you need to
 | |
| 				first set scaling_max_freq, then
 | |
| 				scaling_min_freq.
 | |
| 
 | |
| 
 | |
| If you have selected the "userspace" governor which allows you to
 | |
| set the CPU operating frequency to a specific value, you can read out
 | |
| the current frequency in
 | |
| 
 | |
| scaling_setspeed.		By "echoing" a new frequency into this
 | |
| 				you can change the speed of the CPU,
 | |
| 				but only within the limits of
 | |
| 				scaling_min_freq and scaling_max_freq.
 | |
| 				
 | |
| 
 | |
| 3.2 Deprecated Interfaces
 | |
| -------------------------
 | |
| 
 | |
| Depending on your kernel configuration, you might find the following 
 | |
| cpufreq-related files:
 | |
| /proc/cpufreq
 | |
| /proc/sys/cpu/*/speed
 | |
| /proc/sys/cpu/*/speed-min
 | |
| /proc/sys/cpu/*/speed-max
 | |
| 
 | |
| These are files for deprecated interfaces to cpufreq, which offer far
 | |
| less functionality. Because of this, these interfaces aren't described
 | |
| here.
 | |
| 
 |