1b356ddf0SMark Johnston /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3b356ddf0SMark Johnston * 4b356ddf0SMark Johnston * Copyright (c) 2020 Rubicon Communications, LLC (Netgate) 5b356ddf0SMark Johnston * 6b356ddf0SMark Johnston * Redistribution and use in source and binary forms, with or without 7b356ddf0SMark Johnston * modification, are permitted provided that the following conditions 8b356ddf0SMark Johnston * are met: 9b356ddf0SMark Johnston * 1. Redistributions of source code must retain the above copyright 10b356ddf0SMark Johnston * notice, this list of conditions and the following disclaimer. 11b356ddf0SMark Johnston * 2. Redistributions in binary form must reproduce the above copyright 12b356ddf0SMark Johnston * notice, this list of conditions and the following disclaimer in the 13b356ddf0SMark Johnston * documentation and/or other materials provided with the distribution. 14b356ddf0SMark Johnston * 15b356ddf0SMark Johnston * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16b356ddf0SMark Johnston * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17b356ddf0SMark Johnston * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18b356ddf0SMark Johnston * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19b356ddf0SMark Johnston * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20b356ddf0SMark Johnston * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21b356ddf0SMark Johnston * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22b356ddf0SMark Johnston * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23b356ddf0SMark Johnston * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24b356ddf0SMark Johnston * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25b356ddf0SMark Johnston */ 26b356ddf0SMark Johnston 27b356ddf0SMark Johnston #ifndef _SAFEXCEL_VAR_H_ 28b356ddf0SMark Johnston #define _SAFEXCEL_VAR_H_ 29b356ddf0SMark Johnston 300371c3faSMark Johnston #include <sys/counter.h> 310371c3faSMark Johnston 32b356ddf0SMark Johnston #define SAFEXCEL_MAX_RINGS 4 33b356ddf0SMark Johnston #define SAFEXCEL_MAX_BATCH_SIZE 64 34b356ddf0SMark Johnston #define SAFEXCEL_MAX_FRAGMENTS 64 35b356ddf0SMark Johnston #define SAFEXCEL_MAX_IV_LEN 16 36b356ddf0SMark Johnston #define SAFEXCEL_MAX_REQUEST_SIZE 65535 37b356ddf0SMark Johnston 38b356ddf0SMark Johnston #define SAFEXCEL_RING_SIZE 512 39b356ddf0SMark Johnston #define SAFEXCEL_MAX_ITOKENS 4 40b356ddf0SMark Johnston #define SAFEXCEL_MAX_ATOKENS 16 41b356ddf0SMark Johnston #define SAFEXCEL_FETCH_COUNT 1 42b356ddf0SMark Johnston #define SAFEXCEL_MAX_KEY_LEN 32 43b356ddf0SMark Johnston #define SAFEXCEL_MAX_RING_AIC 14 44b356ddf0SMark Johnston 45b356ddf0SMark Johnston /* 46b356ddf0SMark Johnston * Context Record format. 47b356ddf0SMark Johnston * 48b356ddf0SMark Johnston * In this driver the context control words are always set in the control data. 491a6ffed5SMark Johnston * This helps optimize fetching of the context record. This is configured by 501a6ffed5SMark Johnston * setting SAFEXCEL_OPTION_CTX_CTRL_IN_CMD. 51b356ddf0SMark Johnston */ 52b356ddf0SMark Johnston struct safexcel_context_record { 53b356ddf0SMark Johnston uint32_t control0; /* Unused. */ 54b356ddf0SMark Johnston uint32_t control1; /* Unused. */ 55b356ddf0SMark Johnston uint32_t data[40]; /* Key material. */ 56b356ddf0SMark Johnston } __packed; 57b356ddf0SMark Johnston 58b356ddf0SMark Johnston /* Processing Engine Control Data format. */ 59b356ddf0SMark Johnston struct safexcel_control_data { 60b356ddf0SMark Johnston uint32_t packet_length : 17; 61b356ddf0SMark Johnston uint32_t options : 13; 62b356ddf0SMark Johnston uint32_t type : 2; 63b356ddf0SMark Johnston 64b356ddf0SMark Johnston uint16_t application_id; 65b356ddf0SMark Johnston uint16_t rsvd; 66b356ddf0SMark Johnston 67b356ddf0SMark Johnston uint32_t context_lo; 68b356ddf0SMark Johnston uint32_t context_hi; 69b356ddf0SMark Johnston 70b356ddf0SMark Johnston uint32_t control0; 71b356ddf0SMark Johnston uint32_t control1; 72b356ddf0SMark Johnston 73b356ddf0SMark Johnston /* Inline instructions or IV. */ 74b356ddf0SMark Johnston uint32_t token[SAFEXCEL_MAX_ITOKENS]; 75b356ddf0SMark Johnston } __packed; 76b356ddf0SMark Johnston 77b356ddf0SMark Johnston /* 78b356ddf0SMark Johnston * Basic Command Descriptor. 79b356ddf0SMark Johnston * 80b356ddf0SMark Johnston * The Processing Engine and driver cooperate to maintain a set of command 81b356ddf0SMark Johnston * rings, representing outstanding crypto operation requests. Each descriptor 82b356ddf0SMark Johnston * corresponds to an input data segment, and thus a single crypto(9) request may 83b356ddf0SMark Johnston * span several contiguous command descriptors. 84b356ddf0SMark Johnston * 85b356ddf0SMark Johnston * The first command descriptor for a request stores the input token, which 86b356ddf0SMark Johnston * encodes data specific to the requested operation, such as the encryption 87b356ddf0SMark Johnston * mode. For some operations data is passed outside the descriptor, in a 88b356ddf0SMark Johnston * context record (e.g., encryption keys), or in an "additional token data" 89b356ddf0SMark Johnston * region (e.g., instructions). 90b356ddf0SMark Johnston */ 91b356ddf0SMark Johnston struct safexcel_cmd_descr { 92b356ddf0SMark Johnston uint32_t particle_size : 17; 93b356ddf0SMark Johnston uint32_t rsvd0 : 5; 94b356ddf0SMark Johnston uint32_t last_seg : 1; 95b356ddf0SMark Johnston uint32_t first_seg : 1; 96b356ddf0SMark Johnston uint32_t additional_cdata_size : 8; 97b356ddf0SMark Johnston uint32_t rsvd1; 98b356ddf0SMark Johnston 99b356ddf0SMark Johnston uint32_t data_lo; 100b356ddf0SMark Johnston uint32_t data_hi; 101b356ddf0SMark Johnston 102b356ddf0SMark Johnston uint32_t atok_lo; 103b356ddf0SMark Johnston uint32_t atok_hi; 104b356ddf0SMark Johnston 105b356ddf0SMark Johnston struct safexcel_control_data control_data; 106b356ddf0SMark Johnston } __packed; 107b356ddf0SMark Johnston 108b356ddf0SMark Johnston /* Context control word 0 fields. */ 109b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_NULL_OUT 0x0 110b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_NULL_IN 0x1 111b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_HASH_OUT 0x2 112b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_HASH_IN 0x3 113b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_CRYPTO_OUT 0x4 114b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_CRYPTO_IN 0x5 115b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_ENCRYPT_HASH_OUT 0x6 116b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_DECRYPT_HASH_IN 0x7 117b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_HASH_ENCRYPT_OUT 0xe 118b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_TYPE_HASH_DECRYPT_IN 0xf 119b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_RESTART_HASH (1 << 4) 120b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_NO_FINISH_HASH (1 << 5) 121b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_SIZE(n) (((n) & 0xff) << 8) 122b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_KEY_EN (1 << 16) 123b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_CRYPTO_ALG_AES128 (0x5 << 17) 124b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_CRYPTO_ALG_AES192 (0x6 << 17) 125b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_CRYPTO_ALG_AES256 (0x7 << 17) 126b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_DIGEST_PRECOMPUTED (0x1 << 21) 127b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_DIGEST_CCM (0x2 << 21) 128b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_DIGEST_GMAC (0x2 << 21) 129b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_DIGEST_HMAC (0x3 << 21) 130b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_SHA1 (0x2 << 23) 131b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_SHA224 (0x4 << 23) 132b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_SHA256 (0x3 << 23) 133b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_SHA384 (0x6 << 23) 134b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_SHA512 (0x5 << 23) 135b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_XCBC128 (0x1 << 23) 136b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_XCBC192 (0x2 << 23) 137b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_XCBC256 (0x3 << 23) 138b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_HASH_ALG_GHASH (0x4 << 23) 139b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_INV_FR (0x5 << 24) 140b356ddf0SMark Johnston #define SAFEXCEL_CONTROL0_INV_TR (0x6 << 24) 141b356ddf0SMark Johnston 142b356ddf0SMark Johnston /* Context control word 1 fields. */ 143b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_ECB 0x0 144b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_CBC 0x1 145b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_ICM 0x3 146b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_OFB 0x4 147b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_CFB128 0x5 148b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_CTR 0x6 149b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_XTS 0x7 150b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_CCM (0x6 | (1 << 17)) 151b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_CRYPTO_MODE_GCM (0x6 | (1 << 17)) 152b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_IV0 (1u << 5) 153b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_IV1 (1u << 6) 154b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_IV2 (1u << 7) 155b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_IV3 (1u << 8) 156b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_DIGEST_CNT (1u << 9) 157b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_COUNTER_MODE (1u << 10) 158b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_ENCRYPT_HASH_RES (1u << 17) 159b356ddf0SMark Johnston #define SAFEXCEL_CONTROL1_HASH_STORE (1u << 19) 160b356ddf0SMark Johnston 161b356ddf0SMark Johnston /* Control options. */ 162b356ddf0SMark Johnston #define SAFEXCEL_OPTION_IP (1u << 0) /* must be set */ 163b356ddf0SMark Johnston #define SAFEXCEL_OPTION_CP (1u << 1) /* 64-bit ctx addr */ 164b356ddf0SMark Johnston #define SAFEXCEL_OPTION_RC_AUTO (2u << 3) /* auto ctx reuse */ 165b356ddf0SMark Johnston #define SAFEXCEL_OPTION_CTX_CTRL_IN_CMD (1u << 8) /* ctx ctrl */ 166b356ddf0SMark Johnston #define SAFEXCEL_OPTION_4_TOKEN_IV_CMD 0xe00 /* IV in bypass */ 167b356ddf0SMark Johnston 168b356ddf0SMark Johnston struct safexcel_res_data { 169b356ddf0SMark Johnston uint32_t packet_length : 17; 170b356ddf0SMark Johnston uint32_t error_code : 15; 171b356ddf0SMark Johnston 172b356ddf0SMark Johnston uint32_t bypass_length : 4; 173b356ddf0SMark Johnston uint32_t e15 : 1; 174b356ddf0SMark Johnston uint32_t rsvd0 : 16; 175b356ddf0SMark Johnston uint32_t hash_bytes : 1; 176b356ddf0SMark Johnston uint32_t hash_length : 6; 177b356ddf0SMark Johnston uint32_t generic_bytes : 1; 178b356ddf0SMark Johnston uint32_t checksum : 1; 179b356ddf0SMark Johnston uint32_t next_header : 1; 180b356ddf0SMark Johnston uint32_t length : 1; 181b356ddf0SMark Johnston 182b356ddf0SMark Johnston uint16_t application_id; 183b356ddf0SMark Johnston uint16_t rsvd1; 184b356ddf0SMark Johnston 185b356ddf0SMark Johnston uint32_t rsvd2; 186b356ddf0SMark Johnston }; 187b356ddf0SMark Johnston 188b356ddf0SMark Johnston /* Basic Result Descriptor format */ 189b356ddf0SMark Johnston struct safexcel_res_descr { 190b356ddf0SMark Johnston uint32_t particle_size : 17; 191b356ddf0SMark Johnston uint32_t rsvd0 : 3; 192b356ddf0SMark Johnston uint32_t descriptor_overflow : 1; 193b356ddf0SMark Johnston uint32_t buffer_overflow : 1; 194b356ddf0SMark Johnston uint32_t last_seg : 1; 195b356ddf0SMark Johnston uint32_t first_seg : 1; 196b356ddf0SMark Johnston uint32_t result_size : 8; 197b356ddf0SMark Johnston 198b356ddf0SMark Johnston uint32_t rsvd1; 199b356ddf0SMark Johnston 200b356ddf0SMark Johnston uint32_t data_lo; 201b356ddf0SMark Johnston uint32_t data_hi; 202b356ddf0SMark Johnston 203b356ddf0SMark Johnston struct safexcel_res_data result_data; 204b356ddf0SMark Johnston } __packed; 205b356ddf0SMark Johnston 206b356ddf0SMark Johnston /* Result data error codes. */ 207b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_PACKET_LEN (1u << 0) 208b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_TOKEN_ERROR (1u << 1) 209b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_BYPASS (1u << 2) 210b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_CRYPTO_BLOCK_SIZE (1u << 3) 211b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_HASH_BLOCK_SIZE (1u << 4) 212b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_INVALID_CMD (1u << 5) 213b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_PROHIBITED_ALGO (1u << 6) 214b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_HASH_INPUT_OVERFLOW (1u << 7) 215b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_TTL_UNDERFLOW (1u << 8) 216b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_AUTH_FAILED (1u << 9) 217b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_SEQNO_CHECK_FAILED (1u << 10) 218b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_SPI_CHECK (1u << 11) 219b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_CHECKSUM (1u << 12) 220b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_PAD_VERIFICATION (1u << 13) 221b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_TIMEOUT (1u << 14) 222b356ddf0SMark Johnston #define SAFEXCEL_RESULT_ERR_OUTPUT_DMA (1u << 15) 223b356ddf0SMark Johnston 224b356ddf0SMark Johnston /* 225b356ddf0SMark Johnston * The EIP-96 (crypto transform engine) is programmed using a set of 226b356ddf0SMark Johnston * data processing instructions with the encodings defined below. 227b356ddf0SMark Johnston */ 228b356ddf0SMark Johnston struct safexcel_instr { 229b356ddf0SMark Johnston uint32_t length : 17; /* bytes to be processed */ 230b356ddf0SMark Johnston uint32_t status : 2; /* stream status */ 231b356ddf0SMark Johnston uint32_t instructions : 9; 232b356ddf0SMark Johnston uint32_t opcode : 4; 233b356ddf0SMark Johnston } __packed; 234b356ddf0SMark Johnston 235b356ddf0SMark Johnston /* Type 1, operational data instructions. */ 236b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_DIRECTION 0x0 237b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_PRE_CHECKSUM 0x1 238b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_INSERT 0x2 239b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_INSERT_CTX 0x9 240b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_REPLACE 0x3 241b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_RETRIEVE 0x4 242b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_MUTE 0x5 243b356ddf0SMark Johnston /* Type 2, IP header instructions. */ 244b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_IPV4 0x7 245b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_IPV4_CHECKSUM 0x6 246b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_IPV6 0x8 247b356ddf0SMark Johnston /* Type 3, postprocessing instructions. */ 248b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_INSERT_REMOVE_RESULT 0xa 249b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_REPLACE_BYTE 0xb 250b356ddf0SMark Johnston /* Type 4, result instructions. */ 251b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_VERIFY_FIELDS 0xd 252b356ddf0SMark Johnston /* Type 5, context control instructions. */ 253b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_CONTEXT_ACCESS 0xe 254b356ddf0SMark Johnston /* Type 6, context control instructions. */ 255b356ddf0SMark Johnston #define SAFEXCEL_INSTR_OPCODE_BYPASS_TOKEN_DATA 0xf 256b356ddf0SMark Johnston 257b356ddf0SMark Johnston /* Status bits for type 1 and 2 instructions. */ 258b356ddf0SMark Johnston #define SAFEXCEL_INSTR_STATUS_LAST_HASH (1u << 0) 259b356ddf0SMark Johnston #define SAFEXCEL_INSTR_STATUS_LAST_PACKET (1u << 1) 260b356ddf0SMark Johnston /* Status bits for type 3 instructions. */ 261b356ddf0SMark Johnston #define SAFEXCEL_INSTR_STATUS_NO_CKSUM_MOD (1u << 0) 262b356ddf0SMark Johnston 263b356ddf0SMark Johnston /* Instruction-dependent flags. */ 264b356ddf0SMark Johnston #define SAFEXCEL_INSTR_INSERT_HASH_DIGEST 0x1c 265b356ddf0SMark Johnston #define SAFEXCEL_INSTR_INSERT_IMMEDIATE 0x1b 266b356ddf0SMark Johnston #define SAFEXCEL_INSTR_DEST_OUTPUT (1u << 5) 267b356ddf0SMark Johnston #define SAFEXCEL_INSTR_DEST_HASH (1u << 6) 268b356ddf0SMark Johnston #define SAFEXCEL_INSTR_DEST_CRYPTO (1u << 7) 269b356ddf0SMark Johnston #define SAFEXCEL_INSTR_INS_LAST (1u << 8) 270b356ddf0SMark Johnston 271b356ddf0SMark Johnston #define SAFEXCEL_INSTR_VERIFY_HASH (1u << 16) 272b356ddf0SMark Johnston #define SAFEXCEL_INSTR_VERIFY_PADDING (1u << 5) 273b356ddf0SMark Johnston 274b356ddf0SMark Johnston #define SAFEXCEL_TOKEN_TYPE_BYPASS 0x0 275b356ddf0SMark Johnston #define SAFEXCEL_TOKEN_TYPE_AUTONOMOUS 0x3 276b356ddf0SMark Johnston 277b356ddf0SMark Johnston #define SAFEXCEL_CONTEXT_SMALL 0x2 278b356ddf0SMark Johnston #define SAFEXCEL_CONTEXT_LARGE 0x3 279b356ddf0SMark Johnston 280b356ddf0SMark Johnston struct safexcel_reg_offsets { 281b356ddf0SMark Johnston uint32_t hia_aic; 282b356ddf0SMark Johnston uint32_t hia_aic_g; 283b356ddf0SMark Johnston uint32_t hia_aic_r; 284b356ddf0SMark Johnston uint32_t hia_aic_xdr; 285b356ddf0SMark Johnston uint32_t hia_dfe; 286b356ddf0SMark Johnston uint32_t hia_dfe_thr; 287b356ddf0SMark Johnston uint32_t hia_dse; 288b356ddf0SMark Johnston uint32_t hia_dse_thr; 289b356ddf0SMark Johnston uint32_t hia_gen_cfg; 290b356ddf0SMark Johnston uint32_t pe; 291b356ddf0SMark Johnston }; 292b356ddf0SMark Johnston 293b356ddf0SMark Johnston struct safexcel_config { 294b356ddf0SMark Johnston uint32_t hdw; /* Host interface Data Width. */ 295b356ddf0SMark Johnston uint32_t aic_rings; /* Number of AIC rings. */ 296b356ddf0SMark Johnston uint32_t pes; /* Number of PEs. */ 297b356ddf0SMark Johnston uint32_t rings; /* Number of rings. */ 298b356ddf0SMark Johnston 299b356ddf0SMark Johnston uint32_t cd_size; /* CDR descriptor size. */ 300b356ddf0SMark Johnston uint32_t cd_offset; /* CDR offset (size + alignment). */ 301b356ddf0SMark Johnston 302b356ddf0SMark Johnston uint32_t rd_size; /* RDR descriptor size. */ 303b356ddf0SMark Johnston uint32_t rd_offset; /* RDR offset. */ 304b356ddf0SMark Johnston 305b356ddf0SMark Johnston uint32_t atok_offset; /* Additional token offset. */ 306b356ddf0SMark Johnston 307b356ddf0SMark Johnston uint32_t caps; /* Device capabilities. */ 308b356ddf0SMark Johnston }; 309b356ddf0SMark Johnston 310b356ddf0SMark Johnston #define SAFEXCEL_DPRINTF(sc, lvl, ...) do { \ 311b356ddf0SMark Johnston if ((sc)->sc_debug >= (lvl)) \ 312b356ddf0SMark Johnston device_printf((sc)->sc_dev, __VA_ARGS__); \ 313b356ddf0SMark Johnston } while (0) 314b356ddf0SMark Johnston 315b356ddf0SMark Johnston struct safexcel_dma_mem { 316b356ddf0SMark Johnston caddr_t vaddr; 317b356ddf0SMark Johnston bus_addr_t paddr; 318b356ddf0SMark Johnston bus_dma_tag_t tag; 319b356ddf0SMark Johnston bus_dmamap_t map; 320b356ddf0SMark Johnston }; 321b356ddf0SMark Johnston 322b356ddf0SMark Johnston struct safexcel_cmd_descr_ring { 323b356ddf0SMark Johnston struct safexcel_dma_mem dma; 324b356ddf0SMark Johnston struct safexcel_cmd_descr *desc; 325b356ddf0SMark Johnston int write; 326b356ddf0SMark Johnston int read; 327b356ddf0SMark Johnston }; 328b356ddf0SMark Johnston 329b356ddf0SMark Johnston struct safexcel_res_descr_ring { 330b356ddf0SMark Johnston struct safexcel_dma_mem dma; 331b356ddf0SMark Johnston struct safexcel_res_descr *desc; 332b356ddf0SMark Johnston int write; 333b356ddf0SMark Johnston int read; 334b356ddf0SMark Johnston }; 335b356ddf0SMark Johnston 3365bdb8b27SMark Johnston struct safexcel_context_template { 3375bdb8b27SMark Johnston struct safexcel_context_record ctx; 3385bdb8b27SMark Johnston int len; 3395bdb8b27SMark Johnston }; 3405bdb8b27SMark Johnston 341b356ddf0SMark Johnston struct safexcel_session { 3425bdb8b27SMark Johnston crypto_session_t cses; 343b356ddf0SMark Johnston uint32_t alg; /* cipher algorithm */ 344b356ddf0SMark Johnston uint32_t digest; /* digest type */ 345b356ddf0SMark Johnston uint32_t hash; /* hash algorithm */ 346b356ddf0SMark Johnston uint32_t mode; /* cipher mode of operation */ 347b356ddf0SMark Johnston unsigned int digestlen; /* digest length */ 348b356ddf0SMark Johnston unsigned int statelen; /* HMAC hash state length */ 3495bdb8b27SMark Johnston 3505bdb8b27SMark Johnston struct safexcel_context_template encctx, decctx; 351b356ddf0SMark Johnston }; 352b356ddf0SMark Johnston 353b356ddf0SMark Johnston struct safexcel_softc; 354b356ddf0SMark Johnston 355b356ddf0SMark Johnston struct safexcel_request { 356b356ddf0SMark Johnston STAILQ_ENTRY(safexcel_request) link; 357b356ddf0SMark Johnston bool dmap_loaded; 358e934d455SMark Johnston int ringidx; 359b356ddf0SMark Johnston bus_dmamap_t dmap; 360b356ddf0SMark Johnston int error; 361b356ddf0SMark Johnston int cdescs, rdescs; 362b356ddf0SMark Johnston uint8_t iv[SAFEXCEL_MAX_IV_LEN]; 363b356ddf0SMark Johnston struct safexcel_cmd_descr *cdesc; 364b356ddf0SMark Johnston struct safexcel_dma_mem ctx; 365b356ddf0SMark Johnston struct safexcel_session *sess; 366b356ddf0SMark Johnston struct cryptop *crp; 367b356ddf0SMark Johnston struct safexcel_softc *sc; 368b356ddf0SMark Johnston }; 369b356ddf0SMark Johnston 370b356ddf0SMark Johnston struct safexcel_ring { 371b356ddf0SMark Johnston struct mtx mtx; 372b356ddf0SMark Johnston struct sglist *cmd_data; 373b356ddf0SMark Johnston struct safexcel_cmd_descr_ring cdr; 374b356ddf0SMark Johnston struct sglist *res_data; 375b356ddf0SMark Johnston struct safexcel_res_descr_ring rdr; 376b356ddf0SMark Johnston 3771a6ffed5SMark Johnston /* Shadows the command descriptor ring. */ 3781a6ffed5SMark Johnston struct safexcel_request requests[SAFEXCEL_RING_SIZE]; 379092cf8d6SMark Johnston 3801a6ffed5SMark Johnston /* Count of requests pending submission. */ 3811a6ffed5SMark Johnston int pending; 3821a6ffed5SMark Johnston int pending_cdesc, pending_rdesc; 3831a6ffed5SMark Johnston 3841a6ffed5SMark Johnston /* Count of outstanding requests. */ 3851a6ffed5SMark Johnston int queued; 3861a6ffed5SMark Johnston 3871a6ffed5SMark Johnston /* Requests were deferred due to a resource shortage. */ 3881a6ffed5SMark Johnston int blocked; 389b356ddf0SMark Johnston 390b356ddf0SMark Johnston struct safexcel_dma_mem dma_atok; 391b356ddf0SMark Johnston bus_dma_tag_t data_dtag; 3928ba6acbbSMark Johnston 3938ba6acbbSMark Johnston char lockname[32]; 394b356ddf0SMark Johnston }; 395b356ddf0SMark Johnston 396b356ddf0SMark Johnston struct safexcel_intr_handle { 397b356ddf0SMark Johnston struct safexcel_softc *sc; 398b356ddf0SMark Johnston void *handle; 399b356ddf0SMark Johnston int ring; 400b356ddf0SMark Johnston }; 401b356ddf0SMark Johnston 402b356ddf0SMark Johnston struct safexcel_softc { 403b356ddf0SMark Johnston device_t sc_dev; 404b356ddf0SMark Johnston uint32_t sc_type; /* EIP-97 or 197 */ 405b356ddf0SMark Johnston int sc_debug; 406b356ddf0SMark Johnston 407b356ddf0SMark Johnston struct resource *sc_res; 408b356ddf0SMark Johnston struct resource *sc_intr[SAFEXCEL_MAX_RINGS]; 409b356ddf0SMark Johnston struct safexcel_intr_handle sc_ih[SAFEXCEL_MAX_RINGS]; 410b356ddf0SMark Johnston 4110371c3faSMark Johnston counter_u64_t sc_req_alloc_failures; 4120371c3faSMark Johnston counter_u64_t sc_cdesc_alloc_failures; 4130371c3faSMark Johnston counter_u64_t sc_rdesc_alloc_failures; 4140371c3faSMark Johnston 415b356ddf0SMark Johnston struct safexcel_ring sc_ring[SAFEXCEL_MAX_RINGS]; 416b356ddf0SMark Johnston 417b356ddf0SMark Johnston int32_t sc_cid; 418b356ddf0SMark Johnston struct safexcel_reg_offsets sc_offsets; 419b356ddf0SMark Johnston struct safexcel_config sc_config; 420b356ddf0SMark Johnston }; 421b356ddf0SMark Johnston 422b356ddf0SMark Johnston #define SAFEXCEL_WRITE(sc, off, val) bus_write_4((sc)->sc_res, (off), (val)) 423b356ddf0SMark Johnston #define SAFEXCEL_READ(sc, off) bus_read_4((sc)->sc_res, (off)) 424b356ddf0SMark Johnston 425b356ddf0SMark Johnston #define SAFEXCEL_ADDR_LO(addr) ((uint64_t)(addr) & 0xffffffffu) 426b356ddf0SMark Johnston #define SAFEXCEL_ADDR_HI(addr) (((uint64_t)(addr) >> 32) & 0xffffffffu) 427b356ddf0SMark Johnston 428b356ddf0SMark Johnston #endif /* _SAFEXCEL_VAR_H_ */ 429