16fba6e04STony Xie /* 26fba6e04STony Xie * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 36fba6e04STony Xie * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 56fba6e04STony Xie */ 66fba6e04STony Xie 76fba6e04STony Xie #include <bl_common.h> 86fba6e04STony Xie #include <gicv3.h> 9*2d6f1f01SAntonio Nino Diaz #include <interrupt_props.h> 106fba6e04STony Xie #include <platform.h> 116fba6e04STony Xie #include <platform_def.h> 12ed81f3ebSSandrine Bailleux #include <utils.h> 136fba6e04STony Xie 146fba6e04STony Xie /****************************************************************************** 156fba6e04STony Xie * The following functions are defined as weak to allow a platform to override 166fba6e04STony Xie * the way the GICv3 driver is initialised and used. 176fba6e04STony Xie *****************************************************************************/ 186fba6e04STony Xie #pragma weak plat_rockchip_gic_driver_init 196fba6e04STony Xie #pragma weak plat_rockchip_gic_init 206fba6e04STony Xie #pragma weak plat_rockchip_gic_cpuif_enable 216fba6e04STony Xie #pragma weak plat_rockchip_gic_cpuif_disable 226fba6e04STony Xie #pragma weak plat_rockchip_gic_pcpu_init 236fba6e04STony Xie 246fba6e04STony Xie /* The GICv3 driver only needs to be initialized in EL3 */ 256fba6e04STony Xie uintptr_t rdistif_base_addrs[PLATFORM_CORE_COUNT]; 266fba6e04STony Xie 27*2d6f1f01SAntonio Nino Diaz static const interrupt_prop_t g01s_interrupt_props[] = { 28*2d6f1f01SAntonio Nino Diaz PLAT_RK_GICV3_G0_IRQS, 29*2d6f1f01SAntonio Nino Diaz PLAT_RK_GICV3_G1S_IRQS 306fba6e04STony Xie }; 316fba6e04STony Xie 326fba6e04STony Xie static unsigned int plat_rockchip_mpidr_to_core_pos(unsigned long mpidr) 336fba6e04STony Xie { 346fba6e04STony Xie return (unsigned int)plat_core_pos_by_mpidr(mpidr); 356fba6e04STony Xie } 366fba6e04STony Xie 376fba6e04STony Xie const gicv3_driver_data_t rockchip_gic_data = { 386fba6e04STony Xie .gicd_base = PLAT_RK_GICD_BASE, 396fba6e04STony Xie .gicr_base = PLAT_RK_GICR_BASE, 40*2d6f1f01SAntonio Nino Diaz .interrupt_props = g01s_interrupt_props, 41*2d6f1f01SAntonio Nino Diaz .interrupt_props_num = ARRAY_SIZE(g01s_interrupt_props), 426fba6e04STony Xie .rdistif_num = PLATFORM_CORE_COUNT, 436fba6e04STony Xie .rdistif_base_addrs = rdistif_base_addrs, 446fba6e04STony Xie .mpidr_to_core_pos = plat_rockchip_mpidr_to_core_pos, 456fba6e04STony Xie }; 466fba6e04STony Xie 476fba6e04STony Xie void plat_rockchip_gic_driver_init(void) 486fba6e04STony Xie { 496fba6e04STony Xie /* 506fba6e04STony Xie * The GICv3 driver is initialized in EL3 and does not need 516fba6e04STony Xie * to be initialized again in SEL1. This is because the S-EL1 526fba6e04STony Xie * can use GIC system registers to manage interrupts and does 536fba6e04STony Xie * not need GIC interface base addresses to be configured. 546fba6e04STony Xie */ 553d8256b2SMasahiro Yamada #ifdef IMAGE_BL31 566fba6e04STony Xie gicv3_driver_init(&rockchip_gic_data); 576fba6e04STony Xie #endif 586fba6e04STony Xie } 596fba6e04STony Xie 606fba6e04STony Xie /****************************************************************************** 616fba6e04STony Xie * RockChip common helper to initialize the GIC. Only invoked 626fba6e04STony Xie * by BL31 636fba6e04STony Xie *****************************************************************************/ 646fba6e04STony Xie void plat_rockchip_gic_init(void) 656fba6e04STony Xie { 666fba6e04STony Xie gicv3_distif_init(); 676fba6e04STony Xie gicv3_rdistif_init(plat_my_core_pos()); 686fba6e04STony Xie gicv3_cpuif_enable(plat_my_core_pos()); 696fba6e04STony Xie } 706fba6e04STony Xie 716fba6e04STony Xie /****************************************************************************** 726fba6e04STony Xie * RockChip common helper to enable the GIC CPU interface 736fba6e04STony Xie *****************************************************************************/ 746fba6e04STony Xie void plat_rockchip_gic_cpuif_enable(void) 756fba6e04STony Xie { 766fba6e04STony Xie gicv3_cpuif_enable(plat_my_core_pos()); 776fba6e04STony Xie } 786fba6e04STony Xie 796fba6e04STony Xie /****************************************************************************** 806fba6e04STony Xie * RockChip common helper to disable the GIC CPU interface 816fba6e04STony Xie *****************************************************************************/ 826fba6e04STony Xie void plat_rockchip_gic_cpuif_disable(void) 836fba6e04STony Xie { 846fba6e04STony Xie gicv3_cpuif_disable(plat_my_core_pos()); 856fba6e04STony Xie } 866fba6e04STony Xie 876fba6e04STony Xie /****************************************************************************** 886fba6e04STony Xie * RockChip common helper to initialize the per-cpu redistributor interface 896fba6e04STony Xie * in GICv3 906fba6e04STony Xie *****************************************************************************/ 916fba6e04STony Xie void plat_rockchip_gic_pcpu_init(void) 926fba6e04STony Xie { 936fba6e04STony Xie gicv3_rdistif_init(plat_my_core_pos()); 946fba6e04STony Xie } 95