xref: /dpdk/drivers/crypto/ccp/ccp_dev.h (revision 27595cd83053b2d39634a159d6709b3ce3cdf3b0)
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 
131f37cb2bSDavid Marchand #include <bus_pci_driver.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>
2092cb1309SAkhil Goyal #include <cryptodev_pmd.h>
21ef4b04f8SRavi Kumar 
22e849b88fSDavid Marchand /* CCP PCI device identifiers */
23e849b88fSDavid Marchand #define AMD_PCI_VENDOR_ID 0x1022
24e849b88fSDavid Marchand #define AMD_PCI_CCP_5A 0x1456
25e849b88fSDavid Marchand #define AMD_PCI_CCP_5B 0x1468
26e849b88fSDavid Marchand #define AMD_PCI_CCP_RV 0x15df
27e849b88fSDavid Marchand 
287be78d02SJosh Soref /**< CCP specific */
29ef4b04f8SRavi Kumar #define MAX_HW_QUEUES                   5
30585d4037SRavi Kumar #define CCP_MAX_TRNG_RETRIES		10
31d9a9e561SRavi Kumar #define CCP_ALIGN(x, y) ((((x) + (y - 1)) / y) * y)
32ef4b04f8SRavi Kumar 
33ef4b04f8SRavi Kumar /**< CCP Register Mappings */
34ef4b04f8SRavi Kumar #define Q_MASK_REG                      0x000
35ef4b04f8SRavi Kumar #define TRNG_OUT_REG                    0x00c
36ef4b04f8SRavi Kumar 
37ef4b04f8SRavi Kumar /* CCP Version 5 Specifics */
38ef4b04f8SRavi Kumar #define CMD_QUEUE_MASK_OFFSET		0x00
39ef4b04f8SRavi Kumar #define	CMD_QUEUE_PRIO_OFFSET		0x04
40ef4b04f8SRavi Kumar #define CMD_REQID_CONFIG_OFFSET		0x08
41ef4b04f8SRavi Kumar #define	CMD_CMD_TIMEOUT_OFFSET		0x10
42ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_LO_OFFSET	0x18
43ef4b04f8SRavi Kumar #define LSB_PUBLIC_MASK_HI_OFFSET	0x1C
44ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_LO_OFFSET	0x20
45ef4b04f8SRavi Kumar #define LSB_PRIVATE_MASK_HI_OFFSET	0x24
46ef4b04f8SRavi Kumar 
47ef4b04f8SRavi Kumar #define CMD_Q_CONTROL_BASE		0x0000
48ef4b04f8SRavi Kumar #define CMD_Q_TAIL_LO_BASE		0x0004
49ef4b04f8SRavi Kumar #define CMD_Q_HEAD_LO_BASE		0x0008
50ef4b04f8SRavi Kumar #define CMD_Q_INT_ENABLE_BASE		0x000C
51ef4b04f8SRavi Kumar #define CMD_Q_INTERRUPT_STATUS_BASE	0x0010
52ef4b04f8SRavi Kumar 
53ef4b04f8SRavi Kumar #define CMD_Q_STATUS_BASE		0x0100
54ef4b04f8SRavi Kumar #define CMD_Q_INT_STATUS_BASE		0x0104
55ef4b04f8SRavi Kumar 
56ef4b04f8SRavi Kumar #define	CMD_CONFIG_0_OFFSET		0x6000
57ef4b04f8SRavi Kumar #define	CMD_TRNG_CTL_OFFSET		0x6008
58ef4b04f8SRavi Kumar #define	CMD_AES_MASK_OFFSET		0x6010
59ef4b04f8SRavi Kumar #define	CMD_CLK_GATE_CTL_OFFSET		0x603C
60ef4b04f8SRavi Kumar 
61ef4b04f8SRavi Kumar /* Address offset between two virtual queue registers */
62ef4b04f8SRavi Kumar #define CMD_Q_STATUS_INCR		0x1000
63ef4b04f8SRavi Kumar 
64ef4b04f8SRavi Kumar /* Bit masks */
65ef4b04f8SRavi Kumar #define CMD_Q_RUN			0x1
66ef4b04f8SRavi Kumar #define CMD_Q_SIZE			0x1F
67ef4b04f8SRavi Kumar #define CMD_Q_SHIFT			3
6872775857SAmaranath Somalapuram #define COMMANDS_PER_QUEUE		8192
69ef4b04f8SRavi Kumar 
70ef4b04f8SRavi Kumar #define QUEUE_SIZE_VAL                  ((ffs(COMMANDS_PER_QUEUE) - 2) & \
71ef4b04f8SRavi Kumar 					 CMD_Q_SIZE)
72ef4b04f8SRavi Kumar #define Q_DESC_SIZE                     sizeof(struct ccp_desc)
73ef4b04f8SRavi Kumar #define Q_SIZE(n)                       (COMMANDS_PER_QUEUE*(n))
74ef4b04f8SRavi Kumar 
75ef4b04f8SRavi Kumar #define INT_COMPLETION                  0x1
76ef4b04f8SRavi Kumar #define INT_ERROR                       0x2
77ef4b04f8SRavi Kumar #define INT_QUEUE_STOPPED               0x4
78ef4b04f8SRavi Kumar #define ALL_INTERRUPTS                  (INT_COMPLETION| \
79ef4b04f8SRavi Kumar 					 INT_ERROR| \
80ef4b04f8SRavi Kumar 					 INT_QUEUE_STOPPED)
81ef4b04f8SRavi Kumar 
82ef4b04f8SRavi Kumar #define LSB_REGION_WIDTH                5
83ef4b04f8SRavi Kumar #define MAX_LSB_CNT                     8
84ef4b04f8SRavi Kumar 
85ef4b04f8SRavi Kumar #define LSB_SIZE                        16
86ef4b04f8SRavi Kumar #define LSB_ITEM_SIZE                   32
87ef4b04f8SRavi Kumar #define SLSB_MAP_SIZE                   (MAX_LSB_CNT * LSB_SIZE)
88d9a9e561SRavi Kumar #define LSB_ENTRY_NUMBER(LSB_ADDR)      (LSB_ADDR / LSB_ITEM_SIZE)
89ef4b04f8SRavi Kumar 
903c20cf98SRavi Kumar /* General CCP Defines */
913c20cf98SRavi Kumar 
923c20cf98SRavi Kumar #define CCP_SB_BYTES                    32
93d9a9e561SRavi Kumar /* Word 0 */
94d9a9e561SRavi Kumar #define CCP_CMD_DW0(p)		((p)->dw0)
95d9a9e561SRavi Kumar #define CCP_CMD_SOC(p)		(CCP_CMD_DW0(p).soc)
96d9a9e561SRavi Kumar #define CCP_CMD_IOC(p)		(CCP_CMD_DW0(p).ioc)
97d9a9e561SRavi Kumar #define CCP_CMD_INIT(p)	        (CCP_CMD_DW0(p).init)
98d9a9e561SRavi Kumar #define CCP_CMD_EOM(p)		(CCP_CMD_DW0(p).eom)
99d9a9e561SRavi Kumar #define CCP_CMD_FUNCTION(p)	(CCP_CMD_DW0(p).function)
100d9a9e561SRavi Kumar #define CCP_CMD_ENGINE(p)	(CCP_CMD_DW0(p).engine)
101d9a9e561SRavi Kumar #define CCP_CMD_PROT(p)	        (CCP_CMD_DW0(p).prot)
102d9a9e561SRavi Kumar 
103d9a9e561SRavi Kumar /* Word 1 */
104d9a9e561SRavi Kumar #define CCP_CMD_DW1(p)		((p)->length)
105d9a9e561SRavi Kumar #define CCP_CMD_LEN(p)		(CCP_CMD_DW1(p))
106d9a9e561SRavi Kumar 
107d9a9e561SRavi Kumar /* Word 2 */
108d9a9e561SRavi Kumar #define CCP_CMD_DW2(p)		((p)->src_lo)
109d9a9e561SRavi Kumar #define CCP_CMD_SRC_LO(p)	(CCP_CMD_DW2(p))
110d9a9e561SRavi Kumar 
111d9a9e561SRavi Kumar /* Word 3 */
112d9a9e561SRavi Kumar #define CCP_CMD_DW3(p)		((p)->dw3)
113d9a9e561SRavi Kumar #define CCP_CMD_SRC_MEM(p)	((p)->dw3.src_mem)
114d9a9e561SRavi Kumar #define CCP_CMD_SRC_HI(p)	((p)->dw3.src_hi)
115d9a9e561SRavi Kumar #define CCP_CMD_LSB_ID(p)	((p)->dw3.lsb_cxt_id)
116d9a9e561SRavi Kumar #define CCP_CMD_FIX_SRC(p)	((p)->dw3.fixed)
117d9a9e561SRavi Kumar 
118d9a9e561SRavi Kumar /* Words 4/5 */
119d9a9e561SRavi Kumar #define CCP_CMD_DW4(p)		((p)->dw4)
120d9a9e561SRavi Kumar #define CCP_CMD_DST_LO(p)	(CCP_CMD_DW4(p).dst_lo)
121d9a9e561SRavi Kumar #define CCP_CMD_DW5(p)		((p)->dw5.fields.dst_hi)
122d9a9e561SRavi Kumar #define CCP_CMD_DST_HI(p)	(CCP_CMD_DW5(p))
123d9a9e561SRavi Kumar #define CCP_CMD_DST_MEM(p)	((p)->dw5.fields.dst_mem)
124d9a9e561SRavi Kumar #define CCP_CMD_FIX_DST(p)	((p)->dw5.fields.fixed)
125d9a9e561SRavi Kumar #define CCP_CMD_SHA_LO(p)	((p)->dw4.sha_len_lo)
126d9a9e561SRavi Kumar #define CCP_CMD_SHA_HI(p)	((p)->dw5.sha_len_hi)
127d9a9e561SRavi Kumar 
128d9a9e561SRavi Kumar /* Word 6/7 */
129d9a9e561SRavi Kumar #define CCP_CMD_DW6(p)		((p)->key_lo)
130d9a9e561SRavi Kumar #define CCP_CMD_KEY_LO(p)	(CCP_CMD_DW6(p))
131d9a9e561SRavi Kumar #define CCP_CMD_DW7(p)		((p)->dw7)
132d9a9e561SRavi Kumar #define CCP_CMD_KEY_HI(p)	((p)->dw7.key_hi)
133d9a9e561SRavi Kumar #define CCP_CMD_KEY_MEM(p)	((p)->dw7.key_mem)
1343c20cf98SRavi Kumar 
135ef4b04f8SRavi Kumar /* bitmap */
136ef4b04f8SRavi Kumar enum {
137ef4b04f8SRavi Kumar 	BITS_PER_WORD = sizeof(unsigned long) * CHAR_BIT
138ef4b04f8SRavi Kumar };
139ef4b04f8SRavi Kumar 
140ef4b04f8SRavi Kumar #define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
141ef4b04f8SRavi Kumar #define BIT_OFFSET(b)  ((b) % BITS_PER_WORD)
142ef4b04f8SRavi Kumar 
143ef4b04f8SRavi Kumar #define CCP_DIV_ROUND_UP(n, d)  (((n) + (d) - 1) / (d))
144ef4b04f8SRavi Kumar #define CCP_BITMAP_SIZE(nr) \
145ef4b04f8SRavi Kumar 	CCP_DIV_ROUND_UP(nr, CHAR_BIT * sizeof(unsigned long))
146ef4b04f8SRavi Kumar 
147ef4b04f8SRavi Kumar #define CCP_BITMAP_FIRST_WORD_MASK(start) \
148ef4b04f8SRavi Kumar 	(~0UL << ((start) & (BITS_PER_WORD - 1)))
149ef4b04f8SRavi Kumar #define CCP_BITMAP_LAST_WORD_MASK(nbits) \
150ef4b04f8SRavi Kumar 	(~0UL >> (-(nbits) & (BITS_PER_WORD - 1)))
151ef4b04f8SRavi Kumar 
152ef4b04f8SRavi Kumar #define __ccp_round_mask(x, y) ((typeof(x))((y)-1))
153ef4b04f8SRavi Kumar #define ccp_round_down(x, y) ((x) & ~__ccp_round_mask(x, y))
154ef4b04f8SRavi Kumar 
155ef4b04f8SRavi Kumar /** CCP registers Write/Read */
156ef4b04f8SRavi Kumar 
ccp_pci_reg_write(void * base,int offset,uint32_t value)157ef4b04f8SRavi Kumar static inline void ccp_pci_reg_write(void *base, int offset,
158ef4b04f8SRavi Kumar 				     uint32_t value)
159ef4b04f8SRavi Kumar {
160ef4b04f8SRavi Kumar 	volatile void *reg_addr = ((uint8_t *)base + offset);
161ef4b04f8SRavi Kumar 
162ef4b04f8SRavi Kumar 	rte_write32((rte_cpu_to_le_32(value)), reg_addr);
163ef4b04f8SRavi Kumar }
164ef4b04f8SRavi Kumar 
ccp_pci_reg_read(void * base,int offset)165ef4b04f8SRavi Kumar static inline uint32_t ccp_pci_reg_read(void *base, int offset)
166ef4b04f8SRavi Kumar {
167ef4b04f8SRavi Kumar 	volatile void *reg_addr = ((uint8_t *)base + offset);
168ef4b04f8SRavi Kumar 
169ef4b04f8SRavi Kumar 	return rte_le_to_cpu_32(rte_read32(reg_addr));
170ef4b04f8SRavi Kumar }
171ef4b04f8SRavi Kumar 
172ef4b04f8SRavi Kumar #define CCP_READ_REG(hw_addr, reg_offset) \
173ef4b04f8SRavi Kumar 	ccp_pci_reg_read(hw_addr, reg_offset)
174ef4b04f8SRavi Kumar 
175ef4b04f8SRavi Kumar #define CCP_WRITE_REG(hw_addr, reg_offset, value) \
176ef4b04f8SRavi Kumar 	ccp_pci_reg_write(hw_addr, reg_offset, value)
177ef4b04f8SRavi Kumar 
178ef4b04f8SRavi Kumar /**
179ef4b04f8SRavi Kumar  * A structure describing a CCP command queue.
180ef4b04f8SRavi Kumar  */
181*27595cd8STyler Retzlaff struct __rte_cache_aligned ccp_queue {
182ef4b04f8SRavi Kumar 	struct ccp_device *dev;
183ef4b04f8SRavi Kumar 	char memz_name[RTE_MEMZONE_NAMESIZE];
184ef4b04f8SRavi Kumar 
185ef4b04f8SRavi Kumar 	rte_atomic64_t free_slots;
186ef4b04f8SRavi Kumar 	/**< available free slots updated from enq/deq calls */
187ef4b04f8SRavi Kumar 
188ef4b04f8SRavi Kumar 	/* Queue identifier */
189ef4b04f8SRavi Kumar 	uint64_t id;	/**< queue id */
190ef4b04f8SRavi Kumar 	uint64_t qidx;	/**< queue index */
191ef4b04f8SRavi Kumar 	uint64_t qsize;	/**< queue size */
192ef4b04f8SRavi Kumar 
193ef4b04f8SRavi Kumar 	/* Queue address */
194ef4b04f8SRavi Kumar 	struct ccp_desc *qbase_desc;
195ef4b04f8SRavi Kumar 	void *qbase_addr;
196ef4b04f8SRavi Kumar 	phys_addr_t qbase_phys_addr;
197ef4b04f8SRavi Kumar 	/**< queue-page registers addr */
198ef4b04f8SRavi Kumar 	void *reg_base;
199ef4b04f8SRavi Kumar 
200ef4b04f8SRavi Kumar 	uint32_t qcontrol;
201ef4b04f8SRavi Kumar 	/**< queue ctrl reg */
202ef4b04f8SRavi Kumar 
203ef4b04f8SRavi Kumar 	int lsb;
204ef4b04f8SRavi Kumar 	/**< lsb region assigned to queue */
205ef4b04f8SRavi Kumar 	unsigned long lsbmask;
206ef4b04f8SRavi Kumar 	/**< lsb regions queue can access */
207ef4b04f8SRavi Kumar 	unsigned long lsbmap[CCP_BITMAP_SIZE(LSB_SIZE)];
208ef4b04f8SRavi Kumar 	/**< all lsb resources which queue is using */
209ef4b04f8SRavi Kumar 	uint32_t sb_key;
210ef4b04f8SRavi Kumar 	/**< lsb assigned for queue */
211ef4b04f8SRavi Kumar 	uint32_t sb_iv;
212ef4b04f8SRavi Kumar 	/**< lsb assigned for iv */
213ef4b04f8SRavi Kumar 	uint32_t sb_sha;
214ef4b04f8SRavi Kumar 	/**< lsb assigned for sha ctx */
215ef4b04f8SRavi Kumar 	uint32_t sb_hmac;
216ef4b04f8SRavi Kumar 	/**< lsb assigned for hmac ctx */
217*27595cd8STyler Retzlaff };
218ef4b04f8SRavi Kumar 
219ef4b04f8SRavi Kumar /**
220ef4b04f8SRavi Kumar  * A structure describing a CCP device.
221ef4b04f8SRavi Kumar  */
222*27595cd8STyler Retzlaff struct __rte_cache_aligned ccp_device {
223ef4b04f8SRavi Kumar 	TAILQ_ENTRY(ccp_device) next;
224ef4b04f8SRavi Kumar 	int id;
225ef4b04f8SRavi Kumar 	/**< ccp dev id on platform */
226ef4b04f8SRavi Kumar 	struct ccp_queue cmd_q[MAX_HW_QUEUES];
227ef4b04f8SRavi Kumar 	/**< ccp queue */
228ef4b04f8SRavi Kumar 	int cmd_q_count;
229ef4b04f8SRavi Kumar 	/**< no. of ccp Queues */
230e849b88fSDavid Marchand 	struct rte_pci_device *pci;
231e849b88fSDavid Marchand 	/**< ccp pci device */
232ef4b04f8SRavi Kumar 	unsigned long lsbmap[CCP_BITMAP_SIZE(SLSB_MAP_SIZE)];
233ef4b04f8SRavi Kumar 	/**< shared lsb mask of ccp */
234ef4b04f8SRavi Kumar 	rte_spinlock_t lsb_lock;
235ef4b04f8SRavi Kumar 	/**< protection for shared lsb region allocation */
236ef4b04f8SRavi Kumar 	int qidx;
237ef4b04f8SRavi Kumar 	/**< current queue index */
238585d4037SRavi Kumar 	int hwrng_retries;
239585d4037SRavi Kumar 	/**< retry counter for CCP TRNG */
240*27595cd8STyler Retzlaff };
241ef4b04f8SRavi Kumar 
24229610e41SRavi Kumar /**< CCP H/W engine related */
24329610e41SRavi Kumar /**
24429610e41SRavi Kumar  * ccp_engine - CCP operation identifiers
24529610e41SRavi Kumar  *
24629610e41SRavi Kumar  * @CCP_ENGINE_AES: AES operation
24729610e41SRavi Kumar  * @CCP_ENGINE_XTS_AES: 128-bit XTS AES operation
24829610e41SRavi Kumar  * @CCP_ENGINE_3DES: DES/3DES operation
24929610e41SRavi Kumar  * @CCP_ENGINE_SHA: SHA operation
25029610e41SRavi Kumar  * @CCP_ENGINE_RSA: RSA operation
25129610e41SRavi Kumar  * @CCP_ENGINE_PASSTHRU: pass-through operation
25229610e41SRavi Kumar  * @CCP_ENGINE_ZLIB_DECOMPRESS: unused
25329610e41SRavi Kumar  * @CCP_ENGINE_ECC: ECC operation
25429610e41SRavi Kumar  */
25529610e41SRavi Kumar enum ccp_engine {
25629610e41SRavi Kumar 	CCP_ENGINE_AES = 0,
25729610e41SRavi Kumar 	CCP_ENGINE_XTS_AES_128,
25829610e41SRavi Kumar 	CCP_ENGINE_3DES,
25929610e41SRavi Kumar 	CCP_ENGINE_SHA,
26029610e41SRavi Kumar 	CCP_ENGINE_RSA,
26129610e41SRavi Kumar 	CCP_ENGINE_PASSTHRU,
26229610e41SRavi Kumar 	CCP_ENGINE_ZLIB_DECOMPRESS,
26329610e41SRavi Kumar 	CCP_ENGINE_ECC,
26429610e41SRavi Kumar 	CCP_ENGINE__LAST,
26529610e41SRavi Kumar };
26629610e41SRavi Kumar 
26729610e41SRavi Kumar /* Passthru engine */
26829610e41SRavi Kumar /**
26929610e41SRavi Kumar  * ccp_passthru_bitwise - type of bitwise passthru operation
27029610e41SRavi Kumar  *
27129610e41SRavi Kumar  * @CCP_PASSTHRU_BITWISE_NOOP: no bitwise operation performed
27229610e41SRavi Kumar  * @CCP_PASSTHRU_BITWISE_AND: perform bitwise AND of src with mask
27329610e41SRavi Kumar  * @CCP_PASSTHRU_BITWISE_OR: perform bitwise OR of src with mask
27429610e41SRavi Kumar  * @CCP_PASSTHRU_BITWISE_XOR: perform bitwise XOR of src with mask
27529610e41SRavi Kumar  * @CCP_PASSTHRU_BITWISE_MASK: overwrite with mask
27629610e41SRavi Kumar  */
27729610e41SRavi Kumar enum ccp_passthru_bitwise {
27829610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE_NOOP = 0,
27929610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE_AND,
28029610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE_OR,
28129610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE_XOR,
28229610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE_MASK,
28329610e41SRavi Kumar 	CCP_PASSTHRU_BITWISE__LAST,
28429610e41SRavi Kumar };
28529610e41SRavi Kumar 
28629610e41SRavi Kumar /**
28729610e41SRavi Kumar  * ccp_passthru_byteswap - type of byteswap passthru operation
28829610e41SRavi Kumar  *
28929610e41SRavi Kumar  * @CCP_PASSTHRU_BYTESWAP_NOOP: no byte swapping performed
29029610e41SRavi Kumar  * @CCP_PASSTHRU_BYTESWAP_32BIT: swap bytes within 32-bit words
29129610e41SRavi Kumar  * @CCP_PASSTHRU_BYTESWAP_256BIT: swap bytes within 256-bit words
29229610e41SRavi Kumar  */
29329610e41SRavi Kumar enum ccp_passthru_byteswap {
29429610e41SRavi Kumar 	CCP_PASSTHRU_BYTESWAP_NOOP = 0,
29529610e41SRavi Kumar 	CCP_PASSTHRU_BYTESWAP_32BIT,
29629610e41SRavi Kumar 	CCP_PASSTHRU_BYTESWAP_256BIT,
29729610e41SRavi Kumar 	CCP_PASSTHRU_BYTESWAP__LAST,
29829610e41SRavi Kumar };
29929610e41SRavi Kumar 
30029610e41SRavi Kumar /**
30129610e41SRavi Kumar  * CCP passthru
30229610e41SRavi Kumar  */
30329610e41SRavi Kumar struct ccp_passthru {
30429610e41SRavi Kumar 	phys_addr_t src_addr;
30529610e41SRavi Kumar 	phys_addr_t dest_addr;
30629610e41SRavi Kumar 	enum ccp_passthru_bitwise bit_mod;
30729610e41SRavi Kumar 	enum ccp_passthru_byteswap byte_swap;
30829610e41SRavi Kumar 	int len;
30929610e41SRavi Kumar 	int dir;
31029610e41SRavi Kumar };
31129610e41SRavi Kumar 
31229610e41SRavi Kumar /* CCP version 5: Union to define the function field (cmd_reg1/dword0) */
31329610e41SRavi Kumar union ccp_function {
31429610e41SRavi Kumar 	struct {
31529610e41SRavi Kumar 		uint16_t size:7;
31629610e41SRavi Kumar 		uint16_t encrypt:1;
31729610e41SRavi Kumar 		uint16_t mode:5;
31829610e41SRavi Kumar 		uint16_t type:2;
31929610e41SRavi Kumar 	} aes;
32029610e41SRavi Kumar 	struct {
32129610e41SRavi Kumar 		uint16_t size:7;
32229610e41SRavi Kumar 		uint16_t encrypt:1;
32329610e41SRavi Kumar 		uint16_t mode:5;
32429610e41SRavi Kumar 		uint16_t type:2;
32529610e41SRavi Kumar 	} des;
32629610e41SRavi Kumar 	struct {
32729610e41SRavi Kumar 		uint16_t size:7;
32829610e41SRavi Kumar 		uint16_t encrypt:1;
32929610e41SRavi Kumar 		uint16_t rsvd:5;
33029610e41SRavi Kumar 		uint16_t type:2;
33129610e41SRavi Kumar 	} aes_xts;
33229610e41SRavi Kumar 	struct {
33329610e41SRavi Kumar 		uint16_t rsvd1:10;
33429610e41SRavi Kumar 		uint16_t type:4;
33529610e41SRavi Kumar 		uint16_t rsvd2:1;
33629610e41SRavi Kumar 	} sha;
33729610e41SRavi Kumar 	struct {
33829610e41SRavi Kumar 		uint16_t mode:3;
33929610e41SRavi Kumar 		uint16_t size:12;
34029610e41SRavi Kumar 	} rsa;
34129610e41SRavi Kumar 	struct {
34229610e41SRavi Kumar 		uint16_t byteswap:2;
34329610e41SRavi Kumar 		uint16_t bitwise:3;
34429610e41SRavi Kumar 		uint16_t reflect:2;
34529610e41SRavi Kumar 		uint16_t rsvd:8;
34629610e41SRavi Kumar 	} pt;
34729610e41SRavi Kumar 	struct  {
34829610e41SRavi Kumar 		uint16_t rsvd:13;
34929610e41SRavi Kumar 	} zlib;
35029610e41SRavi Kumar 	struct {
35129610e41SRavi Kumar 		uint16_t size:10;
35229610e41SRavi Kumar 		uint16_t type:2;
35329610e41SRavi Kumar 		uint16_t mode:3;
35429610e41SRavi Kumar 	} ecc;
35529610e41SRavi Kumar 	uint16_t raw;
35629610e41SRavi Kumar };
35729610e41SRavi Kumar 
35829610e41SRavi Kumar 
359ef4b04f8SRavi Kumar /**
360ef4b04f8SRavi Kumar  * descriptor for version 5 CPP commands
361ef4b04f8SRavi Kumar  * 8 32-bit words:
362ef4b04f8SRavi Kumar  * word 0: function; engine; control bits
363ef4b04f8SRavi Kumar  * word 1: length of source data
364ef4b04f8SRavi Kumar  * word 2: low 32 bits of source pointer
365ef4b04f8SRavi Kumar  * word 3: upper 16 bits of source pointer; source memory type
366ef4b04f8SRavi Kumar  * word 4: low 32 bits of destination pointer
367ef4b04f8SRavi Kumar  * word 5: upper 16 bits of destination pointer; destination memory
368ef4b04f8SRavi Kumar  * type
369ef4b04f8SRavi Kumar  * word 6: low 32 bits of key pointer
370ef4b04f8SRavi Kumar  * word 7: upper 16 bits of key pointer; key memory type
371ef4b04f8SRavi Kumar  */
372ef4b04f8SRavi Kumar struct dword0 {
373ef4b04f8SRavi Kumar 	uint32_t soc:1;
374ef4b04f8SRavi Kumar 	uint32_t ioc:1;
375ef4b04f8SRavi Kumar 	uint32_t rsvd1:1;
376ef4b04f8SRavi Kumar 	uint32_t init:1;
377ef4b04f8SRavi Kumar 	uint32_t eom:1;
378ef4b04f8SRavi Kumar 	uint32_t function:15;
379ef4b04f8SRavi Kumar 	uint32_t engine:4;
380ef4b04f8SRavi Kumar 	uint32_t prot:1;
381ef4b04f8SRavi Kumar 	uint32_t rsvd2:7;
382ef4b04f8SRavi Kumar };
383ef4b04f8SRavi Kumar 
384ef4b04f8SRavi Kumar struct dword3 {
385ef4b04f8SRavi Kumar 	uint32_t src_hi:16;
386ef4b04f8SRavi Kumar 	uint32_t src_mem:2;
387ef4b04f8SRavi Kumar 	uint32_t lsb_cxt_id:8;
388ef4b04f8SRavi Kumar 	uint32_t rsvd1:5;
389ef4b04f8SRavi Kumar 	uint32_t fixed:1;
390ef4b04f8SRavi Kumar };
391ef4b04f8SRavi Kumar 
392ef4b04f8SRavi Kumar union dword4 {
393ef4b04f8SRavi Kumar 	uint32_t dst_lo;	/* NON-SHA */
394ef4b04f8SRavi Kumar 	uint32_t sha_len_lo;	/* SHA */
395ef4b04f8SRavi Kumar };
396ef4b04f8SRavi Kumar 
397ef4b04f8SRavi Kumar union dword5 {
398ef4b04f8SRavi Kumar 	struct {
399ef4b04f8SRavi Kumar 		uint32_t dst_hi:16;
400ef4b04f8SRavi Kumar 		uint32_t dst_mem:2;
401ef4b04f8SRavi Kumar 		uint32_t rsvd1:13;
402ef4b04f8SRavi Kumar 		uint32_t fixed:1;
403ef4b04f8SRavi Kumar 	}
404ef4b04f8SRavi Kumar 	fields;
405ef4b04f8SRavi Kumar 	uint32_t sha_len_hi;
406ef4b04f8SRavi Kumar };
407ef4b04f8SRavi Kumar 
408ef4b04f8SRavi Kumar struct dword7 {
409ef4b04f8SRavi Kumar 	uint32_t key_hi:16;
410ef4b04f8SRavi Kumar 	uint32_t key_mem:2;
411ef4b04f8SRavi Kumar 	uint32_t rsvd1:14;
412ef4b04f8SRavi Kumar };
413ef4b04f8SRavi Kumar 
414ef4b04f8SRavi Kumar struct ccp_desc {
415ef4b04f8SRavi Kumar 	struct dword0 dw0;
416ef4b04f8SRavi Kumar 	uint32_t length;
417ef4b04f8SRavi Kumar 	uint32_t src_lo;
418ef4b04f8SRavi Kumar 	struct dword3 dw3;
419ef4b04f8SRavi Kumar 	union dword4 dw4;
420ef4b04f8SRavi Kumar 	union dword5 dw5;
421ef4b04f8SRavi Kumar 	uint32_t key_lo;
422ef4b04f8SRavi Kumar 	struct dword7 dw7;
423ef4b04f8SRavi Kumar };
424ef4b04f8SRavi Kumar 
42529610e41SRavi Kumar /**
426d9a9e561SRavi Kumar  * ccp memory type
427d9a9e561SRavi Kumar  */
428d9a9e561SRavi Kumar enum ccp_memtype {
429d9a9e561SRavi Kumar 	CCP_MEMTYPE_SYSTEM = 0,
430d9a9e561SRavi Kumar 	CCP_MEMTYPE_SB,
431d9a9e561SRavi Kumar 	CCP_MEMTYPE_LOCAL,
432d9a9e561SRavi Kumar 	CCP_MEMTYPE_LAST,
433d9a9e561SRavi Kumar };
434d9a9e561SRavi Kumar 
435d9a9e561SRavi Kumar /**
43629610e41SRavi Kumar  * cmd id to follow order
43729610e41SRavi Kumar  */
43829610e41SRavi Kumar enum ccp_cmd_order {
43929610e41SRavi Kumar 	CCP_CMD_CIPHER = 0,
44029610e41SRavi Kumar 	CCP_CMD_AUTH,
44129610e41SRavi Kumar 	CCP_CMD_CIPHER_HASH,
44229610e41SRavi Kumar 	CCP_CMD_HASH_CIPHER,
44329610e41SRavi Kumar 	CCP_CMD_COMBINED,
44429610e41SRavi Kumar 	CCP_CMD_NOT_SUPPORTED,
44529610e41SRavi Kumar };
44629610e41SRavi Kumar 
447ef4b04f8SRavi Kumar static inline uint32_t
low32_value(unsigned long addr)448ef4b04f8SRavi Kumar low32_value(unsigned long addr)
449ef4b04f8SRavi Kumar {
450ef4b04f8SRavi Kumar 	return ((uint64_t)addr) & 0x0ffffffff;
451ef4b04f8SRavi Kumar }
452ef4b04f8SRavi Kumar 
453ef4b04f8SRavi Kumar static inline uint32_t
high32_value(unsigned long addr)454ef4b04f8SRavi Kumar high32_value(unsigned long addr)
455ef4b04f8SRavi Kumar {
456ef4b04f8SRavi Kumar 	return ((uint64_t)addr >> 32) & 0x00000ffff;
457ef4b04f8SRavi Kumar }
458ef4b04f8SRavi Kumar 
4593c20cf98SRavi Kumar /*
4603c20cf98SRavi Kumar  * Start CCP device
4613c20cf98SRavi Kumar  */
4623c20cf98SRavi Kumar int ccp_dev_start(struct rte_cryptodev *dev);
4633c20cf98SRavi Kumar 
464ef4b04f8SRavi Kumar /**
465e849b88fSDavid Marchand  * Initialize one ccp device
466ef4b04f8SRavi Kumar  *
467e849b88fSDavid Marchand  * @dev rte pci device
468e849b88fSDavid Marchand  * @return 0 on success otherwise -1
469ef4b04f8SRavi Kumar  */
470e849b88fSDavid Marchand int ccp_probe_device(struct rte_pci_device *pci_dev);
471ef4b04f8SRavi Kumar 
47270f0f8a8SRavi Kumar /**
47370f0f8a8SRavi Kumar  * allocate a ccp command queue
47470f0f8a8SRavi Kumar  *
47570f0f8a8SRavi Kumar  * @dev rte crypto device
47670f0f8a8SRavi Kumar  * @param slot_req number of required
47770f0f8a8SRavi Kumar  * @return allotted CCP queue on success otherwise NULL
47870f0f8a8SRavi Kumar  */
47970f0f8a8SRavi Kumar struct ccp_queue *ccp_allot_queue(struct rte_cryptodev *dev, int slot_req);
48070f0f8a8SRavi Kumar 
481585d4037SRavi Kumar /**
482585d4037SRavi Kumar  * read hwrng value
483585d4037SRavi Kumar  *
484585d4037SRavi Kumar  * @param trng_value data pointer to write RNG value
485585d4037SRavi Kumar  * @return 0 on success otherwise -1
486585d4037SRavi Kumar  */
487585d4037SRavi Kumar int ccp_read_hwrng(uint32_t *trng_value);
488585d4037SRavi Kumar 
489ef4b04f8SRavi Kumar #endif /* _CCP_DEV_H_ */
490