1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <platform_def.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <drivers/arm/gicv2.h> 10*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h> 11*91f16700Schasinglulu #include <plat/common/platform.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu /****************************************************************************** 14*91f16700Schasinglulu * The following functions are defined as weak to allow a platform to override 15*91f16700Schasinglulu * the way the GICv2 driver is initialised and used. 16*91f16700Schasinglulu *****************************************************************************/ 17*91f16700Schasinglulu #pragma weak plat_arm_gic_driver_init 18*91f16700Schasinglulu #pragma weak plat_arm_gic_init 19*91f16700Schasinglulu #pragma weak plat_arm_gic_cpuif_enable 20*91f16700Schasinglulu #pragma weak plat_arm_gic_cpuif_disable 21*91f16700Schasinglulu #pragma weak plat_arm_gic_pcpu_init 22*91f16700Schasinglulu 23*91f16700Schasinglulu /****************************************************************************** 24*91f16700Schasinglulu * On a GICv2 system, the Group 1 secure interrupts are treated as Group 0 25*91f16700Schasinglulu * interrupts. 26*91f16700Schasinglulu *****************************************************************************/ 27*91f16700Schasinglulu static const interrupt_prop_t arm_interrupt_props[] = { 28*91f16700Schasinglulu PLAT_ARM_G1S_IRQ_PROPS(GICV2_INTR_GROUP0), 29*91f16700Schasinglulu PLAT_ARM_G0_IRQ_PROPS(GICV2_INTR_GROUP0) 30*91f16700Schasinglulu }; 31*91f16700Schasinglulu 32*91f16700Schasinglulu static unsigned int target_mask_array[PLATFORM_CORE_COUNT]; 33*91f16700Schasinglulu 34*91f16700Schasinglulu static const gicv2_driver_data_t arm_gic_data = { 35*91f16700Schasinglulu .gicd_base = PLAT_ARM_GICD_BASE, 36*91f16700Schasinglulu .gicc_base = PLAT_ARM_GICC_BASE, 37*91f16700Schasinglulu .interrupt_props = arm_interrupt_props, 38*91f16700Schasinglulu .interrupt_props_num = ARRAY_SIZE(arm_interrupt_props), 39*91f16700Schasinglulu .target_masks = target_mask_array, 40*91f16700Schasinglulu .target_masks_num = ARRAY_SIZE(target_mask_array), 41*91f16700Schasinglulu }; 42*91f16700Schasinglulu 43*91f16700Schasinglulu /****************************************************************************** 44*91f16700Schasinglulu * ARM common helper to initialize the GICv2 only driver. 45*91f16700Schasinglulu *****************************************************************************/ 46*91f16700Schasinglulu void plat_arm_gic_driver_init(void) 47*91f16700Schasinglulu { 48*91f16700Schasinglulu gicv2_driver_init(&arm_gic_data); 49*91f16700Schasinglulu } 50*91f16700Schasinglulu 51*91f16700Schasinglulu void plat_arm_gic_init(void) 52*91f16700Schasinglulu { 53*91f16700Schasinglulu gicv2_distif_init(); 54*91f16700Schasinglulu gicv2_pcpu_distif_init(); 55*91f16700Schasinglulu gicv2_set_pe_target_mask(plat_my_core_pos()); 56*91f16700Schasinglulu gicv2_cpuif_enable(); 57*91f16700Schasinglulu } 58*91f16700Schasinglulu 59*91f16700Schasinglulu /****************************************************************************** 60*91f16700Schasinglulu * ARM common helper to enable the GICv2 CPU interface 61*91f16700Schasinglulu *****************************************************************************/ 62*91f16700Schasinglulu void plat_arm_gic_cpuif_enable(void) 63*91f16700Schasinglulu { 64*91f16700Schasinglulu gicv2_cpuif_enable(); 65*91f16700Schasinglulu } 66*91f16700Schasinglulu 67*91f16700Schasinglulu /****************************************************************************** 68*91f16700Schasinglulu * ARM common helper to disable the GICv2 CPU interface 69*91f16700Schasinglulu *****************************************************************************/ 70*91f16700Schasinglulu void plat_arm_gic_cpuif_disable(void) 71*91f16700Schasinglulu { 72*91f16700Schasinglulu gicv2_cpuif_disable(); 73*91f16700Schasinglulu } 74*91f16700Schasinglulu 75*91f16700Schasinglulu /****************************************************************************** 76*91f16700Schasinglulu * ARM common helper to initialize the per cpu distributor interface in GICv2 77*91f16700Schasinglulu *****************************************************************************/ 78*91f16700Schasinglulu void plat_arm_gic_pcpu_init(void) 79*91f16700Schasinglulu { 80*91f16700Schasinglulu gicv2_pcpu_distif_init(); 81*91f16700Schasinglulu gicv2_set_pe_target_mask(plat_my_core_pos()); 82*91f16700Schasinglulu } 83*91f16700Schasinglulu 84*91f16700Schasinglulu /****************************************************************************** 85*91f16700Schasinglulu * Stubs for Redistributor power management. Although GICv2 doesn't have 86*91f16700Schasinglulu * Redistributor interface, these are provided for the sake of uniform GIC API 87*91f16700Schasinglulu *****************************************************************************/ 88*91f16700Schasinglulu void plat_arm_gic_redistif_on(void) 89*91f16700Schasinglulu { 90*91f16700Schasinglulu return; 91*91f16700Schasinglulu } 92*91f16700Schasinglulu 93*91f16700Schasinglulu void plat_arm_gic_redistif_off(void) 94*91f16700Schasinglulu { 95*91f16700Schasinglulu return; 96*91f16700Schasinglulu } 97*91f16700Schasinglulu 98*91f16700Schasinglulu 99*91f16700Schasinglulu /****************************************************************************** 100*91f16700Schasinglulu * ARM common helper to save & restore the GICv3 on resume from system suspend. 101*91f16700Schasinglulu * The normal world currently takes care of saving and restoring the GICv2 102*91f16700Schasinglulu * registers due to legacy reasons. Hence we just initialize the Distributor 103*91f16700Schasinglulu * on resume from system suspend. 104*91f16700Schasinglulu *****************************************************************************/ 105*91f16700Schasinglulu void plat_arm_gic_save(void) 106*91f16700Schasinglulu { 107*91f16700Schasinglulu return; 108*91f16700Schasinglulu } 109*91f16700Schasinglulu 110*91f16700Schasinglulu void plat_arm_gic_resume(void) 111*91f16700Schasinglulu { 112*91f16700Schasinglulu gicv2_distif_init(); 113*91f16700Schasinglulu gicv2_pcpu_distif_init(); 114*91f16700Schasinglulu } 115