1ea3de9ceSEvan Green.. SPDX-License-Identifier: GPL-2.0
2ea3de9ceSEvan Green
3ea3de9ceSEvan GreenRISC-V Hardware Probing Interface
4ea3de9ceSEvan Green---------------------------------
5ea3de9ceSEvan Green
6ea3de9ceSEvan GreenThe RISC-V hardware probing interface is based around a single syscall, which
7ea3de9ceSEvan Greenis defined in <asm/hwprobe.h>::
8ea3de9ceSEvan Green
9ea3de9ceSEvan Green    struct riscv_hwprobe {
10ea3de9ceSEvan Green        __s64 key;
11ea3de9ceSEvan Green        __u64 value;
12ea3de9ceSEvan Green    };
13ea3de9ceSEvan Green
14ea3de9ceSEvan Green    long sys_riscv_hwprobe(struct riscv_hwprobe *pairs, size_t pair_count,
15ea3de9ceSEvan Green                           size_t cpu_count, cpu_set_t *cpus,
16ea3de9ceSEvan Green                           unsigned int flags);
17ea3de9ceSEvan Green
18ea3de9ceSEvan GreenThe arguments are split into three groups: an array of key-value pairs, a CPU
19ea3de9ceSEvan Greenset, and some flags. The key-value pairs are supplied with a count. Userspace
20ea3de9ceSEvan Greenmust prepopulate the key field for each element, and the kernel will fill in the
21ea3de9ceSEvan Greenvalue if the key is recognized. If a key is unknown to the kernel, its key field
22ea3de9ceSEvan Greenwill be cleared to -1, and its value set to 0. The CPU set is defined by
23ea3de9ceSEvan GreenCPU_SET(3). For value-like keys (eg. vendor/arch/impl), the returned value will
24ea3de9ceSEvan Greenbe only be valid if all CPUs in the given set have the same value. Otherwise -1
25ea3de9ceSEvan Greenwill be returned. For boolean-like keys, the value returned will be a logical
26ea3de9ceSEvan GreenAND of the values for the specified CPUs. Usermode can supply NULL for cpus and
27ea3de9ceSEvan Green0 for cpu_count as a shortcut for all online CPUs. There are currently no flags,
28ea3de9ceSEvan Greenthis value must be zero for future compatibility.
29ea3de9ceSEvan Green
30ea3de9ceSEvan GreenOn success 0 is returned, on failure a negative error code is returned.
31ea3de9ceSEvan Green
32ea3de9ceSEvan GreenThe following keys are defined:
33ea3de9ceSEvan Green
34ea3de9ceSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_MVENDORID`: Contains the value of ``mvendorid``,
35ea3de9ceSEvan Green  as defined by the RISC-V privileged architecture specification.
36ea3de9ceSEvan Green
37ea3de9ceSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_MARCHID`: Contains the value of ``marchid``, as
38ea3de9ceSEvan Green  defined by the RISC-V privileged architecture specification.
39ea3de9ceSEvan Green
40ea3de9ceSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_MIMPLID`: Contains the value of ``mimplid``, as
41ea3de9ceSEvan Green  defined by the RISC-V privileged architecture specification.
4200e76e2cSEvan Green
4300e76e2cSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_BASE_BEHAVIOR`: A bitmask containing the base
4400e76e2cSEvan Green  user-visible behavior that this kernel supports.  The following base user ABIs
4500e76e2cSEvan Green  are defined:
4600e76e2cSEvan Green
4700e76e2cSEvan Green  * :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`: Support for rv32ima or
4800e76e2cSEvan Green    rv64ima, as defined by version 2.2 of the user ISA and version 1.10 of the
4900e76e2cSEvan Green    privileged ISA, with the following known exceptions (more exceptions may be
5000e76e2cSEvan Green    added, but only if it can be demonstrated that the user ABI is not broken):
5100e76e2cSEvan Green
5200e76e2cSEvan Green    * The :fence.i: instruction cannot be directly executed by userspace
5300e76e2cSEvan Green      programs (it may still be executed in userspace via a
5400e76e2cSEvan Green      kernel-controlled mechanism such as the vDSO).
5500e76e2cSEvan Green
5600e76e2cSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_IMA_EXT_0`: A bitmask containing the extensions
5700e76e2cSEvan Green  that are compatible with the :c:macro:`RISCV_HWPROBE_BASE_BEHAVIOR_IMA`:
5800e76e2cSEvan Green  base system behavior.
5900e76e2cSEvan Green
6000e76e2cSEvan Green  * :c:macro:`RISCV_HWPROBE_IMA_FD`: The F and D extensions are supported, as
6100e76e2cSEvan Green    defined by commit cd20cee ("FMIN/FMAX now implement
6200e76e2cSEvan Green    minimumNumber/maximumNumber, not minNum/maxNum") of the RISC-V ISA manual.
6300e76e2cSEvan Green
6400e76e2cSEvan Green  * :c:macro:`RISCV_HWPROBE_IMA_C`: The C extension is supported, as defined
6500e76e2cSEvan Green    by version 2.2 of the RISC-V ISA manual.
66*62a31d6eSEvan Green
67*62a31d6eSEvan Green* :c:macro:`RISCV_HWPROBE_KEY_CPUPERF_0`: A bitmask that contains performance
68*62a31d6eSEvan Green  information about the selected set of processors.
69*62a31d6eSEvan Green
70*62a31d6eSEvan Green  * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNKNOWN`: The performance of misaligned
71*62a31d6eSEvan Green    accesses is unknown.
72*62a31d6eSEvan Green
73*62a31d6eSEvan Green  * :c:macro:`RISCV_HWPROBE_MISALIGNED_EMULATED`: Misaligned accesses are
74*62a31d6eSEvan Green    emulated via software, either in or below the kernel.  These accesses are
75*62a31d6eSEvan Green    always extremely slow.
76*62a31d6eSEvan Green
77*62a31d6eSEvan Green  * :c:macro:`RISCV_HWPROBE_MISALIGNED_SLOW`: Misaligned accesses are supported
78*62a31d6eSEvan Green    in hardware, but are slower than the cooresponding aligned accesses
79*62a31d6eSEvan Green    sequences.
80*62a31d6eSEvan Green
81*62a31d6eSEvan Green  * :c:macro:`RISCV_HWPROBE_MISALIGNED_FAST`: Misaligned accesses are supported
82*62a31d6eSEvan Green    in hardware and are faster than the cooresponding aligned accesses
83*62a31d6eSEvan Green    sequences.
84*62a31d6eSEvan Green
85*62a31d6eSEvan Green  * :c:macro:`RISCV_HWPROBE_MISALIGNED_UNSUPPORTED`: Misaligned accesses are
86*62a31d6eSEvan Green    not supported at all and will generate a misaligned address fault.
87