xref: /aosp_15_r20/external/arm-trusted-firmware/plat/arm/common/arm_cci.c (revision 54fd6939e177f8ff529b10183254802c76df6d08)
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 Park void __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 Park void 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 Park void 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