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