| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| 2 | /* |
| 3 | * Copyright IBM Corp. 2022, 2024 |
| 4 | * Author(s): Steffen Eiden <seiden@linux.ibm.com> |
| 5 | */ |
| 6 | #ifndef __S390_ASM_UVDEVICE_H |
| 7 | #define __S390_ASM_UVDEVICE_H |
| 8 | |
| 9 | #include <linux/types.h> |
| 10 | |
| 11 | struct uvio_ioctl_cb { |
| 12 | 	__u32 flags; |
| 13 | 	__u16 uv_rc;			/* UV header rc value */ |
| 14 | 	__u16 uv_rrc;			/* UV header rrc value */ |
| 15 | 	__u64 argument_addr;		/* Userspace address of uvio argument */ |
| 16 | 	__u32 argument_len; |
| 17 | 	__u8 reserved14[0x40 - 0x14];	/* must be zero */ |
| 18 | }; |
| 19 | |
| 20 | #define UVIO_ATT_USER_DATA_LEN		0x100 |
| 21 | #define UVIO_ATT_UID_LEN		0x10 |
| 22 | struct uvio_attest { |
| 23 | 	__u64 arcb_addr;				/* 0x0000 */ |
| 24 | 	__u64 meas_addr;				/* 0x0008 */ |
| 25 | 	__u64 add_data_addr;				/* 0x0010 */ |
| 26 | 	__u8 user_data[UVIO_ATT_USER_DATA_LEN];	/* 0x0018 */ |
| 27 | 	__u8 config_uid[UVIO_ATT_UID_LEN];		/* 0x0118 */ |
| 28 | 	__u32 arcb_len;					/* 0x0128 */ |
| 29 | 	__u32 meas_len;					/* 0x012c */ |
| 30 | 	__u32 add_data_len;				/* 0x0130 */ |
| 31 | 	__u16 user_data_len;				/* 0x0134 */ |
| 32 | 	__u16 reserved136;				/* 0x0136 */ |
| 33 | }; |
| 34 | |
| 35 | /** |
| 36 | * uvio_uvdev_info - Information of supported functions |
| 37 | * @supp_uvio_cmds - supported IOCTLs by this device |
| 38 | * @supp_uv_cmds - supported UVCs corresponding to the IOCTL |
| 39 | * |
| 40 | * UVIO request to get information about supported request types by this |
| 41 | * uvdevice and the Ultravisor. Everything is output. Bits are in LSB0 |
| 42 | * ordering. If the bit is set in both, @supp_uvio_cmds and @supp_uv_cmds, the |
| 43 | * uvdevice and the Ultravisor support that call. |
| 44 | * |
| 45 | * Note that bit 0 (UVIO_IOCTL_UVDEV_INFO_NR) is always zero for `supp_uv_cmds` |
| 46 | * as there is no corresponding UV-call. |
| 47 | */ |
| 48 | struct uvio_uvdev_info { |
| 49 | 	/* |
| 50 | 	 * If bit `n` is set, this device supports the IOCTL with nr `n`. |
| 51 | 	 */ |
| 52 | 	__u64 supp_uvio_cmds; |
| 53 | 	/* |
| 54 | 	 * If bit `n` is set, the Ultravisor(UV) supports the UV-call |
| 55 | 	 * corresponding to the IOCTL with nr `n` in the calling context (host |
| 56 | 	 * or guest). The value is only valid if the corresponding bit in |
| 57 | 	 * @supp_uvio_cmds is set as well. |
| 58 | 	 */ |
| 59 | 	__u64 supp_uv_cmds; |
| 60 | }; |
| 61 | |
| 62 | /* |
| 63 | * The following max values define an upper length for the IOCTL in/out buffers. |
| 64 | * However, they do not represent the maximum the Ultravisor allows which is |
| 65 | * often way smaller. By allowing larger buffer sizes we hopefully do not need |
| 66 | * to update the code with every machine update. It is therefore possible for |
| 67 | * userspace to request more memory than actually used by kernel/UV. |
| 68 | */ |
| 69 | #define UVIO_ATT_ARCB_MAX_LEN		0x100000 |
| 70 | #define UVIO_ATT_MEASUREMENT_MAX_LEN	0x8000 |
| 71 | #define UVIO_ATT_ADDITIONAL_MAX_LEN	0x8000 |
| 72 | #define UVIO_ADD_SECRET_MAX_LEN		0x100000 |
| 73 | #define UVIO_LIST_SECRETS_LEN		0x1000 |
| 74 | #define UVIO_RETR_SECRET_MAX_LEN	0x2000 |
| 75 | |
| 76 | #define UVIO_DEVICE_NAME "uv" |
| 77 | #define UVIO_TYPE_UVC 'u' |
| 78 | |
| 79 | enum UVIO_IOCTL_NR { |
| 80 | 	UVIO_IOCTL_UVDEV_INFO_NR = 0x00, |
| 81 | 	UVIO_IOCTL_ATT_NR, |
| 82 | 	UVIO_IOCTL_ADD_SECRET_NR, |
| 83 | 	UVIO_IOCTL_LIST_SECRETS_NR, |
| 84 | 	UVIO_IOCTL_LOCK_SECRETS_NR, |
| 85 | 	UVIO_IOCTL_RETR_SECRET_NR, |
| 86 | 	/* must be the last entry */ |
| 87 | 	UVIO_IOCTL_NUM_IOCTLS |
| 88 | }; |
| 89 | |
| 90 | #define UVIO_IOCTL(nr)			_IOWR(UVIO_TYPE_UVC, nr, struct uvio_ioctl_cb) |
| 91 | #define UVIO_IOCTL_UVDEV_INFO		UVIO_IOCTL(UVIO_IOCTL_UVDEV_INFO_NR) |
| 92 | #define UVIO_IOCTL_ATT			UVIO_IOCTL(UVIO_IOCTL_ATT_NR) |
| 93 | #define UVIO_IOCTL_ADD_SECRET		UVIO_IOCTL(UVIO_IOCTL_ADD_SECRET_NR) |
| 94 | #define UVIO_IOCTL_LIST_SECRETS		UVIO_IOCTL(UVIO_IOCTL_LIST_SECRETS_NR) |
| 95 | #define UVIO_IOCTL_LOCK_SECRETS		UVIO_IOCTL(UVIO_IOCTL_LOCK_SECRETS_NR) |
| 96 | #define UVIO_IOCTL_RETR_SECRET		UVIO_IOCTL(UVIO_IOCTL_RETR_SECRET_NR) |
| 97 | |
| 98 | #define UVIO_SUPP_CALL(nr)		(1ULL << (nr)) |
| 99 | #define UVIO_SUPP_UDEV_INFO		UVIO_SUPP_CALL(UVIO_IOCTL_UDEV_INFO_NR) |
| 100 | #define UVIO_SUPP_ATT			UVIO_SUPP_CALL(UVIO_IOCTL_ATT_NR) |
| 101 | #define UVIO_SUPP_ADD_SECRET		UVIO_SUPP_CALL(UVIO_IOCTL_ADD_SECRET_NR) |
| 102 | #define UVIO_SUPP_LIST_SECRETS		UVIO_SUPP_CALL(UVIO_IOCTL_LIST_SECRETS_NR) |
| 103 | #define UVIO_SUPP_LOCK_SECRETS		UVIO_SUPP_CALL(UVIO_IOCTL_LOCK_SECRETS_NR) |
| 104 | #define UVIO_SUPP_RETR_SECRET		UVIO_SUPP_CALL(UVIO_IOCTL_RETR_SECRET_NR) |
| 105 | |
| 106 | #endif /* __S390_ASM_UVDEVICE_H */ |