1*9d3b191aSVijayenthiran Subramaniam /* 2*9d3b191aSVijayenthiran Subramaniam * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*9d3b191aSVijayenthiran Subramaniam * 4*9d3b191aSVijayenthiran Subramaniam * SPDX-License-Identifier: BSD-3-Clause 5*9d3b191aSVijayenthiran Subramaniam */ 6*9d3b191aSVijayenthiran Subramaniam 7*9d3b191aSVijayenthiran Subramaniam #ifndef TZC_DMC620_H 8*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_H 9*9d3b191aSVijayenthiran Subramaniam 10*9d3b191aSVijayenthiran Subramaniam #include <utils_def.h> 11*9d3b191aSVijayenthiran Subramaniam 12*9d3b191aSVijayenthiran Subramaniam /* DMC-620 memc register offsets */ 13*9d3b191aSVijayenthiran Subramaniam #define DMC620_MEMC_STATUS U(0x0000) 14*9d3b191aSVijayenthiran Subramaniam #define DMC620_MEMC_CMD U(0x0008) 15*9d3b191aSVijayenthiran Subramaniam 16*9d3b191aSVijayenthiran Subramaniam /* Mask value to check the status of memc_cmd register */ 17*9d3b191aSVijayenthiran Subramaniam #define DMC620_MEMC_CMD_MASK U(0x00000007) 18*9d3b191aSVijayenthiran Subramaniam 19*9d3b191aSVijayenthiran Subramaniam /* memc_cmd register's action values */ 20*9d3b191aSVijayenthiran Subramaniam #define DMC620_MEMC_CMD_GO U(0x00000003) 21*9d3b191aSVijayenthiran Subramaniam #define DMC620_MEMC_CMD_EXECUTE U(0x00000004) 22*9d3b191aSVijayenthiran Subramaniam 23*9d3b191aSVijayenthiran Subramaniam /* Address offsets of access address next region 0 registers */ 24*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MIN_31_00_NEXT_BASE U(0x0080) 25*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MIN_47_32_NEXT_BASE U(0x0084) 26*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MAX_31_00_NEXT_BASE U(0x0088) 27*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MAX_47_32_NEXT_BASE U(0x008c) 28*9d3b191aSVijayenthiran Subramaniam 29*9d3b191aSVijayenthiran Subramaniam /* Length of one block of access address next register region */ 30*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_NEXT_SIZE U(0x0010) 31*9d3b191aSVijayenthiran Subramaniam 32*9d3b191aSVijayenthiran Subramaniam /* Address offsets of access address next registers */ 33*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MIN_31_00_NEXT(region_no) \ 34*9d3b191aSVijayenthiran Subramaniam (DMC620_ACC_ADDR_MIN_31_00_NEXT_BASE + \ 35*9d3b191aSVijayenthiran Subramaniam (region_no * DMC620_ACC_ADDR_NEXT_SIZE)) 36*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MIN_47_32_NEXT(region_no) \ 37*9d3b191aSVijayenthiran Subramaniam (DMC620_ACC_ADDR_MIN_47_32_NEXT_BASE + \ 38*9d3b191aSVijayenthiran Subramaniam (region_no * DMC620_ACC_ADDR_NEXT_SIZE)) 39*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MAX_31_00_NEXT(region_no) \ 40*9d3b191aSVijayenthiran Subramaniam (DMC620_ACC_ADDR_MAX_31_00_NEXT_BASE + \ 41*9d3b191aSVijayenthiran Subramaniam (region_no * DMC620_ACC_ADDR_NEXT_SIZE)) 42*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_MAX_47_32_NEXT(region_no) \ 43*9d3b191aSVijayenthiran Subramaniam (DMC620_ACC_ADDR_MAX_47_32_NEXT_BASE + \ 44*9d3b191aSVijayenthiran Subramaniam (region_no * DMC620_ACC_ADDR_NEXT_SIZE)) 45*9d3b191aSVijayenthiran Subramaniam 46*9d3b191aSVijayenthiran Subramaniam /* Number of TZC address regions in DMC-620 */ 47*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_COUNT U(8) 48*9d3b191aSVijayenthiran Subramaniam /* Width of access address registers */ 49*9d3b191aSVijayenthiran Subramaniam #define DMC620_ACC_ADDR_WIDTH U(32) 50*9d3b191aSVijayenthiran Subramaniam 51*9d3b191aSVijayenthiran Subramaniam /* Peripheral ID registers offsets */ 52*9d3b191aSVijayenthiran Subramaniam #define DMC620_PERIPHERAL_ID_0 U(0x1fe0) 53*9d3b191aSVijayenthiran Subramaniam 54*9d3b191aSVijayenthiran Subramaniam /* Default values in id registers */ 55*9d3b191aSVijayenthiran Subramaniam #define DMC620_PERIPHERAL_ID_0_VALUE U(0x00000054) 56*9d3b191aSVijayenthiran Subramaniam 57*9d3b191aSVijayenthiran Subramaniam /* Secure access region attributes. */ 58*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_NS_RD U(0x00000001) 59*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_NS_WR U(0x00000002) 60*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_NS_RDWR \ 61*9d3b191aSVijayenthiran Subramaniam (TZC_DMC620_REGION_NS_RD | TZC_DMC620_REGION_NS_WR) 62*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_S_RD U(0x00000004) 63*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_S_WR U(0x00000008) 64*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_S_RDWR \ 65*9d3b191aSVijayenthiran Subramaniam (TZC_DMC620_REGION_S_RD | TZC_DMC620_REGION_S_WR) 66*9d3b191aSVijayenthiran Subramaniam #define TZC_DMC620_REGION_S_NS_RDWR \ 67*9d3b191aSVijayenthiran Subramaniam (TZC_DMC620_REGION_NS_RDWR | TZC_DMC620_REGION_S_RDWR) 68*9d3b191aSVijayenthiran Subramaniam 69*9d3b191aSVijayenthiran Subramaniam /* 70*9d3b191aSVijayenthiran Subramaniam * Contains pointer to the base addresses of all the DMC-620 instances. 71*9d3b191aSVijayenthiran Subramaniam * 'dmc_count' specifies the number of DMC base addresses contained in the 72*9d3b191aSVijayenthiran Subramaniam * array pointed to by dmc_base. 73*9d3b191aSVijayenthiran Subramaniam */ 74*9d3b191aSVijayenthiran Subramaniam typedef struct tzc_dmc620_driver_data { 75*9d3b191aSVijayenthiran Subramaniam const uintptr_t *dmc_base; 76*9d3b191aSVijayenthiran Subramaniam const unsigned int dmc_count; 77*9d3b191aSVijayenthiran Subramaniam } tzc_dmc620_driver_data_t; 78*9d3b191aSVijayenthiran Subramaniam 79*9d3b191aSVijayenthiran Subramaniam /* 80*9d3b191aSVijayenthiran Subramaniam * Contains region base, region top addresses and corresponding attributes 81*9d3b191aSVijayenthiran Subramaniam * for configuring TZC access region registers. 82*9d3b191aSVijayenthiran Subramaniam */ 83*9d3b191aSVijayenthiran Subramaniam typedef struct tzc_dmc620_acc_addr_data { 84*9d3b191aSVijayenthiran Subramaniam const unsigned long long region_base; 85*9d3b191aSVijayenthiran Subramaniam const unsigned long long region_top; 86*9d3b191aSVijayenthiran Subramaniam const unsigned int sec_attr; 87*9d3b191aSVijayenthiran Subramaniam } tzc_dmc620_acc_addr_data_t; 88*9d3b191aSVijayenthiran Subramaniam 89*9d3b191aSVijayenthiran Subramaniam /* 90*9d3b191aSVijayenthiran Subramaniam * Contains platform specific data for configuring TZC region base and 91*9d3b191aSVijayenthiran Subramaniam * region top address. 'acc_addr_count' specifies the number of 92*9d3b191aSVijayenthiran Subramaniam * valid entries in 'plat_acc_addr_data' array. 93*9d3b191aSVijayenthiran Subramaniam */ 94*9d3b191aSVijayenthiran Subramaniam typedef struct tzc_dmc620_config_data { 95*9d3b191aSVijayenthiran Subramaniam const tzc_dmc620_driver_data_t *plat_drv_data; 96*9d3b191aSVijayenthiran Subramaniam const tzc_dmc620_acc_addr_data_t *plat_acc_addr_data; 97*9d3b191aSVijayenthiran Subramaniam const uint8_t acc_addr_count; 98*9d3b191aSVijayenthiran Subramaniam } tzc_dmc620_config_data_t; 99*9d3b191aSVijayenthiran Subramaniam 100*9d3b191aSVijayenthiran Subramaniam /* Function prototypes */ 101*9d3b191aSVijayenthiran Subramaniam void arm_tzc_dmc620_setup(const tzc_dmc620_config_data_t *plat_config_data); 102*9d3b191aSVijayenthiran Subramaniam 103*9d3b191aSVijayenthiran Subramaniam #endif /* TZC_DMC620_H */ 104*9d3b191aSVijayenthiran Subramaniam 105