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