150 lines
2.7 KiB
C
150 lines
2.7 KiB
C
|
/*
|
||
|
* Copyright (C) 2016 Cavium, Inc.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify it
|
||
|
* under the terms of version 2 of the GNU General Public License
|
||
|
* as published by the Free Software Foundation.
|
||
|
*/
|
||
|
|
||
|
#ifndef __REQUEST_MANAGER_H
|
||
|
#define __REQUEST_MANAGER_H
|
||
|
|
||
|
#include "cpt_common.h"
|
||
|
|
||
|
#define TIME_IN_RESET_COUNT 5
|
||
|
#define COMPLETION_CODE_SIZE 8
|
||
|
#define COMPLETION_CODE_INIT 0
|
||
|
#define PENDING_THOLD 100
|
||
|
#define MAX_SG_IN_CNT 12
|
||
|
#define MAX_SG_OUT_CNT 13
|
||
|
#define SG_LIST_HDR_SIZE 8
|
||
|
#define MAX_BUF_CNT 16
|
||
|
|
||
|
union ctrl_info {
|
||
|
u32 flags;
|
||
|
struct {
|
||
|
#if defined(__BIG_ENDIAN_BITFIELD)
|
||
|
u32 reserved0:26;
|
||
|
u32 grp:3; /* Group bits */
|
||
|
u32 dma_mode:2; /* DMA mode */
|
||
|
u32 se_req:1;/* To SE core */
|
||
|
#else
|
||
|
u32 se_req:1; /* To SE core */
|
||
|
u32 dma_mode:2; /* DMA mode */
|
||
|
u32 grp:3; /* Group bits */
|
||
|
u32 reserved0:26;
|
||
|
#endif
|
||
|
} s;
|
||
|
};
|
||
|
|
||
|
union opcode_info {
|
||
|
u16 flags;
|
||
|
struct {
|
||
|
u8 major;
|
||
|
u8 minor;
|
||
|
} s;
|
||
|
};
|
||
|
|
||
|
struct cptvf_request {
|
||
|
union opcode_info opcode;
|
||
|
u16 param1;
|
||
|
u16 param2;
|
||
|
u16 dlen;
|
||
|
};
|
||
|
|
||
|
struct buf_ptr {
|
||
|
u8 *vptr;
|
||
|
dma_addr_t dma_addr;
|
||
|
u16 size;
|
||
|
};
|
||
|
|
||
|
struct cpt_request_info {
|
||
|
u8 incnt; /* Number of input buffers */
|
||
|
u8 outcnt; /* Number of output buffers */
|
||
|
u16 rlen; /* Output length */
|
||
|
union ctrl_info ctrl; /* User control information */
|
||
|
struct cptvf_request req; /* Request Information (Core specific) */
|
||
|
|
||
|
bool may_sleep;
|
||
|
|
||
|
struct buf_ptr in[MAX_BUF_CNT];
|
||
|
struct buf_ptr out[MAX_BUF_CNT];
|
||
|
|
||
|
void (*callback)(int, void *); /* Kernel ASYNC request callabck */
|
||
|
void *callback_arg; /* Kernel ASYNC request callabck arg */
|
||
|
};
|
||
|
|
||
|
struct sglist_component {
|
||
|
union {
|
||
|
u64 len;
|
||
|
struct {
|
||
|
u16 len0;
|
||
|
u16 len1;
|
||
|
u16 len2;
|
||
|
u16 len3;
|
||
|
} s;
|
||
|
} u;
|
||
|
u64 ptr0;
|
||
|
u64 ptr1;
|
||
|
u64 ptr2;
|
||
|
u64 ptr3;
|
||
|
};
|
||
|
|
||
|
struct cpt_info_buffer {
|
||
|
struct cpt_vf *cptvf;
|
||
|
unsigned long time_in;
|
||
|
u8 extra_time;
|
||
|
|
||
|
struct cpt_request_info *req;
|
||
|
dma_addr_t dptr_baddr;
|
||
|
u32 dlen;
|
||
|
dma_addr_t rptr_baddr;
|
||
|
dma_addr_t comp_baddr;
|
||
|
u8 *in_buffer;
|
||
|
u8 *out_buffer;
|
||
|
u8 *gather_components;
|
||
|
u8 *scatter_components;
|
||
|
|
||
|
struct pending_entry *pentry;
|
||
|
volatile u64 *completion_addr;
|
||
|
volatile u64 *alternate_caddr;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* CPT_INST_S software command definitions
|
||
|
* Words EI (0-3)
|
||
|
*/
|
||
|
union vq_cmd_word0 {
|
||
|
u64 u64;
|
||
|
struct {
|
||
|
u16 opcode;
|
||
|
u16 param1;
|
||
|
u16 param2;
|
||
|
u16 dlen;
|
||
|
} s;
|
||
|
};
|
||
|
|
||
|
union vq_cmd_word3 {
|
||
|
u64 u64;
|
||
|
struct {
|
||
|
#if defined(__BIG_ENDIAN_BITFIELD)
|
||
|
u64 grp:3;
|
||
|
u64 cptr:61;
|
||
|
#else
|
||
|
u64 cptr:61;
|
||
|
u64 grp:3;
|
||
|
#endif
|
||
|
} s;
|
||
|
};
|
||
|
|
||
|
struct cpt_vq_command {
|
||
|
union vq_cmd_word0 cmd;
|
||
|
u64 dptr;
|
||
|
u64 rptr;
|
||
|
union vq_cmd_word3 cptr;
|
||
|
};
|
||
|
|
||
|
void vq_post_process(struct cpt_vf *cptvf, u32 qno);
|
||
|
int process_request(struct cpt_vf *cptvf, struct cpt_request_info *req);
|
||
|
#endif /* __REQUEST_MANAGER_H */
|