crypto: hisilicon - add HiSilicon ZIP accelerator support
[linux-2.6-block.git] / drivers / crypto / hisilicon / qm.h
CommitLineData
263c9959
ZW
1/* SPDX-License-Identifier: GPL-2.0 */
2/* Copyright (c) 2019 HiSilicon Limited. */
3#ifndef HISI_ACC_QM_H
4#define HISI_ACC_QM_H
5
6#include <linux/bitfield.h>
7#include <linux/iopoll.h>
8#include <linux/module.h>
9#include <linux/pci.h>
10
11/* qm user domain */
12#define QM_ARUSER_M_CFG_1 0x100088
13#define AXUSER_SNOOP_ENABLE BIT(30)
14#define AXUSER_CMD_TYPE GENMASK(14, 12)
15#define AXUSER_CMD_SMMU_NORMAL 1
16#define AXUSER_NS BIT(6)
17#define AXUSER_NO BIT(5)
18#define AXUSER_FP BIT(4)
19#define AXUSER_SSV BIT(0)
20#define AXUSER_BASE (AXUSER_SNOOP_ENABLE | \
21 FIELD_PREP(AXUSER_CMD_TYPE, \
22 AXUSER_CMD_SMMU_NORMAL) | \
23 AXUSER_NS | AXUSER_NO | AXUSER_FP)
24#define QM_ARUSER_M_CFG_ENABLE 0x100090
25#define ARUSER_M_CFG_ENABLE 0xfffffffe
26#define QM_AWUSER_M_CFG_1 0x100098
27#define QM_AWUSER_M_CFG_ENABLE 0x1000a0
28#define AWUSER_M_CFG_ENABLE 0xfffffffe
29#define QM_WUSER_M_CFG_ENABLE 0x1000a8
30#define WUSER_M_CFG_ENABLE 0xffffffff
31
32/* qm cache */
33#define QM_CACHE_CTL 0x100050
34#define SQC_CACHE_ENABLE BIT(0)
35#define CQC_CACHE_ENABLE BIT(1)
36#define SQC_CACHE_WB_ENABLE BIT(4)
37#define SQC_CACHE_WB_THRD GENMASK(10, 5)
38#define CQC_CACHE_WB_ENABLE BIT(11)
39#define CQC_CACHE_WB_THRD GENMASK(17, 12)
40#define QM_AXI_M_CFG 0x1000ac
41#define AXI_M_CFG 0xffff
42#define QM_AXI_M_CFG_ENABLE 0x1000b0
43#define AXI_M_CFG_ENABLE 0xffffffff
44#define QM_PEH_AXUSER_CFG 0x1000cc
45#define QM_PEH_AXUSER_CFG_ENABLE 0x1000d0
46#define PEH_AXUSER_CFG 0x401001
47#define PEH_AXUSER_CFG_ENABLE 0xffffffff
48
49
50#define QM_AXI_RRESP BIT(0)
51#define QM_AXI_BRESP BIT(1)
52#define QM_ECC_MBIT BIT(2)
53#define QM_ECC_1BIT BIT(3)
54#define QM_ACC_GET_TASK_TIMEOUT BIT(4)
55#define QM_ACC_DO_TASK_TIMEOUT BIT(5)
56#define QM_ACC_WB_NOT_READY_TIMEOUT BIT(6)
57#define QM_SQ_CQ_VF_INVALID BIT(7)
58#define QM_CQ_VF_INVALID BIT(8)
59#define QM_SQ_VF_INVALID BIT(9)
60#define QM_DB_TIMEOUT BIT(10)
61#define QM_OF_FIFO_OF BIT(11)
62#define QM_DB_RANDOM_INVALID BIT(12)
63
64#define QM_BASE_NFE (QM_AXI_RRESP | QM_AXI_BRESP | QM_ECC_MBIT | \
65 QM_ACC_GET_TASK_TIMEOUT | QM_DB_TIMEOUT | \
66 QM_OF_FIFO_OF)
67#define QM_BASE_CE QM_ECC_1BIT
68
69#define QM_Q_DEPTH 1024
70
71enum qp_state {
72 QP_STOP,
73};
74
75enum qm_hw_ver {
76 QM_HW_UNKNOWN = -1,
77 QM_HW_V1 = 0x20,
78 QM_HW_V2 = 0x21,
79};
80
81enum qm_fun_type {
82 QM_HW_PF,
83};
84
85struct qm_dma {
86 void *va;
87 dma_addr_t dma;
88 size_t size;
89};
90
91struct hisi_qm_status {
92 u32 eq_head;
93 bool eqc_phase;
94 u32 aeq_head;
95 bool aeqc_phase;
96 unsigned long flags;
97};
98
99struct hisi_qm {
100 enum qm_hw_ver ver;
101 const char *dev_name;
102 struct pci_dev *pdev;
103 void __iomem *io_base;
104 u32 sqe_size;
105 u32 qp_base;
106 u32 qp_num;
107 u32 ctrl_qp_num;
108
109 struct qm_dma qdma;
110 struct qm_sqc *sqc;
111 struct qm_cqc *cqc;
112 struct qm_eqe *eqe;
113 struct qm_aeqe *aeqe;
114 dma_addr_t sqc_dma;
115 dma_addr_t cqc_dma;
116 dma_addr_t eqe_dma;
117 dma_addr_t aeqe_dma;
118
119 struct hisi_qm_status status;
120
121 rwlock_t qps_lock;
122 unsigned long *qp_bitmap;
123 struct hisi_qp **qp_array;
124
125 struct mutex mailbox_lock;
126
127 const struct hisi_qm_hw_ops *ops;
128
129 u32 error_mask;
130 u32 msi_mask;
131
132 bool use_dma_api;
133};
134
135struct hisi_qp_status {
136 atomic_t used;
137 u16 sq_tail;
138 u16 cq_head;
139 bool cqc_phase;
140 unsigned long flags;
141};
142
143struct hisi_qp_ops {
144 int (*fill_sqe)(void *sqe, void *q_parm, void *d_parm);
145};
146
147struct hisi_qp {
148 u32 qp_id;
149 u8 alg_type;
150 u8 req_type;
151
152 struct qm_dma qdma;
153 void *sqe;
154 struct qm_cqe *cqe;
155 dma_addr_t sqe_dma;
156 dma_addr_t cqe_dma;
157
158 struct hisi_qp_status qp_status;
159 struct hisi_qp_ops *hw_ops;
160 void *qp_ctx;
161 void (*req_cb)(struct hisi_qp *qp, void *data);
162 struct work_struct work;
163 struct workqueue_struct *wq;
164
165 struct hisi_qm *qm;
166};
167
168int hisi_qm_init(struct hisi_qm *qm);
169void hisi_qm_uninit(struct hisi_qm *qm);
170int hisi_qm_start(struct hisi_qm *qm);
171int hisi_qm_stop(struct hisi_qm *qm);
172struct hisi_qp *hisi_qm_create_qp(struct hisi_qm *qm, u8 alg_type);
173int hisi_qm_start_qp(struct hisi_qp *qp, unsigned long arg);
174int hisi_qm_stop_qp(struct hisi_qp *qp);
175void hisi_qm_release_qp(struct hisi_qp *qp);
176int hisi_qp_send(struct hisi_qp *qp, const void *msg);
177int hisi_qm_set_vft(struct hisi_qm *qm, u32 fun_num, u32 base, u32 number);
178void hisi_qm_hw_error_init(struct hisi_qm *qm, u32 ce, u32 nfe, u32 fe,
179 u32 msi);
180int hisi_qm_hw_error_handle(struct hisi_qm *qm);
181enum qm_hw_ver hisi_qm_get_hw_version(struct pci_dev *pdev);
182#endif