xref: /dpdk/drivers/crypto/ccp/ccp_dev.h (revision 3c20cf98e2c99e6178585299056f3fb6d08467f3)
1ef4b04f8SRavi Kumar /*   SPDX-License-Identifier: BSD-3-Clause
2ef4b04f8SRavi Kumar  *   Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3ef4b04f8SRavi Kumar  */
4ef4b04f8SRavi Kumar 
5ef4b04f8SRavi Kumar #ifndef _CCP_DEV_H_
6ef4b04f8SRavi Kumar #define _CCP_DEV_H_
7ef4b04f8SRavi Kumar 
8ef4b04f8SRavi Kumar #include <limits.h>
9ef4b04f8SRavi Kumar #include <stdbool.h>
10ef4b04f8SRavi Kumar #include <stdint.h>
11ef4b04f8SRavi Kumar #include <string.h>
12ef4b04f8SRavi Kumar 
13ef4b04f8SRavi Kumar #include <rte_bus_pci.h>
14ef4b04f8SRavi Kumar #include <rte_atomic.h>
15ef4b04f8SRavi Kumar #include <rte_byteorder.h>
16ef4b04f8SRavi Kumar #include <rte_io.h>
17ef4b04f8SRavi Kumar #include <rte_pci.h>
18ef4b04f8SRavi Kumar #include <rte_spinlock.h>
19ef4b04f8SRavi Kumar #include <rte_crypto_sym.h>
20ef4b04f8SRavi Kumar #include <rte_cryptodev.h>
21ef4b04f8SRavi Kumar 
22ef4b04f8SRavi Kumar /**< CCP sspecific */
23ef4b04f8SRavi Kumar #define MAX_HW_QUEUES                   5
24ef4b04f8SRavi Kumar 
25ef4b04f8SRavi Kumar /**< CCP Register Mappings */
26ef4b04f8SRavi Kumar #define Q_MASK_REG                      0x000
27ef4b04f8SRavi Kumar #define TRNG_OUT_REG                    0x00c
28ef4b04f8SRavi Kumar 
29ef4b04f8SRavi Kumar /* CCP Version 5 Specifics */
30ef4b04f8SRavi Kumar #define CMD_QUEUE_MASK_OFFSET		0x00
31ef4b04f8SRavi Kumar #define	CMD_QUEUE_PRIO_OFFSET		0x04
32ef4b04f8SRavi Kumar #define CMD_REQID_CONFIG_OFFSET		0x08
33ef4b04f8SRavi Kumar #define	CMD_CMD_TIMEOUT_OFFSET		0x10
34ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_LO_OFFSET	0x18
35ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_HI_OFFSET	0x1C
36ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_LO_OFFSET	0x20
37ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_HI_OFFSET	0x24
38ef4b04f8SRavi Kumar 
39ef4b04f8SRavi Kumar #define CMD_Q_CONTROL_BASE		0x0000
40ef4b04f8SRavi Kumar #define CMD_Q_TAIL_LO_BASE		0x0004
41ef4b04f8SRavi Kumar #define CMD_Q_HEAD_LO_BASE		0x0008
42ef4b04f8SRavi Kumar #define CMD_Q_INT_ENABLE_BASE		0x000C
43ef4b04f8SRavi Kumar #define CMD_Q_INTERRUPT_STATUS_BASE	0x0010
44ef4b04f8SRavi Kumar 
45ef4b04f8SRavi Kumar #define CMD_Q_STATUS_BASE		0x0100
46ef4b04f8SRavi Kumar #define CMD_Q_INT_STATUS_BASE		0x0104
47ef4b04f8SRavi Kumar 
48ef4b04f8SRavi Kumar #define	CMD_CONFIG_0_OFFSET		0x6000
49ef4b04f8SRavi Kumar #define	CMD_TRNG_CTL_OFFSET		0x6008
50ef4b04f8SRavi Kumar #define	CMD_AES_MASK_OFFSET		0x6010
51ef4b04f8SRavi Kumar #define	CMD_CLK_GATE_CTL_OFFSET		0x603C
52ef4b04f8SRavi Kumar 
53ef4b04f8SRavi Kumar /* Address offset between two virtual queue registers */
54ef4b04f8SRavi Kumar #define CMD_Q_STATUS_INCR		0x1000
55ef4b04f8SRavi Kumar 
56ef4b04f8SRavi Kumar /* Bit masks */
57ef4b04f8SRavi Kumar #define CMD_Q_RUN			0x1
58ef4b04f8SRavi Kumar #define CMD_Q_SIZE			0x1F
59ef4b04f8SRavi Kumar #define CMD_Q_SHIFT			3
60ef4b04f8SRavi Kumar #define COMMANDS_PER_QUEUE		2048
61ef4b04f8SRavi Kumar 
62ef4b04f8SRavi Kumar #define QUEUE_SIZE_VAL                  ((ffs(COMMANDS_PER_QUEUE) - 2) & \
63ef4b04f8SRavi Kumar 					 CMD_Q_SIZE)
64ef4b04f8SRavi Kumar #define Q_DESC_SIZE                     sizeof(struct ccp_desc)
65ef4b04f8SRavi Kumar #define Q_SIZE(n)                       (COMMANDS_PER_QUEUE*(n))
66ef4b04f8SRavi Kumar 
67ef4b04f8SRavi Kumar #define INT_COMPLETION                  0x1
68ef4b04f8SRavi Kumar #define INT_ERROR                       0x2
69ef4b04f8SRavi Kumar #define INT_QUEUE_STOPPED               0x4
70ef4b04f8SRavi Kumar #define ALL_INTERRUPTS                  (INT_COMPLETION| \
71ef4b04f8SRavi Kumar 					 INT_ERROR| \
72ef4b04f8SRavi Kumar 					 INT_QUEUE_STOPPED)
73ef4b04f8SRavi Kumar 
74ef4b04f8SRavi Kumar #define LSB_REGION_WIDTH                5
75ef4b04f8SRavi Kumar #define MAX_LSB_CNT                     8
76ef4b04f8SRavi Kumar 
77ef4b04f8SRavi Kumar #define LSB_SIZE                        16
78ef4b04f8SRavi Kumar #define LSB_ITEM_SIZE                   32
79ef4b04f8SRavi Kumar #define SLSB_MAP_SIZE                   (MAX_LSB_CNT * LSB_SIZE)
80ef4b04f8SRavi Kumar 
81*3c20cf98SRavi Kumar /* General CCP Defines */
82*3c20cf98SRavi Kumar 
83*3c20cf98SRavi Kumar #define CCP_SB_BYTES                    32
84*3c20cf98SRavi Kumar 
85ef4b04f8SRavi Kumar /* bitmap */
86ef4b04f8SRavi Kumar enum {
87ef4b04f8SRavi Kumar 	BITS_PER_WORD = sizeof(unsigned long) * CHAR_BIT
88ef4b04f8SRavi Kumar };
89ef4b04f8SRavi Kumar 
90ef4b04f8SRavi Kumar #define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
91ef4b04f8SRavi Kumar #define BIT_OFFSET(b)  ((b) % BITS_PER_WORD)
92ef4b04f8SRavi Kumar 
93ef4b04f8SRavi Kumar #define CCP_DIV_ROUND_UP(n, d)  (((n) + (d) - 1) / (d))
94ef4b04f8SRavi Kumar #define CCP_BITMAP_SIZE(nr) \
95ef4b04f8SRavi Kumar 	CCP_DIV_ROUND_UP(nr, CHAR_BIT * sizeof(unsigned long))
96ef4b04f8SRavi Kumar 
97ef4b04f8SRavi Kumar #define CCP_BITMAP_FIRST_WORD_MASK(start) \
98ef4b04f8SRavi Kumar 	(~0UL << ((start) & (BITS_PER_WORD - 1)))
99ef4b04f8SRavi Kumar #define CCP_BITMAP_LAST_WORD_MASK(nbits) \
100ef4b04f8SRavi Kumar 	(~0UL >> (-(nbits) & (BITS_PER_WORD - 1)))
101ef4b04f8SRavi Kumar 
102ef4b04f8SRavi Kumar #define __ccp_round_mask(x, y) ((typeof(x))((y)-1))
103ef4b04f8SRavi Kumar #define ccp_round_down(x, y) ((x) & ~__ccp_round_mask(x, y))
104ef4b04f8SRavi Kumar 
105ef4b04f8SRavi Kumar /** CCP registers Write/Read */
106ef4b04f8SRavi Kumar 
107ef4b04f8SRavi Kumar static inline void ccp_pci_reg_write(void *base, int offset,
108ef4b04f8SRavi Kumar 				     uint32_t value)
109ef4b04f8SRavi Kumar {
110ef4b04f8SRavi Kumar 	volatile void *reg_addr = ((uint8_t *)base + offset);
111ef4b04f8SRavi Kumar 
112ef4b04f8SRavi Kumar 	rte_write32((rte_cpu_to_le_32(value)), reg_addr);
113ef4b04f8SRavi Kumar }
114ef4b04f8SRavi Kumar 
115ef4b04f8SRavi Kumar static inline uint32_t ccp_pci_reg_read(void *base, int offset)
116ef4b04f8SRavi Kumar {
117ef4b04f8SRavi Kumar 	volatile void *reg_addr = ((uint8_t *)base + offset);
118ef4b04f8SRavi Kumar 
119ef4b04f8SRavi Kumar 	return rte_le_to_cpu_32(rte_read32(reg_addr));
120ef4b04f8SRavi Kumar }
121ef4b04f8SRavi Kumar 
122ef4b04f8SRavi Kumar #define CCP_READ_REG(hw_addr, reg_offset) \
123ef4b04f8SRavi Kumar 	ccp_pci_reg_read(hw_addr, reg_offset)
124ef4b04f8SRavi Kumar 
125ef4b04f8SRavi Kumar #define CCP_WRITE_REG(hw_addr, reg_offset, value) \
126ef4b04f8SRavi Kumar 	ccp_pci_reg_write(hw_addr, reg_offset, value)
127ef4b04f8SRavi Kumar 
128ef4b04f8SRavi Kumar TAILQ_HEAD(ccp_list, ccp_device);
129ef4b04f8SRavi Kumar 
130ef4b04f8SRavi Kumar extern struct ccp_list ccp_list;
131ef4b04f8SRavi Kumar 
132ef4b04f8SRavi Kumar /**
133ef4b04f8SRavi Kumar  * CCP device version
134ef4b04f8SRavi Kumar  */
135ef4b04f8SRavi Kumar enum ccp_device_version {
136ef4b04f8SRavi Kumar 	CCP_VERSION_5A = 0,
137ef4b04f8SRavi Kumar 	CCP_VERSION_5B,
138ef4b04f8SRavi Kumar };
139ef4b04f8SRavi Kumar 
140ef4b04f8SRavi Kumar /**
141ef4b04f8SRavi Kumar  * A structure describing a CCP command queue.
142ef4b04f8SRavi Kumar  */
143ef4b04f8SRavi Kumar struct ccp_queue {
144ef4b04f8SRavi Kumar 	struct ccp_device *dev;
145ef4b04f8SRavi Kumar 	char memz_name[RTE_MEMZONE_NAMESIZE];
146ef4b04f8SRavi Kumar 
147ef4b04f8SRavi Kumar 	rte_atomic64_t free_slots;
148ef4b04f8SRavi Kumar 	/**< available free slots updated from enq/deq calls */
149ef4b04f8SRavi Kumar 
150ef4b04f8SRavi Kumar 	/* Queue identifier */
151ef4b04f8SRavi Kumar 	uint64_t id;	/**< queue id */
152ef4b04f8SRavi Kumar 	uint64_t qidx;	/**< queue index */
153ef4b04f8SRavi Kumar 	uint64_t qsize;	/**< queue size */
154ef4b04f8SRavi Kumar 
155ef4b04f8SRavi Kumar 	/* Queue address */
156ef4b04f8SRavi Kumar 	struct ccp_desc *qbase_desc;
157ef4b04f8SRavi Kumar 	void *qbase_addr;
158ef4b04f8SRavi Kumar 	phys_addr_t qbase_phys_addr;
159ef4b04f8SRavi Kumar 	/**< queue-page registers addr */
160ef4b04f8SRavi Kumar 	void *reg_base;
161ef4b04f8SRavi Kumar 
162ef4b04f8SRavi Kumar 	uint32_t qcontrol;
163ef4b04f8SRavi Kumar 	/**< queue ctrl reg */
164ef4b04f8SRavi Kumar 
165ef4b04f8SRavi Kumar 	int lsb;
166ef4b04f8SRavi Kumar 	/**< lsb region assigned to queue */
167ef4b04f8SRavi Kumar 	unsigned long lsbmask;
168ef4b04f8SRavi Kumar 	/**< lsb regions queue can access */
169ef4b04f8SRavi Kumar 	unsigned long lsbmap[CCP_BITMAP_SIZE(LSB_SIZE)];
170ef4b04f8SRavi Kumar 	/**< all lsb resources which queue is using */
171ef4b04f8SRavi Kumar 	uint32_t sb_key;
172ef4b04f8SRavi Kumar 	/**< lsb assigned for queue */
173ef4b04f8SRavi Kumar 	uint32_t sb_iv;
174ef4b04f8SRavi Kumar 	/**< lsb assigned for iv */
175ef4b04f8SRavi Kumar 	uint32_t sb_sha;
176ef4b04f8SRavi Kumar 	/**< lsb assigned for sha ctx */
177ef4b04f8SRavi Kumar 	uint32_t sb_hmac;
178ef4b04f8SRavi Kumar 	/**< lsb assigned for hmac ctx */
179ef4b04f8SRavi Kumar } ____cacheline_aligned;
180ef4b04f8SRavi Kumar 
181ef4b04f8SRavi Kumar /**
182ef4b04f8SRavi Kumar  * A structure describing a CCP device.
183ef4b04f8SRavi Kumar  */
184ef4b04f8SRavi Kumar struct ccp_device {
185ef4b04f8SRavi Kumar 	TAILQ_ENTRY(ccp_device) next;
186ef4b04f8SRavi Kumar 	int id;
187ef4b04f8SRavi Kumar 	/**< ccp dev id on platform */
188ef4b04f8SRavi Kumar 	struct ccp_queue cmd_q[MAX_HW_QUEUES];
189ef4b04f8SRavi Kumar 	/**< ccp queue */
190ef4b04f8SRavi Kumar 	int cmd_q_count;
191ef4b04f8SRavi Kumar 	/**< no. of ccp Queues */
192ef4b04f8SRavi Kumar 	struct rte_pci_device pci;
193ef4b04f8SRavi Kumar 	/**< ccp pci identifier */
194ef4b04f8SRavi Kumar 	unsigned long lsbmap[CCP_BITMAP_SIZE(SLSB_MAP_SIZE)];
195ef4b04f8SRavi Kumar 	/**< shared lsb mask of ccp */
196ef4b04f8SRavi Kumar 	rte_spinlock_t lsb_lock;
197ef4b04f8SRavi Kumar 	/**< protection for shared lsb region allocation */
198ef4b04f8SRavi Kumar 	int qidx;
199ef4b04f8SRavi Kumar 	/**< current queue index */
200ef4b04f8SRavi Kumar } __rte_cache_aligned;
201ef4b04f8SRavi Kumar 
202ef4b04f8SRavi Kumar /**
203ef4b04f8SRavi Kumar  * descriptor for version 5 CPP commands
204ef4b04f8SRavi Kumar  * 8 32-bit words:
205ef4b04f8SRavi Kumar  * word 0: function; engine; control bits
206ef4b04f8SRavi Kumar  * word 1: length of source data
207ef4b04f8SRavi Kumar  * word 2: low 32 bits of source pointer
208ef4b04f8SRavi Kumar  * word 3: upper 16 bits of source pointer; source memory type
209ef4b04f8SRavi Kumar  * word 4: low 32 bits of destination pointer
210ef4b04f8SRavi Kumar  * word 5: upper 16 bits of destination pointer; destination memory
211ef4b04f8SRavi Kumar  * type
212ef4b04f8SRavi Kumar  * word 6: low 32 bits of key pointer
213ef4b04f8SRavi Kumar  * word 7: upper 16 bits of key pointer; key memory type
214ef4b04f8SRavi Kumar  */
215ef4b04f8SRavi Kumar struct dword0 {
216ef4b04f8SRavi Kumar 	uint32_t soc:1;
217ef4b04f8SRavi Kumar 	uint32_t ioc:1;
218ef4b04f8SRavi Kumar 	uint32_t rsvd1:1;
219ef4b04f8SRavi Kumar 	uint32_t init:1;
220ef4b04f8SRavi Kumar 	uint32_t eom:1;
221ef4b04f8SRavi Kumar 	uint32_t function:15;
222ef4b04f8SRavi Kumar 	uint32_t engine:4;
223ef4b04f8SRavi Kumar 	uint32_t prot:1;
224ef4b04f8SRavi Kumar 	uint32_t rsvd2:7;
225ef4b04f8SRavi Kumar };
226ef4b04f8SRavi Kumar 
227ef4b04f8SRavi Kumar struct dword3 {
228ef4b04f8SRavi Kumar 	uint32_t src_hi:16;
229ef4b04f8SRavi Kumar 	uint32_t src_mem:2;
230ef4b04f8SRavi Kumar 	uint32_t lsb_cxt_id:8;
231ef4b04f8SRavi Kumar 	uint32_t rsvd1:5;
232ef4b04f8SRavi Kumar 	uint32_t fixed:1;
233ef4b04f8SRavi Kumar };
234ef4b04f8SRavi Kumar 
235ef4b04f8SRavi Kumar union dword4 {
236ef4b04f8SRavi Kumar 	uint32_t dst_lo;	/* NON-SHA */
237ef4b04f8SRavi Kumar 	uint32_t sha_len_lo;	/* SHA */
238ef4b04f8SRavi Kumar };
239ef4b04f8SRavi Kumar 
240ef4b04f8SRavi Kumar union dword5 {
241ef4b04f8SRavi Kumar 	struct {
242ef4b04f8SRavi Kumar 		uint32_t dst_hi:16;
243ef4b04f8SRavi Kumar 		uint32_t dst_mem:2;
244ef4b04f8SRavi Kumar 		uint32_t rsvd1:13;
245ef4b04f8SRavi Kumar 		uint32_t fixed:1;
246ef4b04f8SRavi Kumar 	}
247ef4b04f8SRavi Kumar 	fields;
248ef4b04f8SRavi Kumar 	uint32_t sha_len_hi;
249ef4b04f8SRavi Kumar };
250ef4b04f8SRavi Kumar 
251ef4b04f8SRavi Kumar struct dword7 {
252ef4b04f8SRavi Kumar 	uint32_t key_hi:16;
253ef4b04f8SRavi Kumar 	uint32_t key_mem:2;
254ef4b04f8SRavi Kumar 	uint32_t rsvd1:14;
255ef4b04f8SRavi Kumar };
256ef4b04f8SRavi Kumar 
257ef4b04f8SRavi Kumar struct ccp_desc {
258ef4b04f8SRavi Kumar 	struct dword0 dw0;
259ef4b04f8SRavi Kumar 	uint32_t length;
260ef4b04f8SRavi Kumar 	uint32_t src_lo;
261ef4b04f8SRavi Kumar 	struct dword3 dw3;
262ef4b04f8SRavi Kumar 	union dword4 dw4;
263ef4b04f8SRavi Kumar 	union dword5 dw5;
264ef4b04f8SRavi Kumar 	uint32_t key_lo;
265ef4b04f8SRavi Kumar 	struct dword7 dw7;
266ef4b04f8SRavi Kumar };
267ef4b04f8SRavi Kumar 
268ef4b04f8SRavi Kumar static inline uint32_t
269ef4b04f8SRavi Kumar low32_value(unsigned long addr)
270ef4b04f8SRavi Kumar {
271ef4b04f8SRavi Kumar 	return ((uint64_t)addr) & 0x0ffffffff;
272ef4b04f8SRavi Kumar }
273ef4b04f8SRavi Kumar 
274ef4b04f8SRavi Kumar static inline uint32_t
275ef4b04f8SRavi Kumar high32_value(unsigned long addr)
276ef4b04f8SRavi Kumar {
277ef4b04f8SRavi Kumar 	return ((uint64_t)addr >> 32) & 0x00000ffff;
278ef4b04f8SRavi Kumar }
279ef4b04f8SRavi Kumar 
280*3c20cf98SRavi Kumar /*
281*3c20cf98SRavi Kumar  * Start CCP device
282*3c20cf98SRavi Kumar  */
283*3c20cf98SRavi Kumar int ccp_dev_start(struct rte_cryptodev *dev);
284*3c20cf98SRavi Kumar 
285ef4b04f8SRavi Kumar /**
286ef4b04f8SRavi Kumar  * Detect ccp platform and initialize all ccp devices
287ef4b04f8SRavi Kumar  *
288ef4b04f8SRavi Kumar  * @param ccp_id rte_pci_id list for supported CCP devices
289ef4b04f8SRavi Kumar  * @return no. of successfully initialized CCP devices
290ef4b04f8SRavi Kumar  */
291ef4b04f8SRavi Kumar int ccp_probe_devices(const struct rte_pci_id *ccp_id);
292ef4b04f8SRavi Kumar 
293ef4b04f8SRavi Kumar #endif /* _CCP_DEV_H_ */
294