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