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