bsp/qoriq: Virtual interrupt controller support

Update #3085.
This commit is contained in:
Sebastian Huber
2017-09-08 10:11:20 +02:00
parent 134fe56901
commit df62e51974

View File

@@ -7,7 +7,7 @@
*/
/*
* Copyright (c) 2010-2015 embedded brains GmbH. All rights reserved.
* Copyright (c) 2010, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -26,6 +26,8 @@
#include <libcpu/powerpc-utility.h>
#include <asm/epapr_hcalls.h>
#include <bsp.h>
#include <bsp/irq.h>
#include <bsp/irq-generic.h>
@@ -33,6 +35,82 @@
#include <bsp/utility.h>
#include <bsp/qoriq.h>
RTEMS_INTERRUPT_LOCK_DEFINE(static, lock, "QorIQ IRQ")
#define SPURIOUS 0xffff
#ifdef QORIQ_IS_HYPERVISOR_GUEST
void bsp_interrupt_set_affinity(
rtems_vector_number vector,
const Processor_mask *affinity
)
{
uint32_t config;
unsigned int priority;
uint32_t destination;
uint32_t new_destination;
rtems_interrupt_lock_context lock_context;
new_destination = _Processor_mask_Find_last_set(affinity) - 1;
rtems_interrupt_lock_acquire(&lock, &lock_context);
ev_int_get_config(vector, &config, &priority, &destination);
ev_int_set_config(vector, config, priority, new_destination);
rtems_interrupt_lock_release(&lock, &lock_context);
}
void bsp_interrupt_get_affinity(
rtems_vector_number vector,
Processor_mask *affinity
)
{
uint32_t config;
unsigned int priority;
uint32_t destination;
ev_int_get_config(vector, &config, &priority, &destination);
_Processor_mask_From_uint32_t(affinity, destination, 0);
}
void bsp_interrupt_vector_enable(rtems_vector_number vector)
{
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
ev_int_set_mask(vector, 0);
}
void bsp_interrupt_vector_disable(rtems_vector_number vector)
{
bsp_interrupt_assert(bsp_interrupt_is_valid_vector(vector));
ev_int_set_mask(vector, 1);
}
void bsp_interrupt_dispatch(void)
{
unsigned int vector;
ev_int_iack(0, &vector);
if (vector != SPURIOUS) {
uint32_t msr;
msr = ppc_external_exceptions_enable();
bsp_interrupt_handler_dispatch(vector);
ppc_external_exceptions_disable(msr);
ev_int_eoi(vector);
} else {
bsp_interrupt_handler_default(vector);
}
}
rtems_status_code bsp_interrupt_facility_initialize(void)
{
return RTEMS_SUCCESSFUL;
}
#else /* !QORIQ_IS_HYPERVISOR_GUEST */
#define VPR_MSK BSP_BBIT32(0)
#define VPR_A BSP_BBIT32(1)
#define VPR_P BSP_BBIT32(8)
@@ -47,10 +125,6 @@
#define GCR_RST BSP_BBIT32(0)
#define GCR_M BSP_BBIT32(2)
#define SPURIOUS 0xffff
RTEMS_INTERRUPT_LOCK_DEFINE(static, lock, "QorIQ IRQ")
#define SRC_CFG_IDX(i) ((i) - QORIQ_IRQ_EXT_BASE)
static const uint16_t src_cfg_offsets [] = {
@@ -291,3 +365,5 @@ rtems_status_code bsp_interrupt_facility_initialize(void)
return RTEMS_SUCCESSFUL;
}
#endif /* QORIQ_IS_HYPERVISOR_GUEST */