hc
2024-08-14 93e8ba98c407598d13d8ade71bc7802acfb19c58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2012 ARM Ltd.
 */
#ifndef __ASM_HWCAP_H
#define __ASM_HWCAP_H
 
#include <uapi/asm/hwcap.h>
#include <asm/cpufeature.h>
 
#define COMPAT_HWCAP_SWP    (1 << 0)
#define COMPAT_HWCAP_HALF    (1 << 1)
#define COMPAT_HWCAP_THUMB    (1 << 2)
#define COMPAT_HWCAP_26BIT    (1 << 3)
#define COMPAT_HWCAP_FAST_MULT    (1 << 4)
#define COMPAT_HWCAP_FPA    (1 << 5)
#define COMPAT_HWCAP_VFP    (1 << 6)
#define COMPAT_HWCAP_EDSP    (1 << 7)
#define COMPAT_HWCAP_JAVA    (1 << 8)
#define COMPAT_HWCAP_IWMMXT    (1 << 9)
#define COMPAT_HWCAP_CRUNCH    (1 << 10)
#define COMPAT_HWCAP_THUMBEE    (1 << 11)
#define COMPAT_HWCAP_NEON    (1 << 12)
#define COMPAT_HWCAP_VFPv3    (1 << 13)
#define COMPAT_HWCAP_VFPV3D16    (1 << 14)
#define COMPAT_HWCAP_TLS    (1 << 15)
#define COMPAT_HWCAP_VFPv4    (1 << 16)
#define COMPAT_HWCAP_IDIVA    (1 << 17)
#define COMPAT_HWCAP_IDIVT    (1 << 18)
#define COMPAT_HWCAP_IDIV    (COMPAT_HWCAP_IDIVA|COMPAT_HWCAP_IDIVT)
#define COMPAT_HWCAP_VFPD32    (1 << 19)
#define COMPAT_HWCAP_LPAE    (1 << 20)
#define COMPAT_HWCAP_EVTSTRM    (1 << 21)
 
#define COMPAT_HWCAP2_AES    (1 << 0)
#define COMPAT_HWCAP2_PMULL    (1 << 1)
#define COMPAT_HWCAP2_SHA1    (1 << 2)
#define COMPAT_HWCAP2_SHA2    (1 << 3)
#define COMPAT_HWCAP2_CRC32    (1 << 4)
 
#ifndef __ASSEMBLY__
#include <linux/log2.h>
 
/*
 * For userspace we represent hwcaps as a collection of HWCAP{,2}_x bitfields
 * as described in uapi/asm/hwcap.h. For the kernel we represent hwcaps as
 * natural numbers (in a single range of size MAX_CPU_FEATURES) defined here
 * with prefix KERNEL_HWCAP_ mapped to their HWCAP{,2}_x counterpart.
 *
 * Hwcaps should be set and tested within the kernel via the
 * cpu_{set,have}_named_feature(feature) where feature is the unique suffix
 * of KERNEL_HWCAP_{feature}.
 */
#define __khwcap_feature(x)        const_ilog2(HWCAP_ ## x)
#define KERNEL_HWCAP_FP            __khwcap_feature(FP)
#define KERNEL_HWCAP_ASIMD        __khwcap_feature(ASIMD)
#define KERNEL_HWCAP_EVTSTRM        __khwcap_feature(EVTSTRM)
#define KERNEL_HWCAP_AES        __khwcap_feature(AES)
#define KERNEL_HWCAP_PMULL        __khwcap_feature(PMULL)
#define KERNEL_HWCAP_SHA1        __khwcap_feature(SHA1)
#define KERNEL_HWCAP_SHA2        __khwcap_feature(SHA2)
#define KERNEL_HWCAP_CRC32        __khwcap_feature(CRC32)
#define KERNEL_HWCAP_ATOMICS        __khwcap_feature(ATOMICS)
#define KERNEL_HWCAP_FPHP        __khwcap_feature(FPHP)
#define KERNEL_HWCAP_ASIMDHP        __khwcap_feature(ASIMDHP)
#define KERNEL_HWCAP_CPUID        __khwcap_feature(CPUID)
#define KERNEL_HWCAP_ASIMDRDM        __khwcap_feature(ASIMDRDM)
#define KERNEL_HWCAP_JSCVT        __khwcap_feature(JSCVT)
#define KERNEL_HWCAP_FCMA        __khwcap_feature(FCMA)
#define KERNEL_HWCAP_LRCPC        __khwcap_feature(LRCPC)
#define KERNEL_HWCAP_DCPOP        __khwcap_feature(DCPOP)
#define KERNEL_HWCAP_SHA3        __khwcap_feature(SHA3)
#define KERNEL_HWCAP_SM3        __khwcap_feature(SM3)
#define KERNEL_HWCAP_SM4        __khwcap_feature(SM4)
#define KERNEL_HWCAP_ASIMDDP        __khwcap_feature(ASIMDDP)
#define KERNEL_HWCAP_SHA512        __khwcap_feature(SHA512)
#define KERNEL_HWCAP_SVE        __khwcap_feature(SVE)
#define KERNEL_HWCAP_ASIMDFHM        __khwcap_feature(ASIMDFHM)
#define KERNEL_HWCAP_DIT        __khwcap_feature(DIT)
#define KERNEL_HWCAP_USCAT        __khwcap_feature(USCAT)
#define KERNEL_HWCAP_ILRCPC        __khwcap_feature(ILRCPC)
#define KERNEL_HWCAP_FLAGM        __khwcap_feature(FLAGM)
#define KERNEL_HWCAP_SSBS        __khwcap_feature(SSBS)
#define KERNEL_HWCAP_SB            __khwcap_feature(SB)
#define KERNEL_HWCAP_PACA        __khwcap_feature(PACA)
#define KERNEL_HWCAP_PACG        __khwcap_feature(PACG)
 
#define __khwcap2_feature(x)        (const_ilog2(HWCAP2_ ## x) + 32)
#define KERNEL_HWCAP_DCPODP        __khwcap2_feature(DCPODP)
#define KERNEL_HWCAP_SVE2        __khwcap2_feature(SVE2)
#define KERNEL_HWCAP_SVEAES        __khwcap2_feature(SVEAES)
#define KERNEL_HWCAP_SVEPMULL        __khwcap2_feature(SVEPMULL)
#define KERNEL_HWCAP_SVEBITPERM        __khwcap2_feature(SVEBITPERM)
#define KERNEL_HWCAP_SVESHA3        __khwcap2_feature(SVESHA3)
#define KERNEL_HWCAP_SVESM4        __khwcap2_feature(SVESM4)
#define KERNEL_HWCAP_FLAGM2        __khwcap2_feature(FLAGM2)
#define KERNEL_HWCAP_FRINT        __khwcap2_feature(FRINT)
#define KERNEL_HWCAP_SVEI8MM        __khwcap2_feature(SVEI8MM)
#define KERNEL_HWCAP_SVEF32MM        __khwcap2_feature(SVEF32MM)
#define KERNEL_HWCAP_SVEF64MM        __khwcap2_feature(SVEF64MM)
#define KERNEL_HWCAP_SVEBF16        __khwcap2_feature(SVEBF16)
#define KERNEL_HWCAP_I8MM        __khwcap2_feature(I8MM)
#define KERNEL_HWCAP_BF16        __khwcap2_feature(BF16)
#define KERNEL_HWCAP_DGH        __khwcap2_feature(DGH)
#define KERNEL_HWCAP_RNG        __khwcap2_feature(RNG)
#define KERNEL_HWCAP_BTI        __khwcap2_feature(BTI)
#define KERNEL_HWCAP_MTE        __khwcap2_feature(MTE)
#define KERNEL_HWCAP_ECV        __khwcap2_feature(ECV)
#define KERNEL_HWCAP_AFP        __khwcap2_feature(AFP)
#define KERNEL_HWCAP_RPRES        __khwcap2_feature(RPRES)
 
/*
 * This yields a mask that user programs can use to figure out what
 * instruction set this cpu supports.
 */
#define ELF_HWCAP        cpu_get_elf_hwcap()
#define ELF_HWCAP2        cpu_get_elf_hwcap2()
 
#ifdef CONFIG_COMPAT
#define COMPAT_ELF_HWCAP    (compat_elf_hwcap)
#define COMPAT_ELF_HWCAP2    (compat_elf_hwcap2)
extern unsigned int compat_elf_hwcap, compat_elf_hwcap2;
#endif
 
enum {
   CAP_HWCAP = 1,
#ifdef CONFIG_COMPAT
   CAP_COMPAT_HWCAP,
   CAP_COMPAT_HWCAP2,
#endif
};
 
#endif
#endif