1 /* 2 * Copyright 2019-2021, 2024 NXP 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 #include <lib/mmio.h> 7 #include <platform_def.h> 8 9 #include <s32cc-ncore.h> 10 11 static void ncore_diru_online(uint32_t diru) 12 { 13 uint32_t numsfs, sf; 14 15 numsfs = NCORE_CSID_NUMSFS(mmio_read_32(NCORE_CSID)) + 1U; 16 17 /* Initialize all entries maintenance operation for each snoop filter */ 18 for (sf = 0U; sf < numsfs; sf++) { 19 mmio_write_32(NCORE_DIRUSFMC(diru), NCORE_DIRUSFMC_SFID(sf) | 20 NCORE_DIRUSFMC_SFMNTOP_ALL); 21 22 while ((mmio_read_32(NCORE_DIRUSFMA(diru)) & NCORE_DIRUSFMA_MNTOPACTV) != 0U) { 23 } 24 25 mmio_setbits_32(NCORE_DIRUSFE(diru), NCORE_DIRUSFE_SFEN(sf)); 26 } 27 } 28 29 void ncore_disable_caiu_isolation(uint32_t caiu) 30 { 31 /* Exit from low-power state */ 32 mmio_clrbits_32(NCORE_CAIUTC(caiu), NCORE_CAIUTC_ISOLEN_MASK); 33 } 34 35 static void set_caiu(uint32_t caiu, bool on) 36 { 37 uint32_t dirucase, csadser, caiuidr; 38 uint32_t numdirus, diru; 39 40 /* Enable or disable snoop messages to the CAI for each DIRU */ 41 numdirus = NCORE_CSUID_NUMDIRUS(mmio_read_32(NCORE_CSUID)); 42 for (diru = 0; diru < numdirus; diru++) { 43 dirucase = mmio_read_32(NCORE_DIRUCASE(diru)); 44 45 if (on) { 46 dirucase |= NCORE_DIRUCASE_CASNPEN(caiu); 47 } else { 48 dirucase &= ~NCORE_DIRUCASE_CASNPEN(caiu); 49 } 50 51 mmio_write_32(NCORE_DIRUCASE(diru), dirucase); 52 } 53 54 /* Enable or disable DVM messages to the CAI */ 55 caiuidr = mmio_read_32(NCORE_CAIUID(caiu)); 56 if ((caiuidr & NCORE_CAIUID_TYPE) == NCORE_CAIUID_TYPE_ACE_DVM) { 57 csadser = mmio_read_32(NCORE_CSADSE); 58 59 if (on) { 60 csadser |= NCORE_CSADSE_DVMSNPEN(caiu); 61 } else { 62 csadser &= ~NCORE_CSADSE_DVMSNPEN(caiu); 63 } 64 65 mmio_write_32(NCORE_CSADSE, csadser); 66 } 67 } 68 69 void ncore_caiu_online(uint32_t caiu) 70 { 71 set_caiu(caiu, true); 72 } 73 74 void ncore_caiu_offline(uint32_t caiu) 75 { 76 set_caiu(caiu, false); 77 } 78 79 bool ncore_is_caiu_online(uint32_t caiu) 80 { 81 uint32_t stat = mmio_read_32(NCORE_CSADSE); 82 83 return ((stat & NCORE_CSADSE_DVMSNPEN(caiu)) != 0U); 84 } 85 86 void ncore_init(void) 87 { 88 uint32_t csuidr = mmio_read_32(NCORE_CSUID); 89 uint32_t numdirus, diru; 90 91 numdirus = NCORE_CSUID_NUMDIRUS(csuidr); 92 for (diru = 0U; diru < numdirus; diru++) { 93 /** 94 * Transition the directory to an online state by ensuring that 95 * all DIRUs within the interface are operational. 96 */ 97 ncore_diru_online(diru); 98 } 99 } 100