1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /** 3*4882a593Smuzhiyun * AMCC SoC PPC4xx Crypto Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2008 Applied Micro Circuits Corporation. 6*4882a593Smuzhiyun * All rights reserved. James Hsiao <jhsiao@amcc.com> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * This filr defines the register set for Security Subsystem 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __CRYPTO4XX_REG_DEF_H__ 12*4882a593Smuzhiyun #define __CRYPTO4XX_REG_DEF_H__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* CRYPTO4XX Register offset */ 15*4882a593Smuzhiyun #define CRYPTO4XX_DESCRIPTOR 0x00000000 16*4882a593Smuzhiyun #define CRYPTO4XX_CTRL_STAT 0x00000000 17*4882a593Smuzhiyun #define CRYPTO4XX_SOURCE 0x00000004 18*4882a593Smuzhiyun #define CRYPTO4XX_DEST 0x00000008 19*4882a593Smuzhiyun #define CRYPTO4XX_SA 0x0000000C 20*4882a593Smuzhiyun #define CRYPTO4XX_SA_LENGTH 0x00000010 21*4882a593Smuzhiyun #define CRYPTO4XX_LENGTH 0x00000014 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define CRYPTO4XX_PE_DMA_CFG 0x00000040 24*4882a593Smuzhiyun #define CRYPTO4XX_PE_DMA_STAT 0x00000044 25*4882a593Smuzhiyun #define CRYPTO4XX_PDR_BASE 0x00000048 26*4882a593Smuzhiyun #define CRYPTO4XX_RDR_BASE 0x0000004c 27*4882a593Smuzhiyun #define CRYPTO4XX_RING_SIZE 0x00000050 28*4882a593Smuzhiyun #define CRYPTO4XX_RING_CTRL 0x00000054 29*4882a593Smuzhiyun #define CRYPTO4XX_INT_RING_STAT 0x00000058 30*4882a593Smuzhiyun #define CRYPTO4XX_EXT_RING_STAT 0x0000005c 31*4882a593Smuzhiyun #define CRYPTO4XX_IO_THRESHOLD 0x00000060 32*4882a593Smuzhiyun #define CRYPTO4XX_GATH_RING_BASE 0x00000064 33*4882a593Smuzhiyun #define CRYPTO4XX_SCAT_RING_BASE 0x00000068 34*4882a593Smuzhiyun #define CRYPTO4XX_PART_RING_SIZE 0x0000006c 35*4882a593Smuzhiyun #define CRYPTO4XX_PART_RING_CFG 0x00000070 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define CRYPTO4XX_PDR_BASE_UADDR 0x00000080 38*4882a593Smuzhiyun #define CRYPTO4XX_RDR_BASE_UADDR 0x00000084 39*4882a593Smuzhiyun #define CRYPTO4XX_PKT_SRC_UADDR 0x00000088 40*4882a593Smuzhiyun #define CRYPTO4XX_PKT_DEST_UADDR 0x0000008c 41*4882a593Smuzhiyun #define CRYPTO4XX_SA_UADDR 0x00000090 42*4882a593Smuzhiyun #define CRYPTO4XX_GATH_RING_BASE_UADDR 0x000000A0 43*4882a593Smuzhiyun #define CRYPTO4XX_SCAT_RING_BASE_UADDR 0x000000A4 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define CRYPTO4XX_SEQ_RD 0x00000408 46*4882a593Smuzhiyun #define CRYPTO4XX_SEQ_MASK_RD 0x0000040C 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define CRYPTO4XX_SA_CMD_0 0x00010600 49*4882a593Smuzhiyun #define CRYPTO4XX_SA_CMD_1 0x00010604 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define CRYPTO4XX_STATE_PTR 0x000106dc 52*4882a593Smuzhiyun #define CRYPTO4XX_STATE_IV 0x00010700 53*4882a593Smuzhiyun #define CRYPTO4XX_STATE_HASH_BYTE_CNT_0 0x00010710 54*4882a593Smuzhiyun #define CRYPTO4XX_STATE_HASH_BYTE_CNT_1 0x00010714 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define CRYPTO4XX_STATE_IDIGEST_0 0x00010718 57*4882a593Smuzhiyun #define CRYPTO4XX_STATE_IDIGEST_1 0x0001071c 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define CRYPTO4XX_DATA_IN 0x00018000 60*4882a593Smuzhiyun #define CRYPTO4XX_DATA_OUT 0x0001c000 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define CRYPTO4XX_INT_UNMASK_STAT 0x000500a0 63*4882a593Smuzhiyun #define CRYPTO4XX_INT_MASK_STAT 0x000500a4 64*4882a593Smuzhiyun #define CRYPTO4XX_INT_CLR 0x000500a4 65*4882a593Smuzhiyun #define CRYPTO4XX_INT_EN 0x000500a8 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define CRYPTO4XX_INT_PKA 0x00000002 68*4882a593Smuzhiyun #define CRYPTO4XX_INT_PDR_DONE 0x00008000 69*4882a593Smuzhiyun #define CRYPTO4XX_INT_MA_WR_ERR 0x00020000 70*4882a593Smuzhiyun #define CRYPTO4XX_INT_MA_RD_ERR 0x00010000 71*4882a593Smuzhiyun #define CRYPTO4XX_INT_PE_ERR 0x00000200 72*4882a593Smuzhiyun #define CRYPTO4XX_INT_USER_DMA_ERR 0x00000040 73*4882a593Smuzhiyun #define CRYPTO4XX_INT_SLAVE_ERR 0x00000010 74*4882a593Smuzhiyun #define CRYPTO4XX_INT_MASTER_ERR 0x00000008 75*4882a593Smuzhiyun #define CRYPTO4XX_INT_ERROR 0x00030258 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define CRYPTO4XX_INT_CFG 0x000500ac 78*4882a593Smuzhiyun #define CRYPTO4XX_INT_DESCR_RD 0x000500b0 79*4882a593Smuzhiyun #define CRYPTO4XX_INT_DESCR_CNT 0x000500b4 80*4882a593Smuzhiyun #define CRYPTO4XX_INT_TIMEOUT_CNT 0x000500b8 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define CRYPTO4XX_DEVICE_CTRL 0x00060080 83*4882a593Smuzhiyun #define CRYPTO4XX_DEVICE_ID 0x00060084 84*4882a593Smuzhiyun #define CRYPTO4XX_DEVICE_INFO 0x00060088 85*4882a593Smuzhiyun #define CRYPTO4XX_DMA_USER_SRC 0x00060094 86*4882a593Smuzhiyun #define CRYPTO4XX_DMA_USER_DEST 0x00060098 87*4882a593Smuzhiyun #define CRYPTO4XX_DMA_USER_CMD 0x0006009C 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define CRYPTO4XX_DMA_CFG 0x000600d4 90*4882a593Smuzhiyun #define CRYPTO4XX_BYTE_ORDER_CFG 0x000600d8 91*4882a593Smuzhiyun #define CRYPTO4XX_ENDIAN_CFG 0x000600d8 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_STAT 0x00070000 94*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_STAT_BUSY 0x1 95*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_CTRL 0x00070004 96*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_SEED_L 0x00070008 97*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_SEED_H 0x0007000c 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_RES_0 0x00070020 100*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_RES_1 0x00070024 101*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_RES_2 0x00070028 102*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_RES_3 0x0007002C 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_LFSR_L 0x00070030 105*4882a593Smuzhiyun #define CRYPTO4XX_PRNG_LFSR_H 0x00070034 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /** 108*4882a593Smuzhiyun * Initialize CRYPTO ENGINE registers, and memory bases. 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun #define PPC4XX_PDR_POLL 0x3ff 111*4882a593Smuzhiyun #define PPC4XX_OUTPUT_THRESHOLD 2 112*4882a593Smuzhiyun #define PPC4XX_INPUT_THRESHOLD 2 113*4882a593Smuzhiyun #define PPC4XX_PD_SIZE 6 114*4882a593Smuzhiyun #define PPC4XX_CTX_DONE_INT 0x2000 115*4882a593Smuzhiyun #define PPC4XX_PD_DONE_INT 0x8000 116*4882a593Smuzhiyun #define PPC4XX_TMO_ERR_INT 0x40000 117*4882a593Smuzhiyun #define PPC4XX_BYTE_ORDER 0x22222 118*4882a593Smuzhiyun #define PPC4XX_INTERRUPT_CLR 0x3ffff 119*4882a593Smuzhiyun #define PPC4XX_PRNG_CTRL_AUTO_EN 0x3 120*4882a593Smuzhiyun #define PPC4XX_DC_3DES_EN 1 121*4882a593Smuzhiyun #define PPC4XX_TRNG_EN 0x00020000 122*4882a593Smuzhiyun #define PPC4XX_INT_DESCR_CNT 7 123*4882a593Smuzhiyun #define PPC4XX_INT_TIMEOUT_CNT 0 124*4882a593Smuzhiyun #define PPC4XX_INT_TIMEOUT_CNT_REVB 0x3FF 125*4882a593Smuzhiyun #define PPC4XX_INT_CFG 1 126*4882a593Smuzhiyun /** 127*4882a593Smuzhiyun * all follow define are ad hoc 128*4882a593Smuzhiyun */ 129*4882a593Smuzhiyun #define PPC4XX_RING_RETRY 100 130*4882a593Smuzhiyun #define PPC4XX_RING_POLL 100 131*4882a593Smuzhiyun #define PPC4XX_SDR_SIZE PPC4XX_NUM_SD 132*4882a593Smuzhiyun #define PPC4XX_GDR_SIZE PPC4XX_NUM_GD 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun /** 135*4882a593Smuzhiyun * Generic Security Association (SA) with all possible fields. These will 136*4882a593Smuzhiyun * never likely used except for reference purpose. These structure format 137*4882a593Smuzhiyun * can be not changed as the hardware expects them to be layout as defined. 138*4882a593Smuzhiyun * Field can be removed or reduced but ordering can not be changed. 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun #define CRYPTO4XX_DMA_CFG_OFFSET 0x40 141*4882a593Smuzhiyun union ce_pe_dma_cfg { 142*4882a593Smuzhiyun struct { 143*4882a593Smuzhiyun u32 rsv:7; 144*4882a593Smuzhiyun u32 dir_host:1; 145*4882a593Smuzhiyun u32 rsv1:2; 146*4882a593Smuzhiyun u32 bo_td_en:1; 147*4882a593Smuzhiyun u32 dis_pdr_upd:1; 148*4882a593Smuzhiyun u32 bo_sgpd_en:1; 149*4882a593Smuzhiyun u32 bo_data_en:1; 150*4882a593Smuzhiyun u32 bo_sa_en:1; 151*4882a593Smuzhiyun u32 bo_pd_en:1; 152*4882a593Smuzhiyun u32 rsv2:4; 153*4882a593Smuzhiyun u32 dynamic_sa_en:1; 154*4882a593Smuzhiyun u32 pdr_mode:2; 155*4882a593Smuzhiyun u32 pe_mode:1; 156*4882a593Smuzhiyun u32 rsv3:5; 157*4882a593Smuzhiyun u32 reset_sg:1; 158*4882a593Smuzhiyun u32 reset_pdr:1; 159*4882a593Smuzhiyun u32 reset_pe:1; 160*4882a593Smuzhiyun } bf; 161*4882a593Smuzhiyun u32 w; 162*4882a593Smuzhiyun } __attribute__((packed)); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define CRYPTO4XX_PDR_BASE_OFFSET 0x48 165*4882a593Smuzhiyun #define CRYPTO4XX_RDR_BASE_OFFSET 0x4c 166*4882a593Smuzhiyun #define CRYPTO4XX_RING_SIZE_OFFSET 0x50 167*4882a593Smuzhiyun union ce_ring_size { 168*4882a593Smuzhiyun struct { 169*4882a593Smuzhiyun u32 ring_offset:16; 170*4882a593Smuzhiyun u32 rsv:6; 171*4882a593Smuzhiyun u32 ring_size:10; 172*4882a593Smuzhiyun } bf; 173*4882a593Smuzhiyun u32 w; 174*4882a593Smuzhiyun } __attribute__((packed)); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define CRYPTO4XX_RING_CONTROL_OFFSET 0x54 177*4882a593Smuzhiyun union ce_ring_control { 178*4882a593Smuzhiyun struct { 179*4882a593Smuzhiyun u32 continuous:1; 180*4882a593Smuzhiyun u32 rsv:5; 181*4882a593Smuzhiyun u32 ring_retry_divisor:10; 182*4882a593Smuzhiyun u32 rsv1:4; 183*4882a593Smuzhiyun u32 ring_poll_divisor:10; 184*4882a593Smuzhiyun } bf; 185*4882a593Smuzhiyun u32 w; 186*4882a593Smuzhiyun } __attribute__((packed)); 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define CRYPTO4XX_IO_THRESHOLD_OFFSET 0x60 189*4882a593Smuzhiyun union ce_io_threshold { 190*4882a593Smuzhiyun struct { 191*4882a593Smuzhiyun u32 rsv:6; 192*4882a593Smuzhiyun u32 output_threshold:10; 193*4882a593Smuzhiyun u32 rsv1:6; 194*4882a593Smuzhiyun u32 input_threshold:10; 195*4882a593Smuzhiyun } bf; 196*4882a593Smuzhiyun u32 w; 197*4882a593Smuzhiyun } __attribute__((packed)); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define CRYPTO4XX_GATHER_RING_BASE_OFFSET 0x64 200*4882a593Smuzhiyun #define CRYPTO4XX_SCATTER_RING_BASE_OFFSET 0x68 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun union ce_part_ring_size { 203*4882a593Smuzhiyun struct { 204*4882a593Smuzhiyun u32 sdr_size:16; 205*4882a593Smuzhiyun u32 gdr_size:16; 206*4882a593Smuzhiyun } bf; 207*4882a593Smuzhiyun u32 w; 208*4882a593Smuzhiyun } __attribute__((packed)); 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun #define MAX_BURST_SIZE_32 0 211*4882a593Smuzhiyun #define MAX_BURST_SIZE_64 1 212*4882a593Smuzhiyun #define MAX_BURST_SIZE_128 2 213*4882a593Smuzhiyun #define MAX_BURST_SIZE_256 3 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /* gather descriptor control length */ 216*4882a593Smuzhiyun struct gd_ctl_len { 217*4882a593Smuzhiyun u32 len:16; 218*4882a593Smuzhiyun u32 rsv:14; 219*4882a593Smuzhiyun u32 done:1; 220*4882a593Smuzhiyun u32 ready:1; 221*4882a593Smuzhiyun } __attribute__((packed)); 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun struct ce_gd { 224*4882a593Smuzhiyun u32 ptr; 225*4882a593Smuzhiyun struct gd_ctl_len ctl_len; 226*4882a593Smuzhiyun } __attribute__((packed)); 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun struct sd_ctl { 229*4882a593Smuzhiyun u32 ctl:30; 230*4882a593Smuzhiyun u32 done:1; 231*4882a593Smuzhiyun u32 rdy:1; 232*4882a593Smuzhiyun } __attribute__((packed)); 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun struct ce_sd { 235*4882a593Smuzhiyun u32 ptr; 236*4882a593Smuzhiyun struct sd_ctl ctl; 237*4882a593Smuzhiyun } __attribute__((packed)); 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define PD_PAD_CTL_32 0x10 240*4882a593Smuzhiyun #define PD_PAD_CTL_64 0x20 241*4882a593Smuzhiyun #define PD_PAD_CTL_128 0x40 242*4882a593Smuzhiyun #define PD_PAD_CTL_256 0x80 243*4882a593Smuzhiyun union ce_pd_ctl { 244*4882a593Smuzhiyun struct { 245*4882a593Smuzhiyun u32 pd_pad_ctl:8; 246*4882a593Smuzhiyun u32 status:8; 247*4882a593Smuzhiyun u32 next_hdr:8; 248*4882a593Smuzhiyun u32 rsv:2; 249*4882a593Smuzhiyun u32 cached_sa:1; 250*4882a593Smuzhiyun u32 hash_final:1; 251*4882a593Smuzhiyun u32 init_arc4:1; 252*4882a593Smuzhiyun u32 rsv1:1; 253*4882a593Smuzhiyun u32 pe_done:1; 254*4882a593Smuzhiyun u32 host_ready:1; 255*4882a593Smuzhiyun } bf; 256*4882a593Smuzhiyun u32 w; 257*4882a593Smuzhiyun } __attribute__((packed)); 258*4882a593Smuzhiyun #define PD_CTL_HASH_FINAL BIT(4) 259*4882a593Smuzhiyun #define PD_CTL_PE_DONE BIT(1) 260*4882a593Smuzhiyun #define PD_CTL_HOST_READY BIT(0) 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun union ce_pd_ctl_len { 263*4882a593Smuzhiyun struct { 264*4882a593Smuzhiyun u32 bypass:8; 265*4882a593Smuzhiyun u32 pe_done:1; 266*4882a593Smuzhiyun u32 host_ready:1; 267*4882a593Smuzhiyun u32 rsv:2; 268*4882a593Smuzhiyun u32 pkt_len:20; 269*4882a593Smuzhiyun } bf; 270*4882a593Smuzhiyun u32 w; 271*4882a593Smuzhiyun } __attribute__((packed)); 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun struct ce_pd { 274*4882a593Smuzhiyun union ce_pd_ctl pd_ctl; 275*4882a593Smuzhiyun u32 src; 276*4882a593Smuzhiyun u32 dest; 277*4882a593Smuzhiyun u32 sa; /* get from ctx->sa_dma_addr */ 278*4882a593Smuzhiyun u32 sa_len; /* only if dynamic sa is used */ 279*4882a593Smuzhiyun union ce_pd_ctl_len pd_ctl_len; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun } __attribute__((packed)); 282*4882a593Smuzhiyun #endif 283