xref: /openbmc/linux/arch/s390/include/uapi/asm/uvdevice.h (revision ea9d9716)
14689752cSSteffen Eiden /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
24689752cSSteffen Eiden /*
34689752cSSteffen Eiden  *  Copyright IBM Corp. 2022
44689752cSSteffen Eiden  *  Author(s): Steffen Eiden <seiden@linux.ibm.com>
54689752cSSteffen Eiden  */
64689752cSSteffen Eiden #ifndef __S390_ASM_UVDEVICE_H
74689752cSSteffen Eiden #define __S390_ASM_UVDEVICE_H
84689752cSSteffen Eiden 
94689752cSSteffen Eiden #include <linux/types.h>
104689752cSSteffen Eiden 
114689752cSSteffen Eiden struct uvio_ioctl_cb {
124689752cSSteffen Eiden 	__u32 flags;
134689752cSSteffen Eiden 	__u16 uv_rc;			/* UV header rc value */
144689752cSSteffen Eiden 	__u16 uv_rrc;			/* UV header rrc value */
154689752cSSteffen Eiden 	__u64 argument_addr;		/* Userspace address of uvio argument */
164689752cSSteffen Eiden 	__u32 argument_len;
174689752cSSteffen Eiden 	__u8  reserved14[0x40 - 0x14];	/* must be zero */
184689752cSSteffen Eiden };
194689752cSSteffen Eiden 
204689752cSSteffen Eiden #define UVIO_ATT_USER_DATA_LEN		0x100
214689752cSSteffen Eiden #define UVIO_ATT_UID_LEN		0x10
224689752cSSteffen Eiden struct uvio_attest {
234689752cSSteffen Eiden 	__u64 arcb_addr;				/* 0x0000 */
244689752cSSteffen Eiden 	__u64 meas_addr;				/* 0x0008 */
254689752cSSteffen Eiden 	__u64 add_data_addr;				/* 0x0010 */
264689752cSSteffen Eiden 	__u8  user_data[UVIO_ATT_USER_DATA_LEN];	/* 0x0018 */
274689752cSSteffen Eiden 	__u8  config_uid[UVIO_ATT_UID_LEN];		/* 0x0118 */
284689752cSSteffen Eiden 	__u32 arcb_len;					/* 0x0128 */
294689752cSSteffen Eiden 	__u32 meas_len;					/* 0x012c */
304689752cSSteffen Eiden 	__u32 add_data_len;				/* 0x0130 */
314689752cSSteffen Eiden 	__u16 user_data_len;				/* 0x0134 */
324689752cSSteffen Eiden 	__u16 reserved136;				/* 0x0136 */
334689752cSSteffen Eiden };
344689752cSSteffen Eiden 
35*ea9d9716SSteffen Eiden /**
36*ea9d9716SSteffen Eiden  * uvio_uvdev_info - Information of supported functions
37*ea9d9716SSteffen Eiden  * @supp_uvio_cmds - supported IOCTLs by this device
38*ea9d9716SSteffen Eiden  * @supp_uv_cmds - supported UVCs corresponding to the IOCTL
39*ea9d9716SSteffen Eiden  *
40*ea9d9716SSteffen Eiden  * UVIO request to get information about supported request types by this
41*ea9d9716SSteffen Eiden  * uvdevice and the Ultravisor.  Everything is output. Bits are in LSB0
42*ea9d9716SSteffen Eiden  * ordering.  If the bit is set in both, @supp_uvio_cmds and @supp_uv_cmds, the
43*ea9d9716SSteffen Eiden  * uvdevice and the Ultravisor support that call.
44*ea9d9716SSteffen Eiden  *
45*ea9d9716SSteffen Eiden  * Note that bit 0 (UVIO_IOCTL_UVDEV_INFO_NR) is always zero for `supp_uv_cmds`
46*ea9d9716SSteffen Eiden  * as there is no corresponding UV-call.
47*ea9d9716SSteffen Eiden  */
48*ea9d9716SSteffen Eiden struct uvio_uvdev_info {
49*ea9d9716SSteffen Eiden 	/*
50*ea9d9716SSteffen Eiden 	 * If bit `n` is set, this device supports the IOCTL with nr `n`.
51*ea9d9716SSteffen Eiden 	 */
52*ea9d9716SSteffen Eiden 	__u64 supp_uvio_cmds;
53*ea9d9716SSteffen Eiden 	/*
54*ea9d9716SSteffen Eiden 	 * If bit `n` is set, the Ultravisor(UV) supports the UV-call
55*ea9d9716SSteffen Eiden 	 * corresponding to the IOCTL with nr `n` in the calling contextx (host
56*ea9d9716SSteffen Eiden 	 * or guest).  The value is only valid if the corresponding bit in
57*ea9d9716SSteffen Eiden 	 * @supp_uvio_cmds is set as well.
58*ea9d9716SSteffen Eiden 	 */
59*ea9d9716SSteffen Eiden 	__u64 supp_uv_cmds;
60*ea9d9716SSteffen Eiden };
61*ea9d9716SSteffen Eiden 
624689752cSSteffen Eiden /*
634689752cSSteffen Eiden  * The following max values define an upper length for the IOCTL in/out buffers.
644689752cSSteffen Eiden  * However, they do not represent the maximum the Ultravisor allows which is
654689752cSSteffen Eiden  * often way smaller. By allowing larger buffer sizes we hopefully do not need
664689752cSSteffen Eiden  * to update the code with every machine update. It is therefore possible for
674689752cSSteffen Eiden  * userspace to request more memory than actually used by kernel/UV.
684689752cSSteffen Eiden  */
694689752cSSteffen Eiden #define UVIO_ATT_ARCB_MAX_LEN		0x100000
704689752cSSteffen Eiden #define UVIO_ATT_MEASUREMENT_MAX_LEN	0x8000
714689752cSSteffen Eiden #define UVIO_ATT_ADDITIONAL_MAX_LEN	0x8000
724689752cSSteffen Eiden 
734689752cSSteffen Eiden #define UVIO_DEVICE_NAME "uv"
744689752cSSteffen Eiden #define UVIO_TYPE_UVC 'u'
754689752cSSteffen Eiden 
76*ea9d9716SSteffen Eiden enum UVIO_IOCTL_NR {
77*ea9d9716SSteffen Eiden 	UVIO_IOCTL_UVDEV_INFO_NR = 0x00,
78*ea9d9716SSteffen Eiden 	UVIO_IOCTL_ATT_NR,
79*ea9d9716SSteffen Eiden 	/* must be the last entry */
80*ea9d9716SSteffen Eiden 	UVIO_IOCTL_NUM_IOCTLS
81*ea9d9716SSteffen Eiden };
82*ea9d9716SSteffen Eiden 
83*ea9d9716SSteffen Eiden #define UVIO_IOCTL(nr)		_IOWR(UVIO_TYPE_UVC, nr, struct uvio_ioctl_cb)
84*ea9d9716SSteffen Eiden #define UVIO_IOCTL_UVDEV_INFO	UVIO_IOCTL(UVIO_IOCTL_UVDEV_INFO_NR)
85*ea9d9716SSteffen Eiden #define UVIO_IOCTL_ATT		UVIO_IOCTL(UVIO_IOCTL_ATT_NR)
86*ea9d9716SSteffen Eiden 
87*ea9d9716SSteffen Eiden #define UVIO_SUPP_CALL(nr)	(1ULL << (nr))
88*ea9d9716SSteffen Eiden #define UVIO_SUPP_UDEV_INFO	UVIO_SUPP_CALL(UVIO_IOCTL_UDEV_INFO_NR)
89*ea9d9716SSteffen Eiden #define UVIO_SUPP_ATT		UVIO_SUPP_CALL(UVIO_IOCTL_ATT_NR)
904689752cSSteffen Eiden 
914689752cSSteffen Eiden #endif /* __S390_ASM_UVDEVICE_H */
92