0001
0002
0003
0004
0005
0006 #ifndef __REQUEST_MANAGER_H
0007 #define __REQUEST_MANAGER_H
0008
0009 #include "cpt_common.h"
0010
0011 #define TIME_IN_RESET_COUNT 5
0012 #define COMPLETION_CODE_SIZE 8
0013 #define COMPLETION_CODE_INIT 0
0014 #define PENDING_THOLD 100
0015 #define MAX_SG_IN_CNT 12
0016 #define MAX_SG_OUT_CNT 13
0017 #define SG_LIST_HDR_SIZE 8
0018 #define MAX_BUF_CNT 16
0019
0020 union ctrl_info {
0021 u32 flags;
0022 struct {
0023 #if defined(__BIG_ENDIAN_BITFIELD)
0024 u32 reserved0:26;
0025 u32 grp:3;
0026 u32 dma_mode:2;
0027 u32 se_req:1;
0028 #else
0029 u32 se_req:1;
0030 u32 dma_mode:2;
0031 u32 grp:3;
0032 u32 reserved0:26;
0033 #endif
0034 } s;
0035 };
0036
0037 union opcode_info {
0038 u16 flags;
0039 struct {
0040 u8 major;
0041 u8 minor;
0042 } s;
0043 };
0044
0045 struct cptvf_request {
0046 union opcode_info opcode;
0047 u16 param1;
0048 u16 param2;
0049 u16 dlen;
0050 };
0051
0052 struct buf_ptr {
0053 u8 *vptr;
0054 dma_addr_t dma_addr;
0055 u16 size;
0056 };
0057
0058 struct cpt_request_info {
0059 u8 incnt;
0060 u8 outcnt;
0061 u16 rlen;
0062 union ctrl_info ctrl;
0063 struct cptvf_request req;
0064
0065 bool may_sleep;
0066
0067 struct buf_ptr in[MAX_BUF_CNT];
0068 struct buf_ptr out[MAX_BUF_CNT];
0069
0070 void (*callback)(int, void *);
0071 void *callback_arg;
0072 };
0073
0074 struct sglist_component {
0075 union {
0076 u64 len;
0077 struct {
0078 __be16 len0;
0079 __be16 len1;
0080 __be16 len2;
0081 __be16 len3;
0082 } s;
0083 } u;
0084 __be64 ptr0;
0085 __be64 ptr1;
0086 __be64 ptr2;
0087 __be64 ptr3;
0088 };
0089
0090 struct cpt_info_buffer {
0091 struct cpt_vf *cptvf;
0092 unsigned long time_in;
0093 u8 extra_time;
0094
0095 struct cpt_request_info *req;
0096 dma_addr_t dptr_baddr;
0097 u32 dlen;
0098 dma_addr_t rptr_baddr;
0099 dma_addr_t comp_baddr;
0100 u8 *in_buffer;
0101 u8 *out_buffer;
0102 u8 *gather_components;
0103 u8 *scatter_components;
0104
0105 struct pending_entry *pentry;
0106 volatile u64 *completion_addr;
0107 volatile u64 *alternate_caddr;
0108 };
0109
0110
0111
0112
0113
0114 union vq_cmd_word0 {
0115 u64 u64;
0116 struct {
0117 __be16 opcode;
0118 __be16 param1;
0119 __be16 param2;
0120 __be16 dlen;
0121 } s;
0122 };
0123
0124 union vq_cmd_word3 {
0125 u64 u64;
0126 struct {
0127 #if defined(__BIG_ENDIAN_BITFIELD)
0128 u64 grp:3;
0129 u64 cptr:61;
0130 #else
0131 u64 cptr:61;
0132 u64 grp:3;
0133 #endif
0134 } s;
0135 };
0136
0137 struct cpt_vq_command {
0138 union vq_cmd_word0 cmd;
0139 u64 dptr;
0140 u64 rptr;
0141 union vq_cmd_word3 cptr;
0142 };
0143
0144 void vq_post_process(struct cpt_vf *cptvf, u32 qno);
0145 int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req);
0146 #endif