1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Common internal memory map for some Freescale SoCs 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright 2014 Freescale Semiconductor, Inc. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __FSL_SEC_H 10*4882a593Smuzhiyun #define __FSL_SEC_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <common.h> 13*4882a593Smuzhiyun #include <asm/io.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #ifdef CONFIG_SYS_FSL_SEC_LE 16*4882a593Smuzhiyun #define sec_in32(a) in_le32(a) 17*4882a593Smuzhiyun #define sec_out32(a, v) out_le32(a, v) 18*4882a593Smuzhiyun #define sec_in16(a) in_le16(a) 19*4882a593Smuzhiyun #define sec_clrbits32 clrbits_le32 20*4882a593Smuzhiyun #define sec_setbits32 setbits_le32 21*4882a593Smuzhiyun #elif defined(CONFIG_SYS_FSL_SEC_BE) 22*4882a593Smuzhiyun #define sec_in32(a) in_be32(a) 23*4882a593Smuzhiyun #define sec_out32(a, v) out_be32(a, v) 24*4882a593Smuzhiyun #define sec_in16(a) in_be16(a) 25*4882a593Smuzhiyun #define sec_clrbits32 clrbits_be32 26*4882a593Smuzhiyun #define sec_setbits32 setbits_be32 27*4882a593Smuzhiyun #elif defined(CONFIG_SYS_FSL_HAS_SEC) 28*4882a593Smuzhiyun #error Neither CONFIG_SYS_FSL_SEC_LE nor CONFIG_SYS_FSL_SEC_BE is defined 29*4882a593Smuzhiyun #endif 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Security Engine Block (MS = Most Sig., LS = Least Sig.) */ 32*4882a593Smuzhiyun #if CONFIG_SYS_FSL_SEC_COMPAT >= 4 33*4882a593Smuzhiyun /* RNG4 TRNG test registers */ 34*4882a593Smuzhiyun struct rng4tst { 35*4882a593Smuzhiyun #define RTMCTL_PRGM 0x00010000 /* 1 -> program mode, 0 -> run mode */ 36*4882a593Smuzhiyun #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_SC 0 /* use von Neumann data in 37*4882a593Smuzhiyun both entropy shifter and 38*4882a593Smuzhiyun statistical checker */ 39*4882a593Smuzhiyun #define RTMCTL_SAMP_MODE_RAW_ES_SC 1 /* use raw data in both 40*4882a593Smuzhiyun entropy shifter and 41*4882a593Smuzhiyun statistical checker */ 42*4882a593Smuzhiyun #define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_RAW_SC 2 /* use von Neumann data in 43*4882a593Smuzhiyun entropy shifter, raw data 44*4882a593Smuzhiyun in statistical checker */ 45*4882a593Smuzhiyun #define RTMCTL_SAMP_MODE_INVALID 3 /* invalid combination */ 46*4882a593Smuzhiyun u32 rtmctl; /* misc. control register */ 47*4882a593Smuzhiyun u32 rtscmisc; /* statistical check misc. register */ 48*4882a593Smuzhiyun u32 rtpkrrng; /* poker range register */ 49*4882a593Smuzhiyun #define RTSDCTL_ENT_DLY_MIN 3200 50*4882a593Smuzhiyun #define RTSDCTL_ENT_DLY_MAX 12800 51*4882a593Smuzhiyun union { 52*4882a593Smuzhiyun u32 rtpkrmax; /* PRGM=1: poker max. limit register */ 53*4882a593Smuzhiyun u32 rtpkrsq; /* PRGM=0: poker square calc. result register */ 54*4882a593Smuzhiyun }; 55*4882a593Smuzhiyun #define RTSDCTL_ENT_DLY_SHIFT 16 56*4882a593Smuzhiyun #define RTSDCTL_ENT_DLY_MASK (0xffff << RTSDCTL_ENT_DLY_SHIFT) 57*4882a593Smuzhiyun u32 rtsdctl; /* seed control register */ 58*4882a593Smuzhiyun union { 59*4882a593Smuzhiyun u32 rtsblim; /* PRGM=1: sparse bit limit register */ 60*4882a593Smuzhiyun u32 rttotsam; /* PRGM=0: total samples register */ 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun u32 rtfreqmin; /* frequency count min. limit register */ 63*4882a593Smuzhiyun #define RTFRQMAX_DISABLE (1 << 20) 64*4882a593Smuzhiyun union { 65*4882a593Smuzhiyun u32 rtfreqmax; /* PRGM=1: freq. count max. limit register */ 66*4882a593Smuzhiyun u32 rtfreqcnt; /* PRGM=0: freq. count register */ 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun u32 rsvd1[40]; 69*4882a593Smuzhiyun #define RNG_STATE0_HANDLE_INSTANTIATED 0x00000001 70*4882a593Smuzhiyun u32 rdsta; /*RNG DRNG Status Register*/ 71*4882a593Smuzhiyun u32 rsvd2[15]; 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun typedef struct ccsr_sec { 75*4882a593Smuzhiyun u32 res0; 76*4882a593Smuzhiyun u32 mcfgr; /* Master CFG Register */ 77*4882a593Smuzhiyun u8 res1[0x4]; 78*4882a593Smuzhiyun u32 scfgr; 79*4882a593Smuzhiyun struct { 80*4882a593Smuzhiyun u32 ms; /* Job Ring LIODN Register, MS */ 81*4882a593Smuzhiyun u32 ls; /* Job Ring LIODN Register, LS */ 82*4882a593Smuzhiyun } jrliodnr[4]; 83*4882a593Smuzhiyun u8 res2[0x2c]; 84*4882a593Smuzhiyun u32 jrstartr; /* Job Ring Start Register */ 85*4882a593Smuzhiyun struct { 86*4882a593Smuzhiyun u32 ms; /* RTIC LIODN Register, MS */ 87*4882a593Smuzhiyun u32 ls; /* RTIC LIODN Register, LS */ 88*4882a593Smuzhiyun } rticliodnr[4]; 89*4882a593Smuzhiyun u8 res3[0x1c]; 90*4882a593Smuzhiyun u32 decorr; /* DECO Request Register */ 91*4882a593Smuzhiyun struct { 92*4882a593Smuzhiyun u32 ms; /* DECO LIODN Register, MS */ 93*4882a593Smuzhiyun u32 ls; /* DECO LIODN Register, LS */ 94*4882a593Smuzhiyun } decoliodnr[8]; 95*4882a593Smuzhiyun u8 res4[0x40]; 96*4882a593Smuzhiyun u32 dar; /* DECO Avail Register */ 97*4882a593Smuzhiyun u32 drr; /* DECO Reset Register */ 98*4882a593Smuzhiyun u8 res5[0x4d8]; 99*4882a593Smuzhiyun struct rng4tst rng; /* RNG Registers */ 100*4882a593Smuzhiyun u8 res6[0x8a0]; 101*4882a593Smuzhiyun u32 crnr_ms; /* CHA Revision Number Register, MS */ 102*4882a593Smuzhiyun u32 crnr_ls; /* CHA Revision Number Register, LS */ 103*4882a593Smuzhiyun u32 ctpr_ms; /* Compile Time Parameters Register, MS */ 104*4882a593Smuzhiyun u32 ctpr_ls; /* Compile Time Parameters Register, LS */ 105*4882a593Smuzhiyun u8 res7[0x10]; 106*4882a593Smuzhiyun u32 far_ms; /* Fault Address Register, MS */ 107*4882a593Smuzhiyun u32 far_ls; /* Fault Address Register, LS */ 108*4882a593Smuzhiyun u32 falr; /* Fault Address LIODN Register */ 109*4882a593Smuzhiyun u32 fadr; /* Fault Address Detail Register */ 110*4882a593Smuzhiyun u8 res8[0x4]; 111*4882a593Smuzhiyun u32 csta; /* CAAM Status Register */ 112*4882a593Smuzhiyun u32 smpart; /* Secure Memory Partition Parameters */ 113*4882a593Smuzhiyun u32 smvid; /* Secure Memory Version ID */ 114*4882a593Smuzhiyun u32 rvid; /* Run Time Integrity Checking Version ID Reg.*/ 115*4882a593Smuzhiyun u32 ccbvid; /* CHA Cluster Block Version ID Register */ 116*4882a593Smuzhiyun u32 chavid_ms; /* CHA Version ID Register, MS */ 117*4882a593Smuzhiyun u32 chavid_ls; /* CHA Version ID Register, LS */ 118*4882a593Smuzhiyun u32 chanum_ms; /* CHA Number Register, MS */ 119*4882a593Smuzhiyun u32 chanum_ls; /* CHA Number Register, LS */ 120*4882a593Smuzhiyun u32 secvid_ms; /* SEC Version ID Register, MS */ 121*4882a593Smuzhiyun u32 secvid_ls; /* SEC Version ID Register, LS */ 122*4882a593Smuzhiyun u8 res9[0x6020]; 123*4882a593Smuzhiyun u32 qilcr_ms; /* Queue Interface LIODN CFG Register, MS */ 124*4882a593Smuzhiyun u32 qilcr_ls; /* Queue Interface LIODN CFG Register, LS */ 125*4882a593Smuzhiyun u8 res10[0x8fd8]; 126*4882a593Smuzhiyun } ccsr_sec_t; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define SEC_CTPR_MS_AXI_LIODN 0x08000000 129*4882a593Smuzhiyun #define SEC_CTPR_MS_QI 0x02000000 130*4882a593Smuzhiyun #define SEC_CTPR_MS_VIRT_EN_INCL 0x00000001 131*4882a593Smuzhiyun #define SEC_CTPR_MS_VIRT_EN_POR 0x00000002 132*4882a593Smuzhiyun #define SEC_RVID_MA 0x0f000000 133*4882a593Smuzhiyun #define SEC_CHANUM_MS_JRNUM_MASK 0xf0000000 134*4882a593Smuzhiyun #define SEC_CHANUM_MS_JRNUM_SHIFT 28 135*4882a593Smuzhiyun #define SEC_CHANUM_MS_DECONUM_MASK 0x0f000000 136*4882a593Smuzhiyun #define SEC_CHANUM_MS_DECONUM_SHIFT 24 137*4882a593Smuzhiyun #define SEC_SECVID_MS_IPID_MASK 0xffff0000 138*4882a593Smuzhiyun #define SEC_SECVID_MS_IPID_SHIFT 16 139*4882a593Smuzhiyun #define SEC_SECVID_MS_MAJ_REV_MASK 0x0000ff00 140*4882a593Smuzhiyun #define SEC_SECVID_MS_MAJ_REV_SHIFT 8 141*4882a593Smuzhiyun #define SEC_CCBVID_ERA_MASK 0xff000000 142*4882a593Smuzhiyun #define SEC_CCBVID_ERA_SHIFT 24 143*4882a593Smuzhiyun #define SEC_SCFGR_RDBENABLE 0x00000400 144*4882a593Smuzhiyun #define SEC_SCFGR_VIRT_EN 0x00008000 145*4882a593Smuzhiyun #define SEC_CHAVID_LS_RNG_SHIFT 16 146*4882a593Smuzhiyun #define SEC_CHAVID_RNG_LS_MASK 0x000f0000 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define CONFIG_JRSTARTR_JR0 0x00000001 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct jr_regs { 151*4882a593Smuzhiyun #if defined(CONFIG_SYS_FSL_SEC_LE) && \ 152*4882a593Smuzhiyun !(defined(CONFIG_MX6) || defined(CONFIG_MX7)) 153*4882a593Smuzhiyun u32 irba_l; 154*4882a593Smuzhiyun u32 irba_h; 155*4882a593Smuzhiyun #else 156*4882a593Smuzhiyun u32 irba_h; 157*4882a593Smuzhiyun u32 irba_l; 158*4882a593Smuzhiyun #endif 159*4882a593Smuzhiyun u32 rsvd1; 160*4882a593Smuzhiyun u32 irs; 161*4882a593Smuzhiyun u32 rsvd2; 162*4882a593Smuzhiyun u32 irsa; 163*4882a593Smuzhiyun u32 rsvd3; 164*4882a593Smuzhiyun u32 irja; 165*4882a593Smuzhiyun #if defined(CONFIG_SYS_FSL_SEC_LE) && \ 166*4882a593Smuzhiyun !(defined(CONFIG_MX6) || defined(CONFIG_MX7)) 167*4882a593Smuzhiyun u32 orba_l; 168*4882a593Smuzhiyun u32 orba_h; 169*4882a593Smuzhiyun #else 170*4882a593Smuzhiyun u32 orba_h; 171*4882a593Smuzhiyun u32 orba_l; 172*4882a593Smuzhiyun #endif 173*4882a593Smuzhiyun u32 rsvd4; 174*4882a593Smuzhiyun u32 ors; 175*4882a593Smuzhiyun u32 rsvd5; 176*4882a593Smuzhiyun u32 orjr; 177*4882a593Smuzhiyun u32 rsvd6; 178*4882a593Smuzhiyun u32 orsf; 179*4882a593Smuzhiyun u32 rsvd7; 180*4882a593Smuzhiyun u32 jrsta; 181*4882a593Smuzhiyun u32 rsvd8; 182*4882a593Smuzhiyun u32 jrint; 183*4882a593Smuzhiyun u32 jrcfg0; 184*4882a593Smuzhiyun u32 jrcfg1; 185*4882a593Smuzhiyun u32 rsvd9; 186*4882a593Smuzhiyun u32 irri; 187*4882a593Smuzhiyun u32 rsvd10; 188*4882a593Smuzhiyun u32 orwi; 189*4882a593Smuzhiyun u32 rsvd11; 190*4882a593Smuzhiyun u32 jrcr; 191*4882a593Smuzhiyun }; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun /* 194*4882a593Smuzhiyun * Scatter Gather Entry - Specifies the the Scatter Gather Format 195*4882a593Smuzhiyun * related information 196*4882a593Smuzhiyun */ 197*4882a593Smuzhiyun struct sg_entry { 198*4882a593Smuzhiyun #if defined(CONFIG_SYS_FSL_SEC_LE) && \ 199*4882a593Smuzhiyun !(defined(CONFIG_MX6) || defined(CONFIG_MX7)) 200*4882a593Smuzhiyun uint32_t addr_lo; /* Memory Address - lo */ 201*4882a593Smuzhiyun uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 202*4882a593Smuzhiyun #else 203*4882a593Smuzhiyun uint32_t addr_hi; /* Memory Address of start of buffer - hi */ 204*4882a593Smuzhiyun uint32_t addr_lo; /* Memory Address - lo */ 205*4882a593Smuzhiyun #endif 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun uint32_t len_flag; /* Length of the data in the frame */ 208*4882a593Smuzhiyun #define SG_ENTRY_LENGTH_MASK 0x3FFFFFFF 209*4882a593Smuzhiyun #define SG_ENTRY_EXTENSION_BIT 0x80000000 210*4882a593Smuzhiyun #define SG_ENTRY_FINAL_BIT 0x40000000 211*4882a593Smuzhiyun uint32_t bpid_offset; 212*4882a593Smuzhiyun #define SG_ENTRY_BPID_MASK 0x00FF0000 213*4882a593Smuzhiyun #define SG_ENTRY_BPID_SHIFT 16 214*4882a593Smuzhiyun #define SG_ENTRY_OFFSET_MASK 0x00001FFF 215*4882a593Smuzhiyun #define SG_ENTRY_OFFSET_SHIFT 0 216*4882a593Smuzhiyun }; 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #if defined(CONFIG_MX6) || defined(CONFIG_MX7) 219*4882a593Smuzhiyun /* Job Ring Base Address */ 220*4882a593Smuzhiyun #define JR_BASE_ADDR(x) (CONFIG_SYS_FSL_SEC_ADDR + 0x1000 * (x + 1)) 221*4882a593Smuzhiyun /* Secure Memory Offset varies accross versions */ 222*4882a593Smuzhiyun #define SM_V1_OFFSET 0x0f4 223*4882a593Smuzhiyun #define SM_V2_OFFSET 0xa00 224*4882a593Smuzhiyun /*Secure Memory Versioning */ 225*4882a593Smuzhiyun #define SMVID_V2 0x20105 226*4882a593Smuzhiyun #define SM_VERSION(x) (x < SMVID_V2 ? 1 : 2) 227*4882a593Smuzhiyun #define SM_OFFSET(x) (x == 1 ? SM_V1_OFFSET : SM_V2_OFFSET) 228*4882a593Smuzhiyun /* CAAM Job Ring 0 Registers */ 229*4882a593Smuzhiyun /* Secure Memory Partition Owner register */ 230*4882a593Smuzhiyun #define SMCSJR_PO (3 << 6) 231*4882a593Smuzhiyun /* JR Allocation Error */ 232*4882a593Smuzhiyun #define SMCSJR_AERR (3 << 12) 233*4882a593Smuzhiyun /* Secure memory partition 0 page 0 owner register */ 234*4882a593Smuzhiyun #define CAAM_SMPO_0 (CONFIG_SYS_FSL_SEC_ADDR + 0x1FBC) 235*4882a593Smuzhiyun /* Secure memory command register */ 236*4882a593Smuzhiyun #define CAAM_SMCJR(v, jr) (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_CMD(v)) 237*4882a593Smuzhiyun /* Secure memory command status register */ 238*4882a593Smuzhiyun #define CAAM_SMCSJR(v, jr) (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_STATUS(v)) 239*4882a593Smuzhiyun /* Secure memory access permissions register */ 240*4882a593Smuzhiyun #define CAAM_SMAPJR(v, jr, y) \ 241*4882a593Smuzhiyun (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_PERM(v) + y * 16) 242*4882a593Smuzhiyun /* Secure memory access group 2 register */ 243*4882a593Smuzhiyun #define CAAM_SMAG2JR(v, jr, y) \ 244*4882a593Smuzhiyun (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_GROUP2(v) + y * 16) 245*4882a593Smuzhiyun /* Secure memory access group 1 register */ 246*4882a593Smuzhiyun #define CAAM_SMAG1JR(v, jr, y) \ 247*4882a593Smuzhiyun (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_GROUP1(v) + y * 16) 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* Commands and macros for secure memory */ 250*4882a593Smuzhiyun #define SM_CMD(v) (v == 1 ? 0x0 : 0x1E4) 251*4882a593Smuzhiyun #define SM_STATUS(v) (v == 1 ? 0x8 : 0x1EC) 252*4882a593Smuzhiyun #define SM_PERM(v) (v == 1 ? 0x10 : 0x4) 253*4882a593Smuzhiyun #define SM_GROUP2(v) (v == 1 ? 0x14 : 0x8) 254*4882a593Smuzhiyun #define SM_GROUP1(v) (v == 1 ? 0x18 : 0xC) 255*4882a593Smuzhiyun #define CMD_PAGE_ALLOC 0x1 256*4882a593Smuzhiyun #define CMD_PAGE_DEALLOC 0x2 257*4882a593Smuzhiyun #define CMD_PART_DEALLOC 0x3 258*4882a593Smuzhiyun #define CMD_INQUIRY 0x5 259*4882a593Smuzhiyun #define CMD_COMPLETE (3 << 14) 260*4882a593Smuzhiyun #define PAGE_AVAILABLE 0 261*4882a593Smuzhiyun #define PAGE_OWNED (3 << 6) 262*4882a593Smuzhiyun #define PAGE(x) (x << 16) 263*4882a593Smuzhiyun #define PARTITION(x) (x << 8) 264*4882a593Smuzhiyun #define PARTITION_OWNER(x) (0x3 << (x*2)) 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun /* Address of secure 4kbyte pages */ 267*4882a593Smuzhiyun #define SEC_MEM_PAGE0 CAAM_ARB_BASE_ADDR 268*4882a593Smuzhiyun #define SEC_MEM_PAGE1 (CAAM_ARB_BASE_ADDR + 0x1000) 269*4882a593Smuzhiyun #define SEC_MEM_PAGE2 (CAAM_ARB_BASE_ADDR + 0x2000) 270*4882a593Smuzhiyun #define SEC_MEM_PAGE3 (CAAM_ARB_BASE_ADDR + 0x3000) 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun #define JR_MID 2 /* Matches ROM configuration */ 273*4882a593Smuzhiyun #define KS_G1 (1 << JR_MID) /* CAAM only */ 274*4882a593Smuzhiyun #define PERM 0x0000B008 /* Clear on release, lock SMAP 275*4882a593Smuzhiyun * lock SMAG group 1 Blob */ 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #define BLOB_SIZE(x) (x + 32 + 16) /* Blob buffer size */ 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun /* HAB WRAPPED KEY header */ 280*4882a593Smuzhiyun #define WRP_HDR_SIZE 0x08 281*4882a593Smuzhiyun #define HDR_TAG 0x81 282*4882a593Smuzhiyun #define HDR_PAR 0x41 283*4882a593Smuzhiyun /* HAB WRAPPED KEY Data */ 284*4882a593Smuzhiyun #define HAB_MOD 0x66 285*4882a593Smuzhiyun #define HAB_ALG 0x55 286*4882a593Smuzhiyun #define HAB_FLG 0x00 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* Partition and Page IDs */ 289*4882a593Smuzhiyun #define PARTITION_1 1 290*4882a593Smuzhiyun #define PAGE_1 1 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun #define ERROR_IN_PAGE_ALLOC 1 293*4882a593Smuzhiyun #define ECONSTRJDESC -1 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #endif 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /* blob_dek: 298*4882a593Smuzhiyun * Encapsulates the src in a secure blob and stores it dst 299*4882a593Smuzhiyun * @src: reference to the plaintext 300*4882a593Smuzhiyun * @dst: reference to the output adrress 301*4882a593Smuzhiyun * @len: size in bytes of src 302*4882a593Smuzhiyun * @return: 0 on success, error otherwise 303*4882a593Smuzhiyun */ 304*4882a593Smuzhiyun int blob_dek(const u8 *src, u8 *dst, u8 len); 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun #if defined(CONFIG_ARCH_C29X) 307*4882a593Smuzhiyun int sec_init_idx(uint8_t); 308*4882a593Smuzhiyun #endif 309*4882a593Smuzhiyun int sec_init(void); 310*4882a593Smuzhiyun #endif 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun #endif /* __FSL_SEC_H */ 313