1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-2018, 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_DMC500_H 8*91f16700Schasinglulu #define TZC_DMC500_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <drivers/arm/tzc_common.h> 11*91f16700Schasinglulu #include <lib/utils_def.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #define SI_STATUS_OFFSET U(0x000) 14*91f16700Schasinglulu #define SI_STATE_CTRL_OFFSET U(0x030) 15*91f16700Schasinglulu #define SI_FLUSH_CTRL_OFFSET U(0x034) 16*91f16700Schasinglulu #define SI_INT_CONTROL_OFFSET U(0x048) 17*91f16700Schasinglulu 18*91f16700Schasinglulu #define SI_INT_STATUS_OFFSET U(0x004) 19*91f16700Schasinglulu #define SI_TZ_FAIL_ADDRESS_LOW_OFFSET U(0x008) 20*91f16700Schasinglulu #define SI_TZ_FAIL_ADDRESS_HIGH_OFFSET U(0x00c) 21*91f16700Schasinglulu #define SI_FAIL_CONTROL_OFFSET U(0x010) 22*91f16700Schasinglulu #define SI_FAIL_ID_OFFSET U(0x014) 23*91f16700Schasinglulu #define SI_INT_CLR_OFFSET U(0x04c) 24*91f16700Schasinglulu 25*91f16700Schasinglulu /* 26*91f16700Schasinglulu * DMC-500 has 2 system interfaces each having a similar set of regs 27*91f16700Schasinglulu * to configure each interface. 28*91f16700Schasinglulu */ 29*91f16700Schasinglulu #define SI0_BASE U(0x0000) 30*91f16700Schasinglulu #define SI1_BASE U(0x0200) 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* Bit positions of SIx_SI_STATUS */ 33*91f16700Schasinglulu #define SI_EMPTY_SHIFT 1 34*91f16700Schasinglulu #define SI_STALL_ACK_SHIFT 0 35*91f16700Schasinglulu #define SI_EMPTY_MASK U(0x01) 36*91f16700Schasinglulu #define SI_STALL_ACK_MASK U(0x01) 37*91f16700Schasinglulu 38*91f16700Schasinglulu /* Bit positions of SIx_SI_INT_STATUS */ 39*91f16700Schasinglulu #define PMU_REQ_INT_OVERFLOW_STATUS_SHIFT 18 40*91f16700Schasinglulu #define FAILED_ACCESS_INT_OVERFLOW_STATUS_SHIFT 16 41*91f16700Schasinglulu #define PMU_REQ_INT_STATUS_SHIFT 2 42*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_TZ_OVERLAP_STATUS_SHIFT 1 43*91f16700Schasinglulu #define FAILED_ACCESS_INT_STATUS_SHIFT 0 44*91f16700Schasinglulu #define PMU_REQ_INT_OVERFLOW_STATUS_MASK U(0x1) 45*91f16700Schasinglulu #define FAILED_ACCESS_INT_OVERFLOW_STATUS_MASK U(0x1) 46*91f16700Schasinglulu #define PMU_REQ_INT_STATUS_MASK U(0x1) 47*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_TZ_OVERLAP_STATUS_MASK U(0x1) 48*91f16700Schasinglulu #define FAILED_ACCESS_INT_STATUS_MASK U(0x1) 49*91f16700Schasinglulu 50*91f16700Schasinglulu /* Bit positions of SIx_TZ_FAIL_CONTROL */ 51*91f16700Schasinglulu #define DIRECTION_SHIFT 24 52*91f16700Schasinglulu #define NON_SECURE_SHIFT 21 53*91f16700Schasinglulu #define PRIVILEGED_SHIFT 20 54*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_RANK_MASKED_SHIFT 3 55*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_UNMAPPED_SHIFT 2 56*91f16700Schasinglulu #define FAILED_ACCESS_INT_TZ_FAIL_SHIFT 1 57*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_OUTSIDE_DEFAULT_SHIFT 0 58*91f16700Schasinglulu #define DIRECTION_MASK U(0x1) 59*91f16700Schasinglulu #define NON_SECURE_MASK U(0x1) 60*91f16700Schasinglulu #define PRIVILEGED_MASK U(0x1) 61*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_RANK_MASKED_MASK U(0x1) 62*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_UNMAPPED_MASK U(0x1) 63*91f16700Schasinglulu #define FAILED_ACCESS_INT_TZ_FAIL_MASK U(0x1) 64*91f16700Schasinglulu #define FAILED_ACCESS_INT_INFO_OUTSIDE_DEFAULT_MASK U(0x1) 65*91f16700Schasinglulu 66*91f16700Schasinglulu /* Bit positions of SIx_FAIL_STATUS */ 67*91f16700Schasinglulu #define FAIL_ID_VNET_SHIFT 24 68*91f16700Schasinglulu #define FAIL_ID_ID_SHIFT 0 69*91f16700Schasinglulu #define FAIL_ID_VNET_MASK U(0xf) 70*91f16700Schasinglulu #define FAIL_ID_ID_MASK U(0xffffff) 71*91f16700Schasinglulu 72*91f16700Schasinglulu /* Bit positions of SIx_SI_STATE_CONTRL */ 73*91f16700Schasinglulu #define SI_STALL_REQ_GO 0x0 74*91f16700Schasinglulu #define SI_STALL_REQ_STALL 0x1 75*91f16700Schasinglulu 76*91f16700Schasinglulu /* Bit positions of SIx_SI_FLUSH_CONTROL */ 77*91f16700Schasinglulu #define SI_FLUSH_REQ_INACTIVE 0x0 78*91f16700Schasinglulu #define SI_FLUSH_REQ_ACTIVE 0x1 79*91f16700Schasinglulu #define SI_FLUSH_REQ_MASK 0x1 80*91f16700Schasinglulu 81*91f16700Schasinglulu /* Bit positions of SIx_SI_INT_CONTROL */ 82*91f16700Schasinglulu #define PMU_REQ_INT_EN_SHIFT 2 83*91f16700Schasinglulu #define OVERLAP_DETECT_INT_EN_SHIFT 1 84*91f16700Schasinglulu #define FAILED_ACCESS_INT_EN_SHIFT 0 85*91f16700Schasinglulu #define PMU_REQ_INT_EN_MASK U(0x1) 86*91f16700Schasinglulu #define OVERLAP_DETECT_INT_EN_MASK U(0x1) 87*91f16700Schasinglulu #define FAILED_ACCESS_INT_EN_MASK U(0x1) 88*91f16700Schasinglulu #define PMU_REQ_INT_EN U(0x1) 89*91f16700Schasinglulu #define OVERLAP_DETECT_INT_EN U(0x1) 90*91f16700Schasinglulu #define FAILED_ACCESS_INT_EN U(0x1) 91*91f16700Schasinglulu 92*91f16700Schasinglulu /* Bit positions of SIx_SI_INT_CLR */ 93*91f16700Schasinglulu #define PMU_REQ_OFLOW_CLR_SHIFT 18 94*91f16700Schasinglulu #define FAILED_ACCESS_OFLOW_CLR_SHIFT 16 95*91f16700Schasinglulu #define PMU_REQ_INT_CLR_SHIFT 2 96*91f16700Schasinglulu #define FAILED_ACCESS_INT_CLR_SHIFT 0 97*91f16700Schasinglulu #define PMU_REQ_OFLOW_CLR_MASK U(0x1) 98*91f16700Schasinglulu #define FAILED_ACCESS_OFLOW_CLR_MASK U(0x1) 99*91f16700Schasinglulu #define PMU_REQ_INT_CLR_MASK U(0x1) 100*91f16700Schasinglulu #define FAILED_ACCESS_INT_CLR_MASK U(0x1) 101*91f16700Schasinglulu #define PMU_REQ_OFLOW_CLR U(0x1) 102*91f16700Schasinglulu #define FAILED_ACCESS_OFLOW_CLR U(0x1) 103*91f16700Schasinglulu #define PMU_REQ_INT_CLR U(0x1) 104*91f16700Schasinglulu #define FAILED_ACCESS_INT_CLR U(0x1) 105*91f16700Schasinglulu 106*91f16700Schasinglulu /* Macro to get the correct base register for a system interface */ 107*91f16700Schasinglulu #define IFACE_OFFSET(sys_if) ((sys_if) ? SI1_BASE : SI0_BASE) 108*91f16700Schasinglulu 109*91f16700Schasinglulu #define MAX_SYS_IF_COUNT U(2) 110*91f16700Schasinglulu #define MAX_REGION_VAL 8 111*91f16700Schasinglulu 112*91f16700Schasinglulu /* DMC-500 supports striping across a max of 4 DMC instances */ 113*91f16700Schasinglulu #define MAX_DMC_COUNT 4 114*91f16700Schasinglulu 115*91f16700Schasinglulu /* Consist of part_number_1 and part_number_0 */ 116*91f16700Schasinglulu #define DMC500_PERIPHERAL_ID U(0x0450) 117*91f16700Schasinglulu 118*91f16700Schasinglulu /* Filter enable bits in a TZC */ 119*91f16700Schasinglulu #define TZC_DMC500_REGION_ATTR_F_EN_MASK U(0x1) 120*91f16700Schasinglulu 121*91f16700Schasinglulu /* Length of registers for configuring each region */ 122*91f16700Schasinglulu #define TZC_DMC500_REGION_SIZE U(0x018) 123*91f16700Schasinglulu 124*91f16700Schasinglulu #ifndef __ASSEMBLER__ 125*91f16700Schasinglulu 126*91f16700Schasinglulu #include <stdint.h> 127*91f16700Schasinglulu 128*91f16700Schasinglulu /* 129*91f16700Schasinglulu * Contains the base addresses of all the DMC instances. 130*91f16700Schasinglulu */ 131*91f16700Schasinglulu typedef struct tzc_dmc500_driver_data { 132*91f16700Schasinglulu uintptr_t dmc_base[MAX_DMC_COUNT]; 133*91f16700Schasinglulu int dmc_count; 134*91f16700Schasinglulu unsigned int sys_if_count; 135*91f16700Schasinglulu } tzc_dmc500_driver_data_t; 136*91f16700Schasinglulu 137*91f16700Schasinglulu void tzc_dmc500_driver_init(const tzc_dmc500_driver_data_t *plat_driver_data); 138*91f16700Schasinglulu void tzc_dmc500_configure_region0(unsigned int sec_attr, 139*91f16700Schasinglulu unsigned int nsaid_permissions); 140*91f16700Schasinglulu void tzc_dmc500_configure_region(unsigned int region_no, 141*91f16700Schasinglulu unsigned long long region_base, 142*91f16700Schasinglulu unsigned long long region_top, 143*91f16700Schasinglulu unsigned int sec_attr, 144*91f16700Schasinglulu unsigned int nsaid_permissions); 145*91f16700Schasinglulu void tzc_dmc500_set_action(unsigned int action); 146*91f16700Schasinglulu void tzc_dmc500_config_complete(void); 147*91f16700Schasinglulu int tzc_dmc500_verify_complete(void); 148*91f16700Schasinglulu 149*91f16700Schasinglulu 150*91f16700Schasinglulu #endif /* __ASSEMBLER__ */ 151*91f16700Schasinglulu #endif /* TZC_DMC500_H */ 152