Unverified Commit 15bd887b authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!12859 intel: backport GNR and SRF intel_idle fix for 6.6

Merge Pull Request from: @jiayingbao 
 
Backport GNR intel_idle support 
Backport GNR and SRF intel_idle fix patch

Test:
intel_idle function can be enabled and disabled on GNR/SRF platform
and C6 status status as expected when BIOS enabled ACPI C2 
 
Link:https://gitee.com/openeuler/kernel/pulls/12859

 

Reviewed-by: default avatarJason Zeng <jason.zeng@intel.com>
Signed-off-by: default avatarZhang Peng <zhangpeng362@huawei.com>
parents 23b32a3b 31aa15c4
Loading
Loading
Loading
Loading
+73 −6
Original line number Diff line number Diff line
@@ -120,6 +120,12 @@ static unsigned int mwait_substates __initdata;
 */
#define CPUIDLE_FLAG_INIT_XSTATE	BIT(17)

/*
 * Ignore the sub-state when matching mwait hints between the ACPI _CST and
 * custom tables.
 */
#define CPUIDLE_FLAG_PARTIAL_HINT_MATCH	BIT(18)

/*
 * MWAIT takes an 8-bit "hint" in EAX "suggesting"
 * the C-state (top nibble) and sub-state (bottom nibble)
@@ -993,6 +999,47 @@ static struct cpuidle_state spr_cstates[] __initdata = {
		.enter = NULL }
};

static struct cpuidle_state gnr_cstates[] __initdata = {
	{
		.name = "C1",
		.desc = "MWAIT 0x00",
		.flags = MWAIT2flg(0x00),
		.exit_latency = 1,
		.target_residency = 1,
		.enter = &intel_idle,
		.enter_s2idle = intel_idle_s2idle, },
	{
		.name = "C1E",
		.desc = "MWAIT 0x01",
		.flags = MWAIT2flg(0x01) | CPUIDLE_FLAG_ALWAYS_ENABLE,
		.exit_latency = 4,
		.target_residency = 4,
		.enter = &intel_idle,
		.enter_s2idle = intel_idle_s2idle, },
	{
		.name = "C6",
		.desc = "MWAIT 0x20",
		.flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED |
					   CPUIDLE_FLAG_INIT_XSTATE |
					   CPUIDLE_FLAG_PARTIAL_HINT_MATCH,
		.exit_latency = 170,
		.target_residency = 650,
		.enter = &intel_idle,
		.enter_s2idle = intel_idle_s2idle, },
	{
		.name = "C6P",
		.desc = "MWAIT 0x21",
		.flags = MWAIT2flg(0x21) | CPUIDLE_FLAG_TLB_FLUSHED |
					   CPUIDLE_FLAG_INIT_XSTATE |
					   CPUIDLE_FLAG_PARTIAL_HINT_MATCH,
		.exit_latency = 210,
		.target_residency = 1000,
		.enter = &intel_idle,
		.enter_s2idle = intel_idle_s2idle, },
	{
		.enter = NULL }
};

static struct cpuidle_state atom_cstates[] __initdata = {
	{
		.name = "C1E",
@@ -1257,7 +1304,8 @@ static struct cpuidle_state srf_cstates[] __initdata = {
	{
		.name = "C6S",
		.desc = "MWAIT 0x22",
		.flags = MWAIT2flg(0x22) | CPUIDLE_FLAG_TLB_FLUSHED,
		.flags = MWAIT2flg(0x22) | CPUIDLE_FLAG_TLB_FLUSHED |
					   CPUIDLE_FLAG_PARTIAL_HINT_MATCH,
		.exit_latency = 270,
		.target_residency = 700,
		.enter = &intel_idle,
@@ -1265,7 +1313,8 @@ static struct cpuidle_state srf_cstates[] __initdata = {
	{
		.name = "C6SP",
		.desc = "MWAIT 0x23",
		.flags = MWAIT2flg(0x23) | CPUIDLE_FLAG_TLB_FLUSHED,
		.flags = MWAIT2flg(0x23) | CPUIDLE_FLAG_TLB_FLUSHED |
					   CPUIDLE_FLAG_PARTIAL_HINT_MATCH,
		.exit_latency = 310,
		.target_residency = 900,
		.enter = &intel_idle,
@@ -1391,6 +1440,12 @@ static const struct idle_cpu idle_cpu_spr __initconst = {
	.use_acpi = true,
};

static const struct idle_cpu idle_cpu_gnr __initconst = {
	.state_table = gnr_cstates,
	.disable_promotion_to_c1e = true,
	.use_acpi = true,
};

static const struct idle_cpu idle_cpu_avn __initconst = {
	.state_table = avn_cstates,
	.disable_promotion_to_c1e = true,
@@ -1464,6 +1519,7 @@ static const struct x86_cpu_id intel_idle_ids[] __initconst = {
	X86_MATCH_INTEL_FAM6_MODEL(ATOM_GRACEMONT,	&idle_cpu_gmt),
	X86_MATCH_INTEL_FAM6_MODEL(SAPPHIRERAPIDS_X,	&idle_cpu_spr),
	X86_MATCH_INTEL_FAM6_MODEL(EMERALDRAPIDS_X,	&idle_cpu_spr),
	X86_MATCH_INTEL_FAM6_MODEL(GRANITERAPIDS_X,	&idle_cpu_gnr),
	X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNL,	&idle_cpu_knl),
	X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNM,	&idle_cpu_knl),
	X86_MATCH_INTEL_FAM6_MODEL(ATOM_GOLDMONT,	&idle_cpu_bxt),
@@ -1622,7 +1678,7 @@ static void __init intel_idle_init_cstates_acpi(struct cpuidle_driver *drv)
	}
}

static bool __init intel_idle_off_by_default(u32 mwait_hint)
static bool __init intel_idle_off_by_default(unsigned int flags, u32 mwait_hint)
{
	int cstate, limit;

@@ -1639,7 +1695,15 @@ static bool __init intel_idle_off_by_default(u32 mwait_hint)
	 * the interesting states are ACPI_CSTATE_FFH.
	 */
	for (cstate = 1; cstate < limit; cstate++) {
		if (acpi_state_table.states[cstate].address == mwait_hint)
		u32 acpi_hint = acpi_state_table.states[cstate].address;
		u32 table_hint = mwait_hint;

		if (flags & CPUIDLE_FLAG_PARTIAL_HINT_MATCH) {
			acpi_hint &= ~MWAIT_SUBSTATE_MASK;
			table_hint &= ~MWAIT_SUBSTATE_MASK;
		}

		if (acpi_hint == table_hint)
			return false;
	}
	return true;
@@ -1649,7 +1713,10 @@ static bool __init intel_idle_off_by_default(u32 mwait_hint)

static inline bool intel_idle_acpi_cst_extract(void) { return false; }
static inline void intel_idle_init_cstates_acpi(struct cpuidle_driver *drv) { }
static inline bool intel_idle_off_by_default(u32 mwait_hint) { return false; }
static inline bool intel_idle_off_by_default(unsigned int flags, u32 mwait_hint)
{
	return false;
}
#endif /* !CONFIG_ACPI_PROCESSOR_CSTATE */

/**
@@ -1973,7 +2040,7 @@ static void __init intel_idle_init_cstates_icpu(struct cpuidle_driver *drv)

		if ((disabled_states_mask & BIT(drv->state_count)) ||
		    ((icpu->use_acpi || force_use_acpi) &&
		     intel_idle_off_by_default(mwait_hint) &&
		     intel_idle_off_by_default(state->flags, mwait_hint) &&
		     !(state->flags & CPUIDLE_FLAG_ALWAYS_ENABLE)))
			state->flags |= CPUIDLE_FLAG_OFF;