1
2
3
4
5
6
7
8
9#ifndef __FSL_SEC_H
10#define __FSL_SEC_H
11
12#include <common.h>
13#include <asm/io.h>
14
15#ifdef CONFIG_SYS_FSL_SEC_LE
16#define sec_in32(a) in_le32((ulong *)(ulong)a)
17#define sec_out32(a, v) out_le32((ulong *)(ulong)a, v)
18#define sec_in16(a) in_le16(a)
19#define sec_clrbits32 clrbits_le32
20#define sec_setbits32 setbits_le32
21#elif defined(CONFIG_SYS_FSL_SEC_BE)
22#define sec_in32(a) in_be32(a)
23#define sec_out32(a, v) out_be32(a, v)
24#define sec_in16(a) in_be16(a)
25#define sec_clrbits32 clrbits_be32
26#define sec_setbits32 setbits_be32
27#elif defined(CONFIG_SYS_FSL_HAS_SEC)
28#error Neither CONFIG_SYS_FSL_SEC_LE nor CONFIG_SYS_FSL_SEC_BE is defined
29#endif
30
31#define BLOB_SIZE(x) ((x) + 32 + 16)
32
33
34#if CONFIG_SYS_FSL_SEC_COMPAT >= 4
35
36struct rng4tst {
37#define RTMCTL_PRGM 0x00010000
38#define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_SC 0
39
40
41#define RTMCTL_SAMP_MODE_RAW_ES_SC 1
42
43
44#define RTMCTL_SAMP_MODE_VON_NEUMANN_ES_RAW_SC 2
45
46
47#define RTMCTL_SAMP_MODE_INVALID 3
48 u32 rtmctl;
49 u32 rtscmisc;
50 u32 rtpkrrng;
51#define RTSDCTL_ENT_DLY_MIN 3200
52#define RTSDCTL_ENT_DLY_MAX 12800
53 union {
54 u32 rtpkrmax;
55 u32 rtpkrsq;
56 };
57#define RTSDCTL_ENT_DLY_SHIFT 16
58#define RTSDCTL_ENT_DLY_MASK (0xffff << RTSDCTL_ENT_DLY_SHIFT)
59 u32 rtsdctl;
60 union {
61 u32 rtsblim;
62 u32 rttotsam;
63 };
64 u32 rtfreqmin;
65#define RTFRQMAX_DISABLE (1 << 20)
66 union {
67 u32 rtfreqmax;
68 u32 rtfreqcnt;
69 };
70 u32 rsvd1[40];
71#define RDSTA_IF(idx) (0x00000001 << (idx))
72#define RDSTA_PR(idx) (0x00000010 << (idx))
73#define RDSTA_MASK (RDSTA_PR(1) | RDSTA_PR(0) | RDSTA_IF(1) | RDSTA_IF(0))
74#define RDSTA_SKVN 0x40000000
75 u32 rdsta;
76 u32 rsvd2[15];
77};
78
79
80struct version_regs {
81 u32 crca;
82 u32 afha;
83 u32 kfha;
84 u32 pkha;
85 u32 aesa;
86 u32 mdha;
87 u32 desa;
88 u32 snw8a;
89 u32 snw9a;
90 u32 zuce;
91 u32 zuca;
92 u32 ccha;
93 u32 ptha;
94 u32 rng;
95 u32 trng;
96 u32 aaha;
97 u32 rsvd[10];
98 u32 sr;
99 u32 dma;
100 u32 ai;
101 u32 qi;
102 u32 jr;
103 u32 deco;
104};
105
106#define CHA_VER_NUM_MASK 0x000000ff
107#define CHA_VER_MISC_SHIFT 8
108#define CHA_VER_MISC_MASK 0x0000ff00
109#define CHA_VER_REV_SHIFT 16
110#define CHA_VER_REV_MASK 0x00ff0000
111#define CHA_VER_VID_SHIFT 24
112#define CHA_VER_VID_MASK 0xff000000
113
114typedef struct ccsr_sec {
115 u32 res0;
116 u32 mcfgr;
117 u8 res1[0x4];
118 u32 scfgr;
119 struct {
120 u32 ms;
121 u32 ls;
122 } jrliodnr[4];
123 u8 res2[0x2c];
124 u32 jrstartr;
125 struct {
126 u32 ms;
127 u32 ls;
128 } rticliodnr[4];
129 u8 res3[0x1c];
130 u32 decorr;
131 struct {
132 u32 ms;
133 u32 ls;
134 } decoliodnr[16];
135 u32 dar;
136 u32 drr;
137 u8 res5[0x4d8];
138 struct rng4tst rng;
139 u8 res6[0x780];
140 struct version_regs vreg;
141 u8 res7[0xa0];
142 u32 crnr_ms;
143 u32 crnr_ls;
144 u32 ctpr_ms;
145 u32 ctpr_ls;
146 u8 res8[0x10];
147 u32 far_ms;
148 u32 far_ls;
149 u32 falr;
150 u32 fadr;
151 u8 res9[0x4];
152 u32 csta;
153 u32 smpart;
154 u32 smvid;
155 u32 rvid;
156 u32 ccbvid;
157 u32 chavid_ms;
158 u32 chavid_ls;
159 u32 chanum_ms;
160 u32 chanum_ls;
161 u32 secvid_ms;
162 u32 secvid_ls;
163#if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3)
164 u8 res10[0x6f020];
165#else
166 u8 res10[0x6020];
167#endif
168 u32 qilcr_ms;
169 u32 qilcr_ls;
170#if defined(CONFIG_FSL_LSCH2) || defined(CONFIG_FSL_LSCH3)
171 u8 res11[0x8ffd8];
172#else
173 u8 res11[0x8fd8];
174#endif
175} ccsr_sec_t;
176
177#define SEC_CTPR_MS_AXI_LIODN 0x08000000
178#define SEC_CTPR_MS_QI 0x02000000
179#define SEC_CTPR_MS_VIRT_EN_INCL 0x00000001
180#define SEC_CTPR_MS_VIRT_EN_POR 0x00000002
181#define SEC_RVID_MA 0x0f000000
182#define SEC_CHANUM_MS_JRNUM_MASK 0xf0000000
183#define SEC_CHANUM_MS_JRNUM_SHIFT 28
184#define SEC_CHANUM_MS_DECONUM_MASK 0x0f000000
185#define SEC_CHANUM_MS_DECONUM_SHIFT 24
186#define SEC_SECVID_MS_IPID_MASK 0xffff0000
187#define SEC_SECVID_MS_IPID_SHIFT 16
188#define SEC_SECVID_MS_MAJ_REV_MASK 0x0000ff00
189#define SEC_SECVID_MS_MAJ_REV_SHIFT 8
190#define SEC_CCBVID_ERA_MASK 0xff000000
191#define SEC_CCBVID_ERA_SHIFT 24
192#define SEC_SCFGR_RDBENABLE 0x00000400
193#define SEC_SCFGR_VIRT_EN 0x00008000
194#define SEC_CHAVID_LS_RNG_SHIFT 16
195#define SEC_CHAVID_RNG_LS_MASK 0x000f0000
196
197#define CONFIG_JRSTARTR_JR0 0x00000001
198
199struct jr_regs {
200#if defined(CONFIG_SYS_FSL_SEC_LE) && \
201 !(defined(CONFIG_MX6) || defined(CONFIG_MX7) || \
202 defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8M))
203 u32 irba_l;
204 u32 irba_h;
205#else
206 u32 irba_h;
207 u32 irba_l;
208#endif
209 u32 rsvd1;
210 u32 irs;
211 u32 rsvd2;
212 u32 irsa;
213 u32 rsvd3;
214 u32 irja;
215#if defined(CONFIG_SYS_FSL_SEC_LE) && \
216 !(defined(CONFIG_MX6) || defined(CONFIG_MX7) || \
217 defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8M))
218 u32 orba_l;
219 u32 orba_h;
220#else
221 u32 orba_h;
222 u32 orba_l;
223#endif
224 u32 rsvd4;
225 u32 ors;
226 u32 rsvd5;
227 u32 orjr;
228 u32 rsvd6;
229 u32 orsf;
230 u32 rsvd7;
231 u32 jrsta;
232 u32 rsvd8;
233 u32 jrint;
234 u32 jrcfg0;
235 u32 jrcfg1;
236 u32 rsvd9;
237 u32 irri;
238 u32 rsvd10;
239 u32 orwi;
240 u32 rsvd11;
241 u32 jrcr;
242};
243
244
245
246
247
248struct sg_entry {
249#if defined(CONFIG_SYS_FSL_SEC_LE) && \
250 !(defined(CONFIG_MX6) || defined(CONFIG_MX7) || \
251 defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8M))
252 uint32_t addr_lo;
253 uint32_t addr_hi;
254#else
255 uint32_t addr_hi;
256 uint32_t addr_lo;
257#endif
258
259 uint32_t len_flag;
260#define SG_ENTRY_LENGTH_MASK 0x3FFFFFFF
261#define SG_ENTRY_EXTENSION_BIT 0x80000000
262#define SG_ENTRY_FINAL_BIT 0x40000000
263 uint32_t bpid_offset;
264#define SG_ENTRY_BPID_MASK 0x00FF0000
265#define SG_ENTRY_BPID_SHIFT 16
266#define SG_ENTRY_OFFSET_MASK 0x00001FFF
267#define SG_ENTRY_OFFSET_SHIFT 0
268};
269
270#if defined(CONFIG_MX6) || defined(CONFIG_MX7) || \
271 defined(CONFIG_MX7ULP) || defined(CONFIG_IMX8M)
272
273#define JR_BASE_ADDR(x) (CONFIG_SYS_FSL_SEC_ADDR + 0x1000 * (x + 1))
274
275#define SM_V1_OFFSET 0x0f4
276#define SM_V2_OFFSET 0xa00
277
278#define SMVID_V2 0x20105
279#define SM_VERSION(x) ({typeof(x) _x = x; \
280 _x < SMVID_V2 ? 1 : (_x < 0x20300 ? 2 : 3); })
281#define SM_OFFSET(x) (x == 1 ? SM_V1_OFFSET : SM_V2_OFFSET)
282
283
284#define SMCSJR_PO (3 << 6)
285
286#define SMCSJR_AERR (3 << 12)
287
288#define CAAM_SMPO_0 (CONFIG_SYS_FSL_SEC_ADDR + 0x1FBC)
289
290#define CAAM_SMCJR(v, jr) (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_CMD(v))
291
292#define CAAM_SMCSJR(v, jr) (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_STATUS(v))
293
294#define CAAM_SMAPJR(v, jr, y) \
295 (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_PERM(v) + y * 16)
296
297#define CAAM_SMAG2JR(v, jr, y) \
298 (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_GROUP2(v) + y * 16)
299
300#define CAAM_SMAG1JR(v, jr, y) \
301 (JR_BASE_ADDR(jr) + SM_OFFSET(v) + SM_GROUP1(v) + y * 16)
302
303
304#define SM_CMD(v) (v == 1 ? 0x0 : 0x1E4)
305#define SM_STATUS(v) (v == 1 ? 0x8 : 0x1EC)
306#define SM_PERM(v) (v == 1 ? 0x10 : 0x4)
307#define SM_GROUP2(v) ({typeof(v) _v = v; \
308 _v == 1 ? 0x14 : (_v == 2 ? 0x8 : 0xC); })
309#define SM_GROUP1(v) ({typeof(v) _v = v; \
310 _v == 1 ? 0x18 : (_v == 2 ? 0xC : 0x8); })
311#define CMD_PAGE_ALLOC 0x1
312#define CMD_PAGE_DEALLOC 0x2
313#define CMD_PART_DEALLOC 0x3
314#define CMD_INQUIRY 0x5
315#define CMD_COMPLETE (3 << 14)
316#define PAGE_AVAILABLE 0
317#define PAGE_OWNED (3 << 6)
318#define PAGE(x) (x << 16)
319#define PARTITION(x) (x << 8)
320#define PARTITION_OWNER(x) (0x3 << (x*2))
321
322
323#define SEC_MEM_PAGE0 CAAM_ARB_BASE_ADDR
324#define SEC_MEM_PAGE1 (CAAM_ARB_BASE_ADDR + 0x1000)
325#define SEC_MEM_PAGE2 (CAAM_ARB_BASE_ADDR + 0x2000)
326#define SEC_MEM_PAGE3 (CAAM_ARB_BASE_ADDR + 0x3000)
327
328#ifdef CONFIG_IMX8M
329#define JR_MID (1)
330#define KS_G1 (0x10000 << JR_MID)
331#define PERM (0xB080)
332#else
333#define JR_MID (2)
334#define KS_G1 BIT(JR_MID)
335#define PERM (0xB008)
336#endif
337
338
339#define WRP_HDR_SIZE 0x08
340#define HDR_TAG 0x81
341#define HDR_PAR 0x41
342
343#define HAB_MOD 0x66
344#define HAB_ALG 0x55
345#define HAB_FLG 0x00
346
347
348#define PARTITION_1 1
349#define PAGE_1 1
350
351#define ERROR_IN_PAGE_ALLOC 1
352#define ECONSTRJDESC -1
353
354#endif
355
356#define FSL_CAAM_MP_PUBK_BYTES 64
357#define FSL_CAAM_MP_PRVK_BYTES 32
358#define FSL_CAAM_MP_MES_DGST_BYTES 32
359
360#define FSL_CAAM_ORSR_JRa_OFFSET 0x102c
361#define FSL_CAAM_MAX_JR_SIZE 4
362
363
364
365
366
367
368
369
370int blob_dek(const u8 *src, u8 *dst, u8 len);
371
372int gen_mppubk(u8 *dst);
373
374int sign_mppubk(const u8 *m, int data_size, u8 *dgst, u8 *c, u8 *d);
375
376#if defined(CONFIG_ARCH_C29X)
377int sec_init_idx(uint8_t);
378#endif
379int sec_init(void);
380
381u8 caam_get_era(void);
382#endif
383
384#endif
385