X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fcpu.h;h=a30401ab371df1dbf1ba9296cfb8fe7695e617cd;hb=c3542e17b5dfea27f46f0656e8f1f8092545b796;hp=50d8b61cab304acb7f3d6edef798f8d80928ec37;hpb=0d27e3e7a1d5ddd572718818a56270bac639ea2e;p=vpp.git diff --git a/src/vppinfra/cpu.h b/src/vppinfra/cpu.h index 50d8b61cab3..a30401ab371 100644 --- a/src/vppinfra/cpu.h +++ b/src/vppinfra/cpu.h @@ -24,7 +24,9 @@ _ (hsw, "Intel Haswell") \ _ (trm, "Intel Tremont") \ _ (skx, "Intel Skylake (server) / Cascade Lake") \ - _ (icl, "Intel Ice Lake") + _ (icl, "Intel Ice Lake") \ + _ (adl, "Intel Alder Lake") \ + _ (spr, "Intel Sapphire Rapids") #elif defined(__aarch64__) #define foreach_march_variant \ _ (octeontx2, "Marvell Octeon TX2") \ @@ -84,6 +86,9 @@ clib_march_select_fn_ptr (clib_march_fn_registration * r) #define CLIB_MARCH_FN_POINTER(fn) \ (__typeof__ (fn) *) clib_march_select_fn_ptr (fn##_march_fn_registrations); +#define CLIB_MARCH_FN_VOID_POINTER(fn) \ + clib_march_select_fn_ptr (fn##_march_fn_registrations); + #define _CLIB_MARCH_FN_REGISTRATION(fn) \ static clib_march_fn_registration \ CLIB_MARCH_SFX(fn##_march_fn_registration) = \ @@ -120,6 +125,7 @@ _CLIB_MARCH_FN_REGISTRATION(fn) _ (avx, 1, ecx, 28) \ _ (rdrand, 1, ecx, 30) \ _ (avx2, 7, ebx, 5) \ + _ (bmi2, 7, ebx, 8) \ _ (rtm, 7, ebx, 11) \ _ (pqm, 7, ebx, 12) \ _ (pqe, 7, ebx, 15) \ @@ -134,6 +140,7 @@ _CLIB_MARCH_FN_REGISTRATION(fn) _ (avx512_vpopcntdq, 7, ecx, 14) \ _ (movdiri, 7, ecx, 27) \ _ (movdir64b, 7, ecx, 28) \ + _ (enqcmd, 7, ecx, 29) \ _ (avx512_fp16, 7, edx, 23) \ _ (invariant_tsc, 0x80000007, edx, 8) @@ -162,8 +169,10 @@ _ (asimddp, 20) \ _ (sha512, 21) \ _ (sve, 22) -u32 clib_get_current_cpu_id (); -u32 clib_get_current_numa_node (); +u32 clib_get_current_cpu_id (void); +u32 clib_get_current_numa_node (void); + +typedef int (*clib_cpu_supports_func_t) (void); #if defined(__x86_64__) #include "cpuid.h" @@ -180,8 +189,6 @@ clib_get_cpuid (const u32 lev, u32 * eax, u32 * ebx, u32 * ecx, u32 * edx) return 1; } -typedef int (*clib_cpu_supports_func_t) (); - #define _(flag, func, reg, bit) \ static inline int \ clib_cpu_supports_ ## flag() \ @@ -234,6 +241,14 @@ clib_cpu_supports_aes () #endif } +static inline int +clib_cpu_march_priority_spr () +{ + if (clib_cpu_supports_enqcmd ()) + return 300; + return -1; +} + static inline int clib_cpu_march_priority_icl () { @@ -242,6 +257,14 @@ clib_cpu_march_priority_icl () return -1; } +static inline int +clib_cpu_march_priority_adl () +{ + if (clib_cpu_supports_movdiri () && clib_cpu_supports_avx2 ()) + return 150; + return -1; +} + static inline int clib_cpu_march_priority_skx () { @@ -254,7 +277,7 @@ static inline int clib_cpu_march_priority_trm () { if (clib_cpu_supports_movdiri ()) - return 60; + return 40; return -1; } @@ -266,6 +289,24 @@ clib_cpu_march_priority_hsw () return -1; } +#define X86_CPU_ARCH_PERF_FUNC 0xA + +static inline int +clib_get_pmu_counter_count (u8 *fixed, u8 *general) +{ +#if defined(__x86_64__) + u32 __clib_unused eax = 0, ebx = 0, ecx = 0, edx = 0; + clib_get_cpuid (X86_CPU_ARCH_PERF_FUNC, &eax, &ebx, &ecx, &edx); + + *general = (eax & 0xFF00) >> 8; + *fixed = (edx & 0xF); + + return 1; +#else + return 0; +#endif +} + static inline u32 clib_cpu_implementer () {