1a5e1018dSGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause
2a5e1018dSGagandeep Singh * Copyright 2017-2018 NXP
3a5e1018dSGagandeep Singh */
4a5e1018dSGagandeep Singh
5a5e1018dSGagandeep Singh #ifndef CAAM_JR_PVT_H
6a5e1018dSGagandeep Singh #define CAAM_JR_PVT_H
7a5e1018dSGagandeep Singh
8c0ded849SHemant Agrawal #include <desc/ipsec.h>
99e727d4aSGagandeep Singh #include <dpaax_iova_table.h>
103e33486fSHemant Agrawal
11a5e1018dSGagandeep Singh /* NXP CAAM JR PMD device name */
12a5e1018dSGagandeep Singh
13a5e1018dSGagandeep Singh #define CAAM_JR_ALG_UNSUPPORT (-1)
14a5e1018dSGagandeep Singh
15a5e1018dSGagandeep Singh /* Minimum job descriptor consists of a oneword job descriptor HEADER and
16a5e1018dSGagandeep Singh * a pointer to the shared descriptor.
17a5e1018dSGagandeep Singh */
18a5e1018dSGagandeep Singh #define MIN_JOB_DESC_SIZE (CAAM_CMD_SZ + CAAM_PTR_SZ)
19a5e1018dSGagandeep Singh #define CAAM_JOB_DESC_SIZE 13
20a5e1018dSGagandeep Singh
21a5e1018dSGagandeep Singh /* CTX_POOL_NUM_BUFS is set as per the ipsec-secgw application */
22a5e1018dSGagandeep Singh #define CTX_POOL_NUM_BUFS 32000
23a5e1018dSGagandeep Singh #define CTX_POOL_CACHE_SIZE 512
24a5e1018dSGagandeep Singh
25a5e1018dSGagandeep Singh #define DIR_ENC 1
26a5e1018dSGagandeep Singh #define DIR_DEC 0
27a5e1018dSGagandeep Singh
28a5e1018dSGagandeep Singh #define JR_MAX_NB_MAX_DIGEST 32
29a5e1018dSGagandeep Singh
30a5e1018dSGagandeep Singh #define RTE_CAAM_JR_PMD_MAX_NB_SESSIONS 2048
31a5e1018dSGagandeep Singh
32a5e1018dSGagandeep Singh
33a5e1018dSGagandeep Singh /* Return codes for SEC user space driver APIs */
34a5e1018dSGagandeep Singh enum sec_return_code_e {
35a5e1018dSGagandeep Singh SEC_SUCCESS = 0, /* Operation executed successfully.*/
36a5e1018dSGagandeep Singh SEC_INVALID_INPUT_PARAM, /* API received an invalid input
37a5e1018dSGagandeep Singh * parameter
38a5e1018dSGagandeep Singh */
39a5e1018dSGagandeep Singh SEC_OUT_OF_MEMORY, /* Memory allocation failed. */
40a5e1018dSGagandeep Singh SEC_DESCRIPTOR_IN_FLIGHT, /* API function indicates there are
41a5e1018dSGagandeep Singh * descriptors in flight
42a5e1018dSGagandeep Singh * for SEC to process.
43a5e1018dSGagandeep Singh */
44a5e1018dSGagandeep Singh SEC_LAST_DESCRIPTOR_IN_FLIGHT, /* API function indicates there is one
45a5e1018dSGagandeep Singh * last descriptor in flight
46a5e1018dSGagandeep Singh * for SEC to process that.
47a5e1018dSGagandeep Singh */
48a5e1018dSGagandeep Singh SEC_PROCESSING_ERROR, /* Indicates a SEC processing error
49a5e1018dSGagandeep Singh * occurred on a Job Ring which requires
50a5e1018dSGagandeep Singh * a SEC user space driver shutdown. Can
51a5e1018dSGagandeep Singh * be returned from sec_poll_job_ring().
52a5e1018dSGagandeep Singh * Then the only other API that can be
53a5e1018dSGagandeep Singh * called after this error is
54a5e1018dSGagandeep Singh * sec_release().
55a5e1018dSGagandeep Singh */
56a5e1018dSGagandeep Singh SEC_DESC_PROCESSING_ERROR, /* Indicates a SEC descriptor processing
57a5e1018dSGagandeep Singh * error occurred on a Job Ring. Can be
58a5e1018dSGagandeep Singh * returned from sec_poll_job_ring().
59a5e1018dSGagandeep Singh * The driver was able to reset job ring
60a5e1018dSGagandeep Singh * and job ring can be used like in a
61a5e1018dSGagandeep Singh * normal case.
62a5e1018dSGagandeep Singh */
63a5e1018dSGagandeep Singh SEC_JR_IS_FULL, /* Job Ring is full. There is no more
64a5e1018dSGagandeep Singh * room in the JR for new descriptors.
65a5e1018dSGagandeep Singh * This can happen if the descriptor RX
66a5e1018dSGagandeep Singh * rate is higher than SEC's capacity.
67a5e1018dSGagandeep Singh */
68a5e1018dSGagandeep Singh SEC_DRIVER_RELEASE_IN_PROGRESS, /* SEC driver shutdown is in progress,
69a5e1018dSGagandeep Singh * descriptors processing or polling is
70a5e1018dSGagandeep Singh * allowed.
71a5e1018dSGagandeep Singh */
72a5e1018dSGagandeep Singh SEC_DRIVER_ALREADY_INITIALIZED, /* SEC driver is already initialized.*/
73a5e1018dSGagandeep Singh SEC_DRIVER_NOT_INITIALIZED, /* SEC driver is NOT initialized. */
74a5e1018dSGagandeep Singh SEC_JOB_RING_RESET_IN_PROGRESS, /* Job ring is resetting due to a
75a5e1018dSGagandeep Singh * per-descriptor SEC processing error
76a5e1018dSGagandeep Singh * ::SEC_desc_PROCESSING_ERROR. Reset is
77a5e1018dSGagandeep Singh * finished when sec_poll_job_ring()
78a5e1018dSGagandeep Singh * return. Then the job ring can be used
79a5e1018dSGagandeep Singh * again.
80a5e1018dSGagandeep Singh */
81a5e1018dSGagandeep Singh SEC_RESET_ENGINE_FAILED, /* Resetting of SEC Engine by SEC Kernel
82a5e1018dSGagandeep Singh * Driver Failed
83a5e1018dSGagandeep Singh */
84a5e1018dSGagandeep Singh SEC_ENABLE_IRQS_FAILED, /* Enabling of IRQs in SEC Kernel Driver
85a5e1018dSGagandeep Singh * Failed
86a5e1018dSGagandeep Singh */
87a5e1018dSGagandeep Singh SEC_DISABLE_IRQS_FAILED, /* Disabling of IRQs in SEC Kernel
88a5e1018dSGagandeep Singh * Driver Failed
89a5e1018dSGagandeep Singh */
90a5e1018dSGagandeep Singh /* END OF VALID VALUES */
91a5e1018dSGagandeep Singh
92a5e1018dSGagandeep Singh SEC_RETURN_CODE_MAX_VALUE, /* Invalid value for return code. It is
93a5e1018dSGagandeep Singh * used to mark the end of the return
94a5e1018dSGagandeep Singh * code values. @note ALL new return
95a5e1018dSGagandeep Singh * code values MUST be added before
96a5e1018dSGagandeep Singh * ::SEC_RETURN_CODE_MAX_VALUE!
97a5e1018dSGagandeep Singh */
98a5e1018dSGagandeep Singh };
99a5e1018dSGagandeep Singh
100a5e1018dSGagandeep Singh enum caam_jr_op_type {
101a5e1018dSGagandeep Singh CAAM_JR_NONE, /* No Cipher operations*/
102a5e1018dSGagandeep Singh CAAM_JR_CIPHER,/* CIPHER operations */
103a5e1018dSGagandeep Singh CAAM_JR_AUTH, /* Authentication Operations */
104a5e1018dSGagandeep Singh CAAM_JR_AEAD, /* Authenticated Encryption with associated data */
105a5e1018dSGagandeep Singh CAAM_JR_IPSEC, /* IPSEC protocol operations*/
106a5e1018dSGagandeep Singh CAAM_JR_PDCP, /* PDCP protocol operations*/
107a5e1018dSGagandeep Singh CAAM_JR_PKC, /* Public Key Cryptographic Operations */
108a5e1018dSGagandeep Singh CAAM_JR_MAX
109a5e1018dSGagandeep Singh };
110a5e1018dSGagandeep Singh
111a5e1018dSGagandeep Singh struct caam_jr_session {
112a5e1018dSGagandeep Singh uint8_t dir; /* Operation Direction */
113a5e1018dSGagandeep Singh enum rte_crypto_cipher_algorithm cipher_alg; /* Cipher Algorithm*/
114a5e1018dSGagandeep Singh enum rte_crypto_auth_algorithm auth_alg; /* Authentication Algorithm*/
115a5e1018dSGagandeep Singh enum rte_crypto_aead_algorithm aead_alg; /* AEAD Algorithm*/
1163e33486fSHemant Agrawal enum rte_security_session_protocol proto_alg; /* Security Algorithm*/
117a5e1018dSGagandeep Singh union {
118a5e1018dSGagandeep Singh struct {
119a5e1018dSGagandeep Singh uint8_t *data; /* pointer to key data */
120a5e1018dSGagandeep Singh size_t length; /* key length in bytes */
121a5e1018dSGagandeep Singh } aead_key;
122a5e1018dSGagandeep Singh struct {
123a5e1018dSGagandeep Singh struct {
124a5e1018dSGagandeep Singh uint8_t *data; /* pointer to key data */
125a5e1018dSGagandeep Singh size_t length; /* key length in bytes */
126a5e1018dSGagandeep Singh } cipher_key;
127a5e1018dSGagandeep Singh struct {
128a5e1018dSGagandeep Singh uint8_t *data; /* pointer to key data */
129a5e1018dSGagandeep Singh size_t length; /* key length in bytes */
130a5e1018dSGagandeep Singh } auth_key;
131a5e1018dSGagandeep Singh };
132a5e1018dSGagandeep Singh };
133a5e1018dSGagandeep Singh struct {
134a5e1018dSGagandeep Singh uint16_t length;
135a5e1018dSGagandeep Singh uint16_t offset;
136a5e1018dSGagandeep Singh } iv; /* Initialisation vector parameters */
137a5e1018dSGagandeep Singh uint16_t auth_only_len; /* Length of data for Auth only */
138a5e1018dSGagandeep Singh uint32_t digest_length;
1393e33486fSHemant Agrawal struct ipsec_encap_pdb encap_pdb;
140a5e1018dSGagandeep Singh struct ip ip4_hdr;
1413e33486fSHemant Agrawal struct ipsec_decap_pdb decap_pdb;
142a5e1018dSGagandeep Singh struct caam_jr_qp *qp;
143a5e1018dSGagandeep Singh struct sec_cdb *cdb; /* cmd block associated with qp */
144a5e1018dSGagandeep Singh struct rte_mempool *ctx_pool; /* session mempool for caam_jr_op_ctx */
145a5e1018dSGagandeep Singh };
146a5e1018dSGagandeep Singh
147a5e1018dSGagandeep Singh /*
148a5e1018dSGagandeep Singh * 16-byte hardware scatter/gather table
149a5e1018dSGagandeep Singh */
150a5e1018dSGagandeep Singh
151a5e1018dSGagandeep Singh #define SEC4_SG_LEN_EXT 0x80000000 /* Entry points to table */
152a5e1018dSGagandeep Singh #define SEC4_SG_LEN_FIN 0x40000000 /* Last ent in table */
153a5e1018dSGagandeep Singh #define SEC4_SG_BPID_MASK 0x000000ff
154a5e1018dSGagandeep Singh #define SEC4_SG_BPID_SHIFT 16
155a5e1018dSGagandeep Singh #define SEC4_SG_LEN_MASK 0x3fffffff /* Excludes EXT and FINAL */
156a5e1018dSGagandeep Singh #define SEC4_SG_OFFSET_MASK 0x00001fff
157a5e1018dSGagandeep Singh
158a5e1018dSGagandeep Singh struct sec4_sg_entry {
159a5e1018dSGagandeep Singh uint64_t ptr;
160a5e1018dSGagandeep Singh uint32_t len;
161a5e1018dSGagandeep Singh uint32_t bpid_offset;
162a5e1018dSGagandeep Singh };
163a5e1018dSGagandeep Singh
164a5e1018dSGagandeep Singh #define MAX_SG_ENTRIES 16
165a5e1018dSGagandeep Singh #define SG_CACHELINE_0 0
166a5e1018dSGagandeep Singh #define SG_CACHELINE_1 4
167a5e1018dSGagandeep Singh #define SG_CACHELINE_2 8
168a5e1018dSGagandeep Singh #define SG_CACHELINE_3 12
169a5e1018dSGagandeep Singh
170a5e1018dSGagandeep Singh /* Structure encompassing a job descriptor which is to be processed
171a5e1018dSGagandeep Singh * by SEC. User should also initialise this structure with the callback
172*7be78d02SJosh Soref * function pointer which will be called by driver after receiving processed
173a5e1018dSGagandeep Singh * descriptor from SEC. User data is also passed in this data structure which
174a5e1018dSGagandeep Singh * will be sent as an argument to the user callback function.
175a5e1018dSGagandeep Singh */
176a5e1018dSGagandeep Singh struct job_descriptor {
177a5e1018dSGagandeep Singh uint32_t desc[CAAM_JOB_DESC_SIZE];
178a5e1018dSGagandeep Singh };
179a5e1018dSGagandeep Singh
180a5e1018dSGagandeep Singh struct caam_jr_op_ctx {
181a5e1018dSGagandeep Singh struct job_descriptor jobdes;
182a5e1018dSGagandeep Singh /* sg[0] output, sg[1] input, others are possible sub frames */
183a5e1018dSGagandeep Singh struct sec4_sg_entry sg[MAX_SG_ENTRIES];
184a5e1018dSGagandeep Singh struct rte_crypto_op *op;
185a5e1018dSGagandeep Singh struct rte_mempool *ctx_pool; /* mempool pointer for caam_jr_op_ctx */
186a5e1018dSGagandeep Singh int64_t vtop_offset;
187a5e1018dSGagandeep Singh uint8_t digest[JR_MAX_NB_MAX_DIGEST];
188a5e1018dSGagandeep Singh };
189a5e1018dSGagandeep Singh
190a5e1018dSGagandeep Singh /**
191a5e1018dSGagandeep Singh * Checksum
192a5e1018dSGagandeep Singh *
193a5e1018dSGagandeep Singh * @param buffer calculate chksum for buffer
194a5e1018dSGagandeep Singh * @param len buffer length
195a5e1018dSGagandeep Singh *
196a5e1018dSGagandeep Singh * @return checksum value in host cpu order
197a5e1018dSGagandeep Singh */
198a5e1018dSGagandeep Singh static inline uint16_t
calc_chksum(void * buffer,int len)199a5e1018dSGagandeep Singh calc_chksum(void *buffer, int len)
200a5e1018dSGagandeep Singh {
201a5e1018dSGagandeep Singh uint16_t *buf = (uint16_t *)buffer;
202a5e1018dSGagandeep Singh uint32_t sum = 0;
203a5e1018dSGagandeep Singh uint16_t result;
204a5e1018dSGagandeep Singh
205a5e1018dSGagandeep Singh for (sum = 0; len > 1; len -= 2)
206a5e1018dSGagandeep Singh sum += *buf++;
207a5e1018dSGagandeep Singh
208a5e1018dSGagandeep Singh if (len == 1)
209a5e1018dSGagandeep Singh sum += *(unsigned char *)buf;
210a5e1018dSGagandeep Singh
211a5e1018dSGagandeep Singh sum = (sum >> 16) + (sum & 0xFFFF);
212a5e1018dSGagandeep Singh sum += (sum >> 16);
213a5e1018dSGagandeep Singh result = ~sum;
214a5e1018dSGagandeep Singh
215a5e1018dSGagandeep Singh return result;
216a5e1018dSGagandeep Singh }
217a5e1018dSGagandeep Singh struct uio_job_ring {
218a5e1018dSGagandeep Singh uint32_t jr_id;
21961552661SYunjian Wang int uio_fd;
220a5e1018dSGagandeep Singh void *register_base_addr;
221a5e1018dSGagandeep Singh int map_size;
222a5e1018dSGagandeep Singh int uio_minor_number;
223a5e1018dSGagandeep Singh };
224a5e1018dSGagandeep Singh
225a5e1018dSGagandeep Singh int sec_cleanup(void);
226a5e1018dSGagandeep Singh int sec_configure(void);
22761552661SYunjian Wang void sec_uio_job_rings_init(void);
228a5e1018dSGagandeep Singh struct uio_job_ring *config_job_ring(void);
22961552661SYunjian Wang void free_job_ring(int uio_fd);
230a5e1018dSGagandeep Singh
231a5e1018dSGagandeep Singh /* For Dma memory allocation of specified length and alignment */
232a5e1018dSGagandeep Singh static inline void *
caam_jr_dma_mem_alloc(size_t align,size_t len)233a5e1018dSGagandeep Singh caam_jr_dma_mem_alloc(size_t align, size_t len)
234a5e1018dSGagandeep Singh {
235a5e1018dSGagandeep Singh return rte_malloc("mem_alloc", len, align);
236a5e1018dSGagandeep Singh }
237a5e1018dSGagandeep Singh
238a5e1018dSGagandeep Singh /* For freeing dma memory */
239a5e1018dSGagandeep Singh static inline void
caam_jr_dma_free(void * ptr)240a5e1018dSGagandeep Singh caam_jr_dma_free(void *ptr)
241a5e1018dSGagandeep Singh {
242a5e1018dSGagandeep Singh rte_free(ptr);
243a5e1018dSGagandeep Singh }
244a5e1018dSGagandeep Singh
245a5e1018dSGagandeep Singh static inline rte_iova_t
caam_jr_mem_vtop(void * vaddr)246a5e1018dSGagandeep Singh caam_jr_mem_vtop(void *vaddr)
247a5e1018dSGagandeep Singh {
248a5e1018dSGagandeep Singh const struct rte_memseg *ms;
249a5e1018dSGagandeep Singh
250a5e1018dSGagandeep Singh ms = rte_mem_virt2memseg(vaddr, NULL);
251a5e1018dSGagandeep Singh if (ms)
252a5e1018dSGagandeep Singh return ms->iova + RTE_PTR_DIFF(vaddr, ms->addr);
253a5e1018dSGagandeep Singh return (size_t)NULL;
254a5e1018dSGagandeep Singh }
255a5e1018dSGagandeep Singh
256a5e1018dSGagandeep Singh static inline void *
caam_jr_dma_ptov(rte_iova_t paddr)257a5e1018dSGagandeep Singh caam_jr_dma_ptov(rte_iova_t paddr)
258a5e1018dSGagandeep Singh {
2599e727d4aSGagandeep Singh void *va;
2609e727d4aSGagandeep Singh va = dpaax_iova_table_get_va(paddr);
2619e727d4aSGagandeep Singh if (likely(va != NULL))
2629e727d4aSGagandeep Singh return va;
2639e727d4aSGagandeep Singh
264a5e1018dSGagandeep Singh return rte_mem_iova2virt(paddr);
265a5e1018dSGagandeep Singh }
266a5e1018dSGagandeep Singh
267a5e1018dSGagandeep Singh /* Virtual to physical address conversion */
caam_jr_dma_vtop(void * ptr)268a5e1018dSGagandeep Singh static inline rte_iova_t caam_jr_dma_vtop(void *ptr)
269a5e1018dSGagandeep Singh {
270a5e1018dSGagandeep Singh return caam_jr_mem_vtop(ptr);
271a5e1018dSGagandeep Singh }
272a5e1018dSGagandeep Singh
273a5e1018dSGagandeep Singh /** @brief Request to SEC kernel driver to enable interrupts for
274a5e1018dSGagandeep Singh * descriptor finished processing
275a5e1018dSGagandeep Singh * Use UIO to communicate with SEC kernel driver: write command
276a5e1018dSGagandeep Singh * value that indicates an IRQ enable action into UIO file descriptor
277a5e1018dSGagandeep Singh * of this job ring.
278a5e1018dSGagandeep Singh *
279a5e1018dSGagandeep Singh * @param [in] uio_fd Job Ring UIO File descriptor
280a5e1018dSGagandeep Singh * @retval 0 for success
281a5e1018dSGagandeep Singh * @retval -1 value for error
282a5e1018dSGagandeep Singh */
283c40b4fcdSYunjian Wang int caam_jr_enable_irqs(int uio_fd);
284a5e1018dSGagandeep Singh
285a5e1018dSGagandeep Singh /** @brief Request to SEC kernel driver to disable interrupts for descriptor
286a5e1018dSGagandeep Singh * finished processing
287a5e1018dSGagandeep Singh * Use UIO to communicate with SEC kernel driver: write command
288a5e1018dSGagandeep Singh * value that indicates an IRQ disable action into UIO file descriptor
289a5e1018dSGagandeep Singh * of this job ring.
290a5e1018dSGagandeep Singh *
291*7be78d02SJosh Soref * @param [in] uio_fd UIO File descriptor
292a5e1018dSGagandeep Singh * @retval 0 for success
293a5e1018dSGagandeep Singh * @retval -1 value for error
294a5e1018dSGagandeep Singh *
295a5e1018dSGagandeep Singh */
296c40b4fcdSYunjian Wang int caam_jr_disable_irqs(int uio_fd);
297a5e1018dSGagandeep Singh
298a5e1018dSGagandeep Singh #endif
299