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