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 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 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 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 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 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 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