xref: /dpdk/lib/eal/ppc/rte_cpuflags.c (revision 48c33e8ceeaf323976b0d26ee976f43829acfb43)
199a2dd95SBruce Richardson /*
299a2dd95SBruce Richardson  * SPDX-License-Identifier: BSD-3-Clause
399a2dd95SBruce Richardson  * Copyright (C) IBM Corporation 2014.
499a2dd95SBruce Richardson  */
599a2dd95SBruce Richardson 
699a2dd95SBruce Richardson #include "rte_cpuflags.h"
799a2dd95SBruce Richardson 
899a2dd95SBruce Richardson #include <elf.h>
999a2dd95SBruce Richardson #include <fcntl.h>
1099a2dd95SBruce Richardson #include <assert.h>
1199a2dd95SBruce Richardson #include <string.h>
1299a2dd95SBruce Richardson #include <unistd.h>
1399a2dd95SBruce Richardson 
1499a2dd95SBruce Richardson /* Symbolic values for the entries in the auxiliary table */
1599a2dd95SBruce Richardson #define AT_HWCAP  16
1699a2dd95SBruce Richardson #define AT_HWCAP2 26
1799a2dd95SBruce Richardson 
1899a2dd95SBruce Richardson /* software based registers */
1999a2dd95SBruce Richardson enum cpu_register_t {
2099a2dd95SBruce Richardson 	REG_NONE = 0,
2199a2dd95SBruce Richardson 	REG_HWCAP,
2299a2dd95SBruce Richardson 	REG_HWCAP2,
2399a2dd95SBruce Richardson 	REG_MAX
2499a2dd95SBruce Richardson };
2599a2dd95SBruce Richardson 
2699a2dd95SBruce Richardson typedef uint32_t hwcap_registers_t[REG_MAX];
2799a2dd95SBruce Richardson 
2899a2dd95SBruce Richardson struct feature_entry {
2999a2dd95SBruce Richardson 	uint32_t reg;
3099a2dd95SBruce Richardson 	uint32_t bit;
3199a2dd95SBruce Richardson #define CPU_FLAG_NAME_MAX_LEN 64
3299a2dd95SBruce Richardson 	char name[CPU_FLAG_NAME_MAX_LEN];
3399a2dd95SBruce Richardson };
3499a2dd95SBruce Richardson 
3599a2dd95SBruce Richardson #define FEAT_DEF(name, reg, bit) \
3699a2dd95SBruce Richardson 	[RTE_CPUFLAG_##name] = {reg, bit, #name},
3799a2dd95SBruce Richardson 
3899a2dd95SBruce Richardson const struct feature_entry rte_cpu_feature_table[] = {
3999a2dd95SBruce Richardson 	FEAT_DEF(PPC_LE,                 REG_HWCAP,   0)
4099a2dd95SBruce Richardson 	FEAT_DEF(TRUE_LE,                REG_HWCAP,   1)
4199a2dd95SBruce Richardson 	FEAT_DEF(PSERIES_PERFMON_COMPAT, REG_HWCAP,   6)
4299a2dd95SBruce Richardson 	FEAT_DEF(VSX,                    REG_HWCAP,   7)
4399a2dd95SBruce Richardson 	FEAT_DEF(ARCH_2_06,              REG_HWCAP,   8)
4499a2dd95SBruce Richardson 	FEAT_DEF(POWER6_EXT,             REG_HWCAP,   9)
4599a2dd95SBruce Richardson 	FEAT_DEF(DFP,                    REG_HWCAP,  10)
4699a2dd95SBruce Richardson 	FEAT_DEF(PA6T,                   REG_HWCAP,  11)
4799a2dd95SBruce Richardson 	FEAT_DEF(ARCH_2_05,              REG_HWCAP,  12)
4899a2dd95SBruce Richardson 	FEAT_DEF(ICACHE_SNOOP,           REG_HWCAP,  13)
4999a2dd95SBruce Richardson 	FEAT_DEF(SMT,                    REG_HWCAP,  14)
5099a2dd95SBruce Richardson 	FEAT_DEF(BOOKE,                  REG_HWCAP,  15)
5199a2dd95SBruce Richardson 	FEAT_DEF(CELLBE,                 REG_HWCAP,  16)
5299a2dd95SBruce Richardson 	FEAT_DEF(POWER5_PLUS,            REG_HWCAP,  17)
5399a2dd95SBruce Richardson 	FEAT_DEF(POWER5,                 REG_HWCAP,  18)
5499a2dd95SBruce Richardson 	FEAT_DEF(POWER4,                 REG_HWCAP,  19)
5599a2dd95SBruce Richardson 	FEAT_DEF(NOTB,                   REG_HWCAP,  20)
5699a2dd95SBruce Richardson 	FEAT_DEF(EFP_DOUBLE,             REG_HWCAP,  21)
5799a2dd95SBruce Richardson 	FEAT_DEF(EFP_SINGLE,             REG_HWCAP,  22)
5899a2dd95SBruce Richardson 	FEAT_DEF(SPE,                    REG_HWCAP,  23)
5999a2dd95SBruce Richardson 	FEAT_DEF(UNIFIED_CACHE,          REG_HWCAP,  24)
6099a2dd95SBruce Richardson 	FEAT_DEF(4xxMAC,                 REG_HWCAP,  25)
6199a2dd95SBruce Richardson 	FEAT_DEF(MMU,                    REG_HWCAP,  26)
6299a2dd95SBruce Richardson 	FEAT_DEF(FPU,                    REG_HWCAP,  27)
6399a2dd95SBruce Richardson 	FEAT_DEF(ALTIVEC,                REG_HWCAP,  28)
6499a2dd95SBruce Richardson 	FEAT_DEF(PPC601,                 REG_HWCAP,  29)
6599a2dd95SBruce Richardson 	FEAT_DEF(PPC64,                  REG_HWCAP,  30)
6699a2dd95SBruce Richardson 	FEAT_DEF(PPC32,                  REG_HWCAP,  31)
6799a2dd95SBruce Richardson 	FEAT_DEF(TAR,                    REG_HWCAP2, 26)
6899a2dd95SBruce Richardson 	FEAT_DEF(LSEL,                   REG_HWCAP2, 27)
6999a2dd95SBruce Richardson 	FEAT_DEF(EBB,                    REG_HWCAP2, 28)
7099a2dd95SBruce Richardson 	FEAT_DEF(DSCR,                   REG_HWCAP2, 29)
7199a2dd95SBruce Richardson 	FEAT_DEF(HTM,                    REG_HWCAP2, 30)
7299a2dd95SBruce Richardson 	FEAT_DEF(ARCH_2_07,              REG_HWCAP2, 31)
7399a2dd95SBruce Richardson };
7499a2dd95SBruce Richardson 
7599a2dd95SBruce Richardson /*
7699a2dd95SBruce Richardson  * Read AUXV software register and get cpu features for Power
7799a2dd95SBruce Richardson  */
7899a2dd95SBruce Richardson static void
rte_cpu_get_features(hwcap_registers_t out)7999a2dd95SBruce Richardson rte_cpu_get_features(hwcap_registers_t out)
8099a2dd95SBruce Richardson {
8199a2dd95SBruce Richardson 	out[REG_HWCAP] = rte_cpu_getauxval(AT_HWCAP);
8299a2dd95SBruce Richardson 	out[REG_HWCAP2] = rte_cpu_getauxval(AT_HWCAP2);
8399a2dd95SBruce Richardson }
8499a2dd95SBruce Richardson 
8599a2dd95SBruce Richardson /*
8699a2dd95SBruce Richardson  * Checks if a particular flag is available on current machine.
8799a2dd95SBruce Richardson  */
8899a2dd95SBruce Richardson int
rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)8999a2dd95SBruce Richardson rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
9099a2dd95SBruce Richardson {
9199a2dd95SBruce Richardson 	const struct feature_entry *feat;
9299a2dd95SBruce Richardson 	hwcap_registers_t regs = {0};
9399a2dd95SBruce Richardson 
94*48c33e8cSSivaprasad Tummala 	if ((unsigned int)feature >= RTE_DIM(rte_cpu_feature_table))
9599a2dd95SBruce Richardson 		return -ENOENT;
9699a2dd95SBruce Richardson 
9799a2dd95SBruce Richardson 	feat = &rte_cpu_feature_table[feature];
9899a2dd95SBruce Richardson 	if (feat->reg == REG_NONE)
9999a2dd95SBruce Richardson 		return -EFAULT;
10099a2dd95SBruce Richardson 
10199a2dd95SBruce Richardson 	rte_cpu_get_features(regs);
10299a2dd95SBruce Richardson 	return (regs[feat->reg] >> feat->bit) & 1;
10399a2dd95SBruce Richardson }
10499a2dd95SBruce Richardson 
10599a2dd95SBruce Richardson const char *
rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)10699a2dd95SBruce Richardson rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
10799a2dd95SBruce Richardson {
108*48c33e8cSSivaprasad Tummala 	if ((unsigned int)feature >= RTE_DIM(rte_cpu_feature_table))
10999a2dd95SBruce Richardson 		return NULL;
11099a2dd95SBruce Richardson 	return rte_cpu_feature_table[feature].name;
11199a2dd95SBruce Richardson }
11299a2dd95SBruce Richardson 
11399a2dd95SBruce Richardson void
rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics * intrinsics)11499a2dd95SBruce Richardson rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics)
11599a2dd95SBruce Richardson {
11699a2dd95SBruce Richardson 	memset(intrinsics, 0, sizeof(*intrinsics));
11799a2dd95SBruce Richardson }
118