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