162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 Cavium, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __REQUEST_MANAGER_H 762306a36Sopenharmony_ci#define __REQUEST_MANAGER_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "cpt_common.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define TIME_IN_RESET_COUNT 5 1262306a36Sopenharmony_ci#define COMPLETION_CODE_SIZE 8 1362306a36Sopenharmony_ci#define COMPLETION_CODE_INIT 0 1462306a36Sopenharmony_ci#define PENDING_THOLD 100 1562306a36Sopenharmony_ci#define MAX_SG_IN_CNT 12 1662306a36Sopenharmony_ci#define MAX_SG_OUT_CNT 13 1762306a36Sopenharmony_ci#define SG_LIST_HDR_SIZE 8 1862306a36Sopenharmony_ci#define MAX_BUF_CNT 16 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciunion ctrl_info { 2162306a36Sopenharmony_ci u32 flags; 2262306a36Sopenharmony_ci struct { 2362306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 2462306a36Sopenharmony_ci u32 reserved0:26; 2562306a36Sopenharmony_ci u32 grp:3; /* Group bits */ 2662306a36Sopenharmony_ci u32 dma_mode:2; /* DMA mode */ 2762306a36Sopenharmony_ci u32 se_req:1;/* To SE core */ 2862306a36Sopenharmony_ci#else 2962306a36Sopenharmony_ci u32 se_req:1; /* To SE core */ 3062306a36Sopenharmony_ci u32 dma_mode:2; /* DMA mode */ 3162306a36Sopenharmony_ci u32 grp:3; /* Group bits */ 3262306a36Sopenharmony_ci u32 reserved0:26; 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci } s; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ciunion opcode_info { 3862306a36Sopenharmony_ci u16 flags; 3962306a36Sopenharmony_ci struct { 4062306a36Sopenharmony_ci u8 major; 4162306a36Sopenharmony_ci u8 minor; 4262306a36Sopenharmony_ci } s; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct cptvf_request { 4662306a36Sopenharmony_ci union opcode_info opcode; 4762306a36Sopenharmony_ci u16 param1; 4862306a36Sopenharmony_ci u16 param2; 4962306a36Sopenharmony_ci u16 dlen; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct buf_ptr { 5362306a36Sopenharmony_ci u8 *vptr; 5462306a36Sopenharmony_ci dma_addr_t dma_addr; 5562306a36Sopenharmony_ci u16 size; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct cpt_request_info { 5962306a36Sopenharmony_ci u8 incnt; /* Number of input buffers */ 6062306a36Sopenharmony_ci u8 outcnt; /* Number of output buffers */ 6162306a36Sopenharmony_ci u16 rlen; /* Output length */ 6262306a36Sopenharmony_ci union ctrl_info ctrl; /* User control information */ 6362306a36Sopenharmony_ci struct cptvf_request req; /* Request Information (Core specific) */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci bool may_sleep; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci struct buf_ptr in[MAX_BUF_CNT]; 6862306a36Sopenharmony_ci struct buf_ptr out[MAX_BUF_CNT]; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci void (*callback)(int, void *); /* Kernel ASYNC request callabck */ 7162306a36Sopenharmony_ci void *callback_arg; /* Kernel ASYNC request callabck arg */ 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistruct sglist_component { 7562306a36Sopenharmony_ci union { 7662306a36Sopenharmony_ci u64 len; 7762306a36Sopenharmony_ci struct { 7862306a36Sopenharmony_ci __be16 len0; 7962306a36Sopenharmony_ci __be16 len1; 8062306a36Sopenharmony_ci __be16 len2; 8162306a36Sopenharmony_ci __be16 len3; 8262306a36Sopenharmony_ci } s; 8362306a36Sopenharmony_ci } u; 8462306a36Sopenharmony_ci __be64 ptr0; 8562306a36Sopenharmony_ci __be64 ptr1; 8662306a36Sopenharmony_ci __be64 ptr2; 8762306a36Sopenharmony_ci __be64 ptr3; 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistruct cpt_info_buffer { 9162306a36Sopenharmony_ci struct cpt_vf *cptvf; 9262306a36Sopenharmony_ci unsigned long time_in; 9362306a36Sopenharmony_ci u8 extra_time; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci struct cpt_request_info *req; 9662306a36Sopenharmony_ci dma_addr_t dptr_baddr; 9762306a36Sopenharmony_ci u32 dlen; 9862306a36Sopenharmony_ci dma_addr_t rptr_baddr; 9962306a36Sopenharmony_ci dma_addr_t comp_baddr; 10062306a36Sopenharmony_ci u8 *in_buffer; 10162306a36Sopenharmony_ci u8 *out_buffer; 10262306a36Sopenharmony_ci u8 *gather_components; 10362306a36Sopenharmony_ci u8 *scatter_components; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci struct pending_entry *pentry; 10662306a36Sopenharmony_ci volatile u64 *completion_addr; 10762306a36Sopenharmony_ci volatile u64 *alternate_caddr; 10862306a36Sopenharmony_ci}; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* 11162306a36Sopenharmony_ci * CPT_INST_S software command definitions 11262306a36Sopenharmony_ci * Words EI (0-3) 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_ciunion vq_cmd_word0 { 11562306a36Sopenharmony_ci u64 u64; 11662306a36Sopenharmony_ci struct { 11762306a36Sopenharmony_ci __be16 opcode; 11862306a36Sopenharmony_ci __be16 param1; 11962306a36Sopenharmony_ci __be16 param2; 12062306a36Sopenharmony_ci __be16 dlen; 12162306a36Sopenharmony_ci } s; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciunion vq_cmd_word3 { 12562306a36Sopenharmony_ci u64 u64; 12662306a36Sopenharmony_ci struct { 12762306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 12862306a36Sopenharmony_ci u64 grp:3; 12962306a36Sopenharmony_ci u64 cptr:61; 13062306a36Sopenharmony_ci#else 13162306a36Sopenharmony_ci u64 cptr:61; 13262306a36Sopenharmony_ci u64 grp:3; 13362306a36Sopenharmony_ci#endif 13462306a36Sopenharmony_ci } s; 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistruct cpt_vq_command { 13862306a36Sopenharmony_ci union vq_cmd_word0 cmd; 13962306a36Sopenharmony_ci u64 dptr; 14062306a36Sopenharmony_ci u64 rptr; 14162306a36Sopenharmony_ci union vq_cmd_word3 cptr; 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_civoid vq_post_process(struct cpt_vf *cptvf, u32 qno); 14562306a36Sopenharmony_ciint process_request(struct cpt_vf *cptvf, struct cpt_request_info *req); 14662306a36Sopenharmony_ci#endif /* __REQUEST_MANAGER_H */ 147