Skip to content

Commit f17b168

Browse files
ChangSeokBaesuryasaimadhu
authored andcommitted
x86/fpu: Add a helper to prepare AMX state for low-power CPU idle
When a CPU enters an idle state, a non-initialized AMX register state may be the cause of preventing a deeper low-power state. Other extended register states whether initialized or not do not impact the CPU idle state. The new helper can ensure the AMX state is initialized before the CPU is idle, and it will be used by the intel idle driver. Check the AMX_TILE feature bit before using XGETBV1 as a chain of dependencies was established via cpuid_deps[]: AMX->XFD->XGETBV1. Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20220608164748.11864-2-chang.seok.bae@intel.com
1 parent ff69927 commit f17b168

3 files changed

Lines changed: 25 additions & 0 deletions

File tree

arch/x86/include/asm/fpu/api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,6 @@ static inline bool fpstate_is_confidential(struct fpu_guest *gfpu)
164164
/* prctl */
165165
extern long fpu_xstate_prctl(int option, unsigned long arg2);
166166

167+
extern void fpu_idle_fpregs(void);
168+
167169
#endif /* _ASM_X86_FPU_API_H */

arch/x86/include/asm/special_insns.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,15 @@ static inline int enqcmds(void __iomem *dst, const void *src)
295295
return 0;
296296
}
297297

298+
static inline void tile_release(void)
299+
{
300+
/*
301+
* Instruction opcode for TILERELEASE; supported in binutils
302+
* version >= 2.36.
303+
*/
304+
asm volatile(".byte 0xc4, 0xe2, 0x78, 0x49, 0xc0");
305+
}
306+
298307
#endif /* __KERNEL__ */
299308

300309
#endif /* _ASM_X86_SPECIAL_INSNS_H */

arch/x86/kernel/fpu/core.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,3 +851,17 @@ int fpu__exception_code(struct fpu *fpu, int trap_nr)
851851
*/
852852
return 0;
853853
}
854+
855+
/*
856+
* Initialize register state that may prevent from entering low-power idle.
857+
* This function will be invoked from the cpuidle driver only when needed.
858+
*/
859+
void fpu_idle_fpregs(void)
860+
{
861+
/* Note: AMX_TILE being enabled implies XGETBV1 support */
862+
if (cpu_feature_enabled(X86_FEATURE_AMX_TILE) &&
863+
(xfeatures_in_use() & XFEATURE_MASK_XTILE)) {
864+
tile_release();
865+
fpregs_deactivate(&current->thread.fpu);
866+
}
867+
}

0 commit comments

Comments
 (0)