summaryrefslogtreecommitdiffstats
path: root/include/drivers/nxp/trdc/imx_trdc.h
blob: 0b41fcf451ac444800b7fc9982010b359e49c717 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
 * Copyright 2022-2023 NXP
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef IMX_TRDC_H
#define IMX_XRDC_H

#define MBC_BLK_ALL	U(255)
#define MRC_REG_ALL	U(16)
#define GLBAC_NUM	U(8)

#define DID_NUM		U(16)
#define MBC_MAX_NUM	U(4)
#define MRC_MAX_NUM	U(2)
#define MBC_NUM(HWCFG)	(((HWCFG) >> 16) & 0xF)
#define MRC_NUM(HWCFG)	(((HWCFG) >> 24) & 0x1F)

#define MBC_BLK_NUM(GLBCFG)	((GLBCFG) & 0x3FF)
#define MRC_RGN_NUM(GLBCFG)	((GLBCFG) & 0x1F)

#define MDAC_W_X(m, r)	(0x800 + (m) * 0x20 + (r) * 0x4)

/* CPU/non-CPU domain common bits */
#define MDA_VLD		BIT(31)
#define MDA_LK1		BIT(30)
#define MDA_DFMT	BIT(29)

/* CPU domain bits */
#define MDA_DFMT0_DID(x)	((x) & 0xF)
#define MDA_DFMT0_DIDS(x)	(((x) & 0x3) << 4)
#define MDA_DFMT0_PE(x)		(((x) & 0x3) << 6)
#define MDA_DFMT0_PIDM(x)	(((x) & 0x3F) << 8)
#define MDA_DFMT0_SA(x)		(((x) & 0x3) << 14)
#define MDA_DFMT0_PID(x)	(((x) & 0x3F) << 16)

/* non-CPU domain bits */
#define MDA_DFMT1_DID(x)	((x) & 0xF)
#define MDA_DFMT1_PA(x)		(((x) & 0x3) << 4)
#define MDA_DFMT1_SA(x)		(((x) & 0x3) << 6)
#define MDA_DFMT1_DIDB(x)	((x) << 8)

#define SP(X)	((X) << 12)
#define SU(X)	((X) << 8)
#define NP(X)	((X) << 4)
#define NU(X)	((X) << 0)

#define RWX	U(7)
#define RW	U(6)
#define RX	U(5)
#define R	U(4)
#define X	U(1)

struct mbc_mem_dom {
	uint32_t mem_glbcfg[4];
	uint32_t nse_blk_index;
	uint32_t nse_blk_set;
	uint32_t nse_blk_clr;
	uint32_t nsr_blk_clr_all;
	uint32_t memn_glbac[8];
	/* The upper only existed in the beginning of each MBC */
	uint32_t mem0_blk_cfg_w[64];
	uint32_t mem0_blk_nse_w[16];
	uint32_t mem1_blk_cfg_w[8];
	uint32_t mem1_blk_nse_w[2];
	uint32_t mem2_blk_cfg_w[8];
	uint32_t mem2_blk_nse_w[2];
	uint32_t mem3_blk_cfg_w[8];
	uint32_t mem3_blk_nse_w[2]; /*0x1F0, 0x1F4 */
	uint32_t reserved[2];
};

struct mrc_rgn_dom {
	uint32_t mrc_glbcfg[4];
	uint32_t nse_rgn_indirect;
	uint32_t nse_rgn_set;
	uint32_t nse_rgn_clr;
	uint32_t nse_rgn_clr_all;
	uint32_t memn_glbac[8];
	/* The upper only existed in the beginning of each MRC */
	uint32_t rgn_desc_words[16][2]; /* 16 regions at max, 2 words per region */
	uint32_t rgn_nse;
	uint32_t reserved2[15];
};

struct mda_inst {
	uint32_t mda_w[8];
};

struct trdc_mgr {
	uint32_t trdc_cr;
	uint32_t res0[59];
	uint32_t trdc_hwcfg0;
	uint32_t trdc_hwcfg1;
	uint32_t res1[450];
	struct mda_inst mda[128];
};

struct trdc_mbc {
	struct mbc_mem_dom mem_dom[DID_NUM];
};

struct trdc_mrc {
	struct mrc_rgn_dom mrc_dom[DID_NUM];
};

/***************************************************************
 * Below structs used fro provding the TRDC configuration info
 * that will be used to init the TRDC based on use case.
 ***************************************************************/
struct trdc_glbac_config {
	uint8_t mbc_mrc_id;
	uint8_t glbac_id;
	uint32_t glbac_val;
};

struct trdc_mbc_config {
	uint8_t mbc_id;
	uint8_t dom_id;
	uint8_t mem_id;
	uint8_t blk_id;
	uint8_t glbac_id;
	bool secure;
};

struct trdc_mrc_config {
	uint8_t mrc_id;
	uint8_t dom_id;
	uint8_t region_id;
	uint32_t region_start;
	uint32_t region_size;
	uint8_t glbac_id;
	bool secure;
};

struct trdc_mgr_info {
	uintptr_t trdc_base;
	uint8_t mbc_id;
	uint8_t mbc_mem_id;
	uint8_t blk_mgr;
	uint8_t blk_mc;
};

struct trdc_config_info {
	uintptr_t trdc_base;
	struct trdc_glbac_config *mbc_glbac;
	uint32_t num_mbc_glbac;
	struct trdc_mbc_config *mbc_cfg;
	uint32_t num_mbc_cfg;
	struct trdc_glbac_config *mrc_glbac;
	uint32_t num_mrc_glbac;
	struct trdc_mrc_config *mrc_cfg;
	uint32_t num_mrc_cfg;
};

extern struct trdc_mgr_info trdc_mgr_blks[];
extern unsigned int trdc_mgr_num;
/* APIs to apply and enable TRDC */
int trdc_mda_set_cpu(uintptr_t trdc_base, uint32_t mda_inst,
		     uint32_t mda_reg, uint8_t sa, uint8_t dids,
		     uint8_t did, uint8_t pe, uint8_t pidm, uint8_t pid);

int trdc_mda_set_noncpu(uintptr_t trdc_base, uint32_t mda_inst,
			bool did_bypass, uint8_t sa, uint8_t pa,
			uint8_t did);

void trdc_mgr_mbc_setup(struct trdc_mgr_info *mgr);
void trdc_setup(struct trdc_config_info *cfg);
void trdc_config(void);

#endif /* IMX_TRDC_H */