1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #include <platform_def.h> 8*54fd6939SJiyong Park 9*54fd6939SJiyong Park #include <arch.h> 10*54fd6939SJiyong Park #include <drivers/arm/cci.h> 11*54fd6939SJiyong Park #include <lib/utils.h> 12*54fd6939SJiyong Park #include <plat/arm/common/plat_arm.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park static const int cci_map[] = { 15*54fd6939SJiyong Park PLAT_ARM_CCI_CLUSTER0_SL_IFACE_IX, 16*54fd6939SJiyong Park PLAT_ARM_CCI_CLUSTER1_SL_IFACE_IX 17*54fd6939SJiyong Park }; 18*54fd6939SJiyong Park 19*54fd6939SJiyong Park /****************************************************************************** 20*54fd6939SJiyong Park * The following functions are defined as weak to allow a platform to override 21*54fd6939SJiyong Park * the way ARM CCI driver is initialised and used. 22*54fd6939SJiyong Park *****************************************************************************/ 23*54fd6939SJiyong Park #pragma weak plat_arm_interconnect_init 24*54fd6939SJiyong Park #pragma weak plat_arm_interconnect_enter_coherency 25*54fd6939SJiyong Park #pragma weak plat_arm_interconnect_exit_coherency 26*54fd6939SJiyong Park 27*54fd6939SJiyong Park 28*54fd6939SJiyong Park /****************************************************************************** 29*54fd6939SJiyong Park * Helper function to initialize ARM CCI driver. 30*54fd6939SJiyong Park *****************************************************************************/ plat_arm_interconnect_init(void)31*54fd6939SJiyong Parkvoid __init plat_arm_interconnect_init(void) 32*54fd6939SJiyong Park { 33*54fd6939SJiyong Park cci_init(PLAT_ARM_CCI_BASE, cci_map, ARRAY_SIZE(cci_map)); 34*54fd6939SJiyong Park } 35*54fd6939SJiyong Park 36*54fd6939SJiyong Park /****************************************************************************** 37*54fd6939SJiyong Park * Helper function to place current master into coherency 38*54fd6939SJiyong Park *****************************************************************************/ plat_arm_interconnect_enter_coherency(void)39*54fd6939SJiyong Parkvoid plat_arm_interconnect_enter_coherency(void) 40*54fd6939SJiyong Park { 41*54fd6939SJiyong Park cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1())); 42*54fd6939SJiyong Park } 43*54fd6939SJiyong Park 44*54fd6939SJiyong Park /****************************************************************************** 45*54fd6939SJiyong Park * Helper function to remove current master from coherency 46*54fd6939SJiyong Park *****************************************************************************/ plat_arm_interconnect_exit_coherency(void)47*54fd6939SJiyong Parkvoid plat_arm_interconnect_exit_coherency(void) 48*54fd6939SJiyong Park { 49*54fd6939SJiyong Park cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr_el1())); 50*54fd6939SJiyong Park } 51