1 /*
2 * Copyright (c) 2015, Freescale Semiconductor, Inc.
3 * Copyright 2016-2017 NXP
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #include "fsl_xrdc.h"
10
11 /*******************************************************************************
12 * Definitions
13 ******************************************************************************/
14
15 #define XRDC_DERR_W1_EST_VAL(w1) ((w1 & XRDC_DERR_W_EST_MASK) >> XRDC_DERR_W_EST_SHIFT)
16 #define XRDC_DERR_W1_EPORT_VAL(w1) ((w1 & XRDC_DERR_W_EPORT_MASK) >> XRDC_DERR_W_EPORT_SHIFT)
17 #define XRDC_DERR_W1_ERW_VAL(w1) ((w1 & XRDC_DERR_W_ERW_MASK) >> XRDC_DERR_W_ERW_SHIFT)
18 #define XRDC_DERR_W1_EATR_VAL(w1) ((w1 & XRDC_DERR_W_EATR_MASK) >> XRDC_DERR_W_EATR_SHIFT)
19 #define XRDC_DERR_W1_EDID_VAL(w1) ((w1 & XRDC_DERR_W_EDID_MASK) >> XRDC_DERR_W_EDID_SHIFT)
20
21 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_DXACP) && FSL_FEATURE_XRDC_NO_MRGD_DXACP)
22 #define XRDC_MRGD_DXACP_WIDTH (3U) /* The width of XRDC_MRDG_DxACP. */
23 #elif(defined(FSL_FEATURE_XRDC_HAS_MRGD_DXSEL) && FSL_FEATURE_XRDC_HAS_MRGD_DXSEL)
24 #define XRDC_MRGD_DXSEL_WIDTH (3U) /* The width of XRDC_MRDG_DxSEL. */
25 #endif
26 #define XRDC_PDAC_DXACP_WIDTH (3U) /* The width of XRDC_PDAC_DxACP. */
27
28 /* For the force exclusive accesss lock release procedure. */
29 #define XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL1 (0x02000046U) /* The width of XRDC_MRDG_DxACP. */
30 #define XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL2 (0x02000052U) /* The width of XRDC_PDAC_DxACP. */
31
32 /*******************************************************************************
33 * Variables
34 ******************************************************************************/
35 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
36 /* Clock name of XRDC. */
37 #if (FSL_CLOCK_XRDC_GATE_COUNT > 1)
38 static const clock_ip_name_t s_xrdcClock[] = XRDC_CLOCKS;
39 #endif
40 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
41
42 /*******************************************************************************
43 * Code
44 ******************************************************************************/
45
46 #if (((__CORTEX_M == 0U) && (defined(__ICCARM__))) || defined(__riscv))
47 /*!
48 * @brief Count the leading zeros.
49 *
50 * Count the leading zeros of an 32-bit data. This function is only defined
51 * for CM0 and CM0+ for IAR, because other cortex series have the clz instruction,
52 * KEIL and ARMGCC have toolchain build in function for this purpose.
53 *
54 * @param data The data to process.
55 * @return Count of the leading zeros.
56 */
XRDC_CountLeadingZeros(uint32_t data)57 static uint32_t XRDC_CountLeadingZeros(uint32_t data)
58 {
59 uint32_t count = 0U;
60 uint32_t mask = 0x80000000U;
61
62 while ((data & mask) == 0U)
63 {
64 count++;
65 mask >>= 1U;
66 }
67
68 return count;
69 }
70 #endif
71
XRDC_Init(XRDC_Type * base)72 void XRDC_Init(XRDC_Type *base)
73 {
74 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
75
76 #if FSL_CLOCK_XRDC_GATE_COUNT
77 #if (FSL_CLOCK_XRDC_GATE_COUNT == 1)
78 CLOCK_EnableClock(kCLOCK_Xrdc0);
79 #else
80 uint8_t i;
81
82 for (i = 0; i < ARRAY_SIZE(s_xrdcClock); i++)
83 {
84 CLOCK_EnableClock(s_xrdcClock[i]);
85 }
86 #endif
87 #endif
88
89 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
90 }
91
XRDC_Deinit(XRDC_Type * base)92 void XRDC_Deinit(XRDC_Type *base)
93 {
94 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
95
96 #if FSL_CLOCK_XRDC_GATE_COUNT
97 #if (FSL_CLOCK_XRDC_GATE_COUNT == 1)
98 CLOCK_EnableClock(kCLOCK_Xrdc0);
99 #else
100 uint8_t i;
101
102 for (i = 0; i < ARRAY_SIZE(s_xrdcClock); i++)
103 {
104 CLOCK_DisableClock(s_xrdcClock[i]);
105 }
106 #endif
107 #endif
108
109 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
110 }
111
XRDC_GetHardwareConfig(XRDC_Type * base,xrdc_hardware_config_t * config)112 void XRDC_GetHardwareConfig(XRDC_Type *base, xrdc_hardware_config_t *config)
113 {
114 assert(config);
115
116 config->masterNumber = ((base->HWCFG0 & XRDC_HWCFG0_NMSTR_MASK) >> XRDC_HWCFG0_NMSTR_SHIFT) + 1U;
117 config->domainNumber = ((base->HWCFG0 & XRDC_HWCFG0_NDID_MASK) >> XRDC_HWCFG0_NDID_SHIFT) + 1U;
118 config->pacNumber = ((base->HWCFG0 & XRDC_HWCFG0_NPAC_MASK) >> XRDC_HWCFG0_NPAC_SHIFT) + 1U;
119 config->mrcNumber = ((base->HWCFG0 & XRDC_HWCFG0_NMRC_MASK) >> XRDC_HWCFG0_NMRC_SHIFT) + 1U;
120 }
121
XRDC_GetAndClearFirstDomainError(XRDC_Type * base,xrdc_error_t * error)122 status_t XRDC_GetAndClearFirstDomainError(XRDC_Type *base, xrdc_error_t *error)
123 {
124 return XRDC_GetAndClearFirstSpecificDomainError(base, error, XRDC_GetCurrentMasterDomainId(base));
125 }
126
XRDC_GetAndClearFirstSpecificDomainError(XRDC_Type * base,xrdc_error_t * error,uint8_t domainId)127 status_t XRDC_GetAndClearFirstSpecificDomainError(XRDC_Type *base, xrdc_error_t *error, uint8_t domainId)
128 {
129 assert(error);
130
131 uint32_t errorBitMap; /* Domain error location bit map. */
132 uint32_t errorIndex; /* The index of first domain error. */
133 uint32_t regW1; /* To save XRDC_DERR_W1. */
134
135 /* Get the error bitmap. */
136 errorBitMap = base->DERRLOC[domainId];
137
138 if (!errorBitMap) /* No error captured. */
139 {
140 return kStatus_XRDC_NoError;
141 }
142
143 /* Get the first error controller index. */
144 #if (((__CORTEX_M == 0U) && (defined(__ICCARM__))) || defined(__riscv))
145 errorIndex = 31U - XRDC_CountLeadingZeros(errorBitMap);
146 #else
147 errorIndex = 31U - __CLZ(errorBitMap);
148 #endif
149
150 #if (defined(FSL_FEATURE_XRDC_HAS_FDID) && FSL_FEATURE_XRDC_HAS_FDID)
151 /* Must write FDID[FDID] with the domain ID before reading the Domain Error registers. */
152 base->FDID = XRDC_FDID_FDID(domainId);
153 #endif /* FSL_FEATURE_XRDC_HAS_FDID */
154 /* Get the error information. */
155 regW1 = base->DERR_W[errorIndex][1];
156 error->controller = (xrdc_controller_t)errorIndex;
157 error->address = base->DERR_W[errorIndex][0];
158 error->errorState = (xrdc_error_state_t)XRDC_DERR_W1_EST_VAL(regW1);
159 error->errorAttr = (xrdc_error_attr_t)XRDC_DERR_W1_EATR_VAL(regW1);
160 error->errorType = (xrdc_error_type_t)XRDC_DERR_W1_ERW_VAL(regW1);
161 error->errorPort = XRDC_DERR_W1_EPORT_VAL(regW1);
162 error->domainId = XRDC_DERR_W1_EDID_VAL(regW1);
163
164 /* Clear error pending. */
165 base->DERR_W[errorIndex][3] = XRDC_DERR_W_RECR(0x01U);
166
167 return kStatus_Success;
168 }
169
XRDC_GetMemAccessDefaultConfig(xrdc_mem_access_config_t * config)170 void XRDC_GetMemAccessDefaultConfig(xrdc_mem_access_config_t *config)
171 {
172 assert(config);
173
174 uint8_t i;
175
176 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SE) && FSL_FEATURE_XRDC_NO_MRGD_SE)
177 config->enableSema = false;
178 config->semaNum = 0U;
179 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SE */
180
181 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SZ) && FSL_FEATURE_XRDC_NO_MRGD_SZ)
182 config->size = kXRDC_MemSizeNone;
183 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SZ */
184 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SRD) && FSL_FEATURE_XRDC_NO_MRGD_SRD)
185 config->subRegionDisableMask = 0U;
186 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SRD */
187
188 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_CR) && FSL_FEATURE_XRDC_HAS_MRGD_CR)
189 config->codeRegion = kXRDC_MemCodeRegion0;
190 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_CR */
191
192 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_ACCSET) && FSL_FEATURE_XRDC_HAS_MRGD_ACCSET)
193 config->enableAccset1Lock = false;
194 config->enableAccset2Lock = false;
195 config->accset1 = 0x000U;
196 config->accset2 = 0x000U;
197 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_ACCSET */
198
199 config->lockMode = kXRDC_AccessConfigLockWritable;
200
201 config->baseAddress = 0U;
202 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR) && FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR)
203 config->endAddress = 0U;
204 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR */
205
206 for (i = 0U; i < FSL_FEATURE_XRDC_DOMAIN_COUNT; i++)
207 {
208 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_DXACP) && FSL_FEATURE_XRDC_NO_MRGD_DXACP)
209 config->policy[i] = kXRDC_AccessPolicyNone;
210 #elif(defined(FSL_FEATURE_XRDC_HAS_MRGD_DXSEL) && FSL_FEATURE_XRDC_HAS_MRGD_DXSEL)
211 config->policy[i] = kXRDC_AccessFlagsNone;
212 #endif
213 }
214
215 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_EAL) && FSL_FEATURE_XRDC_HAS_MRGD_EAL)
216 config->exclAccessLockMode = kXRDC_ExclAccessLockDisabled;
217 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_EAL */
218 }
219
XRDC_SetMemAccessConfig(XRDC_Type * base,const xrdc_mem_access_config_t * config)220 void XRDC_SetMemAccessConfig(XRDC_Type *base, const xrdc_mem_access_config_t *config)
221 {
222 assert(config);
223 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SZ) && FSL_FEATURE_XRDC_NO_MRGD_SZ)
224 /* Not allowed to set sub-region disable mask for memory region smaller than 256-bytes. */
225 assert(!((config->size < kXRDC_MemSize256B) && (config->subRegionDisableMask)));
226 /* Memory region minimum size = 32 bytes and base address must be aligned to 0-module-2**(SZ+1). */
227 assert(config->size >= kXRDC_MemSize32B);
228 assert(!(config->baseAddress & ((1U << (config->size + 1U)) - 1U)));
229 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SZ */
230
231 uint32_t i;
232 uint32_t regValue;
233 uint8_t index = (uint8_t)config->mem;
234
235 /* Set MRGD_W0. */
236 base->MRGD[index].MRGD_W[0] = config->baseAddress;
237
238 /* Set MRGD_W1. */
239 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SZ) && FSL_FEATURE_XRDC_NO_MRGD_SZ)
240 base->MRGD[index].MRGD_W[1] = XRDC_MRGD_W_SZ(config->size) | XRDC_MRGD_W_SRD(config->subRegionDisableMask);
241 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SZ */
242
243 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR) && FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR)
244 base->MRGD[index].MRGD_W[1] = config->endAddress;
245 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_ENDADDR */
246
247 /* Set MRGD_W2. */
248 regValue = 0U;
249 /* Set MRGD_W2[D0ACP ~ D7ACP] or MRGD_W2[D0SEL ~ D2SEL]. */
250 #if (FSL_FEATURE_XRDC_DOMAIN_COUNT <= 8U)
251 i = FSL_FEATURE_XRDC_DOMAIN_COUNT;
252 #elif(FSL_FEATURE_XRDC_DOMAIN_COUNT <= 16U)
253 i = 8U;
254 #else
255 #error Does not support more than 16 domain.
256 #endif
257
258 while (i--)
259 {
260 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_DXACP) && FSL_FEATURE_XRDC_NO_MRGD_DXACP)
261 regValue <<= XRDC_MRGD_DXACP_WIDTH;
262 #elif(defined(FSL_FEATURE_XRDC_HAS_MRGD_DXSEL) && FSL_FEATURE_XRDC_HAS_MRGD_DXSEL)
263 regValue <<= XRDC_MRGD_DXSEL_WIDTH;
264 #endif
265 regValue |= config->policy[i];
266 }
267
268 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SE) && FSL_FEATURE_XRDC_NO_MRGD_SE)
269 regValue |= XRDC_MRGD_W_SE(config->enableSema) | XRDC_MRGD_W_SNUM(config->semaNum);
270 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SE */
271
272 base->MRGD[index].MRGD_W[2] = regValue;
273
274 /* Set MRGD_W3. */
275 regValue = 0U;
276
277 #if ((FSL_FEATURE_XRDC_DOMAIN_COUNT > 8U) && (FSL_FEATURE_XRDC_DOMAIN_COUNT <= 16))
278 /* Set MRGD_W3[D8ACP ~ D15ACP]. */
279 for (i = FSL_FEATURE_XRDC_DOMAIN_COUNT - 1U; i > 7U; i--)
280 {
281 regValue <<= XRDC_MRGD_DXACP_WIDTH;
282 regValue |= config->policy[i];
283 }
284 #endif
285
286 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_CR) && FSL_FEATURE_XRDC_HAS_MRGD_CR)
287 regValue |= XRDC_MRGD_W_CR(config->codeRegion);
288 #endif
289
290 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_W3_VLD) && FSL_FEATURE_XRDC_NO_MRGD_W3_VLD)
291 regValue |= XRDC_MRGD_W_VLD_MASK | XRDC_MRGD_W_LK2(config->lockMode);
292 #endif
293
294 base->MRGD[index].MRGD_W[3] = regValue;
295
296 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_EAL) && FSL_FEATURE_XRDC_HAS_MRGD_EAL)
297 /*
298 * Set MRGD_W3[EAL].
299 * If write with a value of MRGD_W3[EAL]=0, then the other fields of MRGD_W3 are updated.
300 * If write with a value of MRGD_W3[EAL]!=0, then only the EAL is updated.
301 */
302 if (kXRDC_ExclAccessLockDisabled != config->exclAccessLockMode)
303 {
304 base->MRGD[index].MRGD_W[3] = XRDC_MRGD_W_EAL(config->exclAccessLockMode);
305 }
306 #endif
307
308 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_ACCSET) && FSL_FEATURE_XRDC_HAS_MRGD_ACCSET)
309 /* Set MRGD_W4. */
310 base->MRGD[index].MRGD_W[4] = XRDC_MRGD_W_LKAS1(config->enableAccset1Lock) | XRDC_MRGD_W_ACCSET1(config->accset1) |
311 XRDC_MRGD_W_LKAS2(config->enableAccset2Lock) | XRDC_MRGD_W_ACCSET2(config->accset2) |
312 XRDC_MRGD_W_VLD_MASK | XRDC_MRGD_W_LK2(config->lockMode);
313 #endif
314 }
315
316 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_EAL) && FSL_FEATURE_XRDC_HAS_MRGD_EAL)
XRDC_SetMemExclAccessLockMode(XRDC_Type * base,xrdc_mem_t mem,xrdc_excl_access_lock_config_t lockMode)317 void XRDC_SetMemExclAccessLockMode(XRDC_Type *base, xrdc_mem_t mem, xrdc_excl_access_lock_config_t lockMode)
318 {
319 /* Write kXRDC_ExclAccessLockDisabled is not allowed. */
320 assert(kXRDC_ExclAccessLockDisabled != lockMode);
321
322 uint32_t reg = base->MRGD[mem].MRGD_W[4];
323
324 /* Step 1. Set the memory region exclusive access lock mode configuration. */
325 base->MRGD[mem].MRGD_W[3] = XRDC_MRGD_W_EAL(lockMode);
326
327 /* Step 2. Set MRGD_W3 will clear the MRGD_W4[VLD]. So should re-assert it. */
328 base->MRGD[mem].MRGD_W[4] = reg;
329 }
330
XRDC_ForceMemExclAccessLockRelease(XRDC_Type * base,xrdc_mem_t mem)331 void XRDC_ForceMemExclAccessLockRelease(XRDC_Type *base, xrdc_mem_t mem)
332 {
333 uint32_t primask;
334
335 primask = DisableGlobalIRQ();
336 base->MRGD[mem].MRGD_W[3] = XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL1;
337 base->MRGD[mem].MRGD_W[3] = XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL2;
338 EnableGlobalIRQ(primask);
339 }
340 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_EAL */
341
342 #if (defined(FSL_FEATURE_XRDC_HAS_MRGD_ACCSET) && FSL_FEATURE_XRDC_HAS_MRGD_ACCSET)
XRDC_SetMemAccsetLock(XRDC_Type * base,xrdc_mem_t mem,xrdc_mem_accset_t accset,bool lock)343 void XRDC_SetMemAccsetLock(XRDC_Type *base, xrdc_mem_t mem, xrdc_mem_accset_t accset, bool lock)
344 {
345 uint32_t lkasMask = 0U;
346
347 switch (accset)
348 {
349 case kXRDC_MemAccset1:
350 lkasMask = XRDC_MRGD_W_LKAS1_MASK;
351 break;
352 case kXRDC_MemAccset2:
353 lkasMask = XRDC_MRGD_W_LKAS2_MASK;
354 break;
355 default:
356 break;
357 }
358
359 if (lock)
360 {
361 base->MRGD[mem].MRGD_W[4] |= lkasMask;
362 }
363 else
364 {
365 base->MRGD[mem].MRGD_W[4] &= ~lkasMask;
366 }
367 }
368 #endif /* FSL_FEATURE_XRDC_HAS_MRGD_ACCSET */
369
XRDC_GetPeriphAccessDefaultConfig(xrdc_periph_access_config_t * config)370 void XRDC_GetPeriphAccessDefaultConfig(xrdc_periph_access_config_t *config)
371 {
372 assert(config);
373
374 uint8_t i;
375
376 #if !(defined(FSL_FEATURE_XRDC_NO_PDAC_SE) && FSL_FEATURE_XRDC_NO_PDAC_SE)
377 config->enableSema = false;
378 config->semaNum = 0U;
379 #endif /* FSL_FEATURE_XRDC_NO_PDAC_SE */
380 config->lockMode = kXRDC_AccessConfigLockWritable;
381 #if (defined(FSL_FEATURE_XRDC_HAS_PDAC_EAL) && FSL_FEATURE_XRDC_HAS_PDAC_EAL)
382 config->exclAccessLockMode = kXRDC_ExclAccessLockDisabled;
383 #endif /* FSL_FEATURE_XRDC_HAS_PDAC_EAL */
384 for (i = 0U; i < FSL_FEATURE_XRDC_DOMAIN_COUNT; i++)
385 {
386 config->policy[i] = kXRDC_AccessPolicyNone;
387 }
388 }
389
XRDC_SetPeriphAccessConfig(XRDC_Type * base,const xrdc_periph_access_config_t * config)390 void XRDC_SetPeriphAccessConfig(XRDC_Type *base, const xrdc_periph_access_config_t *config)
391 {
392 assert(config);
393
394 uint32_t i;
395 uint32_t regValue;
396 uint8_t index = (uint8_t)config->periph;
397
398 /* Set PDAC_W0[D0ACP ~ D7ACP]. */
399 regValue = 0U;
400 #if (FSL_FEATURE_XRDC_DOMAIN_COUNT <= 8U)
401 i = FSL_FEATURE_XRDC_DOMAIN_COUNT;
402 #elif(FSL_FEATURE_XRDC_DOMAIN_COUNT <= 16U)
403 i = 8U;
404 #else
405 #error Does not support more than 16 domain.
406 #endif
407
408 while (i--)
409 {
410 regValue <<= XRDC_PDAC_DXACP_WIDTH;
411 regValue |= config->policy[i];
412 }
413
414 #if !(defined(FSL_FEATURE_XRDC_NO_MRGD_SE) && FSL_FEATURE_XRDC_NO_MRGD_SE)
415 regValue |= (XRDC_PDAC_W_SE(config->enableSema) | XRDC_PDAC_W_SNUM(config->semaNum));
416 #endif /* FSL_FEATURE_XRDC_NO_MRGD_SE */
417
418 /* Set PDAC_W0. */
419 base->PDAC_W[index][0U] = regValue;
420
421 #if (defined(FSL_FEATURE_XRDC_HAS_PDAC_EAL) && FSL_FEATURE_XRDC_HAS_PDAC_EAL)
422 /*
423 * If write with a value of PDAC_W1[EAL]=0, then the other fields of PDAC_W1 are updated.
424 * If write with a value of PDAC_W1[EAL]!=0, then only the EAL is updated.
425 */
426 base->PDAC_W[index][1U] = XRDC_PDAC_W_EAL(config->exclAccessLockMode);
427 #endif
428
429 regValue = 0U;
430 #if ((FSL_FEATURE_XRDC_DOMAIN_COUNT > 8U) && (FSL_FEATURE_XRDC_DOMAIN_COUNT <= 16))
431 /* Set PDAC_W1[D8ACP ~ D15ACP]. */
432
433 for (i = FSL_FEATURE_XRDC_DOMAIN_COUNT - 1U; i > 7U; i--)
434 {
435 regValue <<= XRDC_PDAC_DXACP_WIDTH;
436 regValue |= config->policy[i];
437 }
438 #endif
439 /* Set PDAC_W1. */
440 base->PDAC_W[index][1] = regValue | XRDC_PDAC_W_VLD_MASK | XRDC_PDAC_W_LK2(config->lockMode);
441 }
442
443 #if (defined(FSL_FEATURE_XRDC_HAS_PDAC_EAL) && FSL_FEATURE_XRDC_HAS_PDAC_EAL)
XRDC_ForcePeriphExclAccessLockRelease(XRDC_Type * base,xrdc_periph_t periph)444 void XRDC_ForcePeriphExclAccessLockRelease(XRDC_Type *base, xrdc_periph_t periph)
445 {
446 uint32_t primask;
447
448 primask = DisableGlobalIRQ();
449 base->PDAC_W[periph][1] = XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL1;
450 base->PDAC_W[periph][1] = XRDC_FORCE_EXCL_ACS_LOCK_REL_VAL2;
451 EnableGlobalIRQ(primask);
452 }
453 #endif /* FSL_FEATURE_XRDC_HAS_PDAC_EAL */
454