1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2015-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 <drivers/arm/gicv2.h> 10*54fd6939SJiyong Park #include <plat/common/platform.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park /****************************************************************************** 13*54fd6939SJiyong Park * On a GICv2 system, the Group 1 secure interrupts are treated as Group 0 14*54fd6939SJiyong Park * interrupts. 15*54fd6939SJiyong Park *****************************************************************************/ 16*54fd6939SJiyong Park static const interrupt_prop_t poplar_interrupt_props[] = { 17*54fd6939SJiyong Park POPLAR_G1S_IRQ_PROPS(GICV2_INTR_GROUP0), 18*54fd6939SJiyong Park POPLAR_G0_IRQ_PROPS(GICV2_INTR_GROUP0) 19*54fd6939SJiyong Park }; 20*54fd6939SJiyong Park 21*54fd6939SJiyong Park static unsigned int target_mask_array[PLATFORM_CORE_COUNT]; 22*54fd6939SJiyong Park 23*54fd6939SJiyong Park static const gicv2_driver_data_t poplar_gic_data = { 24*54fd6939SJiyong Park .gicd_base = POPLAR_GICD_BASE, 25*54fd6939SJiyong Park .gicc_base = POPLAR_GICC_BASE, 26*54fd6939SJiyong Park .interrupt_props = poplar_interrupt_props, 27*54fd6939SJiyong Park .interrupt_props_num = ARRAY_SIZE(poplar_interrupt_props), 28*54fd6939SJiyong Park .target_masks = target_mask_array, 29*54fd6939SJiyong Park .target_masks_num = ARRAY_SIZE(target_mask_array), 30*54fd6939SJiyong Park }; 31*54fd6939SJiyong Park 32*54fd6939SJiyong Park /****************************************************************************** 33*54fd6939SJiyong Park * Helper to initialize the GICv2 only driver. 34*54fd6939SJiyong Park *****************************************************************************/ poplar_gic_driver_init(void)35*54fd6939SJiyong Parkvoid poplar_gic_driver_init(void) 36*54fd6939SJiyong Park { 37*54fd6939SJiyong Park gicv2_driver_init(&poplar_gic_data); 38*54fd6939SJiyong Park } 39*54fd6939SJiyong Park poplar_gic_init(void)40*54fd6939SJiyong Parkvoid poplar_gic_init(void) 41*54fd6939SJiyong Park { 42*54fd6939SJiyong Park gicv2_distif_init(); 43*54fd6939SJiyong Park gicv2_pcpu_distif_init(); 44*54fd6939SJiyong Park gicv2_set_pe_target_mask(plat_my_core_pos()); 45*54fd6939SJiyong Park gicv2_cpuif_enable(); 46*54fd6939SJiyong Park } 47*54fd6939SJiyong Park 48*54fd6939SJiyong Park /****************************************************************************** 49*54fd6939SJiyong Park * Helper to enable the GICv2 CPU interface 50*54fd6939SJiyong Park *****************************************************************************/ poplar_gic_cpuif_enable(void)51*54fd6939SJiyong Parkvoid poplar_gic_cpuif_enable(void) 52*54fd6939SJiyong Park { 53*54fd6939SJiyong Park gicv2_cpuif_enable(); 54*54fd6939SJiyong Park } 55*54fd6939SJiyong Park 56*54fd6939SJiyong Park /****************************************************************************** 57*54fd6939SJiyong Park * Helper to initialize the per cpu distributor interface in GICv2 58*54fd6939SJiyong Park *****************************************************************************/ poplar_gic_pcpu_init(void)59*54fd6939SJiyong Parkvoid poplar_gic_pcpu_init(void) 60*54fd6939SJiyong Park { 61*54fd6939SJiyong Park gicv2_pcpu_distif_init(); 62*54fd6939SJiyong Park gicv2_set_pe_target_mask(plat_my_core_pos()); 63*54fd6939SJiyong Park } 64