18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Cavium, Inc.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef __CPTVF_H
78c2ecf20Sopenharmony_ci#define __CPTVF_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/list.h>
108c2ecf20Sopenharmony_ci#include "cpt_common.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* Default command queue length */
138c2ecf20Sopenharmony_ci#define CPT_CMD_QLEN 2046
148c2ecf20Sopenharmony_ci#define CPT_CMD_QCHUNK_SIZE 1023
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/* Default command timeout in seconds */
178c2ecf20Sopenharmony_ci#define CPT_COMMAND_TIMEOUT 4
188c2ecf20Sopenharmony_ci#define CPT_TIMER_THOLD	0xFFFF
198c2ecf20Sopenharmony_ci#define CPT_NUM_QS_PER_VF 1
208c2ecf20Sopenharmony_ci#define CPT_INST_SIZE 64
218c2ecf20Sopenharmony_ci#define CPT_NEXT_CHUNK_PTR_SIZE 8
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci#define	CPT_VF_MSIX_VECTORS 2
248c2ecf20Sopenharmony_ci#define CPT_VF_INTR_MBOX_MASK BIT(0)
258c2ecf20Sopenharmony_ci#define CPT_VF_INTR_DOVF_MASK BIT(1)
268c2ecf20Sopenharmony_ci#define CPT_VF_INTR_IRDE_MASK BIT(2)
278c2ecf20Sopenharmony_ci#define CPT_VF_INTR_NWRP_MASK BIT(3)
288c2ecf20Sopenharmony_ci#define CPT_VF_INTR_SERR_MASK BIT(4)
298c2ecf20Sopenharmony_ci#define DMA_DIRECT_DIRECT 0 /* Input DIRECT, Output DIRECT */
308c2ecf20Sopenharmony_ci#define DMA_GATHER_SCATTER 1
318c2ecf20Sopenharmony_ci#define FROM_DPTR 1
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci/**
348c2ecf20Sopenharmony_ci * Enumeration cpt_vf_int_vec_e
358c2ecf20Sopenharmony_ci *
368c2ecf20Sopenharmony_ci * CPT VF MSI-X Vector Enumeration
378c2ecf20Sopenharmony_ci * Enumerates the MSI-X interrupt vectors.
388c2ecf20Sopenharmony_ci */
398c2ecf20Sopenharmony_cienum cpt_vf_int_vec_e {
408c2ecf20Sopenharmony_ci	CPT_VF_INT_VEC_E_MISC = 0x00,
418c2ecf20Sopenharmony_ci	CPT_VF_INT_VEC_E_DONE = 0x01
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistruct command_chunk {
458c2ecf20Sopenharmony_ci	u8 *head;
468c2ecf20Sopenharmony_ci	dma_addr_t dma_addr;
478c2ecf20Sopenharmony_ci	u32 size; /* Chunk size, max CPT_INST_CHUNK_MAX_SIZE */
488c2ecf20Sopenharmony_ci	struct hlist_node nextchunk;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistruct command_queue {
528c2ecf20Sopenharmony_ci	spinlock_t lock; /* command queue lock */
538c2ecf20Sopenharmony_ci	u32 idx; /* Command queue host write idx */
548c2ecf20Sopenharmony_ci	u32 nchunks; /* Number of command chunks */
558c2ecf20Sopenharmony_ci	struct command_chunk *qhead;	/* Command queue head, instructions
568c2ecf20Sopenharmony_ci					 * are inserted here
578c2ecf20Sopenharmony_ci					 */
588c2ecf20Sopenharmony_ci	struct hlist_head chead;
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistruct command_qinfo {
628c2ecf20Sopenharmony_ci	u32 cmd_size;
638c2ecf20Sopenharmony_ci	u32 qchunksize; /* Command queue chunk size */
648c2ecf20Sopenharmony_ci	struct command_queue queue[CPT_NUM_QS_PER_VF];
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistruct pending_entry {
688c2ecf20Sopenharmony_ci	u8 busy; /* Entry status (free/busy) */
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	volatile u64 *completion_addr; /* Completion address */
718c2ecf20Sopenharmony_ci	void *post_arg;
728c2ecf20Sopenharmony_ci	void (*callback)(int, void *); /* Kernel ASYNC request callabck */
738c2ecf20Sopenharmony_ci	void *callback_arg; /* Kernel ASYNC request callabck arg */
748c2ecf20Sopenharmony_ci};
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_cistruct pending_queue {
778c2ecf20Sopenharmony_ci	struct pending_entry *head;	/* head of the queue */
788c2ecf20Sopenharmony_ci	u32 front; /* Process work from here */
798c2ecf20Sopenharmony_ci	u32 rear; /* Append new work here */
808c2ecf20Sopenharmony_ci	atomic64_t pending_count;
818c2ecf20Sopenharmony_ci	spinlock_t lock; /* Queue lock */
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cistruct pending_qinfo {
858c2ecf20Sopenharmony_ci	u32 nr_queues;	/* Number of queues supported */
868c2ecf20Sopenharmony_ci	u32 qlen; /* Queue length */
878c2ecf20Sopenharmony_ci	struct pending_queue queue[CPT_NUM_QS_PER_VF];
888c2ecf20Sopenharmony_ci};
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define for_each_pending_queue(qinfo, q, i)	\
918c2ecf20Sopenharmony_ci	for (i = 0, q = &qinfo->queue[i]; i < qinfo->nr_queues; i++, \
928c2ecf20Sopenharmony_ci	     q = &qinfo->queue[i])
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_cistruct cpt_vf {
958c2ecf20Sopenharmony_ci	u16 flags; /* Flags to hold device status bits */
968c2ecf20Sopenharmony_ci	u8 vfid; /* Device Index 0...CPT_MAX_VF_NUM */
978c2ecf20Sopenharmony_ci	u8 vftype; /* VF type of SE_TYPE(1) or AE_TYPE(1) */
988c2ecf20Sopenharmony_ci	u8 vfgrp; /* VF group (0 - 8) */
998c2ecf20Sopenharmony_ci	u8 node; /* Operating node: Bits (46:44) in BAR0 address */
1008c2ecf20Sopenharmony_ci	u8 priority; /* VF priority ring: 1-High proirity round
1018c2ecf20Sopenharmony_ci		      * robin ring;0-Low priority round robin ring;
1028c2ecf20Sopenharmony_ci		      */
1038c2ecf20Sopenharmony_ci	struct pci_dev *pdev; /* pci device handle */
1048c2ecf20Sopenharmony_ci	void __iomem *reg_base; /* Register start address */
1058c2ecf20Sopenharmony_ci	void *wqe_info;	/* BH worker info */
1068c2ecf20Sopenharmony_ci	/* MSI-X */
1078c2ecf20Sopenharmony_ci	cpumask_var_t affinity_mask[CPT_VF_MSIX_VECTORS];
1088c2ecf20Sopenharmony_ci	/* Command and Pending queues */
1098c2ecf20Sopenharmony_ci	u32 qsize;
1108c2ecf20Sopenharmony_ci	u32 nr_queues;
1118c2ecf20Sopenharmony_ci	struct command_qinfo cqinfo; /* Command queue information */
1128c2ecf20Sopenharmony_ci	struct pending_qinfo pqinfo; /* Pending queue information */
1138c2ecf20Sopenharmony_ci	/* VF-PF mailbox communication */
1148c2ecf20Sopenharmony_ci	bool pf_acked;
1158c2ecf20Sopenharmony_ci	bool pf_nacked;
1168c2ecf20Sopenharmony_ci};
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ciint cptvf_send_vf_up(struct cpt_vf *cptvf);
1198c2ecf20Sopenharmony_ciint cptvf_send_vf_down(struct cpt_vf *cptvf);
1208c2ecf20Sopenharmony_ciint cptvf_send_vf_to_grp_msg(struct cpt_vf *cptvf);
1218c2ecf20Sopenharmony_ciint cptvf_send_vf_priority_msg(struct cpt_vf *cptvf);
1228c2ecf20Sopenharmony_ciint cptvf_send_vq_size_msg(struct cpt_vf *cptvf);
1238c2ecf20Sopenharmony_ciint cptvf_check_pf_ready(struct cpt_vf *cptvf);
1248c2ecf20Sopenharmony_civoid cptvf_handle_mbox_intr(struct cpt_vf *cptvf);
1258c2ecf20Sopenharmony_civoid cvm_crypto_exit(void);
1268c2ecf20Sopenharmony_ciint cvm_crypto_init(struct cpt_vf *cptvf);
1278c2ecf20Sopenharmony_civoid vq_post_process(struct cpt_vf *cptvf, u32 qno);
1288c2ecf20Sopenharmony_civoid cptvf_write_vq_doorbell(struct cpt_vf *cptvf, u32 val);
1298c2ecf20Sopenharmony_ci#endif /* __CPTVF_H */
130