Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * 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, u32_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 */