File indexing completed on 2025-05-11 08:23:02
0001
0002
0003
0004
0005
0006
0007
0008 #include "fsl_xrdc2.h"
0009
0010
0011
0012
0013
0014
0015 #ifndef FSL_COMPONENT_ID
0016 #define FSL_COMPONENT_ID "platform.drivers.xrdc2"
0017 #endif
0018
0019
0020 #define XRDC2_DXACP_WIDTH (3U)
0021 #define XRDC2_DXACP_MASK ((1UL << XRDC2_DXACP_WIDTH) - 1U)
0022
0023 #define XRDC2_DXACP_0_7(domainId, dxacp) ((uint32_t)(dxacp) << (XRDC2_DXACP_WIDTH * (uint32_t)(domainId)))
0024 #define XRDC2_DXACP_8_15(domainId, dxacp) ((uint32_t)(dxacp) << (XRDC2_DXACP_WIDTH * ((uint32_t)(domainId)-8U)))
0025
0026 #define XRDC2_DXACP_0_7_MASK(domainId) XRDC2_DXACP_0_7(domainId, XRDC2_DXACP_MASK)
0027 #define XRDC2_DXACP_8_15_MASK(domainId) XRDC2_DXACP_8_15(domainId, XRDC2_DXACP_MASK)
0028
0029
0030 #define XRDC2_MRGD_ADDR_ALIGN_MASK (0x00000FFFU)
0031
0032
0033
0034
0035 static void XRDC2_MakeDXACP(const xrdc2_access_policy_t policy[FSL_FEATURE_XRDC2_DOMAIN_COUNT],
0036 uint32_t *w0,
0037 uint32_t *w1);
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 static void XRDC2_MakeDXACP(const xrdc2_access_policy_t policy[FSL_FEATURE_XRDC2_DOMAIN_COUNT],
0048 uint32_t *w0,
0049 uint32_t *w1)
0050 {
0051 uint32_t domain = (uint32_t)FSL_FEATURE_XRDC2_DOMAIN_COUNT;
0052
0053 *w0 = 0U;
0054 *w1 = 0U;
0055
0056 #if (FSL_FEATURE_XRDC2_DOMAIN_COUNT > 8)
0057 while (domain > 8U)
0058 {
0059 domain--;
0060 *w0 <<= XRDC2_DXACP_WIDTH;
0061 *w0 |= (uint32_t)policy[domain - 8U];
0062 }
0063 #endif
0064
0065 while (domain > 0U)
0066 {
0067 domain--;
0068 *w1 <<= XRDC2_DXACP_WIDTH;
0069 *w1 |= (uint32_t)policy[domain];
0070 }
0071 }
0072
0073
0074
0075
0076
0077
0078
0079
0080 void XRDC2_Init(XRDC2_Type *base)
0081 {
0082 }
0083
0084
0085
0086
0087
0088
0089
0090
0091 void XRDC2_Deinit(XRDC2_Type *base)
0092 {
0093 }
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104 void XRDC2_SetGlobalValid(XRDC2_Type *base, bool valid)
0105 {
0106 uint32_t mcr = base->MCR & ~(XRDC2_MCR_GVLDM_MASK | XRDC2_MCR_GVLDC_MASK);
0107
0108 if (valid)
0109 {
0110 mcr |= XRDC2_MCR_GVLDM_MASK;
0111 base->MCR = mcr;
0112
0113
0114 (void)base->MCR;
0115 (void)base->MCR;
0116
0117 mcr |= XRDC2_MCR_GVLDC_MASK;
0118 base->MCR = mcr;
0119 }
0120 else
0121 {
0122 base->MCR = mcr;
0123 }
0124 }
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142 void XRDC2_GetDefaultMasterDomainAssignment(xrdc2_master_domain_assignment_t *assignment)
0143 {
0144 assert(NULL != assignment);
0145
0146 assignment->lock = false;
0147 assignment->privilegeAttr = kXRDC2_MasterPrivilege;
0148 assignment->secureAttr = kXRDC2_MasterSecure;
0149 assignment->domainId = 0U;
0150 assignment->mask = 0U;
0151 assignment->match = 0U;
0152 }
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 void XRDC2_SetMasterDomainAssignment(XRDC2_Type *base,
0163 xrdc2_master_t master,
0164 uint8_t assignIndex,
0165 const xrdc2_master_domain_assignment_t *assignment)
0166 {
0167 assert(NULL != assignment);
0168 uint32_t w0;
0169 uint32_t w1;
0170
0171 w0 = (((uint32_t)assignment->mask << XRDC2_MDAC_MDA_W0_MASK_SHIFT) |
0172 ((uint32_t)assignment->match << XRDC2_MDAC_MDA_W0_MATCH_SHIFT));
0173
0174 w1 = ((uint32_t)assignment->domainId << XRDC2_MDAC_MDA_W1_DID_SHIFT) |
0175 (XRDC2_MDAC_MDA_W1_PA(assignment->privilegeAttr)) | (XRDC2_MDAC_MDA_W1_SA(assignment->secureAttr)) |
0176 XRDC2_MDAC_MDA_W1_VLD_MASK;
0177
0178 if (assignment->lock)
0179 {
0180 w1 |= XRDC2_MDAC_MDA_W1_DL_MASK;
0181 }
0182
0183 base->MDACI_MDAJ[master][assignIndex].MDAC_MDA_W0 = w0;
0184 base->MDACI_MDAJ[master][assignIndex].MDAC_MDA_W1 = w1;
0185 }
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201 void XRDC2_GetMemSlotAccessDefaultConfig(xrdc2_mem_slot_access_config_t *config)
0202 {
0203 assert(NULL != config);
0204
0205 uint8_t domain;
0206
0207 config->lockMode = kXRDC2_AccessConfigLockDisabled;
0208
0209 for (domain = 0; domain < (uint32_t)FSL_FEATURE_XRDC2_DOMAIN_COUNT; domain++)
0210 {
0211 config->policy[domain] = kXRDC2_AccessPolicyNone;
0212 }
0213 }
0214
0215
0216
0217
0218
0219
0220
0221 void XRDC2_SetMemSlotAccessConfig(XRDC2_Type *base,
0222 xrdc2_mem_slot_t memSlot,
0223 const xrdc2_mem_slot_access_config_t *config)
0224 {
0225 assert(NULL != config);
0226
0227 uint32_t w0 = 0;
0228 uint32_t w1 = 0;
0229
0230 XRDC2_MakeDXACP(config->policy, &w0, &w1);
0231
0232 w1 |= XRDC2_MSC_MSAC_W1_DL2(config->lockMode);
0233 w1 |= XRDC2_MSC_MSAC_W1_VLD_MASK;
0234
0235 base->MSCI_MSAC_WK[(uint8_t)memSlot].MSC_MSAC_W0 = w0;
0236 base->MSCI_MSAC_WK[(uint8_t)memSlot].MSC_MSAC_W1 = w1;
0237 }
0238
0239
0240
0241
0242
0243
0244
0245
0246 void XRDC2_SetMemSlotAccessValid(XRDC2_Type *base, xrdc2_mem_slot_t memSlot, bool valid)
0247 {
0248 uint32_t reg = base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 & ~XRDC2_EAL_MASK;
0249
0250 if (valid)
0251 {
0252 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = (reg | XRDC2_MSC_MSAC_W1_VLD_MASK);
0253 }
0254 else
0255 {
0256 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = (reg & ~XRDC2_MSC_MSAC_W1_VLD_MASK);
0257 }
0258 }
0259
0260
0261
0262
0263
0264
0265
0266
0267 void XRDC2_SetMemSlotAccessLockMode(XRDC2_Type *base, xrdc2_mem_slot_t memSlot, xrdc2_access_config_lock_t lockMode)
0268 {
0269 uint32_t reg = base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 & ~(XRDC2_EAL_MASK | XRDC2_MRC_MRGD_W6_DL2_MASK);
0270
0271 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = (reg | XRDC2_MRC_MRGD_W6_DL2(lockMode));
0272 }
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282 void XRDC2_SetMemSlotDomainAccessPolicy(XRDC2_Type *base,
0283 xrdc2_mem_slot_t memSlot,
0284 uint8_t domainId,
0285 xrdc2_access_policy_t policy)
0286 {
0287 uint32_t reg;
0288
0289 if (domainId < 8U)
0290 {
0291 reg = base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W0 & ~XRDC2_DXACP_0_7_MASK(domainId);
0292 reg |= XRDC2_DXACP_0_7(domainId, policy);
0293 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W0 = reg;
0294 }
0295 else
0296 {
0297 reg = base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 & ~XRDC2_DXACP_8_15_MASK(domainId);
0298 reg |= XRDC2_DXACP_8_15(domainId, policy);
0299 reg &= ~XRDC2_EAL_MASK;
0300 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = reg;
0301 }
0302 }
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314 void XRDC2_EnableMemSlotExclAccessLock(XRDC2_Type *base, xrdc2_mem_slot_t memSlot, bool enable)
0315 {
0316 if (enable)
0317 {
0318 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = XRDC2_EAL_UNLOCKED;
0319 }
0320 else
0321 {
0322 base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1 = XRDC2_EAL_DISABLE_UNTIL_RESET;
0323 }
0324 }
0325
0326
0327
0328
0329
0330
0331
0332
0333 uint8_t XRDC2_GetMemSlotExclAccessLockDomainOwner(XRDC2_Type *base, xrdc2_mem_slot_t memSlot)
0334 {
0335 return (uint8_t)((base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W0 & XRDC2_MSC_MSAC_W0_EALO_MASK) >>
0336 XRDC2_MSC_MSAC_W0_EALO_SHIFT);
0337 }
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347 status_t XRDC2_TryLockMemSlotExclAccess(XRDC2_Type *base, xrdc2_mem_slot_t memSlot)
0348 {
0349 status_t status;
0350 uint8_t curDomainID;
0351 volatile uint32_t *lockReg = &(base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1);
0352
0353 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0354
0355 *lockReg = XRDC2_EAL_LOCKED;
0356
0357 if (curDomainID != XRDC2_GetMemSlotExclAccessLockDomainOwner(base, memSlot))
0358 {
0359 status = kStatus_Fail;
0360 }
0361 else
0362 {
0363 status = kStatus_Success;
0364 }
0365
0366 return status;
0367 }
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377 void XRDC2_LockMemSlotExclAccess(XRDC2_Type *base, xrdc2_mem_slot_t memSlot)
0378 {
0379 uint8_t curDomainID;
0380 volatile uint32_t *lockReg = &(base->MSCI_MSAC_WK[(uint32_t)memSlot].MSC_MSAC_W1);
0381
0382 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0383
0384 while (true)
0385 {
0386 *lockReg = XRDC2_EAL_LOCKED;
0387
0388
0389 if (curDomainID == XRDC2_GetMemSlotExclAccessLockDomainOwner(base, memSlot))
0390 {
0391 break;
0392 }
0393 }
0394
0395 return;
0396 }
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414 void XRDC2_GetMemAccessDefaultConfig(xrdc2_mem_access_config_t *config)
0415 {
0416 assert(NULL != config);
0417
0418 uint8_t domain;
0419
0420 config->startAddr = 0U;
0421 config->endAddr = 0xFFFFFFFFU;
0422 config->lockMode = kXRDC2_AccessConfigLockDisabled;
0423
0424 for (domain = 0; domain < (uint32_t)FSL_FEATURE_XRDC2_DOMAIN_COUNT; domain++)
0425 {
0426 config->policy[domain] = kXRDC2_AccessPolicyNone;
0427 }
0428 }
0429
0430
0431
0432
0433
0434
0435
0436 void XRDC2_SetMemAccessConfig(XRDC2_Type *base, xrdc2_mem_t mem, const xrdc2_mem_access_config_t *config)
0437 {
0438 assert(NULL != config);
0439
0440 assert((config->startAddr & XRDC2_MRGD_ADDR_ALIGN_MASK) == 0U);
0441 assert(((config->endAddr + 1U) & XRDC2_MRGD_ADDR_ALIGN_MASK) == 0U);
0442
0443 uint32_t w5 = 0;
0444 uint32_t w6 = 0;
0445
0446 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0447 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0448
0449 XRDC2_MakeDXACP(config->policy, &w5, &w6);
0450
0451 w6 |= XRDC2_MRC_MRGD_W6_DL2(config->lockMode);
0452 w6 |= XRDC2_MRC_MRGD_W6_VLD_MASK;
0453
0454 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W0 = config->startAddr;
0455 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W1 = 0U;
0456 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W2 = config->endAddr;
0457 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W3 = 0U;
0458 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W5 = w5;
0459 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = w6;
0460 }
0461
0462
0463
0464
0465
0466
0467
0468
0469 void XRDC2_SetMemAccessValid(XRDC2_Type *base, xrdc2_mem_t mem, bool valid)
0470 {
0471 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0472 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0473 uint32_t reg = base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 & ~XRDC2_EAL_MASK;
0474
0475 if (valid)
0476 {
0477 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = (reg | XRDC2_MRC_MRGD_W6_VLD_MASK);
0478 }
0479 else
0480 {
0481 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = (reg & ~XRDC2_MRC_MRGD_W6_VLD_MASK);
0482 }
0483 }
0484
0485
0486
0487
0488
0489
0490
0491
0492 void XRDC2_SetMemAccessLockMode(XRDC2_Type *base, xrdc2_mem_t mem, xrdc2_access_config_lock_t lockMode)
0493 {
0494 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0495 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0496 uint32_t reg = base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 & ~(XRDC2_EAL_MASK | XRDC2_MRC_MRGD_W6_DL2_MASK);
0497
0498 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = (reg | XRDC2_MRC_MRGD_W6_DL2(lockMode));
0499 }
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509 void XRDC2_SetMemDomainAccessPolicy(XRDC2_Type *base, xrdc2_mem_t mem, uint8_t domainId, xrdc2_access_policy_t policy)
0510 {
0511 uint32_t reg;
0512 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0513 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0514
0515 if (domainId < 8U)
0516 {
0517 reg = base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W5 & ~XRDC2_DXACP_0_7_MASK(domainId);
0518 reg |= XRDC2_DXACP_0_7(domainId, policy);
0519 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W5 = reg;
0520 }
0521 else
0522 {
0523 reg = base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 & ~XRDC2_DXACP_8_15_MASK(domainId);
0524 reg |= XRDC2_DXACP_8_15(domainId, policy);
0525 reg &= ~XRDC2_EAL_MASK;
0526 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = reg;
0527 }
0528 }
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538 void XRDC2_EnableMemExclAccessLock(XRDC2_Type *base, xrdc2_mem_t mem, bool enable)
0539 {
0540 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0541 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0542
0543 if (enable)
0544 {
0545 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = XRDC2_EAL_UNLOCKED;
0546 }
0547 else
0548 {
0549 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = XRDC2_EAL_DISABLE_UNTIL_RESET;
0550 }
0551 }
0552
0553
0554
0555
0556
0557
0558
0559
0560 uint8_t XRDC2_GetMemExclAccessLockDomainOwner(XRDC2_Type *base, xrdc2_mem_t mem)
0561 {
0562 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0563 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0564
0565 return (uint8_t)((base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W5 & XRDC2_MRC_MRGD_W5_EALO_MASK) >>
0566 XRDC2_MRC_MRGD_W5_EALO_SHIFT);
0567 }
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577 status_t XRDC2_TryLockMemExclAccess(XRDC2_Type *base, xrdc2_mem_t mem)
0578 {
0579 status_t status;
0580 uint8_t curDomainID;
0581 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0582 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0583 volatile uint32_t *lockReg = &(base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6);
0584
0585 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0586
0587 *lockReg = XRDC2_EAL_LOCKED;
0588
0589 if (curDomainID != XRDC2_GetMemExclAccessLockDomainOwner(base, mem))
0590 {
0591 status = kStatus_Fail;
0592 }
0593 else
0594 {
0595 status = kStatus_Success;
0596 }
0597
0598 return status;
0599 }
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609 void XRDC2_LockMemExclAccess(XRDC2_Type *base, xrdc2_mem_t mem)
0610 {
0611 uint8_t curDomainID;
0612 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0613 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0614 volatile uint32_t *lockReg = &(base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6);
0615
0616 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0617
0618 while (true)
0619 {
0620 *lockReg = XRDC2_EAL_LOCKED;
0621
0622
0623 if (curDomainID == XRDC2_GetMemExclAccessLockDomainOwner(base, mem))
0624 {
0625 break;
0626 }
0627 }
0628
0629 return;
0630 }
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640 void XRDC2_UnlockMemExclAccess(XRDC2_Type *base, xrdc2_mem_t mem)
0641 {
0642 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0643 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0644
0645 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = XRDC2_EAL_UNLOCKED;
0646 }
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656 void XRDC2_ForceMemExclAccessLockRelease(XRDC2_Type *base, xrdc2_mem_t mem)
0657 {
0658 uint32_t mrc = XRDC2_GET_MRC((uint32_t)mem);
0659 uint32_t mrgd = XRDC2_GET_MRGD((uint32_t)mem);
0660
0661 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = XRDC2_EAL_FORCE_RELEASE_MAGIC_0;
0662 base->MRCI_MRGDJ[mrc][mrgd].MRC_MRGD_W6 = XRDC2_EAL_FORCE_RELEASE_MAGIC_1;
0663 }
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679 void XRDC2_GetPeriphAccessDefaultConfig(xrdc2_periph_access_config_t *config)
0680 {
0681 assert(NULL != config);
0682
0683 uint8_t domain;
0684
0685 config->lockMode = kXRDC2_AccessConfigLockDisabled;
0686
0687 for (domain = 0; domain < (uint32_t)FSL_FEATURE_XRDC2_DOMAIN_COUNT; domain++)
0688 {
0689 config->policy[domain] = kXRDC2_AccessPolicyNone;
0690 }
0691 }
0692
0693
0694
0695
0696
0697
0698
0699 void XRDC2_SetPeriphAccessConfig(XRDC2_Type *base, xrdc2_periph_t periph, const xrdc2_periph_access_config_t *config)
0700 {
0701 assert(NULL != config);
0702
0703 uint32_t w0 = 0;
0704 uint32_t w1 = 0;
0705
0706 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0707 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0708
0709 XRDC2_MakeDXACP(config->policy, &w0, &w1);
0710
0711 w1 |= XRDC2_PAC_PDAC_W1_DL2(config->lockMode);
0712 w1 |= XRDC2_PAC_PDAC_W1_VLD_MASK;
0713
0714 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W0 = w0;
0715 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = w1;
0716 }
0717
0718
0719
0720
0721
0722
0723
0724
0725 void XRDC2_SetPeriphAccessValid(XRDC2_Type *base, xrdc2_periph_t periph, bool valid)
0726 {
0727 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0728 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0729 uint32_t reg = base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 & ~XRDC2_EAL_MASK;
0730
0731 if (valid)
0732 {
0733 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = (reg | XRDC2_PAC_PDAC_W1_VLD_MASK);
0734 }
0735 else
0736 {
0737 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = (reg & ~XRDC2_PAC_PDAC_W1_VLD_MASK);
0738 }
0739 }
0740
0741
0742
0743
0744
0745
0746
0747
0748 void XRDC2_SetPeriphAccessLockMode(XRDC2_Type *base, xrdc2_periph_t periph, xrdc2_access_config_lock_t lockMode)
0749 {
0750 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0751 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0752 uint32_t reg = base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 & ~(XRDC2_EAL_MASK | XRDC2_PAC_PDAC_W1_DL2_MASK);
0753
0754 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = (reg | XRDC2_PAC_PDAC_W1_DL2(lockMode));
0755 }
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765 void XRDC2_SetPeriphDomainAccessPolicy(XRDC2_Type *base,
0766 xrdc2_periph_t periph,
0767 uint8_t domainId,
0768 xrdc2_access_policy_t policy)
0769 {
0770 uint32_t reg;
0771 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0772 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0773
0774 if (domainId < 8U)
0775 {
0776 reg = base->PACI_PDACJ[pac][pdac].PAC_PDAC_W0 & ~XRDC2_DXACP_0_7_MASK(domainId);
0777 reg |= XRDC2_DXACP_0_7(domainId, policy);
0778 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W0 = reg;
0779 }
0780 else
0781 {
0782 reg = base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 & ~XRDC2_DXACP_8_15_MASK(domainId);
0783 reg |= XRDC2_DXACP_8_15(domainId, policy);
0784 reg &= ~XRDC2_EAL_MASK;
0785 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = reg;
0786 }
0787 }
0788
0789
0790
0791
0792
0793
0794
0795
0796 uint8_t XRDC2_GetPeriphExclAccessLockDomainOwner(XRDC2_Type *base, xrdc2_periph_t periph)
0797 {
0798 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0799 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0800
0801 return (uint8_t)((base->PACI_PDACJ[pac][pdac].PAC_PDAC_W0 & XRDC2_PAC_PDAC_W0_EALO_MASK) >>
0802 XRDC2_PAC_PDAC_W0_EALO_SHIFT);
0803 }
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814 void XRDC2_EnablePeriphExclAccessLock(XRDC2_Type *base, xrdc2_periph_t periph, bool enable)
0815 {
0816 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0817 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0818
0819 if (enable)
0820 {
0821 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = XRDC2_EAL_UNLOCKED;
0822 }
0823 else
0824 {
0825 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = XRDC2_EAL_DISABLE_UNTIL_RESET;
0826 }
0827 }
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837 status_t XRDC2_TryLockPeriphExclAccess(XRDC2_Type *base, xrdc2_periph_t periph)
0838 {
0839 status_t status;
0840 uint8_t curDomainID;
0841 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0842 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0843
0844 volatile uint32_t *lockReg = &(base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1);
0845
0846 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0847
0848 *lockReg = XRDC2_EAL_LOCKED;
0849
0850 if (curDomainID != XRDC2_GetPeriphExclAccessLockDomainOwner(base, periph))
0851 {
0852 status = kStatus_Fail;
0853 }
0854 else
0855 {
0856 status = kStatus_Success;
0857 }
0858
0859 return status;
0860 }
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870 void XRDC2_LockPeriphExclAccess(XRDC2_Type *base, xrdc2_periph_t periph)
0871 {
0872 uint8_t curDomainID;
0873 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0874 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0875
0876 volatile uint32_t *lockReg = &(base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1);
0877
0878 curDomainID = XRDC2_GetCurrentMasterDomainId(base);
0879
0880 while (true)
0881 {
0882 *lockReg = XRDC2_EAL_LOCKED;
0883
0884
0885 if (curDomainID == XRDC2_GetPeriphExclAccessLockDomainOwner(base, periph))
0886 {
0887 break;
0888 }
0889 }
0890
0891 return;
0892 }
0893
0894
0895
0896
0897
0898
0899
0900
0901
0902 void XRDC2_UnlockPeriphExclAccess(XRDC2_Type *base, xrdc2_periph_t periph)
0903 {
0904 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0905 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0906
0907 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = XRDC2_EAL_UNLOCKED;
0908 }
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918 void XRDC2_ForcePeriphExclAccessLockRelease(XRDC2_Type *base, xrdc2_periph_t periph)
0919 {
0920 uint32_t pac = XRDC2_GET_PAC((uint32_t)periph);
0921 uint32_t pdac = XRDC2_GET_PDAC((uint32_t)periph);
0922
0923 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = XRDC2_EAL_FORCE_RELEASE_MAGIC_0;
0924 base->PACI_PDACJ[pac][pdac].PAC_PDAC_W1 = XRDC2_EAL_FORCE_RELEASE_MAGIC_1;
0925 }