xref: /rk3399_ARM-atf/plat/nxp/s32/s32g274ardb2/s32cc_ncore.c (revision b47dddd061e92054c3b2096fc8aa9688bfef68d6)
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