Lines Matching +full:no +full:- +full:tick +full:- +full:in +full:- +full:suspend

1 // SPDX-License-Identifier: GPL-2.0-only
3 * intel_idle.c - native hardware idle loop for modern Intel processors
5 * Copyright (c) 2013 - 2020, Intel Corporation.
12 * in lieu of the legacy ACPI processor_idle driver. The intent is to
23 * for preventing entry into deep C-states
25 * CPU will flush caches as needed when entering a C-state via MWAIT
26 * (in contrast to entering ACPI C3, in which case the WBINVD
33 * ACPI has a .suspend hack to turn off deep c-statees during suspend
35 * Have not seen issues with suspend, but may need same workaround here.
39 /* un-comment DEBUG to enable pr_debug() statements */
47 #include <linux/tick.h>
54 #include <asm/intel-family.h>
65 static int max_cstate = CPUIDLE_STATE_MAX - 1;
77 * Hardware C-state auto-demotion may not always be optimal.
97 * MWAIT takes an 8-bit "hint" in EAX "suggesting"
98 * the C-state (top nibble) and sub-state (bottom nibble)
107 * intel_idle - Ask the processor to enter the given idle state.
115 * If the local APIC timer is not known to be reliable in the target idle state,
116 * enable one-shot tick broadcasting for the target CPU before executing MWAIT.
126 struct cpuidle_state *state = &drv->states[index]; in intel_idle()
127 unsigned long eax = flg2MWAIT(state->flags); in intel_idle()
136 * intel_idle_s2idle - Ask the processor to enter the given idle state.
144 * Invoked as a suspend-to-idle callback routine with frozen user space, frozen
145 * scheduler tick and suspended scheduler clock on the target CPU.
150 unsigned long eax = flg2MWAIT(drv->states[index].flags); in intel_idle_s2idle()
1145 unsigned long eax = flg2MWAIT(state->flags); in intel_idle_state_needs_timer_stop()
1151 * Switch over to one-shot tick broadcast if the target C-state in intel_idle_state_needs_timer_stop()
1164 static bool force_use_acpi __read_mostly; /* No effect if no_acpi is set. */
1171 * intel_idle_cst_usable - Check if the _CST information can be used.
1173 * Check if all of the C-states listed by _CST in the max_cstate range are
1186 if (cx->entry_method != ACPI_CSTATE_FFH) in intel_idle_cst_usable()
1208 if (acpi_processor_evaluate_cst(pr->handle, cpu, &acpi_state_table)) in intel_idle_acpi_cst_extract()
1239 if (intel_idle_max_cstate_reached(cstate - 1)) in intel_idle_init_cstates_acpi()
1244 state = &drv->states[drv->state_count++]; in intel_idle_init_cstates_acpi()
1246 snprintf(state->name, CPUIDLE_NAME_LEN, "C%d_ACPI", cstate); in intel_idle_init_cstates_acpi()
1247 strlcpy(state->desc, cx->desc, CPUIDLE_DESC_LEN); in intel_idle_init_cstates_acpi()
1248 state->exit_latency = cx->latency; in intel_idle_init_cstates_acpi()
1250 * For C1-type C-states use the same number for both the exit in intel_idle_init_cstates_acpi()
1252 * C1 in the majority of the static C-states tables above. in intel_idle_init_cstates_acpi()
1253 * For the other types of C-states, however, set the target in intel_idle_init_cstates_acpi()
1255 * a reasonable balance between energy-efficiency and in intel_idle_init_cstates_acpi()
1256 * performance in the majority of interesting cases. in intel_idle_init_cstates_acpi()
1258 state->target_residency = cx->latency; in intel_idle_init_cstates_acpi()
1259 if (cx->type > ACPI_STATE_C1) in intel_idle_init_cstates_acpi()
1260 state->target_residency *= 3; in intel_idle_init_cstates_acpi()
1262 state->flags = MWAIT2flg(cx->address); in intel_idle_init_cstates_acpi()
1263 if (cx->type > ACPI_STATE_C2) in intel_idle_init_cstates_acpi()
1264 state->flags |= CPUIDLE_FLAG_TLB_FLUSHED; in intel_idle_init_cstates_acpi()
1267 state->flags |= CPUIDLE_FLAG_OFF; in intel_idle_init_cstates_acpi()
1270 state->flags |= CPUIDLE_FLAG_TIMER_STOP; in intel_idle_init_cstates_acpi()
1272 state->enter = intel_idle; in intel_idle_init_cstates_acpi()
1273 state->enter_s2idle = intel_idle_s2idle; in intel_idle_init_cstates_acpi()
1282 * If there are no _CST C-states, do not disable any C-states by in intel_idle_off_by_default()
1308 * ivt_idle_state_table_update - Tune the idle states table for Ivy Town.
1310 * Tune IVT multi-socket targets.
1315 /* IVT uses a different table for 1-2, 3-4, and > 4 sockets */ in ivt_idle_state_table_update()
1337 * irtl_2_usec - IRTL to microseconds conversion.
1358 * bxt_idle_state_table_update - Fix up the Broxton idle states table.
1406 * sklh_idle_state_table_update - Fix up the Sky Lake idle states table.
1408 * On SKL-H (model 0x5e) skip C8 and C9 if C10 is enabled and SGX disabled.
1420 /* if PC10 not present in CPUID.MWAIT.EDX */ in sklh_idle_state_table_update()
1426 /* PC10 is not enabled in PKG C-state limit */ in sklh_idle_state_table_update()
1443 skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ in sklh_idle_state_table_update()
1444 skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ in sklh_idle_state_table_update()
1453 /* Ignore the C-state if there are NO sub-states in CPUID for it. */ in intel_idle_verify_cstate()
1458 mark_tsc_unstable("TSC halts in idle states deeper than C2"); in intel_idle_verify_cstate()
1502 drv->states[drv->state_count] = cpuidle_state_table[cstate]; in intel_idle_init_cstates_icpu()
1504 if ((disabled_states_mask & BIT(drv->state_count)) || in intel_idle_init_cstates_icpu()
1505 ((icpu->use_acpi || force_use_acpi) && in intel_idle_init_cstates_icpu()
1508 drv->states[drv->state_count].flags |= CPUIDLE_FLAG_OFF; in intel_idle_init_cstates_icpu()
1510 if (intel_idle_state_needs_timer_stop(&drv->states[drv->state_count])) in intel_idle_init_cstates_icpu()
1511 drv->states[drv->state_count].flags |= CPUIDLE_FLAG_TIMER_STOP; in intel_idle_init_cstates_icpu()
1513 drv->state_count++; in intel_idle_init_cstates_icpu()
1516 if (icpu->byt_auto_demotion_disable_flag) { in intel_idle_init_cstates_icpu()
1523 * intel_idle_cpuidle_driver_init - Create the list of available idle states.
1531 drv->states[0].flags |= CPUIDLE_FLAG_OFF; in intel_idle_cpuidle_driver_init()
1533 drv->state_count = 1; in intel_idle_cpuidle_driver_init()
1560 * intel_idle_cpu_init - Register the target CPU with the cpuidle core.
1563 * Register a cpuidle device object for @cpu and update its MSRs in accordance
1571 dev->cpu = cpu; in intel_idle_cpu_init()
1575 return -EIO; in intel_idle_cpu_init()
1597 * driver in this case in intel_idle_cpu_online()
1600 if (!dev->registered) in intel_idle_cpu_online()
1607 * intel_idle_cpuidle_devices_uninit - Unregister all cpuidle devices.
1625 return -ENODEV; in intel_idle_init()
1629 return -EPERM; in intel_idle_init()
1635 pr_debug("Please enable MWAIT in BIOS SETUP\n"); in intel_idle_init()
1636 return -ENODEV; in intel_idle_init()
1641 return -ENODEV; in intel_idle_init()
1645 return -ENODEV; in intel_idle_init()
1652 return -ENODEV; in intel_idle_init()
1656 icpu = (const struct idle_cpu *)id->driver_data; in intel_idle_init()
1658 cpuidle_state_table = icpu->state_table; in intel_idle_init()
1659 auto_demotion_disable_flags = icpu->auto_demotion_disable_flags; in intel_idle_init()
1660 disable_promotion_to_c1e = icpu->disable_promotion_to_c1e; in intel_idle_init()
1661 if (icpu->use_acpi || force_use_acpi) in intel_idle_init()
1664 return -ENODEV; in intel_idle_init()
1672 return -ENOMEM; in intel_idle_init()
1680 drv ? drv->name : "none"); in intel_idle_init()
1689 pr_debug("Local APIC timer is reliable in %s\n", in intel_idle_init()
1690 boot_cpu_has(X86_FEATURE_ARAT) ? "all C-states" : "C1"); in intel_idle_init()
1706 * support "intel_idle.max_cstate=..." at boot and also a read-only export of
1707 * it at /sys/module/intel_idle/parameters/max_cstate -- so using module_param
1712 * The positions of the bits that are set in this number are the indices of the
1714 * corresponding idle state directories in sysfs, "state0", "state1" ...