123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- * Copyright 2023-2024 NXP
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include <lib/mmio.h>
- #include <lib/utils_def.h>
- #include <s32cc-mc-rgm.h>
- #define MC_RGM_PRST(RGM, PER) ((RGM) + 0x40UL + ((PER) * 0x8UL))
- #define MC_RGM_PRST_PERIPH_N_RST(PER) BIT_32(PER)
- #define MC_RGM_PSTAT(RGM, PER) ((RGM) + 0x140UL + ((PER) * 0x8UL))
- #define MC_RGM_PSTAT_PERIPH(PER) BIT_32(PER)
- /* ERR051700
- * Releasing more than one Software Resettable Domain (SRD)
- * from reset simultaneously, by clearing the corresponding
- * peripheral MC_RGM_PRSTn[PERIPH_x_RST] reset control may
- * cause a false setting of the Fault Collection and
- * Control Unit (FCCU) Non-Critical Fault (NCF) flag
- * corresponding to a Memory-Test-Repair (MTR) Error
- */
- #if (ERRATA_S32_051700 == 1)
- void mc_rgm_periph_reset(uintptr_t rgm, uint32_t part, uint32_t value)
- {
- uint32_t current_bit_checked, i;
- uint32_t current_regs, mask;
- int bit_index;
- current_regs = mmio_read_32(MC_RGM_PRST(rgm, part));
- /* Create a mask with all changed bits */
- mask = current_regs ^ value;
- while (mask != 0U) {
- bit_index = __builtin_ffs(mask);
- if (bit_index < 1) {
- break;
- }
- i = (uint32_t)bit_index - 1U;
- current_bit_checked = BIT_32(i);
- /* Check if we assert or de-assert.
- * Also wait for completion.
- */
- if ((value & current_bit_checked) != 0U) {
- mmio_setbits_32(MC_RGM_PRST(rgm, part),
- current_bit_checked);
- while ((mmio_read_32(MC_RGM_PRST(rgm, part)) &
- current_bit_checked) == 0U)
- ;
- } else {
- mmio_clrbits_32(MC_RGM_PRST(rgm, part),
- current_bit_checked);
- while ((mmio_read_32(MC_RGM_PRST(rgm, part)) &
- current_bit_checked) != 0U)
- ;
- }
- mask &= ~current_bit_checked;
- }
- }
- #else /* ERRATA_S32_051700 */
- void mc_rgm_periph_reset(uintptr_t rgm, uint32_t part, uint32_t value)
- {
- mmio_write_32(MC_RGM_PRST(rgm, part), value);
- }
- #endif /* ERRATA_S32_051700 */
- void mc_rgm_release_part(uintptr_t rgm, uint32_t part)
- {
- uint32_t reg;
- reg = mmio_read_32(MC_RGM_PRST(rgm, part));
- reg &= ~MC_RGM_PRST_PERIPH_N_RST(0);
- mc_rgm_periph_reset(rgm, part, reg);
- }
- void mc_rgm_wait_part_deassert(uintptr_t rgm, uint32_t part)
- {
- while ((mmio_read_32(MC_RGM_PSTAT(rgm, part)) &
- MC_RGM_PSTAT_PERIPH(0)) != 0U) {
- }
- }
|