Home | History | Annotate | Line # | Download | only in qat
qat.c revision 1.8
      1  1.8  riastrad /*	$NetBSD: qat.c,v 1.8 2022/05/22 11:39:27 riastradh Exp $	*/
      2  1.1    hikaru 
      3  1.1    hikaru /*
      4  1.1    hikaru  * Copyright (c) 2019 Internet Initiative Japan, Inc.
      5  1.1    hikaru  * All rights reserved.
      6  1.1    hikaru  *
      7  1.1    hikaru  * Redistribution and use in source and binary forms, with or without
      8  1.1    hikaru  * modification, are permitted provided that the following conditions
      9  1.1    hikaru  * are met:
     10  1.1    hikaru  * 1. Redistributions of source code must retain the above copyright
     11  1.1    hikaru  *    notice, this list of conditions and the following disclaimer.
     12  1.1    hikaru  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1    hikaru  *    notice, this list of conditions and the following disclaimer in the
     14  1.1    hikaru  *    documentation and/or other materials provided with the distribution.
     15  1.1    hikaru  *
     16  1.1    hikaru  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  1.1    hikaru  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  1.1    hikaru  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  1.1    hikaru  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  1.1    hikaru  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1    hikaru  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1    hikaru  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1    hikaru  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1    hikaru  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1    hikaru  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1    hikaru  * POSSIBILITY OF SUCH DAMAGE.
     27  1.1    hikaru  */
     28  1.1    hikaru 
     29  1.1    hikaru /*
     30  1.1    hikaru  *   Copyright(c) 2007-2019 Intel Corporation. All rights reserved.
     31  1.1    hikaru  *
     32  1.1    hikaru  *   Redistribution and use in source and binary forms, with or without
     33  1.1    hikaru  *   modification, are permitted provided that the following conditions
     34  1.1    hikaru  *   are met:
     35  1.1    hikaru  *
     36  1.1    hikaru  *     * Redistributions of source code must retain the above copyright
     37  1.1    hikaru  *       notice, this list of conditions and the following disclaimer.
     38  1.1    hikaru  *     * Redistributions in binary form must reproduce the above copyright
     39  1.1    hikaru  *       notice, this list of conditions and the following disclaimer in
     40  1.1    hikaru  *       the documentation and/or other materials provided with the
     41  1.1    hikaru  *       distribution.
     42  1.1    hikaru  *     * Neither the name of Intel Corporation nor the names of its
     43  1.1    hikaru  *       contributors may be used to endorse or promote products derived
     44  1.1    hikaru  *       from this software without specific prior written permission.
     45  1.1    hikaru  *
     46  1.1    hikaru  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     47  1.1    hikaru  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     48  1.1    hikaru  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     49  1.1    hikaru  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     50  1.1    hikaru  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     51  1.1    hikaru  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     52  1.1    hikaru  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     53  1.1    hikaru  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     54  1.1    hikaru  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     55  1.1    hikaru  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     56  1.1    hikaru  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     57  1.1    hikaru  */
     58  1.1    hikaru 
     59  1.1    hikaru #include <sys/cdefs.h>
     60  1.8  riastrad __KERNEL_RCSID(0, "$NetBSD: qat.c,v 1.8 2022/05/22 11:39:27 riastradh Exp $");
     61  1.1    hikaru 
     62  1.1    hikaru #include <sys/param.h>
     63  1.1    hikaru #include <sys/systm.h>
     64  1.1    hikaru #include <sys/kernel.h>
     65  1.1    hikaru #include <sys/device.h>
     66  1.1    hikaru #include <sys/module.h>
     67  1.1    hikaru #include <sys/kmem.h>
     68  1.1    hikaru #include <sys/mutex.h>
     69  1.1    hikaru #include <sys/bitops.h>
     70  1.1    hikaru #include <sys/atomic.h>
     71  1.1    hikaru #include <sys/mbuf.h>
     72  1.1    hikaru #include <sys/cprng.h>
     73  1.1    hikaru #include <sys/cpu.h>
     74  1.1    hikaru #include <sys/interrupt.h>
     75  1.1    hikaru #include <sys/md5.h>
     76  1.1    hikaru #include <sys/sha1.h>
     77  1.1    hikaru #include <sys/sha2.h>
     78  1.1    hikaru 
     79  1.1    hikaru #include <opencrypto/cryptodev.h>
     80  1.1    hikaru #include <opencrypto/cryptosoft.h>
     81  1.1    hikaru #include <opencrypto/xform.h>
     82  1.1    hikaru 
     83  1.1    hikaru /* XXX same as sys/arch/x86/x86/via_padlock.c */
     84  1.1    hikaru #include <opencrypto/cryptosoft_xform.c>
     85  1.1    hikaru 
     86  1.1    hikaru #include <dev/pci/pcireg.h>
     87  1.1    hikaru #include <dev/pci/pcivar.h>
     88  1.1    hikaru #include <dev/pci/pcidevs.h>
     89  1.1    hikaru 
     90  1.1    hikaru #include "qatreg.h"
     91  1.1    hikaru #include "qatvar.h"
     92  1.1    hikaru #include "qat_aevar.h"
     93  1.1    hikaru 
     94  1.1    hikaru extern struct qat_hw qat_hw_c2xxx;
     95  1.1    hikaru extern struct qat_hw qat_hw_c3xxx;
     96  1.1    hikaru extern struct qat_hw qat_hw_c62x;
     97  1.1    hikaru extern struct qat_hw qat_hw_d15xx;
     98  1.1    hikaru 
     99  1.1    hikaru static const struct qat_product {
    100  1.1    hikaru 	pci_vendor_id_t qatp_vendor;
    101  1.1    hikaru 	pci_product_id_t qatp_product;
    102  1.1    hikaru 	const char *qatp_name;
    103  1.1    hikaru 	enum qat_chip_type qatp_chip;
    104  1.1    hikaru 	const struct qat_hw *qatp_hw;
    105  1.1    hikaru } qat_products[] = {
    106  1.1    hikaru 
    107  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C2000_IQIA_PHYS,
    108  1.1    hikaru 	  "Intel C2000 QuickAssist Physical Function",
    109  1.1    hikaru 	  QAT_CHIP_C2XXX, &qat_hw_c2xxx },
    110  1.1    hikaru 
    111  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C3K_QAT,
    112  1.1    hikaru 	  "Intel C3000 QuickAssist Physical Function",
    113  1.1    hikaru 	  QAT_CHIP_C3XXX, &qat_hw_c3xxx },
    114  1.1    hikaru #ifdef notyet
    115  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C3K_QAT_VF,
    116  1.1    hikaru 	  "Intel C3000 QuickAssist Virtual Function",
    117  1.1    hikaru 	  QAT_CHIP_C3XXX_IOV, &qat_hw_c3xxxvf },
    118  1.1    hikaru #endif
    119  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C620_QAT,
    120  1.1    hikaru 	  "Intel C620/Xeon D-2100 QuickAssist Physical Function",
    121  1.1    hikaru 	  QAT_CHIP_C62X, &qat_hw_c62x },
    122  1.1    hikaru #ifdef notyet
    123  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C620_QAT_VF,
    124  1.1    hikaru 	  "Intel C620/Xeon D-2100 QuickAssist Virtual Function",
    125  1.1    hikaru 	  QAT_CHIP_C62X_IOV, &qat_hw_c62xvf },
    126  1.1    hikaru #endif
    127  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_XEOND_QAT,
    128  1.1    hikaru 	  "Intel Xeon D-1500 QuickAssist Physical Function",
    129  1.1    hikaru 	  QAT_CHIP_D15XX, &qat_hw_d15xx },
    130  1.1    hikaru #ifdef notyet
    131  1.1    hikaru 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_XEOND_QAT_VF,
    132  1.1    hikaru 	  "Intel Xeon D-1500 QuickAssist Virtual Function",
    133  1.1    hikaru 	  QAT_CHIP_D15XX_IOV, &qat_hw_d15xxvf },
    134  1.1    hikaru #endif
    135  1.1    hikaru 	{ 0, 0, NULL, 0, NULL },
    136  1.1    hikaru };
    137  1.1    hikaru 
    138  1.1    hikaru /* md5 16 bytes - Initialiser state can be found in RFC 1321*/
    139  1.1    hikaru static const uint8_t md5_initial_state[QAT_HASH_MD5_STATE_SIZE] = {
    140  1.1    hikaru 	0x01, 0x23, 0x45, 0x67,
    141  1.1    hikaru 	0x89, 0xab, 0xcd, 0xef,
    142  1.1    hikaru 	0xfe, 0xdc, 0xba, 0x98,
    143  1.1    hikaru 	0x76, 0x54, 0x32, 0x10,
    144  1.1    hikaru };
    145  1.1    hikaru 
    146  1.1    hikaru /* SHA1 - 20 bytes - Initialiser state can be found in FIPS stds 180-2 */
    147  1.1    hikaru static const uint8_t sha1_initial_state[QAT_HASH_SHA1_STATE_SIZE] = {
    148  1.1    hikaru 	0x67, 0x45, 0x23, 0x01,
    149  1.1    hikaru 	0xef, 0xcd, 0xab, 0x89,
    150  1.1    hikaru 	0x98, 0xba, 0xdc, 0xfe,
    151  1.1    hikaru 	0x10, 0x32, 0x54, 0x76,
    152  1.1    hikaru 	0xc3, 0xd2, 0xe1, 0xf0
    153  1.1    hikaru };
    154  1.1    hikaru 
    155  1.1    hikaru /* SHA 256 - 32 bytes - Initialiser state can be found in FIPS stds 180-2 */
    156  1.1    hikaru static const uint8_t sha256_initial_state[QAT_HASH_SHA256_STATE_SIZE] = {
    157  1.1    hikaru 	0x6a, 0x09, 0xe6, 0x67,
    158  1.1    hikaru 	0xbb, 0x67, 0xae, 0x85,
    159  1.1    hikaru 	0x3c, 0x6e, 0xf3, 0x72,
    160  1.1    hikaru 	0xa5, 0x4f, 0xf5, 0x3a,
    161  1.1    hikaru 	0x51, 0x0e, 0x52, 0x7f,
    162  1.1    hikaru 	0x9b, 0x05, 0x68, 0x8c,
    163  1.1    hikaru 	0x1f, 0x83, 0xd9, 0xab,
    164  1.1    hikaru 	0x5b, 0xe0, 0xcd, 0x19
    165  1.1    hikaru };
    166  1.1    hikaru 
    167  1.1    hikaru /* SHA 384 - 64 bytes - Initialiser state can be found in FIPS stds 180-2 */
    168  1.1    hikaru static const uint8_t sha384_initial_state[QAT_HASH_SHA384_STATE_SIZE] = {
    169  1.1    hikaru 	0xcb, 0xbb, 0x9d, 0x5d, 0xc1, 0x05, 0x9e, 0xd8,
    170  1.1    hikaru 	0x62, 0x9a, 0x29, 0x2a, 0x36, 0x7c, 0xd5, 0x07,
    171  1.1    hikaru 	0x91, 0x59, 0x01, 0x5a, 0x30, 0x70, 0xdd, 0x17,
    172  1.1    hikaru 	0x15, 0x2f, 0xec, 0xd8, 0xf7, 0x0e, 0x59, 0x39,
    173  1.1    hikaru 	0x67, 0x33, 0x26, 0x67, 0xff, 0xc0, 0x0b, 0x31,
    174  1.1    hikaru 	0x8e, 0xb4, 0x4a, 0x87, 0x68, 0x58, 0x15, 0x11,
    175  1.1    hikaru 	0xdb, 0x0c, 0x2e, 0x0d, 0x64, 0xf9, 0x8f, 0xa7,
    176  1.1    hikaru 	0x47, 0xb5, 0x48, 0x1d, 0xbe, 0xfa, 0x4f, 0xa4
    177  1.1    hikaru };
    178  1.1    hikaru 
    179  1.1    hikaru /* SHA 512 - 64 bytes - Initialiser state can be found in FIPS stds 180-2 */
    180  1.1    hikaru static const uint8_t sha512_initial_state[QAT_HASH_SHA512_STATE_SIZE] = {
    181  1.1    hikaru 	0x6a, 0x09, 0xe6, 0x67, 0xf3, 0xbc, 0xc9, 0x08,
    182  1.1    hikaru 	0xbb, 0x67, 0xae, 0x85, 0x84, 0xca, 0xa7, 0x3b,
    183  1.1    hikaru 	0x3c, 0x6e, 0xf3, 0x72, 0xfe, 0x94, 0xf8, 0x2b,
    184  1.1    hikaru 	0xa5, 0x4f, 0xf5, 0x3a, 0x5f, 0x1d, 0x36, 0xf1,
    185  1.1    hikaru 	0x51, 0x0e, 0x52, 0x7f, 0xad, 0xe6, 0x82, 0xd1,
    186  1.1    hikaru 	0x9b, 0x05, 0x68, 0x8c, 0x2b, 0x3e, 0x6c, 0x1f,
    187  1.1    hikaru 	0x1f, 0x83, 0xd9, 0xab, 0xfb, 0x41, 0xbd, 0x6b,
    188  1.1    hikaru 	0x5b, 0xe0, 0xcd, 0x19, 0x13, 0x7e, 0x21, 0x79
    189  1.1    hikaru };
    190  1.1    hikaru 
    191  1.1    hikaru /* Hash Algorithm specific structure */
    192  1.1    hikaru 
    193  1.1    hikaru static const struct qat_sym_hash_alg_info md5_info = {
    194  1.1    hikaru 	QAT_HASH_MD5_DIGEST_SIZE,
    195  1.1    hikaru 	QAT_HASH_MD5_BLOCK_SIZE,
    196  1.1    hikaru 	md5_initial_state,
    197  1.1    hikaru 	QAT_HASH_MD5_STATE_SIZE,
    198  1.1    hikaru 	&swcr_auth_hash_hmac_md5_96,
    199  1.1    hikaru 	offsetof(MD5_CTX, state),
    200  1.1    hikaru 	4,
    201  1.1    hikaru };
    202  1.1    hikaru 
    203  1.1    hikaru static const struct qat_sym_hash_alg_info sha1_info = {
    204  1.1    hikaru 	QAT_HASH_SHA1_DIGEST_SIZE,
    205  1.1    hikaru 	QAT_HASH_SHA1_BLOCK_SIZE,
    206  1.1    hikaru 	sha1_initial_state,
    207  1.1    hikaru 	QAT_HASH_SHA1_STATE_SIZE,
    208  1.1    hikaru 	&swcr_auth_hash_hmac_sha1_96,
    209  1.1    hikaru 	offsetof(SHA1_CTX, state),
    210  1.1    hikaru 	4,
    211  1.1    hikaru };
    212  1.1    hikaru 
    213  1.1    hikaru static const struct qat_sym_hash_alg_info sha256_info = {
    214  1.1    hikaru 	QAT_HASH_SHA256_DIGEST_SIZE,
    215  1.1    hikaru 	QAT_HASH_SHA256_BLOCK_SIZE,
    216  1.1    hikaru 	sha256_initial_state,
    217  1.1    hikaru 	QAT_HASH_SHA256_STATE_SIZE,
    218  1.1    hikaru 	&swcr_auth_hash_hmac_sha2_256,
    219  1.1    hikaru 	offsetof(SHA256_CTX, state),
    220  1.1    hikaru 	4,
    221  1.1    hikaru };
    222  1.1    hikaru 
    223  1.1    hikaru static const struct qat_sym_hash_alg_info sha384_info = {
    224  1.1    hikaru 	QAT_HASH_SHA384_DIGEST_SIZE,
    225  1.1    hikaru 	QAT_HASH_SHA384_BLOCK_SIZE,
    226  1.1    hikaru 	sha384_initial_state,
    227  1.1    hikaru 	QAT_HASH_SHA384_STATE_SIZE,
    228  1.1    hikaru 	&swcr_auth_hash_hmac_sha2_384,
    229  1.1    hikaru 	offsetof(SHA384_CTX, state),
    230  1.1    hikaru 	8,
    231  1.1    hikaru };
    232  1.1    hikaru 
    233  1.1    hikaru static const struct qat_sym_hash_alg_info sha512_info = {
    234  1.1    hikaru 	QAT_HASH_SHA512_DIGEST_SIZE,
    235  1.1    hikaru 	QAT_HASH_SHA512_BLOCK_SIZE,
    236  1.1    hikaru 	sha512_initial_state,
    237  1.1    hikaru 	QAT_HASH_SHA512_STATE_SIZE,
    238  1.1    hikaru 	&swcr_auth_hash_hmac_sha2_512,
    239  1.1    hikaru 	offsetof(SHA512_CTX, state),
    240  1.1    hikaru 	8,
    241  1.1    hikaru };
    242  1.1    hikaru 
    243  1.1    hikaru static const struct qat_sym_hash_alg_info aes_gcm_info = {
    244  1.1    hikaru 	QAT_HASH_AES_GCM_DIGEST_SIZE,
    245  1.1    hikaru 	QAT_HASH_AES_GCM_BLOCK_SIZE,
    246  1.1    hikaru 	NULL, 0,
    247  1.1    hikaru 	NULL, 0, 0, /* XXX */
    248  1.1    hikaru };
    249  1.1    hikaru 
    250  1.1    hikaru /* Hash QAT specific structures */
    251  1.1    hikaru 
    252  1.1    hikaru static const struct qat_sym_hash_qat_info md5_config = {
    253  1.1    hikaru 	HW_AUTH_ALGO_MD5,
    254  1.1    hikaru 	QAT_HASH_MD5_BLOCK_SIZE,
    255  1.1    hikaru 	HW_MD5_STATE1_SZ,
    256  1.1    hikaru 	HW_MD5_STATE2_SZ
    257  1.1    hikaru };
    258  1.1    hikaru 
    259  1.1    hikaru static const struct qat_sym_hash_qat_info sha1_config = {
    260  1.1    hikaru 	HW_AUTH_ALGO_SHA1,
    261  1.1    hikaru 	QAT_HASH_SHA1_BLOCK_SIZE,
    262  1.1    hikaru 	HW_SHA1_STATE1_SZ,
    263  1.1    hikaru 	HW_SHA1_STATE2_SZ
    264  1.1    hikaru };
    265  1.1    hikaru 
    266  1.1    hikaru static const struct qat_sym_hash_qat_info sha256_config = {
    267  1.1    hikaru 	HW_AUTH_ALGO_SHA256,
    268  1.1    hikaru 	QAT_HASH_SHA256_BLOCK_SIZE,
    269  1.1    hikaru 	HW_SHA256_STATE1_SZ,
    270  1.1    hikaru 	HW_SHA256_STATE2_SZ
    271  1.1    hikaru };
    272  1.1    hikaru 
    273  1.1    hikaru static const struct qat_sym_hash_qat_info sha384_config = {
    274  1.1    hikaru 	HW_AUTH_ALGO_SHA384,
    275  1.1    hikaru 	QAT_HASH_SHA384_BLOCK_SIZE,
    276  1.1    hikaru 	HW_SHA384_STATE1_SZ,
    277  1.1    hikaru 	HW_SHA384_STATE2_SZ
    278  1.1    hikaru };
    279  1.1    hikaru 
    280  1.1    hikaru static const struct qat_sym_hash_qat_info sha512_config = {
    281  1.1    hikaru 	HW_AUTH_ALGO_SHA512,
    282  1.1    hikaru 	QAT_HASH_SHA512_BLOCK_SIZE,
    283  1.1    hikaru 	HW_SHA512_STATE1_SZ,
    284  1.1    hikaru 	HW_SHA512_STATE2_SZ
    285  1.1    hikaru };
    286  1.1    hikaru 
    287  1.1    hikaru static const struct qat_sym_hash_qat_info aes_gcm_config = {
    288  1.1    hikaru 	HW_AUTH_ALGO_GALOIS_128,
    289  1.1    hikaru 	0,
    290  1.1    hikaru 	HW_GALOIS_128_STATE1_SZ,
    291  1.1    hikaru 	HW_GALOIS_H_SZ +
    292  1.1    hikaru 	HW_GALOIS_LEN_A_SZ +
    293  1.1    hikaru 	HW_GALOIS_E_CTR0_SZ
    294  1.1    hikaru };
    295  1.1    hikaru 
    296  1.1    hikaru static const struct qat_sym_hash_def qat_sym_hash_defs[] = {
    297  1.1    hikaru 	[QAT_SYM_HASH_MD5] = { &md5_info, &md5_config },
    298  1.1    hikaru 	[QAT_SYM_HASH_SHA1] = { &sha1_info, &sha1_config },
    299  1.1    hikaru 	[QAT_SYM_HASH_SHA256] = { &sha256_info, &sha256_config },
    300  1.1    hikaru 	[QAT_SYM_HASH_SHA384] = { &sha384_info, &sha384_config },
    301  1.1    hikaru 	[QAT_SYM_HASH_SHA512] = { &sha512_info, &sha512_config },
    302  1.1    hikaru 	[QAT_SYM_HASH_AES_GCM] = { &aes_gcm_info, &aes_gcm_config },
    303  1.1    hikaru };
    304  1.1    hikaru 
    305  1.1    hikaru const struct qat_product *
    306  1.1    hikaru 		qat_lookup(const struct pci_attach_args *);
    307  1.1    hikaru int		qat_match(struct device *, struct cfdata *, void *);
    308  1.1    hikaru void		qat_attach(struct device *, struct device *, void *);
    309  1.1    hikaru void		qat_init(struct device *);
    310  1.1    hikaru int		qat_start(struct device *);
    311  1.1    hikaru int		qat_detach(struct device *, int);
    312  1.1    hikaru 
    313  1.1    hikaru int		qat_alloc_msix_intr(struct qat_softc *,
    314  1.1    hikaru 		    struct pci_attach_args *);
    315  1.1    hikaru void *		qat_establish_msix_intr(struct qat_softc *, pci_intr_handle_t,
    316  1.1    hikaru 			int (*)(void *), void *, const char *, int);
    317  1.1    hikaru int		qat_setup_msix_intr(struct qat_softc *);
    318  1.1    hikaru 
    319  1.1    hikaru int		qat_etr_init(struct qat_softc *);
    320  1.1    hikaru int		qat_etr_bank_init(struct qat_softc *, int);
    321  1.1    hikaru 
    322  1.1    hikaru int		qat_etr_ap_bank_init(struct qat_softc *);
    323  1.1    hikaru void		qat_etr_ap_bank_set_ring_mask(uint32_t *, uint32_t, int);
    324  1.1    hikaru void		qat_etr_ap_bank_set_ring_dest(struct qat_softc *, uint32_t *,
    325  1.1    hikaru 		    uint32_t, int);
    326  1.1    hikaru void		qat_etr_ap_bank_setup_ring(struct qat_softc *,
    327  1.1    hikaru 		    struct qat_ring *);
    328  1.1    hikaru int		qat_etr_verify_ring_size(uint32_t, uint32_t);
    329  1.1    hikaru 
    330  1.1    hikaru int		qat_etr_ring_intr(struct qat_softc *, struct qat_bank *,
    331  1.1    hikaru 		    struct qat_ring *);
    332  1.1    hikaru int		qat_etr_bank_intr(void *);
    333  1.1    hikaru 
    334  1.1    hikaru void		qat_arb_update(struct qat_softc *, struct qat_bank *);
    335  1.1    hikaru 
    336  1.1    hikaru struct qat_sym_cookie *
    337  1.1    hikaru 		qat_crypto_alloc_sym_cookie(struct qat_crypto_bank *);
    338  1.1    hikaru void		qat_crypto_free_sym_cookie(struct qat_crypto_bank *,
    339  1.1    hikaru 		    struct qat_sym_cookie *);
    340  1.1    hikaru int		qat_crypto_load_buf(struct qat_softc *, struct cryptop *,
    341  1.1    hikaru 		    struct qat_sym_cookie *, struct qat_crypto_desc const *,
    342  1.1    hikaru 		    uint8_t *, int, bus_addr_t *);
    343  1.1    hikaru int		qat_crypto_load_iv(struct qat_sym_cookie *, struct cryptop *,
    344  1.1    hikaru 		    struct cryptodesc *, struct qat_crypto_desc const *);
    345  1.1    hikaru int		qat_crypto_process(void *, struct cryptop *, int);
    346  1.1    hikaru int		qat_crypto_setup_ring(struct qat_softc *,
    347  1.1    hikaru 		    struct qat_crypto_bank *);
    348  1.1    hikaru int		qat_crypto_new_session(void *, uint32_t *, struct cryptoini *);
    349  1.8  riastrad void		qat_crypto_free_session0(struct qat_crypto *,
    350  1.1    hikaru 		    struct qat_session *);
    351  1.1    hikaru void		qat_crypto_check_free_session(struct qat_crypto *,
    352  1.1    hikaru 		    struct qat_session *);
    353  1.8  riastrad void		qat_crypto_free_session(void *, uint64_t);
    354  1.1    hikaru int		qat_crypto_bank_init(struct qat_softc *,
    355  1.1    hikaru 		    struct qat_crypto_bank *);
    356  1.1    hikaru int		qat_crypto_init(struct qat_softc *);
    357  1.1    hikaru int		qat_crypto_start(struct qat_softc *);
    358  1.1    hikaru int		qat_crypto_sym_rxintr(struct qat_softc *, void *, void *);
    359  1.1    hikaru 
    360  1.1    hikaru CFATTACH_DECL_NEW(qat, sizeof(struct qat_softc),
    361  1.1    hikaru     qat_match, qat_attach, qat_detach, NULL);
    362  1.1    hikaru 
    363  1.1    hikaru struct qat_softc *gsc = NULL;
    364  1.1    hikaru 
    365  1.1    hikaru #ifdef QAT_DUMP
    366  1.1    hikaru int qat_dump = QAT_DUMP;
    367  1.1    hikaru #endif
    368  1.1    hikaru 
    369  1.1    hikaru const struct qat_product *
    370  1.1    hikaru qat_lookup(const struct pci_attach_args *pa)
    371  1.1    hikaru {
    372  1.1    hikaru 	const struct qat_product *qatp;
    373  1.1    hikaru 
    374  1.1    hikaru 	for (qatp = qat_products; qatp->qatp_name != NULL; qatp++) {
    375  1.1    hikaru 		if (PCI_VENDOR(pa->pa_id) == qatp->qatp_vendor &&
    376  1.1    hikaru 		    PCI_PRODUCT(pa->pa_id) == qatp->qatp_product)
    377  1.1    hikaru 			return qatp;
    378  1.1    hikaru 	}
    379  1.1    hikaru 	return NULL;
    380  1.1    hikaru }
    381  1.1    hikaru 
    382  1.1    hikaru int
    383  1.1    hikaru qat_match(struct device *parent, struct cfdata *cf, void *aux)
    384  1.1    hikaru {
    385  1.1    hikaru 	struct pci_attach_args *pa = aux;
    386  1.1    hikaru 
    387  1.1    hikaru 	if (qat_lookup(pa) != NULL)
    388  1.1    hikaru 		return 1;
    389  1.1    hikaru 
    390  1.1    hikaru 	return 0;
    391  1.1    hikaru }
    392  1.1    hikaru 
    393  1.1    hikaru void
    394  1.1    hikaru qat_attach(struct device *parent, struct device *self, void *aux)
    395  1.1    hikaru {
    396  1.1    hikaru 	struct qat_softc *sc = device_private(self);
    397  1.1    hikaru 	struct pci_attach_args *pa = aux;
    398  1.1    hikaru 	pci_chipset_tag_t pc = pa->pa_pc;
    399  1.1    hikaru 	const struct qat_product *qatp;
    400  1.1    hikaru 	char cap[256];
    401  1.1    hikaru 	pcireg_t cmd, memtype, msixoff, fusectl;
    402  1.1    hikaru 	bus_size_t msixtbl_offset;
    403  1.1    hikaru 	int i, bar, msixtbl_bar;
    404  1.1    hikaru 
    405  1.1    hikaru 	sc->sc_dev = self;
    406  1.1    hikaru 	sc->sc_pc = pc;
    407  1.1    hikaru 	sc->sc_pcitag = pa->pa_tag;
    408  1.1    hikaru 
    409  1.1    hikaru 	gsc = sc; /* for debug */
    410  1.1    hikaru 
    411  1.1    hikaru 	qatp = qat_lookup(pa);
    412  1.1    hikaru 	KASSERT(qatp != NULL);
    413  1.1    hikaru 
    414  1.1    hikaru 	if (pci_dma64_available(pa))
    415  1.1    hikaru 		sc->sc_dmat = pa->pa_dmat64;
    416  1.1    hikaru 	else
    417  1.1    hikaru 		sc->sc_dmat = pa->pa_dmat;
    418  1.1    hikaru 
    419  1.1    hikaru 	aprint_naive(": Crypto processor\n");
    420  1.1    hikaru 	sc->sc_rev = PCI_REVISION(pa->pa_class);
    421  1.1    hikaru 	aprint_normal(": %s (rev. 0x%02x)\n", qatp->qatp_name, sc->sc_rev);
    422  1.1    hikaru 
    423  1.1    hikaru 	memcpy(&sc->sc_hw, qatp->qatp_hw, sizeof(struct qat_hw));
    424  1.1    hikaru 
    425  1.1    hikaru 	/* Determine active accelerators and engines */
    426  1.1    hikaru 	sc->sc_accel_mask = sc->sc_hw.qhw_get_accel_mask(sc);
    427  1.1    hikaru 	sc->sc_ae_mask = sc->sc_hw.qhw_get_ae_mask(sc);
    428  1.1    hikaru 
    429  1.1    hikaru 	sc->sc_accel_num = 0;
    430  1.1    hikaru 	for (i = 0; i < sc->sc_hw.qhw_num_accel; i++) {
    431  1.1    hikaru 		if (sc->sc_accel_mask & (1 << i))
    432  1.1    hikaru 			sc->sc_accel_num++;
    433  1.1    hikaru 	}
    434  1.1    hikaru 	sc->sc_ae_num = 0;
    435  1.1    hikaru 	for (i = 0; i < sc->sc_hw.qhw_num_engines; i++) {
    436  1.1    hikaru 		if (sc->sc_ae_mask & (1 << i)) {
    437  1.1    hikaru 			sc->sc_ae_num++;
    438  1.1    hikaru 		}
    439  1.1    hikaru 	}
    440  1.1    hikaru 
    441  1.1    hikaru 	if (!sc->sc_accel_mask || (sc->sc_ae_mask & 0x01) == 0) {
    442  1.1    hikaru 		aprint_error_dev(sc->sc_dev, "couldn't find acceleration");
    443  1.1    hikaru 		goto fail;
    444  1.1    hikaru 	}
    445  1.1    hikaru 
    446  1.1    hikaru 	KASSERT(sc->sc_accel_num <= MAX_NUM_ACCEL);
    447  1.1    hikaru 	KASSERT(sc->sc_ae_num <= MAX_NUM_AE);
    448  1.1    hikaru 
    449  1.1    hikaru 	/* Determine SKU and capabilities */
    450  1.1    hikaru 	sc->sc_sku = sc->sc_hw.qhw_get_sku(sc);
    451  1.1    hikaru 	sc->sc_accel_cap = sc->sc_hw.qhw_get_accel_cap(sc);
    452  1.1    hikaru 	sc->sc_fw_uof_name = sc->sc_hw.qhw_get_fw_uof_name(sc);
    453  1.1    hikaru 
    454  1.1    hikaru 	aprint_normal_dev(sc->sc_dev,
    455  1.1    hikaru 	    "sku %d accel %d accel_mask 0x%x ae %d ae_mask 0x%x\n",
    456  1.1    hikaru 	    sc->sc_sku, sc->sc_accel_num, sc->sc_accel_mask,
    457  1.1    hikaru 	    sc->sc_ae_num, sc->sc_ae_mask);
    458  1.1    hikaru 	snprintb(cap, sizeof(cap), QAT_ACCEL_CAP_BITS, sc->sc_accel_cap);
    459  1.1    hikaru 	aprint_normal_dev(sc->sc_dev, "accel capabilities %s\n", cap);
    460  1.1    hikaru 
    461  1.1    hikaru 	/* Map BARs */
    462  1.1    hikaru 
    463  1.1    hikaru 	msixtbl_bar = 0;
    464  1.1    hikaru 	msixtbl_offset = 0;
    465  1.1    hikaru 	if (pci_get_capability(pc, pa->pa_tag, PCI_CAP_MSIX, &msixoff, NULL)) {
    466  1.1    hikaru 		pcireg_t msixtbl;
    467  1.1    hikaru 		msixtbl = pci_conf_read(pc, pa->pa_tag,
    468  1.1    hikaru 		    msixoff + PCI_MSIX_TBLOFFSET);
    469  1.1    hikaru 		msixtbl_offset = msixtbl & PCI_MSIX_TBLOFFSET_MASK;
    470  1.1    hikaru 		msixtbl_bar = PCI_MAPREG_START +
    471  1.2   msaitoh 		    ((msixtbl & PCI_MSIX_TBLBIR_MASK) << 2);
    472  1.1    hikaru 	}
    473  1.1    hikaru 
    474  1.1    hikaru 	i = 0;
    475  1.1    hikaru 	if (sc->sc_hw.qhw_sram_bar_id != NO_PCI_REG) {
    476  1.1    hikaru 		KASSERT(sc->sc_hw.qhw_sram_bar_id == 0);
    477  1.1    hikaru 		fusectl = pci_conf_read(sc->sc_pc, sc->sc_pcitag, FUSECTL_REG);
    478  1.1    hikaru 		/* Skip SRAM BAR */
    479  1.1    hikaru 		i = (fusectl & FUSECTL_MASK) ? 1 : 0;
    480  1.1    hikaru 	}
    481  1.1    hikaru 	for (bar = PCI_MAPREG_START; bar <= PCI_MAPREG_END; bar += 4) {
    482  1.1    hikaru 		bus_size_t size;
    483  1.1    hikaru 		bus_addr_t addr;
    484  1.1    hikaru 
    485  1.1    hikaru 		if (pci_mapreg_probe(pc, pa->pa_tag, bar, &memtype) == 0)
    486  1.1    hikaru 			continue;
    487  1.1    hikaru 
    488  1.1    hikaru 		if (PCI_MAPREG_TYPE(memtype) != PCI_MAPREG_TYPE_MEM)
    489  1.1    hikaru 			continue;
    490  1.1    hikaru 
    491  1.1    hikaru 		/* MSI-X table will be mapped by pci_msix_alloc_map */
    492  1.1    hikaru 		if (bar == msixtbl_bar)
    493  1.1    hikaru 			size = msixtbl_offset;
    494  1.1    hikaru 		else
    495  1.1    hikaru 			size = 0;
    496  1.1    hikaru 
    497  1.1    hikaru 		if (pci_mapreg_submap(pa, bar, memtype, 0, size, 0,
    498  1.1    hikaru 		    &sc->sc_csrt[i], &sc->sc_csrh[i], &addr, &sc->sc_csrs[i])) {
    499  1.1    hikaru 			aprint_error_dev(sc->sc_dev,
    500  1.1    hikaru 			    "couldn't map bar 0x%02x\n", bar);
    501  1.1    hikaru 			goto fail;
    502  1.1    hikaru 		}
    503  1.1    hikaru 
    504  1.1    hikaru 		aprint_verbose_dev(sc->sc_dev,
    505  1.1    hikaru 		    "region #%d bar 0x%02x size 0x%x at 0x%llx"
    506  1.1    hikaru 		    " mapped to %p\n", i, bar,
    507  1.1    hikaru 		    (int)sc->sc_csrs[i], (unsigned long long)addr,
    508  1.1    hikaru 		    bus_space_vaddr(sc->sc_csrt[i], sc->sc_csrh[i]));
    509  1.1    hikaru 
    510  1.1    hikaru 		i++;
    511  1.1    hikaru 		if (PCI_MAPREG_MEM_TYPE(memtype) == PCI_MAPREG_MEM_TYPE_64BIT)
    512  1.1    hikaru 			bar += 4;
    513  1.1    hikaru 	}
    514  1.1    hikaru 
    515  1.1    hikaru 	/* XXX Enable advanced error reporting */
    516  1.1    hikaru 
    517  1.1    hikaru 	/* Enable bus mastering */
    518  1.1    hikaru 	cmd = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
    519  1.1    hikaru 	cmd |= PCI_COMMAND_MASTER_ENABLE;
    520  1.1    hikaru 	pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, cmd);
    521  1.1    hikaru 
    522  1.1    hikaru 	if (qat_alloc_msix_intr(sc, pa))
    523  1.1    hikaru 		goto fail;
    524  1.1    hikaru 
    525  1.1    hikaru 	config_mountroot(self, qat_init);
    526  1.1    hikaru 
    527  1.1    hikaru fail:
    528  1.1    hikaru 	/* XXX */
    529  1.1    hikaru 	return;
    530  1.1    hikaru }
    531  1.1    hikaru 
    532  1.1    hikaru void
    533  1.1    hikaru qat_init(struct device *self)
    534  1.1    hikaru {
    535  1.1    hikaru 	int error;
    536  1.1    hikaru 	struct qat_softc *sc = device_private(self);
    537  1.1    hikaru 
    538  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Initializing ETR\n");
    539  1.1    hikaru 	error = qat_etr_init(sc);
    540  1.1    hikaru 	if (error) {
    541  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    542  1.1    hikaru 		    "Could not initialize ETR: %d\n", error);
    543  1.1    hikaru 		return;
    544  1.1    hikaru 	}
    545  1.1    hikaru 
    546  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Initializing admin comms\n");
    547  1.1    hikaru 	if (sc->sc_hw.qhw_init_admin_comms != NULL &&
    548  1.1    hikaru 	    (error = sc->sc_hw.qhw_init_admin_comms(sc)) != 0) {
    549  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    550  1.1    hikaru 		    "Could not initialize admin comms: %d\n", error);
    551  1.1    hikaru 		return;
    552  1.1    hikaru 	}
    553  1.1    hikaru 
    554  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Initializing hw arbiter\n");
    555  1.1    hikaru 	if (sc->sc_hw.qhw_init_arb != NULL &&
    556  1.1    hikaru 	    (error = sc->sc_hw.qhw_init_arb(sc)) != 0) {
    557  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    558  1.1    hikaru 		    "Could not initialize hw arbiter: %d\n", error);
    559  1.1    hikaru 		return;
    560  1.1    hikaru 	}
    561  1.1    hikaru 
    562  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Initializing acceleration engine\n");
    563  1.1    hikaru 	error = qat_ae_init(sc);
    564  1.1    hikaru 	if (error) {
    565  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    566  1.1    hikaru 		    "Could not initialize Acceleration Engine: %d\n", error);
    567  1.1    hikaru 		return;
    568  1.1    hikaru 	}
    569  1.1    hikaru 
    570  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Loading acceleration engine firmware\n");
    571  1.1    hikaru 	error = qat_aefw_load(sc);
    572  1.1    hikaru 	if (error) {
    573  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    574  1.1    hikaru 		    "Could not load firmware: %d\n", error);
    575  1.1    hikaru 		return;
    576  1.1    hikaru 	}
    577  1.1    hikaru 
    578  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Establishing interrupts\n");
    579  1.1    hikaru 	error = qat_setup_msix_intr(sc);
    580  1.1    hikaru 	if (error) {
    581  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    582  1.1    hikaru 		    "Could not setup interrupts: %d\n", error);
    583  1.1    hikaru 		return;
    584  1.1    hikaru 	}
    585  1.1    hikaru 
    586  1.1    hikaru 	sc->sc_hw.qhw_enable_intr(sc);
    587  1.1    hikaru 
    588  1.1    hikaru 	error = qat_crypto_init(sc);
    589  1.1    hikaru 	if (error) {
    590  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    591  1.1    hikaru 		    "Could not initialize service: %d\n", error);
    592  1.1    hikaru 		return;
    593  1.1    hikaru 	}
    594  1.1    hikaru 
    595  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Enabling error correction\n");
    596  1.1    hikaru 	if (sc->sc_hw.qhw_enable_error_correction != NULL)
    597  1.1    hikaru 		sc->sc_hw.qhw_enable_error_correction(sc);
    598  1.1    hikaru 
    599  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev, "Initializing watchdog timer\n");
    600  1.1    hikaru 	if (sc->sc_hw.qhw_set_ssm_wdtimer != NULL &&
    601  1.1    hikaru 	    (error = sc->sc_hw.qhw_set_ssm_wdtimer(sc)) != 0) {
    602  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    603  1.1    hikaru 		    "Could not initialize watchdog timer: %d\n", error);
    604  1.1    hikaru 		return;
    605  1.1    hikaru 	}
    606  1.1    hikaru 
    607  1.1    hikaru 	error = qat_start(self);
    608  1.1    hikaru 	if (error) {
    609  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    610  1.1    hikaru 		    "Could not start: %d\n", error);
    611  1.1    hikaru 		return;
    612  1.1    hikaru 	}
    613  1.1    hikaru }
    614  1.1    hikaru 
    615  1.1    hikaru int
    616  1.1    hikaru qat_start(struct device *self)
    617  1.1    hikaru {
    618  1.1    hikaru 	struct qat_softc *sc = device_private(self);
    619  1.1    hikaru 	int error;
    620  1.1    hikaru 
    621  1.1    hikaru 	error = qat_ae_start(sc);
    622  1.1    hikaru 	if (error)
    623  1.1    hikaru 		return error;
    624  1.1    hikaru 
    625  1.1    hikaru 	if (sc->sc_hw.qhw_send_admin_init != NULL &&
    626  1.1    hikaru 	    (error = sc->sc_hw.qhw_send_admin_init(sc)) != 0) {
    627  1.1    hikaru 		return error;
    628  1.1    hikaru 	}
    629  1.1    hikaru 
    630  1.1    hikaru 	error = qat_crypto_start(sc);
    631  1.1    hikaru 	if (error)
    632  1.1    hikaru 		return error;
    633  1.1    hikaru 
    634  1.1    hikaru 	return 0;
    635  1.1    hikaru }
    636  1.1    hikaru 
    637  1.1    hikaru int
    638  1.1    hikaru qat_detach(struct device *self, int flags)
    639  1.1    hikaru {
    640  1.1    hikaru 
    641  1.1    hikaru 	return 0;
    642  1.1    hikaru }
    643  1.1    hikaru 
    644  1.1    hikaru void *
    645  1.1    hikaru qat_alloc_mem(size_t size)
    646  1.1    hikaru {
    647  1.1    hikaru 	size_t *sptr;
    648  1.1    hikaru 	sptr = kmem_zalloc(size + sizeof(size), KM_SLEEP);
    649  1.1    hikaru 	*sptr = size;
    650  1.1    hikaru 	return ++sptr;
    651  1.1    hikaru }
    652  1.1    hikaru 
    653  1.1    hikaru void
    654  1.1    hikaru qat_free_mem(void *ptr)
    655  1.1    hikaru {
    656  1.1    hikaru 	size_t *sptr = ptr, size;
    657  1.1    hikaru 	size = *(--sptr);
    658  1.1    hikaru 	kmem_free(sptr, size + sizeof(size));
    659  1.1    hikaru }
    660  1.1    hikaru 
    661  1.1    hikaru void
    662  1.1    hikaru qat_free_dmamem(struct qat_softc *sc, struct qat_dmamem *qdm)
    663  1.1    hikaru {
    664  1.1    hikaru 
    665  1.1    hikaru 	bus_dmamap_unload(sc->sc_dmat, qdm->qdm_dma_map);
    666  1.1    hikaru 	bus_dmamap_destroy(sc->sc_dmat, qdm->qdm_dma_map);
    667  1.1    hikaru 	bus_dmamem_unmap(sc->sc_dmat, qdm->qdm_dma_vaddr, qdm->qdm_dma_size);
    668  1.1    hikaru 	bus_dmamem_free(sc->sc_dmat, &qdm->qdm_dma_seg, 1);
    669  1.1    hikaru 	explicit_memset(qdm, 0, sizeof(*qdm));
    670  1.1    hikaru }
    671  1.1    hikaru 
    672  1.1    hikaru int
    673  1.1    hikaru qat_alloc_dmamem(struct qat_softc *sc, struct qat_dmamem *qdm,
    674  1.1    hikaru 	bus_size_t size, bus_size_t alignment)
    675  1.1    hikaru {
    676  1.1    hikaru 	int error = 0, nseg;
    677  1.1    hikaru 
    678  1.1    hikaru 	error = bus_dmamem_alloc(sc->sc_dmat, size, alignment,
    679  1.1    hikaru 	    0, &qdm->qdm_dma_seg, 1, &nseg, BUS_DMA_NOWAIT);
    680  1.1    hikaru 	if (error) {
    681  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    682  1.1    hikaru 		    "couldn't allocate dmamem, error = %d\n", error);
    683  1.1    hikaru 		goto fail_0;
    684  1.1    hikaru 	}
    685  1.1    hikaru 	KASSERT(nseg == 1);
    686  1.1    hikaru 	error = bus_dmamem_map(sc->sc_dmat, &qdm->qdm_dma_seg,
    687  1.1    hikaru 	    nseg, size, &qdm->qdm_dma_vaddr,
    688  1.1    hikaru 	    BUS_DMA_COHERENT | BUS_DMA_NOWAIT);
    689  1.1    hikaru 	if (error) {
    690  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    691  1.1    hikaru 		    "couldn't map dmamem, error = %d\n", error);
    692  1.1    hikaru 		goto fail_1;
    693  1.1    hikaru 	}
    694  1.1    hikaru 	qdm->qdm_dma_size = size;
    695  1.1    hikaru 	error = bus_dmamap_create(sc->sc_dmat, size, nseg, size,
    696  1.1    hikaru 	    0, BUS_DMA_NOWAIT, &qdm->qdm_dma_map);
    697  1.1    hikaru 	if (error) {
    698  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    699  1.1    hikaru 		    "couldn't create dmamem map, error = %d\n", error);
    700  1.1    hikaru 		goto fail_2;
    701  1.1    hikaru 	}
    702  1.1    hikaru 	error = bus_dmamap_load(sc->sc_dmat, qdm->qdm_dma_map,
    703  1.1    hikaru 	    qdm->qdm_dma_vaddr, size, NULL, BUS_DMA_NOWAIT);
    704  1.1    hikaru 	if (error) {
    705  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    706  1.1    hikaru 		    "couldn't load dmamem map, error = %d\n", error);
    707  1.1    hikaru 		goto fail_3;
    708  1.1    hikaru 	}
    709  1.1    hikaru 
    710  1.1    hikaru 	return 0;
    711  1.1    hikaru fail_3:
    712  1.1    hikaru 	bus_dmamap_destroy(sc->sc_dmat, qdm->qdm_dma_map);
    713  1.1    hikaru 	qdm->qdm_dma_map = NULL;
    714  1.1    hikaru fail_2:
    715  1.1    hikaru 	bus_dmamem_unmap(sc->sc_dmat, qdm->qdm_dma_vaddr, size);
    716  1.1    hikaru 	qdm->qdm_dma_vaddr = NULL;
    717  1.1    hikaru 	qdm->qdm_dma_size = 0;
    718  1.1    hikaru fail_1:
    719  1.1    hikaru 	bus_dmamem_free(sc->sc_dmat, &qdm->qdm_dma_seg, 1);
    720  1.1    hikaru fail_0:
    721  1.1    hikaru 	return error;
    722  1.1    hikaru }
    723  1.1    hikaru 
    724  1.1    hikaru int
    725  1.1    hikaru qat_alloc_msix_intr(struct qat_softc *sc, struct pci_attach_args *pa)
    726  1.1    hikaru {
    727  1.1    hikaru 	u_int *ih_map, vec;
    728  1.1    hikaru 	int error, count, ihi;
    729  1.1    hikaru 
    730  1.1    hikaru 	count = sc->sc_hw.qhw_num_banks + 1;
    731  1.1    hikaru 	ih_map = qat_alloc_mem(sizeof(*ih_map) * count);
    732  1.1    hikaru 	ihi = 0;
    733  1.1    hikaru 
    734  1.1    hikaru 	for (vec = 0; vec < sc->sc_hw.qhw_num_banks; vec++)
    735  1.1    hikaru 		ih_map[ihi++] = vec;
    736  1.1    hikaru 
    737  1.1    hikaru 	vec += sc->sc_hw.qhw_msix_ae_vec_gap;
    738  1.1    hikaru 	ih_map[ihi++] = vec;
    739  1.1    hikaru 
    740  1.1    hikaru 	error = pci_msix_alloc_map(pa, &sc->sc_ih, ih_map, count);
    741  1.1    hikaru 	qat_free_mem(ih_map);
    742  1.1    hikaru 	if (error) {
    743  1.1    hikaru 		aprint_error_dev(sc->sc_dev, "couldn't allocate msix %d: %d\n",
    744  1.1    hikaru 		    count, error);
    745  1.1    hikaru 	}
    746  1.1    hikaru 
    747  1.1    hikaru 	return error;
    748  1.1    hikaru }
    749  1.1    hikaru 
    750  1.1    hikaru void *
    751  1.1    hikaru qat_establish_msix_intr(struct qat_softc *sc, pci_intr_handle_t ih,
    752  1.1    hikaru 	int (*func)(void *), void *arg,
    753  1.1    hikaru 	const char *name, int index)
    754  1.1    hikaru {
    755  1.1    hikaru 	kcpuset_t *affinity;
    756  1.1    hikaru 	int error;
    757  1.1    hikaru 	char buf[PCI_INTRSTR_LEN];
    758  1.1    hikaru 	char intrxname[INTRDEVNAMEBUF];
    759  1.1    hikaru 	const char *intrstr;
    760  1.1    hikaru 	void *cookie;
    761  1.1    hikaru 
    762  1.1    hikaru 	snprintf(intrxname, sizeof(intrxname), "%s%s%d",
    763  1.1    hikaru 	    device_xname(sc->sc_dev), name, index);
    764  1.1    hikaru 
    765  1.1    hikaru 	intrstr = pci_intr_string(sc->sc_pc, ih, buf, sizeof(buf));
    766  1.1    hikaru 
    767  1.1    hikaru 	pci_intr_setattr(sc->sc_pc, &ih, PCI_INTR_MPSAFE, true);
    768  1.1    hikaru 
    769  1.1    hikaru 	cookie = pci_intr_establish_xname(sc->sc_pc, ih,
    770  1.1    hikaru 	    IPL_NET, func, arg, intrxname);
    771  1.1    hikaru 
    772  1.1    hikaru 	aprint_normal_dev(sc->sc_dev, "%s%d interrupting at %s\n",
    773  1.1    hikaru 	    name, index, intrstr);
    774  1.1    hikaru 
    775  1.1    hikaru 	kcpuset_create(&affinity, true);
    776  1.1    hikaru 	kcpuset_set(affinity, index % ncpu);
    777  1.1    hikaru 	error = interrupt_distribute(cookie, affinity, NULL);
    778  1.1    hikaru 	if (error) {
    779  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
    780  1.1    hikaru 		    "couldn't distribute interrupt: %s%d\n", name, index);
    781  1.1    hikaru 	}
    782  1.1    hikaru 	kcpuset_destroy(affinity);
    783  1.1    hikaru 
    784  1.1    hikaru 	return cookie;
    785  1.1    hikaru }
    786  1.1    hikaru 
    787  1.1    hikaru int
    788  1.1    hikaru qat_setup_msix_intr(struct qat_softc *sc)
    789  1.1    hikaru {
    790  1.1    hikaru 	int i;
    791  1.1    hikaru 	pci_intr_handle_t ih;
    792  1.1    hikaru 
    793  1.1    hikaru 	for (i = 0; i < sc->sc_hw.qhw_num_banks; i++) {
    794  1.1    hikaru 		struct qat_bank *qb = &sc->sc_etr_banks[i];
    795  1.1    hikaru 		ih = sc->sc_ih[i];
    796  1.1    hikaru 
    797  1.1    hikaru 		qb->qb_ih_cookie = qat_establish_msix_intr(sc, ih,
    798  1.1    hikaru 		    qat_etr_bank_intr, qb, "bank", i);
    799  1.1    hikaru 		if (qb->qb_ih_cookie == NULL)
    800  1.1    hikaru 			return ENOMEM;
    801  1.1    hikaru 	}
    802  1.1    hikaru 
    803  1.1    hikaru 	sc->sc_ae_ih_cookie = qat_establish_msix_intr(sc, sc->sc_ih[i],
    804  1.1    hikaru 	    qat_ae_cluster_intr, sc, "aeclust", 0);
    805  1.1    hikaru 	if (sc->sc_ae_ih_cookie == NULL)
    806  1.1    hikaru 		return ENOMEM;
    807  1.1    hikaru 
    808  1.1    hikaru 	return 0;
    809  1.1    hikaru }
    810  1.1    hikaru 
    811  1.1    hikaru int
    812  1.1    hikaru qat_etr_init(struct qat_softc *sc)
    813  1.1    hikaru {
    814  1.1    hikaru 	int i;
    815  1.1    hikaru 	int error = 0;
    816  1.1    hikaru 
    817  1.1    hikaru 	sc->sc_etr_banks = qat_alloc_mem(
    818  1.1    hikaru 	    sizeof(struct qat_bank) * sc->sc_hw.qhw_num_banks);
    819  1.1    hikaru 
    820  1.1    hikaru 	for (i = 0; i < sc->sc_hw.qhw_num_banks; i++) {
    821  1.1    hikaru 		error = qat_etr_bank_init(sc, i);
    822  1.1    hikaru 		if (error) {
    823  1.1    hikaru 			goto fail;
    824  1.1    hikaru 		}
    825  1.1    hikaru 	}
    826  1.1    hikaru 
    827  1.1    hikaru 	if (sc->sc_hw.qhw_num_ap_banks) {
    828  1.1    hikaru 		sc->sc_etr_ap_banks = qat_alloc_mem(
    829  1.1    hikaru 		    sizeof(struct qat_ap_bank) * sc->sc_hw.qhw_num_ap_banks);
    830  1.1    hikaru 		error = qat_etr_ap_bank_init(sc);
    831  1.1    hikaru 		if (error) {
    832  1.1    hikaru 			goto fail;
    833  1.1    hikaru 		}
    834  1.1    hikaru 	}
    835  1.1    hikaru 
    836  1.1    hikaru 	return 0;
    837  1.1    hikaru 
    838  1.1    hikaru fail:
    839  1.1    hikaru 	if (sc->sc_etr_banks != NULL) {
    840  1.1    hikaru 		qat_free_mem(sc->sc_etr_banks);
    841  1.1    hikaru 		sc->sc_etr_banks = NULL;
    842  1.1    hikaru 	}
    843  1.1    hikaru 	if (sc->sc_etr_ap_banks != NULL) {
    844  1.1    hikaru 		qat_free_mem(sc->sc_etr_ap_banks);
    845  1.1    hikaru 		sc->sc_etr_ap_banks = NULL;
    846  1.1    hikaru 	}
    847  1.1    hikaru 	return error;
    848  1.1    hikaru }
    849  1.1    hikaru 
    850  1.1    hikaru int
    851  1.1    hikaru qat_etr_bank_init(struct qat_softc *sc, int bank)
    852  1.1    hikaru {
    853  1.1    hikaru 	struct qat_bank *qb = &sc->sc_etr_banks[bank];
    854  1.1    hikaru 	int i, tx_rx_gap = sc->sc_hw.qhw_tx_rx_gap;
    855  1.1    hikaru 
    856  1.1    hikaru 	KASSERT(bank < sc->sc_hw.qhw_num_banks);
    857  1.1    hikaru 
    858  1.1    hikaru 	mutex_init(&qb->qb_bank_mtx, MUTEX_DEFAULT, IPL_NET);
    859  1.1    hikaru 
    860  1.1    hikaru 	qb->qb_sc = sc;
    861  1.1    hikaru 	qb->qb_bank = bank;
    862  1.1    hikaru 	qb->qb_coalescing_time = COALESCING_TIME_INTERVAL_DEFAULT;
    863  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qb->qb_ev_rxintr, EVCNT_TYPE_INTR,
    864  1.1    hikaru 	    qb->qb_ev_rxintr_name, "bank%d rxintr", bank);
    865  1.1    hikaru 
    866  1.1    hikaru 	/* Clean CSRs for all rings within the bank */
    867  1.1    hikaru 	for (i = 0; i < sc->sc_hw.qhw_num_rings_per_bank; i++) {
    868  1.1    hikaru 		struct qat_ring *qr = &qb->qb_et_rings[i];
    869  1.1    hikaru 
    870  1.1    hikaru 		qat_etr_bank_ring_write_4(sc, bank, i,
    871  1.1    hikaru 		    ETR_RING_CONFIG, 0);
    872  1.1    hikaru 		qat_etr_bank_ring_base_write_8(sc, bank, i, 0);
    873  1.1    hikaru 
    874  1.1    hikaru 		if (sc->sc_hw.qhw_tx_rings_mask & (1 << i)) {
    875  1.1    hikaru 			qr->qr_inflight = qat_alloc_mem(sizeof(uint32_t));
    876  1.1    hikaru 		} else if (sc->sc_hw.qhw_tx_rings_mask &
    877  1.1    hikaru 		    (1 << (i - tx_rx_gap))) {
    878  1.1    hikaru 			/* Share inflight counter with rx and tx */
    879  1.1    hikaru 			qr->qr_inflight =
    880  1.1    hikaru 			    qb->qb_et_rings[i - tx_rx_gap].qr_inflight;
    881  1.1    hikaru 		}
    882  1.1    hikaru 	}
    883  1.1    hikaru 
    884  1.1    hikaru 	if (sc->sc_hw.qhw_init_etr_intr != NULL) {
    885  1.1    hikaru 		sc->sc_hw.qhw_init_etr_intr(sc, bank);
    886  1.1    hikaru 	} else {
    887  1.1    hikaru 		/* common code in qat 1.7 */
    888  1.1    hikaru 		qat_etr_bank_write_4(sc, bank, ETR_INT_REG,
    889  1.1    hikaru 		    ETR_INT_REG_CLEAR_MASK);
    890  1.1    hikaru 		for (i = 0; i < sc->sc_hw.qhw_num_rings_per_bank /
    891  1.1    hikaru 		    ETR_RINGS_PER_INT_SRCSEL; i++) {
    892  1.1    hikaru 			qat_etr_bank_write_4(sc, bank, ETR_INT_SRCSEL +
    893  1.1    hikaru 			    (i * ETR_INT_SRCSEL_NEXT_OFFSET),
    894  1.1    hikaru 			    ETR_INT_SRCSEL_MASK);
    895  1.1    hikaru 		}
    896  1.1    hikaru 	}
    897  1.1    hikaru 
    898  1.1    hikaru 	return 0;
    899  1.1    hikaru }
    900  1.1    hikaru 
    901  1.1    hikaru int
    902  1.1    hikaru qat_etr_ap_bank_init(struct qat_softc *sc)
    903  1.1    hikaru {
    904  1.1    hikaru 	int ap_bank;
    905  1.1    hikaru 
    906  1.1    hikaru 	for (ap_bank = 0; ap_bank < sc->sc_hw.qhw_num_ap_banks; ap_bank++) {
    907  1.1    hikaru 		struct qat_ap_bank *qab = &sc->sc_etr_ap_banks[ap_bank];
    908  1.1    hikaru 
    909  1.1    hikaru 		qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NF_MASK,
    910  1.1    hikaru 		    ETR_AP_NF_MASK_INIT);
    911  1.1    hikaru 		qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NF_DEST, 0);
    912  1.1    hikaru 		qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NE_MASK,
    913  1.1    hikaru 		    ETR_AP_NE_MASK_INIT);
    914  1.1    hikaru 		qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NE_DEST, 0);
    915  1.1    hikaru 
    916  1.1    hikaru 		memset(qab, 0, sizeof(*qab));
    917  1.1    hikaru 	}
    918  1.1    hikaru 
    919  1.1    hikaru 	return 0;
    920  1.1    hikaru }
    921  1.1    hikaru 
    922  1.1    hikaru void
    923  1.1    hikaru qat_etr_ap_bank_set_ring_mask(uint32_t *ap_mask, uint32_t ring, int set_mask)
    924  1.1    hikaru {
    925  1.1    hikaru 	if (set_mask)
    926  1.1    hikaru 		*ap_mask |= (1 << ETR_RING_NUMBER_IN_AP_BANK(ring));
    927  1.1    hikaru 	else
    928  1.1    hikaru 		*ap_mask &= ~(1 << ETR_RING_NUMBER_IN_AP_BANK(ring));
    929  1.1    hikaru }
    930  1.1    hikaru 
    931  1.1    hikaru void
    932  1.1    hikaru qat_etr_ap_bank_set_ring_dest(struct qat_softc *sc, uint32_t *ap_dest,
    933  1.1    hikaru 	uint32_t ring, int set_dest)
    934  1.1    hikaru {
    935  1.1    hikaru 	uint32_t ae_mask;
    936  1.1    hikaru 	uint8_t mailbox, ae, nae;
    937  1.1    hikaru 	uint8_t *dest = (uint8_t *)ap_dest;
    938  1.1    hikaru 
    939  1.1    hikaru 	mailbox = ETR_RING_AP_MAILBOX_NUMBER(ring);
    940  1.1    hikaru 
    941  1.1    hikaru 	nae = 0;
    942  1.1    hikaru 	ae_mask = sc->sc_ae_mask;
    943  1.1    hikaru 	for (ae = 0; ae < sc->sc_hw.qhw_num_engines; ae++) {
    944  1.1    hikaru 		if ((ae_mask & (1 << ae)) == 0)
    945  1.1    hikaru 			continue;
    946  1.1    hikaru 
    947  1.1    hikaru 		if (set_dest) {
    948  1.1    hikaru 			dest[nae] = __SHIFTIN(ae, ETR_AP_DEST_AE) |
    949  1.1    hikaru 			    __SHIFTIN(mailbox, ETR_AP_DEST_MAILBOX) |
    950  1.1    hikaru 			    ETR_AP_DEST_ENABLE;
    951  1.1    hikaru 		} else {
    952  1.1    hikaru 			dest[nae] = 0;
    953  1.1    hikaru 		}
    954  1.1    hikaru 		nae++;
    955  1.1    hikaru 		if (nae == ETR_MAX_AE_PER_MAILBOX)
    956  1.1    hikaru 			break;
    957  1.1    hikaru 
    958  1.1    hikaru 	}
    959  1.1    hikaru }
    960  1.1    hikaru 
    961  1.1    hikaru void
    962  1.1    hikaru qat_etr_ap_bank_setup_ring(struct qat_softc *sc, struct qat_ring *qr)
    963  1.1    hikaru {
    964  1.1    hikaru 	struct qat_ap_bank *qab;
    965  1.1    hikaru 	int ap_bank;
    966  1.1    hikaru 
    967  1.1    hikaru 	if (sc->sc_hw.qhw_num_ap_banks == 0)
    968  1.1    hikaru 		return;
    969  1.1    hikaru 
    970  1.1    hikaru 	ap_bank = ETR_RING_AP_BANK_NUMBER(qr->qr_ring);
    971  1.1    hikaru 	KASSERT(ap_bank < sc->sc_hw.qhw_num_ap_banks);
    972  1.1    hikaru 	qab = &sc->sc_etr_ap_banks[ap_bank];
    973  1.1    hikaru 
    974  1.1    hikaru 	if (qr->qr_cb == NULL) {
    975  1.1    hikaru 		qat_etr_ap_bank_set_ring_mask(&qab->qab_ne_mask, qr->qr_ring, 1);
    976  1.1    hikaru 		if (!qab->qab_ne_dest) {
    977  1.1    hikaru 			qat_etr_ap_bank_set_ring_dest(sc, &qab->qab_ne_dest,
    978  1.1    hikaru 			    qr->qr_ring, 1);
    979  1.1    hikaru 			qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NE_DEST,
    980  1.1    hikaru 			    qab->qab_ne_dest);
    981  1.1    hikaru 		}
    982  1.1    hikaru 	} else {
    983  1.1    hikaru 		qat_etr_ap_bank_set_ring_mask(&qab->qab_nf_mask, qr->qr_ring, 1);
    984  1.1    hikaru 		if (!qab->qab_nf_dest) {
    985  1.1    hikaru 			qat_etr_ap_bank_set_ring_dest(sc, &qab->qab_nf_dest,
    986  1.1    hikaru 			    qr->qr_ring, 1);
    987  1.1    hikaru 			qat_etr_ap_bank_write_4(sc, ap_bank, ETR_AP_NF_DEST,
    988  1.1    hikaru 			    qab->qab_nf_dest);
    989  1.1    hikaru 		}
    990  1.1    hikaru 	}
    991  1.1    hikaru }
    992  1.1    hikaru 
    993  1.1    hikaru int
    994  1.1    hikaru qat_etr_verify_ring_size(uint32_t msg_size, uint32_t num_msgs)
    995  1.1    hikaru {
    996  1.1    hikaru 	int i = QAT_MIN_RING_SIZE;
    997  1.1    hikaru 
    998  1.1    hikaru 	for (; i <= QAT_MAX_RING_SIZE; i++)
    999  1.1    hikaru 		if ((msg_size * num_msgs) == QAT_SIZE_TO_RING_SIZE_IN_BYTES(i))
   1000  1.1    hikaru 			return i;
   1001  1.1    hikaru 
   1002  1.1    hikaru 	return QAT_DEFAULT_RING_SIZE;
   1003  1.1    hikaru }
   1004  1.1    hikaru 
   1005  1.1    hikaru int
   1006  1.1    hikaru qat_etr_setup_ring(struct qat_softc *sc, int bank, uint32_t ring,
   1007  1.1    hikaru 	uint32_t num_msgs, uint32_t msg_size, qat_cb_t cb, void *cb_arg,
   1008  1.1    hikaru 	const char *name, struct qat_ring **rqr)
   1009  1.1    hikaru {
   1010  1.1    hikaru 	struct qat_bank *qb;
   1011  1.1    hikaru 	struct qat_ring *qr = NULL;
   1012  1.1    hikaru 	int error;
   1013  1.1    hikaru 	uint32_t ring_size_bytes, ring_config;
   1014  1.1    hikaru 	uint64_t ring_base;
   1015  1.1    hikaru 	uint32_t wm_nf = ETR_RING_CONFIG_NEAR_WM_512;
   1016  1.1    hikaru 	uint32_t wm_ne = ETR_RING_CONFIG_NEAR_WM_0;
   1017  1.1    hikaru 
   1018  1.1    hikaru 	KASSERT(bank < sc->sc_hw.qhw_num_banks);
   1019  1.1    hikaru 
   1020  1.1    hikaru 	/* Allocate a ring from specified bank */
   1021  1.1    hikaru 	qb = &sc->sc_etr_banks[bank];
   1022  1.1    hikaru 
   1023  1.1    hikaru 	if (ring >= sc->sc_hw.qhw_num_rings_per_bank)
   1024  1.1    hikaru 		return EINVAL;
   1025  1.1    hikaru 	if (qb->qb_allocated_rings & (1 << ring))
   1026  1.1    hikaru 		return ENOENT;
   1027  1.1    hikaru 	qr = &qb->qb_et_rings[ring];
   1028  1.1    hikaru 	qb->qb_allocated_rings |= 1 << ring;
   1029  1.1    hikaru 
   1030  1.5   msaitoh 	/* Initialize allocated ring */
   1031  1.1    hikaru 	qr->qr_ring = ring;
   1032  1.1    hikaru 	qr->qr_bank = bank;
   1033  1.1    hikaru 	qr->qr_name = name;
   1034  1.1    hikaru 	qr->qr_ring_id = qr->qr_bank * sc->sc_hw.qhw_num_rings_per_bank + ring;
   1035  1.1    hikaru 	qr->qr_ring_mask = (1 << ring);
   1036  1.1    hikaru 	qr->qr_cb = cb;
   1037  1.1    hikaru 	qr->qr_cb_arg = cb_arg;
   1038  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qr->qr_ev_rxintr, EVCNT_TYPE_INTR,
   1039  1.1    hikaru 	    qr->qr_ev_rxintr_name, "bank%d ring%d rxintr", bank, ring);
   1040  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qr->qr_ev_rxmsg, EVCNT_TYPE_MISC,
   1041  1.1    hikaru 	    qr->qr_ev_rxmsg_name, "bank%d ring%d rxmsg", bank, ring);
   1042  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qr->qr_ev_txmsg, EVCNT_TYPE_MISC,
   1043  1.1    hikaru 	    qr->qr_ev_txmsg_name, "bank%d ring%d txmsg", bank, ring);
   1044  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qr->qr_ev_txfull, EVCNT_TYPE_MISC,
   1045  1.1    hikaru 	    qr->qr_ev_txfull_name, "bank%d ring%d txfull", bank, ring);
   1046  1.1    hikaru 
   1047  1.1    hikaru 	/* Setup the shadow variables */
   1048  1.1    hikaru 	qr->qr_head = 0;
   1049  1.1    hikaru 	qr->qr_tail = 0;
   1050  1.1    hikaru 	qr->qr_msg_size = QAT_BYTES_TO_MSG_SIZE(msg_size);
   1051  1.1    hikaru 	qr->qr_ring_size = qat_etr_verify_ring_size(msg_size, num_msgs);
   1052  1.1    hikaru 
   1053  1.1    hikaru 	/*
   1054  1.7   msaitoh 	 * To make sure that ring is aligned to ring size allocate
   1055  1.1    hikaru 	 * at least 4k and then tell the user it is smaller.
   1056  1.1    hikaru 	 */
   1057  1.1    hikaru 	ring_size_bytes = QAT_SIZE_TO_RING_SIZE_IN_BYTES(qr->qr_ring_size);
   1058  1.1    hikaru 	ring_size_bytes = QAT_RING_SIZE_BYTES_MIN(ring_size_bytes);
   1059  1.1    hikaru 	error = qat_alloc_dmamem(sc, &qr->qr_dma,
   1060  1.1    hikaru 	    ring_size_bytes, ring_size_bytes);
   1061  1.1    hikaru 	if (error)
   1062  1.1    hikaru 		return error;
   1063  1.1    hikaru 
   1064  1.1    hikaru 	KASSERT(qr->qr_dma.qdm_dma_map->dm_nsegs == 1);
   1065  1.1    hikaru 
   1066  1.1    hikaru 	qr->qr_ring_vaddr = qr->qr_dma.qdm_dma_vaddr;
   1067  1.1    hikaru 	qr->qr_ring_paddr = qr->qr_dma.qdm_dma_map->dm_segs[0].ds_addr;
   1068  1.1    hikaru 
   1069  1.1    hikaru 	aprint_verbose_dev(sc->sc_dev,
   1070  1.1    hikaru 	    "allocate ring %d of bank %d for %s "
   1071  1.1    hikaru 	    "size %d %d at vaddr %p paddr 0x%llx\n",
   1072  1.1    hikaru 	    ring, bank, name, ring_size_bytes,
   1073  1.1    hikaru 	    (int)qr->qr_dma.qdm_dma_map->dm_segs[0].ds_len,
   1074  1.1    hikaru 	    qr->qr_ring_vaddr,
   1075  1.1    hikaru 	    (unsigned long long)qr->qr_ring_paddr);
   1076  1.1    hikaru 
   1077  1.1    hikaru 	memset(qr->qr_ring_vaddr, QAT_RING_PATTERN,
   1078  1.1    hikaru 	    qr->qr_dma.qdm_dma_map->dm_segs[0].ds_len);
   1079  1.1    hikaru 
   1080  1.1    hikaru 	bus_dmamap_sync(sc->sc_dmat, qr->qr_dma.qdm_dma_map, 0,
   1081  1.1    hikaru 	    qr->qr_dma.qdm_dma_map->dm_mapsize,
   1082  1.1    hikaru 	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
   1083  1.1    hikaru 
   1084  1.1    hikaru 	if (((uintptr_t)qr->qr_ring_paddr & (ring_size_bytes - 1)) != 0) {
   1085  1.1    hikaru 		aprint_error_dev(sc->sc_dev, "ring address not aligned\n");
   1086  1.1    hikaru 		return EFAULT;
   1087  1.1    hikaru 	}
   1088  1.1    hikaru 
   1089  1.1    hikaru 	if (cb == NULL) {
   1090  1.1    hikaru 		ring_config = ETR_RING_CONFIG_BUILD(qr->qr_ring_size);
   1091  1.1    hikaru 	} else {
   1092  1.1    hikaru 		ring_config =
   1093  1.1    hikaru 		    ETR_RING_CONFIG_BUILD_RESP(qr->qr_ring_size, wm_nf, wm_ne);
   1094  1.1    hikaru 	}
   1095  1.1    hikaru 	qat_etr_bank_ring_write_4(sc, bank, ring, ETR_RING_CONFIG, ring_config);
   1096  1.1    hikaru 
   1097  1.1    hikaru 	ring_base = ETR_RING_BASE_BUILD(qr->qr_ring_paddr, qr->qr_ring_size);
   1098  1.1    hikaru 	qat_etr_bank_ring_base_write_8(sc, bank, ring, ring_base);
   1099  1.1    hikaru 
   1100  1.1    hikaru 	if (sc->sc_hw.qhw_init_arb != NULL)
   1101  1.1    hikaru 		qat_arb_update(sc, qb);
   1102  1.1    hikaru 
   1103  1.1    hikaru 	mutex_init(&qr->qr_ring_mtx, MUTEX_DEFAULT, IPL_NET);
   1104  1.1    hikaru 
   1105  1.1    hikaru 	qat_etr_ap_bank_setup_ring(sc, qr);
   1106  1.1    hikaru 
   1107  1.1    hikaru 	if (cb != NULL) {
   1108  1.1    hikaru 		uint32_t intr_mask;
   1109  1.1    hikaru 
   1110  1.1    hikaru 		qb->qb_intr_mask |= qr->qr_ring_mask;
   1111  1.1    hikaru 		intr_mask = qb->qb_intr_mask;
   1112  1.1    hikaru 
   1113  1.1    hikaru 		aprint_verbose_dev(sc->sc_dev,
   1114  1.1    hikaru 		    "update intr mask for bank %d "
   1115  1.1    hikaru 		    "(coalescing time %dns): 0x%08x\n",
   1116  1.1    hikaru 		    bank, qb->qb_coalescing_time, intr_mask);
   1117  1.1    hikaru 		qat_etr_bank_write_4(sc, bank, ETR_INT_COL_EN,
   1118  1.1    hikaru 		    intr_mask);
   1119  1.1    hikaru 		qat_etr_bank_write_4(sc, bank, ETR_INT_COL_CTL,
   1120  1.1    hikaru 		    ETR_INT_COL_CTL_ENABLE | qb->qb_coalescing_time);
   1121  1.1    hikaru 	}
   1122  1.1    hikaru 
   1123  1.1    hikaru 	*rqr = qr;
   1124  1.1    hikaru 
   1125  1.1    hikaru 	return 0;
   1126  1.1    hikaru }
   1127  1.1    hikaru 
   1128  1.1    hikaru static inline u_int
   1129  1.1    hikaru qat_modulo(u_int data, u_int shift)
   1130  1.1    hikaru {
   1131  1.1    hikaru 	u_int div = data >> shift;
   1132  1.1    hikaru 	u_int mult = div << shift;
   1133  1.1    hikaru 	return data - mult;
   1134  1.1    hikaru }
   1135  1.1    hikaru 
   1136  1.1    hikaru int
   1137  1.1    hikaru qat_etr_put_msg(struct qat_softc *sc, struct qat_ring *qr, uint32_t *msg)
   1138  1.1    hikaru {
   1139  1.1    hikaru 	uint32_t inflight;
   1140  1.1    hikaru 	uint32_t *addr;
   1141  1.1    hikaru 
   1142  1.1    hikaru 	mutex_spin_enter(&qr->qr_ring_mtx);
   1143  1.1    hikaru 
   1144  1.1    hikaru 	inflight = atomic_inc_32_nv(qr->qr_inflight);
   1145  1.1    hikaru 	if (inflight > QAT_MAX_INFLIGHTS(qr->qr_ring_size, qr->qr_msg_size)) {
   1146  1.1    hikaru 		atomic_dec_32(qr->qr_inflight);
   1147  1.1    hikaru 		QAT_EVCNT_INCR(&qr->qr_ev_txfull);
   1148  1.1    hikaru 		mutex_spin_exit(&qr->qr_ring_mtx);
   1149  1.1    hikaru 		return EBUSY;
   1150  1.1    hikaru 	}
   1151  1.1    hikaru 	QAT_EVCNT_INCR(&qr->qr_ev_txmsg);
   1152  1.1    hikaru 
   1153  1.1    hikaru 	addr = (uint32_t *)((uintptr_t)qr->qr_ring_vaddr + qr->qr_tail);
   1154  1.1    hikaru 
   1155  1.1    hikaru 	memcpy(addr, msg, QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size));
   1156  1.1    hikaru #ifdef QAT_DUMP
   1157  1.1    hikaru 	qat_dump_raw(QAT_DUMP_RING_MSG, "put_msg", addr,
   1158  1.1    hikaru 	    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size));
   1159  1.1    hikaru #endif
   1160  1.1    hikaru 
   1161  1.1    hikaru 	bus_dmamap_sync(sc->sc_dmat, qr->qr_dma.qdm_dma_map, qr->qr_tail,
   1162  1.1    hikaru 	    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1163  1.1    hikaru 	    BUS_DMASYNC_PREWRITE);
   1164  1.1    hikaru 
   1165  1.1    hikaru 	qr->qr_tail = qat_modulo(qr->qr_tail +
   1166  1.1    hikaru 	    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1167  1.1    hikaru 	    QAT_RING_SIZE_MODULO(qr->qr_ring_size));
   1168  1.1    hikaru 
   1169  1.1    hikaru 	qat_etr_bank_ring_write_4(sc, qr->qr_bank, qr->qr_ring,
   1170  1.1    hikaru 	    ETR_RING_TAIL_OFFSET, qr->qr_tail);
   1171  1.1    hikaru 
   1172  1.1    hikaru 	mutex_spin_exit(&qr->qr_ring_mtx);
   1173  1.1    hikaru 
   1174  1.1    hikaru 	return 0;
   1175  1.1    hikaru }
   1176  1.1    hikaru 
   1177  1.1    hikaru int
   1178  1.1    hikaru qat_etr_ring_intr(struct qat_softc *sc, struct qat_bank *qb,
   1179  1.1    hikaru     struct qat_ring *qr)
   1180  1.1    hikaru {
   1181  1.1    hikaru 	int handled = 0;
   1182  1.1    hikaru 	uint32_t *msg;
   1183  1.1    hikaru 	uint32_t nmsg = 0;
   1184  1.1    hikaru 
   1185  1.1    hikaru 	mutex_spin_enter(&qr->qr_ring_mtx);
   1186  1.1    hikaru 
   1187  1.1    hikaru 	QAT_EVCNT_INCR(&qr->qr_ev_rxintr);
   1188  1.1    hikaru 
   1189  1.1    hikaru 	msg = (uint32_t *)((uintptr_t)qr->qr_ring_vaddr + qr->qr_head);
   1190  1.1    hikaru 
   1191  1.1    hikaru 	bus_dmamap_sync(sc->sc_dmat, qr->qr_dma.qdm_dma_map, qr->qr_head,
   1192  1.1    hikaru 	    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1193  1.1    hikaru 	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   1194  1.1    hikaru 
   1195  1.1    hikaru 	while (*msg != ETR_RING_EMPTY_ENTRY_SIG) {
   1196  1.1    hikaru 		atomic_dec_32(qr->qr_inflight);
   1197  1.1    hikaru 		QAT_EVCNT_INCR(&qr->qr_ev_rxmsg);
   1198  1.1    hikaru 
   1199  1.1    hikaru 		if (qr->qr_cb != NULL) {
   1200  1.1    hikaru 			mutex_spin_exit(&qr->qr_ring_mtx);
   1201  1.1    hikaru 			handled |= qr->qr_cb(sc, qr->qr_cb_arg, msg);
   1202  1.1    hikaru 			mutex_spin_enter(&qr->qr_ring_mtx);
   1203  1.1    hikaru 		}
   1204  1.1    hikaru 
   1205  1.1    hikaru 		*msg = ETR_RING_EMPTY_ENTRY_SIG;
   1206  1.1    hikaru 
   1207  1.1    hikaru 		bus_dmamap_sync(sc->sc_dmat, qr->qr_dma.qdm_dma_map, qr->qr_head,
   1208  1.1    hikaru 		    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1209  1.1    hikaru 		    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
   1210  1.1    hikaru 
   1211  1.1    hikaru 		qr->qr_head = qat_modulo(qr->qr_head +
   1212  1.1    hikaru 		    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1213  1.1    hikaru 		    QAT_RING_SIZE_MODULO(qr->qr_ring_size));
   1214  1.1    hikaru 		nmsg++;
   1215  1.1    hikaru 
   1216  1.1    hikaru 		msg = (uint32_t *)((uintptr_t)qr->qr_ring_vaddr + qr->qr_head);
   1217  1.1    hikaru 
   1218  1.1    hikaru 		bus_dmamap_sync(sc->sc_dmat, qr->qr_dma.qdm_dma_map, qr->qr_head,
   1219  1.1    hikaru 		    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   1220  1.1    hikaru 		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   1221  1.1    hikaru 	}
   1222  1.1    hikaru 
   1223  1.1    hikaru 	if (nmsg > 0) {
   1224  1.1    hikaru 		qat_etr_bank_ring_write_4(sc, qr->qr_bank, qr->qr_ring,
   1225  1.1    hikaru 		    ETR_RING_HEAD_OFFSET, qr->qr_head);
   1226  1.1    hikaru 	}
   1227  1.1    hikaru 
   1228  1.1    hikaru 	mutex_spin_exit(&qr->qr_ring_mtx);
   1229  1.1    hikaru 
   1230  1.1    hikaru 	return handled;
   1231  1.1    hikaru }
   1232  1.1    hikaru 
   1233  1.1    hikaru int
   1234  1.1    hikaru qat_etr_bank_intr(void *arg)
   1235  1.1    hikaru {
   1236  1.1    hikaru 	struct qat_bank *qb = arg;
   1237  1.1    hikaru 	struct qat_softc *sc = qb->qb_sc;
   1238  1.1    hikaru 	uint32_t estat;
   1239  1.1    hikaru 	int i, handled = 0;
   1240  1.1    hikaru 
   1241  1.1    hikaru 	mutex_spin_enter(&qb->qb_bank_mtx);
   1242  1.1    hikaru 
   1243  1.1    hikaru 	QAT_EVCNT_INCR(&qb->qb_ev_rxintr);
   1244  1.1    hikaru 
   1245  1.1    hikaru 	qat_etr_bank_write_4(sc, qb->qb_bank, ETR_INT_COL_CTL, 0);
   1246  1.1    hikaru 
   1247  1.1    hikaru 	/* Now handle all the responses */
   1248  1.1    hikaru 	estat = ~qat_etr_bank_read_4(sc, qb->qb_bank, ETR_E_STAT);
   1249  1.1    hikaru 	estat &= qb->qb_intr_mask;
   1250  1.1    hikaru 
   1251  1.1    hikaru 	qat_etr_bank_write_4(sc, qb->qb_bank, ETR_INT_COL_CTL,
   1252  1.1    hikaru 	    ETR_INT_COL_CTL_ENABLE | qb->qb_coalescing_time);
   1253  1.1    hikaru 
   1254  1.1    hikaru 	mutex_spin_exit(&qb->qb_bank_mtx);
   1255  1.1    hikaru 
   1256  1.1    hikaru 	while ((i = ffs32(estat)) != 0) {
   1257  1.1    hikaru 		struct qat_ring *qr = &qb->qb_et_rings[--i];
   1258  1.1    hikaru 		estat &= ~(1 << i);
   1259  1.1    hikaru 		handled |= qat_etr_ring_intr(sc, qb, qr);
   1260  1.1    hikaru 	}
   1261  1.1    hikaru 
   1262  1.1    hikaru 	return handled;
   1263  1.1    hikaru }
   1264  1.1    hikaru 
   1265  1.1    hikaru void
   1266  1.1    hikaru qat_arb_update(struct qat_softc *sc, struct qat_bank *qb)
   1267  1.1    hikaru {
   1268  1.1    hikaru 
   1269  1.1    hikaru 	qat_arb_ringsrvarben_write_4(sc, qb->qb_bank,
   1270  1.1    hikaru 	    qb->qb_allocated_rings & 0xff);
   1271  1.1    hikaru }
   1272  1.1    hikaru 
   1273  1.1    hikaru struct qat_sym_cookie *
   1274  1.1    hikaru qat_crypto_alloc_sym_cookie(struct qat_crypto_bank *qcb)
   1275  1.1    hikaru {
   1276  1.1    hikaru 	struct qat_sym_cookie *qsc;
   1277  1.1    hikaru 
   1278  1.1    hikaru 	mutex_spin_enter(&qcb->qcb_bank_mtx);
   1279  1.1    hikaru 
   1280  1.1    hikaru 	if (qcb->qcb_symck_free_count == 0) {
   1281  1.1    hikaru 		QAT_EVCNT_INCR(&qcb->qcb_ev_no_symck);
   1282  1.1    hikaru 		mutex_spin_exit(&qcb->qcb_bank_mtx);
   1283  1.1    hikaru 		return NULL;
   1284  1.1    hikaru 	}
   1285  1.1    hikaru 
   1286  1.1    hikaru 	qsc = qcb->qcb_symck_free[--qcb->qcb_symck_free_count];
   1287  1.1    hikaru 
   1288  1.1    hikaru 	mutex_spin_exit(&qcb->qcb_bank_mtx);
   1289  1.1    hikaru 
   1290  1.1    hikaru 	return qsc;
   1291  1.1    hikaru }
   1292  1.1    hikaru 
   1293  1.1    hikaru void
   1294  1.1    hikaru qat_crypto_free_sym_cookie(struct qat_crypto_bank *qcb, struct qat_sym_cookie *qsc)
   1295  1.1    hikaru {
   1296  1.1    hikaru 
   1297  1.1    hikaru 	mutex_spin_enter(&qcb->qcb_bank_mtx);
   1298  1.1    hikaru 	qcb->qcb_symck_free[qcb->qcb_symck_free_count++] = qsc;
   1299  1.1    hikaru 	mutex_spin_exit(&qcb->qcb_bank_mtx);
   1300  1.1    hikaru }
   1301  1.1    hikaru 
   1302  1.1    hikaru 
   1303  1.1    hikaru void
   1304  1.1    hikaru qat_memcpy_htobe64(void *dst, const void *src, size_t len)
   1305  1.1    hikaru {
   1306  1.1    hikaru 	uint64_t *dst0 = dst;
   1307  1.1    hikaru 	const uint64_t *src0 = src;
   1308  1.1    hikaru 	size_t i;
   1309  1.1    hikaru 
   1310  1.1    hikaru 	KASSERT(len % sizeof(*dst0) == 0);
   1311  1.1    hikaru 
   1312  1.1    hikaru 	for (i = 0; i < len / sizeof(*dst0); i++)
   1313  1.1    hikaru 		*(dst0 + i) = htobe64(*(src0 + i));
   1314  1.1    hikaru }
   1315  1.1    hikaru 
   1316  1.1    hikaru void
   1317  1.1    hikaru qat_memcpy_htobe32(void *dst, const void *src, size_t len)
   1318  1.1    hikaru {
   1319  1.1    hikaru 	uint32_t *dst0 = dst;
   1320  1.1    hikaru 	const uint32_t *src0 = src;
   1321  1.1    hikaru 	size_t i;
   1322  1.1    hikaru 
   1323  1.1    hikaru 	KASSERT(len % sizeof(*dst0) == 0);
   1324  1.1    hikaru 
   1325  1.1    hikaru 	for (i = 0; i < len / sizeof(*dst0); i++)
   1326  1.1    hikaru 		*(dst0 + i) = htobe32(*(src0 + i));
   1327  1.1    hikaru }
   1328  1.1    hikaru 
   1329  1.1    hikaru void
   1330  1.1    hikaru qat_memcpy_htobe(void *dst, const void *src, size_t len, uint32_t wordbyte)
   1331  1.1    hikaru {
   1332  1.1    hikaru 	switch (wordbyte) {
   1333  1.1    hikaru 	case 4:
   1334  1.1    hikaru 		qat_memcpy_htobe32(dst, src, len);
   1335  1.1    hikaru 		break;
   1336  1.1    hikaru 	case 8:
   1337  1.1    hikaru 		qat_memcpy_htobe64(dst, src, len);
   1338  1.1    hikaru 		break;
   1339  1.1    hikaru 	default:
   1340  1.1    hikaru 		KASSERT(0);
   1341  1.1    hikaru 	}
   1342  1.1    hikaru }
   1343  1.1    hikaru 
   1344  1.1    hikaru void
   1345  1.1    hikaru qat_crypto_hmac_precompute(struct qat_crypto_desc *desc, struct cryptoini *cria,
   1346  1.1    hikaru     struct qat_sym_hash_def const *hash_def, uint8_t *state1, uint8_t *state2)
   1347  1.1    hikaru {
   1348  1.1    hikaru 	int i, state_swap;
   1349  1.1    hikaru 	struct swcr_auth_hash const *sah = hash_def->qshd_alg->qshai_sah;
   1350  1.1    hikaru 	uint32_t blklen = hash_def->qshd_alg->qshai_block_len;
   1351  1.1    hikaru 	uint32_t state_offset = hash_def->qshd_alg->qshai_state_offset;
   1352  1.1    hikaru 	uint32_t state_size = hash_def->qshd_alg->qshai_state_size;
   1353  1.1    hikaru 	uint32_t state_word = hash_def->qshd_alg->qshai_state_word;
   1354  1.1    hikaru 	uint32_t keylen = cria->cri_klen / 8;
   1355  1.1    hikaru 	uint32_t padlen = blklen - keylen;
   1356  1.1    hikaru 	uint8_t *ipad = desc->qcd_hash_state_prefix_buf;
   1357  1.1    hikaru 	uint8_t *opad = desc->qcd_hash_state_prefix_buf +
   1358  1.1    hikaru 	    sizeof(desc->qcd_hash_state_prefix_buf) / 2;
   1359  1.1    hikaru 	/* XXX
   1360  1.1    hikaru 	 * For "stack protector not protecting local variables" error,
   1361  1.1    hikaru 	 * use constant variable.
   1362  1.1    hikaru 	 * Currently, the max length is sizeof(aesxcbc_ctx) used by
   1363  1.1    hikaru 	 * swcr_auth_hash_aes_xcbc_mac
   1364  1.1    hikaru 	 */
   1365  1.1    hikaru 	uint8_t ctx[sizeof(aesxcbc_ctx)];
   1366  1.1    hikaru 
   1367  1.1    hikaru 	memcpy(ipad, cria->cri_key, keylen);
   1368  1.1    hikaru 	memcpy(opad, cria->cri_key, keylen);
   1369  1.1    hikaru 
   1370  1.1    hikaru 	if (padlen > 0) {
   1371  1.1    hikaru 		memset(ipad + keylen, 0, padlen);
   1372  1.1    hikaru 		memset(opad + keylen, 0, padlen);
   1373  1.1    hikaru 	}
   1374  1.1    hikaru 	for (i = 0; i < blklen; i++) {
   1375  1.1    hikaru 		ipad[i] ^= 0x36;
   1376  1.1    hikaru 		opad[i] ^= 0x5c;
   1377  1.1    hikaru 	}
   1378  1.1    hikaru 
   1379  1.1    hikaru 	/* ipad */
   1380  1.1    hikaru 	sah->Init(ctx);
   1381  1.1    hikaru 	/* Check the endian of kernel built-in hash state */
   1382  1.1    hikaru 	state_swap = memcmp(hash_def->qshd_alg->qshai_init_state,
   1383  1.1    hikaru 	    ((uint8_t *)ctx) + state_offset, state_word);
   1384  1.1    hikaru 	sah->Update(ctx, ipad, blklen);
   1385  1.1    hikaru 	if (state_swap == 0) {
   1386  1.1    hikaru 		memcpy(state1, ((uint8_t *)ctx) + state_offset, state_size);
   1387  1.1    hikaru 	} else {
   1388  1.1    hikaru 		qat_memcpy_htobe(state1, ((uint8_t *)ctx) + state_offset,
   1389  1.1    hikaru 		    state_size, state_word);
   1390  1.1    hikaru 	}
   1391  1.1    hikaru 
   1392  1.1    hikaru 	/* opad */
   1393  1.1    hikaru 	sah->Init(ctx);
   1394  1.1    hikaru 	sah->Update(ctx, opad, blklen);
   1395  1.1    hikaru 	if (state_swap == 0) {
   1396  1.1    hikaru 		memcpy(state2, ((uint8_t *)ctx) + state_offset, state_size);
   1397  1.1    hikaru 	} else {
   1398  1.1    hikaru 		qat_memcpy_htobe(state2, ((uint8_t *)ctx) + state_offset,
   1399  1.1    hikaru 		    state_size, state_word);
   1400  1.1    hikaru 	}
   1401  1.1    hikaru }
   1402  1.1    hikaru 
   1403  1.1    hikaru uint16_t
   1404  1.1    hikaru qat_crypto_load_cipher_cryptoini(
   1405  1.1    hikaru     struct qat_crypto_desc *desc, struct cryptoini *crie)
   1406  1.1    hikaru {
   1407  1.1    hikaru 	enum hw_cipher_algo algo = HW_CIPHER_ALGO_NULL;
   1408  1.1    hikaru 	enum hw_cipher_mode mode = HW_CIPHER_CBC_MODE;
   1409  1.1    hikaru 	enum hw_cipher_convert key_convert = HW_CIPHER_NO_CONVERT;
   1410  1.1    hikaru 
   1411  1.1    hikaru 	switch (crie->cri_alg) {
   1412  1.1    hikaru 	case CRYPTO_DES_CBC:
   1413  1.1    hikaru 		algo = HW_CIPHER_ALGO_DES;
   1414  1.1    hikaru 		desc->qcd_cipher_blk_sz = HW_DES_BLK_SZ;
   1415  1.1    hikaru 		break;
   1416  1.1    hikaru 	case CRYPTO_3DES_CBC:
   1417  1.1    hikaru 		algo = HW_CIPHER_ALGO_3DES;
   1418  1.1    hikaru 		desc->qcd_cipher_blk_sz = HW_3DES_BLK_SZ;
   1419  1.1    hikaru 		break;
   1420  1.1    hikaru 	case CRYPTO_AES_CBC:
   1421  1.1    hikaru 		switch (crie->cri_klen / 8) {
   1422  1.1    hikaru 		case HW_AES_128_KEY_SZ:
   1423  1.1    hikaru 			algo = HW_CIPHER_ALGO_AES128;
   1424  1.1    hikaru 			break;
   1425  1.1    hikaru 		case HW_AES_192_KEY_SZ:
   1426  1.1    hikaru 			algo = HW_CIPHER_ALGO_AES192;
   1427  1.1    hikaru 			break;
   1428  1.1    hikaru 		case HW_AES_256_KEY_SZ:
   1429  1.1    hikaru 			algo = HW_CIPHER_ALGO_AES256;
   1430  1.1    hikaru 			break;
   1431  1.1    hikaru 		default:
   1432  1.1    hikaru 			KASSERT(0);
   1433  1.1    hikaru 			break;
   1434  1.1    hikaru 		}
   1435  1.1    hikaru 		desc->qcd_cipher_blk_sz = HW_AES_BLK_SZ;
   1436  1.1    hikaru 		/*
   1437  1.1    hikaru 		 * AES decrypt key needs to be reversed.
   1438  1.1    hikaru 		 * Instead of reversing the key at session registration,
   1439  1.1    hikaru 		 * it is instead reversed on-the-fly by setting the KEY_CONVERT
   1440  1.1    hikaru 		 * bit here
   1441  1.1    hikaru 		 */
   1442  1.1    hikaru 		if (desc->qcd_cipher_dir == HW_CIPHER_DECRYPT)
   1443  1.1    hikaru 			key_convert = HW_CIPHER_KEY_CONVERT;
   1444  1.1    hikaru 
   1445  1.1    hikaru 		break;
   1446  1.1    hikaru 	default:
   1447  1.1    hikaru 		KASSERT(0);
   1448  1.1    hikaru 		break;
   1449  1.1    hikaru 	}
   1450  1.1    hikaru 
   1451  1.1    hikaru 	return HW_CIPHER_CONFIG_BUILD(mode, algo, key_convert,
   1452  1.1    hikaru 	    desc->qcd_cipher_dir);
   1453  1.1    hikaru }
   1454  1.1    hikaru 
   1455  1.1    hikaru uint16_t
   1456  1.1    hikaru qat_crypto_load_auth_cryptoini(
   1457  1.1    hikaru     struct qat_crypto_desc *desc, struct cryptoini *cria,
   1458  1.1    hikaru     struct qat_sym_hash_def const **hash_def)
   1459  1.1    hikaru {
   1460  1.1    hikaru 	const struct swcr_auth_hash *sah;
   1461  1.1    hikaru 	enum qat_sym_hash_algorithm algo = 0;
   1462  1.1    hikaru 
   1463  1.1    hikaru 	switch (cria->cri_alg) {
   1464  1.1    hikaru 	case CRYPTO_MD5_HMAC_96:
   1465  1.1    hikaru 		algo = QAT_SYM_HASH_MD5;
   1466  1.1    hikaru 		break;
   1467  1.1    hikaru 	case CRYPTO_SHA1_HMAC_96:
   1468  1.1    hikaru 		algo = QAT_SYM_HASH_SHA1;
   1469  1.1    hikaru 		break;
   1470  1.1    hikaru 	case CRYPTO_SHA2_256_HMAC:
   1471  1.1    hikaru 		algo = QAT_SYM_HASH_SHA256;
   1472  1.1    hikaru 		break;
   1473  1.1    hikaru 	case CRYPTO_SHA2_384_HMAC:
   1474  1.1    hikaru 		algo = QAT_SYM_HASH_SHA384;
   1475  1.1    hikaru 		break;
   1476  1.1    hikaru 	case CRYPTO_SHA2_512_HMAC:
   1477  1.1    hikaru 		algo = QAT_SYM_HASH_SHA512;
   1478  1.1    hikaru 		break;
   1479  1.1    hikaru 	default:
   1480  1.1    hikaru 		KASSERT(0);
   1481  1.1    hikaru 		break;
   1482  1.1    hikaru 	}
   1483  1.1    hikaru 	*hash_def = &qat_sym_hash_defs[algo];
   1484  1.1    hikaru 	sah = (*hash_def)->qshd_alg->qshai_sah;
   1485  1.1    hikaru 	KASSERT(sah != NULL);
   1486  1.1    hikaru 	desc->qcd_auth_sz = sah->auth_hash->authsize;
   1487  1.1    hikaru 
   1488  1.1    hikaru 	return HW_AUTH_CONFIG_BUILD(HW_AUTH_MODE1,
   1489  1.1    hikaru 	    (*hash_def)->qshd_qat->qshqi_algo_enc,
   1490  1.1    hikaru 	    (*hash_def)->qshd_alg->qshai_digest_len);
   1491  1.1    hikaru }
   1492  1.1    hikaru 
   1493  1.1    hikaru int
   1494  1.1    hikaru qat_crypto_load_buf(struct qat_softc *sc, struct cryptop *crp,
   1495  1.1    hikaru     struct qat_sym_cookie *qsc, struct qat_crypto_desc const *desc,
   1496  1.1    hikaru     uint8_t *icv_buf, int icv_offset, bus_addr_t *icv_paddr)
   1497  1.1    hikaru {
   1498  1.1    hikaru 	int error, i, nsegs;
   1499  1.1    hikaru 
   1500  1.1    hikaru 	if (crp->crp_flags & CRYPTO_F_IMBUF) {
   1501  1.1    hikaru 		struct mbuf *m = (struct mbuf *)crp->crp_buf;
   1502  1.1    hikaru 
   1503  1.1    hikaru 		if (icv_offset >= 0) {
   1504  1.1    hikaru 			if (m_length(m) == icv_offset) {
   1505  1.1    hikaru 				m_copyback(m, icv_offset, desc->qcd_auth_sz,
   1506  1.1    hikaru 				    icv_buf);
   1507  1.1    hikaru 				if (m_length(m) == icv_offset)
   1508  1.1    hikaru 					return ENOBUFS;
   1509  1.1    hikaru 			} else {
   1510  1.1    hikaru 				struct mbuf *m0;
   1511  1.1    hikaru 				m0 = m_pulldown(m, icv_offset,
   1512  1.1    hikaru 				    desc->qcd_auth_sz, NULL);
   1513  1.1    hikaru 				if (m0 == NULL)
   1514  1.1    hikaru 					return ENOBUFS;
   1515  1.1    hikaru 			}
   1516  1.1    hikaru 		}
   1517  1.1    hikaru 
   1518  1.1    hikaru 		error = bus_dmamap_load_mbuf(sc->sc_dmat, qsc->qsc_buf_dmamap,
   1519  1.1    hikaru 		    m, BUS_DMA_WRITE | BUS_DMA_NOWAIT);
   1520  1.1    hikaru 		if (error == EFBIG) {
   1521  1.1    hikaru 			struct mbuf *m_new;
   1522  1.1    hikaru 			m_new = m_defrag(m, M_DONTWAIT);
   1523  1.1    hikaru 			if (m_new != NULL) {
   1524  1.1    hikaru 				crp->crp_buf = m_new;
   1525  1.1    hikaru 				qsc->qsc_buf = m_new;
   1526  1.1    hikaru 				error = bus_dmamap_load_mbuf(sc->sc_dmat,
   1527  1.1    hikaru 				    qsc->qsc_buf_dmamap, m_new,
   1528  1.1    hikaru 				    BUS_DMA_WRITE | BUS_DMA_NOWAIT);
   1529  1.1    hikaru 				if (error) {
   1530  1.1    hikaru 					m_freem(m_new);
   1531  1.1    hikaru 					crp->crp_buf = NULL;
   1532  1.1    hikaru 				}
   1533  1.1    hikaru 			}
   1534  1.1    hikaru 		}
   1535  1.1    hikaru 
   1536  1.1    hikaru 	} else if (crp->crp_flags & CRYPTO_F_IOV) {
   1537  1.1    hikaru 		error = bus_dmamap_load_uio(sc->sc_dmat, qsc->qsc_buf_dmamap,
   1538  1.1    hikaru 		    (struct uio *)crp->crp_buf, BUS_DMA_WRITE | BUS_DMA_NOWAIT);
   1539  1.1    hikaru 	} else {
   1540  1.1    hikaru 		error = bus_dmamap_load(sc->sc_dmat, qsc->qsc_buf_dmamap,
   1541  1.1    hikaru 		    crp->crp_buf, crp->crp_ilen, NULL, BUS_DMA_NOWAIT);
   1542  1.1    hikaru 	}
   1543  1.1    hikaru 	if (error) {
   1544  1.1    hikaru 		aprint_debug_dev(sc->sc_dev,
   1545  1.1    hikaru 		    "can't load crp_buf, error %d\n", error);
   1546  1.1    hikaru 		crp->crp_etype = error;
   1547  1.1    hikaru 		return error;
   1548  1.1    hikaru 	}
   1549  1.1    hikaru 
   1550  1.1    hikaru 	nsegs = qsc->qsc_buf_dmamap->dm_nsegs;
   1551  1.1    hikaru 	qsc->qsc_buf_list.num_buffers = nsegs;
   1552  1.1    hikaru 	for (i = 0; i < nsegs; i++) {
   1553  1.1    hikaru 		struct flat_buffer_desc *flatbuf =
   1554  1.1    hikaru 		    &qsc->qsc_buf_list.phy_buffers[i];
   1555  1.1    hikaru 		bus_addr_t paddr = qsc->qsc_buf_dmamap->dm_segs[i].ds_addr;
   1556  1.1    hikaru 		bus_size_t len = qsc->qsc_buf_dmamap->dm_segs[i].ds_len;
   1557  1.1    hikaru 
   1558  1.1    hikaru 		flatbuf->data_len_in_bytes = len;
   1559  1.1    hikaru 		flatbuf->phy_buffer = (uint64_t)paddr;
   1560  1.1    hikaru 
   1561  1.1    hikaru 		if (icv_offset >= 0) {
   1562  1.1    hikaru 			if (icv_offset < len)
   1563  1.1    hikaru 				*icv_paddr = paddr + icv_offset;
   1564  1.1    hikaru 			else
   1565  1.1    hikaru 				icv_offset -= len;
   1566  1.1    hikaru 		}
   1567  1.1    hikaru 	}
   1568  1.1    hikaru 
   1569  1.1    hikaru 	bus_dmamap_sync(sc->sc_dmat, qsc->qsc_buf_dmamap, 0,
   1570  1.1    hikaru 	    qsc->qsc_buf_dmamap->dm_mapsize,
   1571  1.1    hikaru 	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
   1572  1.1    hikaru 
   1573  1.1    hikaru 	return 0;
   1574  1.1    hikaru }
   1575  1.1    hikaru 
   1576  1.1    hikaru int
   1577  1.1    hikaru qat_crypto_load_iv(struct qat_sym_cookie *qsc, struct cryptop *crp,
   1578  1.1    hikaru     struct cryptodesc *crde, struct qat_crypto_desc const *desc)
   1579  1.1    hikaru {
   1580  1.1    hikaru 	uint32_t ivlen = desc->qcd_cipher_blk_sz;
   1581  1.1    hikaru 
   1582  1.1    hikaru 	if (crde->crd_flags & CRD_F_IV_EXPLICIT) {
   1583  1.1    hikaru 		memcpy(qsc->qsc_iv_buf, crde->crd_iv, ivlen);
   1584  1.1    hikaru 	} else {
   1585  1.1    hikaru 		if (crde->crd_flags & CRD_F_ENCRYPT) {
   1586  1.6  riastrad 			cprng_fast(qsc->qsc_iv_buf, ivlen);
   1587  1.1    hikaru 		} else if (crp->crp_flags & CRYPTO_F_IMBUF) {
   1588  1.1    hikaru 			/* get iv from buf */
   1589  1.1    hikaru 			m_copydata(qsc->qsc_buf, crde->crd_inject, ivlen,
   1590  1.1    hikaru 			    qsc->qsc_iv_buf);
   1591  1.1    hikaru 		} else if (crp->crp_flags & CRYPTO_F_IOV) {
   1592  1.1    hikaru 			cuio_copydata(qsc->qsc_buf, crde->crd_inject, ivlen,
   1593  1.1    hikaru 			    qsc->qsc_iv_buf);
   1594  1.1    hikaru 		}
   1595  1.1    hikaru 	}
   1596  1.1    hikaru 
   1597  1.1    hikaru 	if ((crde->crd_flags & CRD_F_ENCRYPT) != 0 &&
   1598  1.1    hikaru 	    (crde->crd_flags & CRD_F_IV_PRESENT) == 0) {
   1599  1.1    hikaru 		if (crp->crp_flags & CRYPTO_F_IMBUF) {
   1600  1.1    hikaru 			m_copyback(qsc->qsc_buf, crde->crd_inject, ivlen,
   1601  1.1    hikaru 			    qsc->qsc_iv_buf);
   1602  1.1    hikaru 		} else if (crp->crp_flags & CRYPTO_F_IOV) {
   1603  1.1    hikaru 			cuio_copyback(qsc->qsc_buf, crde->crd_inject, ivlen,
   1604  1.1    hikaru 			    qsc->qsc_iv_buf);
   1605  1.1    hikaru 		}
   1606  1.1    hikaru 	}
   1607  1.1    hikaru 
   1608  1.1    hikaru 	return 0;
   1609  1.1    hikaru }
   1610  1.1    hikaru 
   1611  1.1    hikaru static inline struct qat_crypto_bank *
   1612  1.1    hikaru qat_crypto_select_bank(struct qat_crypto *qcy)
   1613  1.1    hikaru {
   1614  1.1    hikaru 	u_int cpuid = cpu_index(curcpu());
   1615  1.1    hikaru 
   1616  1.1    hikaru 	return &qcy->qcy_banks[cpuid % qcy->qcy_num_banks];
   1617  1.1    hikaru }
   1618  1.1    hikaru 
   1619  1.1    hikaru int
   1620  1.1    hikaru qat_crypto_process(void *arg, struct cryptop *crp, int hint)
   1621  1.1    hikaru {
   1622  1.1    hikaru 	struct qat_crypto *qcy = arg;
   1623  1.1    hikaru 	struct qat_crypto_bank *qcb;
   1624  1.1    hikaru 	struct qat_session *qs = NULL;
   1625  1.1    hikaru 	struct qat_crypto_desc const *desc;
   1626  1.1    hikaru 	struct qat_sym_cookie *qsc = NULL;
   1627  1.1    hikaru 	struct qat_sym_bulk_cookie *qsbc;
   1628  1.1    hikaru 	struct cryptodesc *crd, *crda = NULL, *crde = NULL;
   1629  1.1    hikaru 	bus_addr_t icv_paddr = 0;
   1630  1.1    hikaru 	int error, icv_offset = -1;
   1631  1.1    hikaru 	uint8_t icv_buf[CRYPTO_MAX_MAC_LEN];
   1632  1.1    hikaru 
   1633  1.1    hikaru 	qs = qcy->qcy_sessions[CRYPTO_SESID2LID(crp->crp_sid)];
   1634  1.1    hikaru 	mutex_spin_enter(&qs->qs_session_mtx);
   1635  1.1    hikaru 	KASSERT(qs->qs_status & QAT_SESSION_STATUS_ACTIVE);
   1636  1.1    hikaru 	qs->qs_inflight++;
   1637  1.1    hikaru 	mutex_spin_exit(&qs->qs_session_mtx);
   1638  1.1    hikaru 
   1639  1.1    hikaru 	qcb = qat_crypto_select_bank(qcy);
   1640  1.1    hikaru 
   1641  1.1    hikaru 	qsc = qat_crypto_alloc_sym_cookie(qcb);
   1642  1.1    hikaru 	if (qsc == NULL) {
   1643  1.1    hikaru 		error = ENOBUFS;
   1644  1.1    hikaru 		goto fail;
   1645  1.1    hikaru 	}
   1646  1.1    hikaru 
   1647  1.1    hikaru 	error = 0;
   1648  1.1    hikaru 	desc = &qs->qs_dec_desc;
   1649  1.1    hikaru 	crd = crp->crp_desc;
   1650  1.1    hikaru 	while (crd != NULL) {
   1651  1.1    hikaru 		switch (crd->crd_alg) {
   1652  1.1    hikaru 		case CRYPTO_DES_CBC:
   1653  1.1    hikaru 		case CRYPTO_3DES_CBC:
   1654  1.1    hikaru 		case CRYPTO_AES_CBC:
   1655  1.1    hikaru 			if (crde != NULL)
   1656  1.1    hikaru 				error = EINVAL;
   1657  1.1    hikaru 			if (crd->crd_flags & CRD_F_ENCRYPT) {
   1658  1.1    hikaru 				/* use encrypt desc */
   1659  1.1    hikaru 				desc = &qs->qs_enc_desc;
   1660  1.1    hikaru 				if (crda != NULL)
   1661  1.1    hikaru 					error = ENOTSUP;
   1662  1.1    hikaru 			}
   1663  1.1    hikaru 			crde = crd;
   1664  1.1    hikaru 			break;
   1665  1.1    hikaru 		case CRYPTO_MD5_HMAC_96:
   1666  1.1    hikaru 		case CRYPTO_SHA1_HMAC_96:
   1667  1.1    hikaru 		case CRYPTO_SHA2_256_HMAC:
   1668  1.1    hikaru 		case CRYPTO_SHA2_384_HMAC:
   1669  1.1    hikaru 		case CRYPTO_SHA2_512_HMAC:
   1670  1.1    hikaru 			if (crda != NULL)
   1671  1.1    hikaru 				error = EINVAL;
   1672  1.1    hikaru 			if (crde != NULL &&
   1673  1.1    hikaru 			    (crde->crd_flags & CRD_F_ENCRYPT) == 0)
   1674  1.1    hikaru 				error = EINVAL;
   1675  1.1    hikaru 			crda = crd;
   1676  1.1    hikaru 			icv_offset = crd->crd_inject;
   1677  1.1    hikaru 			break;
   1678  1.1    hikaru 		}
   1679  1.1    hikaru 		if (error)
   1680  1.1    hikaru 			goto fail;
   1681  1.1    hikaru 
   1682  1.1    hikaru 		crd = crd->crd_next;
   1683  1.1    hikaru 	}
   1684  1.1    hikaru 
   1685  1.1    hikaru 	qsc->qsc_buf = crp->crp_buf;
   1686  1.1    hikaru 
   1687  1.1    hikaru 	if (crde != NULL) {
   1688  1.1    hikaru 		error = qat_crypto_load_iv(qsc, crp, crde, desc);
   1689  1.1    hikaru 		if (error)
   1690  1.1    hikaru 			goto fail;
   1691  1.1    hikaru 	}
   1692  1.1    hikaru 
   1693  1.1    hikaru 	error = qat_crypto_load_buf(qcy->qcy_sc, crp, qsc, desc, icv_buf,
   1694  1.1    hikaru 	    icv_offset, &icv_paddr);
   1695  1.1    hikaru 	if (error)
   1696  1.1    hikaru 		goto fail;
   1697  1.1    hikaru 
   1698  1.1    hikaru 	qsbc = &qsc->u.qsc_bulk_cookie;
   1699  1.1    hikaru 
   1700  1.1    hikaru 	qsbc->qsbc_crypto = qcy;
   1701  1.1    hikaru 	qsbc->qsbc_session = qs;
   1702  1.1    hikaru 	qsbc->qsbc_cb_tag = crp;
   1703  1.1    hikaru 
   1704  1.1    hikaru 	qcy->qcy_sc->sc_hw.qhw_crypto_setup_req_params(qcb, qs, desc, qsc,
   1705  1.1    hikaru 	    crde, crda, icv_paddr);
   1706  1.1    hikaru 
   1707  1.1    hikaru 	bus_dmamap_sync(qcy->qcy_sc->sc_dmat, *qsc->qsc_self_dmamap, 0,
   1708  1.1    hikaru 	    offsetof(struct qat_sym_cookie, qsc_self_dmamap),
   1709  1.1    hikaru 	    BUS_DMASYNC_PREWRITE);
   1710  1.1    hikaru 
   1711  1.1    hikaru 	error = qat_etr_put_msg(qcy->qcy_sc, qcb->qcb_sym_tx,
   1712  1.1    hikaru 	    (uint32_t *)qsbc->qsbc_msg);
   1713  1.1    hikaru 	if (error)
   1714  1.1    hikaru 		goto fail;
   1715  1.1    hikaru 
   1716  1.1    hikaru 	return 0;
   1717  1.1    hikaru fail:
   1718  1.1    hikaru 	if (qsc)
   1719  1.1    hikaru 		qat_crypto_free_sym_cookie(qcb, qsc);
   1720  1.1    hikaru 	mutex_spin_enter(&qs->qs_session_mtx);
   1721  1.1    hikaru 	qs->qs_inflight--;
   1722  1.1    hikaru 	qat_crypto_check_free_session(qcy, qs);
   1723  1.1    hikaru 	crp->crp_etype = error;
   1724  1.1    hikaru 	crypto_done(crp);
   1725  1.1    hikaru 	return 0;
   1726  1.1    hikaru }
   1727  1.1    hikaru 
   1728  1.1    hikaru int
   1729  1.1    hikaru qat_crypto_setup_ring(struct qat_softc *sc, struct qat_crypto_bank *qcb)
   1730  1.1    hikaru {
   1731  1.1    hikaru 	int error, i, bank;
   1732  1.1    hikaru 	int curname = 0;
   1733  1.1    hikaru 	char *name;
   1734  1.1    hikaru 
   1735  1.1    hikaru 	bank = qcb->qcb_bank;
   1736  1.1    hikaru 
   1737  1.1    hikaru 	name = qcb->qcb_ring_names[curname++];
   1738  1.1    hikaru 	snprintf(name, QAT_RING_NAME_SIZE, "bank%d sym_tx", bank);
   1739  1.1    hikaru 	error = qat_etr_setup_ring(sc, qcb->qcb_bank,
   1740  1.1    hikaru 	    sc->sc_hw.qhw_ring_sym_tx, QAT_NSYMREQ, sc->sc_hw.qhw_fw_req_size,
   1741  1.1    hikaru 	    NULL, NULL, name, &qcb->qcb_sym_tx);
   1742  1.1    hikaru 	if (error)
   1743  1.1    hikaru 		return error;
   1744  1.1    hikaru 
   1745  1.1    hikaru 	name = qcb->qcb_ring_names[curname++];
   1746  1.1    hikaru 	snprintf(name, QAT_RING_NAME_SIZE, "bank%d sym_rx", bank);
   1747  1.1    hikaru 	error = qat_etr_setup_ring(sc, qcb->qcb_bank,
   1748  1.1    hikaru 	    sc->sc_hw.qhw_ring_sym_rx, QAT_NSYMREQ, sc->sc_hw.qhw_fw_resp_size,
   1749  1.1    hikaru 	    qat_crypto_sym_rxintr, qcb, name, &qcb->qcb_sym_rx);
   1750  1.1    hikaru 	if (error)
   1751  1.1    hikaru 		return error;
   1752  1.1    hikaru 
   1753  1.1    hikaru 	for (i = 0; i < QAT_NSYMCOOKIE; i++) {
   1754  1.1    hikaru 		struct qat_dmamem *qdm = &qcb->qcb_symck_dmamems[i];
   1755  1.1    hikaru 		struct qat_sym_cookie *qsc;
   1756  1.1    hikaru 
   1757  1.1    hikaru 		error = qat_alloc_dmamem(sc, qdm, sizeof(struct qat_sym_cookie),
   1758  1.1    hikaru 		    QAT_OPTIMAL_ALIGN);
   1759  1.1    hikaru 		if (error)
   1760  1.1    hikaru 			return error;
   1761  1.1    hikaru 
   1762  1.1    hikaru 		qsc = qdm->qdm_dma_vaddr;
   1763  1.1    hikaru 		qsc->qsc_self_dmamap = &qdm->qdm_dma_map;
   1764  1.1    hikaru 		qsc->qsc_bulk_req_params_buf_paddr =
   1765  1.1    hikaru 		    qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
   1766  1.1    hikaru 		    u.qsc_bulk_cookie.qsbc_req_params_buf);
   1767  1.1    hikaru 		qsc->qsc_buffer_list_desc_paddr =
   1768  1.1    hikaru 		    qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
   1769  1.1    hikaru 		    qsc_buf_list);
   1770  1.1    hikaru 		qsc->qsc_iv_buf_paddr =
   1771  1.1    hikaru 		    qdm->qdm_dma_seg.ds_addr + offsetof(struct qat_sym_cookie,
   1772  1.1    hikaru 		    qsc_iv_buf);
   1773  1.1    hikaru 		qcb->qcb_symck_free[i] = qsc;
   1774  1.1    hikaru 		qcb->qcb_symck_free_count++;
   1775  1.1    hikaru 
   1776  1.1    hikaru 		error = bus_dmamap_create(sc->sc_dmat, QAT_MAXLEN,
   1777  1.1    hikaru 		    QAT_MAXSEG, MCLBYTES, 0, 0, &qsc->qsc_buf_dmamap);
   1778  1.1    hikaru 		if (error)
   1779  1.1    hikaru 			return error;
   1780  1.1    hikaru 	}
   1781  1.1    hikaru 
   1782  1.1    hikaru 	return 0;
   1783  1.1    hikaru }
   1784  1.1    hikaru 
   1785  1.1    hikaru int
   1786  1.1    hikaru qat_crypto_bank_init(struct qat_softc *sc, struct qat_crypto_bank *qcb)
   1787  1.1    hikaru {
   1788  1.1    hikaru 	int error;
   1789  1.1    hikaru 
   1790  1.1    hikaru 	mutex_init(&qcb->qcb_bank_mtx, MUTEX_DEFAULT, IPL_NET);
   1791  1.1    hikaru 
   1792  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qcb->qcb_ev_no_symck, EVCNT_TYPE_MISC,
   1793  1.1    hikaru 	    qcb->qcb_ev_no_symck_name, "crypto no_symck");
   1794  1.1    hikaru 
   1795  1.1    hikaru 	error = qat_crypto_setup_ring(sc, qcb);
   1796  1.1    hikaru 	if (error)
   1797  1.1    hikaru 		return error;
   1798  1.1    hikaru 
   1799  1.1    hikaru 	return 0;
   1800  1.1    hikaru }
   1801  1.1    hikaru 
   1802  1.1    hikaru int
   1803  1.1    hikaru qat_crypto_init(struct qat_softc *sc)
   1804  1.1    hikaru {
   1805  1.1    hikaru 	struct qat_crypto *qcy = &sc->sc_crypto;
   1806  1.1    hikaru 	int error, bank, i;
   1807  1.1    hikaru 	int num_banks;
   1808  1.1    hikaru 
   1809  1.1    hikaru 	qcy->qcy_sc = sc;
   1810  1.1    hikaru 
   1811  1.1    hikaru 	if (sc->sc_hw.qhw_init_arb != NULL)
   1812  1.1    hikaru 		num_banks = uimin(ncpu, sc->sc_hw.qhw_num_banks);
   1813  1.1    hikaru 	else
   1814  1.1    hikaru 		num_banks = sc->sc_ae_num;
   1815  1.1    hikaru 
   1816  1.1    hikaru 	qcy->qcy_num_banks = num_banks;
   1817  1.1    hikaru 
   1818  1.1    hikaru 	qcy->qcy_banks =
   1819  1.1    hikaru 	    qat_alloc_mem(sizeof(struct qat_crypto_bank) * num_banks);
   1820  1.1    hikaru 
   1821  1.1    hikaru 	for (bank = 0; bank < num_banks; bank++) {
   1822  1.1    hikaru 		struct qat_crypto_bank *qcb = &qcy->qcy_banks[bank];
   1823  1.1    hikaru 		qcb->qcb_bank = bank;
   1824  1.1    hikaru 		qcb->qcb_crypto = qcy;
   1825  1.1    hikaru 		error = qat_crypto_bank_init(sc, qcb);
   1826  1.1    hikaru 		if (error)
   1827  1.1    hikaru 			return error;
   1828  1.1    hikaru 	}
   1829  1.1    hikaru 
   1830  1.1    hikaru 	mutex_init(&qcy->qcy_crypto_mtx, MUTEX_DEFAULT, IPL_NET);
   1831  1.1    hikaru 
   1832  1.1    hikaru 	for (i = 0; i < QAT_NSESSION; i++) {
   1833  1.1    hikaru 		struct qat_dmamem *qdm = &qcy->qcy_session_dmamems[i];
   1834  1.1    hikaru 		struct qat_session *qs;
   1835  1.1    hikaru 
   1836  1.1    hikaru 		error = qat_alloc_dmamem(sc, qdm, sizeof(struct qat_session),
   1837  1.1    hikaru 		    QAT_OPTIMAL_ALIGN);
   1838  1.1    hikaru 		if (error)
   1839  1.1    hikaru 			return error;
   1840  1.1    hikaru 
   1841  1.1    hikaru 		qs = qdm->qdm_dma_vaddr;
   1842  1.1    hikaru 		qs->qs_lid = i;
   1843  1.1    hikaru 		qs->qs_dec_desc.qcd_desc_paddr = qdm->qdm_dma_seg.ds_addr;
   1844  1.1    hikaru 		qs->qs_dec_desc.qcd_hash_state_paddr =
   1845  1.1    hikaru 		    qs->qs_dec_desc.qcd_desc_paddr +
   1846  1.1    hikaru 		    offsetof(struct qat_crypto_desc, qcd_hash_state_prefix_buf);
   1847  1.1    hikaru 		qs->qs_enc_desc.qcd_desc_paddr = qdm->qdm_dma_seg.ds_addr +
   1848  1.1    hikaru 		    offsetof(struct qat_session, qs_enc_desc);
   1849  1.1    hikaru 		qs->qs_enc_desc.qcd_hash_state_paddr =
   1850  1.1    hikaru 		    qs->qs_enc_desc.qcd_desc_paddr +
   1851  1.1    hikaru 		    offsetof(struct qat_crypto_desc, qcd_hash_state_prefix_buf);
   1852  1.1    hikaru 
   1853  1.1    hikaru 		mutex_init(&qs->qs_session_mtx, MUTEX_DEFAULT, IPL_NET);
   1854  1.1    hikaru 
   1855  1.1    hikaru 		qcy->qcy_sessions[i] = qs;
   1856  1.1    hikaru 		qcy->qcy_session_free[i] = qs;
   1857  1.1    hikaru 		qcy->qcy_session_free_count++;
   1858  1.1    hikaru 	}
   1859  1.1    hikaru 
   1860  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qcy->qcy_ev_new_sess, EVCNT_TYPE_MISC,
   1861  1.1    hikaru 	    qcy->qcy_ev_new_sess_name, "crypto new_sess");
   1862  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qcy->qcy_ev_free_sess, EVCNT_TYPE_MISC,
   1863  1.1    hikaru 	    qcy->qcy_ev_free_sess_name, "crypto free_sess");
   1864  1.1    hikaru 	QAT_EVCNT_ATTACH(sc, &qcy->qcy_ev_no_sess, EVCNT_TYPE_MISC,
   1865  1.1    hikaru 	    qcy->qcy_ev_no_sess_name, "crypto no_sess");
   1866  1.1    hikaru 
   1867  1.1    hikaru 	return 0;
   1868  1.1    hikaru }
   1869  1.1    hikaru 
   1870  1.1    hikaru int
   1871  1.1    hikaru qat_crypto_new_session(void *arg, uint32_t *lid, struct cryptoini *cri)
   1872  1.1    hikaru {
   1873  1.1    hikaru 	struct qat_crypto *qcy = arg;
   1874  1.1    hikaru 	struct qat_session *qs = NULL;
   1875  1.1    hikaru 	struct cryptoini *crie = NULL;
   1876  1.1    hikaru 	struct cryptoini *cria = NULL;
   1877  1.1    hikaru 	int slice, error;
   1878  1.1    hikaru 
   1879  1.1    hikaru 	mutex_spin_enter(&qcy->qcy_crypto_mtx);
   1880  1.1    hikaru 
   1881  1.1    hikaru 	if (qcy->qcy_session_free_count == 0) {
   1882  1.1    hikaru 		QAT_EVCNT_INCR(&qcy->qcy_ev_no_sess);
   1883  1.1    hikaru 		mutex_spin_exit(&qcy->qcy_crypto_mtx);
   1884  1.1    hikaru 		return ENOBUFS;
   1885  1.1    hikaru 	}
   1886  1.1    hikaru 	qs = qcy->qcy_session_free[--qcy->qcy_session_free_count];
   1887  1.1    hikaru 	QAT_EVCNT_INCR(&qcy->qcy_ev_new_sess);
   1888  1.1    hikaru 
   1889  1.1    hikaru 	mutex_spin_exit(&qcy->qcy_crypto_mtx);
   1890  1.1    hikaru 
   1891  1.1    hikaru 	qs->qs_status = QAT_SESSION_STATUS_ACTIVE;
   1892  1.1    hikaru 	qs->qs_inflight = 0;
   1893  1.1    hikaru 	*lid = qs->qs_lid;
   1894  1.1    hikaru 
   1895  1.1    hikaru 	error = 0;
   1896  1.1    hikaru 	while (cri) {
   1897  1.1    hikaru 		switch (cri->cri_alg) {
   1898  1.1    hikaru 		case CRYPTO_DES_CBC:
   1899  1.1    hikaru 		case CRYPTO_3DES_CBC:
   1900  1.1    hikaru 		case CRYPTO_AES_CBC:
   1901  1.1    hikaru 			if (crie != NULL)
   1902  1.1    hikaru 				error = EINVAL;
   1903  1.1    hikaru 			crie = cri;
   1904  1.1    hikaru 			break;
   1905  1.1    hikaru 		case CRYPTO_MD5_HMAC_96:
   1906  1.1    hikaru 		case CRYPTO_SHA1_HMAC_96:
   1907  1.1    hikaru 		case CRYPTO_SHA2_256_HMAC:
   1908  1.1    hikaru 		case CRYPTO_SHA2_384_HMAC:
   1909  1.1    hikaru 		case CRYPTO_SHA2_512_HMAC:
   1910  1.1    hikaru 			if (cria != NULL)
   1911  1.1    hikaru 				error = EINVAL;
   1912  1.1    hikaru 			cria = cri;
   1913  1.1    hikaru 			break;
   1914  1.1    hikaru 		default:
   1915  1.1    hikaru 			error = EINVAL;
   1916  1.1    hikaru 		}
   1917  1.1    hikaru 		if (error)
   1918  1.1    hikaru 			goto fail;
   1919  1.1    hikaru 		cri = cri->cri_next;
   1920  1.1    hikaru 	}
   1921  1.1    hikaru 
   1922  1.1    hikaru 	slice = 1;
   1923  1.1    hikaru 	if (crie != NULL && cria != NULL) {
   1924  1.1    hikaru 		slice = 2;
   1925  1.1    hikaru 		/* auth then decrypt */
   1926  1.1    hikaru 		qs->qs_dec_desc.qcd_slices[0] = FW_SLICE_AUTH;
   1927  1.1    hikaru 		qs->qs_dec_desc.qcd_slices[1] = FW_SLICE_CIPHER;
   1928  1.1    hikaru 		qs->qs_dec_desc.qcd_cipher_dir = HW_CIPHER_DECRYPT;
   1929  1.1    hikaru 		qs->qs_dec_desc.qcd_cmd_id = FW_LA_CMD_HASH_CIPHER;
   1930  1.1    hikaru 		/* encrypt then auth */
   1931  1.1    hikaru 		qs->qs_enc_desc.qcd_slices[0] = FW_SLICE_CIPHER;
   1932  1.1    hikaru 		qs->qs_enc_desc.qcd_slices[1] = FW_SLICE_AUTH;
   1933  1.1    hikaru 		qs->qs_enc_desc.qcd_cipher_dir = HW_CIPHER_ENCRYPT;
   1934  1.1    hikaru 		qs->qs_enc_desc.qcd_cmd_id = FW_LA_CMD_CIPHER_HASH;
   1935  1.1    hikaru 	} else if (crie != NULL) {
   1936  1.1    hikaru 		/* decrypt */
   1937  1.1    hikaru 		qs->qs_dec_desc.qcd_slices[0] = FW_SLICE_CIPHER;
   1938  1.1    hikaru 		qs->qs_dec_desc.qcd_cipher_dir = HW_CIPHER_DECRYPT;
   1939  1.1    hikaru 		qs->qs_dec_desc.qcd_cmd_id = FW_LA_CMD_CIPHER;
   1940  1.1    hikaru 		/* encrypt */
   1941  1.1    hikaru 		qs->qs_enc_desc.qcd_slices[0] = FW_SLICE_CIPHER;
   1942  1.1    hikaru 		qs->qs_enc_desc.qcd_cipher_dir = HW_CIPHER_ENCRYPT;
   1943  1.1    hikaru 		qs->qs_enc_desc.qcd_cmd_id = FW_LA_CMD_CIPHER;
   1944  1.1    hikaru 	} else if (cria != NULL) {
   1945  1.1    hikaru 		/* auth */
   1946  1.1    hikaru 		qs->qs_dec_desc.qcd_slices[0] = FW_SLICE_AUTH;
   1947  1.1    hikaru 		qs->qs_dec_desc.qcd_cmd_id = FW_LA_CMD_AUTH;
   1948  1.1    hikaru 		/* auth */
   1949  1.1    hikaru 		qs->qs_enc_desc.qcd_slices[0] = FW_SLICE_AUTH;
   1950  1.1    hikaru 		qs->qs_enc_desc.qcd_cmd_id = FW_LA_CMD_AUTH;
   1951  1.1    hikaru 	} else {
   1952  1.1    hikaru 		error = EINVAL;
   1953  1.1    hikaru 		goto fail;
   1954  1.1    hikaru 	}
   1955  1.1    hikaru 	qs->qs_dec_desc.qcd_slices[slice] = FW_SLICE_DRAM_WR;
   1956  1.1    hikaru 	qs->qs_enc_desc.qcd_slices[slice] = FW_SLICE_DRAM_WR;
   1957  1.1    hikaru 
   1958  1.1    hikaru 	qcy->qcy_sc->sc_hw.qhw_crypto_setup_desc(qcy, qs, &qs->qs_dec_desc, crie, cria);
   1959  1.1    hikaru 	qcy->qcy_sc->sc_hw.qhw_crypto_setup_desc(qcy, qs, &qs->qs_enc_desc, crie, cria);
   1960  1.1    hikaru 
   1961  1.1    hikaru 	return 0;
   1962  1.1    hikaru fail:
   1963  1.1    hikaru 	if (qs != NULL) {
   1964  1.1    hikaru 		mutex_spin_enter(&qs->qs_session_mtx);
   1965  1.1    hikaru 		qat_crypto_free_session0(qcy, qs);
   1966  1.1    hikaru 	}
   1967  1.1    hikaru 	return error;
   1968  1.1    hikaru }
   1969  1.1    hikaru 
   1970  1.1    hikaru static inline void
   1971  1.1    hikaru qat_crypto_clean_desc(struct qat_crypto_desc *desc)
   1972  1.1    hikaru {
   1973  1.1    hikaru 	explicit_memset(desc->qcd_content_desc, 0,
   1974  1.1    hikaru 	    sizeof(desc->qcd_content_desc));
   1975  1.1    hikaru 	explicit_memset(desc->qcd_hash_state_prefix_buf, 0,
   1976  1.1    hikaru 	    sizeof(desc->qcd_hash_state_prefix_buf));
   1977  1.1    hikaru 	explicit_memset(desc->qcd_req_cache, 0,
   1978  1.1    hikaru 	    sizeof(desc->qcd_req_cache));
   1979  1.1    hikaru }
   1980  1.1    hikaru 
   1981  1.8  riastrad void
   1982  1.1    hikaru qat_crypto_free_session0(struct qat_crypto *qcy, struct qat_session *qs)
   1983  1.1    hikaru {
   1984  1.1    hikaru 
   1985  1.1    hikaru 	qat_crypto_clean_desc(&qs->qs_dec_desc);
   1986  1.1    hikaru 	qat_crypto_clean_desc(&qs->qs_enc_desc);
   1987  1.1    hikaru 	qs->qs_status &= ~QAT_SESSION_STATUS_ACTIVE;
   1988  1.1    hikaru 
   1989  1.1    hikaru 	mutex_spin_exit(&qs->qs_session_mtx);
   1990  1.1    hikaru 
   1991  1.1    hikaru 	mutex_spin_enter(&qcy->qcy_crypto_mtx);
   1992  1.1    hikaru 
   1993  1.1    hikaru 	qcy->qcy_session_free[qcy->qcy_session_free_count++] = qs;
   1994  1.1    hikaru 	QAT_EVCNT_INCR(&qcy->qcy_ev_free_sess);
   1995  1.1    hikaru 
   1996  1.1    hikaru 	mutex_spin_exit(&qcy->qcy_crypto_mtx);
   1997  1.1    hikaru }
   1998  1.1    hikaru 
   1999  1.1    hikaru void
   2000  1.1    hikaru qat_crypto_check_free_session(struct qat_crypto *qcy, struct qat_session *qs)
   2001  1.1    hikaru {
   2002  1.1    hikaru 
   2003  1.1    hikaru 	if ((qs->qs_status & QAT_SESSION_STATUS_FREEING) &&
   2004  1.1    hikaru 	    qs->qs_inflight == 0) {
   2005  1.1    hikaru 		qat_crypto_free_session0(qcy, qs);
   2006  1.1    hikaru 	} else {
   2007  1.1    hikaru 		mutex_spin_exit(&qs->qs_session_mtx);
   2008  1.1    hikaru 	}
   2009  1.1    hikaru }
   2010  1.1    hikaru 
   2011  1.8  riastrad void
   2012  1.1    hikaru qat_crypto_free_session(void *arg, uint64_t sid)
   2013  1.1    hikaru {
   2014  1.1    hikaru 	struct qat_crypto *qcy = arg;
   2015  1.1    hikaru 	struct qat_session *qs;
   2016  1.1    hikaru 
   2017  1.1    hikaru 	qs = qcy->qcy_sessions[CRYPTO_SESID2LID(sid)];
   2018  1.1    hikaru 
   2019  1.1    hikaru 	mutex_spin_enter(&qs->qs_session_mtx);
   2020  1.1    hikaru 
   2021  1.1    hikaru 	if (qs->qs_inflight > 0) {
   2022  1.1    hikaru 		qs->qs_status |= QAT_SESSION_STATUS_FREEING;
   2023  1.1    hikaru 		mutex_spin_exit(&qs->qs_session_mtx);
   2024  1.8  riastrad 		return;
   2025  1.1    hikaru 	}
   2026  1.1    hikaru 
   2027  1.8  riastrad 	qat_crypto_free_session0(qcy, qs);
   2028  1.1    hikaru }
   2029  1.1    hikaru 
   2030  1.1    hikaru int
   2031  1.1    hikaru qat_crypto_start(struct qat_softc *sc)
   2032  1.1    hikaru {
   2033  1.1    hikaru 	struct qat_crypto *qcy = &sc->sc_crypto;
   2034  1.1    hikaru 	int error, i;
   2035  1.1    hikaru 	static const int algs[] = {
   2036  1.1    hikaru 	    CRYPTO_DES_CBC, CRYPTO_3DES_CBC, CRYPTO_AES_CBC,
   2037  1.1    hikaru 	    CRYPTO_MD5_HMAC_96, CRYPTO_SHA1_HMAC_96, CRYPTO_SHA2_256_HMAC,
   2038  1.1    hikaru 	    CRYPTO_SHA2_384_HMAC, CRYPTO_SHA2_512_HMAC,
   2039  1.1    hikaru 	};
   2040  1.1    hikaru 
   2041  1.1    hikaru 	/* opencrypto */
   2042  1.1    hikaru 	qcy->qcy_cid = crypto_get_driverid(0);
   2043  1.1    hikaru 	if (qcy->qcy_cid < 0) {
   2044  1.1    hikaru 		aprint_error_dev(sc->sc_dev,
   2045  1.1    hikaru 		    "could not get opencrypto driver id\n");
   2046  1.1    hikaru 		return ENOENT;
   2047  1.1    hikaru 	}
   2048  1.1    hikaru 
   2049  1.1    hikaru 	for (i = 0; i < __arraycount(algs); i++) {
   2050  1.1    hikaru 		error = crypto_register(qcy->qcy_cid, algs[i], 0, 0,
   2051  1.1    hikaru 		    qat_crypto_new_session, qat_crypto_free_session,
   2052  1.1    hikaru 		    qat_crypto_process, qcy);
   2053  1.1    hikaru 		if (error) {
   2054  1.1    hikaru 			aprint_error_dev(sc->sc_dev,
   2055  1.1    hikaru 			    "could not register crypto: %d\n", error);
   2056  1.1    hikaru 			return error;
   2057  1.1    hikaru 		}
   2058  1.1    hikaru 	}
   2059  1.1    hikaru 
   2060  1.1    hikaru 	return 0;
   2061  1.1    hikaru }
   2062  1.1    hikaru 
   2063  1.1    hikaru int
   2064  1.1    hikaru qat_crypto_sym_rxintr(struct qat_softc *sc, void *arg, void *msg)
   2065  1.1    hikaru {
   2066  1.1    hikaru 	struct qat_crypto_bank *qcb = arg;
   2067  1.1    hikaru 	struct qat_crypto *qcy;
   2068  1.1    hikaru 	struct qat_session *qs;
   2069  1.1    hikaru 	struct qat_sym_cookie *qsc;
   2070  1.1    hikaru 	struct qat_sym_bulk_cookie *qsbc;
   2071  1.1    hikaru 	struct cryptop *crp;
   2072  1.1    hikaru 
   2073  1.1    hikaru 	qsc = *(void **)((uintptr_t)msg + sc->sc_hw.qhw_crypto_opaque_offset);
   2074  1.1    hikaru 
   2075  1.1    hikaru 	qsbc = &qsc->u.qsc_bulk_cookie;
   2076  1.1    hikaru 	qcy = qsbc->qsbc_crypto;
   2077  1.1    hikaru 	qs = qsbc->qsbc_session;
   2078  1.1    hikaru 	crp = qsbc->qsbc_cb_tag;
   2079  1.1    hikaru 
   2080  1.1    hikaru 	bus_dmamap_sync(sc->sc_dmat, qsc->qsc_buf_dmamap, 0,
   2081  1.1    hikaru 	    qsc->qsc_buf_dmamap->dm_mapsize,
   2082  1.1    hikaru 	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
   2083  1.1    hikaru 	bus_dmamap_unload(sc->sc_dmat, qsc->qsc_buf_dmamap);
   2084  1.1    hikaru 	qat_crypto_free_sym_cookie(qcb, qsc);
   2085  1.1    hikaru 
   2086  1.1    hikaru 	crp->crp_etype = 0;
   2087  1.1    hikaru 	crypto_done(crp);
   2088  1.1    hikaru 
   2089  1.1    hikaru 	mutex_spin_enter(&qs->qs_session_mtx);
   2090  1.1    hikaru 	KASSERT(qs->qs_status & QAT_SESSION_STATUS_ACTIVE);
   2091  1.1    hikaru 	qs->qs_inflight--;
   2092  1.1    hikaru 	qat_crypto_check_free_session(qcy, qs);
   2093  1.1    hikaru 
   2094  1.1    hikaru 	return 1;
   2095  1.1    hikaru }
   2096  1.1    hikaru 
   2097  1.1    hikaru #ifdef QAT_DUMP
   2098  1.1    hikaru 
   2099  1.1    hikaru void
   2100  1.1    hikaru qat_dump_raw(int flag, const char *label, void *d, size_t len)
   2101  1.1    hikaru {
   2102  1.1    hikaru 	uintptr_t pc;
   2103  1.1    hikaru 	size_t pos;
   2104  1.1    hikaru 	uint8_t *dp = (uint8_t *)d;
   2105  1.1    hikaru 
   2106  1.1    hikaru 	if ((qat_dump & flag) == 0)
   2107  1.1    hikaru 		return;
   2108  1.1    hikaru 
   2109  1.1    hikaru 	printf("dumping %s at %p len %zu\n", label, d, len);
   2110  1.1    hikaru 
   2111  1.3    hikaru 	pc = (uintptr_t)__builtin_return_address(0);
   2112  1.1    hikaru 	printf("\tcallpc ");
   2113  1.1    hikaru 	qat_print_sym(pc);
   2114  1.1    hikaru 	printf("\n");
   2115  1.1    hikaru 
   2116  1.1    hikaru 	for (pos = 0; pos < len; pos++) {
   2117  1.1    hikaru 		if (pos % 32 == 0)
   2118  1.1    hikaru 			printf("%8zx: ", pos);
   2119  1.1    hikaru 		else if (pos % 4 == 0)
   2120  1.1    hikaru 		        printf(" ");
   2121  1.1    hikaru 
   2122  1.1    hikaru 		printf("%02x", dp[pos]);
   2123  1.1    hikaru 
   2124  1.1    hikaru 		if (pos % 32 == 31 || pos + 1 == len)
   2125  1.1    hikaru 			printf("\n");
   2126  1.1    hikaru 	}
   2127  1.1    hikaru }
   2128  1.1    hikaru 
   2129  1.1    hikaru void
   2130  1.1    hikaru qat_dump_ring(int bank, int ring)
   2131  1.1    hikaru {
   2132  1.1    hikaru 	struct qat_softc *sc = gsc;
   2133  1.1    hikaru 	struct qat_bank *qb = &sc->sc_etr_banks[bank];
   2134  1.1    hikaru 	struct qat_ring *qr = &qb->qb_et_rings[ring];
   2135  1.1    hikaru 	u_int offset;
   2136  1.1    hikaru 	int i;
   2137  1.1    hikaru 	uint32_t msg;
   2138  1.1    hikaru 
   2139  1.1    hikaru 	printf("dumping bank %d ring %d\n", bank, ring);
   2140  1.1    hikaru 	printf("\tid %d name %s msg size %d ring size %d\n",
   2141  1.1    hikaru 	    qr->qr_ring_id, qr->qr_name,
   2142  1.1    hikaru 	    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   2143  1.1    hikaru 	    qr->qr_ring_size);
   2144  1.1    hikaru 	printf("\thost   head 0x%08x tail 0x%08x\n", qr->qr_head, qr->qr_tail);
   2145  1.1    hikaru 	printf("\ttarget head 0x%08x tail 0x%08x\n",
   2146  1.1    hikaru 	    qat_etr_bank_ring_read_4(sc, qr->qr_bank, qr->qr_ring,
   2147  1.1    hikaru 	        ETR_RING_HEAD_OFFSET),
   2148  1.1    hikaru 	    qat_etr_bank_ring_read_4(sc, qr->qr_bank, qr->qr_ring,
   2149  1.1    hikaru 	        ETR_RING_TAIL_OFFSET));
   2150  1.1    hikaru 
   2151  1.1    hikaru 	printf("\n");
   2152  1.1    hikaru 	i = 0;
   2153  1.1    hikaru 	offset = 0;
   2154  1.1    hikaru 	do {
   2155  1.1    hikaru 		if (i % 8 == 0)
   2156  1.1    hikaru 			printf("%8x:", offset);
   2157  1.1    hikaru 
   2158  1.1    hikaru 		if (offset == qr->qr_head) {
   2159  1.1    hikaru 			printf("*");
   2160  1.1    hikaru 		} else if (offset == qr->qr_tail) {
   2161  1.1    hikaru 			printf("v");
   2162  1.1    hikaru 		} else {
   2163  1.1    hikaru 			printf(" ");
   2164  1.1    hikaru 		}
   2165  1.1    hikaru 
   2166  1.1    hikaru 		msg = *(uint32_t *)((uintptr_t)qr->qr_ring_vaddr + offset);
   2167  1.1    hikaru 		printf("%08x", htobe32(msg));
   2168  1.1    hikaru 
   2169  1.1    hikaru 		if (i % 8 == 7)
   2170  1.1    hikaru 			printf("\n");
   2171  1.1    hikaru 
   2172  1.1    hikaru 		i++;
   2173  1.1    hikaru 		offset = qat_modulo(offset +
   2174  1.1    hikaru 		    QAT_MSG_SIZE_TO_BYTES(qr->qr_msg_size),
   2175  1.1    hikaru 		    QAT_RING_SIZE_MODULO(qr->qr_ring_size));
   2176  1.1    hikaru 	} while (offset != 0);
   2177  1.1    hikaru }
   2178  1.1    hikaru 
   2179  1.1    hikaru void
   2180  1.1    hikaru qat_dump_mbuf(struct mbuf *m0, int pre, int post)
   2181  1.1    hikaru {
   2182  1.1    hikaru 	struct mbuf *m;
   2183  1.1    hikaru 
   2184  1.1    hikaru 	for (m = m0; m != NULL; m = m->m_next) {
   2185  1.1    hikaru 		size_t pos, len;
   2186  1.1    hikaru 		uint8_t *buf_start, *data_start, *data_end, *buf_end;
   2187  1.1    hikaru 		uint8_t *start, *end, *dp;
   2188  1.1    hikaru 		bool skip_ind;
   2189  1.1    hikaru 		const char *ind;
   2190  1.1    hikaru 
   2191  1.1    hikaru 		printf("dumping mbuf %p len %d flags 0x%08x\n",
   2192  1.1    hikaru 		    m, m->m_len, m->m_flags);
   2193  1.1    hikaru 		if (m->m_len == 0)
   2194  1.1    hikaru 			continue;
   2195  1.1    hikaru 
   2196  1.1    hikaru 		data_start = (uint8_t *)m->m_data;
   2197  1.1    hikaru 		data_end = data_start + m->m_len;
   2198  1.1    hikaru 		switch (m->m_flags & (M_EXT|M_EXT_CLUSTER|M_EXT_PAGES)) {
   2199  1.1    hikaru 		case 0:
   2200  1.1    hikaru 			buf_start = (uint8_t *)M_BUFADDR(m);
   2201  1.1    hikaru 			buf_end = buf_start +
   2202  1.1    hikaru 			    ((m->m_flags & M_PKTHDR) ? MHLEN : MLEN);
   2203  1.1    hikaru 			break;
   2204  1.1    hikaru 		case M_EXT|M_EXT_CLUSTER:
   2205  1.1    hikaru 			buf_start = (uint8_t *)m->m_ext.ext_buf;
   2206  1.1    hikaru 			buf_end = buf_start +m->m_ext.ext_size;
   2207  1.1    hikaru 			break;
   2208  1.1    hikaru 		default:
   2209  1.1    hikaru 			/* XXX */
   2210  1.1    hikaru 			buf_start = data_start;
   2211  1.1    hikaru 			buf_end = data_end;
   2212  1.1    hikaru 			break;
   2213  1.1    hikaru 		}
   2214  1.1    hikaru 
   2215  1.1    hikaru 		start = data_start - pre;
   2216  1.1    hikaru 		if (start < buf_start)
   2217  1.1    hikaru 			start = buf_start;
   2218  1.1    hikaru 		end = data_end + post;
   2219  1.1    hikaru 		if (end > buf_end)
   2220  1.1    hikaru 			end = buf_end;
   2221  1.1    hikaru 
   2222  1.1    hikaru 		dp = start;
   2223  1.1    hikaru 		len = (size_t)(end - start);
   2224  1.1    hikaru 		skip_ind = false;
   2225  1.1    hikaru 		for (pos = 0; pos < len; pos++) {
   2226  1.1    hikaru 
   2227  1.1    hikaru 			if (skip_ind)
   2228  1.1    hikaru 				ind = "";
   2229  1.1    hikaru 			else if (&dp[pos] == data_start)
   2230  1.1    hikaru 				ind = "`";
   2231  1.1    hikaru 			else
   2232  1.1    hikaru 				ind = " ";
   2233  1.1    hikaru 
   2234  1.1    hikaru 			if (pos % 32 == 0)
   2235  1.1    hikaru 				printf("%8zx:%s", pos, ind);
   2236  1.1    hikaru 			else if (pos % 2 == 0)
   2237  1.1    hikaru 				printf("%s", ind);
   2238  1.1    hikaru 
   2239  1.1    hikaru 			printf("%02x", dp[pos]);
   2240  1.1    hikaru 
   2241  1.1    hikaru 			skip_ind = false;
   2242  1.1    hikaru 			if (&dp[pos + 1] == data_end) {
   2243  1.1    hikaru 				skip_ind = true;
   2244  1.1    hikaru 				printf("'");
   2245  1.1    hikaru 			}
   2246  1.1    hikaru 
   2247  1.1    hikaru 			if (pos % 32 == 31 || pos + 1 == len) {
   2248  1.1    hikaru 				printf("\n");
   2249  1.1    hikaru 				skip_ind = false;
   2250  1.1    hikaru 			}
   2251  1.1    hikaru 		}
   2252  1.1    hikaru 	}
   2253  1.1    hikaru }
   2254  1.1    hikaru 
   2255  1.1    hikaru #endif /* QAT_DUMP */
   2256  1.1    hikaru 
   2257  1.1    hikaru MODULE(MODULE_CLASS_DRIVER, qat, "pci,opencrypto");
   2258  1.1    hikaru 
   2259  1.1    hikaru #ifdef _MODULE
   2260  1.1    hikaru #include "ioconf.c"
   2261  1.1    hikaru #endif
   2262  1.1    hikaru 
   2263  1.1    hikaru int
   2264  1.1    hikaru qat_modcmd(modcmd_t cmd, void *data)
   2265  1.1    hikaru {
   2266  1.1    hikaru 	int error = 0;
   2267  1.1    hikaru 
   2268  1.1    hikaru 	switch (cmd) {
   2269  1.1    hikaru 	case MODULE_CMD_INIT:
   2270  1.1    hikaru #ifdef _MODULE
   2271  1.1    hikaru 		error = config_init_component(cfdriver_ioconf_qat,
   2272  1.1    hikaru 		    cfattach_ioconf_qat, cfdata_ioconf_qat);
   2273  1.1    hikaru #endif
   2274  1.1    hikaru 		return error;
   2275  1.1    hikaru 	case MODULE_CMD_FINI:
   2276  1.1    hikaru #ifdef _MODULE
   2277  1.1    hikaru 		error = config_fini_component(cfdriver_ioconf_qat,
   2278  1.1    hikaru 		    cfattach_ioconf_qat, cfdata_ioconf_qat);
   2279  1.1    hikaru #endif
   2280  1.1    hikaru 		return error;
   2281  1.1    hikaru 	default:
   2282  1.1    hikaru 		return ENOTTY;
   2283  1.1    hikaru 	}
   2284  1.1    hikaru }
   2285