xref: /linux/drivers/crypto/ccp/sev-dev-tio.h (revision 249872f53d64441690927853e9d3af36394802d5)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 #ifndef __PSP_SEV_TIO_H__
3 #define __PSP_SEV_TIO_H__
4 
5 #include <linux/pci-tsm.h>
6 #include <linux/pci-ide.h>
7 #include <linux/tsm.h>
8 #include <uapi/linux/psp-sev.h>
9 
10 struct sla_addr_t {
11 	union {
12 		u64 sla;
13 		struct {
14 			u64 page_type	:1,
15 			    page_size	:1,
16 			    reserved1	:10,
17 			    pfn		:40,
18 			    reserved2	:12;
19 		};
20 	};
21 } __packed;
22 
23 #define SEV_TIO_MAX_COMMAND_LENGTH	128
24 
25 /* SPDM control structure for DOE */
26 struct tsm_spdm {
27 	unsigned long req_len;
28 	void *req;
29 	unsigned long rsp_len;
30 	void *rsp;
31 };
32 
33 /* Describes TIO device */
34 struct tsm_dsm_tio {
35 	u8 cert_slot;
36 	struct sla_addr_t dev_ctx;
37 	struct sla_addr_t req;
38 	struct sla_addr_t resp;
39 	struct sla_addr_t scratch;
40 	struct sla_addr_t output;
41 	size_t output_len;
42 	size_t scratch_len;
43 	struct tsm_spdm spdm;
44 	struct sla_buffer_hdr *reqbuf; /* vmap'ed @req for DOE */
45 	struct sla_buffer_hdr *respbuf; /* vmap'ed @resp for DOE */
46 
47 	int cmd;
48 	int psp_ret;
49 	u8 cmd_data[SEV_TIO_MAX_COMMAND_LENGTH];
50 	void *data_pg; /* Data page for DEV_STATUS/TDI_STATUS/TDI_INFO/ASID_FENCE */
51 
52 #define TIO_IDE_MAX_TC	8
53 	struct pci_ide *ide[TIO_IDE_MAX_TC];
54 };
55 
56 /* Describes TSM structure for PF0 pointed by pci_dev->tsm */
57 struct tio_dsm {
58 	struct pci_tsm_pf0 tsm;
59 	struct tsm_dsm_tio data;
60 	struct sev_device *sev;
61 };
62 
63 /* Data object IDs */
64 #define SPDM_DOBJ_ID_NONE		0
65 #define SPDM_DOBJ_ID_REQ		1
66 #define SPDM_DOBJ_ID_RESP		2
67 
68 struct spdm_dobj_hdr {
69 	u32 id;     /* Data object type identifier */
70 	u32 length; /* Length of the data object, INCLUDING THIS HEADER */
71 	struct { /* Version of the data object structure */
72 		u8 minor;
73 		u8 major;
74 	} version;
75 } __packed;
76 
77 /**
78  * struct sev_tio_status - TIO_STATUS command's info_paddr buffer
79  *
80  * @length: Length of this structure in bytes
81  * @tio_en: Indicates that SNP_INIT_EX initialized the RMP for SEV-TIO
82  * @tio_init_done: Indicates TIO_INIT has been invoked
83  * @spdm_req_size_min: Minimum SPDM request buffer size in bytes
84  * @spdm_req_size_max: Maximum SPDM request buffer size in bytes
85  * @spdm_scratch_size_min: Minimum SPDM scratch buffer size in bytes
86  * @spdm_scratch_size_max: Maximum SPDM scratch buffer size in bytes
87  * @spdm_out_size_min: Minimum SPDM output buffer size in bytes
88  * @spdm_out_size_max: Maximum for the SPDM output buffer size in bytes
89  * @spdm_rsp_size_min: Minimum SPDM response buffer size in bytes
90  * @spdm_rsp_size_max: Maximum SPDM response buffer size in bytes
91  * @devctx_size: Size of a device context buffer in bytes
92  * @tdictx_size: Size of a TDI context buffer in bytes
93  * @tio_crypto_alg: TIO crypto algorithms supported
94  */
95 struct sev_tio_status {
96 	u32 length;
97 	u32 tio_en	  :1,
98 	    tio_init_done :1,
99 	    reserved	  :30;
100 	u32 spdm_req_size_min;
101 	u32 spdm_req_size_max;
102 	u32 spdm_scratch_size_min;
103 	u32 spdm_scratch_size_max;
104 	u32 spdm_out_size_min;
105 	u32 spdm_out_size_max;
106 	u32 spdm_rsp_size_min;
107 	u32 spdm_rsp_size_max;
108 	u32 devctx_size;
109 	u32 tdictx_size;
110 	u32 tio_crypto_alg;
111 	u8 reserved2[12];
112 } __packed;
113 
114 int sev_tio_init_locked(void *tio_status_page);
115 int sev_tio_continue(struct tsm_dsm_tio *dev_data);
116 
117 int sev_tio_dev_create(struct tsm_dsm_tio *dev_data, u16 device_id, u16 root_port_id,
118 		       u8 segment_id);
119 int sev_tio_dev_connect(struct tsm_dsm_tio *dev_data, u8 tc_mask, u8 ids[8], u8 cert_slot);
120 int sev_tio_dev_disconnect(struct tsm_dsm_tio *dev_data, bool force);
121 int sev_tio_dev_reclaim(struct tsm_dsm_tio *dev_data);
122 
123 #endif	/* __PSP_SEV_TIO_H__ */
124