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
_tzc_read_peripheral_id(uintptr_t base)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