prpower.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:17k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  *
  3.  * Module Name: prpower.c
  4.  *   $Revision: 32 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 Andrew Grover
  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 as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. /* TBD: Linux specific */
  25. #include <linux/sched.h>
  26. #include <linux/pm.h>
  27. #include <asm/io.h>
  28. #include <acpi.h>
  29. #include <bm.h>
  30. #include "pr.h"
  31. #define _COMPONENT ACPI_PROCESSOR
  32. MODULE_NAME ("prpower")
  33. /****************************************************************************
  34.  *                                  Globals
  35.  ****************************************************************************/
  36. extern FADT_DESCRIPTOR acpi_fadt;
  37. static u32 last_idle_jiffies = 0;
  38. static PR_CONTEXT *processor_list[NR_CPUS];
  39. static void (*pr_pm_idle_save)(void) = NULL;
  40. static u8 bm_control = 0;
  41. /* Used for PIIX4 errata handling. */
  42. unsigned short acpi_piix4_bmisx = 0;
  43. /****************************************************************************
  44.  *                             External Functions
  45.  ****************************************************************************/
  46. /****************************************************************************
  47.  *
  48.  * FUNCTION:    pr_power_activate_state
  49.  *
  50.  * PARAMETERS:
  51.  *
  52.  * RETURN:
  53.  *
  54.  * DESCRIPTION:
  55.  *
  56.  ****************************************************************************/
  57. void
  58. pr_power_activate_state (
  59. PR_CONTEXT *processor,
  60. u32 next_state)
  61. {
  62. PROC_NAME("pr_power_activate_state");
  63. if (!processor) {
  64. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Invalid (NULL) context.n"));
  65. return;
  66. }
  67. processor->power.state[processor->power.active_state].promotion.count = 0;
  68. processor->power.state[processor->power.active_state].demotion.count = 0;
  69. /*
  70.  * Cleanup from old state.
  71.  */
  72. switch (processor->power.active_state) {
  73. case PR_C3:
  74. /* Disable bus master reload */
  75. acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK,
  76. BM_RLD, 0);
  77. break;
  78. }
  79. /*
  80.  * Prepare to use new state.
  81.  */
  82. switch (next_state) {
  83. case PR_C3:
  84. /* Enable bus master reload */
  85. acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK,
  86. BM_RLD, 1);
  87. break;
  88. }
  89. processor->power.active_state = next_state;
  90. return;
  91. }
  92. /****************************************************************************
  93.  *
  94.  * FUNCTION:    pr_power_idle
  95.  *
  96.  * PARAMETERS:  <none>
  97.  *
  98.  * RETURN:
  99.  *
  100.  * DESCRIPTION:
  101.  *
  102.  ****************************************************************************/
  103. void
  104. pr_power_idle (void)
  105. {
  106. PR_CX *c_state = NULL;
  107. u32 next_state = 0;
  108. u32 start_ticks, end_ticks, time_elapsed;
  109. PR_CONTEXT *processor = NULL;
  110. PROC_NAME("pr_power_idle");
  111. processor = processor_list[smp_processor_id()];
  112. if (!processor || processor->power.active_state == PR_C0) {
  113. return;
  114. }
  115. next_state = processor->power.active_state;
  116. /*
  117.  * Check OS Idleness:
  118.  * ------------------
  119.  * If the OS has been busy (hasn't called the idle handler in a while)
  120.  * then automatically demote to the default power state (e.g. C1).
  121.  *
  122.  * TBD: Optimize by having scheduler determine business instead
  123.  *      of having us try to calculate it.
  124.  */
  125. if (processor->power.active_state != processor->power.default_state) {
  126. if ((jiffies - last_idle_jiffies) >= processor->power.busy_metric) {
  127. next_state = processor->power.default_state;
  128. if (next_state != processor->power.active_state) {
  129. pr_power_activate_state(processor, next_state);
  130. }
  131. }
  132. }
  133. disable();
  134. /*
  135.  * Log BM Activity:
  136.  * ----------------
  137.  * Read BM_STS and record its value for later use by C3 policy.
  138.  * (Note that we save the BM_STS values for the last 32 cycles).
  139.  */
  140. if (bm_control) {
  141. processor->power.bm_activity <<= 1;
  142. if (acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS)) {
  143. processor->power.bm_activity |= 1;
  144. acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK,
  145. BM_STS, 1);
  146. }
  147. else if (acpi_piix4_bmisx) {
  148. /*
  149.  * PIIX4 Errata:
  150.  * -------------
  151.  * This code is a workaround for errata #18 "C3 Power State/
  152.  * BMIDE and Type-F DMA Livelock" from the July '01 PIIX4
  153.  * specification update.  Note that BM_STS doesn't always
  154.  * reflect the true state of bus mastering activity; forcing
  155.  * us to manually check the BMIDEA bit of each IDE channel.
  156.  */
  157. if ((inb_p(acpi_piix4_bmisx + 0x02) & 0x01) ||
  158. (inb_p(acpi_piix4_bmisx + 0x0A) & 0x01))
  159. processor->power.bm_activity |= 1;
  160. }
  161. }
  162. c_state = &(processor->power.state[processor->power.active_state]);
  163. c_state->utilization++;
  164. /*
  165.  * Sleep:
  166.  * ------
  167.  * Invoke the current Cx state to put the processor to sleep.
  168.  */
  169. switch (processor->power.active_state) {
  170. case PR_C1:
  171. /* Invoke C1 */
  172. enable(); halt();
  173. /*
  174.  * TBD: Can't get time duration while in C1, as resumes
  175.  *      go to an ISR rather than here.
  176.  */
  177. time_elapsed = 0xFFFFFFFF;
  178. break;
  179. case PR_C2:
  180. /* See how long we're asleep for */
  181. acpi_get_timer(&start_ticks);
  182. /* Invoke C2 */
  183. acpi_os_read_port(processor->power.p_lvl2, NULL, 8);
  184. /* Dummy op - must do something useless after P_LVL2 read */
  185. acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS);
  186. /* Compute time elapsed */
  187. acpi_get_timer(&end_ticks);
  188. /* Re-enable interrupts */
  189. enable();
  190. acpi_get_timer_duration(start_ticks, end_ticks, &time_elapsed);
  191. break;
  192. case PR_C3:
  193. /* Disable bus master arbitration */
  194. acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, ARB_DIS, 1);
  195. /* See how long we're asleep for */
  196. acpi_get_timer(&start_ticks);
  197. /* Invoke C3 */
  198. acpi_os_read_port(processor->power.p_lvl3, NULL, 8);
  199. /* Dummy op - must do something useless after P_LVL3 read */
  200. acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_DO_NOT_LOCK, BM_STS);
  201. /* Compute time elapsed */
  202. acpi_get_timer(&end_ticks);
  203. /* Enable bus master arbitration */
  204. acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK,
  205. ARB_DIS, 0);
  206. /* Re-enable interrupts */
  207. enable();
  208. acpi_get_timer_duration(start_ticks, end_ticks, &time_elapsed);
  209. break;
  210. default:
  211. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Attempt to use unsupported power state C%d.n", processor->power.active_state));
  212. enable();
  213. break;
  214. }
  215. /*
  216.  * Promotion?
  217.  * ----------
  218.  * Track the number of successful sleeps (time asleep is greater
  219.  * than time_threshold) and promote when count_threshold is
  220.  * reached.
  221.  */
  222. if ((c_state->promotion.target_state) && 
  223. (time_elapsed >= c_state->promotion.time_threshold)) {
  224. c_state->promotion.count++;
  225.   c_state->demotion.count = 0;
  226. if (c_state->promotion.count >= c_state->promotion.count_threshold) {
  227. /*
  228.  * Bus Mastering Activity, if active and used
  229.  * by this state's promotion policy, prevents
  230.  * promotions from occuring.
  231.  */
  232. if (!bm_control || !(processor->power.bm_activity & c_state->promotion.bm_threshold))
  233. next_state = c_state->promotion.target_state;
  234. }
  235. }
  236. /*
  237.  * Demotion?
  238.  * ---------
  239.  * Track the number of shorts (time asleep is less than
  240.  * time_threshold) and demote when count_threshold is reached.
  241.  */
  242. if (c_state->demotion.target_state) {
  243. if (time_elapsed < c_state->demotion.time_threshold) {
  244. c_state->demotion.count++;
  245. c_state->promotion.count = 0;
  246. if (c_state->demotion.count >=
  247. c_state->demotion.count_threshold) {
  248. next_state = c_state->demotion.target_state;
  249. }
  250. }
  251. /*
  252.  * Bus Mastering Activity, if active and used by this
  253.  * state's promotion policy, causes an immediate demotion
  254.  * to occur.
  255.  */
  256. if (bm_control && (processor->power.bm_activity & c_state->demotion.bm_threshold))
  257. next_state = c_state->demotion.target_state;
  258. }
  259. /*
  260.  * New Cx State?
  261.  * -------------
  262.  * If we're going to start using a new Cx state we must clean up
  263.  * from the previous and prepare to use the new.
  264.  */
  265. if (next_state != processor->power.active_state) {
  266. pr_power_activate_state(processor, next_state);
  267. processor->power.active_state = processor->power.active_state;
  268. }
  269. /*
  270.  * Track OS Idleness:
  271.  * ------------------
  272.  * Record a jiffies timestamp to compute time elapsed between calls
  273.  * to the idle handler.
  274.  */
  275. last_idle_jiffies = jiffies;
  276. return;
  277. }
  278. /*****************************************************************************
  279.  *
  280.  * FUNCTION:    pr_power_set_default_policy
  281.  *
  282.  * PARAMETERS:
  283.  *
  284.  * RETURN:
  285.  *
  286.  * DESCRIPTION: Sets the default Cx state policy (OS idle handler).  Our
  287.  *              scheme is to promote quickly to C2 but more conservatively
  288.  *              to C3.  We're favoring C2 for its characteristics of low
  289.  *              latency (quick response), good power savings, and ability
  290.  *              to allow bus mastering activity.
  291.  *
  292.  *              Note that Cx state policy is completely customizable, with
  293.  *              the goal of having heuristics to alter policy dynamically.
  294.  *
  295.  ****************************************************************************/
  296. acpi_status
  297. pr_power_set_default_policy (
  298. PR_CONTEXT                 *processor)
  299. {
  300. FUNCTION_TRACE("pr_power_set_default_policy");
  301. if (!processor) {
  302. return_ACPI_STATUS(AE_BAD_PARAMETER);
  303. }
  304. /*
  305.  * Busy Metric:
  306.  * ------------
  307.  * Used to determine when the OS has been busy and thus when
  308.  * policy should return to using the default Cx state (e.g. C1).
  309.  * On Linux we use the number of jiffies (scheduler quantums)
  310.  * that transpire between calls to the idle handler.
  311.  *
  312.  * TBD: Linux-specific.
  313.  */
  314. processor->power.busy_metric = 2;
  315. /*
  316.  * C1:
  317.  * ---
  318.  * C1 serves as our default state.  It must be valid.
  319.  */
  320. if (processor->power.state[PR_C1].is_valid) {
  321. processor->power.active_state =
  322. processor->power.default_state = PR_C1;
  323. }
  324. else {
  325. processor->power.active_state =
  326. processor->power.default_state = PR_C0;
  327. return_ACPI_STATUS(AE_OK);
  328. }
  329. /*
  330.  * C2:
  331.  * ---
  332.  * Set default C1 promotion and C2 demotion policies.
  333.  */
  334. if (processor->power.state[PR_C2].is_valid) {
  335. /*
  336.  * Promote from C1 to C2 anytime we're asleep in C1 for
  337.  * longer than two times the C2 latency (to amortize cost
  338.  * of transition).  Demote from C2 to C1 anytime we're
  339.  * asleep in C2 for less than this time.
  340.  */
  341. processor->power.state[PR_C1].promotion.count_threshold = 10;
  342. processor->power.state[PR_C1].promotion.time_threshold =
  343. 2 * processor->power.state[PR_C2].latency;
  344. processor->power.state[PR_C1].promotion.target_state = PR_C2;
  345. processor->power.state[PR_C2].demotion.count_threshold = 1;
  346. processor->power.state[PR_C2].demotion.time_threshold =
  347. 2 * processor->power.state[PR_C2].latency;
  348. processor->power.state[PR_C2].demotion.target_state = PR_C1;
  349. }
  350. /*
  351.  * C3:
  352.  * ---
  353.  * Set default C2 promotion and C3 demotion policies.
  354.  */
  355. if ((processor->power.state[PR_C2].is_valid) &&
  356. (processor->power.state[PR_C3].is_valid)) {
  357. /*
  358.  * Promote from C2 to C3 after 4 cycles of no bus
  359.  * mastering activity (while maintaining sleep time
  360.  * criteria).  Demote immediately on a short or
  361.  * whenever bus mastering activity occurs.
  362.  */
  363. processor->power.state[PR_C2].promotion.count_threshold = 1;
  364. processor->power.state[PR_C2].promotion.time_threshold =
  365. 2 * processor->power.state[PR_C3].latency;
  366. processor->power.state[PR_C2].promotion.bm_threshold =
  367. 0x0000000F;
  368. processor->power.state[PR_C2].promotion.target_state =
  369. PR_C3;
  370. processor->power.state[PR_C3].demotion.count_threshold = 1;
  371. processor->power.state[PR_C3].demotion.time_threshold =
  372. 2 * processor->power.state[PR_C3].latency;
  373. processor->power.state[PR_C3].demotion.bm_threshold =
  374. 0x0000000F;
  375. processor->power.state[PR_C3].demotion.target_state =
  376. PR_C2;
  377. }
  378. return_ACPI_STATUS(AE_OK);
  379. }
  380. /*****************************************************************************
  381.  *
  382.  * FUNCTION:    pr_power_add_device
  383.  *
  384.  * PARAMETERS:  <none>
  385.  *
  386.  * RETURN:
  387.  *
  388.  * DESCRIPTION:
  389.  *
  390.  ****************************************************************************/
  391. /*
  392.  * TBD: 1. PROC_C1 support.
  393.  *      2. Symmetric Cx state support (different Cx states supported
  394.  *         by different CPUs results in lowest common denominator).
  395.  */
  396. acpi_status
  397. pr_power_add_device (
  398. PR_CONTEXT                 *processor)
  399. {
  400. FUNCTION_TRACE("pr_power_add_device");
  401. if (!processor) {
  402. return_ACPI_STATUS(AE_BAD_PARAMETER);
  403. }
  404. /*
  405.  * State Count:
  406.  * ------------
  407.  * Fixed at four (C0-C3).  We use is_valid to determine whether or
  408.  * not a state actually gets used.
  409.  */
  410. processor->power.state_count = PR_MAX_POWER_STATES;
  411. /*
  412.  * C0:
  413.  * ---
  414.  * C0 exists only as filler in our array. (Let's assume its valid!)
  415.  */
  416. processor->power.state[PR_C0].is_valid = TRUE;
  417. /*
  418.  * C1:
  419.  * ---
  420.  * ACPI states that C1 must be supported by all processors
  421.  * with a latency so small that it can be ignored.
  422.  *
  423.  * TBD: What about PROC_C1 support?
  424.  */
  425. processor->power.state[PR_C1].is_valid = TRUE;
  426. /*
  427.  * C2:
  428.  * ---
  429.  * We're only supporting C2 on UP systems with latencies <= 100us.
  430.  *
  431.  * TBD: Support for C2 on MP (P_LVL2_UP) -- I'm taking the
  432.  *      conservative approach for now.
  433.  */
  434. processor->power.state[PR_C2].latency = acpi_fadt.plvl2_lat;
  435. #ifdef CONFIG_SMP
  436. if (smp_num_cpus == 1) {
  437. #endif /*CONFIG_SMP*/
  438. if (acpi_fadt.plvl2_lat <= PR_MAX_C2_LATENCY) {
  439. processor->power.state[PR_C2].is_valid = TRUE;
  440. processor->power.p_lvl2 = processor->pblk.address + 4;
  441. }
  442. #ifdef CONFIG_SMP
  443. }
  444. #endif /*CONFIG_SMP*/
  445. /*
  446.  * C3:
  447.  * ---
  448.  * We're only supporting C3 on UP systems with latencies <= 1000us,
  449.  * and that include the ability to disable bus mastering while in
  450.  * C3 (ARB_DIS) but allows bus mastering requests to wake the system
  451.  * from C3 (BM_RLD).  Note his method of maintaining cache coherency
  452.  * (disabling of bus mastering) cannot be used on SMP systems, and
  453.  * flushing caches (e.g. WBINVD) is simply too costly at this time.
  454.  *
  455.  * TBD: Support for C3 on MP -- I'm taking the conservative
  456.  *      approach for now.
  457.  */
  458. processor->power.state[PR_C3].latency = acpi_fadt.plvl3_lat;
  459. #ifdef CONFIG_SMP
  460. if (smp_num_cpus == 1) {
  461. #endif /*CONFIG_SMP*/
  462. if ((acpi_fadt.plvl3_lat <= PR_MAX_C3_LATENCY) && bm_control) {
  463. processor->power.state[PR_C3].is_valid = TRUE;
  464. processor->power.p_lvl3 = processor->pblk.address + 5;
  465. }
  466. #ifdef CONFIG_SMP
  467. }
  468. #endif /*CONFIG_SMP*/
  469. /*
  470.  * Set Default Policy:
  471.  * -------------------
  472.  * Now that we know which state are supported, set the default
  473.  * policy.  Note that this policy can be changed dynamically
  474.  * (e.g. encourage deeper sleeps to conserve battery life when
  475.  * not on AC).
  476.  */
  477. pr_power_set_default_policy(processor);
  478. /*
  479.  * Save Processor Context:
  480.  * -----------------------
  481.  * TBD: Enhance Linux idle handler to take processor context
  482.  *      parameter.
  483.  */
  484. processor_list[processor->uid] = processor;
  485. return_ACPI_STATUS(AE_OK);
  486. }
  487. /****************************************************************************
  488.  *
  489.  * FUNCTION:    pr_power_remove_device
  490.  *
  491.  * PARAMETERS:
  492.  *
  493.  * RETURN:
  494.  *
  495.  * DESCRIPTION:
  496.  *
  497.  ****************************************************************************/
  498. acpi_status
  499. pr_power_remove_device (
  500. PR_CONTEXT              *processor)
  501. {
  502. acpi_status             status = AE_OK;
  503. FUNCTION_TRACE("pr_power_remove_device");
  504. if (!processor) {
  505. return_ACPI_STATUS(AE_BAD_PARAMETER);
  506. }
  507. MEMSET(&(processor->power), 0, sizeof(PR_POWER));
  508. processor_list[processor->uid] = NULL;
  509. return_ACPI_STATUS(status);
  510. }
  511. /****************************************************************************
  512.  *
  513.  * FUNCTION:    pr_power_initialize
  514.  *
  515.  * PARAMETERS:  <none>
  516.  *
  517.  * RETURN:
  518.  *
  519.  * DESCRIPTION:
  520.  *
  521.  ****************************************************************************/
  522. acpi_status
  523. pr_power_initialize (void)
  524. {
  525. u32 i = 0;
  526. FUNCTION_TRACE("pr_power_initialize");
  527. /* TBD: Linux-specific. */
  528. for (i=0; i<NR_CPUS; i++) {
  529. processor_list[i] = NULL;
  530. }
  531. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Max CPUs[%d], this CPU[%d].n", NR_CPUS, smp_processor_id()));
  532. /* Only use C3 if we can control bus mastering. */
  533. if (acpi_fadt.V1_pm2_cnt_blk && acpi_fadt.pm2_cnt_len)
  534. bm_control = 1;
  535. /*
  536.  * Install idle handler.
  537.  *
  538.  * TBD: Linux-specific (need OSL function).
  539.  */
  540. pr_pm_idle_save = pm_idle;
  541. pm_idle = pr_power_idle;
  542. return_ACPI_STATUS(AE_OK);
  543. }
  544. /****************************************************************************
  545.  *
  546.  * FUNCTION:    pr_power_terminate
  547.  *
  548.  * PARAMETERS:  <none>
  549.  *
  550.  * RETURN:
  551.  *
  552.  * DESCRIPTION:
  553.  *
  554.  ****************************************************************************/
  555. acpi_status
  556. pr_power_terminate (void)
  557. {
  558. FUNCTION_TRACE("pr_power_terminate");
  559. /*
  560.  * Remove idle handler.
  561.  *
  562.  * TBD: Linux-specific (need OSL function).
  563.  */
  564. pm_idle = pr_pm_idle_save;
  565. return_ACPI_STATUS(AE_OK);
  566. }