Merge tag 'gpio-v5.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux...
[linux-2.6-block.git] / drivers / crypto / qat / qat_common / adf_admin.c
CommitLineData
1532e31f
GC
1// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2/* Copyright(c) 2014 - 2020 Intel Corporation */
7afa232e
TS
3#include <linux/types.h>
4#include <linux/mutex.h>
5#include <linux/slab.h>
a79d471c 6#include <linux/iopoll.h>
7afa232e
TS
7#include <linux/pci.h>
8#include <linux/dma-mapping.h>
a5733139 9#include "adf_accel_devices.h"
1a72d3a6 10#include "adf_common_drv.h"
a5733139
TS
11#include "icp_qat_fw_init_admin.h"
12
13/* Admin Messages Registers */
14#define ADF_DH895XCC_ADMINMSGUR_OFFSET (0x3A000 + 0x574)
15#define ADF_DH895XCC_ADMINMSGLR_OFFSET (0x3A000 + 0x578)
16#define ADF_DH895XCC_MAILBOX_BASE_OFFSET 0x20970
17#define ADF_DH895XCC_MAILBOX_STRIDE 0x1000
7afa232e 18#define ADF_ADMINMSG_LEN 32
e4e245ad 19#define ADF_CONST_TABLE_SIZE 1024
a79d471c
WZ
20#define ADF_ADMIN_POLL_DELAY_US 20
21#define ADF_ADMIN_POLL_TIMEOUT_US (5 * USEC_PER_SEC)
7afa232e 22
082ebe92 23static const u8 const_tab[1024] __aligned(1024) = {
89c07b8a
TS
240x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
260x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
300x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00,
310x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
320x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
330x00, 0x00, 0x00, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01,
340x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
350x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x02, 0x00, 0x00,
360x00, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13,
370x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
380x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
390x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
410x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
430x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
440x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
460x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
470x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76,
490x54, 0x32, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
500x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab,
510x89, 0x98, 0xba, 0xdc, 0xfe, 0x10, 0x32, 0x54, 0x76, 0xc3, 0xd2, 0xe1, 0xf0,
520x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
530x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
540x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x05, 0x9e,
550xd8, 0x36, 0x7c, 0xd5, 0x07, 0x30, 0x70, 0xdd, 0x17, 0xf7, 0x0e, 0x59, 0x39,
560xff, 0xc0, 0x0b, 0x31, 0x68, 0x58, 0x15, 0x11, 0x64, 0xf9, 0x8f, 0xa7, 0xbe,
570xfa, 0x4f, 0xa4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xbb, 0x67, 0xae,
590x85, 0x3c, 0x6e, 0xf3, 0x72, 0xa5, 0x4f, 0xf5, 0x3a, 0x51, 0x0e, 0x52, 0x7f,
600x9b, 0x05, 0x68, 0x8c, 0x1f, 0x83, 0xd9, 0xab, 0x5b, 0xe0, 0xcd, 0x19, 0x05,
610x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
620x00, 0x00, 0xcb, 0xbb, 0x9d, 0x5d, 0xc1, 0x05, 0x9e, 0xd8, 0x62, 0x9a, 0x29,
630x2a, 0x36, 0x7c, 0xd5, 0x07, 0x91, 0x59, 0x01, 0x5a, 0x30, 0x70, 0xdd, 0x17,
640x15, 0x2f, 0xec, 0xd8, 0xf7, 0x0e, 0x59, 0x39, 0x67, 0x33, 0x26, 0x67, 0xff,
650xc0, 0x0b, 0x31, 0x8e, 0xb4, 0x4a, 0x87, 0x68, 0x58, 0x15, 0x11, 0xdb, 0x0c,
660x2e, 0x0d, 0x64, 0xf9, 0x8f, 0xa7, 0x47, 0xb5, 0x48, 0x1d, 0xbe, 0xfa, 0x4f,
670xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
680x00, 0x00, 0x00, 0x00, 0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08, 0xbb,
690x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b, 0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94,
700xf8, 0x2b, 0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1, 0x51, 0x0e, 0x52,
710x7f, 0xad, 0xe6, 0x82, 0xd1, 0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f,
720x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b, 0x5b, 0xe0, 0xcd, 0x19, 0x13,
730x7e, 0x21, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
740x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
750x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
810x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
820x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
860x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
950x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1000x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
103
7afa232e
TS
104struct adf_admin_comms {
105 dma_addr_t phy_addr;
89c07b8a 106 dma_addr_t const_tbl_addr;
7afa232e 107 void *virt_addr;
93ba73fe 108 void *virt_tbl_addr;
7afa232e
TS
109 void __iomem *mailbox_addr;
110 struct mutex lock; /* protects adf_admin_comms struct */
111};
112
a5733139
TS
113static int adf_put_admin_msg_sync(struct adf_accel_dev *accel_dev, u32 ae,
114 void *in, void *out)
7afa232e 115{
a79d471c
WZ
116 int ret;
117 u32 status;
7afa232e
TS
118 struct adf_admin_comms *admin = accel_dev->admin;
119 int offset = ae * ADF_ADMINMSG_LEN * 2;
120 void __iomem *mailbox = admin->mailbox_addr;
121 int mb_offset = ae * ADF_DH895XCC_MAILBOX_STRIDE;
e4e245ad 122 struct icp_qat_fw_init_admin_req *request = in;
7afa232e
TS
123
124 mutex_lock(&admin->lock);
125
126 if (ADF_CSR_RD(mailbox, mb_offset) == 1) {
127 mutex_unlock(&admin->lock);
128 return -EAGAIN;
129 }
130
131 memcpy(admin->virt_addr + offset, in, ADF_ADMINMSG_LEN);
132 ADF_CSR_WR(mailbox, mb_offset, 1);
a79d471c 133
9a5a668d
GC
134 ret = read_poll_timeout(ADF_CSR_RD, status, status == 0,
135 ADF_ADMIN_POLL_DELAY_US,
136 ADF_ADMIN_POLL_TIMEOUT_US, true,
137 mailbox, mb_offset);
a79d471c
WZ
138 if (ret < 0) {
139 /* Response timeout */
66550304 140 dev_err(&GET_DEV(accel_dev),
e4e245ad
WZ
141 "Failed to send admin msg %d to accelerator %d\n",
142 request->cmd_id, ae);
a79d471c
WZ
143 } else {
144 /* Response received from admin message, we can now
145 * make response data available in "out" parameter.
146 */
147 memcpy(out, admin->virt_addr + offset +
148 ADF_ADMINMSG_LEN, ADF_ADMINMSG_LEN);
149 }
7afa232e
TS
150
151 mutex_unlock(&admin->lock);
a79d471c 152 return ret;
7afa232e
TS
153}
154
e4e245ad
WZ
155static int adf_send_admin(struct adf_accel_dev *accel_dev,
156 struct icp_qat_fw_init_admin_req *req,
157 struct icp_qat_fw_init_admin_resp *resp,
158 const unsigned long ae_mask)
a5733139 159{
e4e245ad
WZ
160 u32 ae;
161
162 for_each_set_bit(ae, &ae_mask, ICP_QAT_HW_AE_DELIMITER)
163 if (adf_put_admin_msg_sync(accel_dev, ae, req, resp) ||
164 resp->status)
165 return -EFAULT;
166
167 return 0;
168}
169
170static int adf_init_me(struct adf_accel_dev *accel_dev)
171{
172 struct icp_qat_fw_init_admin_req req;
173 struct icp_qat_fw_init_admin_resp resp;
a5733139 174 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
e4e245ad
WZ
175 u32 ae_mask = hw_device->ae_mask;
176
177 memset(&req, 0, sizeof(req));
178 memset(&resp, 0, sizeof(resp));
179 req.cmd_id = ICP_QAT_FW_INIT_ME;
180
181 return adf_send_admin(accel_dev, &req, &resp, ae_mask);
182}
183
184static int adf_set_fw_constants(struct adf_accel_dev *accel_dev)
185{
a5733139
TS
186 struct icp_qat_fw_init_admin_req req;
187 struct icp_qat_fw_init_admin_resp resp;
e4e245ad
WZ
188 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
189 u32 ae_mask = hw_device->ae_mask;
a5733139 190
e4e245ad
WZ
191 memset(&req, 0, sizeof(req));
192 memset(&resp, 0, sizeof(resp));
193 req.cmd_id = ICP_QAT_FW_CONSTANTS_CFG;
89c07b8a 194
e4e245ad
WZ
195 req.init_cfg_sz = ADF_CONST_TABLE_SIZE;
196 req.init_cfg_ptr = accel_dev->admin->const_tbl_addr;
197
198 return adf_send_admin(accel_dev, &req, &resp, ae_mask);
a5733139
TS
199}
200
201/**
202 * adf_send_admin_init() - Function sends init message to FW
203 * @accel_dev: Pointer to acceleration device.
204 *
205 * Function sends admin init message to the FW
206 *
207 * Return: 0 on success, error code otherwise.
208 */
209int adf_send_admin_init(struct adf_accel_dev *accel_dev)
210{
e4e245ad 211 int ret;
89c07b8a 212
e4e245ad 213 ret = adf_init_me(accel_dev);
89c07b8a
TS
214 if (ret)
215 return ret;
e4e245ad
WZ
216
217 return adf_set_fw_constants(accel_dev);
a5733139
TS
218}
219EXPORT_SYMBOL_GPL(adf_send_admin_init);
220
7afa232e
TS
221int adf_init_admin_comms(struct adf_accel_dev *accel_dev)
222{
223 struct adf_admin_comms *admin;
a5733139
TS
224 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
225 struct adf_bar *pmisc =
226 &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
7afa232e 227 void __iomem *csr = pmisc->virt_addr;
1a72d3a6
TS
228 void __iomem *mailbox = (void __iomem *)((uintptr_t)csr +
229 ADF_DH895XCC_MAILBOX_BASE_OFFSET);
a5733139 230 u64 reg_val;
7afa232e
TS
231
232 admin = kzalloc_node(sizeof(*accel_dev->admin), GFP_KERNEL,
09adc878 233 dev_to_node(&GET_DEV(accel_dev)));
7afa232e
TS
234 if (!admin)
235 return -ENOMEM;
750afb08
LC
236 admin->virt_addr = dma_alloc_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
237 &admin->phy_addr, GFP_KERNEL);
7afa232e
TS
238 if (!admin->virt_addr) {
239 dev_err(&GET_DEV(accel_dev), "Failed to allocate dma buff\n");
240 kfree(admin);
241 return -ENOMEM;
242 }
89c07b8a 243
750afb08
LC
244 admin->virt_tbl_addr = dma_alloc_coherent(&GET_DEV(accel_dev),
245 PAGE_SIZE,
246 &admin->const_tbl_addr,
247 GFP_KERNEL);
93ba73fe
ML
248 if (!admin->virt_tbl_addr) {
249 dev_err(&GET_DEV(accel_dev), "Failed to allocate const_tbl\n");
89c07b8a
TS
250 dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
251 admin->virt_addr, admin->phy_addr);
252 kfree(admin);
253 return -ENOMEM;
254 }
93ba73fe
ML
255
256 memcpy(admin->virt_tbl_addr, const_tab, sizeof(const_tab));
a5733139 257 reg_val = (u64)admin->phy_addr;
7afa232e
TS
258 ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32);
259 ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGLR_OFFSET, reg_val);
260 mutex_init(&admin->lock);
261 admin->mailbox_addr = mailbox;
262 accel_dev->admin = admin;
263 return 0;
264}
a5733139 265EXPORT_SYMBOL_GPL(adf_init_admin_comms);
7afa232e
TS
266
267void adf_exit_admin_comms(struct adf_accel_dev *accel_dev)
268{
269 struct adf_admin_comms *admin = accel_dev->admin;
270
271 if (!admin)
272 return;
273
274 if (admin->virt_addr)
275 dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
276 admin->virt_addr, admin->phy_addr);
93ba73fe
ML
277 if (admin->virt_tbl_addr)
278 dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
279 admin->virt_tbl_addr, admin->const_tbl_addr);
7afa232e
TS
280
281 mutex_destroy(&admin->lock);
282 kfree(admin);
283 accel_dev->admin = NULL;
284}
a5733139 285EXPORT_SYMBOL_GPL(adf_exit_admin_comms);