|
|
|
@ -97,7 +97,7 @@ static const struct idle_cpu *icpu;
|
|
|
|
|
static struct cpuidle_device __percpu *intel_idle_cpuidle_devices;
|
|
|
|
|
static int intel_idle(struct cpuidle_device *dev,
|
|
|
|
|
struct cpuidle_driver *drv, int index);
|
|
|
|
|
static void intel_idle_freeze(struct cpuidle_device *dev,
|
|
|
|
|
static void intel_idle_s2idle(struct cpuidle_device *dev,
|
|
|
|
|
struct cpuidle_driver *drv, int index);
|
|
|
|
|
static struct cpuidle_state *cpuidle_state_table;
|
|
|
|
|
|
|
|
|
@ -132,7 +132,7 @@ static struct cpuidle_state nehalem_cstates[] = {
|
|
|
|
|
.exit_latency = 3,
|
|
|
|
|
.target_residency = 6,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -140,7 +140,7 @@ static struct cpuidle_state nehalem_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -148,7 +148,7 @@ static struct cpuidle_state nehalem_cstates[] = {
|
|
|
|
|
.exit_latency = 20,
|
|
|
|
|
.target_residency = 80,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -156,7 +156,7 @@ static struct cpuidle_state nehalem_cstates[] = {
|
|
|
|
|
.exit_latency = 200,
|
|
|
|
|
.target_residency = 800,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -169,7 +169,7 @@ static struct cpuidle_state snb_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -177,7 +177,7 @@ static struct cpuidle_state snb_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -185,7 +185,7 @@ static struct cpuidle_state snb_cstates[] = {
|
|
|
|
|
.exit_latency = 80,
|
|
|
|
|
.target_residency = 211,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -193,7 +193,7 @@ static struct cpuidle_state snb_cstates[] = {
|
|
|
|
|
.exit_latency = 104,
|
|
|
|
|
.target_residency = 345,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7",
|
|
|
|
|
.desc = "MWAIT 0x30",
|
|
|
|
@ -201,7 +201,7 @@ static struct cpuidle_state snb_cstates[] = {
|
|
|
|
|
.exit_latency = 109,
|
|
|
|
|
.target_residency = 345,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -214,7 +214,7 @@ static struct cpuidle_state byt_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6N",
|
|
|
|
|
.desc = "MWAIT 0x58",
|
|
|
|
@ -222,7 +222,7 @@ static struct cpuidle_state byt_cstates[] = {
|
|
|
|
|
.exit_latency = 300,
|
|
|
|
|
.target_residency = 275,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6S",
|
|
|
|
|
.desc = "MWAIT 0x52",
|
|
|
|
@ -230,7 +230,7 @@ static struct cpuidle_state byt_cstates[] = {
|
|
|
|
|
.exit_latency = 500,
|
|
|
|
|
.target_residency = 560,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -238,7 +238,7 @@ static struct cpuidle_state byt_cstates[] = {
|
|
|
|
|
.exit_latency = 1200,
|
|
|
|
|
.target_residency = 4000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7S",
|
|
|
|
|
.desc = "MWAIT 0x64",
|
|
|
|
@ -246,7 +246,7 @@ static struct cpuidle_state byt_cstates[] = {
|
|
|
|
|
.exit_latency = 10000,
|
|
|
|
|
.target_residency = 20000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -259,7 +259,7 @@ static struct cpuidle_state cht_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6N",
|
|
|
|
|
.desc = "MWAIT 0x58",
|
|
|
|
@ -267,7 +267,7 @@ static struct cpuidle_state cht_cstates[] = {
|
|
|
|
|
.exit_latency = 80,
|
|
|
|
|
.target_residency = 275,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6S",
|
|
|
|
|
.desc = "MWAIT 0x52",
|
|
|
|
@ -275,7 +275,7 @@ static struct cpuidle_state cht_cstates[] = {
|
|
|
|
|
.exit_latency = 200,
|
|
|
|
|
.target_residency = 560,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -283,7 +283,7 @@ static struct cpuidle_state cht_cstates[] = {
|
|
|
|
|
.exit_latency = 1200,
|
|
|
|
|
.target_residency = 4000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7S",
|
|
|
|
|
.desc = "MWAIT 0x64",
|
|
|
|
@ -291,7 +291,7 @@ static struct cpuidle_state cht_cstates[] = {
|
|
|
|
|
.exit_latency = 10000,
|
|
|
|
|
.target_residency = 20000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -304,7 +304,7 @@ static struct cpuidle_state ivb_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -312,7 +312,7 @@ static struct cpuidle_state ivb_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -320,7 +320,7 @@ static struct cpuidle_state ivb_cstates[] = {
|
|
|
|
|
.exit_latency = 59,
|
|
|
|
|
.target_residency = 156,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -328,7 +328,7 @@ static struct cpuidle_state ivb_cstates[] = {
|
|
|
|
|
.exit_latency = 80,
|
|
|
|
|
.target_residency = 300,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7",
|
|
|
|
|
.desc = "MWAIT 0x30",
|
|
|
|
@ -336,7 +336,7 @@ static struct cpuidle_state ivb_cstates[] = {
|
|
|
|
|
.exit_latency = 87,
|
|
|
|
|
.target_residency = 300,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -349,7 +349,7 @@ static struct cpuidle_state ivt_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -357,7 +357,7 @@ static struct cpuidle_state ivt_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 80,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -365,7 +365,7 @@ static struct cpuidle_state ivt_cstates[] = {
|
|
|
|
|
.exit_latency = 59,
|
|
|
|
|
.target_residency = 156,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -373,7 +373,7 @@ static struct cpuidle_state ivt_cstates[] = {
|
|
|
|
|
.exit_latency = 82,
|
|
|
|
|
.target_residency = 300,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -386,7 +386,7 @@ static struct cpuidle_state ivt_cstates_4s[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -394,7 +394,7 @@ static struct cpuidle_state ivt_cstates_4s[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 250,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -402,7 +402,7 @@ static struct cpuidle_state ivt_cstates_4s[] = {
|
|
|
|
|
.exit_latency = 59,
|
|
|
|
|
.target_residency = 300,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -410,7 +410,7 @@ static struct cpuidle_state ivt_cstates_4s[] = {
|
|
|
|
|
.exit_latency = 84,
|
|
|
|
|
.target_residency = 400,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -423,7 +423,7 @@ static struct cpuidle_state ivt_cstates_8s[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 1,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -431,7 +431,7 @@ static struct cpuidle_state ivt_cstates_8s[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 500,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -439,7 +439,7 @@ static struct cpuidle_state ivt_cstates_8s[] = {
|
|
|
|
|
.exit_latency = 59,
|
|
|
|
|
.target_residency = 600,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -447,7 +447,7 @@ static struct cpuidle_state ivt_cstates_8s[] = {
|
|
|
|
|
.exit_latency = 88,
|
|
|
|
|
.target_residency = 700,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -460,7 +460,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -468,7 +468,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -476,7 +476,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 33,
|
|
|
|
|
.target_residency = 100,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -484,7 +484,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 133,
|
|
|
|
|
.target_residency = 400,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7s",
|
|
|
|
|
.desc = "MWAIT 0x32",
|
|
|
|
@ -492,7 +492,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 166,
|
|
|
|
|
.target_residency = 500,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C8",
|
|
|
|
|
.desc = "MWAIT 0x40",
|
|
|
|
@ -500,7 +500,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 300,
|
|
|
|
|
.target_residency = 900,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C9",
|
|
|
|
|
.desc = "MWAIT 0x50",
|
|
|
|
@ -508,7 +508,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 600,
|
|
|
|
|
.target_residency = 1800,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C10",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -516,7 +516,7 @@ static struct cpuidle_state hsw_cstates[] = {
|
|
|
|
|
.exit_latency = 2600,
|
|
|
|
|
.target_residency = 7700,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -528,7 +528,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -536,7 +536,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -544,7 +544,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 40,
|
|
|
|
|
.target_residency = 100,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -552,7 +552,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 133,
|
|
|
|
|
.target_residency = 400,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7s",
|
|
|
|
|
.desc = "MWAIT 0x32",
|
|
|
|
@ -560,7 +560,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 166,
|
|
|
|
|
.target_residency = 500,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C8",
|
|
|
|
|
.desc = "MWAIT 0x40",
|
|
|
|
@ -568,7 +568,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 300,
|
|
|
|
|
.target_residency = 900,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C9",
|
|
|
|
|
.desc = "MWAIT 0x50",
|
|
|
|
@ -576,7 +576,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 600,
|
|
|
|
|
.target_residency = 1800,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C10",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -584,7 +584,7 @@ static struct cpuidle_state bdw_cstates[] = {
|
|
|
|
|
.exit_latency = 2600,
|
|
|
|
|
.target_residency = 7700,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -597,7 +597,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -605,7 +605,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C3",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -613,7 +613,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 70,
|
|
|
|
|
.target_residency = 100,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -621,7 +621,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 85,
|
|
|
|
|
.target_residency = 200,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7s",
|
|
|
|
|
.desc = "MWAIT 0x33",
|
|
|
|
@ -629,7 +629,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 124,
|
|
|
|
|
.target_residency = 800,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C8",
|
|
|
|
|
.desc = "MWAIT 0x40",
|
|
|
|
@ -637,7 +637,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 200,
|
|
|
|
|
.target_residency = 800,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C9",
|
|
|
|
|
.desc = "MWAIT 0x50",
|
|
|
|
@ -645,7 +645,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 480,
|
|
|
|
|
.target_residency = 5000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C10",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -653,7 +653,7 @@ static struct cpuidle_state skl_cstates[] = {
|
|
|
|
|
.exit_latency = 890,
|
|
|
|
|
.target_residency = 5000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -666,7 +666,7 @@ static struct cpuidle_state skx_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -674,7 +674,7 @@ static struct cpuidle_state skx_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -682,7 +682,7 @@ static struct cpuidle_state skx_cstates[] = {
|
|
|
|
|
.exit_latency = 133,
|
|
|
|
|
.target_residency = 600,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -695,7 +695,7 @@ static struct cpuidle_state atom_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C2",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -703,7 +703,7 @@ static struct cpuidle_state atom_cstates[] = {
|
|
|
|
|
.exit_latency = 20,
|
|
|
|
|
.target_residency = 80,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C4",
|
|
|
|
|
.desc = "MWAIT 0x30",
|
|
|
|
@ -711,7 +711,7 @@ static struct cpuidle_state atom_cstates[] = {
|
|
|
|
|
.exit_latency = 100,
|
|
|
|
|
.target_residency = 400,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x52",
|
|
|
|
@ -719,7 +719,7 @@ static struct cpuidle_state atom_cstates[] = {
|
|
|
|
|
.exit_latency = 140,
|
|
|
|
|
.target_residency = 560,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -731,7 +731,7 @@ static struct cpuidle_state tangier_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 4,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C4",
|
|
|
|
|
.desc = "MWAIT 0x30",
|
|
|
|
@ -739,7 +739,7 @@ static struct cpuidle_state tangier_cstates[] = {
|
|
|
|
|
.exit_latency = 100,
|
|
|
|
|
.target_residency = 400,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x52",
|
|
|
|
@ -747,7 +747,7 @@ static struct cpuidle_state tangier_cstates[] = {
|
|
|
|
|
.exit_latency = 140,
|
|
|
|
|
.target_residency = 560,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -755,7 +755,7 @@ static struct cpuidle_state tangier_cstates[] = {
|
|
|
|
|
.exit_latency = 1200,
|
|
|
|
|
.target_residency = 4000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C9",
|
|
|
|
|
.desc = "MWAIT 0x64",
|
|
|
|
@ -763,7 +763,7 @@ static struct cpuidle_state tangier_cstates[] = {
|
|
|
|
|
.exit_latency = 10000,
|
|
|
|
|
.target_residency = 20000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -775,7 +775,7 @@ static struct cpuidle_state avn_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x51",
|
|
|
|
@ -783,7 +783,7 @@ static struct cpuidle_state avn_cstates[] = {
|
|
|
|
|
.exit_latency = 15,
|
|
|
|
|
.target_residency = 45,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -795,7 +795,7 @@ static struct cpuidle_state knl_cstates[] = {
|
|
|
|
|
.exit_latency = 1,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x10",
|
|
|
|
@ -803,7 +803,7 @@ static struct cpuidle_state knl_cstates[] = {
|
|
|
|
|
.exit_latency = 120,
|
|
|
|
|
.target_residency = 500,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -816,7 +816,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -824,7 +824,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -832,7 +832,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 133,
|
|
|
|
|
.target_residency = 133,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C7s",
|
|
|
|
|
.desc = "MWAIT 0x31",
|
|
|
|
@ -840,7 +840,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 155,
|
|
|
|
|
.target_residency = 155,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C8",
|
|
|
|
|
.desc = "MWAIT 0x40",
|
|
|
|
@ -848,7 +848,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 1000,
|
|
|
|
|
.target_residency = 1000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C9",
|
|
|
|
|
.desc = "MWAIT 0x50",
|
|
|
|
@ -856,7 +856,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 2000,
|
|
|
|
|
.target_residency = 2000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C10",
|
|
|
|
|
.desc = "MWAIT 0x60",
|
|
|
|
@ -864,7 +864,7 @@ static struct cpuidle_state bxt_cstates[] = {
|
|
|
|
|
.exit_latency = 10000,
|
|
|
|
|
.target_residency = 10000,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -877,7 +877,7 @@ static struct cpuidle_state dnv_cstates[] = {
|
|
|
|
|
.exit_latency = 2,
|
|
|
|
|
.target_residency = 2,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C1E",
|
|
|
|
|
.desc = "MWAIT 0x01",
|
|
|
|
@ -885,7 +885,7 @@ static struct cpuidle_state dnv_cstates[] = {
|
|
|
|
|
.exit_latency = 10,
|
|
|
|
|
.target_residency = 20,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.name = "C6",
|
|
|
|
|
.desc = "MWAIT 0x20",
|
|
|
|
@ -893,7 +893,7 @@ static struct cpuidle_state dnv_cstates[] = {
|
|
|
|
|
.exit_latency = 50,
|
|
|
|
|
.target_residency = 500,
|
|
|
|
|
.enter = &intel_idle,
|
|
|
|
|
.enter_freeze = intel_idle_freeze, },
|
|
|
|
|
.enter_s2idle = intel_idle_s2idle, },
|
|
|
|
|
{
|
|
|
|
|
.enter = NULL }
|
|
|
|
|
};
|
|
|
|
@ -936,12 +936,12 @@ static __cpuidle int intel_idle(struct cpuidle_device *dev,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* intel_idle_freeze - simplified "enter" callback routine for suspend-to-idle
|
|
|
|
|
* intel_idle_s2idle - simplified "enter" callback routine for suspend-to-idle
|
|
|
|
|
* @dev: cpuidle_device
|
|
|
|
|
* @drv: cpuidle driver
|
|
|
|
|
* @index: state index
|
|
|
|
|
*/
|
|
|
|
|
static void intel_idle_freeze(struct cpuidle_device *dev,
|
|
|
|
|
static void intel_idle_s2idle(struct cpuidle_device *dev,
|
|
|
|
|
struct cpuidle_driver *drv, int index)
|
|
|
|
|
{
|
|
|
|
|
unsigned long ecx = 1; /* break on interrupt flag */
|
|
|
|
@ -1337,7 +1337,7 @@ static void __init intel_idle_cpuidle_driver_init(void)
|
|
|
|
|
int num_substates, mwait_hint, mwait_cstate;
|
|
|
|
|
|
|
|
|
|
if ((cpuidle_state_table[cstate].enter == NULL) &&
|
|
|
|
|
(cpuidle_state_table[cstate].enter_freeze == NULL))
|
|
|
|
|
(cpuidle_state_table[cstate].enter_s2idle == NULL))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
if (cstate + 1 > max_cstate) {
|
|
|
|
|