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