mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-06 13:09:58 +00:00
x86/cpu: Provide cpuid_read() et al.
Provide a few helper functions to read CPUID leafs or individual registers into a data structure without requiring unions. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Juergen Gross <jgross@suse.com> Tested-by: Sohil Mehta <sohil.mehta@intel.com> Tested-by: Michael Kelley <mhklinux@outlook.com> Tested-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Zhang Rui <rui.zhang@intel.com> Tested-by: Wang Wendy <wendy.wang@intel.com> Tested-by: K Prateek Nayak <kprateek.nayak@amd.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/878r3mg570.ffs@tglx
This commit is contained in:
parent
841c351693
commit
43d86e3cd9
@ -127,6 +127,42 @@ static inline unsigned int cpuid_edx(unsigned int op)
|
||||
return edx;
|
||||
}
|
||||
|
||||
static inline void __cpuid_read(unsigned int leaf, unsigned int subleaf, u32 *regs)
|
||||
{
|
||||
regs[CPUID_EAX] = leaf;
|
||||
regs[CPUID_ECX] = subleaf;
|
||||
__cpuid(regs + CPUID_EAX, regs + CPUID_EBX, regs + CPUID_ECX, regs + CPUID_EDX);
|
||||
}
|
||||
|
||||
#define cpuid_subleaf(leaf, subleaf, regs) { \
|
||||
static_assert(sizeof(*(regs)) == 16); \
|
||||
__cpuid_read(leaf, subleaf, (u32 *)(regs)); \
|
||||
}
|
||||
|
||||
#define cpuid_leaf(leaf, regs) { \
|
||||
static_assert(sizeof(*(regs)) == 16); \
|
||||
__cpuid_read(leaf, 0, (u32 *)(regs)); \
|
||||
}
|
||||
|
||||
static inline void __cpuid_read_reg(unsigned int leaf, unsigned int subleaf,
|
||||
enum cpuid_regs_idx regidx, u32 *reg)
|
||||
{
|
||||
u32 regs[4];
|
||||
|
||||
__cpuid_read(leaf, subleaf, regs);
|
||||
*reg = regs[regidx];
|
||||
}
|
||||
|
||||
#define cpuid_subleaf_reg(leaf, subleaf, regidx, reg) { \
|
||||
static_assert(sizeof(*(reg)) == 4); \
|
||||
__cpuid_read_reg(leaf, subleaf, regidx, (u32 *)(reg)); \
|
||||
}
|
||||
|
||||
#define cpuid_leaf_reg(leaf, regidx, reg) { \
|
||||
static_assert(sizeof(*(reg)) == 4); \
|
||||
__cpuid_read_reg(leaf, 0, regidx, (u32 *)(reg)); \
|
||||
}
|
||||
|
||||
static __always_inline bool cpuid_function_is_indexed(u32 function)
|
||||
{
|
||||
switch (function) {
|
||||
|
Loading…
Reference in New Issue
Block a user