blob: 82666263250e125bfc5e0d6f108497d1c68ff3b9 [file] [log] [blame]
/*
* Copyright (c) 2018, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <arch.h>
#include <arch_helpers.h>
#include <assert.h>
#include <debug.h>
#include <drivers/arm/gic_v2.h>
void arm_gic_enable_interrupts_local(void)
{
gicv2_enable_cpuif();
}
void arm_gic_setup_local(void)
{
gicv2_probe_gic_cpu_id();
gicv2_setup_cpuif();
}
void arm_gic_disable_interrupts_local(void)
{
gicv2_disable_cpuif();
}
void arm_gic_save_context_local(void)
{
gicv2_save_cpuif_context();
}
void arm_gic_restore_context_local(void)
{
gicv2_restore_cpuif_context();
}
void arm_gic_save_context_global(void)
{
gicv2_save_sgi_ppi_context();
}
void arm_gic_restore_context_global(void)
{
gicv2_setup_distif();
gicv2_restore_sgi_ppi_context();
}
void arm_gic_setup_global(void)
{
gicv2_setup_distif();
}
unsigned int arm_gic_get_intr_priority(unsigned int num)
{
return gicv2_gicd_get_ipriorityr(num);
}
void arm_gic_set_intr_priority(unsigned int num,
unsigned int priority)
{
gicv2_gicd_set_ipriorityr(num, priority);
}
void arm_gic_send_sgi(unsigned int sgi_id, unsigned int core_pos)
{
gicv2_send_sgi(sgi_id, core_pos);
}
void arm_gic_set_intr_target(unsigned int num, unsigned int core_pos)
{
gicv2_set_itargetsr(num, core_pos);
}
unsigned int arm_gic_intr_enabled(unsigned int num)
{
return gicv2_gicd_get_isenabler(num) != 0;
}
void arm_gic_intr_enable(unsigned int num)
{
gicv2_gicd_set_isenabler(num);
}
void arm_gic_intr_disable(unsigned int num)
{
gicv2_gicd_set_icenabler(num);
}
unsigned int arm_gic_intr_ack(unsigned int *raw_iar)
{
assert(raw_iar);
*raw_iar = gicv2_gicc_read_iar();
return get_gicc_iar_intid(*raw_iar);
}
unsigned int arm_gic_is_intr_pending(unsigned int num)
{
return gicv2_gicd_get_ispendr(num);
}
void arm_gic_intr_clear(unsigned int num)
{
gicv2_gicd_set_icpendr(num);
}
void arm_gic_end_of_intr(unsigned int raw_iar)
{
gicv2_gicc_write_eoir(raw_iar);
}
void arm_gic_init(uintptr_t gicc_base,
uintptr_t gicd_base,
uintptr_t gicr_base)
{
gicv2_init(gicc_base, gicd_base);
INFO("ARM GIC v2 driver initialized\n");
}