1239b085cSAntonio Nino Diaz /* 2*ce7ef9d1SLionel Debieve * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved. 3239b085cSAntonio Nino Diaz * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5239b085cSAntonio Nino Diaz */ 6239b085cSAntonio Nino Diaz 7af6491f8SAntonio Nino Diaz #ifndef TZC_COMMON_PRIVATE_H 8af6491f8SAntonio Nino Diaz #define TZC_COMMON_PRIVATE_H 9239b085cSAntonio Nino Diaz 10239b085cSAntonio Nino Diaz #include <arch.h> 11239b085cSAntonio Nino Diaz #include <arch_helpers.h> 1209d40e0eSAntonio Nino Diaz #include <drivers/arm/tzc_common.h> 1309d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 14239b085cSAntonio Nino Diaz 15239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_ACTION(fn_name, macro_name) \ 16239b085cSAntonio Nino Diaz static inline void _tzc##fn_name##_write_action( \ 17239b085cSAntonio Nino Diaz uintptr_t base, \ 18af6491f8SAntonio Nino Diaz unsigned int action) \ 19239b085cSAntonio Nino Diaz { \ 20239b085cSAntonio Nino Diaz mmio_write_32(base + TZC_##macro_name##_ACTION_OFF, \ 21239b085cSAntonio Nino Diaz action); \ 22239b085cSAntonio Nino Diaz } 23239b085cSAntonio Nino Diaz 24239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_BASE(fn_name, macro_name) \ 25239b085cSAntonio Nino Diaz static inline void _tzc##fn_name##_write_region_base( \ 26239b085cSAntonio Nino Diaz uintptr_t base, \ 27af6491f8SAntonio Nino Diaz unsigned int region_no, \ 28239b085cSAntonio Nino Diaz unsigned long long region_base) \ 29239b085cSAntonio Nino Diaz { \ 30239b085cSAntonio Nino Diaz mmio_write_32(base + \ 31239b085cSAntonio Nino Diaz TZC_REGION_OFFSET( \ 32239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_SIZE, \ 33d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 34239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_BASE_LOW_0_OFFSET, \ 35239b085cSAntonio Nino Diaz (uint32_t)region_base); \ 36239b085cSAntonio Nino Diaz mmio_write_32(base + \ 37239b085cSAntonio Nino Diaz TZC_REGION_OFFSET( \ 38239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_SIZE, \ 39d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 40239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_BASE_HIGH_0_OFFSET, \ 41239b085cSAntonio Nino Diaz (uint32_t)(region_base >> 32)); \ 42239b085cSAntonio Nino Diaz } 43239b085cSAntonio Nino Diaz 44239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_TOP(fn_name, macro_name) \ 45239b085cSAntonio Nino Diaz static inline void _tzc##fn_name##_write_region_top( \ 46239b085cSAntonio Nino Diaz uintptr_t base, \ 47af6491f8SAntonio Nino Diaz unsigned int region_no, \ 48239b085cSAntonio Nino Diaz unsigned long long region_top) \ 49239b085cSAntonio Nino Diaz { \ 50239b085cSAntonio Nino Diaz mmio_write_32(base + \ 51d7b5f408SJimmy Brisson TZC_REGION_OFFSET( \ 52d7b5f408SJimmy Brisson TZC_##macro_name##_REGION_SIZE, \ 53d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 54239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_TOP_LOW_0_OFFSET, \ 55239b085cSAntonio Nino Diaz (uint32_t)region_top); \ 56239b085cSAntonio Nino Diaz mmio_write_32(base + \ 57239b085cSAntonio Nino Diaz TZC_REGION_OFFSET( \ 58239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_SIZE, \ 59d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 60239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_TOP_HIGH_0_OFFSET, \ 61239b085cSAntonio Nino Diaz (uint32_t)(region_top >> 32)); \ 62239b085cSAntonio Nino Diaz } 63239b085cSAntonio Nino Diaz 64239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_ATTRIBUTES(fn_name, macro_name) \ 65239b085cSAntonio Nino Diaz static inline void _tzc##fn_name##_write_region_attributes( \ 66239b085cSAntonio Nino Diaz uintptr_t base, \ 67af6491f8SAntonio Nino Diaz unsigned int region_no, \ 68239b085cSAntonio Nino Diaz unsigned int attr) \ 69239b085cSAntonio Nino Diaz { \ 70239b085cSAntonio Nino Diaz mmio_write_32(base + \ 71239b085cSAntonio Nino Diaz TZC_REGION_OFFSET( \ 72239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_SIZE, \ 73d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 74239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_ATTR_0_OFFSET, \ 75239b085cSAntonio Nino Diaz attr); \ 76239b085cSAntonio Nino Diaz } 77239b085cSAntonio Nino Diaz 78239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_WRITE_REGION_ID_ACCESS(fn_name, macro_name) \ 79239b085cSAntonio Nino Diaz static inline void _tzc##fn_name##_write_region_id_access( \ 80239b085cSAntonio Nino Diaz uintptr_t base, \ 81af6491f8SAntonio Nino Diaz unsigned int region_no, \ 82239b085cSAntonio Nino Diaz unsigned int val) \ 83239b085cSAntonio Nino Diaz { \ 84239b085cSAntonio Nino Diaz mmio_write_32(base + \ 85239b085cSAntonio Nino Diaz TZC_REGION_OFFSET( \ 86239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_SIZE, \ 87d7b5f408SJimmy Brisson (u_register_t)region_no) + \ 88239b085cSAntonio Nino Diaz TZC_##macro_name##_REGION_ID_ACCESS_0_OFFSET, \ 89239b085cSAntonio Nino Diaz val); \ 90239b085cSAntonio Nino Diaz } 91239b085cSAntonio Nino Diaz 92239b085cSAntonio Nino Diaz /* 93*ce7ef9d1SLionel Debieve * It is used to modify the filters status for a defined region. 94*ce7ef9d1SLionel Debieve */ 95*ce7ef9d1SLionel Debieve #define DEFINE_TZC_COMMON_UPDATE_FILTERS(fn_name, macro_name) \ 96*ce7ef9d1SLionel Debieve static inline void _tzc##fn_name##_update_filters( \ 97*ce7ef9d1SLionel Debieve uintptr_t base, \ 98*ce7ef9d1SLionel Debieve unsigned int region_no, \ 99*ce7ef9d1SLionel Debieve unsigned int nbfilters, \ 100*ce7ef9d1SLionel Debieve unsigned int filters) \ 101*ce7ef9d1SLionel Debieve { \ 102*ce7ef9d1SLionel Debieve uint32_t filters_mask = GENMASK(nbfilters - 1U, 0); \ 103*ce7ef9d1SLionel Debieve \ 104*ce7ef9d1SLionel Debieve mmio_clrsetbits_32(base + \ 105*ce7ef9d1SLionel Debieve TZC_REGION_OFFSET( \ 106*ce7ef9d1SLionel Debieve TZC_##macro_name##_REGION_SIZE, \ 107*ce7ef9d1SLionel Debieve region_no) + \ 108*ce7ef9d1SLionel Debieve TZC_##macro_name##_REGION_ATTR_0_OFFSET, \ 109*ce7ef9d1SLionel Debieve filters_mask << TZC_REGION_ATTR_F_EN_SHIFT, \ 110*ce7ef9d1SLionel Debieve filters << TZC_REGION_ATTR_F_EN_SHIFT); \ 111*ce7ef9d1SLionel Debieve } 112*ce7ef9d1SLionel Debieve 113*ce7ef9d1SLionel Debieve /* 114239b085cSAntonio Nino Diaz * It is used to program region 0 ATTRIBUTES and ACCESS register. 115239b085cSAntonio Nino Diaz */ 116239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_CONFIGURE_REGION0(fn_name) \ 1171af540efSRoberto Vargas static void _tzc##fn_name##_configure_region0(uintptr_t base, \ 118af6491f8SAntonio Nino Diaz unsigned int sec_attr, \ 119239b085cSAntonio Nino Diaz unsigned int ns_device_access) \ 120239b085cSAntonio Nino Diaz { \ 121af6491f8SAntonio Nino Diaz assert(base != 0U); \ 122239b085cSAntonio Nino Diaz VERBOSE("TrustZone : Configuring region 0 " \ 123af6491f8SAntonio Nino Diaz "(TZC Interface Base=0x%lx sec_attr=0x%x," \ 124af6491f8SAntonio Nino Diaz " ns_devs=0x%x)\n", base, \ 125239b085cSAntonio Nino Diaz sec_attr, ns_device_access); \ 126239b085cSAntonio Nino Diaz \ 127239b085cSAntonio Nino Diaz /* Set secure attributes on region 0 */ \ 128239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_attributes(base, 0, \ 129239b085cSAntonio Nino Diaz sec_attr << TZC_REGION_ATTR_SEC_SHIFT); \ 130239b085cSAntonio Nino Diaz \ 131239b085cSAntonio Nino Diaz /***************************************************/ \ 132239b085cSAntonio Nino Diaz /* Specify which non-secure devices have permission*/ \ 133239b085cSAntonio Nino Diaz /* to access region 0. */ \ 134239b085cSAntonio Nino Diaz /***************************************************/ \ 135239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_id_access(base, \ 136239b085cSAntonio Nino Diaz 0, \ 137239b085cSAntonio Nino Diaz ns_device_access); \ 138239b085cSAntonio Nino Diaz } 139239b085cSAntonio Nino Diaz 140239b085cSAntonio Nino Diaz /* 141239b085cSAntonio Nino Diaz * It is used to program a region from 1 to 8 in the TrustZone controller. 142239b085cSAntonio Nino Diaz * NOTE: 143239b085cSAntonio Nino Diaz * Region 0 is special; it is preferable to use 144239b085cSAntonio Nino Diaz * ##fn_name##_configure_region0 for this region (see comment for 145239b085cSAntonio Nino Diaz * that function). 146239b085cSAntonio Nino Diaz */ 147239b085cSAntonio Nino Diaz #define DEFINE_TZC_COMMON_CONFIGURE_REGION(fn_name) \ 1481af540efSRoberto Vargas static void _tzc##fn_name##_configure_region(uintptr_t base, \ 149239b085cSAntonio Nino Diaz unsigned int filters, \ 150af6491f8SAntonio Nino Diaz unsigned int region_no, \ 151239b085cSAntonio Nino Diaz unsigned long long region_base, \ 152239b085cSAntonio Nino Diaz unsigned long long region_top, \ 153af6491f8SAntonio Nino Diaz unsigned int sec_attr, \ 154239b085cSAntonio Nino Diaz unsigned int nsaid_permissions) \ 155239b085cSAntonio Nino Diaz { \ 156af6491f8SAntonio Nino Diaz assert(base != 0U); \ 157239b085cSAntonio Nino Diaz VERBOSE("TrustZone : Configuring region " \ 158af6491f8SAntonio Nino Diaz "(TZC Interface Base: 0x%lx, region_no = %u)" \ 159af6491f8SAntonio Nino Diaz "...\n", base, region_no); \ 160239b085cSAntonio Nino Diaz VERBOSE("TrustZone : ... base = %llx, top = %llx," \ 161239b085cSAntonio Nino Diaz "\n", region_base, region_top); \ 162239b085cSAntonio Nino Diaz VERBOSE("TrustZone : ... sec_attr = 0x%x," \ 163239b085cSAntonio Nino Diaz " ns_devs = 0x%x)\n", \ 164239b085cSAntonio Nino Diaz sec_attr, nsaid_permissions); \ 165239b085cSAntonio Nino Diaz \ 166239b085cSAntonio Nino Diaz /***************************************************/ \ 167239b085cSAntonio Nino Diaz /* Inputs look ok, start programming registers. */ \ 168239b085cSAntonio Nino Diaz /* All the address registers are 32 bits wide and */ \ 169239b085cSAntonio Nino Diaz /* have a LOW and HIGH */ \ 170239b085cSAntonio Nino Diaz /* component used to construct an address up to a */ \ 171239b085cSAntonio Nino Diaz /* 64bit. */ \ 172239b085cSAntonio Nino Diaz /***************************************************/ \ 173239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_base(base, \ 174239b085cSAntonio Nino Diaz region_no, region_base); \ 175239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_top(base, \ 176239b085cSAntonio Nino Diaz region_no, region_top); \ 177239b085cSAntonio Nino Diaz \ 178239b085cSAntonio Nino Diaz /* Enable filter to the region and set secure attributes */\ 179239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_attributes(base, \ 180239b085cSAntonio Nino Diaz region_no, \ 181239b085cSAntonio Nino Diaz (sec_attr << TZC_REGION_ATTR_SEC_SHIFT) |\ 182239b085cSAntonio Nino Diaz (filters << TZC_REGION_ATTR_F_EN_SHIFT));\ 183239b085cSAntonio Nino Diaz \ 184239b085cSAntonio Nino Diaz /***************************************************/ \ 185239b085cSAntonio Nino Diaz /* Specify which non-secure devices have permission*/ \ 186239b085cSAntonio Nino Diaz /* to access this region. */ \ 187239b085cSAntonio Nino Diaz /***************************************************/ \ 188239b085cSAntonio Nino Diaz _tzc##fn_name##_write_region_id_access(base, \ 189239b085cSAntonio Nino Diaz region_no, \ 190239b085cSAntonio Nino Diaz nsaid_permissions); \ 191239b085cSAntonio Nino Diaz } 192239b085cSAntonio Nino Diaz 193239b085cSAntonio Nino Diaz static inline unsigned int _tzc_read_peripheral_id(uintptr_t base) 194239b085cSAntonio Nino Diaz { 195239b085cSAntonio Nino Diaz unsigned int id; 196239b085cSAntonio Nino Diaz 197239b085cSAntonio Nino Diaz id = mmio_read_32(base + PID0_OFF); 198239b085cSAntonio Nino Diaz /* Masks DESC part in PID1 */ 199af6491f8SAntonio Nino Diaz id |= ((mmio_read_32(base + PID1_OFF) & 0xFU) << 8U); 200239b085cSAntonio Nino Diaz 201239b085cSAntonio Nino Diaz return id; 202239b085cSAntonio Nino Diaz } 203239b085cSAntonio Nino Diaz 204af6491f8SAntonio Nino Diaz #endif /* TZC_COMMON_PRIVATE_H */ 205