diff options
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r-- | drivers/acpi/processor_idle.c | 57 |
1 files changed, 9 insertions, 48 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index ae0010821ce3..7eab733ae96e 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -241,26 +241,6 @@ acpi_processor_power_activate(struct acpi_processor *pr, | |||
241 | old->promotion.count = 0; | 241 | old->promotion.count = 0; |
242 | new->demotion.count = 0; | 242 | new->demotion.count = 0; |
243 | 243 | ||
244 | /* Cleanup from old state. */ | ||
245 | if (old) { | ||
246 | switch (old->type) { | ||
247 | case ACPI_STATE_C3: | ||
248 | /* Disable bus master reload */ | ||
249 | if (new->type != ACPI_STATE_C3 && pr->flags.bm_check) | ||
250 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); | ||
251 | break; | ||
252 | } | ||
253 | } | ||
254 | |||
255 | /* Prepare to use new state. */ | ||
256 | switch (new->type) { | ||
257 | case ACPI_STATE_C3: | ||
258 | /* Enable bus master reload */ | ||
259 | if (old->type != ACPI_STATE_C3 && pr->flags.bm_check) | ||
260 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1); | ||
261 | break; | ||
262 | } | ||
263 | |||
264 | pr->power.state = new; | 244 | pr->power.state = new; |
265 | 245 | ||
266 | return; | 246 | return; |
@@ -1121,7 +1101,6 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
1121 | " for C3 to be enabled on SMP systems\n")); | 1101 | " for C3 to be enabled on SMP systems\n")); |
1122 | return; | 1102 | return; |
1123 | } | 1103 | } |
1124 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); | ||
1125 | } | 1104 | } |
1126 | 1105 | ||
1127 | /* | 1106 | /* |
@@ -1137,6 +1116,15 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr, | |||
1137 | #else | 1116 | #else |
1138 | cx->latency_ticks = cx->latency; | 1117 | cx->latency_ticks = cx->latency; |
1139 | #endif | 1118 | #endif |
1119 | /* | ||
1120 | * On older chipsets, BM_RLD needs to be set | ||
1121 | * in order for Bus Master activity to wake the | ||
1122 | * system from C3. Newer chipsets handle DMA | ||
1123 | * during C3 automatically and BM_RLD is a NOP. | ||
1124 | * In either case, the proper way to | ||
1125 | * handle BM_RLD is to set it and leave it set. | ||
1126 | */ | ||
1127 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1); | ||
1140 | 1128 | ||
1141 | return; | 1129 | return; |
1142 | } | 1130 | } |
@@ -1400,25 +1388,6 @@ static int acpi_idle_bm_check(void) | |||
1400 | } | 1388 | } |
1401 | 1389 | ||
1402 | /** | 1390 | /** |
1403 | * acpi_idle_update_bm_rld - updates the BM_RLD bit depending on target state | ||
1404 | * @pr: the processor | ||
1405 | * @target: the new target state | ||
1406 | */ | ||
1407 | static inline void acpi_idle_update_bm_rld(struct acpi_processor *pr, | ||
1408 | struct acpi_processor_cx *target) | ||
1409 | { | ||
1410 | if (pr->flags.bm_rld_set && target->type != ACPI_STATE_C3) { | ||
1411 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 0); | ||
1412 | pr->flags.bm_rld_set = 0; | ||
1413 | } | ||
1414 | |||
1415 | if (!pr->flags.bm_rld_set && target->type == ACPI_STATE_C3) { | ||
1416 | acpi_set_register(ACPI_BITREG_BUS_MASTER_RLD, 1); | ||
1417 | pr->flags.bm_rld_set = 1; | ||
1418 | } | ||
1419 | } | ||
1420 | |||
1421 | /** | ||
1422 | * acpi_idle_do_entry - a helper function that does C2 and C3 type entry | 1391 | * acpi_idle_do_entry - a helper function that does C2 and C3 type entry |
1423 | * @cx: cstate data | 1392 | * @cx: cstate data |
1424 | * | 1393 | * |
@@ -1473,9 +1442,6 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev, | |||
1473 | return 0; | 1442 | return 0; |
1474 | } | 1443 | } |
1475 | 1444 | ||
1476 | if (pr->flags.bm_check) | ||
1477 | acpi_idle_update_bm_rld(pr, cx); | ||
1478 | |||
1479 | t1 = inl(acpi_gbl_FADT.xpm_timer_block.address); | 1445 | t1 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
1480 | acpi_idle_do_entry(cx); | 1446 | acpi_idle_do_entry(cx); |
1481 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); | 1447 | t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); |
@@ -1527,9 +1493,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
1527 | */ | 1493 | */ |
1528 | acpi_state_timer_broadcast(pr, cx, 1); | 1494 | acpi_state_timer_broadcast(pr, cx, 1); |
1529 | 1495 | ||
1530 | if (pr->flags.bm_check) | ||
1531 | acpi_idle_update_bm_rld(pr, cx); | ||
1532 | |||
1533 | if (cx->type == ACPI_STATE_C3) | 1496 | if (cx->type == ACPI_STATE_C3) |
1534 | ACPI_FLUSH_CPU_CACHE(); | 1497 | ACPI_FLUSH_CPU_CACHE(); |
1535 | 1498 | ||
@@ -1621,8 +1584,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
1621 | */ | 1584 | */ |
1622 | acpi_state_timer_broadcast(pr, cx, 1); | 1585 | acpi_state_timer_broadcast(pr, cx, 1); |
1623 | 1586 | ||
1624 | acpi_idle_update_bm_rld(pr, cx); | ||
1625 | |||
1626 | /* | 1587 | /* |
1627 | * disable bus master | 1588 | * disable bus master |
1628 | * bm_check implies we need ARB_DIS | 1589 | * bm_check implies we need ARB_DIS |