/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 * Copyright 2023-2024 Rivos, Inc
 */

#ifndef _UAPI_ASM_HWPROBE_H
#define _UAPI_ASM_HWPROBE_H

#include <linux/types.h>
#include <linux/const.h>

/*
 * Interface for probing hardware capabilities from userspace, see
 * Documentation/arch/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	_BITULL(0)
#define RISCV_HWPROBE_KEY_IMA_EXT_0	4
#define		RISCV_HWPROBE_IMA_FD		_BITULL(0)
#define		RISCV_HWPROBE_IMA_C		_BITULL(1)
#define		RISCV_HWPROBE_IMA_V		_BITULL(2)
#define		RISCV_HWPROBE_EXT_ZBA		_BITULL(3)
#define		RISCV_HWPROBE_EXT_ZBB		_BITULL(4)
#define		RISCV_HWPROBE_EXT_ZBS		_BITULL(5)
#define		RISCV_HWPROBE_EXT_ZICBOZ	_BITULL(6)
#define		RISCV_HWPROBE_EXT_ZBC		_BITULL(7)
#define		RISCV_HWPROBE_EXT_ZBKB		_BITULL(8)
#define		RISCV_HWPROBE_EXT_ZBKC		_BITULL(9)
#define		RISCV_HWPROBE_EXT_ZBKX		_BITULL(10)
#define		RISCV_HWPROBE_EXT_ZKND		_BITULL(11)
#define		RISCV_HWPROBE_EXT_ZKNE		_BITULL(12)
#define		RISCV_HWPROBE_EXT_ZKNH		_BITULL(13)
#define		RISCV_HWPROBE_EXT_ZKSED		_BITULL(14)
#define		RISCV_HWPROBE_EXT_ZKSH		_BITULL(15)
#define		RISCV_HWPROBE_EXT_ZKT		_BITULL(16)
#define		RISCV_HWPROBE_EXT_ZVBB		_BITULL(17)
#define		RISCV_HWPROBE_EXT_ZVBC		_BITULL(18)
#define		RISCV_HWPROBE_EXT_ZVKB		_BITULL(19)
#define		RISCV_HWPROBE_EXT_ZVKG		_BITULL(20)
#define		RISCV_HWPROBE_EXT_ZVKNED	_BITULL(21)
#define		RISCV_HWPROBE_EXT_ZVKNHA	_BITULL(22)
#define		RISCV_HWPROBE_EXT_ZVKNHB	_BITULL(23)
#define		RISCV_HWPROBE_EXT_ZVKSED	_BITULL(24)
#define		RISCV_HWPROBE_EXT_ZVKSH		_BITULL(25)
#define		RISCV_HWPROBE_EXT_ZVKT		_BITULL(26)
#define		RISCV_HWPROBE_EXT_ZFH		_BITULL(27)
#define		RISCV_HWPROBE_EXT_ZFHMIN	_BITULL(28)
#define		RISCV_HWPROBE_EXT_ZIHINTNTL	_BITULL(29)
#define		RISCV_HWPROBE_EXT_ZVFH		_BITULL(30)
#define		RISCV_HWPROBE_EXT_ZVFHMIN	_BITULL(31)
#define		RISCV_HWPROBE_EXT_ZFA		_BITULL(32)
#define		RISCV_HWPROBE_EXT_ZTSO		_BITULL(33)
#define		RISCV_HWPROBE_EXT_ZACAS		_BITULL(34)
#define		RISCV_HWPROBE_EXT_ZICOND	_BITULL(35)
#define		RISCV_HWPROBE_EXT_ZIHINTPAUSE	_BITULL(36)
#define		RISCV_HWPROBE_EXT_ZVE32X	_BITULL(37)
#define		RISCV_HWPROBE_EXT_ZVE32F	_BITULL(38)
#define		RISCV_HWPROBE_EXT_ZVE64X	_BITULL(39)
#define		RISCV_HWPROBE_EXT_ZVE64F	_BITULL(40)
#define		RISCV_HWPROBE_EXT_ZVE64D	_BITULL(41)
#define		RISCV_HWPROBE_EXT_ZIMOP		_BITULL(42)
#define		RISCV_HWPROBE_EXT_ZCA		_BITULL(43)
#define		RISCV_HWPROBE_EXT_ZCB		_BITULL(44)
#define		RISCV_HWPROBE_EXT_ZCD		_BITULL(45)
#define		RISCV_HWPROBE_EXT_ZCF		_BITULL(46)
#define		RISCV_HWPROBE_EXT_ZCMOP		_BITULL(47)
#define		RISCV_HWPROBE_EXT_ZAWRS		_BITULL(48)
#define		RISCV_HWPROBE_EXT_SUPM		_BITULL(49)
#define		RISCV_HWPROBE_EXT_ZICNTR	_BITULL(50)
#define		RISCV_HWPROBE_EXT_ZIHPM		_BITULL(51)
#define		RISCV_HWPROBE_EXT_ZFBFMIN	_BITULL(52)
#define		RISCV_HWPROBE_EXT_ZVFBFMIN	_BITULL(53)
#define		RISCV_HWPROBE_EXT_ZVFBFWMA	_BITULL(54)
#define		RISCV_HWPROBE_EXT_ZICBOM	_BITULL(55)
#define		RISCV_HWPROBE_EXT_ZAAMO		_BITULL(56)
#define		RISCV_HWPROBE_EXT_ZALRSC	_BITULL(57)
#define		RISCV_HWPROBE_EXT_ZABHA		_BITULL(58)
#define		RISCV_HWPROBE_EXT_ZALASR	_BITULL(59)
#define		RISCV_HWPROBE_EXT_ZICBOP	_BITULL(60)
#define		RISCV_HWPROBE_EXT_ZILSD		_BITULL(61)
#define		RISCV_HWPROBE_EXT_ZCLSD		_BITULL(62)
#define		RISCV_HWPROBE_EXT_ZICFILP	_BITULL(63)

#define RISCV_HWPROBE_KEY_CPUPERF_0	5
#define		RISCV_HWPROBE_MISALIGNED_UNKNOWN	0
#define		RISCV_HWPROBE_MISALIGNED_EMULATED	1
#define		RISCV_HWPROBE_MISALIGNED_SLOW		2
#define		RISCV_HWPROBE_MISALIGNED_FAST		3
#define		RISCV_HWPROBE_MISALIGNED_UNSUPPORTED	4
#define		RISCV_HWPROBE_MISALIGNED_MASK		7
#define RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE	6
#define RISCV_HWPROBE_KEY_HIGHEST_VIRT_ADDRESS	7
#define RISCV_HWPROBE_KEY_TIME_CSR_FREQ	8
#define RISCV_HWPROBE_KEY_MISALIGNED_SCALAR_PERF	9
#define		RISCV_HWPROBE_MISALIGNED_SCALAR_UNKNOWN		0
#define		RISCV_HWPROBE_MISALIGNED_SCALAR_EMULATED	1
#define		RISCV_HWPROBE_MISALIGNED_SCALAR_SLOW		2
#define		RISCV_HWPROBE_MISALIGNED_SCALAR_FAST		3
#define		RISCV_HWPROBE_MISALIGNED_SCALAR_UNSUPPORTED	4
#define RISCV_HWPROBE_KEY_MISALIGNED_VECTOR_PERF	10
#define		RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN		0
#define		RISCV_HWPROBE_MISALIGNED_VECTOR_SLOW		2
#define		RISCV_HWPROBE_MISALIGNED_VECTOR_FAST		3
#define		RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED	4
#define RISCV_HWPROBE_KEY_VENDOR_EXT_THEAD_0	11
#define RISCV_HWPROBE_KEY_ZICBOM_BLOCK_SIZE	12
#define RISCV_HWPROBE_KEY_VENDOR_EXT_SIFIVE_0	13
#define RISCV_HWPROBE_KEY_VENDOR_EXT_MIPS_0	14
#define RISCV_HWPROBE_KEY_ZICBOP_BLOCK_SIZE	15
#define RISCV_HWPROBE_KEY_IMA_EXT_1		16
#define		RISCV_HWPROBE_EXT_ZICFISS	_BITULL(0)
#define		RISCV_HWPROBE_EXT_ZICCLSM	_BITULL(1)
#define		RISCV_HWPROBE_EXT_ZICCAMOA	_BITULL(2)
#define		RISCV_HWPROBE_EXT_ZICCIF	_BITULL(3)
#define		RISCV_HWPROBE_EXT_ZICCRSE	_BITULL(4)
#define		RISCV_HWPROBE_EXT_ZA64RS	_BITULL(5)

/* Increase RISCV_HWPROBE_MAX_KEY when adding items. */

/* Flags */
#define RISCV_HWPROBE_WHICH_CPUS	_BITUL(0)

#endif