cpufreq.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/linux/cpufreq.h
  3.  *
  4.  *  Copyright (C) 2001 Russell King
  5.  *            (C) 2002 - 2003 Dominik Brodowski <linux@brodo.de>
  6.  *            
  7.  *
  8.  * $Id: cpufreq.h,v 1.36 2003/01/20 17:31:48 db Exp $
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License version 2 as
  12.  * published by the Free Software Foundation.
  13.  */
  14. #ifndef _LINUX_CPUFREQ_H
  15. #define _LINUX_CPUFREQ_H
  16. #include <linux/config.h>
  17. #include <linux/notifier.h>
  18. #include <linux/threads.h>
  19. #include <linux/device.h>
  20. #include <linux/kobject.h>
  21. #include <linux/sysfs.h>
  22. #include <linux/completion.h>
  23. #include <linux/workqueue.h>
  24. #include <linux/cpumask.h>
  25. #define CPUFREQ_NAME_LEN 16
  26. /*********************************************************************
  27.  *                     CPUFREQ NOTIFIER INTERFACE                    *
  28.  *********************************************************************/
  29. int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list);
  30. int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list);
  31. #define CPUFREQ_TRANSITION_NOTIFIER (0)
  32. #define CPUFREQ_POLICY_NOTIFIER (1)
  33. /* if (cpufreq_driver->target) exists, the ->governor decides what frequency
  34.  * within the limits is used. If (cpufreq_driver->setpolicy> exists, these
  35.  * two generic policies are available:
  36.  */
  37. #define CPUFREQ_POLICY_POWERSAVE (1)
  38. #define CPUFREQ_POLICY_PERFORMANCE (2)
  39. /* Frequency values here are CPU kHz so that hardware which doesn't run 
  40.  * with some frequencies can complain without having to guess what per 
  41.  * cent / per mille means. 
  42.  * Maximum transition latency is in nanoseconds - if it's unknown,
  43.  * CPUFREQ_ETERNAL shall be used.
  44.  */
  45. struct cpufreq_governor;
  46. #define CPUFREQ_ETERNAL (-1)
  47. struct cpufreq_cpuinfo {
  48. unsigned int max_freq;
  49. unsigned int min_freq;
  50. unsigned int transition_latency; /* in 10^(-9) s = nanoseconds */
  51. };
  52. struct cpufreq_real_policy {
  53. unsigned int min;    /* in kHz */
  54. unsigned int max;    /* in kHz */
  55.         unsigned int policy; /* see above */
  56. struct cpufreq_governor *governor; /* see below */
  57. };
  58. struct cpufreq_policy {
  59. cpumask_t cpus; /* affected CPUs */
  60. unsigned int cpu;    /* cpu nr of registered CPU */
  61. struct cpufreq_cpuinfo cpuinfo;/* see above */
  62. unsigned int min;    /* in kHz */
  63. unsigned int max;    /* in kHz */
  64. unsigned int cur;    /* in kHz, only needed if cpufreq
  65.  * governors are used */
  66.         unsigned int policy; /* see above */
  67. struct cpufreq_governor *governor; /* see below */
  68.   struct semaphore lock;   /* CPU ->setpolicy or ->target may
  69.    only be called once a time */
  70. struct work_struct update; /* if update_policy() needs to be
  71.  * called, but you're in IRQ context */
  72. struct cpufreq_real_policy user_policy;
  73. struct kobject kobj;
  74. struct completion kobj_unregister;
  75. };
  76. #define CPUFREQ_ADJUST (0)
  77. #define CPUFREQ_INCOMPATIBLE (1)
  78. #define CPUFREQ_NOTIFY (2)
  79. /******************** cpufreq transition notifiers *******************/
  80. #define CPUFREQ_PRECHANGE (0)
  81. #define CPUFREQ_POSTCHANGE (1)
  82. #define CPUFREQ_RESUMECHANGE (8)
  83. #define CPUFREQ_SUSPENDCHANGE (9)
  84. struct cpufreq_freqs {
  85. unsigned int cpu; /* cpu nr */
  86. unsigned int old;
  87. unsigned int new;
  88. u8 flags; /* flags of cpufreq_driver, see below. */
  89. };
  90. /**
  91.  * cpufreq_scale - "old * mult / div" calculation for large values (32-bit-arch safe)
  92.  * @old:   old value
  93.  * @div:   divisor
  94.  * @mult:  multiplier
  95.  *
  96.  *
  97.  *    new = old * mult / div
  98.  */
  99. static inline unsigned long cpufreq_scale(unsigned long old, u_int div, u_int mult)
  100. {
  101. #if BITS_PER_LONG == 32
  102. u64 result = ((u64) old) * ((u64) mult);
  103. do_div(result, div);
  104. return (unsigned long) result;
  105. #elif BITS_PER_LONG == 64
  106. unsigned long result = old * ((u64) mult);
  107. result /= div;
  108. return result;
  109. #endif
  110. };
  111. /*********************************************************************
  112.  *                          CPUFREQ GOVERNORS                        *
  113.  *********************************************************************/
  114. #define CPUFREQ_GOV_START  1
  115. #define CPUFREQ_GOV_STOP   2
  116. #define CPUFREQ_GOV_LIMITS 3
  117. struct cpufreq_governor {
  118. char name[CPUFREQ_NAME_LEN];
  119. int  (*governor) (struct cpufreq_policy *policy,
  120.  unsigned int event);
  121. struct list_head governor_list;
  122. struct module *owner;
  123. };
  124. /* pass a target to the cpufreq driver 
  125.  */
  126. extern int cpufreq_driver_target(struct cpufreq_policy *policy,
  127.  unsigned int target_freq,
  128.  unsigned int relation);
  129. extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
  130.    unsigned int target_freq,
  131.    unsigned int relation);
  132. /* pass an event to the cpufreq governor */
  133. int cpufreq_governor(unsigned int cpu, unsigned int event);
  134. int cpufreq_register_governor(struct cpufreq_governor *governor);
  135. void cpufreq_unregister_governor(struct cpufreq_governor *governor);
  136. /*********************************************************************
  137.  *                      CPUFREQ DRIVER INTERFACE                     *
  138.  *********************************************************************/
  139. #define CPUFREQ_RELATION_L 0  /* lowest frequency at or above target */
  140. #define CPUFREQ_RELATION_H 1  /* highest frequency below or at target */
  141. struct freq_attr;
  142. struct cpufreq_driver {
  143. struct module           *owner;
  144. char name[CPUFREQ_NAME_LEN];
  145. u8 flags;
  146. /* needed by all drivers */
  147. int (*init) (struct cpufreq_policy *policy);
  148. int (*verify) (struct cpufreq_policy *policy);
  149. /* define one out of two */
  150. int (*setpolicy) (struct cpufreq_policy *policy);
  151. int (*target) (struct cpufreq_policy *policy,
  152.  unsigned int target_freq,
  153.  unsigned int relation);
  154. /* should be defined, if possible */
  155. unsigned int (*get) (unsigned int cpu);
  156. /* optional */
  157. int (*exit) (struct cpufreq_policy *policy);
  158. int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
  159. int (*resume) (struct cpufreq_policy *policy);
  160. struct freq_attr **attr;
  161. };
  162. /* flags */
  163. #define CPUFREQ_STICKY 0x01 /* the driver isn't removed even if 
  164.  * all ->init() calls failed */
  165. #define CPUFREQ_CONST_LOOPS  0x02 /* loops_per_jiffy or other kernel
  166.  * "constants" aren't affected by
  167.  * frequency transitions */
  168. #define CPUFREQ_PM_NO_WARN 0x04 /* don't warn on suspend/resume speed
  169.  * mismatches */
  170. int cpufreq_register_driver(struct cpufreq_driver *driver_data);
  171. int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
  172. void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state);
  173. static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max) 
  174. {
  175. if (policy->min < min)
  176. policy->min = min;
  177. if (policy->max < min)
  178. policy->max = min;
  179. if (policy->min > max)
  180. policy->min = max;
  181. if (policy->max > max)
  182. policy->max = max;
  183. if (policy->min > policy->max)
  184. policy->min = policy->max;
  185. return;
  186. }
  187. struct freq_attr {
  188. struct attribute attr;
  189. ssize_t (*show)(struct cpufreq_policy *, char *);
  190. ssize_t (*store)(struct cpufreq_policy *, const char *, size_t count);
  191. };
  192. /*********************************************************************
  193.  *                        CPUFREQ 2.6. INTERFACE                     *
  194.  *********************************************************************/
  195. int cpufreq_set_policy(struct cpufreq_policy *policy);
  196. int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu);
  197. int cpufreq_update_policy(unsigned int cpu);
  198. /* query the current CPU frequency (in kHz). If zero, cpufreq couldn't detect it */
  199. unsigned int cpufreq_get(unsigned int cpu);
  200. /*********************************************************************
  201.  *                       CPUFREQ DEFAULT GOVERNOR                    *
  202.  *********************************************************************/
  203. #ifdef CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE
  204. extern struct cpufreq_governor cpufreq_gov_performance;
  205. #define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_performance
  206. #elif defined(CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE)
  207. extern struct cpufreq_governor cpufreq_gov_userspace;
  208. #define CPUFREQ_DEFAULT_GOVERNOR &cpufreq_gov_userspace
  209. #endif
  210. /*********************************************************************
  211.  *                     FREQUENCY TABLE HELPERS                       *
  212.  *********************************************************************/
  213. #define CPUFREQ_ENTRY_INVALID ~0
  214. #define CPUFREQ_TABLE_END     ~1
  215. struct cpufreq_frequency_table {
  216. unsigned int index;     /* any */
  217. unsigned int frequency; /* kHz - doesn't need to be in ascending
  218.     * order */
  219. };
  220. int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
  221.     struct cpufreq_frequency_table *table);
  222. int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
  223.    struct cpufreq_frequency_table *table);
  224. int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
  225.    struct cpufreq_frequency_table *table,
  226.    unsigned int target_freq,
  227.    unsigned int relation,
  228.    unsigned int *index);
  229. /* the following 3 funtions are for cpufreq core use only */
  230. struct cpufreq_frequency_table *cpufreq_frequency_get_table(unsigned int cpu);
  231. struct cpufreq_policy *cpufreq_cpu_get(unsigned int cpu);
  232. void   cpufreq_cpu_put (struct cpufreq_policy *data);
  233. /* the following are really really optional */
  234. extern struct freq_attr cpufreq_freq_attr_scaling_available_freqs;
  235. void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table, 
  236.       unsigned int cpu);
  237. void cpufreq_frequency_table_put_attr(unsigned int cpu);
  238. /*********************************************************************
  239.  *                     UNIFIED DEBUG HELPERS                         *
  240.  *********************************************************************/
  241. #define CPUFREQ_DEBUG_CORE 1
  242. #define CPUFREQ_DEBUG_DRIVER 2
  243. #define CPUFREQ_DEBUG_GOVERNOR 4
  244. #ifdef CONFIG_CPU_FREQ_DEBUG
  245. extern void cpufreq_debug_printk(unsigned int type, const char *prefix, 
  246.  const char *fmt, ...);
  247. #else
  248. #define cpufreq_debug_printk(msg...) do { } while(0)
  249. #endif /* CONFIG_CPU_FREQ_DEBUG */
  250. #endif /* _LINUX_CPUFREQ_H */