mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-01 09:34:10 -04:00
This allows userspace to select various routines to use based on the performance of misaligned access on the target hardware. Rather than adding DT bindings, this change taps into the alternatives mechanism used to probe CPU errata. Add a new function pointer alongside the vendor-specific errata_patch_func() that probes for desirable errata (otherwise known as "features"). Unlike the errata_patch_func(), this function is called on each CPU as it comes up, so it can save feature information per-CPU. The T-head C906 has fast unaligned access, both as defined by GCC [1], and in performing a basic benchmark, which determined that byte copies are >50% slower than a misaligned word copy of the same data size (source for this test at [2]): bytecopy size f000 count 50000 offset 0 took 31664899 us wordcopy size f000 count 50000 offset 0 took 5180919 us wordcopy size f000 count 50000 offset 1 took 13416949 us [1] https://github.com/gcc-mirror/gcc/blob/master/gcc/config/riscv/riscv.cc#L353 [2] https://pastebin.com/EPXvDHSW Co-developed-by: Palmer Dabbelt <palmer@rivosinc.com> Signed-off-by: Evan Green <evan@rivosinc.com> Reviewed-by: Heiko Stuebner <heiko.stuebner@vrull.eu> Tested-by: Heiko Stuebner <heiko.stuebner@vrull.eu> Reviewed-by: Conor Dooley <conor.dooley@microchip.com> Reviewed-by: Paul Walmsley <paul.walmsley@sifive.com> Link: https://lore.kernel.org/r/20230407231103.2622178-5-evan@rivosinc.com Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
38 lines
1.1 KiB
C
38 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
/*
|
|
* Copyright 2023 Rivos, Inc
|
|
*/
|
|
|
|
#ifndef _UAPI_ASM_HWPROBE_H
|
|
#define _UAPI_ASM_HWPROBE_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
/*
|
|
* Interface for probing hardware capabilities from userspace, see
|
|
* Documentation/riscv/hwprobe.rst for more information.
|
|
*/
|
|
struct riscv_hwprobe {
|
|
__s64 key;
|
|
__u64 value;
|
|
};
|
|
|
|
#define RISCV_HWPROBE_KEY_MVENDORID 0
|
|
#define RISCV_HWPROBE_KEY_MARCHID 1
|
|
#define RISCV_HWPROBE_KEY_MIMPID 2
|
|
#define RISCV_HWPROBE_KEY_BASE_BEHAVIOR 3
|
|
#define RISCV_HWPROBE_BASE_BEHAVIOR_IMA (1 << 0)
|
|
#define RISCV_HWPROBE_KEY_IMA_EXT_0 4
|
|
#define RISCV_HWPROBE_IMA_FD (1 << 0)
|
|
#define RISCV_HWPROBE_IMA_C (1 << 1)
|
|
#define RISCV_HWPROBE_KEY_CPUPERF_0 5
|
|
#define RISCV_HWPROBE_MISALIGNED_UNKNOWN (0 << 0)
|
|
#define RISCV_HWPROBE_MISALIGNED_EMULATED (1 << 0)
|
|
#define RISCV_HWPROBE_MISALIGNED_SLOW (2 << 0)
|
|
#define RISCV_HWPROBE_MISALIGNED_FAST (3 << 0)
|
|
#define RISCV_HWPROBE_MISALIGNED_UNSUPPORTED (4 << 0)
|
|
#define RISCV_HWPROBE_MISALIGNED_MASK (7 << 0)
|
|
/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */
|
|
|
|
#endif
|