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