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