xref: /aosp_15_r20/external/arm-trusted-firmware/plat/socionext/uniphier/uniphier_cci.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park /*
2*54fd6939SJiyong Park  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park  *
4*54fd6939SJiyong Park  * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park  */
6*54fd6939SJiyong Park 
7*54fd6939SJiyong Park #include <stddef.h>
8*54fd6939SJiyong Park 
9*54fd6939SJiyong Park #include <arch_helpers.h>
10*54fd6939SJiyong Park #include <drivers/arm/cci.h>
11*54fd6939SJiyong Park #include <lib/utils_def.h>
12*54fd6939SJiyong Park 
13*54fd6939SJiyong Park #include "uniphier.h"
14*54fd6939SJiyong Park 
15*54fd6939SJiyong Park #define UNIPHIER_CCI500_BASE	0x5FD00000
16*54fd6939SJiyong Park 
17*54fd6939SJiyong Park static const int uniphier_cci_map[] = {1, 0};
18*54fd6939SJiyong Park 
__uniphier_cci_init(void)19*54fd6939SJiyong Park static void __uniphier_cci_init(void)
20*54fd6939SJiyong Park {
21*54fd6939SJiyong Park 	cci_init(UNIPHIER_CCI500_BASE, uniphier_cci_map,
22*54fd6939SJiyong Park 		 ARRAY_SIZE(uniphier_cci_map));
23*54fd6939SJiyong Park }
24*54fd6939SJiyong Park 
__uniphier_cci_enable(void)25*54fd6939SJiyong Park static void __uniphier_cci_enable(void)
26*54fd6939SJiyong Park {
27*54fd6939SJiyong Park 	cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1()));
28*54fd6939SJiyong Park }
29*54fd6939SJiyong Park 
__uniphier_cci_disable(void)30*54fd6939SJiyong Park static void __uniphier_cci_disable(void)
31*54fd6939SJiyong Park {
32*54fd6939SJiyong Park 	cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1()));
33*54fd6939SJiyong Park }
34*54fd6939SJiyong Park 
35*54fd6939SJiyong Park struct uniphier_cci_ops {
36*54fd6939SJiyong Park 	void (*init)(void);
37*54fd6939SJiyong Park 	void (*enable)(void);
38*54fd6939SJiyong Park 	void (*disable)(void);
39*54fd6939SJiyong Park };
40*54fd6939SJiyong Park 
41*54fd6939SJiyong Park static const struct uniphier_cci_ops uniphier_cci_ops_table[] = {
42*54fd6939SJiyong Park 	[UNIPHIER_SOC_LD11] = {
43*54fd6939SJiyong Park 		.init = NULL,
44*54fd6939SJiyong Park 		.enable = NULL,
45*54fd6939SJiyong Park 		.disable = NULL,
46*54fd6939SJiyong Park 	},
47*54fd6939SJiyong Park 	[UNIPHIER_SOC_LD20] = {
48*54fd6939SJiyong Park 		.init = __uniphier_cci_init,
49*54fd6939SJiyong Park 		.enable = __uniphier_cci_enable,
50*54fd6939SJiyong Park 		.disable = __uniphier_cci_disable,
51*54fd6939SJiyong Park 	},
52*54fd6939SJiyong Park 	[UNIPHIER_SOC_PXS3] = {
53*54fd6939SJiyong Park 		.init = NULL,
54*54fd6939SJiyong Park 		.enable = NULL,
55*54fd6939SJiyong Park 		.disable = NULL,
56*54fd6939SJiyong Park 	},
57*54fd6939SJiyong Park };
58*54fd6939SJiyong Park 
59*54fd6939SJiyong Park static struct uniphier_cci_ops uniphier_cci_ops;
60*54fd6939SJiyong Park 
uniphier_cci_init(unsigned int soc)61*54fd6939SJiyong Park void uniphier_cci_init(unsigned int soc)
62*54fd6939SJiyong Park {
63*54fd6939SJiyong Park 	uniphier_cci_ops = uniphier_cci_ops_table[soc];
64*54fd6939SJiyong Park 	flush_dcache_range((uint64_t)&uniphier_cci_ops,
65*54fd6939SJiyong Park 			   sizeof(uniphier_cci_ops));
66*54fd6939SJiyong Park 
67*54fd6939SJiyong Park 	if (uniphier_cci_ops.init)
68*54fd6939SJiyong Park 		uniphier_cci_ops.init();
69*54fd6939SJiyong Park }
70*54fd6939SJiyong Park 
uniphier_cci_enable(void)71*54fd6939SJiyong Park void uniphier_cci_enable(void)
72*54fd6939SJiyong Park {
73*54fd6939SJiyong Park 	if (uniphier_cci_ops.enable)
74*54fd6939SJiyong Park 		uniphier_cci_ops.enable();
75*54fd6939SJiyong Park }
76*54fd6939SJiyong Park 
uniphier_cci_disable(void)77*54fd6939SJiyong Park void uniphier_cci_disable(void)
78*54fd6939SJiyong Park {
79*54fd6939SJiyong Park 	if (uniphier_cci_ops.disable)
80*54fd6939SJiyong Park 		uniphier_cci_ops.disable();
81*54fd6939SJiyong Park }
82