113 lines
2.9 KiB
C
113 lines
2.9 KiB
C
/*
|
|
* Copyright (c) 2016 Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Abstraction layer for x86 interrupt controllers
|
|
*
|
|
* Most x86 just support APIC. However we are starting to see design
|
|
* variants such as MVIC or APICs with reduced feature sets. This
|
|
* interface provides a layer of abstraction between the core arch code
|
|
* and the interrupt controller implementation for x86
|
|
*/
|
|
|
|
#ifndef IRQ_CONTROLLER_H
|
|
#define IRQ_CONTROLLER_H
|
|
|
|
#ifdef CONFIG_MVIC
|
|
#include <drivers/mvic.h>
|
|
#else
|
|
#include <drivers/sysapic.h>
|
|
#endif
|
|
|
|
/* Triggering flags abstraction layer.
|
|
* If a particular set of triggers is not supported, leave undefined
|
|
*/
|
|
#define IRQ_TRIGGER_EDGE _IRQ_TRIGGER_EDGE
|
|
#define IRQ_TRIGGER_LEVEL _IRQ_TRIGGER_LEVEL
|
|
|
|
#define IRQ_POLARITY_HIGH _IRQ_POLARITY_HIGH
|
|
#define IRQ_POLARITY_LOW _IRQ_POLARITY_LOW
|
|
|
|
#ifndef _ASMLANGUAGE
|
|
|
|
#if CONFIG_X86_FIXED_IRQ_MAPPING
|
|
/**
|
|
* @brief Return fixed mapping for an IRQ
|
|
*
|
|
* @param irq Interrupt line
|
|
* @return Vector this interrupt has been assigned to
|
|
*/
|
|
#define _IRQ_CONTROLLER_VECTOR_MAPPING(irq) \
|
|
__IRQ_CONTROLLER_VECTOR_MAPPING(irq)
|
|
#endif
|
|
|
|
/**
|
|
*
|
|
* @brief Program an interrupt
|
|
*
|
|
* This function sets the triggering options for an IRQ and also associates
|
|
* the IRQ with its vector in the IDT. This does not enable the interrupt
|
|
* line, it will be left masked.
|
|
*
|
|
* The flags parameter is limited to the IRQ_TRIGGER_* defines above. In
|
|
* addition, not all interrupt controllers support all flags.
|
|
*
|
|
* @param irq Virtualized IRQ
|
|
* @param vector Vector Number
|
|
* @param flags Interrupt flags
|
|
*
|
|
* @returns: N/A
|
|
*/
|
|
static inline void _irq_controller_irq_config(unsigned int vector,
|
|
unsigned int irq, uint32_t flags)
|
|
{
|
|
__irq_controller_irq_config(vector, irq, flags);
|
|
}
|
|
|
|
/**
|
|
* @brief Return the vector of the currently in-service ISR
|
|
*
|
|
* This function should be called in interrupt context.
|
|
* It is not expected for this function to reveal the identity of
|
|
* vectors triggered by a CPU exception or 'int' instruction.
|
|
*
|
|
* @return the vector of the interrupt that is currently being processed, or
|
|
* -1 if this can't be determined
|
|
*/
|
|
static inline int _irq_controller_isr_vector_get(void)
|
|
{
|
|
return __irq_controller_isr_vector_get();
|
|
}
|
|
|
|
|
|
static inline void _irq_controller_eoi(void)
|
|
{
|
|
__irq_controller_eoi();
|
|
}
|
|
|
|
#else /* _ASMLANGUAGE */
|
|
|
|
/**
|
|
* @brief Send EOI to the interrupt controller
|
|
*
|
|
* This macro is used by the core interrupt handling code. Interrupts
|
|
* will be locked when this gets called and will not be unlocked until
|
|
* 'iret' has been issued.
|
|
*
|
|
* This macro is used in exactly one spot in intStub.S, in _IntExitWithEoi.
|
|
* At the time this is called, implementations are free to use the caller-
|
|
* saved registers eax, edx, ecx for their own purposes with impunity but
|
|
* need to preserve all callee-saved registers.
|
|
*/
|
|
.macro _irq_controller_eoi_macro
|
|
__irq_controller_eoi_macro
|
|
.endm
|
|
|
|
#endif /* _ASMLANGUAGE */
|
|
|
|
#endif /* IRQ_CONTROLLER_H */
|