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