mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-09-06 21:14:18 +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;
|
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)
|
static __always_inline bool cpuid_function_is_indexed(u32 function)
|
||||||
{
|
{
|
||||||
switch (function) {
|
switch (function) {
|
||||||
|
Loading…
Reference in New Issue
Block a user