xref: /netbsd-src/sys/dev/pci/qat/qat_hw17.c (revision 87bee1d0282418fa954c1037956c296d640039b9)
1*87bee1d0Shikaru /*	$NetBSD: qat_hw17.c,v 1.1 2019/11/20 09:37:46 hikaru Exp $	*/
2*87bee1d0Shikaru 
3*87bee1d0Shikaru /*
4*87bee1d0Shikaru  * Copyright (c) 2019 Internet Initiative Japan, Inc.
5*87bee1d0Shikaru  * All rights reserved.
6*87bee1d0Shikaru  *
7*87bee1d0Shikaru  * Redistribution and use in source and binary forms, with or without
8*87bee1d0Shikaru  * modification, are permitted provided that the following conditions
9*87bee1d0Shikaru  * are met:
10*87bee1d0Shikaru  * 1. Redistributions of source code must retain the above copyright
11*87bee1d0Shikaru  *    notice, this list of conditions and the following disclaimer.
12*87bee1d0Shikaru  * 2. Redistributions in binary form must reproduce the above copyright
13*87bee1d0Shikaru  *    notice, this list of conditions and the following disclaimer in the
14*87bee1d0Shikaru  *    documentation and/or other materials provided with the distribution.
15*87bee1d0Shikaru  *
16*87bee1d0Shikaru  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17*87bee1d0Shikaru  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18*87bee1d0Shikaru  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19*87bee1d0Shikaru  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20*87bee1d0Shikaru  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*87bee1d0Shikaru  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*87bee1d0Shikaru  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*87bee1d0Shikaru  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*87bee1d0Shikaru  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*87bee1d0Shikaru  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*87bee1d0Shikaru  * POSSIBILITY OF SUCH DAMAGE.
27*87bee1d0Shikaru  */
28*87bee1d0Shikaru 
29*87bee1d0Shikaru /*
30*87bee1d0Shikaru  *   Copyright(c) 2014 Intel Corporation.
31*87bee1d0Shikaru  *   Redistribution and use in source and binary forms, with or without
32*87bee1d0Shikaru  *   modification, are permitted provided that the following conditions
33*87bee1d0Shikaru  *   are met:
34*87bee1d0Shikaru  *
35*87bee1d0Shikaru  *     * Redistributions of source code must retain the above copyright
36*87bee1d0Shikaru  *       notice, this list of conditions and the following disclaimer.
37*87bee1d0Shikaru  *     * Redistributions in binary form must reproduce the above copyright
38*87bee1d0Shikaru  *       notice, this list of conditions and the following disclaimer in
39*87bee1d0Shikaru  *       the documentation and/or other materials provided with the
40*87bee1d0Shikaru  *       distribution.
41*87bee1d0Shikaru  *     * Neither the name of Intel Corporation nor the names of its
42*87bee1d0Shikaru  *       contributors may be used to endorse or promote products derived
43*87bee1d0Shikaru  *       from this software without specific prior written permission.
44*87bee1d0Shikaru  *
45*87bee1d0Shikaru  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46*87bee1d0Shikaru  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
47*87bee1d0Shikaru  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
48*87bee1d0Shikaru  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
49*87bee1d0Shikaru  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50*87bee1d0Shikaru  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51*87bee1d0Shikaru  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
52*87bee1d0Shikaru  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53*87bee1d0Shikaru  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
54*87bee1d0Shikaru  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
55*87bee1d0Shikaru  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56*87bee1d0Shikaru  */
57*87bee1d0Shikaru 
58*87bee1d0Shikaru #include <sys/cdefs.h>
59*87bee1d0Shikaru __KERNEL_RCSID(0, "$NetBSD: qat_hw17.c,v 1.1 2019/11/20 09:37:46 hikaru Exp $");
60*87bee1d0Shikaru 
61*87bee1d0Shikaru #include <sys/param.h>
62*87bee1d0Shikaru #include <sys/systm.h>
63*87bee1d0Shikaru #include <sys/proc.h>
64*87bee1d0Shikaru 
65*87bee1d0Shikaru #include <opencrypto/xform.h>
66*87bee1d0Shikaru 
67*87bee1d0Shikaru /* XXX same as sys/arch/x86/x86/via_padlock.c */
68*87bee1d0Shikaru #include <opencrypto/cryptosoft_xform.c>
69*87bee1d0Shikaru 
70*87bee1d0Shikaru #include <dev/pci/pcireg.h>
71*87bee1d0Shikaru #include <dev/pci/pcivar.h>
72*87bee1d0Shikaru 
73*87bee1d0Shikaru #include "qatreg.h"
74*87bee1d0Shikaru #include "qat_hw17reg.h"
75*87bee1d0Shikaru #include "qatvar.h"
76*87bee1d0Shikaru #include "qat_hw17var.h"
77*87bee1d0Shikaru 
78*87bee1d0Shikaru int		qat_adm_mailbox_put_msg_sync(struct qat_softc *, uint32_t,
79*87bee1d0Shikaru 		    void *, void *);
80*87bee1d0Shikaru int		qat_adm_mailbox_send(struct qat_softc *,
81*87bee1d0Shikaru 		    struct fw_init_admin_req *, struct fw_init_admin_resp *);
82*87bee1d0Shikaru int		qat_adm_mailbox_send_init_me(struct qat_softc *);
83*87bee1d0Shikaru int		qat_adm_mailbox_send_hb_timer(struct qat_softc *);
84*87bee1d0Shikaru int		qat_adm_mailbox_send_fw_status(struct qat_softc *);
85*87bee1d0Shikaru int		qat_adm_mailbox_send_constants(struct qat_softc *);
86*87bee1d0Shikaru 
87*87bee1d0Shikaru uint32_t	qat_hw17_crypto_setup_cipher_desc(struct qat_session *,
88*87bee1d0Shikaru 		    struct qat_crypto_desc *, struct cryptoini *,
89*87bee1d0Shikaru 		    union hw_cipher_algo_blk *, uint32_t, struct fw_la_bulk_req *,
90*87bee1d0Shikaru 		    enum fw_slice);
91*87bee1d0Shikaru uint32_t	qat_hw17_crypto_setup_auth_desc(struct qat_session *,
92*87bee1d0Shikaru 		    struct qat_crypto_desc *, struct cryptoini *,
93*87bee1d0Shikaru 		    union hw_auth_algo_blk *, uint32_t, struct fw_la_bulk_req *,
94*87bee1d0Shikaru 		    enum fw_slice);
95*87bee1d0Shikaru void		qat_hw17_init_comn_req_hdr(struct qat_crypto_desc *,
96*87bee1d0Shikaru 		    struct fw_la_bulk_req *);
97*87bee1d0Shikaru 
98*87bee1d0Shikaru int
qat_adm_mailbox_init(struct qat_softc * sc)99*87bee1d0Shikaru qat_adm_mailbox_init(struct qat_softc *sc)
100*87bee1d0Shikaru {
101*87bee1d0Shikaru 	uint64_t addr;
102*87bee1d0Shikaru 	int error;
103*87bee1d0Shikaru 	struct qat_dmamem *qdm;
104*87bee1d0Shikaru 
105*87bee1d0Shikaru 	error = qat_alloc_dmamem(sc, &sc->sc_admin_comms.qadc_dma,
106*87bee1d0Shikaru 	    PAGE_SIZE, PAGE_SIZE);
107*87bee1d0Shikaru 	if (error)
108*87bee1d0Shikaru 		return error;
109*87bee1d0Shikaru 
110*87bee1d0Shikaru 	qdm = &sc->sc_admin_comms.qadc_const_tbl_dma;
111*87bee1d0Shikaru 	error = qat_alloc_dmamem(sc, qdm, PAGE_SIZE, PAGE_SIZE);
112*87bee1d0Shikaru 	if (error)
113*87bee1d0Shikaru 		return error;
114*87bee1d0Shikaru 
115*87bee1d0Shikaru 	memcpy(qdm->qdm_dma_vaddr,
116*87bee1d0Shikaru 	    mailbox_const_tab, sizeof(mailbox_const_tab));
117*87bee1d0Shikaru 
118*87bee1d0Shikaru 	bus_dmamap_sync(sc->sc_dmat, qdm->qdm_dma_map, 0,
119*87bee1d0Shikaru 	    qdm->qdm_dma_map->dm_mapsize, BUS_DMASYNC_PREWRITE);
120*87bee1d0Shikaru 
121*87bee1d0Shikaru 	error = qat_alloc_dmamem(sc, &sc->sc_admin_comms.qadc_hb_dma,
122*87bee1d0Shikaru 	    PAGE_SIZE, PAGE_SIZE);
123*87bee1d0Shikaru 	if (error)
124*87bee1d0Shikaru 		return error;
125*87bee1d0Shikaru 
126*87bee1d0Shikaru 	addr = (uint64_t)sc->sc_admin_comms.qadc_dma.qdm_dma_seg.ds_addr;
127*87bee1d0Shikaru 	qat_misc_write_4(sc, ADMINMSGUR, addr >> 32);
128*87bee1d0Shikaru 	qat_misc_write_4(sc, ADMINMSGLR, addr);
129*87bee1d0Shikaru 
130*87bee1d0Shikaru 	return 0;
131*87bee1d0Shikaru }
132*87bee1d0Shikaru 
133*87bee1d0Shikaru int
qat_adm_mailbox_put_msg_sync(struct qat_softc * sc,uint32_t ae,void * in,void * out)134*87bee1d0Shikaru qat_adm_mailbox_put_msg_sync(struct qat_softc *sc, uint32_t ae,
135*87bee1d0Shikaru     void *in, void *out)
136*87bee1d0Shikaru {
137*87bee1d0Shikaru 	uint32_t mailbox;
138*87bee1d0Shikaru 	bus_size_t mb_offset = MAILBOX_BASE + (ae * MAILBOX_STRIDE);
139*87bee1d0Shikaru 	int offset = ae * ADMINMSG_LEN * 2;
140*87bee1d0Shikaru 	int times, received;
141*87bee1d0Shikaru 	uint8_t *buf = (uint8_t *)sc->sc_admin_comms.qadc_dma.qdm_dma_vaddr + offset;
142*87bee1d0Shikaru 
143*87bee1d0Shikaru 	mailbox = qat_misc_read_4(sc, mb_offset);
144*87bee1d0Shikaru 	if (mailbox == 1)
145*87bee1d0Shikaru 		return EAGAIN;
146*87bee1d0Shikaru 
147*87bee1d0Shikaru 	memcpy(buf, in, ADMINMSG_LEN);
148*87bee1d0Shikaru 	bus_dmamap_sync(sc->sc_dmat, sc->sc_admin_comms.qadc_dma.qdm_dma_map, 0,
149*87bee1d0Shikaru 	    sc->sc_admin_comms.qadc_dma.qdm_dma_map->dm_mapsize,
150*87bee1d0Shikaru 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
151*87bee1d0Shikaru 	qat_misc_write_4(sc, mb_offset, 1);
152*87bee1d0Shikaru 
153*87bee1d0Shikaru 	received = 0;
154*87bee1d0Shikaru 	for (times = 0; times < 50; times++) {
155*87bee1d0Shikaru 		delay(20000);
156*87bee1d0Shikaru 		if (qat_misc_read_4(sc, mb_offset) == 0) {
157*87bee1d0Shikaru 			received = 1;
158*87bee1d0Shikaru 			break;
159*87bee1d0Shikaru 		}
160*87bee1d0Shikaru 	}
161*87bee1d0Shikaru 	if (received) {
162*87bee1d0Shikaru 		bus_dmamap_sync(sc->sc_dmat, sc->sc_admin_comms.qadc_dma.qdm_dma_map, 0,
163*87bee1d0Shikaru 		    sc->sc_admin_comms.qadc_dma.qdm_dma_map->dm_mapsize,
164*87bee1d0Shikaru 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
165*87bee1d0Shikaru 		memcpy(out, buf + ADMINMSG_LEN, ADMINMSG_LEN);
166*87bee1d0Shikaru 	} else {
167*87bee1d0Shikaru 		aprint_error_dev(sc->sc_dev,
168*87bee1d0Shikaru 		    "Failed to send admin msg to accelerator\n");
169*87bee1d0Shikaru 	}
170*87bee1d0Shikaru 
171*87bee1d0Shikaru 	return received ? 0 : EFAULT;
172*87bee1d0Shikaru }
173*87bee1d0Shikaru 
174*87bee1d0Shikaru int
qat_adm_mailbox_send(struct qat_softc * sc,struct fw_init_admin_req * req,struct fw_init_admin_resp * resp)175*87bee1d0Shikaru qat_adm_mailbox_send(struct qat_softc *sc,
176*87bee1d0Shikaru     struct fw_init_admin_req *req, struct fw_init_admin_resp *resp)
177*87bee1d0Shikaru {
178*87bee1d0Shikaru 	int error;
179*87bee1d0Shikaru 	uint32_t mask;
180*87bee1d0Shikaru 	uint8_t ae;
181*87bee1d0Shikaru 
182*87bee1d0Shikaru 	for (ae = 0, mask = sc->sc_ae_mask; mask; ae++, mask >>= 1) {
183*87bee1d0Shikaru 		if (!(mask & 1))
184*87bee1d0Shikaru 			continue;
185*87bee1d0Shikaru 
186*87bee1d0Shikaru 		error = qat_adm_mailbox_put_msg_sync(sc, ae, req, resp);
187*87bee1d0Shikaru 		if (error)
188*87bee1d0Shikaru 			return error;
189*87bee1d0Shikaru 		if (resp->init_resp_hdr.status) {
190*87bee1d0Shikaru 			aprint_error_dev(sc->sc_dev,
191*87bee1d0Shikaru 			    "Failed to send admin msg: cmd %d\n",
192*87bee1d0Shikaru 			    req->init_admin_cmd_id);
193*87bee1d0Shikaru 			return EFAULT;
194*87bee1d0Shikaru 		}
195*87bee1d0Shikaru 	}
196*87bee1d0Shikaru 
197*87bee1d0Shikaru 	return 0;
198*87bee1d0Shikaru }
199*87bee1d0Shikaru 
200*87bee1d0Shikaru int
qat_adm_mailbox_send_init_me(struct qat_softc * sc)201*87bee1d0Shikaru qat_adm_mailbox_send_init_me(struct qat_softc *sc)
202*87bee1d0Shikaru {
203*87bee1d0Shikaru 	struct fw_init_admin_req req;
204*87bee1d0Shikaru 	struct fw_init_admin_resp resp;
205*87bee1d0Shikaru 
206*87bee1d0Shikaru 	memset(&req, 0, sizeof(req));
207*87bee1d0Shikaru 	req.init_admin_cmd_id = FW_INIT_ME;
208*87bee1d0Shikaru 
209*87bee1d0Shikaru 	return qat_adm_mailbox_send(sc, &req, &resp);
210*87bee1d0Shikaru }
211*87bee1d0Shikaru 
212*87bee1d0Shikaru int
qat_adm_mailbox_send_hb_timer(struct qat_softc * sc)213*87bee1d0Shikaru qat_adm_mailbox_send_hb_timer(struct qat_softc *sc)
214*87bee1d0Shikaru {
215*87bee1d0Shikaru 	struct fw_init_admin_req req;
216*87bee1d0Shikaru 	struct fw_init_admin_resp resp;
217*87bee1d0Shikaru 
218*87bee1d0Shikaru 	memset(&req, 0, sizeof(req));
219*87bee1d0Shikaru 	req.init_admin_cmd_id = FW_HEARTBEAT_TIMER_SET;
220*87bee1d0Shikaru 
221*87bee1d0Shikaru 	req.init_cfg_ptr = sc->sc_admin_comms.qadc_hb_dma.qdm_dma_seg.ds_addr;
222*87bee1d0Shikaru 	req.heartbeat_ticks =
223*87bee1d0Shikaru 	    sc->sc_hw.qhw_clock_per_sec / 1000 * QAT_HB_INTERVAL;
224*87bee1d0Shikaru 
225*87bee1d0Shikaru 	return qat_adm_mailbox_send(sc, &req, &resp);
226*87bee1d0Shikaru }
227*87bee1d0Shikaru 
228*87bee1d0Shikaru int
qat_adm_mailbox_send_fw_status(struct qat_softc * sc)229*87bee1d0Shikaru qat_adm_mailbox_send_fw_status(struct qat_softc *sc)
230*87bee1d0Shikaru {
231*87bee1d0Shikaru 	int error;
232*87bee1d0Shikaru 	struct fw_init_admin_req req;
233*87bee1d0Shikaru 	struct fw_init_admin_resp resp;
234*87bee1d0Shikaru 
235*87bee1d0Shikaru 	memset(&req, 0, sizeof(req));
236*87bee1d0Shikaru 	req.init_admin_cmd_id = FW_STATUS_GET;
237*87bee1d0Shikaru 
238*87bee1d0Shikaru 	error = qat_adm_mailbox_send(sc, &req, &resp);
239*87bee1d0Shikaru 	if (error)
240*87bee1d0Shikaru 		return error;
241*87bee1d0Shikaru 
242*87bee1d0Shikaru 	aprint_normal_dev(sc->sc_dev,
243*87bee1d0Shikaru 	    "loaded firmware: version %d.%d.%d\n",
244*87bee1d0Shikaru 	    resp.u.s.version_major_num,
245*87bee1d0Shikaru 	    resp.u.s.version_minor_num,
246*87bee1d0Shikaru 	    resp.init_resp_pars.u.s1.version_patch_num);
247*87bee1d0Shikaru 
248*87bee1d0Shikaru 	return 0;
249*87bee1d0Shikaru }
250*87bee1d0Shikaru 
251*87bee1d0Shikaru int
qat_adm_mailbox_send_constants(struct qat_softc * sc)252*87bee1d0Shikaru qat_adm_mailbox_send_constants(struct qat_softc *sc)
253*87bee1d0Shikaru {
254*87bee1d0Shikaru 	struct fw_init_admin_req req;
255*87bee1d0Shikaru 	struct fw_init_admin_resp resp;
256*87bee1d0Shikaru 
257*87bee1d0Shikaru 	memset(&req, 0, sizeof(req));
258*87bee1d0Shikaru 	req.init_admin_cmd_id = FW_CONSTANTS_CFG;
259*87bee1d0Shikaru 
260*87bee1d0Shikaru 	req.init_cfg_sz = 1024;
261*87bee1d0Shikaru 	req.init_cfg_ptr =
262*87bee1d0Shikaru 	    sc->sc_admin_comms.qadc_const_tbl_dma.qdm_dma_seg.ds_addr;
263*87bee1d0Shikaru 
264*87bee1d0Shikaru 	return qat_adm_mailbox_send(sc, &req, &resp);
265*87bee1d0Shikaru }
266*87bee1d0Shikaru 
267*87bee1d0Shikaru int
qat_adm_mailbox_send_init(struct qat_softc * sc)268*87bee1d0Shikaru qat_adm_mailbox_send_init(struct qat_softc *sc)
269*87bee1d0Shikaru {
270*87bee1d0Shikaru 	int error;
271*87bee1d0Shikaru 
272*87bee1d0Shikaru 	error = qat_adm_mailbox_send_init_me(sc);
273*87bee1d0Shikaru 	if (error)
274*87bee1d0Shikaru 		return error;
275*87bee1d0Shikaru 
276*87bee1d0Shikaru 	error = qat_adm_mailbox_send_hb_timer(sc);
277*87bee1d0Shikaru 	if (error)
278*87bee1d0Shikaru 		return error;
279*87bee1d0Shikaru 
280*87bee1d0Shikaru 	error = qat_adm_mailbox_send_fw_status(sc);
281*87bee1d0Shikaru 	if (error)
282*87bee1d0Shikaru 		return error;
283*87bee1d0Shikaru 
284*87bee1d0Shikaru 	return qat_adm_mailbox_send_constants(sc);
285*87bee1d0Shikaru }
286*87bee1d0Shikaru 
287*87bee1d0Shikaru int
qat_arb_init(struct qat_softc * sc)288*87bee1d0Shikaru qat_arb_init(struct qat_softc *sc)
289*87bee1d0Shikaru {
290*87bee1d0Shikaru 	uint32_t arb_cfg = 0x1 << 31 | 0x4 << 4 | 0x1;
291*87bee1d0Shikaru 	uint32_t arb, i;
292*87bee1d0Shikaru 	const uint32_t *thd_2_arb_cfg;
293*87bee1d0Shikaru 
294*87bee1d0Shikaru 	/* Service arb configured for 32 bytes responses and
295*87bee1d0Shikaru 	 * ring flow control check enabled. */
296*87bee1d0Shikaru 	for (arb = 0; arb < MAX_ARB; arb++)
297*87bee1d0Shikaru 		qat_arb_sarconfig_write_4(sc, arb, arb_cfg);
298*87bee1d0Shikaru 
299*87bee1d0Shikaru 	/* Map worker threads to service arbiters */
300*87bee1d0Shikaru 	sc->sc_hw.qhw_get_arb_mapping(sc, &thd_2_arb_cfg);
301*87bee1d0Shikaru 
302*87bee1d0Shikaru 	if (!thd_2_arb_cfg)
303*87bee1d0Shikaru 		return EINVAL;
304*87bee1d0Shikaru 
305*87bee1d0Shikaru 	for (i = 0; i < sc->sc_hw.qhw_num_engines; i++)
306*87bee1d0Shikaru 		qat_arb_wrk_2_ser_map_write_4(sc, i, *(thd_2_arb_cfg + i));
307*87bee1d0Shikaru 
308*87bee1d0Shikaru 	return 0;
309*87bee1d0Shikaru }
310*87bee1d0Shikaru 
311*87bee1d0Shikaru int
qat_set_ssm_wdtimer(struct qat_softc * sc)312*87bee1d0Shikaru qat_set_ssm_wdtimer(struct qat_softc *sc)
313*87bee1d0Shikaru {
314*87bee1d0Shikaru 	uint32_t timer;
315*87bee1d0Shikaru 	u_int mask;
316*87bee1d0Shikaru 	int i;
317*87bee1d0Shikaru 
318*87bee1d0Shikaru 	timer = sc->sc_hw.qhw_clock_per_sec / 1000 * QAT_SSM_WDT;
319*87bee1d0Shikaru 	for (i = 0, mask = sc->sc_accel_mask; mask; i++, mask >>= 1) {
320*87bee1d0Shikaru 		if (!(mask & 1))
321*87bee1d0Shikaru 			continue;
322*87bee1d0Shikaru 		qat_misc_write_4(sc, SSMWDT(i), timer);
323*87bee1d0Shikaru 		qat_misc_write_4(sc, SSMWDTPKE(i), timer);
324*87bee1d0Shikaru 	}
325*87bee1d0Shikaru 
326*87bee1d0Shikaru 	return 0;
327*87bee1d0Shikaru }
328*87bee1d0Shikaru 
329*87bee1d0Shikaru int
qat_check_slice_hang(struct qat_softc * sc)330*87bee1d0Shikaru qat_check_slice_hang(struct qat_softc *sc)
331*87bee1d0Shikaru {
332*87bee1d0Shikaru 	int handled = 0;
333*87bee1d0Shikaru 
334*87bee1d0Shikaru 	return handled;
335*87bee1d0Shikaru }
336*87bee1d0Shikaru 
337*87bee1d0Shikaru uint32_t
qat_hw17_crypto_setup_cipher_desc(struct qat_session * qs,struct qat_crypto_desc * desc,struct cryptoini * crie,union hw_cipher_algo_blk * cipher,uint32_t cd_blk_offset,struct fw_la_bulk_req * req_tmpl,enum fw_slice next_slice)338*87bee1d0Shikaru qat_hw17_crypto_setup_cipher_desc(struct qat_session *qs,
339*87bee1d0Shikaru     struct qat_crypto_desc *desc, struct cryptoini *crie,
340*87bee1d0Shikaru     union hw_cipher_algo_blk *cipher, uint32_t cd_blk_offset,
341*87bee1d0Shikaru     struct fw_la_bulk_req *req_tmpl, enum fw_slice next_slice)
342*87bee1d0Shikaru {
343*87bee1d0Shikaru 	struct fw_cipher_cd_ctrl_hdr *cipher_cd_ctrl =
344*87bee1d0Shikaru 	    (struct fw_cipher_cd_ctrl_hdr *)&req_tmpl->cd_ctrl;
345*87bee1d0Shikaru 	int keylen = crie->cri_klen / 8;
346*87bee1d0Shikaru 
347*87bee1d0Shikaru 	cipher->max.cipher_config.val =
348*87bee1d0Shikaru 	    qat_crypto_load_cipher_cryptoini(desc, crie);
349*87bee1d0Shikaru 	memcpy(cipher->max.key, crie->cri_key, keylen);
350*87bee1d0Shikaru 
351*87bee1d0Shikaru 	cipher_cd_ctrl->cipher_state_sz = desc->qcd_cipher_blk_sz >> 3;
352*87bee1d0Shikaru 	cipher_cd_ctrl->cipher_key_sz = keylen >> 3;
353*87bee1d0Shikaru 	cipher_cd_ctrl->cipher_cfg_offset = cd_blk_offset >> 3;
354*87bee1d0Shikaru 	FW_COMN_CURR_ID_SET(cipher_cd_ctrl, FW_SLICE_CIPHER);
355*87bee1d0Shikaru 	FW_COMN_NEXT_ID_SET(cipher_cd_ctrl, next_slice);
356*87bee1d0Shikaru 
357*87bee1d0Shikaru 	return roundup(sizeof(struct hw_cipher_config) + keylen, 8);
358*87bee1d0Shikaru }
359*87bee1d0Shikaru 
360*87bee1d0Shikaru uint32_t
qat_hw17_crypto_setup_auth_desc(struct qat_session * qs,struct qat_crypto_desc * desc,struct cryptoini * cria,union hw_auth_algo_blk * auth,uint32_t cd_blk_offset,struct fw_la_bulk_req * req_tmpl,enum fw_slice next_slice)361*87bee1d0Shikaru qat_hw17_crypto_setup_auth_desc(struct qat_session *qs,
362*87bee1d0Shikaru     struct qat_crypto_desc *desc, struct cryptoini *cria,
363*87bee1d0Shikaru     union hw_auth_algo_blk *auth, uint32_t cd_blk_offset,
364*87bee1d0Shikaru     struct fw_la_bulk_req *req_tmpl, enum fw_slice next_slice)
365*87bee1d0Shikaru {
366*87bee1d0Shikaru 	struct fw_auth_cd_ctrl_hdr *auth_cd_ctrl =
367*87bee1d0Shikaru 	    (struct fw_auth_cd_ctrl_hdr *)&req_tmpl->cd_ctrl;
368*87bee1d0Shikaru 	struct qat_sym_hash_def const *hash_def;
369*87bee1d0Shikaru 	uint8_t *state1, *state2;
370*87bee1d0Shikaru 
371*87bee1d0Shikaru 	auth->max.inner_setup.auth_config.config =
372*87bee1d0Shikaru 	    qat_crypto_load_auth_cryptoini(desc, cria, &hash_def);
373*87bee1d0Shikaru 	auth->max.inner_setup.auth_counter.counter =
374*87bee1d0Shikaru 	    htonl(hash_def->qshd_qat->qshqi_auth_counter);
375*87bee1d0Shikaru 
376*87bee1d0Shikaru 	auth_cd_ctrl->hash_cfg_offset = cd_blk_offset >> 3;
377*87bee1d0Shikaru 	auth_cd_ctrl->hash_flags = FW_AUTH_HDR_FLAG_NO_NESTED;
378*87bee1d0Shikaru 	auth_cd_ctrl->inner_res_sz = hash_def->qshd_alg->qshai_digest_len;
379*87bee1d0Shikaru 	auth_cd_ctrl->final_sz = desc->qcd_auth_sz;
380*87bee1d0Shikaru 
381*87bee1d0Shikaru 	auth_cd_ctrl->inner_state1_sz =
382*87bee1d0Shikaru 	    roundup(hash_def->qshd_qat->qshqi_state1_len, 8);
383*87bee1d0Shikaru 	auth_cd_ctrl->inner_state2_sz =
384*87bee1d0Shikaru 	    roundup(hash_def->qshd_qat->qshqi_state2_len, 8);
385*87bee1d0Shikaru 	auth_cd_ctrl->inner_state2_offset =
386*87bee1d0Shikaru 	    auth_cd_ctrl->hash_cfg_offset +
387*87bee1d0Shikaru 	    ((sizeof(struct hw_auth_setup) +
388*87bee1d0Shikaru 	    auth_cd_ctrl->inner_state1_sz) >> 3);
389*87bee1d0Shikaru 
390*87bee1d0Shikaru 	state1 = auth->max.state1;
391*87bee1d0Shikaru 	state2 = auth->max.state1 + auth_cd_ctrl->inner_state1_sz;
392*87bee1d0Shikaru 	qat_crypto_hmac_precompute(desc, cria, hash_def, state1, state2);
393*87bee1d0Shikaru 
394*87bee1d0Shikaru 	FW_COMN_CURR_ID_SET(auth_cd_ctrl, FW_SLICE_AUTH);
395*87bee1d0Shikaru 	FW_COMN_NEXT_ID_SET(auth_cd_ctrl, next_slice);
396*87bee1d0Shikaru 
397*87bee1d0Shikaru 	return roundup(auth_cd_ctrl->inner_state1_sz +
398*87bee1d0Shikaru 	    auth_cd_ctrl->inner_state2_sz +
399*87bee1d0Shikaru 	    sizeof(struct hw_auth_setup), 8);
400*87bee1d0Shikaru }
401*87bee1d0Shikaru 
402*87bee1d0Shikaru void
qat_hw17_init_comn_req_hdr(struct qat_crypto_desc * desc,struct fw_la_bulk_req * req)403*87bee1d0Shikaru qat_hw17_init_comn_req_hdr(struct qat_crypto_desc *desc,
404*87bee1d0Shikaru     struct fw_la_bulk_req *req)
405*87bee1d0Shikaru {
406*87bee1d0Shikaru 	union fw_comn_req_hdr_cd_pars *cd_pars = &req->cd_pars;
407*87bee1d0Shikaru 	struct fw_comn_req_hdr *req_hdr = &req->comn_hdr;
408*87bee1d0Shikaru 
409*87bee1d0Shikaru 	req_hdr->service_cmd_id = desc->qcd_cmd_id;
410*87bee1d0Shikaru 	req_hdr->hdr_flags = FW_COMN_VALID;
411*87bee1d0Shikaru 	req_hdr->service_type = FW_COMN_REQ_CPM_FW_LA;
412*87bee1d0Shikaru 	req_hdr->comn_req_flags = FW_COMN_FLAGS_BUILD(
413*87bee1d0Shikaru 	    COMN_CD_FLD_TYPE_64BIT_ADR, COMN_PTR_TYPE_SGL);
414*87bee1d0Shikaru 	req_hdr->serv_specif_flags = 0;
415*87bee1d0Shikaru 	cd_pars->s.content_desc_addr = desc->qcd_desc_paddr;
416*87bee1d0Shikaru }
417*87bee1d0Shikaru 
418*87bee1d0Shikaru void
qat_hw17_crypto_setup_desc(struct qat_crypto * qcy,struct qat_session * qs,struct qat_crypto_desc * desc,struct cryptoini * crie,struct cryptoini * cria)419*87bee1d0Shikaru qat_hw17_crypto_setup_desc(struct qat_crypto *qcy, struct qat_session *qs,
420*87bee1d0Shikaru     struct qat_crypto_desc *desc,
421*87bee1d0Shikaru     struct cryptoini *crie, struct cryptoini *cria)
422*87bee1d0Shikaru {
423*87bee1d0Shikaru 	union hw_cipher_algo_blk *cipher;
424*87bee1d0Shikaru 	union hw_auth_algo_blk *auth;
425*87bee1d0Shikaru 	struct fw_la_bulk_req *req_tmpl;
426*87bee1d0Shikaru 	struct fw_comn_req_hdr *req_hdr;
427*87bee1d0Shikaru 	union fw_comn_req_hdr_cd_pars *cd_pars;
428*87bee1d0Shikaru 	uint32_t cd_blk_offset = 0;
429*87bee1d0Shikaru 	int i;
430*87bee1d0Shikaru 	uint8_t *cd_blk_ptr;
431*87bee1d0Shikaru 
432*87bee1d0Shikaru 	req_tmpl = (struct fw_la_bulk_req *)desc->qcd_req_cache;
433*87bee1d0Shikaru 	req_hdr = &req_tmpl->comn_hdr;
434*87bee1d0Shikaru 	cd_pars = &req_tmpl->cd_pars;
435*87bee1d0Shikaru 	cd_blk_ptr = desc->qcd_content_desc;
436*87bee1d0Shikaru 
437*87bee1d0Shikaru 	memset(req_tmpl, 0, sizeof(struct fw_la_bulk_req));
438*87bee1d0Shikaru 	qat_hw17_init_comn_req_hdr(desc, req_tmpl);
439*87bee1d0Shikaru 
440*87bee1d0Shikaru 	for (i = 0; i < MAX_FW_SLICE; i++) {
441*87bee1d0Shikaru 		switch (desc->qcd_slices[i]) {
442*87bee1d0Shikaru 		case FW_SLICE_CIPHER:
443*87bee1d0Shikaru 			cipher = (union hw_cipher_algo_blk *)(cd_blk_ptr +
444*87bee1d0Shikaru 			    cd_blk_offset);
445*87bee1d0Shikaru 			cd_blk_offset += qat_hw17_crypto_setup_cipher_desc(
446*87bee1d0Shikaru 			    qs, desc, crie, cipher, cd_blk_offset, req_tmpl,
447*87bee1d0Shikaru 			    desc->qcd_slices[i + 1]);
448*87bee1d0Shikaru 			break;
449*87bee1d0Shikaru 		case FW_SLICE_AUTH:
450*87bee1d0Shikaru 			auth = (union hw_auth_algo_blk *)(cd_blk_ptr +
451*87bee1d0Shikaru 			    cd_blk_offset);
452*87bee1d0Shikaru 			cd_blk_offset += qat_hw17_crypto_setup_auth_desc(
453*87bee1d0Shikaru 			    qs, desc, cria, auth, cd_blk_offset, req_tmpl,
454*87bee1d0Shikaru 			    desc->qcd_slices[i + 1]);
455*87bee1d0Shikaru 			req_hdr->serv_specif_flags |= FW_LA_RET_AUTH_RES;
456*87bee1d0Shikaru 			/* no digest verify */
457*87bee1d0Shikaru 			break;
458*87bee1d0Shikaru 		case FW_SLICE_DRAM_WR:
459*87bee1d0Shikaru 			i = MAX_FW_SLICE; /* end of chain */
460*87bee1d0Shikaru 			break;
461*87bee1d0Shikaru 		default:
462*87bee1d0Shikaru 			KASSERT(0);
463*87bee1d0Shikaru 			break;
464*87bee1d0Shikaru 		}
465*87bee1d0Shikaru 	}
466*87bee1d0Shikaru 
467*87bee1d0Shikaru 	cd_pars->s.content_desc_params_sz =
468*87bee1d0Shikaru 	    roundup(cd_blk_offset, QAT_OPTIMAL_ALIGN) >> 3;
469*87bee1d0Shikaru 
470*87bee1d0Shikaru #ifdef QAT_DUMP
471*87bee1d0Shikaru 	qat_dump_raw(QAT_DUMP_DESC, "qcd_content_desc",
472*87bee1d0Shikaru 	    desc->qcd_content_desc, cd_pars->s.content_desc_params_sz << 3);
473*87bee1d0Shikaru 	qat_dump_raw(QAT_DUMP_DESC, "qcd_req_cache",
474*87bee1d0Shikaru 	    &desc->qcd_req_cache, sizeof(desc->qcd_req_cache));
475*87bee1d0Shikaru #endif
476*87bee1d0Shikaru 
477*87bee1d0Shikaru 	bus_dmamap_sync(qcy->qcy_sc->sc_dmat,
478*87bee1d0Shikaru 	    qcy->qcy_session_dmamems[qs->qs_lid].qdm_dma_map, 0,
479*87bee1d0Shikaru 	    sizeof(struct qat_session),
480*87bee1d0Shikaru 	    BUS_DMASYNC_PREWRITE);
481*87bee1d0Shikaru }
482*87bee1d0Shikaru 
483*87bee1d0Shikaru void
qat_hw17_crypto_setup_req_params(struct qat_crypto_bank * qcb,struct qat_session * qs,struct qat_crypto_desc const * desc,struct qat_sym_cookie * qsc,struct cryptodesc * crde,struct cryptodesc * crda,bus_addr_t icv_paddr)484*87bee1d0Shikaru qat_hw17_crypto_setup_req_params(struct qat_crypto_bank *qcb, struct qat_session *qs,
485*87bee1d0Shikaru     struct qat_crypto_desc const *desc, struct qat_sym_cookie *qsc,
486*87bee1d0Shikaru     struct cryptodesc *crde, struct cryptodesc *crda, bus_addr_t icv_paddr)
487*87bee1d0Shikaru {
488*87bee1d0Shikaru 	struct qat_sym_bulk_cookie *qsbc;
489*87bee1d0Shikaru 	struct fw_la_bulk_req *bulk_req;
490*87bee1d0Shikaru 	struct fw_la_cipher_req_params *cipher_param;
491*87bee1d0Shikaru 	struct fw_la_auth_req_params *auth_param;
492*87bee1d0Shikaru 	uint32_t req_params_offset = 0;
493*87bee1d0Shikaru 	uint8_t *req_params_ptr;
494*87bee1d0Shikaru 	enum fw_la_cmd_id cmd_id = desc->qcd_cmd_id;
495*87bee1d0Shikaru 
496*87bee1d0Shikaru 	qsbc = &qsc->u.qsc_bulk_cookie;
497*87bee1d0Shikaru 	bulk_req = (struct fw_la_bulk_req *)qsbc->qsbc_msg;
498*87bee1d0Shikaru 
499*87bee1d0Shikaru 	memcpy(bulk_req, desc->qcd_req_cache, sizeof(struct fw_la_bulk_req));
500*87bee1d0Shikaru 	bulk_req->comn_mid.opaque_data = (uint64_t)(uintptr_t)qsc;
501*87bee1d0Shikaru 	bulk_req->comn_mid.src_data_addr = qsc->qsc_buffer_list_desc_paddr;
502*87bee1d0Shikaru 	bulk_req->comn_mid.dest_data_addr = qsc->qsc_buffer_list_desc_paddr;
503*87bee1d0Shikaru 
504*87bee1d0Shikaru 	if (icv_paddr != 0)
505*87bee1d0Shikaru 		bulk_req->comn_hdr.serv_specif_flags |= FW_LA_DIGEST_IN_BUFFER;
506*87bee1d0Shikaru 
507*87bee1d0Shikaru 	req_params_ptr = (uint8_t *)&bulk_req->serv_specif_rqpars;
508*87bee1d0Shikaru 
509*87bee1d0Shikaru 	if (cmd_id != FW_LA_CMD_AUTH) {
510*87bee1d0Shikaru 		cipher_param = (struct fw_la_cipher_req_params *)
511*87bee1d0Shikaru 		    (req_params_ptr + req_params_offset);
512*87bee1d0Shikaru 		req_params_offset += sizeof(struct fw_la_cipher_req_params);
513*87bee1d0Shikaru 
514*87bee1d0Shikaru 		cipher_param->u.s.cipher_IV_ptr = qsc->qsc_iv_buf_paddr;
515*87bee1d0Shikaru 		cipher_param->cipher_offset = crde->crd_skip;
516*87bee1d0Shikaru 		cipher_param->cipher_length = crde->crd_len;
517*87bee1d0Shikaru 	}
518*87bee1d0Shikaru 
519*87bee1d0Shikaru 	if (cmd_id != FW_LA_CMD_CIPHER) {
520*87bee1d0Shikaru 		auth_param = (struct fw_la_auth_req_params *)
521*87bee1d0Shikaru 		    (req_params_ptr + req_params_offset);
522*87bee1d0Shikaru 		req_params_offset += sizeof(struct fw_la_auth_req_params);
523*87bee1d0Shikaru 
524*87bee1d0Shikaru 		auth_param->auth_off = crda->crd_skip;
525*87bee1d0Shikaru 		auth_param->auth_len = crda->crd_len;
526*87bee1d0Shikaru 		auth_param->auth_res_addr = icv_paddr;
527*87bee1d0Shikaru 		auth_param->auth_res_sz = 0; /* XXX no digest verify */
528*87bee1d0Shikaru 		auth_param->hash_state_sz = 0;
529*87bee1d0Shikaru 		auth_param->u1.auth_partial_st_prefix = 0;
530*87bee1d0Shikaru 		auth_param->u2.aad_sz = 0;
531*87bee1d0Shikaru 	}
532*87bee1d0Shikaru 
533*87bee1d0Shikaru #ifdef QAT_DUMP
534*87bee1d0Shikaru 	qat_dump_raw(QAT_DUMP_DESC, "req_params", req_params_ptr, req_params_offset);
535*87bee1d0Shikaru #endif
536*87bee1d0Shikaru }
537*87bee1d0Shikaru 
538