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