Home | History | Annotate | Line # | Download | only in marvell
mvxpsecvar.h revision 1.1.22.1
      1  1.1.22.1    martin /*	$NetBSD: mvxpsecvar.h,v 1.1.22.1 2020/04/08 14:08:07 martin 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.1.22.1    martin  * |               |   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.1.22.1    martin  * 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.1  hsuenaga 	/* interuprts */
    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.1  hsuenaga extern int 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