1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2016 Cavium, Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __REQUEST_MANAGER_H 7*4882a593Smuzhiyun #define __REQUEST_MANAGER_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "cpt_common.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define TIME_IN_RESET_COUNT 5 12*4882a593Smuzhiyun #define COMPLETION_CODE_SIZE 8 13*4882a593Smuzhiyun #define COMPLETION_CODE_INIT 0 14*4882a593Smuzhiyun #define PENDING_THOLD 100 15*4882a593Smuzhiyun #define MAX_SG_IN_CNT 12 16*4882a593Smuzhiyun #define MAX_SG_OUT_CNT 13 17*4882a593Smuzhiyun #define SG_LIST_HDR_SIZE 8 18*4882a593Smuzhiyun #define MAX_BUF_CNT 16 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun union ctrl_info { 21*4882a593Smuzhiyun u32 flags; 22*4882a593Smuzhiyun struct { 23*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 24*4882a593Smuzhiyun u32 reserved0:26; 25*4882a593Smuzhiyun u32 grp:3; /* Group bits */ 26*4882a593Smuzhiyun u32 dma_mode:2; /* DMA mode */ 27*4882a593Smuzhiyun u32 se_req:1;/* To SE core */ 28*4882a593Smuzhiyun #else 29*4882a593Smuzhiyun u32 se_req:1; /* To SE core */ 30*4882a593Smuzhiyun u32 dma_mode:2; /* DMA mode */ 31*4882a593Smuzhiyun u32 grp:3; /* Group bits */ 32*4882a593Smuzhiyun u32 reserved0:26; 33*4882a593Smuzhiyun #endif 34*4882a593Smuzhiyun } s; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun union opcode_info { 38*4882a593Smuzhiyun u16 flags; 39*4882a593Smuzhiyun struct { 40*4882a593Smuzhiyun u8 major; 41*4882a593Smuzhiyun u8 minor; 42*4882a593Smuzhiyun } s; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct cptvf_request { 46*4882a593Smuzhiyun union opcode_info opcode; 47*4882a593Smuzhiyun u16 param1; 48*4882a593Smuzhiyun u16 param2; 49*4882a593Smuzhiyun u16 dlen; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct buf_ptr { 53*4882a593Smuzhiyun u8 *vptr; 54*4882a593Smuzhiyun dma_addr_t dma_addr; 55*4882a593Smuzhiyun u16 size; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct cpt_request_info { 59*4882a593Smuzhiyun u8 incnt; /* Number of input buffers */ 60*4882a593Smuzhiyun u8 outcnt; /* Number of output buffers */ 61*4882a593Smuzhiyun u16 rlen; /* Output length */ 62*4882a593Smuzhiyun union ctrl_info ctrl; /* User control information */ 63*4882a593Smuzhiyun struct cptvf_request req; /* Request Information (Core specific) */ 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun bool may_sleep; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct buf_ptr in[MAX_BUF_CNT]; 68*4882a593Smuzhiyun struct buf_ptr out[MAX_BUF_CNT]; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun void (*callback)(int, void *); /* Kernel ASYNC request callabck */ 71*4882a593Smuzhiyun void *callback_arg; /* Kernel ASYNC request callabck arg */ 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct sglist_component { 75*4882a593Smuzhiyun union { 76*4882a593Smuzhiyun u64 len; 77*4882a593Smuzhiyun struct { 78*4882a593Smuzhiyun __be16 len0; 79*4882a593Smuzhiyun __be16 len1; 80*4882a593Smuzhiyun __be16 len2; 81*4882a593Smuzhiyun __be16 len3; 82*4882a593Smuzhiyun } s; 83*4882a593Smuzhiyun } u; 84*4882a593Smuzhiyun __be64 ptr0; 85*4882a593Smuzhiyun __be64 ptr1; 86*4882a593Smuzhiyun __be64 ptr2; 87*4882a593Smuzhiyun __be64 ptr3; 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct cpt_info_buffer { 91*4882a593Smuzhiyun struct cpt_vf *cptvf; 92*4882a593Smuzhiyun unsigned long time_in; 93*4882a593Smuzhiyun u8 extra_time; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct cpt_request_info *req; 96*4882a593Smuzhiyun dma_addr_t dptr_baddr; 97*4882a593Smuzhiyun u32 dlen; 98*4882a593Smuzhiyun dma_addr_t rptr_baddr; 99*4882a593Smuzhiyun dma_addr_t comp_baddr; 100*4882a593Smuzhiyun u8 *in_buffer; 101*4882a593Smuzhiyun u8 *out_buffer; 102*4882a593Smuzhiyun u8 *gather_components; 103*4882a593Smuzhiyun u8 *scatter_components; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct pending_entry *pentry; 106*4882a593Smuzhiyun volatile u64 *completion_addr; 107*4882a593Smuzhiyun volatile u64 *alternate_caddr; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * CPT_INST_S software command definitions 112*4882a593Smuzhiyun * Words EI (0-3) 113*4882a593Smuzhiyun */ 114*4882a593Smuzhiyun union vq_cmd_word0 { 115*4882a593Smuzhiyun u64 u64; 116*4882a593Smuzhiyun struct { 117*4882a593Smuzhiyun __be16 opcode; 118*4882a593Smuzhiyun __be16 param1; 119*4882a593Smuzhiyun __be16 param2; 120*4882a593Smuzhiyun __be16 dlen; 121*4882a593Smuzhiyun } s; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun union vq_cmd_word3 { 125*4882a593Smuzhiyun u64 u64; 126*4882a593Smuzhiyun struct { 127*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD) 128*4882a593Smuzhiyun u64 grp:3; 129*4882a593Smuzhiyun u64 cptr:61; 130*4882a593Smuzhiyun #else 131*4882a593Smuzhiyun u64 cptr:61; 132*4882a593Smuzhiyun u64 grp:3; 133*4882a593Smuzhiyun #endif 134*4882a593Smuzhiyun } s; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct cpt_vq_command { 138*4882a593Smuzhiyun union vq_cmd_word0 cmd; 139*4882a593Smuzhiyun u64 dptr; 140*4882a593Smuzhiyun u64 rptr; 141*4882a593Smuzhiyun union vq_cmd_word3 cptr; 142*4882a593Smuzhiyun }; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun void vq_post_process(struct cpt_vf *cptvf, u32 qno); 145*4882a593Smuzhiyun int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req); 146*4882a593Smuzhiyun #endif /* __REQUEST_MANAGER_H */ 147