Home | History | Annotate | Line # | Download | only in marvell
      1  1.4    andvar /*	$NetBSD: mvxpsecvar.h,v 1.4 2024/06/02 13:28:45 andvar Exp $	*/
      2  1.1  hsuenaga /*
      3  1.1  hsuenaga  * Copyright (c) 2015 Internet Initiative Japan Inc.
      4  1.1  hsuenaga  * All rights reserved.
      5  1.1  hsuenaga  *
      6  1.1  hsuenaga  * Redistribution and use in source and binary forms, with or without
      7  1.1  hsuenaga  * modification, are permitted provided that the following conditions
      8  1.1  hsuenaga  * are met:
      9  1.1  hsuenaga  * 1. Redistributions of source code must retain the above copyright
     10  1.1  hsuenaga  *    notice, this list of conditions and the following disclaimer.
     11  1.1  hsuenaga  * 2. Redistributions in binary form must reproduce the above copyright
     12  1.1  hsuenaga  *    notice, this list of conditions and the following disclaimer in the
     13  1.1  hsuenaga  *    documentation and/or other materials provided with the distribution.
     14  1.1  hsuenaga  *
     15  1.1  hsuenaga  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     16  1.1  hsuenaga  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17  1.1  hsuenaga  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18  1.1  hsuenaga  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     19  1.1  hsuenaga  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     20  1.1  hsuenaga  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21  1.1  hsuenaga  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22  1.1  hsuenaga  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     23  1.1  hsuenaga  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     24  1.1  hsuenaga  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     25  1.1  hsuenaga  * POSSIBILITY OF SUCH DAMAGE.
     26  1.1  hsuenaga  */
     27  1.1  hsuenaga 
     28  1.1  hsuenaga /*
     29  1.1  hsuenaga  * Cryptographic Engine and Security Accelerator(CESA)
     30  1.1  hsuenaga  */
     31  1.1  hsuenaga #ifndef __MVXPSECVAR_H__
     32  1.1  hsuenaga #define __MVXPSECVAR_H__
     33  1.1  hsuenaga #include <sys/device.h>
     34  1.1  hsuenaga #include <dev/marvell/mvxpsecreg.h>
     35  1.1  hsuenaga 
     36  1.1  hsuenaga /*
     37  1.1  hsuenaga  * Compile time options
     38  1.1  hsuenaga  */
     39  1.1  hsuenaga /* use multi-packet chained mode */
     40  1.1  hsuenaga #define MVXPSEC_MULTI_PACKET
     41  1.1  hsuenaga #define MVXPSEC_EVENT_COUNTERS
     42  1.1  hsuenaga 
     43  1.1  hsuenaga /*
     44  1.1  hsuenaga  * Memory management
     45  1.1  hsuenaga  */
     46  1.1  hsuenaga struct mvxpsec_devmem {
     47  1.1  hsuenaga 	bus_dmamap_t map;
     48  1.1  hsuenaga 	void *kva;
     49  1.1  hsuenaga 	int size;
     50  1.1  hsuenaga };
     51  1.1  hsuenaga #define dm_paddr dm_segs[0].ds_addr
     52  1.1  hsuenaga #define devmem_va(x) ((x)->kva)
     53  1.1  hsuenaga #define devmem_nseg(x) ((x)->map->dm_nsegs)
     54  1.1  hsuenaga #define devmem_pa(x, s) ((x)->map->dm_segs[(s)].ds_addr)
     55  1.1  hsuenaga #define devmem_palen(x, s) ((x)->map->dm_segs[(s)].ds_len)
     56  1.1  hsuenaga #define devmem_size(x) ((x)->size)
     57  1.1  hsuenaga #define devmem_map(x) ((x)->map)
     58  1.1  hsuenaga 
     59  1.1  hsuenaga /*
     60  1.1  hsuenaga  * DMA Descriptors
     61  1.1  hsuenaga  */
     62  1.1  hsuenaga struct mvxpsec_descriptor {
     63  1.1  hsuenaga 	uint32_t tdma_word0;
     64  1.1  hsuenaga 	uint32_t tdma_src;
     65  1.1  hsuenaga 	uint32_t tdma_dst;
     66  1.1  hsuenaga 	uint32_t tdma_nxt;
     67  1.1  hsuenaga } __attribute__((__packed__));
     68  1.1  hsuenaga 
     69  1.1  hsuenaga struct mvxpsec_descriptor_handle {
     70  1.1  hsuenaga 	bus_dmamap_t map;
     71  1.1  hsuenaga 	paddr_t phys_addr;
     72  1.1  hsuenaga 	int off;
     73  1.1  hsuenaga 
     74  1.1  hsuenaga 	void *_desc;
     75  1.1  hsuenaga 
     76  1.1  hsuenaga 	SIMPLEQ_ENTRY(mvxpsec_descriptor_handle) chain;
     77  1.1  hsuenaga };
     78  1.1  hsuenaga SIMPLEQ_HEAD(mvxpsec_descriptor_list, mvxpsec_descriptor_handle);
     79  1.1  hsuenaga 
     80  1.1  hsuenaga struct mvxpsec_descriptor_ring {
     81  1.1  hsuenaga 	struct mvxpsec_descriptor_handle *dma_head;
     82  1.1  hsuenaga 	struct mvxpsec_descriptor_handle *dma_last;
     83  1.1  hsuenaga 	int				dma_size;
     84  1.1  hsuenaga };
     85  1.1  hsuenaga 
     86  1.1  hsuenaga #define MVXPSEC_SYNC_DESC(sc, x, f) \
     87  1.1  hsuenaga     do { \
     88  1.1  hsuenaga 	bus_dmamap_sync((sc)->sc_dmat, (x)->map, \
     89  1.1  hsuenaga             (x)->off, sizeof(struct mvxpsec_descriptor), (f)); \
     90  1.1  hsuenaga     } while (0);
     91  1.1  hsuenaga 
     92  1.1  hsuenaga typedef struct mvxpsec_descriptor_ring mvxpsec_dma_ring;
     93  1.1  hsuenaga 
     94  1.1  hsuenaga #define MV_TDMA_DEFAULT_CONTROL \
     95  1.1  hsuenaga 	( MV_TDMA_CONTROL_DST_BURST_32 | \
     96  1.1  hsuenaga 	  MV_TDMA_CONTROL_SRC_BURST_32 | \
     97  1.1  hsuenaga 	  MV_TDMA_CONTROL_OUTS_EN | \
     98  1.1  hsuenaga 	  MV_TDMA_CONTROL_OUTS_MODE_4OUTS | \
     99  1.1  hsuenaga 	  MV_TDMA_CONTROL_BSWAP_DIS )
    100  1.1  hsuenaga 
    101  1.1  hsuenaga /*
    102  1.1  hsuenaga  * Security Accelerator Descriptors
    103  1.1  hsuenaga  */
    104  1.1  hsuenaga struct mvxpsec_acc_descriptor {
    105  1.1  hsuenaga 	uint32_t acc_config;
    106  1.1  hsuenaga 	uint32_t acc_encdata;
    107  1.1  hsuenaga 	uint32_t acc_enclen;
    108  1.1  hsuenaga 	uint32_t acc_enckey;
    109  1.1  hsuenaga 	uint32_t acc_enciv;
    110  1.1  hsuenaga 	uint32_t acc_macsrc;
    111  1.1  hsuenaga 	uint32_t acc_macdst;
    112  1.1  hsuenaga 	uint32_t acc_maciv;
    113  1.1  hsuenaga #define acc_desc_dword0 acc_config
    114  1.1  hsuenaga #define acc_desc_dword1 acc_encdata
    115  1.1  hsuenaga #define acc_desc_dword2 acc_enclen
    116  1.1  hsuenaga #define acc_desc_dword3 acc_enckey
    117  1.1  hsuenaga #define acc_desc_dword4 acc_enciv
    118  1.1  hsuenaga #define acc_desc_dword5 acc_macsrc
    119  1.1  hsuenaga #define acc_desc_dword6 acc_macdst
    120  1.1  hsuenaga #define acc_desc_dword7 acc_maciv
    121  1.1  hsuenaga } __attribute__((aligned(4)));
    122  1.1  hsuenaga 
    123  1.1  hsuenaga struct mvxpsec_crp_key {
    124  1.1  hsuenaga 	uint32_t crp_key32[8];
    125  1.1  hsuenaga } __attribute__((aligned(4)));
    126  1.1  hsuenaga 
    127  1.1  hsuenaga struct mvxpsec_crp_iv {
    128  1.1  hsuenaga 	uint32_t crp_iv32[4];
    129  1.1  hsuenaga } __attribute__((aligned(4)));
    130  1.1  hsuenaga 
    131  1.1  hsuenaga struct mvxpsec_mac_iv {
    132  1.1  hsuenaga 	uint32_t mac_iv32[5];
    133  1.1  hsuenaga 	uint32_t mac_ivpad[1]; /* bit[2:0] = 0 */
    134  1.1  hsuenaga } __attribute__((aligned(8)));
    135  1.1  hsuenaga 
    136  1.1  hsuenaga /* many pointer in the desc has a limitation of bit[2:0] = 0. */
    137  1.1  hsuenaga struct mvxpsec_packet_header {
    138  1.1  hsuenaga 	struct mvxpsec_acc_descriptor	desc;		/* 32 oct. */
    139  1.1  hsuenaga 	struct mvxpsec_crp_iv		crp_iv_work;	/* 16 oct. */
    140  1.1  hsuenaga 	struct mvxpsec_crp_iv		crp_iv_ext;	/* 16 oct. */
    141  1.1  hsuenaga } __attribute__((aligned(4))); /* 64 oct. */
    142  1.1  hsuenaga 
    143  1.1  hsuenaga struct mvxpsec_session_header {
    144  1.1  hsuenaga 	struct mvxpsec_crp_key		crp_key;	/* 32 oct. */
    145  1.1  hsuenaga 	struct mvxpsec_crp_key		crp_key_d;	/* 32 oct. */
    146  1.1  hsuenaga 	struct mvxpsec_mac_iv		miv_in;		/* 24 oct. */
    147  1.1  hsuenaga 	struct mvxpsec_mac_iv		miv_out;	/* 24 oct. */
    148  1.1  hsuenaga 	uint8_t				pad[16];	/* 16 oct. */
    149  1.1  hsuenaga } __attribute__((aligned(4))); /* 128 oct. */
    150  1.1  hsuenaga 
    151  1.1  hsuenaga /*
    152  1.1  hsuenaga  * Usage of CESA internal SRAM
    153  1.1  hsuenaga  *
    154  1.1  hsuenaga  * +---------------+ MVXPSEC_SRAM_PKT_HDR_OFF(0)
    155  1.1  hsuenaga  * |Packet Header  |   contains per packet information (IV, ACC descriptor)
    156  1.1  hsuenaga  * |               |
    157  1.1  hsuenaga  * |               |
    158  1.1  hsuenaga  * +---------------+ MVXPSEC_SRAM_SESS_HDR_OFF
    159  1.1  hsuenaga  * |Session Header |   contains per session information (Key, HMAC-iPad/oPad)
    160  1.2   msaitoh  * |               |   may not DMA transferred if session is not changed.
    161  1.1  hsuenaga  * |               |
    162  1.1  hsuenaga  * +---------------+ MVXPSEC_SRAM_PAYLOAD_OFF
    163  1.1  hsuenaga  * |Payload        |
    164  1.1  hsuenaga  * |               |
    165  1.1  hsuenaga  * .               .
    166  1.1  hsuenaga  * .               .
    167  1.1  hsuenaga  * .               .
    168  1.1  hsuenaga  * |               |
    169  1.1  hsuenaga  * +---------------+ MV_ACC_SRAM_SIZE(2048)
    170  1.1  hsuenaga  *
    171  1.2   msaitoh  * The input data is transferred to SRAM from system DRAM using TDMA,
    172  1.1  hsuenaga  * and ACC is working on the SRAM. When ACC finished the work,
    173  1.1  hsuenaga  * TDMA returns the payload of SRAM to system DRAM.
    174  1.1  hsuenaga  *
    175  1.1  hsuenaga  * CPU can also access the SRAM via Mbus interface directly. This driver
    176  1.1  hsuenaga  * access the SRAM only for debugging.
    177  1.1  hsuenaga  *
    178  1.1  hsuenaga  */
    179  1.1  hsuenaga #define SRAM_PAYLOAD_SIZE \
    180  1.1  hsuenaga     (MV_ACC_SRAM_SIZE \
    181  1.1  hsuenaga      - sizeof(struct mvxpsec_packet_header) \
    182  1.1  hsuenaga      - sizeof(struct mvxpsec_session_header))
    183  1.1  hsuenaga struct mvxpsec_crypt_sram {
    184  1.1  hsuenaga 	struct mvxpsec_packet_header	packet_header;	/* 64 oct. */
    185  1.1  hsuenaga 	struct mvxpsec_session_header	session_header; /* 128 oct. */
    186  1.1  hsuenaga 	uint8_t				payload[SRAM_PAYLOAD_SIZE];
    187  1.1  hsuenaga } __attribute__((aligned(8))); /* Max. 2048 oct. */
    188  1.1  hsuenaga #define MVXPSEC_SRAM_PKT_HDR_OFF \
    189  1.1  hsuenaga     (offsetof(struct mvxpsec_crypt_sram, packet_header))
    190  1.1  hsuenaga #define MVXPSEC_SRAM_DESC_OFF (MVXPSEC_SRAM_PKT_HDR_OFF + \
    191  1.1  hsuenaga     offsetof(struct mvxpsec_packet_header, desc))
    192  1.1  hsuenaga #define MVXPSEC_SRAM_IV_WORK_OFF (MVXPSEC_SRAM_PKT_HDR_OFF + \
    193  1.1  hsuenaga     offsetof(struct mvxpsec_packet_header, crp_iv_work))
    194  1.1  hsuenaga #define MVXPSEC_SRAM_IV_EXT_OFF (MVXPSEC_SRAM_PKT_HDR_OFF + \
    195  1.1  hsuenaga     offsetof(struct mvxpsec_packet_header, crp_iv_ext))
    196  1.1  hsuenaga 
    197  1.1  hsuenaga #define MVXPSEC_SRAM_SESS_HDR_OFF \
    198  1.1  hsuenaga     (offsetof(struct mvxpsec_crypt_sram, session_header))
    199  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_OFF (MVXPSEC_SRAM_SESS_HDR_OFF + \
    200  1.1  hsuenaga     offsetof(struct mvxpsec_session_header, crp_key))
    201  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_D_OFF (MVXPSEC_SRAM_SESS_HDR_OFF + \
    202  1.1  hsuenaga     offsetof(struct mvxpsec_session_header, crp_key_d))
    203  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_IN_OFF (MVXPSEC_SRAM_SESS_HDR_OFF + \
    204  1.1  hsuenaga     offsetof(struct mvxpsec_session_header, miv_in))
    205  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_OUT_OFF (MVXPSEC_SRAM_SESS_HDR_OFF + \
    206  1.1  hsuenaga     offsetof(struct mvxpsec_session_header, miv_out))
    207  1.1  hsuenaga 
    208  1.1  hsuenaga #define MVXPSEC_SRAM_PAYLOAD_OFF \
    209  1.1  hsuenaga     (offsetof(struct mvxpsec_crypt_sram, payload))
    210  1.1  hsuenaga 
    211  1.1  hsuenaga /* CESA device address (CESA internal SRAM address space) */
    212  1.1  hsuenaga #define MVXPSEC_SRAM_DESC_DA		MVXPSEC_SRAM_DESC_OFF
    213  1.1  hsuenaga #define MVXPSEC_SRAM_IV_WORK_DA		MVXPSEC_SRAM_IV_WORK_OFF
    214  1.1  hsuenaga #define MVXPSEC_SRAM_IV_EXT_DA		MVXPSEC_SRAM_IV_EXT_OFF
    215  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_DA		MVXPSEC_SRAM_KEY_OFF
    216  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_D_DA		MVXPSEC_SRAM_KEY_D_OFF
    217  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_IN_DA		MVXPSEC_SRAM_MIV_IN_OFF
    218  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_OUT_DA		MVXPSEC_SRAM_MIV_OUT_OFF
    219  1.1  hsuenaga #define MVXPSEC_SRAM_PAYLOAD_DA(offset) \
    220  1.1  hsuenaga     (MVXPSEC_SRAM_PAYLOAD_OFF + (offset))
    221  1.1  hsuenaga 
    222  1.1  hsuenaga /*
    223  1.1  hsuenaga  * Session management
    224  1.1  hsuenaga  */
    225  1.1  hsuenaga enum mvxpsec_data_type {
    226  1.1  hsuenaga 	MVXPSEC_DATA_NONE,
    227  1.1  hsuenaga 	MVXPSEC_DATA_RAW,
    228  1.1  hsuenaga 	MVXPSEC_DATA_MBUF,
    229  1.1  hsuenaga 	MVXPSEC_DATA_UIO,
    230  1.1  hsuenaga 	MVXPSEC_DATA_LAST,
    231  1.1  hsuenaga };
    232  1.1  hsuenaga 
    233  1.1  hsuenaga /* session flags */
    234  1.1  hsuenaga #define RDY_DATA	(1 << 0)
    235  1.1  hsuenaga #define RDY_CRP_KEY	(1 << 1)
    236  1.1  hsuenaga #define RDY_CRP_IV	(1 << 2)
    237  1.1  hsuenaga #define RDY_MAC_KEY	(1 << 3)
    238  1.1  hsuenaga #define RDY_MAC_IV	(1 << 4)
    239  1.1  hsuenaga #define CRP_EXT_IV	(1 << 5)
    240  1.1  hsuenaga 
    241  1.1  hsuenaga #define SETUP_DONE	(1 << 10)
    242  1.1  hsuenaga #define DELETED		(1 << 11)
    243  1.1  hsuenaga #define DIR_ENCRYPT	(1 << 12)
    244  1.1  hsuenaga #define DIR_DECRYPT	(1 << 13)
    245  1.1  hsuenaga 
    246  1.1  hsuenaga #define HW_RUNNING	(1 << 16)
    247  1.1  hsuenaga 
    248  1.1  hsuenaga /* 64 peer * 2 way(in/out) * 2 family(inet/inet6) * 2 state(mature/dying) */
    249  1.1  hsuenaga #define MVXPSEC_MAX_SESSIONS	512
    250  1.1  hsuenaga 
    251  1.1  hsuenaga struct mvxpsec_session {
    252  1.1  hsuenaga 	struct mvxpsec_softc		*sc;
    253  1.1  hsuenaga 	uint32_t			sid;
    254  1.1  hsuenaga 
    255  1.1  hsuenaga 	uint32_t			sflags;
    256  1.1  hsuenaga 	uint32_t			refs;
    257  1.1  hsuenaga 
    258  1.1  hsuenaga 	/*
    259  1.1  hsuenaga 	 * Header of Security Accelerator
    260  1.1  hsuenaga 	 *   - include key entity for ciphers
    261  1.1  hsuenaga 	 *   - include iv for HMAC
    262  1.1  hsuenaga 	 */
    263  1.1  hsuenaga 	bus_dmamap_t			session_header_map;
    264  1.1  hsuenaga 	struct mvxpsec_session_header	session_header;
    265  1.1  hsuenaga 
    266  1.1  hsuenaga 	/* Key length for variable key length algorithm [bits] */
    267  1.1  hsuenaga 	int enc_klen;
    268  1.1  hsuenaga 	int mac_klen;
    269  1.1  hsuenaga 
    270  1.1  hsuenaga 	/* IV Store */
    271  1.1  hsuenaga 	struct mvxpsec_crp_iv		session_iv;
    272  1.1  hsuenaga 
    273  1.1  hsuenaga 	/* debug */
    274  1.1  hsuenaga 	int cipher_alg;
    275  1.1  hsuenaga 	int hmac_alg;
    276  1.1  hsuenaga };
    277  1.1  hsuenaga 
    278  1.1  hsuenaga struct mvxpsec_packet {
    279  1.1  hsuenaga 	struct mvxpsec_session		*mv_s;
    280  1.1  hsuenaga 	struct cryptop			*crp;
    281  1.1  hsuenaga 	int				flags;
    282  1.1  hsuenaga 
    283  1.1  hsuenaga 	mvxpsec_dma_ring		dma_ring;
    284  1.1  hsuenaga 
    285  1.1  hsuenaga 	bus_dmamap_t			pkt_header_map;
    286  1.1  hsuenaga 	struct mvxpsec_packet_header	pkt_header;
    287  1.1  hsuenaga 
    288  1.1  hsuenaga 	bus_dmamap_t			data_map;
    289  1.1  hsuenaga 	enum mvxpsec_data_type		data_type;
    290  1.1  hsuenaga 	uint32_t			data_len;
    291  1.1  hsuenaga 	union {
    292  1.1  hsuenaga 		/* payload buffer come from opencrypto API */
    293  1.1  hsuenaga 		void			*ptr;
    294  1.1  hsuenaga 		void			*raw;
    295  1.1  hsuenaga 		struct mbuf		*mbuf;
    296  1.1  hsuenaga 		struct uio		*uio;
    297  1.1  hsuenaga 	} data;
    298  1.1  hsuenaga 
    299  1.1  hsuenaga 	/* IV place holder for EXPLICIT IV */
    300  1.1  hsuenaga 	void				*ext_iv;
    301  1.1  hsuenaga 	int				ext_ivlen;
    302  1.1  hsuenaga 
    303  1.1  hsuenaga 	uint32_t			enc_off;
    304  1.1  hsuenaga 	uint32_t			enc_len;
    305  1.1  hsuenaga 	uint32_t			enc_ivoff;
    306  1.1  hsuenaga 	uint32_t			mac_off;
    307  1.1  hsuenaga 	uint32_t			mac_len;
    308  1.1  hsuenaga 	uint32_t			mac_dst;
    309  1.1  hsuenaga #define data_ptr data.ptr
    310  1.1  hsuenaga #define data_raw data.raw
    311  1.1  hsuenaga #define data_mbuf data.mbuf
    312  1.1  hsuenaga #define data_uio data.uio
    313  1.1  hsuenaga 
    314  1.1  hsuenaga 	/* list */
    315  1.1  hsuenaga 	SIMPLEQ_ENTRY(mvxpsec_packet)	queue;
    316  1.1  hsuenaga 	SLIST_ENTRY(mvxpsec_packet)	free_list;
    317  1.1  hsuenaga };
    318  1.1  hsuenaga typedef SIMPLEQ_HEAD(mvxpsec_packet_queue, mvxpsec_packet) mvxpsec_queue_t;
    319  1.1  hsuenaga typedef SLIST_HEAD(mvxpsec_packet_list, mvxpsec_packet) mvxpsec_list_t;
    320  1.1  hsuenaga 
    321  1.1  hsuenaga /*
    322  1.1  hsuenaga  * DMA Configuration
    323  1.1  hsuenaga  */
    324  1.1  hsuenaga #define MVXPSEC_DMA_DESC_PAGES	16
    325  1.1  hsuenaga #define MVXPSEC_DMA_MAX_SEGS	30
    326  1.1  hsuenaga #define MVXPSEC_DMA_MAX_SIZE	2048 /* = SRAM size */
    327  1.1  hsuenaga 
    328  1.1  hsuenaga /*
    329  1.1  hsuenaga  * Interrupt Configuration
    330  1.1  hsuenaga  */
    331  1.1  hsuenaga #define MVXPSEC_ALL_INT (0xffffffff)
    332  1.1  hsuenaga #define MVXPSEC_ALL_ERR (0xffffffff)
    333  1.1  hsuenaga #define MVXPSEC_DEFAULT_INT (MVXPSEC_INT_ACCTDMA)
    334  1.1  hsuenaga #define MVXPSEC_DEFAULT_ERR (MVXPSEC_ALL_ERR)
    335  1.1  hsuenaga 
    336  1.1  hsuenaga /*
    337  1.1  hsuenaga  * QUEUE Configuration
    338  1.1  hsuenaga  */
    339  1.1  hsuenaga #define MVXPSEC_MAX_QLEN		512
    340  1.1  hsuenaga #define MVXPSEC_QLEN_HIWAT	256
    341  1.1  hsuenaga #define MVXPSEC_QLEN_DEF_LOWAT	16
    342  1.1  hsuenaga #define MVXPSEC_DEF_PENDING	0
    343  1.1  hsuenaga 
    344  1.1  hsuenaga /*
    345  1.1  hsuenaga  * Event counters
    346  1.1  hsuenaga  */
    347  1.1  hsuenaga struct mvxpsec_evcnt {
    348  1.4    andvar 	/* interrupts */
    349  1.1  hsuenaga 	struct evcnt intr_all;
    350  1.1  hsuenaga 	struct evcnt intr_auth;
    351  1.1  hsuenaga 	struct evcnt intr_des;
    352  1.1  hsuenaga 	struct evcnt intr_aes_enc;
    353  1.1  hsuenaga 	struct evcnt intr_aes_dec;
    354  1.1  hsuenaga 	struct evcnt intr_enc;
    355  1.1  hsuenaga 	struct evcnt intr_sa;
    356  1.1  hsuenaga 	struct evcnt intr_acctdma;
    357  1.1  hsuenaga 	struct evcnt intr_comp;
    358  1.1  hsuenaga 	struct evcnt intr_own;
    359  1.1  hsuenaga 	struct evcnt intr_acctdma_cont;
    360  1.1  hsuenaga 
    361  1.1  hsuenaga 	/* session counter */
    362  1.1  hsuenaga 	struct evcnt session_new;
    363  1.1  hsuenaga 	struct evcnt session_free;
    364  1.1  hsuenaga 
    365  1.1  hsuenaga 	/* packet counter */
    366  1.1  hsuenaga 	struct evcnt packet_ok;
    367  1.1  hsuenaga 	struct evcnt packet_err;
    368  1.1  hsuenaga 
    369  1.1  hsuenaga 	/* queue */
    370  1.1  hsuenaga 	struct evcnt dispatch_packets;
    371  1.1  hsuenaga 	struct evcnt dispatch_queue;
    372  1.1  hsuenaga 	struct evcnt queue_full;
    373  1.1  hsuenaga 	struct evcnt max_dispatch;
    374  1.1  hsuenaga 	struct evcnt max_done;
    375  1.1  hsuenaga };
    376  1.1  hsuenaga #ifdef MVXPSEC_EVENT_COUNTERS
    377  1.1  hsuenaga #define MVXPSEC_EVCNT_INCR(sc, name) do { \
    378  1.1  hsuenaga 	(sc)->sc_ev.name.ev_count++; \
    379  1.1  hsuenaga } while (/*CONSTCOND*/0)
    380  1.1  hsuenaga #define MVXPSEC_EVCNT_ADD(sc, name, val) do { \
    381  1.1  hsuenaga 	(sc)->sc_ev.name.ev_count += (val); \
    382  1.1  hsuenaga } while (/*CONSTCOND*/0)
    383  1.1  hsuenaga #define MVXPSEC_EVCNT_MAX(sc, name, val) do { \
    384  1.1  hsuenaga 	if ((val) > (sc)->sc_ev.name.ev_count) \
    385  1.1  hsuenaga 		(sc)->sc_ev.name.ev_count = (val); \
    386  1.1  hsuenaga } while (/*CONSTCOND*/0)
    387  1.1  hsuenaga #else
    388  1.1  hsuenaga #define MVXPSEC_EVCNT_INCR(sc, name)		/* nothing */
    389  1.1  hsuenaga #define MVXPSEC_EVCNT_ADD(sc, name, val)	/* nothing */
    390  1.1  hsuenaga #define MVXPSEC_EVCNT_MAX(sc, name, val)	/* nothing */
    391  1.1  hsuenaga #endif
    392  1.1  hsuenaga 
    393  1.1  hsuenaga struct mvxpsec_softc {
    394  1.1  hsuenaga 	device_t		sc_dev;
    395  1.1  hsuenaga 	uint32_t		sc_cid;
    396  1.1  hsuenaga 	bus_space_tag_t		sc_iot;
    397  1.1  hsuenaga 	bus_space_handle_t	sc_ioh;
    398  1.1  hsuenaga 	bus_dma_tag_t		sc_dmat;
    399  1.1  hsuenaga 
    400  1.1  hsuenaga 	/* Memory Pools */
    401  1.1  hsuenaga 	struct mvxpsec_devmem	*sc_devmem_desc;
    402  1.1  hsuenaga 	struct mvxpsec_devmem	*sc_devmem_mmap;
    403  1.1  hsuenaga 	pool_cache_t		sc_session_pool;
    404  1.1  hsuenaga 	pool_cache_t		sc_packet_pool;
    405  1.1  hsuenaga 
    406  1.1  hsuenaga 	/* Event Counters */
    407  1.1  hsuenaga #ifdef MVXPSEC_EVENT_COUNTERS
    408  1.1  hsuenaga 	struct mvxpsec_evcnt	sc_ev;
    409  1.1  hsuenaga #endif
    410  1.1  hsuenaga 
    411  1.1  hsuenaga 	/* SRAM mappings */
    412  1.1  hsuenaga 	paddr_t			sc_sram_pa;
    413  1.1  hsuenaga 	void *			sc_sram_va;
    414  1.1  hsuenaga 
    415  1.1  hsuenaga 	/* Interrupts and Timers */
    416  1.1  hsuenaga 	callout_t		sc_timeout;
    417  1.1  hsuenaga 	void *			sc_done_ih;
    418  1.1  hsuenaga 	void *			sc_error_ih;
    419  1.1  hsuenaga 
    420  1.1  hsuenaga 	/* DMA Descriptors */
    421  1.1  hsuenaga 	kmutex_t		sc_dma_mtx;
    422  1.1  hsuenaga 	struct mvxpsec_descriptor_handle *sc_desc_ring;
    423  1.1  hsuenaga 	int			sc_desc_ring_size;
    424  1.1  hsuenaga 	int			sc_desc_ring_prod;
    425  1.1  hsuenaga 	int			sc_desc_ring_cons;
    426  1.1  hsuenaga 
    427  1.1  hsuenaga 	/* Session */
    428  1.1  hsuenaga 	kmutex_t		sc_session_mtx;
    429  1.1  hsuenaga 	struct mvxpsec_session	*sc_sessions[MVXPSEC_MAX_SESSIONS];
    430  1.1  hsuenaga 	int			sc_nsessions;
    431  1.1  hsuenaga 	struct mvxpsec_session	*sc_last_session;
    432  1.1  hsuenaga 
    433  1.1  hsuenaga 	/* Packet queue */
    434  1.1  hsuenaga 	kmutex_t		sc_queue_mtx;
    435  1.1  hsuenaga 	mvxpsec_queue_t		sc_wait_queue;
    436  1.1  hsuenaga 	int			sc_wait_qlen;
    437  1.1  hsuenaga 	int			sc_wait_qlimit;
    438  1.1  hsuenaga 	mvxpsec_queue_t		sc_run_queue;
    439  1.1  hsuenaga 	mvxpsec_list_t		sc_free_list;
    440  1.1  hsuenaga 	int			sc_free_qlen;
    441  1.1  hsuenaga 	uint32_t		sc_flags;
    442  1.1  hsuenaga 
    443  1.1  hsuenaga 	/* Debug */
    444  1.1  hsuenaga 	int			sc_craft_conf;
    445  1.1  hsuenaga 	int			sc_craft_p0;
    446  1.1  hsuenaga };
    447  1.1  hsuenaga /* SRAM parameters accessor */
    448  1.1  hsuenaga #define MVXPSEC_SRAM_BASE(sc) ((sc)->sc_sram_pa)
    449  1.1  hsuenaga #define MVXPSEC_SRAM_SIZE(sc) (sizeof(struct mvxpsec_crypt_sram))
    450  1.1  hsuenaga #define MVXPSEC_SRAM_PA(sc, offset)	\
    451  1.1  hsuenaga     (MVXPSEC_SRAM_BASE(sc) + (offset))
    452  1.1  hsuenaga #define MVXPSEC_SRAM_LIMIT(sc) \
    453  1.1  hsuenaga     (MVXPSEC_SRAM_BASE(sc) + MVXPSEC_SRAM_SIZE(sc))
    454  1.1  hsuenaga #define MVXPSEC_SRAM_PKT_HDR_PA(sc) \
    455  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_PKT_HDR_OFF)
    456  1.1  hsuenaga #define MVXPSEC_SRAM_DESC_PA(sc) \
    457  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_DESC_OFF)
    458  1.1  hsuenaga #define MVXPSEC_SRAM_IV_WORK_PA(sc) \
    459  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_IV_WORK_OFF)
    460  1.1  hsuenaga #define MVXPSEC_SRAM_SESS_HDR_PA(sc) \
    461  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_SESS_HDR_OFF)
    462  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_PA(sc) \
    463  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_KEY_OFF)
    464  1.1  hsuenaga #define MVXPSEC_SRAM_KEY_D_PA(sc) \
    465  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_KEY_D_OFF)
    466  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_IN_PA(sc) \
    467  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_MIV_IN_OFF)
    468  1.1  hsuenaga #define MVXPSEC_SRAM_MIV_OUT_PA(sc) \
    469  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_MIV_OUT_OFF)
    470  1.1  hsuenaga #define MVXPSEC_SRAM_PAYLOAD_PA(sc, offset) \
    471  1.1  hsuenaga     MVXPSEC_SRAM_PA((sc), MVXPSEC_SRAM_PAYLOAD_OFF + (offset))
    472  1.1  hsuenaga 
    473  1.1  hsuenaga /*
    474  1.1  hsuenaga  * OpenCrypto API
    475  1.1  hsuenaga  */
    476  1.1  hsuenaga extern int mvxpsec_register(struct mvxpsec_softc *);
    477  1.1  hsuenaga extern int mvxpsec_newsession(void *, uint32_t *, struct cryptoini *);
    478  1.3  riastrad extern void mvxpsec_freesession(void *, uint64_t);
    479  1.1  hsuenaga extern int mvxpsec_dispatch(void *, struct cryptop *, int);
    480  1.1  hsuenaga extern void mvxpsec_done(void *);
    481  1.1  hsuenaga 
    482  1.1  hsuenaga /* debug flags */
    483  1.1  hsuenaga #define MVXPSEC_DEBUG_DMA		__BIT(0)
    484  1.1  hsuenaga #define MVXPSEC_DEBUG_IOCTL		__BIT(1)
    485  1.1  hsuenaga #define MVXPSEC_DEBUG_INTR		__BIT(2)
    486  1.1  hsuenaga #define MVXPSEC_DEBUG_SRAM		__BIT(3)
    487  1.1  hsuenaga #define MVXPSEC_DEBUG_OPENCRYPTO	__BIT(4)
    488  1.1  hsuenaga #define MVXPSEC_DEBUG_PAYLOAD		__BIT(5)
    489  1.1  hsuenaga #define MVXPSEC_DEBUG_HASH_IV		__BIT(6)
    490  1.1  hsuenaga #define MVXPSEC_DEBUG_HASH_VAL		__BIT(7)
    491  1.1  hsuenaga #define MVXPSEC_DEBUG_DESC		__BIT(8) /* descriptors and registers */
    492  1.1  hsuenaga #define MVXPSEC_DEBUG_INPUT		__BIT(9)
    493  1.1  hsuenaga #define MVXPSEC_DEBUG_ENC_IV		__BIT(10)
    494  1.1  hsuenaga #define MVXPSEC_DEBUG_QUEUE		__BIT(11)
    495  1.1  hsuenaga 
    496  1.1  hsuenaga #define MVXPSEC_DEBUG_ALL		__BITS(11,0)
    497  1.1  hsuenaga 
    498  1.1  hsuenaga #ifdef MVXPSEC_DEBUG
    499  1.1  hsuenaga #define MVXPSEC_PRINTF(level, fmt, ...) \
    500  1.1  hsuenaga 	do { \
    501  1.1  hsuenaga 		if (mvxpsec_debug & level) { \
    502  1.1  hsuenaga 			printf("%s: ", __func__); \
    503  1.1  hsuenaga 			printf((fmt), ##__VA_ARGS__); \
    504  1.1  hsuenaga 		} \
    505  1.1  hsuenaga 	} while (/*CONSTCOND*/0)
    506  1.1  hsuenaga #else
    507  1.1  hsuenaga #define MVXPSEC_PRINTF(level, fmt, ...) /* nothing */
    508  1.1  hsuenaga #endif
    509  1.1  hsuenaga 
    510  1.1  hsuenaga 
    511  1.1  hsuenaga #endif /* __MVXPSECVAR_H__ */
    512