1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2018 Advanced Micro Devices, Inc. All rights reserved.
3d30ea906Sjfb8856606 */
4d30ea906Sjfb8856606
5d30ea906Sjfb8856606 #ifndef _CCP_DEV_H_
6d30ea906Sjfb8856606 #define _CCP_DEV_H_
7d30ea906Sjfb8856606
8d30ea906Sjfb8856606 #include <limits.h>
9d30ea906Sjfb8856606 #include <stdbool.h>
10d30ea906Sjfb8856606 #include <stdint.h>
11d30ea906Sjfb8856606 #include <string.h>
12d30ea906Sjfb8856606
13d30ea906Sjfb8856606 #include <rte_bus_pci.h>
14d30ea906Sjfb8856606 #include <rte_atomic.h>
15d30ea906Sjfb8856606 #include <rte_byteorder.h>
16d30ea906Sjfb8856606 #include <rte_io.h>
17d30ea906Sjfb8856606 #include <rte_pci.h>
18d30ea906Sjfb8856606 #include <rte_spinlock.h>
19d30ea906Sjfb8856606 #include <rte_crypto_sym.h>
20d30ea906Sjfb8856606 #include <rte_cryptodev.h>
21d30ea906Sjfb8856606
22d30ea906Sjfb8856606 /**< CCP sspecific */
23d30ea906Sjfb8856606 #define MAX_HW_QUEUES 5
24d30ea906Sjfb8856606 #define CCP_MAX_TRNG_RETRIES 10
25d30ea906Sjfb8856606 #define CCP_ALIGN(x, y) ((((x) + (y - 1)) / y) * y)
26d30ea906Sjfb8856606
27d30ea906Sjfb8856606 /**< CCP Register Mappings */
28d30ea906Sjfb8856606 #define Q_MASK_REG 0x000
29d30ea906Sjfb8856606 #define TRNG_OUT_REG 0x00c
30d30ea906Sjfb8856606
31d30ea906Sjfb8856606 /* CCP Version 5 Specifics */
32d30ea906Sjfb8856606 #define CMD_QUEUE_MASK_OFFSET 0x00
33d30ea906Sjfb8856606 #define CMD_QUEUE_PRIO_OFFSET 0x04
34d30ea906Sjfb8856606 #define CMD_REQID_CONFIG_OFFSET 0x08
35d30ea906Sjfb8856606 #define CMD_CMD_TIMEOUT_OFFSET 0x10
36d30ea906Sjfb8856606 #define LSB_PUBLIC_MASK_LO_OFFSET 0x18
37d30ea906Sjfb8856606 #define LSB_PUBLIC_MASK_HI_OFFSET 0x1C
38d30ea906Sjfb8856606 #define LSB_PRIVATE_MASK_LO_OFFSET 0x20
39d30ea906Sjfb8856606 #define LSB_PRIVATE_MASK_HI_OFFSET 0x24
40d30ea906Sjfb8856606
41d30ea906Sjfb8856606 #define CMD_Q_CONTROL_BASE 0x0000
42d30ea906Sjfb8856606 #define CMD_Q_TAIL_LO_BASE 0x0004
43d30ea906Sjfb8856606 #define CMD_Q_HEAD_LO_BASE 0x0008
44d30ea906Sjfb8856606 #define CMD_Q_INT_ENABLE_BASE 0x000C
45d30ea906Sjfb8856606 #define CMD_Q_INTERRUPT_STATUS_BASE 0x0010
46d30ea906Sjfb8856606
47d30ea906Sjfb8856606 #define CMD_Q_STATUS_BASE 0x0100
48d30ea906Sjfb8856606 #define CMD_Q_INT_STATUS_BASE 0x0104
49d30ea906Sjfb8856606
50d30ea906Sjfb8856606 #define CMD_CONFIG_0_OFFSET 0x6000
51d30ea906Sjfb8856606 #define CMD_TRNG_CTL_OFFSET 0x6008
52d30ea906Sjfb8856606 #define CMD_AES_MASK_OFFSET 0x6010
53d30ea906Sjfb8856606 #define CMD_CLK_GATE_CTL_OFFSET 0x603C
54d30ea906Sjfb8856606
55d30ea906Sjfb8856606 /* Address offset between two virtual queue registers */
56d30ea906Sjfb8856606 #define CMD_Q_STATUS_INCR 0x1000
57d30ea906Sjfb8856606
58d30ea906Sjfb8856606 /* Bit masks */
59d30ea906Sjfb8856606 #define CMD_Q_RUN 0x1
60d30ea906Sjfb8856606 #define CMD_Q_SIZE 0x1F
61d30ea906Sjfb8856606 #define CMD_Q_SHIFT 3
62*4418919fSjohnjiang #define COMMANDS_PER_QUEUE 8192
63d30ea906Sjfb8856606
64d30ea906Sjfb8856606 #define QUEUE_SIZE_VAL ((ffs(COMMANDS_PER_QUEUE) - 2) & \
65d30ea906Sjfb8856606 CMD_Q_SIZE)
66d30ea906Sjfb8856606 #define Q_DESC_SIZE sizeof(struct ccp_desc)
67d30ea906Sjfb8856606 #define Q_SIZE(n) (COMMANDS_PER_QUEUE*(n))
68d30ea906Sjfb8856606
69d30ea906Sjfb8856606 #define INT_COMPLETION 0x1
70d30ea906Sjfb8856606 #define INT_ERROR 0x2
71d30ea906Sjfb8856606 #define INT_QUEUE_STOPPED 0x4
72d30ea906Sjfb8856606 #define ALL_INTERRUPTS (INT_COMPLETION| \
73d30ea906Sjfb8856606 INT_ERROR| \
74d30ea906Sjfb8856606 INT_QUEUE_STOPPED)
75d30ea906Sjfb8856606
76d30ea906Sjfb8856606 #define LSB_REGION_WIDTH 5
77d30ea906Sjfb8856606 #define MAX_LSB_CNT 8
78d30ea906Sjfb8856606
79d30ea906Sjfb8856606 #define LSB_SIZE 16
80d30ea906Sjfb8856606 #define LSB_ITEM_SIZE 32
81d30ea906Sjfb8856606 #define SLSB_MAP_SIZE (MAX_LSB_CNT * LSB_SIZE)
82d30ea906Sjfb8856606 #define LSB_ENTRY_NUMBER(LSB_ADDR) (LSB_ADDR / LSB_ITEM_SIZE)
83d30ea906Sjfb8856606
84d30ea906Sjfb8856606 /* General CCP Defines */
85d30ea906Sjfb8856606
86d30ea906Sjfb8856606 #define CCP_SB_BYTES 32
87d30ea906Sjfb8856606 /* Word 0 */
88d30ea906Sjfb8856606 #define CCP_CMD_DW0(p) ((p)->dw0)
89d30ea906Sjfb8856606 #define CCP_CMD_SOC(p) (CCP_CMD_DW0(p).soc)
90d30ea906Sjfb8856606 #define CCP_CMD_IOC(p) (CCP_CMD_DW0(p).ioc)
91d30ea906Sjfb8856606 #define CCP_CMD_INIT(p) (CCP_CMD_DW0(p).init)
92d30ea906Sjfb8856606 #define CCP_CMD_EOM(p) (CCP_CMD_DW0(p).eom)
93d30ea906Sjfb8856606 #define CCP_CMD_FUNCTION(p) (CCP_CMD_DW0(p).function)
94d30ea906Sjfb8856606 #define CCP_CMD_ENGINE(p) (CCP_CMD_DW0(p).engine)
95d30ea906Sjfb8856606 #define CCP_CMD_PROT(p) (CCP_CMD_DW0(p).prot)
96d30ea906Sjfb8856606
97d30ea906Sjfb8856606 /* Word 1 */
98d30ea906Sjfb8856606 #define CCP_CMD_DW1(p) ((p)->length)
99d30ea906Sjfb8856606 #define CCP_CMD_LEN(p) (CCP_CMD_DW1(p))
100d30ea906Sjfb8856606
101d30ea906Sjfb8856606 /* Word 2 */
102d30ea906Sjfb8856606 #define CCP_CMD_DW2(p) ((p)->src_lo)
103d30ea906Sjfb8856606 #define CCP_CMD_SRC_LO(p) (CCP_CMD_DW2(p))
104d30ea906Sjfb8856606
105d30ea906Sjfb8856606 /* Word 3 */
106d30ea906Sjfb8856606 #define CCP_CMD_DW3(p) ((p)->dw3)
107d30ea906Sjfb8856606 #define CCP_CMD_SRC_MEM(p) ((p)->dw3.src_mem)
108d30ea906Sjfb8856606 #define CCP_CMD_SRC_HI(p) ((p)->dw3.src_hi)
109d30ea906Sjfb8856606 #define CCP_CMD_LSB_ID(p) ((p)->dw3.lsb_cxt_id)
110d30ea906Sjfb8856606 #define CCP_CMD_FIX_SRC(p) ((p)->dw3.fixed)
111d30ea906Sjfb8856606
112d30ea906Sjfb8856606 /* Words 4/5 */
113d30ea906Sjfb8856606 #define CCP_CMD_DW4(p) ((p)->dw4)
114d30ea906Sjfb8856606 #define CCP_CMD_DST_LO(p) (CCP_CMD_DW4(p).dst_lo)
115d30ea906Sjfb8856606 #define CCP_CMD_DW5(p) ((p)->dw5.fields.dst_hi)
116d30ea906Sjfb8856606 #define CCP_CMD_DST_HI(p) (CCP_CMD_DW5(p))
117d30ea906Sjfb8856606 #define CCP_CMD_DST_MEM(p) ((p)->dw5.fields.dst_mem)
118d30ea906Sjfb8856606 #define CCP_CMD_FIX_DST(p) ((p)->dw5.fields.fixed)
119d30ea906Sjfb8856606 #define CCP_CMD_SHA_LO(p) ((p)->dw4.sha_len_lo)
120d30ea906Sjfb8856606 #define CCP_CMD_SHA_HI(p) ((p)->dw5.sha_len_hi)
121d30ea906Sjfb8856606
122d30ea906Sjfb8856606 /* Word 6/7 */
123d30ea906Sjfb8856606 #define CCP_CMD_DW6(p) ((p)->key_lo)
124d30ea906Sjfb8856606 #define CCP_CMD_KEY_LO(p) (CCP_CMD_DW6(p))
125d30ea906Sjfb8856606 #define CCP_CMD_DW7(p) ((p)->dw7)
126d30ea906Sjfb8856606 #define CCP_CMD_KEY_HI(p) ((p)->dw7.key_hi)
127d30ea906Sjfb8856606 #define CCP_CMD_KEY_MEM(p) ((p)->dw7.key_mem)
128d30ea906Sjfb8856606
129d30ea906Sjfb8856606 /* bitmap */
130d30ea906Sjfb8856606 enum {
131d30ea906Sjfb8856606 BITS_PER_WORD = sizeof(unsigned long) * CHAR_BIT
132d30ea906Sjfb8856606 };
133d30ea906Sjfb8856606
134d30ea906Sjfb8856606 #define WORD_OFFSET(b) ((b) / BITS_PER_WORD)
135d30ea906Sjfb8856606 #define BIT_OFFSET(b) ((b) % BITS_PER_WORD)
136d30ea906Sjfb8856606
137d30ea906Sjfb8856606 #define CCP_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
138d30ea906Sjfb8856606 #define CCP_BITMAP_SIZE(nr) \
139d30ea906Sjfb8856606 CCP_DIV_ROUND_UP(nr, CHAR_BIT * sizeof(unsigned long))
140d30ea906Sjfb8856606
141d30ea906Sjfb8856606 #define CCP_BITMAP_FIRST_WORD_MASK(start) \
142d30ea906Sjfb8856606 (~0UL << ((start) & (BITS_PER_WORD - 1)))
143d30ea906Sjfb8856606 #define CCP_BITMAP_LAST_WORD_MASK(nbits) \
144d30ea906Sjfb8856606 (~0UL >> (-(nbits) & (BITS_PER_WORD - 1)))
145d30ea906Sjfb8856606
146d30ea906Sjfb8856606 #define __ccp_round_mask(x, y) ((typeof(x))((y)-1))
147d30ea906Sjfb8856606 #define ccp_round_down(x, y) ((x) & ~__ccp_round_mask(x, y))
148d30ea906Sjfb8856606
149d30ea906Sjfb8856606 /** CCP registers Write/Read */
150d30ea906Sjfb8856606
ccp_pci_reg_write(void * base,int offset,uint32_t value)151d30ea906Sjfb8856606 static inline void ccp_pci_reg_write(void *base, int offset,
152d30ea906Sjfb8856606 uint32_t value)
153d30ea906Sjfb8856606 {
154d30ea906Sjfb8856606 volatile void *reg_addr = ((uint8_t *)base + offset);
155d30ea906Sjfb8856606
156d30ea906Sjfb8856606 rte_write32((rte_cpu_to_le_32(value)), reg_addr);
157d30ea906Sjfb8856606 }
158d30ea906Sjfb8856606
ccp_pci_reg_read(void * base,int offset)159d30ea906Sjfb8856606 static inline uint32_t ccp_pci_reg_read(void *base, int offset)
160d30ea906Sjfb8856606 {
161d30ea906Sjfb8856606 volatile void *reg_addr = ((uint8_t *)base + offset);
162d30ea906Sjfb8856606
163d30ea906Sjfb8856606 return rte_le_to_cpu_32(rte_read32(reg_addr));
164d30ea906Sjfb8856606 }
165d30ea906Sjfb8856606
166d30ea906Sjfb8856606 #define CCP_READ_REG(hw_addr, reg_offset) \
167d30ea906Sjfb8856606 ccp_pci_reg_read(hw_addr, reg_offset)
168d30ea906Sjfb8856606
169d30ea906Sjfb8856606 #define CCP_WRITE_REG(hw_addr, reg_offset, value) \
170d30ea906Sjfb8856606 ccp_pci_reg_write(hw_addr, reg_offset, value)
171d30ea906Sjfb8856606
172d30ea906Sjfb8856606 TAILQ_HEAD(ccp_list, ccp_device);
173d30ea906Sjfb8856606
174d30ea906Sjfb8856606 extern struct ccp_list ccp_list;
175d30ea906Sjfb8856606
176d30ea906Sjfb8856606 /**
177d30ea906Sjfb8856606 * CCP device version
178d30ea906Sjfb8856606 */
179d30ea906Sjfb8856606 enum ccp_device_version {
180d30ea906Sjfb8856606 CCP_VERSION_5A = 0,
181d30ea906Sjfb8856606 CCP_VERSION_5B,
182d30ea906Sjfb8856606 };
183d30ea906Sjfb8856606
184d30ea906Sjfb8856606 /**
185d30ea906Sjfb8856606 * A structure describing a CCP command queue.
186d30ea906Sjfb8856606 */
187d30ea906Sjfb8856606 struct ccp_queue {
188d30ea906Sjfb8856606 struct ccp_device *dev;
189d30ea906Sjfb8856606 char memz_name[RTE_MEMZONE_NAMESIZE];
190d30ea906Sjfb8856606
191d30ea906Sjfb8856606 rte_atomic64_t free_slots;
192d30ea906Sjfb8856606 /**< available free slots updated from enq/deq calls */
193d30ea906Sjfb8856606
194d30ea906Sjfb8856606 /* Queue identifier */
195d30ea906Sjfb8856606 uint64_t id; /**< queue id */
196d30ea906Sjfb8856606 uint64_t qidx; /**< queue index */
197d30ea906Sjfb8856606 uint64_t qsize; /**< queue size */
198d30ea906Sjfb8856606
199d30ea906Sjfb8856606 /* Queue address */
200d30ea906Sjfb8856606 struct ccp_desc *qbase_desc;
201d30ea906Sjfb8856606 void *qbase_addr;
202d30ea906Sjfb8856606 phys_addr_t qbase_phys_addr;
203d30ea906Sjfb8856606 /**< queue-page registers addr */
204d30ea906Sjfb8856606 void *reg_base;
205d30ea906Sjfb8856606
206d30ea906Sjfb8856606 uint32_t qcontrol;
207d30ea906Sjfb8856606 /**< queue ctrl reg */
208d30ea906Sjfb8856606
209d30ea906Sjfb8856606 int lsb;
210d30ea906Sjfb8856606 /**< lsb region assigned to queue */
211d30ea906Sjfb8856606 unsigned long lsbmask;
212d30ea906Sjfb8856606 /**< lsb regions queue can access */
213d30ea906Sjfb8856606 unsigned long lsbmap[CCP_BITMAP_SIZE(LSB_SIZE)];
214d30ea906Sjfb8856606 /**< all lsb resources which queue is using */
215d30ea906Sjfb8856606 uint32_t sb_key;
216d30ea906Sjfb8856606 /**< lsb assigned for queue */
217d30ea906Sjfb8856606 uint32_t sb_iv;
218d30ea906Sjfb8856606 /**< lsb assigned for iv */
219d30ea906Sjfb8856606 uint32_t sb_sha;
220d30ea906Sjfb8856606 /**< lsb assigned for sha ctx */
221d30ea906Sjfb8856606 uint32_t sb_hmac;
222d30ea906Sjfb8856606 /**< lsb assigned for hmac ctx */
223*4418919fSjohnjiang } __rte_cache_aligned;
224d30ea906Sjfb8856606
225d30ea906Sjfb8856606 /**
226d30ea906Sjfb8856606 * A structure describing a CCP device.
227d30ea906Sjfb8856606 */
228d30ea906Sjfb8856606 struct ccp_device {
229d30ea906Sjfb8856606 TAILQ_ENTRY(ccp_device) next;
230d30ea906Sjfb8856606 int id;
231d30ea906Sjfb8856606 /**< ccp dev id on platform */
232d30ea906Sjfb8856606 struct ccp_queue cmd_q[MAX_HW_QUEUES];
233d30ea906Sjfb8856606 /**< ccp queue */
234d30ea906Sjfb8856606 int cmd_q_count;
235d30ea906Sjfb8856606 /**< no. of ccp Queues */
236d30ea906Sjfb8856606 struct rte_pci_device pci;
237d30ea906Sjfb8856606 /**< ccp pci identifier */
238d30ea906Sjfb8856606 unsigned long lsbmap[CCP_BITMAP_SIZE(SLSB_MAP_SIZE)];
239d30ea906Sjfb8856606 /**< shared lsb mask of ccp */
240d30ea906Sjfb8856606 rte_spinlock_t lsb_lock;
241d30ea906Sjfb8856606 /**< protection for shared lsb region allocation */
242d30ea906Sjfb8856606 int qidx;
243d30ea906Sjfb8856606 /**< current queue index */
244d30ea906Sjfb8856606 int hwrng_retries;
245d30ea906Sjfb8856606 /**< retry counter for CCP TRNG */
246d30ea906Sjfb8856606 } __rte_cache_aligned;
247d30ea906Sjfb8856606
248d30ea906Sjfb8856606 /**< CCP H/W engine related */
249d30ea906Sjfb8856606 /**
250d30ea906Sjfb8856606 * ccp_engine - CCP operation identifiers
251d30ea906Sjfb8856606 *
252d30ea906Sjfb8856606 * @CCP_ENGINE_AES: AES operation
253d30ea906Sjfb8856606 * @CCP_ENGINE_XTS_AES: 128-bit XTS AES operation
254d30ea906Sjfb8856606 * @CCP_ENGINE_3DES: DES/3DES operation
255d30ea906Sjfb8856606 * @CCP_ENGINE_SHA: SHA operation
256d30ea906Sjfb8856606 * @CCP_ENGINE_RSA: RSA operation
257d30ea906Sjfb8856606 * @CCP_ENGINE_PASSTHRU: pass-through operation
258d30ea906Sjfb8856606 * @CCP_ENGINE_ZLIB_DECOMPRESS: unused
259d30ea906Sjfb8856606 * @CCP_ENGINE_ECC: ECC operation
260d30ea906Sjfb8856606 */
261d30ea906Sjfb8856606 enum ccp_engine {
262d30ea906Sjfb8856606 CCP_ENGINE_AES = 0,
263d30ea906Sjfb8856606 CCP_ENGINE_XTS_AES_128,
264d30ea906Sjfb8856606 CCP_ENGINE_3DES,
265d30ea906Sjfb8856606 CCP_ENGINE_SHA,
266d30ea906Sjfb8856606 CCP_ENGINE_RSA,
267d30ea906Sjfb8856606 CCP_ENGINE_PASSTHRU,
268d30ea906Sjfb8856606 CCP_ENGINE_ZLIB_DECOMPRESS,
269d30ea906Sjfb8856606 CCP_ENGINE_ECC,
270d30ea906Sjfb8856606 CCP_ENGINE__LAST,
271d30ea906Sjfb8856606 };
272d30ea906Sjfb8856606
273d30ea906Sjfb8856606 /* Passthru engine */
274d30ea906Sjfb8856606 /**
275d30ea906Sjfb8856606 * ccp_passthru_bitwise - type of bitwise passthru operation
276d30ea906Sjfb8856606 *
277d30ea906Sjfb8856606 * @CCP_PASSTHRU_BITWISE_NOOP: no bitwise operation performed
278d30ea906Sjfb8856606 * @CCP_PASSTHRU_BITWISE_AND: perform bitwise AND of src with mask
279d30ea906Sjfb8856606 * @CCP_PASSTHRU_BITWISE_OR: perform bitwise OR of src with mask
280d30ea906Sjfb8856606 * @CCP_PASSTHRU_BITWISE_XOR: perform bitwise XOR of src with mask
281d30ea906Sjfb8856606 * @CCP_PASSTHRU_BITWISE_MASK: overwrite with mask
282d30ea906Sjfb8856606 */
283d30ea906Sjfb8856606 enum ccp_passthru_bitwise {
284d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE_NOOP = 0,
285d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE_AND,
286d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE_OR,
287d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE_XOR,
288d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE_MASK,
289d30ea906Sjfb8856606 CCP_PASSTHRU_BITWISE__LAST,
290d30ea906Sjfb8856606 };
291d30ea906Sjfb8856606
292d30ea906Sjfb8856606 /**
293d30ea906Sjfb8856606 * ccp_passthru_byteswap - type of byteswap passthru operation
294d30ea906Sjfb8856606 *
295d30ea906Sjfb8856606 * @CCP_PASSTHRU_BYTESWAP_NOOP: no byte swapping performed
296d30ea906Sjfb8856606 * @CCP_PASSTHRU_BYTESWAP_32BIT: swap bytes within 32-bit words
297d30ea906Sjfb8856606 * @CCP_PASSTHRU_BYTESWAP_256BIT: swap bytes within 256-bit words
298d30ea906Sjfb8856606 */
299d30ea906Sjfb8856606 enum ccp_passthru_byteswap {
300d30ea906Sjfb8856606 CCP_PASSTHRU_BYTESWAP_NOOP = 0,
301d30ea906Sjfb8856606 CCP_PASSTHRU_BYTESWAP_32BIT,
302d30ea906Sjfb8856606 CCP_PASSTHRU_BYTESWAP_256BIT,
303d30ea906Sjfb8856606 CCP_PASSTHRU_BYTESWAP__LAST,
304d30ea906Sjfb8856606 };
305d30ea906Sjfb8856606
306d30ea906Sjfb8856606 /**
307d30ea906Sjfb8856606 * CCP passthru
308d30ea906Sjfb8856606 */
309d30ea906Sjfb8856606 struct ccp_passthru {
310d30ea906Sjfb8856606 phys_addr_t src_addr;
311d30ea906Sjfb8856606 phys_addr_t dest_addr;
312d30ea906Sjfb8856606 enum ccp_passthru_bitwise bit_mod;
313d30ea906Sjfb8856606 enum ccp_passthru_byteswap byte_swap;
314d30ea906Sjfb8856606 int len;
315d30ea906Sjfb8856606 int dir;
316d30ea906Sjfb8856606 };
317d30ea906Sjfb8856606
318d30ea906Sjfb8856606 /* CCP version 5: Union to define the function field (cmd_reg1/dword0) */
319d30ea906Sjfb8856606 union ccp_function {
320d30ea906Sjfb8856606 struct {
321d30ea906Sjfb8856606 uint16_t size:7;
322d30ea906Sjfb8856606 uint16_t encrypt:1;
323d30ea906Sjfb8856606 uint16_t mode:5;
324d30ea906Sjfb8856606 uint16_t type:2;
325d30ea906Sjfb8856606 } aes;
326d30ea906Sjfb8856606 struct {
327d30ea906Sjfb8856606 uint16_t size:7;
328d30ea906Sjfb8856606 uint16_t encrypt:1;
329d30ea906Sjfb8856606 uint16_t mode:5;
330d30ea906Sjfb8856606 uint16_t type:2;
331d30ea906Sjfb8856606 } des;
332d30ea906Sjfb8856606 struct {
333d30ea906Sjfb8856606 uint16_t size:7;
334d30ea906Sjfb8856606 uint16_t encrypt:1;
335d30ea906Sjfb8856606 uint16_t rsvd:5;
336d30ea906Sjfb8856606 uint16_t type:2;
337d30ea906Sjfb8856606 } aes_xts;
338d30ea906Sjfb8856606 struct {
339d30ea906Sjfb8856606 uint16_t rsvd1:10;
340d30ea906Sjfb8856606 uint16_t type:4;
341d30ea906Sjfb8856606 uint16_t rsvd2:1;
342d30ea906Sjfb8856606 } sha;
343d30ea906Sjfb8856606 struct {
344d30ea906Sjfb8856606 uint16_t mode:3;
345d30ea906Sjfb8856606 uint16_t size:12;
346d30ea906Sjfb8856606 } rsa;
347d30ea906Sjfb8856606 struct {
348d30ea906Sjfb8856606 uint16_t byteswap:2;
349d30ea906Sjfb8856606 uint16_t bitwise:3;
350d30ea906Sjfb8856606 uint16_t reflect:2;
351d30ea906Sjfb8856606 uint16_t rsvd:8;
352d30ea906Sjfb8856606 } pt;
353d30ea906Sjfb8856606 struct {
354d30ea906Sjfb8856606 uint16_t rsvd:13;
355d30ea906Sjfb8856606 } zlib;
356d30ea906Sjfb8856606 struct {
357d30ea906Sjfb8856606 uint16_t size:10;
358d30ea906Sjfb8856606 uint16_t type:2;
359d30ea906Sjfb8856606 uint16_t mode:3;
360d30ea906Sjfb8856606 } ecc;
361d30ea906Sjfb8856606 uint16_t raw;
362d30ea906Sjfb8856606 };
363d30ea906Sjfb8856606
364d30ea906Sjfb8856606
365d30ea906Sjfb8856606 /**
366d30ea906Sjfb8856606 * descriptor for version 5 CPP commands
367d30ea906Sjfb8856606 * 8 32-bit words:
368d30ea906Sjfb8856606 * word 0: function; engine; control bits
369d30ea906Sjfb8856606 * word 1: length of source data
370d30ea906Sjfb8856606 * word 2: low 32 bits of source pointer
371d30ea906Sjfb8856606 * word 3: upper 16 bits of source pointer; source memory type
372d30ea906Sjfb8856606 * word 4: low 32 bits of destination pointer
373d30ea906Sjfb8856606 * word 5: upper 16 bits of destination pointer; destination memory
374d30ea906Sjfb8856606 * type
375d30ea906Sjfb8856606 * word 6: low 32 bits of key pointer
376d30ea906Sjfb8856606 * word 7: upper 16 bits of key pointer; key memory type
377d30ea906Sjfb8856606 */
378d30ea906Sjfb8856606 struct dword0 {
379d30ea906Sjfb8856606 uint32_t soc:1;
380d30ea906Sjfb8856606 uint32_t ioc:1;
381d30ea906Sjfb8856606 uint32_t rsvd1:1;
382d30ea906Sjfb8856606 uint32_t init:1;
383d30ea906Sjfb8856606 uint32_t eom:1;
384d30ea906Sjfb8856606 uint32_t function:15;
385d30ea906Sjfb8856606 uint32_t engine:4;
386d30ea906Sjfb8856606 uint32_t prot:1;
387d30ea906Sjfb8856606 uint32_t rsvd2:7;
388d30ea906Sjfb8856606 };
389d30ea906Sjfb8856606
390d30ea906Sjfb8856606 struct dword3 {
391d30ea906Sjfb8856606 uint32_t src_hi:16;
392d30ea906Sjfb8856606 uint32_t src_mem:2;
393d30ea906Sjfb8856606 uint32_t lsb_cxt_id:8;
394d30ea906Sjfb8856606 uint32_t rsvd1:5;
395d30ea906Sjfb8856606 uint32_t fixed:1;
396d30ea906Sjfb8856606 };
397d30ea906Sjfb8856606
398d30ea906Sjfb8856606 union dword4 {
399d30ea906Sjfb8856606 uint32_t dst_lo; /* NON-SHA */
400d30ea906Sjfb8856606 uint32_t sha_len_lo; /* SHA */
401d30ea906Sjfb8856606 };
402d30ea906Sjfb8856606
403d30ea906Sjfb8856606 union dword5 {
404d30ea906Sjfb8856606 struct {
405d30ea906Sjfb8856606 uint32_t dst_hi:16;
406d30ea906Sjfb8856606 uint32_t dst_mem:2;
407d30ea906Sjfb8856606 uint32_t rsvd1:13;
408d30ea906Sjfb8856606 uint32_t fixed:1;
409d30ea906Sjfb8856606 }
410d30ea906Sjfb8856606 fields;
411d30ea906Sjfb8856606 uint32_t sha_len_hi;
412d30ea906Sjfb8856606 };
413d30ea906Sjfb8856606
414d30ea906Sjfb8856606 struct dword7 {
415d30ea906Sjfb8856606 uint32_t key_hi:16;
416d30ea906Sjfb8856606 uint32_t key_mem:2;
417d30ea906Sjfb8856606 uint32_t rsvd1:14;
418d30ea906Sjfb8856606 };
419d30ea906Sjfb8856606
420d30ea906Sjfb8856606 struct ccp_desc {
421d30ea906Sjfb8856606 struct dword0 dw0;
422d30ea906Sjfb8856606 uint32_t length;
423d30ea906Sjfb8856606 uint32_t src_lo;
424d30ea906Sjfb8856606 struct dword3 dw3;
425d30ea906Sjfb8856606 union dword4 dw4;
426d30ea906Sjfb8856606 union dword5 dw5;
427d30ea906Sjfb8856606 uint32_t key_lo;
428d30ea906Sjfb8856606 struct dword7 dw7;
429d30ea906Sjfb8856606 };
430d30ea906Sjfb8856606
431d30ea906Sjfb8856606 /**
432d30ea906Sjfb8856606 * ccp memory type
433d30ea906Sjfb8856606 */
434d30ea906Sjfb8856606 enum ccp_memtype {
435d30ea906Sjfb8856606 CCP_MEMTYPE_SYSTEM = 0,
436d30ea906Sjfb8856606 CCP_MEMTYPE_SB,
437d30ea906Sjfb8856606 CCP_MEMTYPE_LOCAL,
438d30ea906Sjfb8856606 CCP_MEMTYPE_LAST,
439d30ea906Sjfb8856606 };
440d30ea906Sjfb8856606
441d30ea906Sjfb8856606 /**
442d30ea906Sjfb8856606 * cmd id to follow order
443d30ea906Sjfb8856606 */
444d30ea906Sjfb8856606 enum ccp_cmd_order {
445d30ea906Sjfb8856606 CCP_CMD_CIPHER = 0,
446d30ea906Sjfb8856606 CCP_CMD_AUTH,
447d30ea906Sjfb8856606 CCP_CMD_CIPHER_HASH,
448d30ea906Sjfb8856606 CCP_CMD_HASH_CIPHER,
449d30ea906Sjfb8856606 CCP_CMD_COMBINED,
450d30ea906Sjfb8856606 CCP_CMD_NOT_SUPPORTED,
451d30ea906Sjfb8856606 };
452d30ea906Sjfb8856606
453d30ea906Sjfb8856606 static inline uint32_t
low32_value(unsigned long addr)454d30ea906Sjfb8856606 low32_value(unsigned long addr)
455d30ea906Sjfb8856606 {
456d30ea906Sjfb8856606 return ((uint64_t)addr) & 0x0ffffffff;
457d30ea906Sjfb8856606 }
458d30ea906Sjfb8856606
459d30ea906Sjfb8856606 static inline uint32_t
high32_value(unsigned long addr)460d30ea906Sjfb8856606 high32_value(unsigned long addr)
461d30ea906Sjfb8856606 {
462d30ea906Sjfb8856606 return ((uint64_t)addr >> 32) & 0x00000ffff;
463d30ea906Sjfb8856606 }
464d30ea906Sjfb8856606
465d30ea906Sjfb8856606 /*
466d30ea906Sjfb8856606 * Start CCP device
467d30ea906Sjfb8856606 */
468d30ea906Sjfb8856606 int ccp_dev_start(struct rte_cryptodev *dev);
469d30ea906Sjfb8856606
470d30ea906Sjfb8856606 /**
471d30ea906Sjfb8856606 * Detect ccp platform and initialize all ccp devices
472d30ea906Sjfb8856606 *
473d30ea906Sjfb8856606 * @param ccp_id rte_pci_id list for supported CCP devices
474d30ea906Sjfb8856606 * @return no. of successfully initialized CCP devices
475d30ea906Sjfb8856606 */
476d30ea906Sjfb8856606 int ccp_probe_devices(const struct rte_pci_id *ccp_id);
477d30ea906Sjfb8856606
478d30ea906Sjfb8856606 /**
479d30ea906Sjfb8856606 * allocate a ccp command queue
480d30ea906Sjfb8856606 *
481d30ea906Sjfb8856606 * @dev rte crypto device
482d30ea906Sjfb8856606 * @param slot_req number of required
483d30ea906Sjfb8856606 * @return allotted CCP queue on success otherwise NULL
484d30ea906Sjfb8856606 */
485d30ea906Sjfb8856606 struct ccp_queue *ccp_allot_queue(struct rte_cryptodev *dev, int slot_req);
486d30ea906Sjfb8856606
487d30ea906Sjfb8856606 /**
488d30ea906Sjfb8856606 * read hwrng value
489d30ea906Sjfb8856606 *
490d30ea906Sjfb8856606 * @param trng_value data pointer to write RNG value
491d30ea906Sjfb8856606 * @return 0 on success otherwise -1
492d30ea906Sjfb8856606 */
493d30ea906Sjfb8856606 int ccp_read_hwrng(uint32_t *trng_value);
494d30ea906Sjfb8856606
495d30ea906Sjfb8856606 #endif /* _CCP_DEV_H_ */
496