/* SPDX-License-Identifier: BSD-3-Clause * Copyright 2017-2018 NXP */ #ifndef CAAM_JR_DESC_H #define CAAM_JR_DESC_H #define CMD_HDR_CTYPE_SD 0x16 #define CMD_HDR_CTYPE_JD 0x17 /* The maximum size of a SEC descriptor, in WORDs (32 bits). */ #define MAX_DESC_SIZE_WORDS 64 /* * Macros manipulating descriptors */ /* Macro for setting the SD pointer in a JD. Common for all protocols * supported by the SEC driver. */ #define SEC_JD_SET_SD(descriptor, ptr, len) { \ (descriptor)->sd_ptr = (ptr); \ (descriptor)->deschdr.command.jd.shr_desc_len = (len); \ } /* Macro for setting a pointer to the job which this descriptor processes. * It eases the lookup procedure for identifying the descriptor that has * completed. */ #define SEC_JD_SET_JOB_PTR(descriptor, ptr) \ ((descriptor)->job_ptr = (ptr)) /* Macro for setting up a JD. The structure of the JD is common across all * supported protocols, thus its structure is identical. */ #define SEC_JD_INIT(descriptor) ({ \ /* CTYPE = job descriptor \ * RSMS, DNR = 0 * ONE = 1 * Start Index = 0 * ZRO,TD, MTD = 0 * SHR = 1 (there's a shared descriptor referenced * by this job descriptor,pointer in next word) * REO = 1 (execute job descr. first, shared descriptor * after) * SHARE = DEFER * Descriptor Length = 0 ( to be completed @ runtime ) */ \ (descriptor)->deschdr.command.word = 0xB0801C0D; \ /* * CTYPE = SEQ OUT command * Scater Gather Flag = 0 * (can be updated @ runtime) PRE = 0 * EXT = 1 * (data length is in next word, following the * command) * RTO = 0 */ \ (descriptor)->seq_out.command.word = 0xF8400000; /**/ \ /* * CTYPE = SEQ IN command * Scater Gather Flag = 0 (can be updated @ runtime) * PRE = 0 * EXT = 1 ( data length is in next word, following the * command) * RTO = 0 */ \ (descriptor)->seq_in.command.word = 0xF0400000; /**/ \ /* * In order to be compatible with QI scenarios, the DPOVRD value * loaded must be formated like this: * DPOVRD_EN (1b) | Res| DPOVRD Value (right aligned). */ \ (descriptor)->load_dpovrd.command.word = 0x16870004; \ /* By default, DPOVRD mechanism is disabled, thus the value to be * LOAD-ed through the above descriptor command will be * 0x0000_0000. */ \ (descriptor)->dpovrd = 0x00000000; \ }) /* Macro for setting the pointer to the input buffer in the JD, according to * the parameters set by the user in the ::sec_packet_t structure. */ #define SEC_JD_SET_IN_PTR(descriptor, phys_addr, offset, length) { \ (descriptor)->seq_in_ptr = (phys_addr) + (offset); \ (descriptor)->in_ext_length = (length); \ } /* Macro for setting the pointer to the output buffer in the JD, according to * the parameters set by the user in the ::sec_packet_t structure. */ #define SEC_JD_SET_OUT_PTR(descriptor, phys_addr, offset, length) { \ (descriptor)->seq_out_ptr = (phys_addr) + (offset); \ (descriptor)->out_ext_length = (length); \ } /* Macro for setting the Scatter-Gather flag in the SEQ IN command. Used in * case the input buffer is split in multiple buffers, according to the user * specification. */ #define SEC_JD_SET_SG_IN(descriptor) \ ((descriptor)->seq_in.command.field.sgf = 1) /* Macro for setting the Scatter-Gather flag in the SEQ OUT command. Used in * case the output buffer is split in multiple buffers, according to the user * specification. */ #define SEC_JD_SET_SG_OUT(descriptor) \ ((descriptor)->seq_out.command.field.sgf = 1) #define SEC_JD_SET_DPOVRD(descriptor) \ /* Macro for retrieving a descriptor's length. Works for both SD and JD. */ #define SEC_GET_DESC_LEN(descriptor) \ (((struct descriptor_header_s *)(descriptor))->command.sd.ctype == \ CMD_HDR_CTYPE_SD ? ((struct descriptor_header_s *) \ (descriptor))->command.sd.desclen : \ ((struct descriptor_header_s *)(descriptor))->command.jd.desclen) /* Helper macro for dumping the hex representation of a descriptor */ #define SEC_DUMP_DESC(descriptor) { \ int __i; \ CAAM_JR_INFO("Des@ 0x%08x\n", (uint32_t)((uint32_t *)(descriptor)));\ for (__i = 0; \ __i < SEC_GET_DESC_LEN(descriptor); \ __i++) { \ printf("0x%08x: 0x%08x\n", \ (uint32_t)(((uint32_t *)(descriptor)) + __i), \ *(((uint32_t *)(descriptor)) + __i)); \ } \ } /* Union describing a descriptor header. */ struct descriptor_header_s { union { uint32_t word; struct { /* 4 */ unsigned int ctype:5; /* 5 */ unsigned int res1:2; /* 7 */ unsigned int dnr:1; /* 8 */ unsigned int one:1; /* 9 */ unsigned int res2:1; /* 10 */ unsigned int start_idx:6; /* 16 */ unsigned int res3:2; /* 18 */ unsigned int cif:1; /* 19 */ unsigned int sc:1; /* 20 */ unsigned int pd:1; /* 21 */ unsigned int res4:1; /* 22 */ unsigned int share:2; /* 24 */ unsigned int res5:2; /* 26 */ unsigned int desclen:6; } sd; struct { /* TODO only below struct members are corrected, * all others also need to be reversed please verify it */ /* 0 */ unsigned int desclen:7; /* 7 */ unsigned int res4:1; /* 8 */ unsigned int share:3; /* 11 */ unsigned int reo:1; /* 12 */ unsigned int shr:1; /* 13 */ unsigned int mtd:1; /* 14 */ unsigned int td:1; /* 15 */ unsigned int zero:1; /* 16 */ unsigned int shr_desc_len:6; /* 22 */ unsigned int res2:1; /* 23 */ unsigned int one:1; /* 24 */ unsigned int dnr:1; /* 25 */ unsigned int rsms:1; /* 26 */ unsigned int res1:1; /* 27 */ unsigned int ctype:5; } jd; } __rte_packed command; } __rte_packed; /* Union describing a KEY command in a descriptor. */ struct key_command_s { union { uint32_t word; struct { unsigned int ctype:5; unsigned int cls:2; unsigned int sgf:1; unsigned int imm:1; unsigned int enc:1; unsigned int nwb:1; unsigned int ekt:1; unsigned int kdest:4; unsigned int tk:1; unsigned int rsvd1:5; unsigned int length:10; } __rte_packed field; } __rte_packed command; } __rte_packed; /* Union describing a PROTOCOL command * in a descriptor. */ struct protocol_operation_command_s { union { uint32_t word; struct { unsigned int ctype:5; unsigned int optype:3; unsigned char protid; unsigned short protinfo; } __rte_packed field; } __rte_packed command; } __rte_packed; /* Union describing a SEQIN command in a * descriptor. */ struct seq_in_command_s { union { uint32_t word; struct { unsigned int ctype:5; unsigned int res1:1; unsigned int inl:1; unsigned int sgf:1; unsigned int pre:1; unsigned int ext:1; unsigned int rto:1; unsigned int rjd:1; unsigned int res2:4; unsigned int length:16; } field; } __rte_packed command; } __rte_packed; /* Union describing a SEQOUT command in a * descriptor. */ struct seq_out_command_s { union { uint32_t word; struct { unsigned int ctype:5; unsigned int res1:2; unsigned int sgf:1; unsigned int pre:1; unsigned int ext:1; unsigned int rto:1; unsigned int res2:5; unsigned int length:16; } field; } __rte_packed command; } __rte_packed; struct load_command_s { union { uint32_t word; struct { unsigned int ctype:5; unsigned int class:2; unsigned int sgf:1; unsigned int imm:1; unsigned int dst:7; unsigned char offset; unsigned char length; } fields; } __rte_packed command; } __rte_packed; /* Structure encompassing a general shared descriptor of maximum * size (64 WORDs). Usually, other specific shared descriptor structures * will be type-casted to this one * this one. */ struct sec_sd_t { uint32_t rsvd[MAX_DESC_SIZE_WORDS]; } __attribute__((packed, aligned(64))); /* Structure encompassing a job descriptor which processes * a single packet from a context. The job descriptor references * a shared descriptor from a SEC context. */ struct sec_job_descriptor_t { struct descriptor_header_s deschdr; dma_addr_t sd_ptr; struct seq_out_command_s seq_out; dma_addr_t seq_out_ptr; uint32_t out_ext_length; struct seq_in_command_s seq_in; dma_addr_t seq_in_ptr; uint32_t in_ext_length; struct load_command_s load_dpovrd; uint32_t dpovrd; } __attribute__((packed, aligned(64))); #endif