xref: /arm-trusted-firmware/include/drivers/nxp/trdc/imx_trdc.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2022-2023 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef IMX_TRDC_H
8*91f16700Schasinglulu #define IMX_XRDC_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #define MBC_BLK_ALL	U(255)
11*91f16700Schasinglulu #define MRC_REG_ALL	U(16)
12*91f16700Schasinglulu #define GLBAC_NUM	U(8)
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #define DID_NUM		U(16)
15*91f16700Schasinglulu #define MBC_MAX_NUM	U(4)
16*91f16700Schasinglulu #define MRC_MAX_NUM	U(2)
17*91f16700Schasinglulu #define MBC_NUM(HWCFG)	(((HWCFG) >> 16) & 0xF)
18*91f16700Schasinglulu #define MRC_NUM(HWCFG)	(((HWCFG) >> 24) & 0x1F)
19*91f16700Schasinglulu 
20*91f16700Schasinglulu #define MBC_BLK_NUM(GLBCFG)	((GLBCFG) & 0x3FF)
21*91f16700Schasinglulu #define MRC_RGN_NUM(GLBCFG)	((GLBCFG) & 0x1F)
22*91f16700Schasinglulu 
23*91f16700Schasinglulu #define MDAC_W_X(m, r)	(0x800 + (m) * 0x20 + (r) * 0x4)
24*91f16700Schasinglulu 
25*91f16700Schasinglulu /* CPU/non-CPU domain common bits */
26*91f16700Schasinglulu #define MDA_VLD		BIT(31)
27*91f16700Schasinglulu #define MDA_LK1		BIT(30)
28*91f16700Schasinglulu #define MDA_DFMT	BIT(29)
29*91f16700Schasinglulu 
30*91f16700Schasinglulu /* CPU domain bits */
31*91f16700Schasinglulu #define MDA_DFMT0_DID(x)	((x) & 0xF)
32*91f16700Schasinglulu #define MDA_DFMT0_DIDS(x)	(((x) & 0x3) << 4)
33*91f16700Schasinglulu #define MDA_DFMT0_PE(x)		(((x) & 0x3) << 6)
34*91f16700Schasinglulu #define MDA_DFMT0_PIDM(x)	(((x) & 0x3F) << 8)
35*91f16700Schasinglulu #define MDA_DFMT0_SA(x)		(((x) & 0x3) << 14)
36*91f16700Schasinglulu #define MDA_DFMT0_PID(x)	(((x) & 0x3F) << 16)
37*91f16700Schasinglulu 
38*91f16700Schasinglulu /* non-CPU domain bits */
39*91f16700Schasinglulu #define MDA_DFMT1_DID(x)	((x) & 0xF)
40*91f16700Schasinglulu #define MDA_DFMT1_PA(x)		(((x) & 0x3) << 4)
41*91f16700Schasinglulu #define MDA_DFMT1_SA(x)		(((x) & 0x3) << 6)
42*91f16700Schasinglulu #define MDA_DFMT1_DIDB(x)	((x) << 8)
43*91f16700Schasinglulu 
44*91f16700Schasinglulu #define SP(X)	((X) << 12)
45*91f16700Schasinglulu #define SU(X)	((X) << 8)
46*91f16700Schasinglulu #define NP(X)	((X) << 4)
47*91f16700Schasinglulu #define NU(X)	((X) << 0)
48*91f16700Schasinglulu 
49*91f16700Schasinglulu #define RWX	U(7)
50*91f16700Schasinglulu #define RW	U(6)
51*91f16700Schasinglulu #define RX	U(5)
52*91f16700Schasinglulu #define R	U(4)
53*91f16700Schasinglulu #define X	U(1)
54*91f16700Schasinglulu 
55*91f16700Schasinglulu struct mbc_mem_dom {
56*91f16700Schasinglulu 	uint32_t mem_glbcfg[4];
57*91f16700Schasinglulu 	uint32_t nse_blk_index;
58*91f16700Schasinglulu 	uint32_t nse_blk_set;
59*91f16700Schasinglulu 	uint32_t nse_blk_clr;
60*91f16700Schasinglulu 	uint32_t nsr_blk_clr_all;
61*91f16700Schasinglulu 	uint32_t memn_glbac[8];
62*91f16700Schasinglulu 	/* The upper only existed in the beginning of each MBC */
63*91f16700Schasinglulu 	uint32_t mem0_blk_cfg_w[64];
64*91f16700Schasinglulu 	uint32_t mem0_blk_nse_w[16];
65*91f16700Schasinglulu 	uint32_t mem1_blk_cfg_w[8];
66*91f16700Schasinglulu 	uint32_t mem1_blk_nse_w[2];
67*91f16700Schasinglulu 	uint32_t mem2_blk_cfg_w[8];
68*91f16700Schasinglulu 	uint32_t mem2_blk_nse_w[2];
69*91f16700Schasinglulu 	uint32_t mem3_blk_cfg_w[8];
70*91f16700Schasinglulu 	uint32_t mem3_blk_nse_w[2]; /*0x1F0, 0x1F4 */
71*91f16700Schasinglulu 	uint32_t reserved[2];
72*91f16700Schasinglulu };
73*91f16700Schasinglulu 
74*91f16700Schasinglulu struct mrc_rgn_dom {
75*91f16700Schasinglulu 	uint32_t mrc_glbcfg[4];
76*91f16700Schasinglulu 	uint32_t nse_rgn_indirect;
77*91f16700Schasinglulu 	uint32_t nse_rgn_set;
78*91f16700Schasinglulu 	uint32_t nse_rgn_clr;
79*91f16700Schasinglulu 	uint32_t nse_rgn_clr_all;
80*91f16700Schasinglulu 	uint32_t memn_glbac[8];
81*91f16700Schasinglulu 	/* The upper only existed in the beginning of each MRC */
82*91f16700Schasinglulu 	uint32_t rgn_desc_words[16][2]; /* 16 regions at max, 2 words per region */
83*91f16700Schasinglulu 	uint32_t rgn_nse;
84*91f16700Schasinglulu 	uint32_t reserved2[15];
85*91f16700Schasinglulu };
86*91f16700Schasinglulu 
87*91f16700Schasinglulu struct mda_inst {
88*91f16700Schasinglulu 	uint32_t mda_w[8];
89*91f16700Schasinglulu };
90*91f16700Schasinglulu 
91*91f16700Schasinglulu struct trdc_mgr {
92*91f16700Schasinglulu 	uint32_t trdc_cr;
93*91f16700Schasinglulu 	uint32_t res0[59];
94*91f16700Schasinglulu 	uint32_t trdc_hwcfg0;
95*91f16700Schasinglulu 	uint32_t trdc_hwcfg1;
96*91f16700Schasinglulu 	uint32_t res1[450];
97*91f16700Schasinglulu 	struct mda_inst mda[128];
98*91f16700Schasinglulu };
99*91f16700Schasinglulu 
100*91f16700Schasinglulu struct trdc_mbc {
101*91f16700Schasinglulu 	struct mbc_mem_dom mem_dom[DID_NUM];
102*91f16700Schasinglulu };
103*91f16700Schasinglulu 
104*91f16700Schasinglulu struct trdc_mrc {
105*91f16700Schasinglulu 	struct mrc_rgn_dom mrc_dom[DID_NUM];
106*91f16700Schasinglulu };
107*91f16700Schasinglulu 
108*91f16700Schasinglulu /***************************************************************
109*91f16700Schasinglulu  * Below structs used fro provding the TRDC configuration info
110*91f16700Schasinglulu  * that will be used to init the TRDC based on use case.
111*91f16700Schasinglulu  ***************************************************************/
112*91f16700Schasinglulu struct trdc_glbac_config {
113*91f16700Schasinglulu 	uint8_t mbc_mrc_id;
114*91f16700Schasinglulu 	uint8_t glbac_id;
115*91f16700Schasinglulu 	uint32_t glbac_val;
116*91f16700Schasinglulu };
117*91f16700Schasinglulu 
118*91f16700Schasinglulu struct trdc_mbc_config {
119*91f16700Schasinglulu 	uint8_t mbc_id;
120*91f16700Schasinglulu 	uint8_t dom_id;
121*91f16700Schasinglulu 	uint8_t mem_id;
122*91f16700Schasinglulu 	uint8_t blk_id;
123*91f16700Schasinglulu 	uint8_t glbac_id;
124*91f16700Schasinglulu 	bool secure;
125*91f16700Schasinglulu };
126*91f16700Schasinglulu 
127*91f16700Schasinglulu struct trdc_mrc_config {
128*91f16700Schasinglulu 	uint8_t mrc_id;
129*91f16700Schasinglulu 	uint8_t dom_id;
130*91f16700Schasinglulu 	uint8_t region_id;
131*91f16700Schasinglulu 	uint32_t region_start;
132*91f16700Schasinglulu 	uint32_t region_size;
133*91f16700Schasinglulu 	uint8_t glbac_id;
134*91f16700Schasinglulu 	bool secure;
135*91f16700Schasinglulu };
136*91f16700Schasinglulu 
137*91f16700Schasinglulu struct trdc_mgr_info {
138*91f16700Schasinglulu 	uintptr_t trdc_base;
139*91f16700Schasinglulu 	uint8_t mbc_id;
140*91f16700Schasinglulu 	uint8_t mbc_mem_id;
141*91f16700Schasinglulu 	uint8_t blk_mgr;
142*91f16700Schasinglulu 	uint8_t blk_mc;
143*91f16700Schasinglulu };
144*91f16700Schasinglulu 
145*91f16700Schasinglulu struct trdc_config_info {
146*91f16700Schasinglulu 	uintptr_t trdc_base;
147*91f16700Schasinglulu 	struct trdc_glbac_config *mbc_glbac;
148*91f16700Schasinglulu 	uint32_t num_mbc_glbac;
149*91f16700Schasinglulu 	struct trdc_mbc_config *mbc_cfg;
150*91f16700Schasinglulu 	uint32_t num_mbc_cfg;
151*91f16700Schasinglulu 	struct trdc_glbac_config *mrc_glbac;
152*91f16700Schasinglulu 	uint32_t num_mrc_glbac;
153*91f16700Schasinglulu 	struct trdc_mrc_config *mrc_cfg;
154*91f16700Schasinglulu 	uint32_t num_mrc_cfg;
155*91f16700Schasinglulu };
156*91f16700Schasinglulu 
157*91f16700Schasinglulu extern struct trdc_mgr_info trdc_mgr_blks[];
158*91f16700Schasinglulu extern unsigned int trdc_mgr_num;
159*91f16700Schasinglulu /* APIs to apply and enable TRDC */
160*91f16700Schasinglulu int trdc_mda_set_cpu(uintptr_t trdc_base, uint32_t mda_inst,
161*91f16700Schasinglulu 		     uint32_t mda_reg, uint8_t sa, uint8_t dids,
162*91f16700Schasinglulu 		     uint8_t did, uint8_t pe, uint8_t pidm, uint8_t pid);
163*91f16700Schasinglulu 
164*91f16700Schasinglulu int trdc_mda_set_noncpu(uintptr_t trdc_base, uint32_t mda_inst,
165*91f16700Schasinglulu 			bool did_bypass, uint8_t sa, uint8_t pa,
166*91f16700Schasinglulu 			uint8_t did);
167*91f16700Schasinglulu 
168*91f16700Schasinglulu void trdc_mgr_mbc_setup(struct trdc_mgr_info *mgr);
169*91f16700Schasinglulu void trdc_setup(struct trdc_config_info *cfg);
170*91f16700Schasinglulu void trdc_config(void);
171*91f16700Schasinglulu 
172*91f16700Schasinglulu #endif /* IMX_TRDC_H */
173