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 <stddef.h>
8*09d40e0eSAntonio Nino Diaz
9*09d40e0eSAntonio Nino Diaz #include <arch_helpers.h>
10*09d40e0eSAntonio Nino Diaz #include <drivers/arm/cci.h>
11*09d40e0eSAntonio Nino Diaz #include <lib/utils_def.h>
12d8e919c7SMasahiro Yamada
13d8e919c7SMasahiro Yamada #include "uniphier.h"
14d8e919c7SMasahiro Yamada
15d8e919c7SMasahiro Yamada #define UNIPHIER_CCI500_BASE 0x5FD00000
16d8e919c7SMasahiro Yamada
174fc1a381SSatoshi Ikawa static const int uniphier_cci_map[] = {1, 0};
18d8e919c7SMasahiro Yamada
__uniphier_cci_init(void)19d8e919c7SMasahiro Yamada static void __uniphier_cci_init(void)
20d8e919c7SMasahiro Yamada {
21d8e919c7SMasahiro Yamada cci_init(UNIPHIER_CCI500_BASE, uniphier_cci_map,
22d8e919c7SMasahiro Yamada ARRAY_SIZE(uniphier_cci_map));
23d8e919c7SMasahiro Yamada }
24d8e919c7SMasahiro Yamada
__uniphier_cci_enable(void)25d8e919c7SMasahiro Yamada static void __uniphier_cci_enable(void)
26d8e919c7SMasahiro Yamada {
27d8e919c7SMasahiro Yamada cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1()));
28d8e919c7SMasahiro Yamada }
29d8e919c7SMasahiro Yamada
__uniphier_cci_disable(void)30d8e919c7SMasahiro Yamada static void __uniphier_cci_disable(void)
31d8e919c7SMasahiro Yamada {
32d8e919c7SMasahiro Yamada cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1()));
33d8e919c7SMasahiro Yamada }
34d8e919c7SMasahiro Yamada
35d8e919c7SMasahiro Yamada struct uniphier_cci_ops {
36d8e919c7SMasahiro Yamada void (*init)(void);
37d8e919c7SMasahiro Yamada void (*enable)(void);
38d8e919c7SMasahiro Yamada void (*disable)(void);
39d8e919c7SMasahiro Yamada };
40d8e919c7SMasahiro Yamada
41d8e919c7SMasahiro Yamada static const struct uniphier_cci_ops uniphier_cci_ops_table[] = {
42d8e919c7SMasahiro Yamada [UNIPHIER_SOC_LD11] = {
43d8e919c7SMasahiro Yamada .init = NULL,
44d8e919c7SMasahiro Yamada .enable = NULL,
45d8e919c7SMasahiro Yamada .disable = NULL,
46d8e919c7SMasahiro Yamada },
47d8e919c7SMasahiro Yamada [UNIPHIER_SOC_LD20] = {
48d8e919c7SMasahiro Yamada .init = __uniphier_cci_init,
49d8e919c7SMasahiro Yamada .enable = __uniphier_cci_enable,
50d8e919c7SMasahiro Yamada .disable = __uniphier_cci_disable,
51d8e919c7SMasahiro Yamada },
52d8e919c7SMasahiro Yamada [UNIPHIER_SOC_PXS3] = {
53d8e919c7SMasahiro Yamada .init = NULL,
54d8e919c7SMasahiro Yamada .enable = NULL,
55d8e919c7SMasahiro Yamada .disable = NULL,
56d8e919c7SMasahiro Yamada },
57d8e919c7SMasahiro Yamada };
58d8e919c7SMasahiro Yamada
59d8e919c7SMasahiro Yamada static struct uniphier_cci_ops uniphier_cci_ops;
60d8e919c7SMasahiro Yamada
uniphier_cci_init(unsigned int soc)61d8e919c7SMasahiro Yamada void uniphier_cci_init(unsigned int soc)
62d8e919c7SMasahiro Yamada {
63d8e919c7SMasahiro Yamada uniphier_cci_ops = uniphier_cci_ops_table[soc];
64d8e919c7SMasahiro Yamada flush_dcache_range((uint64_t)&uniphier_cci_ops,
65d8e919c7SMasahiro Yamada sizeof(uniphier_cci_ops));
66d8e919c7SMasahiro Yamada
67d8e919c7SMasahiro Yamada if (uniphier_cci_ops.init)
68d8e919c7SMasahiro Yamada uniphier_cci_ops.init();
69d8e919c7SMasahiro Yamada }
70d8e919c7SMasahiro Yamada
uniphier_cci_enable(void)71d8e919c7SMasahiro Yamada void uniphier_cci_enable(void)
72d8e919c7SMasahiro Yamada {
73d8e919c7SMasahiro Yamada if (uniphier_cci_ops.enable)
74d8e919c7SMasahiro Yamada uniphier_cci_ops.enable();
75d8e919c7SMasahiro Yamada }
76d8e919c7SMasahiro Yamada
uniphier_cci_disable(void)77d8e919c7SMasahiro Yamada void uniphier_cci_disable(void)
78d8e919c7SMasahiro Yamada {
79d8e919c7SMasahiro Yamada if (uniphier_cci_ops.disable)
80d8e919c7SMasahiro Yamada uniphier_cci_ops.disable();
81d8e919c7SMasahiro Yamada }
82