Loading Documentation/DocBook/libata.tmpl +124 −32 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ </authorgroup> <copyright> <year>2003</year> <year>2003-2005</year> <holder>Jeff Garzik</holder> </copyright> Loading Loading @@ -44,30 +44,38 @@ <toc></toc> <chapter id="libataThanks"> <title>Thanks</title> <para> The bulk of the ATA knowledge comes thanks to long conversations with Andre Hedrick (www.linux-ide.org). </para> <chapter id="libataIntroduction"> <title>Introduction</title> <para> Thanks to Alan Cox for pointing out similarities between SATA and SCSI, and in general for motivation to hack on libata. libATA is a library used inside the Linux kernel to support ATA host controllers and devices. libATA provides an ATA driver API, class transports for ATA and ATAPI devices, and SCSI<->ATA translation for ATA devices according to the T10 SAT specification. </para> <para> libata's device detection method, ata_pio_devchk, and in general all the early probing was based on extensive study of Hale Landis's probe/reset code in his ATADRVR driver (www.ata-atapi.com). This Guide documents the libATA driver API, library functions, library internals, and a couple sample ATA low-level drivers. </para> </chapter> <chapter id="libataDriverApi"> <title>libata Driver API</title> <para> struct ata_port_operations is defined for every low-level libata hardware driver, and it controls how the low-level driver interfaces with the ATA and SCSI layers. </para> <para> FIS-based drivers will hook into the system with ->qc_prep() and ->qc_issue() high-level hooks. Hardware which behaves in a manner similar to PCI IDE hardware may utilize several generic helpers, defining at a bare minimum the bus I/O addresses of the ATA shadow register blocks. </para> <sect1> <title>struct ata_port_operations</title> <sect2><title>Disable ATA port</title> <programlisting> void (*port_disable) (struct ata_port *); </programlisting> Loading @@ -78,6 +86,9 @@ void (*port_disable) (struct ata_port *); unplug). </para> </sect2> <sect2><title>Post-IDENTIFY device configuration</title> <programlisting> void (*dev_config) (struct ata_port *, struct ata_device *); </programlisting> Loading @@ -88,6 +99,9 @@ void (*dev_config) (struct ata_port *, struct ata_device *); issue of SET FEATURES - XFER MODE, and prior to operation. </para> </sect2> <sect2><title>Set PIO/DMA mode</title> <programlisting> void (*set_piomode) (struct ata_port *, struct ata_device *); void (*set_dmamode) (struct ata_port *, struct ata_device *); Loading @@ -108,6 +122,9 @@ void (*post_set_mode) (struct ata_port *ap); ->set_dma_mode() is only called if DMA is possible. </para> </sect2> <sect2><title>Taskfile read/write</title> <programlisting> void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf); void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); Loading @@ -120,6 +137,9 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); taskfile register values. </para> </sect2> <sect2><title>ATA command execute</title> <programlisting> void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf); </programlisting> Loading @@ -129,17 +149,37 @@ void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf); ->tf_load(), to be initiated in hardware. </para> </sect2> <sect2><title>Per-cmd ATAPI DMA capabilities filter</title> <programlisting> int (*check_atapi_dma) (struct ata_queued_cmd *qc); </programlisting> <para> Allow low-level driver to filter ATA PACKET commands, returning a status indicating whether or not it is OK to use DMA for the supplied PACKET command. </para> </sect2> <sect2><title>Read specific ATA shadow registers</title> <programlisting> u8 (*check_status)(struct ata_port *ap); void (*dev_select)(struct ata_port *ap, unsigned int device); u8 (*check_altstatus)(struct ata_port *ap); u8 (*check_err)(struct ata_port *ap); </programlisting> <para> Reads the Status ATA shadow register from hardware. On some hardware, this has the side effect of clearing the interrupt condition. Reads the Status/AltStatus/Error ATA shadow register from hardware. On some hardware, reading the Status register has the side effect of clearing the interrupt condition. </para> </sect2> <sect2><title>Select ATA device on bus</title> <programlisting> void (*dev_select)(struct ata_port *ap, unsigned int device); </programlisting> Loading @@ -147,9 +187,13 @@ void (*dev_select)(struct ata_port *ap, unsigned int device); <para> Issues the low-level hardware command(s) that causes one of N hardware devices to be considered 'selected' (active and available for use) on the ATA bus. available for use) on the ATA bus. This generally has no meaning on FIS-based devices. </para> </sect2> <sect2><title>Reset ATA bus</title> <programlisting> void (*phy_reset) (struct ata_port *ap); </programlisting> Loading @@ -162,17 +206,31 @@ void (*phy_reset) (struct ata_port *ap); functions ata_bus_reset() or sata_phy_reset() for this hook. </para> </sect2> <sect2><title>Control PCI IDE BMDMA engine</title> <programlisting> void (*bmdma_setup) (struct ata_queued_cmd *qc); void (*bmdma_start) (struct ata_queued_cmd *qc); void (*bmdma_stop) (struct ata_port *ap); u8 (*bmdma_status) (struct ata_port *ap); </programlisting> <para> When setting up an IDE BMDMA transaction, these hooks arm (->bmdma_setup) and fire (->bmdma_start) the hardware's DMA engine. (->bmdma_setup), fire (->bmdma_start), and halt (->bmdma_stop) the hardware's DMA engine. ->bmdma_status is used to read the standard PCI IDE DMA Status register. </para> <para> These hooks are typically either no-ops, or simply not implemented, in FIS-based drivers. </para> </sect2> <sect2><title>High-level taskfile hooks</title> <programlisting> void (*qc_prep) (struct ata_queued_cmd *qc); int (*qc_issue) (struct ata_queued_cmd *qc); Loading @@ -190,20 +248,26 @@ int (*qc_issue) (struct ata_queued_cmd *qc); ->qc_issue is used to make a command active, once the hardware and S/G tables have been prepared. IDE BMDMA drivers use the helper function ata_qc_issue_prot() for taskfile protocol-based dispatch. More advanced drivers roll their own ->qc_issue implementation, using this as the "issue new ATA command to hardware" hook. dispatch. More advanced drivers implement their own ->qc_issue. </para> </sect2> <sect2><title>Timeout (error) handling</title> <programlisting> void (*eng_timeout) (struct ata_port *ap); </programlisting> <para> This is a high level error handling function, called from the error handling thread, when a command times out. error handling thread, when a command times out. Most newer hardware will implement its own error handling code here. IDE BMDMA drivers may use the helper function ata_eng_timeout(). </para> </sect2> <sect2><title>Hardware interrupt handling</title> <programlisting> irqreturn_t (*irq_handler)(int, void *, struct pt_regs *); void (*irq_clear) (struct ata_port *); Loading @@ -216,6 +280,9 @@ void (*irq_clear) (struct ata_port *); is quiet. </para> </sect2> <sect2><title>SATA phy read/write</title> <programlisting> u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg); void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, Loading @@ -227,6 +294,9 @@ void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, if ->phy_reset hook called the sata_phy_reset() helper function. </para> </sect2> <sect2><title>Init and shutdown</title> <programlisting> int (*port_start) (struct ata_port *ap); void (*port_stop) (struct ata_port *ap); Loading @@ -240,15 +310,17 @@ void (*host_stop) (struct ata_host_set *host_set); tasks. </para> <para> ->host_stop() is called when the rmmod or hot unplug process begins. The hook must stop all hardware interrupts, DMA engines, etc. </para> <para> ->port_stop() is called after ->host_stop(). It's sole function is to release DMA/memory resources, now that they are no longer actively being used. </para> <para> ->host_stop() is called after all ->port_stop() calls have completed. The hook must finalize hardware shutdown, release DMA and other resources, etc. </para> </sect2> </sect1> </chapter> Loading Loading @@ -279,4 +351,24 @@ void (*host_stop) (struct ata_host_set *host_set); !Idrivers/scsi/sata_sil.c </chapter> <chapter id="libataThanks"> <title>Thanks</title> <para> The bulk of the ATA knowledge comes thanks to long conversations with Andre Hedrick (www.linux-ide.org), and long hours pondering the ATA and SCSI specifications. </para> <para> Thanks to Alan Cox for pointing out similarities between SATA and SCSI, and in general for motivation to hack on libata. </para> <para> libata's device detection method, ata_pio_devchk, and in general all the early probing was based on extensive study of Hale Landis's probe/reset code in his ATADRVR driver (www.ata-atapi.com). </para> </chapter> </book> Documentation/cpu-freq/cpufreq-stats.txt 0 → 100644 +128 −0 Original line number Diff line number Diff line CPU frequency and voltage scaling statictics in the Linux(TM) kernel L i n u x c p u f r e q - s t a t s d r i v e r - information for users - Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Contents 1. Introduction 2. Statistics Provided (with example) 3. Configuring cpufreq-stats 1. Introduction cpufreq-stats is a driver that provices CPU frequency statistics for each CPU. This statistics is provided in /sysfs as a bunch of read_only interfaces. This interface (when configured) will appear in a seperate directory under cpufreq in /sysfs (<sysfs root>/devices/system/cpu/cpuX/cpufreq/stats/) for each CPU. Various statistics will form read_only files under this directory. This driver is designed to be independent of any particular cpufreq_driver that may be running on your CPU. So, it will work with any cpufreq_driver. 2. Statistics Provided (with example) cpufreq stats provides following statistics (explained in detail below). - time_in_state - total_trans - trans_table All the statistics will be from the time the stats driver has been inserted to the time when a read of a particular statistic is done. Obviously, stats driver will not have any information about the the frequcny transitions before the stats driver insertion. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l total 0 drwxr-xr-x 2 root root 0 May 14 16:06 . drwxr-xr-x 3 root root 0 May 14 15:58 .. -r--r--r-- 1 root root 4096 May 14 16:06 time_in_state -r--r--r-- 1 root root 4096 May 14 16:06 total_trans -r--r--r-- 1 root root 4096 May 14 16:06 trans_table -------------------------------------------------------------------------------- - time_in_state This gives the amount of time spent in each of the frequencies supported by this CPU. The cat output will have "<frequency> <time>" pair in each line, which will mean this CPU spent <time> usertime units of time at <frequency>. Output will have one line for each of the supported freuencies. usertime units here is 10mS (similar to other time exported in /proc). -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat time_in_state 3600000 2089 3400000 136 3200000 34 3000000 67 2800000 172488 -------------------------------------------------------------------------------- - total_trans This gives the total number of frequency transitions on this CPU. The cat output will have a single count which is the total number of frequency transitions. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat total_trans 20 -------------------------------------------------------------------------------- - trans_table This will give a fine grained information about all the CPU frequency transitions. The cat output here is a two dimensional matrix, where an entry <i,j> (row i, column j) represents the count of number of transitions from Freq_i to Freq_j. Freq_i is in descending order with increasing rows and Freq_j is in descending order with increasing columns. The output here also contains the actual freq values for each row and column for better readability. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table From : To : 3600000 3400000 3200000 3000000 2800000 3600000: 0 5 0 0 0 3400000: 4 0 2 0 0 3200000: 0 1 0 2 0 3000000: 0 0 1 0 3 2800000: 0 0 0 2 0 -------------------------------------------------------------------------------- 3. Configuring cpufreq-stats To configure cpufreq-stats in your kernel Config Main Menu Power management options (ACPI, APM) ---> CPU Frequency scaling ---> [*] CPU Frequency scaling <*> CPU frequency translation statistics [*] CPU frequency translation statistics details "CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure cpufreq-stats. "CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the basic statistics which includes time_in_state and total_trans. "CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS) provides fine grained cpufreq stats by trans_table. The reason for having a seperate config option for trans_table is: - trans_table goes against the traditional /sysfs rule of one value per interface. It provides a whole bunch of value in a 2 dimensional matrix form. Once these two options are enabled and your CPU supports cpufrequency, you will be able to see the CPU frequency statistics in /sysfs. MAINTAINERS +8 −2 Original line number Diff line number Diff line Loading @@ -239,6 +239,12 @@ L: linux-usb-devel@lists.sourceforge.net W: http://www.linux-usb.org/SpeedTouch/ S: Maintained ALI1563 I2C DRIVER P: Rudolf Marek M: r.marek@sh.cvut.cz L: sensors@stimpy.netroedge.com S: Maintained ALPHA PORT P: Richard Henderson M: rth@twiddle.net Loading Loading @@ -1023,8 +1029,8 @@ W: http://www.ia64-linux.org/ S: Maintained SN-IA64 (Itanium) SUB-PLATFORM P: Jesse Barnes M: jbarnes@sgi.com P: Greg Edwards M: edwardsg@sgi.com L: linux-altix@sgi.com L: linux-ia64@vger.kernel.org W: http://www.sgi.com/altix Loading Makefile +1 −1 Original line number Diff line number Diff line VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 12 EXTRAVERSION =-rc5 EXTRAVERSION =-rc6 NAME=Woozy Numbat # *DOCUMENTATION* Loading arch/h8300/kernel/process.c +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ asmlinkage void ret_from_fork(void); void default_idle(void) { while(1) { if (need_resched()) { if (!need_resched()) { local_irq_enable(); __asm__("sleep"); local_irq_disable(); Loading Loading
Documentation/DocBook/libata.tmpl +124 −32 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ </authorgroup> <copyright> <year>2003</year> <year>2003-2005</year> <holder>Jeff Garzik</holder> </copyright> Loading Loading @@ -44,30 +44,38 @@ <toc></toc> <chapter id="libataThanks"> <title>Thanks</title> <para> The bulk of the ATA knowledge comes thanks to long conversations with Andre Hedrick (www.linux-ide.org). </para> <chapter id="libataIntroduction"> <title>Introduction</title> <para> Thanks to Alan Cox for pointing out similarities between SATA and SCSI, and in general for motivation to hack on libata. libATA is a library used inside the Linux kernel to support ATA host controllers and devices. libATA provides an ATA driver API, class transports for ATA and ATAPI devices, and SCSI<->ATA translation for ATA devices according to the T10 SAT specification. </para> <para> libata's device detection method, ata_pio_devchk, and in general all the early probing was based on extensive study of Hale Landis's probe/reset code in his ATADRVR driver (www.ata-atapi.com). This Guide documents the libATA driver API, library functions, library internals, and a couple sample ATA low-level drivers. </para> </chapter> <chapter id="libataDriverApi"> <title>libata Driver API</title> <para> struct ata_port_operations is defined for every low-level libata hardware driver, and it controls how the low-level driver interfaces with the ATA and SCSI layers. </para> <para> FIS-based drivers will hook into the system with ->qc_prep() and ->qc_issue() high-level hooks. Hardware which behaves in a manner similar to PCI IDE hardware may utilize several generic helpers, defining at a bare minimum the bus I/O addresses of the ATA shadow register blocks. </para> <sect1> <title>struct ata_port_operations</title> <sect2><title>Disable ATA port</title> <programlisting> void (*port_disable) (struct ata_port *); </programlisting> Loading @@ -78,6 +86,9 @@ void (*port_disable) (struct ata_port *); unplug). </para> </sect2> <sect2><title>Post-IDENTIFY device configuration</title> <programlisting> void (*dev_config) (struct ata_port *, struct ata_device *); </programlisting> Loading @@ -88,6 +99,9 @@ void (*dev_config) (struct ata_port *, struct ata_device *); issue of SET FEATURES - XFER MODE, and prior to operation. </para> </sect2> <sect2><title>Set PIO/DMA mode</title> <programlisting> void (*set_piomode) (struct ata_port *, struct ata_device *); void (*set_dmamode) (struct ata_port *, struct ata_device *); Loading @@ -108,6 +122,9 @@ void (*post_set_mode) (struct ata_port *ap); ->set_dma_mode() is only called if DMA is possible. </para> </sect2> <sect2><title>Taskfile read/write</title> <programlisting> void (*tf_load) (struct ata_port *ap, struct ata_taskfile *tf); void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); Loading @@ -120,6 +137,9 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf); taskfile register values. </para> </sect2> <sect2><title>ATA command execute</title> <programlisting> void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf); </programlisting> Loading @@ -129,17 +149,37 @@ void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf); ->tf_load(), to be initiated in hardware. </para> </sect2> <sect2><title>Per-cmd ATAPI DMA capabilities filter</title> <programlisting> int (*check_atapi_dma) (struct ata_queued_cmd *qc); </programlisting> <para> Allow low-level driver to filter ATA PACKET commands, returning a status indicating whether or not it is OK to use DMA for the supplied PACKET command. </para> </sect2> <sect2><title>Read specific ATA shadow registers</title> <programlisting> u8 (*check_status)(struct ata_port *ap); void (*dev_select)(struct ata_port *ap, unsigned int device); u8 (*check_altstatus)(struct ata_port *ap); u8 (*check_err)(struct ata_port *ap); </programlisting> <para> Reads the Status ATA shadow register from hardware. On some hardware, this has the side effect of clearing the interrupt condition. Reads the Status/AltStatus/Error ATA shadow register from hardware. On some hardware, reading the Status register has the side effect of clearing the interrupt condition. </para> </sect2> <sect2><title>Select ATA device on bus</title> <programlisting> void (*dev_select)(struct ata_port *ap, unsigned int device); </programlisting> Loading @@ -147,9 +187,13 @@ void (*dev_select)(struct ata_port *ap, unsigned int device); <para> Issues the low-level hardware command(s) that causes one of N hardware devices to be considered 'selected' (active and available for use) on the ATA bus. available for use) on the ATA bus. This generally has no meaning on FIS-based devices. </para> </sect2> <sect2><title>Reset ATA bus</title> <programlisting> void (*phy_reset) (struct ata_port *ap); </programlisting> Loading @@ -162,17 +206,31 @@ void (*phy_reset) (struct ata_port *ap); functions ata_bus_reset() or sata_phy_reset() for this hook. </para> </sect2> <sect2><title>Control PCI IDE BMDMA engine</title> <programlisting> void (*bmdma_setup) (struct ata_queued_cmd *qc); void (*bmdma_start) (struct ata_queued_cmd *qc); void (*bmdma_stop) (struct ata_port *ap); u8 (*bmdma_status) (struct ata_port *ap); </programlisting> <para> When setting up an IDE BMDMA transaction, these hooks arm (->bmdma_setup) and fire (->bmdma_start) the hardware's DMA engine. (->bmdma_setup), fire (->bmdma_start), and halt (->bmdma_stop) the hardware's DMA engine. ->bmdma_status is used to read the standard PCI IDE DMA Status register. </para> <para> These hooks are typically either no-ops, or simply not implemented, in FIS-based drivers. </para> </sect2> <sect2><title>High-level taskfile hooks</title> <programlisting> void (*qc_prep) (struct ata_queued_cmd *qc); int (*qc_issue) (struct ata_queued_cmd *qc); Loading @@ -190,20 +248,26 @@ int (*qc_issue) (struct ata_queued_cmd *qc); ->qc_issue is used to make a command active, once the hardware and S/G tables have been prepared. IDE BMDMA drivers use the helper function ata_qc_issue_prot() for taskfile protocol-based dispatch. More advanced drivers roll their own ->qc_issue implementation, using this as the "issue new ATA command to hardware" hook. dispatch. More advanced drivers implement their own ->qc_issue. </para> </sect2> <sect2><title>Timeout (error) handling</title> <programlisting> void (*eng_timeout) (struct ata_port *ap); </programlisting> <para> This is a high level error handling function, called from the error handling thread, when a command times out. error handling thread, when a command times out. Most newer hardware will implement its own error handling code here. IDE BMDMA drivers may use the helper function ata_eng_timeout(). </para> </sect2> <sect2><title>Hardware interrupt handling</title> <programlisting> irqreturn_t (*irq_handler)(int, void *, struct pt_regs *); void (*irq_clear) (struct ata_port *); Loading @@ -216,6 +280,9 @@ void (*irq_clear) (struct ata_port *); is quiet. </para> </sect2> <sect2><title>SATA phy read/write</title> <programlisting> u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg); void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, Loading @@ -227,6 +294,9 @@ void (*scr_write) (struct ata_port *ap, unsigned int sc_reg, if ->phy_reset hook called the sata_phy_reset() helper function. </para> </sect2> <sect2><title>Init and shutdown</title> <programlisting> int (*port_start) (struct ata_port *ap); void (*port_stop) (struct ata_port *ap); Loading @@ -240,15 +310,17 @@ void (*host_stop) (struct ata_host_set *host_set); tasks. </para> <para> ->host_stop() is called when the rmmod or hot unplug process begins. The hook must stop all hardware interrupts, DMA engines, etc. </para> <para> ->port_stop() is called after ->host_stop(). It's sole function is to release DMA/memory resources, now that they are no longer actively being used. </para> <para> ->host_stop() is called after all ->port_stop() calls have completed. The hook must finalize hardware shutdown, release DMA and other resources, etc. </para> </sect2> </sect1> </chapter> Loading Loading @@ -279,4 +351,24 @@ void (*host_stop) (struct ata_host_set *host_set); !Idrivers/scsi/sata_sil.c </chapter> <chapter id="libataThanks"> <title>Thanks</title> <para> The bulk of the ATA knowledge comes thanks to long conversations with Andre Hedrick (www.linux-ide.org), and long hours pondering the ATA and SCSI specifications. </para> <para> Thanks to Alan Cox for pointing out similarities between SATA and SCSI, and in general for motivation to hack on libata. </para> <para> libata's device detection method, ata_pio_devchk, and in general all the early probing was based on extensive study of Hale Landis's probe/reset code in his ATADRVR driver (www.ata-atapi.com). </para> </chapter> </book>
Documentation/cpu-freq/cpufreq-stats.txt 0 → 100644 +128 −0 Original line number Diff line number Diff line CPU frequency and voltage scaling statictics in the Linux(TM) kernel L i n u x c p u f r e q - s t a t s d r i v e r - information for users - Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Contents 1. Introduction 2. Statistics Provided (with example) 3. Configuring cpufreq-stats 1. Introduction cpufreq-stats is a driver that provices CPU frequency statistics for each CPU. This statistics is provided in /sysfs as a bunch of read_only interfaces. This interface (when configured) will appear in a seperate directory under cpufreq in /sysfs (<sysfs root>/devices/system/cpu/cpuX/cpufreq/stats/) for each CPU. Various statistics will form read_only files under this directory. This driver is designed to be independent of any particular cpufreq_driver that may be running on your CPU. So, it will work with any cpufreq_driver. 2. Statistics Provided (with example) cpufreq stats provides following statistics (explained in detail below). - time_in_state - total_trans - trans_table All the statistics will be from the time the stats driver has been inserted to the time when a read of a particular statistic is done. Obviously, stats driver will not have any information about the the frequcny transitions before the stats driver insertion. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l total 0 drwxr-xr-x 2 root root 0 May 14 16:06 . drwxr-xr-x 3 root root 0 May 14 15:58 .. -r--r--r-- 1 root root 4096 May 14 16:06 time_in_state -r--r--r-- 1 root root 4096 May 14 16:06 total_trans -r--r--r-- 1 root root 4096 May 14 16:06 trans_table -------------------------------------------------------------------------------- - time_in_state This gives the amount of time spent in each of the frequencies supported by this CPU. The cat output will have "<frequency> <time>" pair in each line, which will mean this CPU spent <time> usertime units of time at <frequency>. Output will have one line for each of the supported freuencies. usertime units here is 10mS (similar to other time exported in /proc). -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat time_in_state 3600000 2089 3400000 136 3200000 34 3000000 67 2800000 172488 -------------------------------------------------------------------------------- - total_trans This gives the total number of frequency transitions on this CPU. The cat output will have a single count which is the total number of frequency transitions. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat total_trans 20 -------------------------------------------------------------------------------- - trans_table This will give a fine grained information about all the CPU frequency transitions. The cat output here is a two dimensional matrix, where an entry <i,j> (row i, column j) represents the count of number of transitions from Freq_i to Freq_j. Freq_i is in descending order with increasing rows and Freq_j is in descending order with increasing columns. The output here also contains the actual freq values for each row and column for better readability. -------------------------------------------------------------------------------- <mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table From : To : 3600000 3400000 3200000 3000000 2800000 3600000: 0 5 0 0 0 3400000: 4 0 2 0 0 3200000: 0 1 0 2 0 3000000: 0 0 1 0 3 2800000: 0 0 0 2 0 -------------------------------------------------------------------------------- 3. Configuring cpufreq-stats To configure cpufreq-stats in your kernel Config Main Menu Power management options (ACPI, APM) ---> CPU Frequency scaling ---> [*] CPU Frequency scaling <*> CPU frequency translation statistics [*] CPU frequency translation statistics details "CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure cpufreq-stats. "CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the basic statistics which includes time_in_state and total_trans. "CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS) provides fine grained cpufreq stats by trans_table. The reason for having a seperate config option for trans_table is: - trans_table goes against the traditional /sysfs rule of one value per interface. It provides a whole bunch of value in a 2 dimensional matrix form. Once these two options are enabled and your CPU supports cpufrequency, you will be able to see the CPU frequency statistics in /sysfs.
MAINTAINERS +8 −2 Original line number Diff line number Diff line Loading @@ -239,6 +239,12 @@ L: linux-usb-devel@lists.sourceforge.net W: http://www.linux-usb.org/SpeedTouch/ S: Maintained ALI1563 I2C DRIVER P: Rudolf Marek M: r.marek@sh.cvut.cz L: sensors@stimpy.netroedge.com S: Maintained ALPHA PORT P: Richard Henderson M: rth@twiddle.net Loading Loading @@ -1023,8 +1029,8 @@ W: http://www.ia64-linux.org/ S: Maintained SN-IA64 (Itanium) SUB-PLATFORM P: Jesse Barnes M: jbarnes@sgi.com P: Greg Edwards M: edwardsg@sgi.com L: linux-altix@sgi.com L: linux-ia64@vger.kernel.org W: http://www.sgi.com/altix Loading
Makefile +1 −1 Original line number Diff line number Diff line VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 12 EXTRAVERSION =-rc5 EXTRAVERSION =-rc6 NAME=Woozy Numbat # *DOCUMENTATION* Loading
arch/h8300/kernel/process.c +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ asmlinkage void ret_from_fork(void); void default_idle(void) { while(1) { if (need_resched()) { if (!need_resched()) { local_irq_enable(); __asm__("sleep"); local_irq_disable(); Loading