16ef6becaSGagandeep Singh /* SPDX-License-Identifier: BSD-3-Clause 26ef6becaSGagandeep Singh * Copyright 2017-2018 NXP 36ef6becaSGagandeep Singh */ 46ef6becaSGagandeep Singh 56ef6becaSGagandeep Singh #ifndef CAAM_JR_DESC_H 66ef6becaSGagandeep Singh #define CAAM_JR_DESC_H 76ef6becaSGagandeep Singh 86ef6becaSGagandeep Singh #define CMD_HDR_CTYPE_SD 0x16 96ef6becaSGagandeep Singh #define CMD_HDR_CTYPE_JD 0x17 106ef6becaSGagandeep Singh 116ef6becaSGagandeep Singh /* The maximum size of a SEC descriptor, in WORDs (32 bits). */ 126ef6becaSGagandeep Singh #define MAX_DESC_SIZE_WORDS 64 136ef6becaSGagandeep Singh 146ef6becaSGagandeep Singh /* 156ef6becaSGagandeep Singh * Macros manipulating descriptors 166ef6becaSGagandeep Singh */ 176ef6becaSGagandeep Singh /* Macro for setting the SD pointer in a JD. Common for all protocols 186ef6becaSGagandeep Singh * supported by the SEC driver. 196ef6becaSGagandeep Singh */ 206ef6becaSGagandeep Singh #define SEC_JD_SET_SD(descriptor, ptr, len) { \ 216ef6becaSGagandeep Singh (descriptor)->sd_ptr = (ptr); \ 226ef6becaSGagandeep Singh (descriptor)->deschdr.command.jd.shr_desc_len = (len); \ 236ef6becaSGagandeep Singh } 246ef6becaSGagandeep Singh 256ef6becaSGagandeep Singh /* Macro for setting a pointer to the job which this descriptor processes. 266ef6becaSGagandeep Singh * It eases the lookup procedure for identifying the descriptor that has 276ef6becaSGagandeep Singh * completed. 286ef6becaSGagandeep Singh */ 296ef6becaSGagandeep Singh #define SEC_JD_SET_JOB_PTR(descriptor, ptr) \ 306ef6becaSGagandeep Singh ((descriptor)->job_ptr = (ptr)) 316ef6becaSGagandeep Singh 326ef6becaSGagandeep Singh /* Macro for setting up a JD. The structure of the JD is common across all 336ef6becaSGagandeep Singh * supported protocols, thus its structure is identical. 346ef6becaSGagandeep Singh */ 3593998f3cSTyler Retzlaff #define SEC_JD_INIT(descriptor) __extension__ ({ \ 366ef6becaSGagandeep Singh /* CTYPE = job descriptor \ 376ef6becaSGagandeep Singh * RSMS, DNR = 0 386ef6becaSGagandeep Singh * ONE = 1 396ef6becaSGagandeep Singh * Start Index = 0 406ef6becaSGagandeep Singh * ZRO,TD, MTD = 0 416ef6becaSGagandeep Singh * SHR = 1 (there's a shared descriptor referenced 426ef6becaSGagandeep Singh * by this job descriptor,pointer in next word) 436ef6becaSGagandeep Singh * REO = 1 (execute job descr. first, shared descriptor 446ef6becaSGagandeep Singh * after) 456ef6becaSGagandeep Singh * SHARE = DEFER 466ef6becaSGagandeep Singh * Descriptor Length = 0 ( to be completed @ runtime ) */ \ 476ef6becaSGagandeep Singh (descriptor)->deschdr.command.word = 0xB0801C0D; \ 486ef6becaSGagandeep Singh /* 496ef6becaSGagandeep Singh * CTYPE = SEQ OUT command * Scater Gather Flag = 0 506ef6becaSGagandeep Singh * (can be updated @ runtime) PRE = 0 * EXT = 1 516ef6becaSGagandeep Singh * (data length is in next word, following the * command) 526ef6becaSGagandeep Singh * RTO = 0 */ \ 536ef6becaSGagandeep Singh (descriptor)->seq_out.command.word = 0xF8400000; /**/ \ 546ef6becaSGagandeep Singh /* 556ef6becaSGagandeep Singh * CTYPE = SEQ IN command 566ef6becaSGagandeep Singh * Scater Gather Flag = 0 (can be updated @ runtime) 576ef6becaSGagandeep Singh * PRE = 0 586ef6becaSGagandeep Singh * EXT = 1 ( data length is in next word, following the 596ef6becaSGagandeep Singh * command) 606ef6becaSGagandeep Singh * RTO = 0 */ \ 616ef6becaSGagandeep Singh (descriptor)->seq_in.command.word = 0xF0400000; /**/ \ 626ef6becaSGagandeep Singh /* 636ef6becaSGagandeep Singh * In order to be compatible with QI scenarios, the DPOVRD value 646ef6becaSGagandeep Singh * loaded must be formated like this: 656ef6becaSGagandeep Singh * DPOVRD_EN (1b) | Res| DPOVRD Value (right aligned). */ \ 666ef6becaSGagandeep Singh (descriptor)->load_dpovrd.command.word = 0x16870004; \ 676ef6becaSGagandeep Singh /* By default, DPOVRD mechanism is disabled, thus the value to be 686ef6becaSGagandeep Singh * LOAD-ed through the above descriptor command will be 696ef6becaSGagandeep Singh * 0x0000_0000. */ \ 706ef6becaSGagandeep Singh (descriptor)->dpovrd = 0x00000000; \ 716ef6becaSGagandeep Singh }) 726ef6becaSGagandeep Singh 736ef6becaSGagandeep Singh /* Macro for setting the pointer to the input buffer in the JD, according to 746ef6becaSGagandeep Singh * the parameters set by the user in the ::sec_packet_t structure. 756ef6becaSGagandeep Singh */ 766ef6becaSGagandeep Singh #define SEC_JD_SET_IN_PTR(descriptor, phys_addr, offset, length) { \ 776ef6becaSGagandeep Singh (descriptor)->seq_in_ptr = (phys_addr) + (offset); \ 786ef6becaSGagandeep Singh (descriptor)->in_ext_length = (length); \ 796ef6becaSGagandeep Singh } 806ef6becaSGagandeep Singh 816ef6becaSGagandeep Singh /* Macro for setting the pointer to the output buffer in the JD, according to 826ef6becaSGagandeep Singh * the parameters set by the user in the ::sec_packet_t structure. 836ef6becaSGagandeep Singh */ 846ef6becaSGagandeep Singh #define SEC_JD_SET_OUT_PTR(descriptor, phys_addr, offset, length) { \ 856ef6becaSGagandeep Singh (descriptor)->seq_out_ptr = (phys_addr) + (offset); \ 866ef6becaSGagandeep Singh (descriptor)->out_ext_length = (length); \ 876ef6becaSGagandeep Singh } 886ef6becaSGagandeep Singh 896ef6becaSGagandeep Singh /* Macro for setting the Scatter-Gather flag in the SEQ IN command. Used in 906ef6becaSGagandeep Singh * case the input buffer is split in multiple buffers, according to the user 916ef6becaSGagandeep Singh * specification. 926ef6becaSGagandeep Singh */ 936ef6becaSGagandeep Singh #define SEC_JD_SET_SG_IN(descriptor) \ 946ef6becaSGagandeep Singh ((descriptor)->seq_in.command.field.sgf = 1) 956ef6becaSGagandeep Singh 966ef6becaSGagandeep Singh /* Macro for setting the Scatter-Gather flag in the SEQ OUT command. Used in 976ef6becaSGagandeep Singh * case the output buffer is split in multiple buffers, according to the user 986ef6becaSGagandeep Singh * specification. 996ef6becaSGagandeep Singh */ 1006ef6becaSGagandeep Singh #define SEC_JD_SET_SG_OUT(descriptor) \ 1016ef6becaSGagandeep Singh ((descriptor)->seq_out.command.field.sgf = 1) 1026ef6becaSGagandeep Singh 1036ef6becaSGagandeep Singh #define SEC_JD_SET_DPOVRD(descriptor) \ 1046ef6becaSGagandeep Singh 1056ef6becaSGagandeep Singh /* Macro for retrieving a descriptor's length. Works for both SD and JD. */ 1066ef6becaSGagandeep Singh #define SEC_GET_DESC_LEN(descriptor) \ 1076ef6becaSGagandeep Singh (((struct descriptor_header_s *)(descriptor))->command.sd.ctype == \ 1086ef6becaSGagandeep Singh CMD_HDR_CTYPE_SD ? ((struct descriptor_header_s *) \ 1096ef6becaSGagandeep Singh (descriptor))->command.sd.desclen : \ 1106ef6becaSGagandeep Singh ((struct descriptor_header_s *)(descriptor))->command.jd.desclen) 1116ef6becaSGagandeep Singh 1126ef6becaSGagandeep Singh /* Helper macro for dumping the hex representation of a descriptor */ 113a8794e39SHemant Agrawal #define SEC_DUMP_DESC(descriptor, f) { \ 1146ef6becaSGagandeep Singh int __i; \ 1156ef6becaSGagandeep Singh CAAM_JR_INFO("Des@ 0x%08x\n", (uint32_t)((uint32_t *)(descriptor)));\ 1166ef6becaSGagandeep Singh for (__i = 0; \ 1176ef6becaSGagandeep Singh __i < SEC_GET_DESC_LEN(descriptor); \ 1186ef6becaSGagandeep Singh __i++) { \ 119a8794e39SHemant Agrawal fprintf(f, "0x%08x: 0x%08x\n", \ 1206ef6becaSGagandeep Singh (uint32_t)(((uint32_t *)(descriptor)) + __i), \ 1216ef6becaSGagandeep Singh *(((uint32_t *)(descriptor)) + __i)); \ 1226ef6becaSGagandeep Singh } \ 1236ef6becaSGagandeep Singh } 1246ef6becaSGagandeep Singh /* Union describing a descriptor header. 1256ef6becaSGagandeep Singh */ 126*e7750639SAndre Muezerie struct __rte_packed_begin descriptor_header_s { 127*e7750639SAndre Muezerie union __rte_packed_begin { 1286ef6becaSGagandeep Singh uint32_t word; 1296ef6becaSGagandeep Singh struct { 1306ef6becaSGagandeep Singh /* 4 */ unsigned int ctype:5; 1316ef6becaSGagandeep Singh /* 5 */ unsigned int res1:2; 1326ef6becaSGagandeep Singh /* 7 */ unsigned int dnr:1; 1336ef6becaSGagandeep Singh /* 8 */ unsigned int one:1; 1346ef6becaSGagandeep Singh /* 9 */ unsigned int res2:1; 1356ef6becaSGagandeep Singh /* 10 */ unsigned int start_idx:6; 1366ef6becaSGagandeep Singh /* 16 */ unsigned int res3:2; 1376ef6becaSGagandeep Singh /* 18 */ unsigned int cif:1; 1386ef6becaSGagandeep Singh /* 19 */ unsigned int sc:1; 1396ef6becaSGagandeep Singh /* 20 */ unsigned int pd:1; 1406ef6becaSGagandeep Singh /* 21 */ unsigned int res4:1; 1416ef6becaSGagandeep Singh /* 22 */ unsigned int share:2; 1426ef6becaSGagandeep Singh /* 24 */ unsigned int res5:2; 1436ef6becaSGagandeep Singh /* 26 */ unsigned int desclen:6; 1446ef6becaSGagandeep Singh } sd; 1456ef6becaSGagandeep Singh struct { 1466ef6becaSGagandeep Singh /* TODO only below struct members are corrected, 1476ef6becaSGagandeep Singh * all others also need to be reversed please verify it 1486ef6becaSGagandeep Singh */ 1496ef6becaSGagandeep Singh /* 0 */ unsigned int desclen:7; 1506ef6becaSGagandeep Singh /* 7 */ unsigned int res4:1; 1516ef6becaSGagandeep Singh /* 8 */ unsigned int share:3; 1526ef6becaSGagandeep Singh /* 11 */ unsigned int reo:1; 1536ef6becaSGagandeep Singh /* 12 */ unsigned int shr:1; 1546ef6becaSGagandeep Singh /* 13 */ unsigned int mtd:1; 1556ef6becaSGagandeep Singh /* 14 */ unsigned int td:1; 1566ef6becaSGagandeep Singh /* 15 */ unsigned int zero:1; 1576ef6becaSGagandeep Singh /* 16 */ unsigned int shr_desc_len:6; 1586ef6becaSGagandeep Singh /* 22 */ unsigned int res2:1; 1596ef6becaSGagandeep Singh /* 23 */ unsigned int one:1; 1606ef6becaSGagandeep Singh /* 24 */ unsigned int dnr:1; 1616ef6becaSGagandeep Singh /* 25 */ unsigned int rsms:1; 1626ef6becaSGagandeep Singh /* 26 */ unsigned int res1:1; 1636ef6becaSGagandeep Singh /* 27 */ unsigned int ctype:5; 1646ef6becaSGagandeep Singh } jd; 165*e7750639SAndre Muezerie } __rte_packed_end command; 166*e7750639SAndre Muezerie } __rte_packed_end; 1676ef6becaSGagandeep Singh 1686ef6becaSGagandeep Singh /* Union describing a KEY command in a descriptor. 1696ef6becaSGagandeep Singh */ 170*e7750639SAndre Muezerie struct __rte_packed_begin key_command_s { 171*e7750639SAndre Muezerie union __rte_packed_begin { 1726ef6becaSGagandeep Singh uint32_t word; 173*e7750639SAndre Muezerie struct __rte_packed_begin { 1746ef6becaSGagandeep Singh unsigned int ctype:5; 1756ef6becaSGagandeep Singh unsigned int cls:2; 1766ef6becaSGagandeep Singh unsigned int sgf:1; 1776ef6becaSGagandeep Singh unsigned int imm:1; 1786ef6becaSGagandeep Singh unsigned int enc:1; 1796ef6becaSGagandeep Singh unsigned int nwb:1; 1806ef6becaSGagandeep Singh unsigned int ekt:1; 1816ef6becaSGagandeep Singh unsigned int kdest:4; 1826ef6becaSGagandeep Singh unsigned int tk:1; 1836ef6becaSGagandeep Singh unsigned int rsvd1:5; 1846ef6becaSGagandeep Singh unsigned int length:10; 185*e7750639SAndre Muezerie } __rte_packed_end field; 186*e7750639SAndre Muezerie } __rte_packed_end command; 187*e7750639SAndre Muezerie } __rte_packed_end; 1886ef6becaSGagandeep Singh 1896ef6becaSGagandeep Singh /* Union describing a PROTOCOL command 1906ef6becaSGagandeep Singh * in a descriptor. 1916ef6becaSGagandeep Singh */ 192*e7750639SAndre Muezerie struct __rte_packed_begin protocol_operation_command_s { 193*e7750639SAndre Muezerie union __rte_packed_begin { 1946ef6becaSGagandeep Singh uint32_t word; 195*e7750639SAndre Muezerie struct __rte_packed_begin { 1966ef6becaSGagandeep Singh unsigned int ctype:5; 1976ef6becaSGagandeep Singh unsigned int optype:3; 1986ef6becaSGagandeep Singh unsigned char protid; 1996ef6becaSGagandeep Singh unsigned short protinfo; 200*e7750639SAndre Muezerie } __rte_packed_end field; 201*e7750639SAndre Muezerie } __rte_packed_end command; 202*e7750639SAndre Muezerie } __rte_packed_end; 2036ef6becaSGagandeep Singh 2046ef6becaSGagandeep Singh /* Union describing a SEQIN command in a 2056ef6becaSGagandeep Singh * descriptor. 2066ef6becaSGagandeep Singh */ 207*e7750639SAndre Muezerie struct __rte_packed_begin seq_in_command_s { 208*e7750639SAndre Muezerie union __rte_packed_begin { 2096ef6becaSGagandeep Singh uint32_t word; 2106ef6becaSGagandeep Singh struct { 2116ef6becaSGagandeep Singh unsigned int ctype:5; 2126ef6becaSGagandeep Singh unsigned int res1:1; 2136ef6becaSGagandeep Singh unsigned int inl:1; 2146ef6becaSGagandeep Singh unsigned int sgf:1; 2156ef6becaSGagandeep Singh unsigned int pre:1; 2166ef6becaSGagandeep Singh unsigned int ext:1; 2176ef6becaSGagandeep Singh unsigned int rto:1; 2186ef6becaSGagandeep Singh unsigned int rjd:1; 2196ef6becaSGagandeep Singh unsigned int res2:4; 2206ef6becaSGagandeep Singh unsigned int length:16; 2216ef6becaSGagandeep Singh } field; 222*e7750639SAndre Muezerie } __rte_packed_end command; 223*e7750639SAndre Muezerie } __rte_packed_end; 2246ef6becaSGagandeep Singh 2256ef6becaSGagandeep Singh /* Union describing a SEQOUT command in a 2266ef6becaSGagandeep Singh * descriptor. 2276ef6becaSGagandeep Singh */ 228*e7750639SAndre Muezerie struct __rte_packed_begin seq_out_command_s { 229*e7750639SAndre Muezerie union __rte_packed_begin { 2306ef6becaSGagandeep Singh uint32_t word; 2316ef6becaSGagandeep Singh struct { 2326ef6becaSGagandeep Singh unsigned int ctype:5; 2336ef6becaSGagandeep Singh unsigned int res1:2; 2346ef6becaSGagandeep Singh unsigned int sgf:1; 2356ef6becaSGagandeep Singh unsigned int pre:1; 2366ef6becaSGagandeep Singh unsigned int ext:1; 2376ef6becaSGagandeep Singh unsigned int rto:1; 2386ef6becaSGagandeep Singh unsigned int res2:5; 2396ef6becaSGagandeep Singh unsigned int length:16; 2406ef6becaSGagandeep Singh } field; 241*e7750639SAndre Muezerie } __rte_packed_end command; 242*e7750639SAndre Muezerie } __rte_packed_end; 2436ef6becaSGagandeep Singh 244*e7750639SAndre Muezerie struct __rte_packed_begin load_command_s { 245*e7750639SAndre Muezerie union __rte_packed_begin { 2466ef6becaSGagandeep Singh uint32_t word; 2476ef6becaSGagandeep Singh struct { 2486ef6becaSGagandeep Singh unsigned int ctype:5; 2496ef6becaSGagandeep Singh unsigned int class:2; 2506ef6becaSGagandeep Singh unsigned int sgf:1; 2516ef6becaSGagandeep Singh unsigned int imm:1; 2526ef6becaSGagandeep Singh unsigned int dst:7; 2536ef6becaSGagandeep Singh unsigned char offset; 2546ef6becaSGagandeep Singh unsigned char length; 2556ef6becaSGagandeep Singh } fields; 256*e7750639SAndre Muezerie } __rte_packed_end command; 257*e7750639SAndre Muezerie } __rte_packed_end; 2586ef6becaSGagandeep Singh 2596ef6becaSGagandeep Singh /* Structure encompassing a general shared descriptor of maximum 2606ef6becaSGagandeep Singh * size (64 WORDs). Usually, other specific shared descriptor structures 2616ef6becaSGagandeep Singh * will be type-casted to this one 2626ef6becaSGagandeep Singh * this one. 2636ef6becaSGagandeep Singh */ 264*e7750639SAndre Muezerie struct __rte_aligned(64) __rte_packed_begin sec_sd_t { 2656ef6becaSGagandeep Singh uint32_t rsvd[MAX_DESC_SIZE_WORDS]; 266*e7750639SAndre Muezerie } __rte_packed_end; 2676ef6becaSGagandeep Singh 2686ef6becaSGagandeep Singh /* Structure encompassing a job descriptor which processes 2696ef6becaSGagandeep Singh * a single packet from a context. The job descriptor references 2706ef6becaSGagandeep Singh * a shared descriptor from a SEC context. 2716ef6becaSGagandeep Singh */ 272*e7750639SAndre Muezerie struct __rte_aligned(64) __rte_packed_begin sec_job_descriptor_t { 2736ef6becaSGagandeep Singh struct descriptor_header_s deschdr; 2746ef6becaSGagandeep Singh dma_addr_t sd_ptr; 2756ef6becaSGagandeep Singh struct seq_out_command_s seq_out; 2766ef6becaSGagandeep Singh dma_addr_t seq_out_ptr; 2776ef6becaSGagandeep Singh uint32_t out_ext_length; 2786ef6becaSGagandeep Singh struct seq_in_command_s seq_in; 2796ef6becaSGagandeep Singh dma_addr_t seq_in_ptr; 2806ef6becaSGagandeep Singh uint32_t in_ext_length; 2816ef6becaSGagandeep Singh struct load_command_s load_dpovrd; 2826ef6becaSGagandeep Singh uint32_t dpovrd; 283*e7750639SAndre Muezerie } __rte_packed_end; 2846ef6becaSGagandeep Singh 2856ef6becaSGagandeep Singh #endif 286