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