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 __CPTVF_H 7*4882a593Smuzhiyun #define __CPTVF_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/list.h> 10*4882a593Smuzhiyun #include "cpt_common.h" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* Default command queue length */ 13*4882a593Smuzhiyun #define CPT_CMD_QLEN 2046 14*4882a593Smuzhiyun #define CPT_CMD_QCHUNK_SIZE 1023 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Default command timeout in seconds */ 17*4882a593Smuzhiyun #define CPT_COMMAND_TIMEOUT 4 18*4882a593Smuzhiyun #define CPT_TIMER_THOLD 0xFFFF 19*4882a593Smuzhiyun #define CPT_NUM_QS_PER_VF 1 20*4882a593Smuzhiyun #define CPT_INST_SIZE 64 21*4882a593Smuzhiyun #define CPT_NEXT_CHUNK_PTR_SIZE 8 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define CPT_VF_MSIX_VECTORS 2 24*4882a593Smuzhiyun #define CPT_VF_INTR_MBOX_MASK BIT(0) 25*4882a593Smuzhiyun #define CPT_VF_INTR_DOVF_MASK BIT(1) 26*4882a593Smuzhiyun #define CPT_VF_INTR_IRDE_MASK BIT(2) 27*4882a593Smuzhiyun #define CPT_VF_INTR_NWRP_MASK BIT(3) 28*4882a593Smuzhiyun #define CPT_VF_INTR_SERR_MASK BIT(4) 29*4882a593Smuzhiyun #define DMA_DIRECT_DIRECT 0 /* Input DIRECT, Output DIRECT */ 30*4882a593Smuzhiyun #define DMA_GATHER_SCATTER 1 31*4882a593Smuzhiyun #define FROM_DPTR 1 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /** 34*4882a593Smuzhiyun * Enumeration cpt_vf_int_vec_e 35*4882a593Smuzhiyun * 36*4882a593Smuzhiyun * CPT VF MSI-X Vector Enumeration 37*4882a593Smuzhiyun * Enumerates the MSI-X interrupt vectors. 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun enum cpt_vf_int_vec_e { 40*4882a593Smuzhiyun CPT_VF_INT_VEC_E_MISC = 0x00, 41*4882a593Smuzhiyun CPT_VF_INT_VEC_E_DONE = 0x01 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun struct command_chunk { 45*4882a593Smuzhiyun u8 *head; 46*4882a593Smuzhiyun dma_addr_t dma_addr; 47*4882a593Smuzhiyun u32 size; /* Chunk size, max CPT_INST_CHUNK_MAX_SIZE */ 48*4882a593Smuzhiyun struct hlist_node nextchunk; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun struct command_queue { 52*4882a593Smuzhiyun spinlock_t lock; /* command queue lock */ 53*4882a593Smuzhiyun u32 idx; /* Command queue host write idx */ 54*4882a593Smuzhiyun u32 nchunks; /* Number of command chunks */ 55*4882a593Smuzhiyun struct command_chunk *qhead; /* Command queue head, instructions 56*4882a593Smuzhiyun * are inserted here 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun struct hlist_head chead; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct command_qinfo { 62*4882a593Smuzhiyun u32 cmd_size; 63*4882a593Smuzhiyun u32 qchunksize; /* Command queue chunk size */ 64*4882a593Smuzhiyun struct command_queue queue[CPT_NUM_QS_PER_VF]; 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct pending_entry { 68*4882a593Smuzhiyun u8 busy; /* Entry status (free/busy) */ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun volatile u64 *completion_addr; /* Completion address */ 71*4882a593Smuzhiyun void *post_arg; 72*4882a593Smuzhiyun void (*callback)(int, void *); /* Kernel ASYNC request callabck */ 73*4882a593Smuzhiyun void *callback_arg; /* Kernel ASYNC request callabck arg */ 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct pending_queue { 77*4882a593Smuzhiyun struct pending_entry *head; /* head of the queue */ 78*4882a593Smuzhiyun u32 front; /* Process work from here */ 79*4882a593Smuzhiyun u32 rear; /* Append new work here */ 80*4882a593Smuzhiyun atomic64_t pending_count; 81*4882a593Smuzhiyun spinlock_t lock; /* Queue lock */ 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun struct pending_qinfo { 85*4882a593Smuzhiyun u32 nr_queues; /* Number of queues supported */ 86*4882a593Smuzhiyun u32 qlen; /* Queue length */ 87*4882a593Smuzhiyun struct pending_queue queue[CPT_NUM_QS_PER_VF]; 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define for_each_pending_queue(qinfo, q, i) \ 91*4882a593Smuzhiyun for (i = 0, q = &qinfo->queue[i]; i < qinfo->nr_queues; i++, \ 92*4882a593Smuzhiyun q = &qinfo->queue[i]) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct cpt_vf { 95*4882a593Smuzhiyun u16 flags; /* Flags to hold device status bits */ 96*4882a593Smuzhiyun u8 vfid; /* Device Index 0...CPT_MAX_VF_NUM */ 97*4882a593Smuzhiyun u8 vftype; /* VF type of SE_TYPE(1) or AE_TYPE(1) */ 98*4882a593Smuzhiyun u8 vfgrp; /* VF group (0 - 8) */ 99*4882a593Smuzhiyun u8 node; /* Operating node: Bits (46:44) in BAR0 address */ 100*4882a593Smuzhiyun u8 priority; /* VF priority ring: 1-High proirity round 101*4882a593Smuzhiyun * robin ring;0-Low priority round robin ring; 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun struct pci_dev *pdev; /* pci device handle */ 104*4882a593Smuzhiyun void __iomem *reg_base; /* Register start address */ 105*4882a593Smuzhiyun void *wqe_info; /* BH worker info */ 106*4882a593Smuzhiyun /* MSI-X */ 107*4882a593Smuzhiyun cpumask_var_t affinity_mask[CPT_VF_MSIX_VECTORS]; 108*4882a593Smuzhiyun /* Command and Pending queues */ 109*4882a593Smuzhiyun u32 qsize; 110*4882a593Smuzhiyun u32 nr_queues; 111*4882a593Smuzhiyun struct command_qinfo cqinfo; /* Command queue information */ 112*4882a593Smuzhiyun struct pending_qinfo pqinfo; /* Pending queue information */ 113*4882a593Smuzhiyun /* VF-PF mailbox communication */ 114*4882a593Smuzhiyun bool pf_acked; 115*4882a593Smuzhiyun bool pf_nacked; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun int cptvf_send_vf_up(struct cpt_vf *cptvf); 119*4882a593Smuzhiyun int cptvf_send_vf_down(struct cpt_vf *cptvf); 120*4882a593Smuzhiyun int cptvf_send_vf_to_grp_msg(struct cpt_vf *cptvf); 121*4882a593Smuzhiyun int cptvf_send_vf_priority_msg(struct cpt_vf *cptvf); 122*4882a593Smuzhiyun int cptvf_send_vq_size_msg(struct cpt_vf *cptvf); 123*4882a593Smuzhiyun int cptvf_check_pf_ready(struct cpt_vf *cptvf); 124*4882a593Smuzhiyun void cptvf_handle_mbox_intr(struct cpt_vf *cptvf); 125*4882a593Smuzhiyun void cvm_crypto_exit(void); 126*4882a593Smuzhiyun int cvm_crypto_init(struct cpt_vf *cptvf); 127*4882a593Smuzhiyun void vq_post_process(struct cpt_vf *cptvf, u32 qno); 128*4882a593Smuzhiyun void cptvf_write_vq_doorbell(struct cpt_vf *cptvf, u32 val); 129*4882a593Smuzhiyun #endif /* __CPTVF_H */ 130