1 /* 2 * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <platform_def.h> 8 9 #include <arch.h> 10 #include <drivers/arm/ccn.h> 11 12 #include <plat_arm.h> 13 14 static const unsigned char master_to_rn_id_map[] = { 15 PLAT_ARM_CLUSTER_TO_CCN_ID_MAP 16 }; 17 18 static const ccn_desc_t arm_ccn_desc = { 19 .periphbase = PLAT_ARM_CCN_BASE, 20 .num_masters = ARRAY_SIZE(master_to_rn_id_map), 21 .master_to_rn_id_map = master_to_rn_id_map 22 }; 23 24 CASSERT(PLAT_ARM_CLUSTER_COUNT == ARRAY_SIZE(master_to_rn_id_map), 25 assert_invalid_cluster_count_for_ccn_variant); 26 27 /****************************************************************************** 28 * The following functions are defined as weak to allow a platform to override 29 * the way ARM CCN driver is initialised and used. 30 *****************************************************************************/ 31 #pragma weak plat_arm_interconnect_init 32 #pragma weak plat_arm_interconnect_enter_coherency 33 #pragma weak plat_arm_interconnect_exit_coherency 34 35 36 /****************************************************************************** 37 * Helper function to initialize ARM CCN driver. 38 *****************************************************************************/ 39 void __init plat_arm_interconnect_init(void) 40 { 41 ccn_init(&arm_ccn_desc); 42 } 43 44 /****************************************************************************** 45 * Helper function to place current master into coherency 46 *****************************************************************************/ 47 void plat_arm_interconnect_enter_coherency(void) 48 { 49 ccn_enter_snoop_dvm_domain(1 << MPIDR_AFFLVL1_VAL(read_mpidr_el1())); 50 } 51 52 /****************************************************************************** 53 * Helper function to remove current master from coherency 54 *****************************************************************************/ 55 void plat_arm_interconnect_exit_coherency(void) 56 { 57 ccn_exit_snoop_dvm_domain(1 << MPIDR_AFFLVL1_VAL(read_mpidr_el1())); 58 } 59