xref: /rk3399_ARM-atf/plat/imx/common/plat_imx8_gic.c (revision bd08def3c9b67a3b95cebdc4ad6433948fd2abbe)
1*bd08def3SAnson Huang /*
2*bd08def3SAnson Huang  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3*bd08def3SAnson Huang  *
4*bd08def3SAnson Huang  * SPDX-License-Identifier: BSD-3-Clause
5*bd08def3SAnson Huang  */
6*bd08def3SAnson Huang 
7*bd08def3SAnson Huang #include <bl_common.h>
8*bd08def3SAnson Huang #include <gicv3.h>
9*bd08def3SAnson Huang #include <plat_imx8.h>
10*bd08def3SAnson Huang #include <platform.h>
11*bd08def3SAnson Huang #include <platform_def.h>
12*bd08def3SAnson Huang #include <utils.h>
13*bd08def3SAnson Huang 
14*bd08def3SAnson Huang /* the GICv3 driver only needs to be initialized in EL3 */
15*bd08def3SAnson Huang uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT];
16*bd08def3SAnson Huang 
17*bd08def3SAnson Huang /* array of Group1 secure interrupts to be configured by the gic driver */
18*bd08def3SAnson Huang const unsigned int g1s_interrupt_array[] = { 6 };
19*bd08def3SAnson Huang 
20*bd08def3SAnson Huang /* array of Group0 interrupts to be configured by the gic driver */
21*bd08def3SAnson Huang const unsigned int g0_interrupt_array[] = { 7 };
22*bd08def3SAnson Huang 
23*bd08def3SAnson Huang static unsigned int plat_imx_mpidr_to_core_pos(unsigned long mpidr)
24*bd08def3SAnson Huang {
25*bd08def3SAnson Huang 	return (unsigned int)plat_core_pos_by_mpidr(mpidr);
26*bd08def3SAnson Huang }
27*bd08def3SAnson Huang 
28*bd08def3SAnson Huang const gicv3_driver_data_t arm_gic_data = {
29*bd08def3SAnson Huang 	.gicd_base = PLAT_GICD_BASE,
30*bd08def3SAnson Huang 	.gicr_base = PLAT_GICR_BASE,
31*bd08def3SAnson Huang 	.g0_interrupt_num = ARRAY_SIZE(g0_interrupt_array),
32*bd08def3SAnson Huang 	.g1s_interrupt_num = ARRAY_SIZE(g1s_interrupt_array),
33*bd08def3SAnson Huang 	.g0_interrupt_array = g0_interrupt_array,
34*bd08def3SAnson Huang 	.g1s_interrupt_array = g1s_interrupt_array,
35*bd08def3SAnson Huang 	.rdistif_num = PLATFORM_CORE_COUNT,
36*bd08def3SAnson Huang 	.rdistif_base_addrs = rdistif_base_addrs,
37*bd08def3SAnson Huang 	.mpidr_to_core_pos = plat_imx_mpidr_to_core_pos,
38*bd08def3SAnson Huang };
39*bd08def3SAnson Huang 
40*bd08def3SAnson Huang void plat_gic_driver_init(void)
41*bd08def3SAnson Huang {
42*bd08def3SAnson Huang 	/*
43*bd08def3SAnson Huang 	 * the GICv3 driver is initialized in EL3 and does not need
44*bd08def3SAnson Huang 	 * to be initialized again in S-EL1. This is because the S-EL1
45*bd08def3SAnson Huang 	 * can use GIC system registers to manage interrupts and does
46*bd08def3SAnson Huang 	 * not need GIC interface base addresses to be configured.
47*bd08def3SAnson Huang 	 */
48*bd08def3SAnson Huang #if IMAGE_BL31
49*bd08def3SAnson Huang 	gicv3_driver_init(&arm_gic_data);
50*bd08def3SAnson Huang #endif
51*bd08def3SAnson Huang }
52*bd08def3SAnson Huang 
53*bd08def3SAnson Huang void plat_gic_init(void)
54*bd08def3SAnson Huang {
55*bd08def3SAnson Huang 	gicv3_distif_init();
56*bd08def3SAnson Huang 	gicv3_rdistif_init(plat_my_core_pos());
57*bd08def3SAnson Huang 	gicv3_cpuif_enable(plat_my_core_pos());
58*bd08def3SAnson Huang }
59*bd08def3SAnson Huang 
60*bd08def3SAnson Huang void plat_gic_cpuif_enable(void)
61*bd08def3SAnson Huang {
62*bd08def3SAnson Huang 	gicv3_cpuif_enable(plat_my_core_pos());
63*bd08def3SAnson Huang }
64*bd08def3SAnson Huang 
65*bd08def3SAnson Huang void plat_gic_cpuif_disable(void)
66*bd08def3SAnson Huang {
67*bd08def3SAnson Huang 	gicv3_cpuif_disable(plat_my_core_pos());
68*bd08def3SAnson Huang }
69*bd08def3SAnson Huang 
70*bd08def3SAnson Huang void plat_gic_pcpu_init(void)
71*bd08def3SAnson Huang {
72*bd08def3SAnson Huang 	gicv3_rdistif_init(plat_my_core_pos());
73*bd08def3SAnson Huang }
74