From f1420515a787bd1448ae536dd091ce0b862268e9 Mon Sep 17 00:00:00 2001 From: Dmitriy Korovkin Date: Mon, 2 Nov 2015 18:06:08 -0500 Subject: [PATCH] irq: Add flags to IRQ_CONNECT_STATIC() macro and irq_connect() function Flags allow passing IRQ triggering option for x86 architecture. Each platform defines flags for a particular device and then device driver uses them when registers the interrupt handler. The change in API means that device drivers and sample applications need to use the new API. IRQ triggering configuration is now handled by device drivers by using flags passed to interrupt registering API: IRQ_CONNECT_STATIC() or irq_connect() Change-Id: Ibc4312ea2b4032a2efc5b913c6389f780a2a11d1 Signed-off-by: Dmitriy Korovkin --- arch/arc/core/irq_manage.c | 4 +- arch/arm/core/irq_manage.c | 4 +- arch/arm/platforms/fsl_frdm_k64f/board.h | 2 + arch/arm/platforms/ti_lm3s6965/board.h | 2 + arch/x86/core/intconnect.c | 9 +- arch/x86/platforms/galileo/board.h | 62 ++++-- arch/x86/platforms/galileo/galileo.c | 188 ------------------ arch/x86/platforms/ia32/board.h | 14 +- arch/x86/platforms/ia32/ia32.c | 52 ----- arch/x86/platforms/ia32_pci/board.h | 36 ++-- arch/x86/platforms/ia32_pci/ia32_pci.c | 131 ------------ drivers/bluetooth/uart.c | 3 +- drivers/console/uart_console.c | 3 +- drivers/gpio/gpio_dw.c | 3 +- drivers/i2c/i2c_dw.c | 3 +- drivers/interrupt_controller/system_apic.c | 13 +- drivers/shared_irq/shared_irq.c | 6 +- drivers/simple/uart.c | 3 +- drivers/spi/intel_spi.c | 6 +- drivers/timer/arcv2_timer0.c | 2 +- drivers/timer/hpet.c | 3 +- drivers/timer/loapic_timer.c | 2 +- include/arch/arc/arch.h | 5 +- include/arch/arc/v2/irq.h | 3 +- include/arch/arm/cortex_m/irq.h | 5 +- include/arch/x86/arch.h | 29 ++- include/microkernel/task_irq.h | 4 +- kernel/microkernel/k_irq.c | 6 +- samples/include/irq_test_common.h | 8 +- samples/microkernel/apps/nfc_hello/src/main.c | 2 +- .../footprint/src/microkernel_footprint.c | 2 +- .../benchmark/latency_measure/src/utils.c | 2 +- .../test/test_task_irq/src/test_device.c | 12 +- .../footprint/src/nanokernel_footprint.c | 2 +- .../object_footprint/src/nanokernel_objects.c | 2 +- 35 files changed, 164 insertions(+), 469 deletions(-) diff --git a/arch/arc/core/irq_manage.c b/arch/arc/core/irq_manage.c index fcc313ff734..904515cb6f2 100644 --- a/arch/arc/core/irq_manage.c +++ b/arch/arc/core/irq_manage.c @@ -159,9 +159,11 @@ int irq_connect( unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg + void *arg, + uint32_t flags ) { + ARG_UNUSED(flags); _irq_handler_set(irq, isr, arg); _irq_priority_set(irq, prio); return irq; diff --git a/arch/arm/core/irq_manage.c b/arch/arm/core/irq_manage.c index 6c7bf08b520..97b8f2943c9 100644 --- a/arch/arm/core/irq_manage.c +++ b/arch/arm/core/irq_manage.c @@ -139,8 +139,10 @@ void _irq_spurious(void *unused) int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg) + void *arg, + uint32_t flags) { + ARG_UNUSED(flags); _irq_handler_set(irq, isr, arg); _irq_priority_set(irq, prio); return irq; diff --git a/arch/arm/platforms/fsl_frdm_k64f/board.h b/arch/arm/platforms/fsl_frdm_k64f/board.h index 6244f3a7bb4..0b0eeea21ef 100644 --- a/arch/arm/platforms/fsl_frdm_k64f/board.h +++ b/arch/arm/platforms/fsl_frdm_k64f/board.h @@ -165,6 +165,8 @@ #define CONFIG_UART_PORT_4_REGS PERIPH_ADDR_BASE_UART4 #define CONFIG_UART_PORT_4_IRQ IRQ_UART4_STATUS +#define UART_IRQ_FLAGS 0 + extern struct device * const uart_devs[]; /* Uart console settings */ diff --git a/arch/arm/platforms/ti_lm3s6965/board.h b/arch/arm/platforms/ti_lm3s6965/board.h index d58fafaca62..6d833aaed84 100644 --- a/arch/arm/platforms/ti_lm3s6965/board.h +++ b/arch/arm/platforms/ti_lm3s6965/board.h @@ -99,6 +99,8 @@ #define CONFIG_UART_PORT_2_REGS PERIPH_ADDR_BASE_UART2 #define CONFIG_UART_PORT_2_IRQ IRQ_UART2 +#define UART_IRQ_FLAGS 0 + extern struct device * const uart_devs[]; /* Uart console configuration */ diff --git a/arch/x86/core/intconnect.c b/arch/x86/core/intconnect.c index 97d87708c6b..679b6bbc908 100644 --- a/arch/x86/core/intconnect.c +++ b/arch/x86/core/intconnect.c @@ -157,6 +157,7 @@ extern void *_DynIntStubsBegin; * @param priority requested priority of interrupt * @param routine the C interrupt handler * @param parameter parameter passed to C routine + * @param flags IRQ flags * * This routine connects an interrupt service routine (ISR) coded in C to * the specified hardware . An interrupt vector will be allocated to @@ -178,6 +179,9 @@ extern void *_DynIntStubsBegin; * will then be invoked with the single . When the ISR returns, a * context switch may occur. * + * On some platforms parameter needs to be specified to indicate if + * the irq is triggered by low or high level or by rising or falling edge. + * * The routine searches for the first available element in the dynamic_stubs * array and uses it for the stub. * @@ -199,7 +203,8 @@ extern void *_DynIntStubsBegin; */ int irq_connect(unsigned int irq, unsigned int priority, - void (*routine)(void *parameter), void *parameter) + void (*routine)(void *parameter), void *parameter, + uint32_t flags) { int vector; int stub_idx; @@ -217,7 +222,7 @@ int irq_connect(unsigned int irq, unsigned int priority, * _interrupt_vectors_allocated[] array for a suitable vector. */ - vector = _SysIntVecAlloc(irq, priority); + vector = _SysIntVecAlloc(irq, priority, flags); #if defined(DEBUG) /* * The return value from _SysIntVecAlloc() will be -1 if an invalid diff --git a/arch/x86/platforms/galileo/board.h b/arch/x86/platforms/galileo/board.h index 615a40a3c39..9c4311ea63f 100644 --- a/arch/x86/platforms/galileo/board.h +++ b/arch/x86/platforms/galileo/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -94,13 +94,13 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_GPIO_DW_0 #if defined(CONFIG_GPIO_DW_0_FALLING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_GPIO_DW_0_RISING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_HIGH) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_LOW) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* GPIO_DW_0 */ @@ -121,29 +121,57 @@ extern struct device * const uart_devs[]; #include #if defined(CONFIG_I2C_DW_IRQ_FALLING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_I2C_DW_IRQ_RISING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_HIGH) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_LOW) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_I2C_DW_0 */ #ifdef CONFIG_SPI_INTEL #if defined(CONFIG_SPI_INTEL_FALLING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_SPI_INTEL_RISING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_HIGH) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_LOW) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_SPI_INTEL */ +#if defined (CONFIG_SHARED_IRQ) && defined (CONFIG_IOAPIC) + +#if CONFIG_SHARED_IRQ_0 +#if defined(CONFIG_SHARED_IRQ_0_FALLING_EDGE) +#define SHARED_IRQ_0_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#elif defined(CONFIG_SHARED_IRQ_0_RISING_EDGE) +#define SHARED_IRQ_0_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_HIGH) +#define SHARED_IRQ_0_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_LOW) +#define SHARED_IRQ_0_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#endif +#endif /* CONFIG_SHARED_IRQ_0 */ + +#if CONFIG_SHARED_IRQ_1 +#if defined(CONFIG_SHARED_IRQ_1_FALLING_EDGE) +#define SHARED_IRQ_1_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#elif defined(CONFIG_SHARED_IRQ_1_RISING_EDGE) +#define SHARED_IRQ_1_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_HIGH) +#define SHARED_IRQ_1_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_LOW) +#define SHARED_IRQ_1_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#endif +#endif /* CONFIG_SHARED_IRQ_1 */ + +#endif /* CONFIG_SHARED_IRQ && CONFIG_IOAPIC */ + /* * The irq_connect() API connects to a (virtualized) IRQ and the * associated interrupt controller is programmed with the allocated vector. @@ -213,6 +241,4 @@ static inline int pci_irq2pin(int irq) return irq - NUM_STD_IRQS + 1; } -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/galileo/galileo.c b/arch/x86/platforms/galileo/galileo.c index 4f4dc022da9..51c55a817cf 100644 --- a/arch/x86/platforms/galileo/galileo.c +++ b/arch/x86/platforms/galileo/galileo.c @@ -38,118 +38,8 @@ #include #include #include -#include -#ifdef CONFIG_I2C_DW_0 -#ifdef CONFIG_I2C_DW_0_IRQ_DIRECT -static int dw_i2c0_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_I2C_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_I2C_DW_0_IRQ), - I2C_DW_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(i2cirq_0, "", dw_i2c0_irq_set, NULL); -pre_kernel_late_init(i2cirq_0, NULL); - -#endif /* CONFIG_I2C_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_I2C_DW_0 */ - -#ifdef CONFIG_GPIO_DW_0 -#ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT -static int gpio_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_GPIO_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_GPIO_DW_0_IRQ), - GPIO_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(gpioirq_0, "", gpio_irq_set_0, NULL); -pre_kernel_early_init(gpioirq_0, NULL); - -#endif /* CONFIG_GPIO_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_GPIO_DW_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_0 -static int spi_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_0_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_0, "", spi_irq_set_0, NULL); -pre_kernel_early_init(spiirq_0, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_1 -static int spi_irq_set_1(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_1_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return 0; - -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_1, "", spi_irq_set_1, NULL); -pre_kernel_early_init(spiirq_1, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_1 */ - -#ifdef CONFIG_ETH_DW_0 -#ifdef CONFIG_ETH_DW_0_IRQ_DIRECT -static int eth_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_ETH_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_ETH_DW_0_IRQ), - ETH_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(ethirq_0, "", eth_irq_set_0, NULL); -pre_kernel_early_init(ethirq_0, NULL); - -#endif /* CONFIG_ETH_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_ETH_DW_0 */ - -#ifdef CONFIG_SHARED_IRQ -#ifdef CONFIG_IOAPIC -#include - -#if defined(CONFIG_SHARED_IRQ_0_FALLING_EDGE) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) -#elif defined(CONFIG_SHARED_IRQ_0_RISING_EDGE) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_HIGH) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_0_LEVEL_LOW) -#define SHARED_IRQ_0_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) -#endif - -#if defined(CONFIG_SHARED_IRQ_1_FALLING_EDGE) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) -#elif defined(CONFIG_SHARED_IRQ_1_RISING_EDGE) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_HIGH) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) -#elif defined(CONFIG_SHARED_IRQ_1_LEVEL_LOW) -#define SHARED_IRQ_1_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) -#endif - -#endif /* CONFIG_IOAPIC */ -#endif /* CONFIG_SHARED_IRQ */ - #ifdef CONFIG_PCI_LEGACY_BRIDGE /** * @@ -184,58 +74,6 @@ DECLARE_DEVICE_INIT_CONFIG(pci_legacy_bridge_0, "", pci_legacy_bridge_irq_config pre_kernel_late_init(pci_legacy_bridge_0, NULL); #endif /* CONFIG_PCI_LEGACY_BRIDGE */ -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART - -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); - -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_early_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); @@ -254,29 +92,3 @@ DECLARE_DEVICE_INIT_CONFIG(pic_0, "", _i8259_init, NULL); pre_kernel_core_init(pic_0, NULL); #endif /* CONFIG_PIC_DISABLE */ - -#ifdef CONFIG_SHARED_IRQ - -static int shared_irq_config(struct device *unused) -{ - ARG_UNUSED(unused); - -#ifdef SHARED_IRQ_0_IOAPIC_FLAGS - _ioapic_irq_set(CONFIG_SHARED_IRQ_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SHARED_IRQ_0_IRQ), - SHARED_IRQ_0_IOAPIC_FLAGS); -#endif - -#ifdef SHARED_IRQ_1_IOAPIC_FLAGS - _ioapic_irq_set(CONFIG_SHARED_IRQ_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SHARED_IRQ_1_IRQ), - SHARED_IRQ_1_IOAPIC_FLAGS); -#endif - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(sharedirqcfg, "", shared_irq_config, NULL); -pre_kernel_early_init(sharedirqcfg, NULL); - -#endif /* CONFIG_SHARED_IRQ */ diff --git a/arch/x86/platforms/ia32/board.h b/arch/x86/platforms/ia32/board.h index 65b48f47127..fa1cc1b2e2e 100644 --- a/arch/x86/platforms/ia32/board.h +++ b/arch/x86/platforms/ia32/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -119,10 +119,4 @@ extern struct device * const uart_devs[]; #endif /* CONFIG_NS16550 */ -#ifndef _ASMLANGUAGE - -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - -#endif /* !_ASMLANGUAGE */ - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/ia32/ia32.c b/arch/x86/platforms/ia32/ia32.c index a0dee312cf3..2ece4b73ae6 100644 --- a/arch/x86/platforms/ia32/ia32.c +++ b/arch/x86/platforms/ia32/ia32.c @@ -50,58 +50,6 @@ static int ia32_init(struct device *arg) return 0; } -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART - -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); - -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_late_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); diff --git a/arch/x86/platforms/ia32_pci/board.h b/arch/x86/platforms/ia32_pci/board.h index 44de6d0fae9..211bcf808db 100644 --- a/arch/x86/platforms/ia32_pci/board.h +++ b/arch/x86/platforms/ia32_pci/board.h @@ -36,17 +36,17 @@ #include #ifdef CONFIG_SERIAL_INTERRUPT_LEVEL #ifdef CONFIG_SERIAL_INTERRUPT_LOW -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #else -#define UART_IOAPIC_FLAGS (IOAPIC_LEVEL) +#define UART_IRQ_FLAGS (IOAPIC_LEVEL) #endif #else /* edge triggered interrupt */ #ifdef CONFIG_SERIAL_INTERRUPT_LOW /* generate interrupt on falling edge */ -#define UART_IOAPIC_FLAGS (IOAPIC_LOW) +#define UART_IRQ_FLAGS (IOAPIC_LOW) #else /* generate interrupt on raising edge */ -#define UART_IOAPIC_FLAGS (0) +#define UART_IRQ_FLAGS (0) #endif #endif #endif @@ -90,13 +90,13 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_GPIO_DW_0 #if defined(CONFIG_GPIO_DW_0_FALLING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_GPIO_DW_0_RISING_EDGE) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_HIGH) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_GPIO_DW_0_LEVEL_LOW) -#define GPIO_DW_0_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define GPIO_DW_0_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* GPIO_DW_0 */ @@ -114,29 +114,27 @@ extern struct device * const uart_devs[]; #ifdef CONFIG_I2C_DW -#include - #if defined(CONFIG_I2C_DW_IRQ_FALLING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_I2C_DW_IRQ_RISING_EDGE) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_HIGH) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_I2C_DW_IRQ_LEVEL_LOW) -#define I2C_DW_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define I2C_DW_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_I2C_DW_0 */ #ifdef CONFIG_SPI_INTEL #if defined(CONFIG_SPI_INTEL_FALLING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_LOW) #elif defined(CONFIG_SPI_INTEL_RISING_EDGE) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_EDGE | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_HIGH) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_HIGH) #elif defined(CONFIG_SPI_INTEL_LEVEL_LOW) -#define SPI_INTEL_IRQ_IOAPIC_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) +#define SPI_INTEL_IRQ_FLAGS (IOAPIC_LEVEL | IOAPIC_LOW) #endif #endif /* CONFIG_SPI_INTEL */ @@ -209,6 +207,4 @@ static inline int pci_irq2pin(int irq) return irq - NUM_STD_IRQS + 1; } -extern void _SysIntVecProgram(unsigned int vector, unsigned int); - #endif /* __INCboardh */ diff --git a/arch/x86/platforms/ia32_pci/ia32_pci.c b/arch/x86/platforms/ia32_pci/ia32_pci.c index dbcc41383a5..79ef7c20e46 100644 --- a/arch/x86/platforms/ia32_pci/ia32_pci.c +++ b/arch/x86/platforms/ia32_pci/ia32_pci.c @@ -41,137 +41,6 @@ #include -#ifdef CONFIG_I2C_DW_0 -#ifdef CONFIG_I2C_DW_0_IRQ_DIRECT -static int dw_i2c0_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_I2C_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_I2C_DW_0_IRQ), - I2C_DW_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(i2cirq_0, "", dw_i2c0_irq_set, NULL); -pre_kernel_late_init(i2cirq_0, NULL); - -#endif /* CONFIG_I2C_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_I2C_DW_0 */ - -#ifdef CONFIG_GPIO_DW_0 -#ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT -static int gpio_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_GPIO_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_GPIO_DW_0_IRQ), - GPIO_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(gpioirq_0, "", gpio_irq_set_0, NULL); -pre_kernel_early_init(gpioirq_0, NULL); - -#endif /* CONFIG_GPIO_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_GPIO_DW_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_0 -static int spi_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_0_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return DEV_OK; -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_0, "", spi_irq_set_0, NULL); -pre_kernel_early_init(spiirq_0, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_0 */ - -#ifdef CONFIG_SPI_INTEL_PORT_1 -static int spi_irq_set_1(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_SPI_INTEL_PORT_1_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_SPI_INTEL_PORT_1_IRQ), - SPI_INTEL_IRQ_IOAPIC_FLAGS); - return DEV_OK; - -} - -DECLARE_DEVICE_INIT_CONFIG(spiirq_1, "", spi_irq_set_1, NULL); -pre_kernel_early_init(spiirq_1, NULL); - -#endif /* CONFIG_SPI_INTEL_PORT_1 */ - -#ifdef CONFIG_ETH_DW_0 -#ifdef CONFIG_ETH_DW_0_IRQ_DIRECT -static int eth_irq_set_0(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_ETH_DW_0_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_ETH_DW_0_IRQ), - ETH_DW_0_IRQ_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(ethirq_0, "", eth_irq_set_0, NULL); -pre_kernel_early_init(ethirq_0, NULL); - -#endif /* CONFIG_ETH_DW_0_IRQ_DIRECT */ -#endif /* CONFIG_ETH_DW_0 */ - -#ifdef CONFIG_CONSOLE_HANDLER - -static int console_irq_set(struct device *unsued) -{ -#if defined(CONFIG_UART_CONSOLE) - _ioapic_irq_set(CONFIG_UART_CONSOLE_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_UART_CONSOLE_IRQ), - UART_IOAPIC_FLAGS); -#endif - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(consoleirq, "", console_irq_set, NULL); -pre_kernel_late_init(consoleirq, NULL); - -#endif /* CONFIG_CONSOLE_HANDLER */ - -#ifdef CONFIG_BLUETOOTH_UART -static int bluetooth_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - - _ioapic_irq_set(CONFIG_BLUETOOTH_UART_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_BLUETOOTH_UART_IRQ), - UART_IOAPIC_FLAGS); - - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(btirq, "", bluetooth_irq_set, NULL); -pre_kernel_late_init(btirq, NULL); -#endif /* CONFIG_BLUETOOTH_UART */ - -#ifdef CONFIG_HPET_TIMER - -static int hpet_irq_set(struct device *unused) -{ - ARG_UNUSED(unused); - _ioapic_irq_set(CONFIG_HPET_TIMER_IRQ, - _IRQ_TO_INTERRUPT_VECTOR(CONFIG_HPET_TIMER_IRQ), - HPET_IOAPIC_FLAGS); - return 0; -} - -DECLARE_DEVICE_INIT_CONFIG(hpetirq, "", hpet_irq_set, NULL); -pre_kernel_late_init(hpetirq, NULL); - -#endif /* CONFIG_HPET_TIMER */ - #ifdef CONFIG_IOAPIC DECLARE_DEVICE_INIT_CONFIG(ioapic_0, "", _ioapic_init, NULL); pre_kernel_core_init(ioapic_0, NULL); diff --git a/drivers/bluetooth/uart.c b/drivers/bluetooth/uart.c index f761e64c719..b26bfb246d5 100644 --- a/drivers/bluetooth/uart.c +++ b/drivers/bluetooth/uart.c @@ -234,7 +234,8 @@ static int bt_uart_send(enum bt_buf_type buf_type, struct net_buf *buf) } IRQ_CONNECT_STATIC(bluetooth, CONFIG_BLUETOOTH_UART_IRQ, - CONFIG_BLUETOOTH_UART_INT_PRI, bt_uart_isr, 0); + CONFIG_BLUETOOTH_UART_INT_PRI, bt_uart_isr, 0, + UART_IRQ_FLAGS); static void bt_uart_setup(struct device *uart, struct uart_init_info *info) { diff --git a/drivers/console/uart_console.c b/drivers/console/uart_console.c index bc74e8aeffa..91c5325a7d2 100644 --- a/drivers/console/uart_console.c +++ b/drivers/console/uart_console.c @@ -175,7 +175,8 @@ void uart_console_isr(void *unused) } IRQ_CONNECT_STATIC(console, CONFIG_UART_CONSOLE_IRQ, - CONFIG_UART_CONSOLE_INT_PRI, uart_console_isr, 0); + CONFIG_UART_CONSOLE_INT_PRI, uart_console_isr, 0, + UART_IRQ_FLAGS); static void console_input_init(void) { diff --git a/drivers/gpio/gpio_dw.c b/drivers/gpio/gpio_dw.c index 5aa2550411e..0f6e7481ca9 100644 --- a/drivers/gpio/gpio_dw.c +++ b/drivers/gpio/gpio_dw.c @@ -385,7 +385,8 @@ pre_kernel_late_init(gpio_0, &gpio_0_runtime); #ifdef CONFIG_GPIO_DW_0_IRQ_DIRECT IRQ_CONNECT_STATIC(gpio_dw_0, CONFIG_GPIO_DW_0_IRQ, - CONFIG_GPIO_DW_0_PRI, gpio_dw_isr_0, 0); + CONFIG_GPIO_DW_0_PRI, gpio_dw_isr_0, 0, + GPIO_DW_0_IRQ_FLAGS); #endif void gpio_config_0_irq(struct device *port) diff --git a/drivers/i2c/i2c_dw.c b/drivers/i2c/i2c_dw.c index 1f5bda89f61..2ceb9b30b60 100644 --- a/drivers/i2c/i2c_dw.c +++ b/drivers/i2c/i2c_dw.c @@ -845,7 +845,8 @@ IRQ_CONNECT_STATIC(i2c_dw_0, CONFIG_I2C_DW_0_IRQ, CONFIG_I2C_DW_0_INT_PRIORITY, i2c_dw_isr, - 0); + 0, + I2C_DW_IRQ_FLAGS); #endif void i2c_config_0(struct device *port) diff --git a/drivers/interrupt_controller/system_apic.c b/drivers/interrupt_controller/system_apic.c index 9084eecd3e3..d61fa99629e 100644 --- a/drivers/interrupt_controller/system_apic.c +++ b/drivers/interrupt_controller/system_apic.c @@ -65,6 +65,7 @@ * * @param irq virtualized IRQ * @param priority get vector from group + * @param flags Interrupt flags * * @return the allocated interrupt vector * @@ -76,7 +77,8 @@ */ int _SysIntVecAlloc( unsigned int irq, /* virtualized IRQ */ - unsigned int priority /* get vector from group */ + unsigned int priority, /* get vector from group */ + uint32_t flags /* interrupt flags */ ) { int vector; @@ -113,7 +115,7 @@ int _SysIntVecAlloc( if (irq != NANO_SOFT_IRQ) #endif { - _SysIntVecProgram(vector, irq); + _SysIntVecProgram(vector, irq, flags); } return vector; @@ -129,7 +131,7 @@ int _SysIntVecAlloc( * Drivers call this routine instead of irq_connect() when interrupts are * configured statically. * - * The Clanton board virtualizes IRQs as follows: + * The Galileo board virtualizes IRQs as follows: * * - The first CONFIG_IOAPIC_NUM_RTES IRQs are provided by the IOAPIC so the * IOAPIC is programmed for these IRQs @@ -138,13 +140,14 @@ int _SysIntVecAlloc( * * @param vector the vector number * @param irq the virtualized IRQ + * @param flags interrupt flags * */ -void _SysIntVecProgram(unsigned int vector, unsigned int irq) +void _SysIntVecProgram(unsigned int vector, unsigned int irq, uint32_t flags) { if (irq < CONFIG_IOAPIC_NUM_RTES) { - _ioapic_int_vec_set(irq, vector); + _ioapic_irq_set(irq, vector, flags); } else { _loapic_int_vec_set(irq - CONFIG_IOAPIC_NUM_RTES, vector); } diff --git a/drivers/shared_irq/shared_irq.c b/drivers/shared_irq/shared_irq.c index 8462cc05b59..288edf83542 100644 --- a/drivers/shared_irq/shared_irq.c +++ b/drivers/shared_irq/shared_irq.c @@ -145,7 +145,8 @@ DECLARE_DEVICE_INIT_CONFIG(shared_irq_0, CONFIG_SHARED_IRQ_0_NAME, pre_kernel_early_init(shared_irq_0, &shared_irq_0_runtime); IRQ_CONNECT_STATIC(shared_irq_0, CONFIG_SHARED_IRQ_0_IRQ, - CONFIG_SHARED_IRQ_0_PRI, shared_irq_isr_0, 0); + CONFIG_SHARED_IRQ_0_PRI, shared_irq_isr_0, 0, + SHARED_IRQ_0_FLAGS); void shared_irq_config_0_irq(struct device *port) { @@ -177,7 +178,8 @@ DECLARE_DEVICE_INIT_CONFIG(shared_irq_1, CONFIG_SHARED_IRQ_1_NAME, pre_kernel_early_init(shared_irq_1, &shared_irq_1_runtime); IRQ_CONNECT_STATIC(shared_irq_1, CONFIG_SHARED_IRQ_1_IRQ, - CONFIG_SHARED_IRQ_1_PRI, shared_irq_isr_1, 0); + CONFIG_SHARED_IRQ_1_PRI, shared_irq_isr_1, 0, + SHARED_IRQ_1_FLAGS); void shared_irq_config_1_irq(struct device *port) { diff --git a/drivers/simple/uart.c b/drivers/simple/uart.c index 9c9a5b1b65a..be8eef6364a 100644 --- a/drivers/simple/uart.c +++ b/drivers/simple/uart.c @@ -70,7 +70,8 @@ int uart_simple_send(const uint8_t *data, int len) } IRQ_CONNECT_STATIC(uart_simple, CONFIG_UART_SIMPLE_IRQ, - CONFIG_UART_SIMPLE_INT_PRI, uart_simple_isr, 0); + CONFIG_UART_SIMPLE_INT_PRI, uart_simple_isr, 0, + UART_IRQ_FLAGS); static void uart_simple_setup(struct device *uart, struct uart_init_info *info) { diff --git a/drivers/spi/intel_spi.c b/drivers/spi/intel_spi.c index 5446555cf04..18cd66cb64b 100644 --- a/drivers/spi/intel_spi.c +++ b/drivers/spi/intel_spi.c @@ -459,7 +459,8 @@ nano_late_init(spi_intel_port_0, &spi_intel_data_port_0); struct device *spi_intel_isr_port_0 = SYS_GET_DEVICE(spi_intel_port_0); IRQ_CONNECT_STATIC(spi_intel_irq_port_0, CONFIG_SPI_INTEL_PORT_0_IRQ, - CONFIG_SPI_INTEL_PORT_0_PRI, spi_intel_isr, 0); + CONFIG_SPI_INTEL_PORT_0_PRI, spi_intel_isr, 0, + SPI_INTEL_IRQ_FLAGS); void spi_config_0_irq(struct device *dev) { @@ -500,7 +501,8 @@ nano_late_init(spi_intel_port_1, &spi_intel_data_port_1); struct device *spi_intel_isr_port_1 = SYS_GET_DEVICE(spi_intel_port_1); IRQ_CONNECT_STATIC(spi_intel_irq_port_1, CONFIG_SPI_INTEL_PORT_1_IRQ, - CONFIG_SPI_INTEL_PORT_1_PRI, spi_intel_isr, 0); + CONFIG_SPI_INTEL_PORT_1_PRI, spi_intel_isr, 0, + SPI_INTEL_IRQ_FLAGS); void spi_config_1_irq(struct device *dev) { diff --git a/drivers/timer/arcv2_timer0.c b/drivers/timer/arcv2_timer0.c index e59d3694984..978571a6130 100644 --- a/drivers/timer/arcv2_timer0.c +++ b/drivers/timer/arcv2_timer0.c @@ -150,7 +150,7 @@ int _sys_clock_driver_init(struct device *device) _arc_v2_aux_reg_write(_ARC_V2_TMR0_CONTROL, 0); _arc_v2_aux_reg_write(_ARC_V2_TMR0_COUNT, 0); /* clear the count value */ - (void)irq_connect(irq, prio, _timer_int_handler, 0); + (void)irq_connect(irq, prio, _timer_int_handler, 0, 0); /* * Set the reload value to achieve the configured tick rate, enable the diff --git a/drivers/timer/hpet.c b/drivers/timer/hpet.c index 2f8f9c9fa0b..61fc9590cf2 100644 --- a/drivers/timer/hpet.c +++ b/drivers/timer/hpet.c @@ -59,6 +59,7 @@ #include #include #include +#include #ifdef CONFIG_MICROKERNEL @@ -173,7 +174,7 @@ extern struct nano_stack _k_command_stack; #define HPET_COMP_DELAY 192 IRQ_CONNECT_STATIC(hpet, CONFIG_HPET_TIMER_IRQ, CONFIG_HPET_TIMER_IRQ_PRIORITY, - _timer_int_handler, 0); + _timer_int_handler, 0, HPET_IOAPIC_FLAGS); #ifdef CONFIG_INT_LATENCY_BENCHMARK static uint32_t main_count_first_irq_value; diff --git a/drivers/timer/loapic_timer.c b/drivers/timer/loapic_timer.c index a8a6e13a3a7..fc486e7f1a4 100644 --- a/drivers/timer/loapic_timer.c +++ b/drivers/timer/loapic_timer.c @@ -130,7 +130,7 @@ extern int32_t _sys_idle_elapsed_ticks; IRQ_CONNECT_STATIC(loapic, CONFIG_LOAPIC_TIMER_IRQ, CONFIG_LOAPIC_TIMER_IRQ_PRIORITY, - _timer_int_handler, 0); + _timer_int_handler, 0, 0); /* computed counter 0 initial count value */ static uint32_t __noinit cycles_per_tick; diff --git a/include/arch/arc/arch.h b/include/arch/arc/arch.h index f4a64fcc04e..4f07d4714b8 100644 --- a/include/arch/arc/arch.h +++ b/include/arch/arc/arch.h @@ -69,11 +69,12 @@ extern "C" { * @param priority IRQ Priority * @param isr Interrupt Service Routine * @param parameter ISR parameter + * @param flags IRQ flags * * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) /** * @@ -90,6 +91,6 @@ extern "C" { * */ #define IRQ_CONFIG(isr, irq, priority) \ - irq_connect(irq, priority, isr, NULL); + irq_connect(irq, priority, isr, NULL, 0); #endif /* _ARC_ARCH__H_ */ diff --git a/include/arch/arc/v2/irq.h b/include/arch/arc/v2/irq.h index aa26893dd65..bf4cd2226b7 100644 --- a/include/arch/arc/v2/irq.h +++ b/include/arch/arc/v2/irq.h @@ -36,7 +36,8 @@ GTEXT(irq_disable) extern int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg); + void *arg, + uint32_t flags); extern void irq_enable(unsigned int irq); extern void irq_disable(unsigned int irq); diff --git a/include/arch/arm/cortex_m/irq.h b/include/arch/arm/cortex_m/irq.h index aaed421cd63..c48c4c8d9b7 100644 --- a/include/arch/arm/cortex_m/irq.h +++ b/include/arch/arm/cortex_m/irq.h @@ -36,7 +36,8 @@ GTEXT(irq_disable) extern int irq_connect(unsigned int irq, unsigned int prio, void (*isr)(void *arg), - void *arg); + void *arg, + uint32_t flags); extern void irq_enable(unsigned int irq); extern void irq_disable(unsigned int irq); @@ -62,7 +63,7 @@ extern void _IntExit(void); * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) \ +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) \ const unsigned int _##device##_int_priority = (priority); \ struct _IsrTableEntry CONCAT(_isr_irq, irq) \ __attribute__ ((section(TOSTR(CONCAT(.gnu.linkonce.isr_irq, irq))))) = \ diff --git a/include/arch/x86/arch.h b/include/arch/x86/arch.h index db9ee968150..9e0f058599e 100644 --- a/include/arch/x86/arch.h +++ b/include/arch/x86/arch.h @@ -161,8 +161,9 @@ typedef struct s_isrList { * @return N/A * */ -#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter) \ +#define IRQ_CONNECT_STATIC(device, irq, priority, isr, parameter, flags) \ extern void *_##device##_##isr##_stub; \ + const const uint32_t _##device##_irq_flags = (flags); \ NANO_CPU_INT_REGISTER(_##device##_##isr##_stub, (irq), (priority), -1, 0) @@ -188,9 +189,10 @@ extern unsigned char _irq_to_interrupt_vector[]; * @return N/A * */ -#define IRQ_CONFIG(device, irq, priority) \ - do { \ - _SysIntVecProgram(_IRQ_TO_INTERRUPT_VECTOR(irq), irq); \ +#define IRQ_CONFIG(device, irq, priority) \ + do { \ + _SysIntVecProgram(_IRQ_TO_INTERRUPT_VECTOR((irq)), (irq), \ + _##device##_irq_flags); \ } while (0) @@ -363,7 +365,8 @@ typedef void (*NANO_EOI_GET_FUNC) (void *); extern int irq_connect(unsigned int irq, unsigned int priority, void (*routine)(void *parameter), - void *parameter); + void *parameter, + uint32_t flags); /** * @brief Enable a specific IRQ @@ -413,7 +416,21 @@ extern const NANO_ESF _default_esf; * vector, and returns the vector number */ extern int _SysIntVecAlloc(unsigned int irq, - unsigned int priority); + unsigned int priority, + uint32_t flags); + +/** + * + * @brief Program interrupt controller + * + * This routine programs the interrupt controller with the given vector + * based on the given IRQ parameter. + * + * Drivers call this routine instead of irq_connect() when interrupts are + * configured statically. + * + */ +extern void _SysIntVecProgram(unsigned int vector, unsigned int irq, uint32_t flags); /* functions provided by the kernel for usage by _SysIntVecAlloc() */ diff --git a/include/microkernel/task_irq.h b/include/microkernel/task_irq.h index 480cd27d76d..9da6bdfeea4 100644 --- a/include/microkernel/task_irq.h +++ b/include/microkernel/task_irq.h @@ -44,10 +44,12 @@ * @param irq_obj IRQ object identifier * @param irq Request IRQ * @param priority Requested interrupt priority + * @param flags IRQ flags * * @return assigned interrupt vector if successful, INVALID_VECTOR if not */ -extern uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority); +extern uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority, + uint32_t flags); /** * @cond internal */ diff --git a/kernel/microkernel/k_irq.c b/kernel/microkernel/k_irq.c index 7434d630904..899c9bcef02 100644 --- a/kernel/microkernel/k_irq.c +++ b/kernel/microkernel/k_irq.c @@ -206,7 +206,8 @@ static int _k_task_irq_alloc(void *arg) } -uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority) +uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority, + uint32_t flags) { struct irq_obj_reg_arg arg; /* IRQ object registration request arguments */ struct task_irq_info *irq_obj_ptr; /* ptr to task IRQ object */ @@ -228,7 +229,8 @@ uint32_t task_irq_alloc(kirq_t irq_obj, uint32_t irq, uint32_t priority) * definition to abstract the different irq_connect signatures */ irq_obj_ptr->vector = irq_connect( - irq, priority, task_irq_int_handler, (void *)irq_obj_ptr); + irq, priority, task_irq_int_handler, (void *)irq_obj_ptr, + flags); irq_enable(irq); return irq_obj_ptr->vector; diff --git a/samples/include/irq_test_common.h b/samples/include/irq_test_common.h index 553b4399e8b..75dd61327e3 100644 --- a/samples/include/irq_test_common.h +++ b/samples/include/irq_test_common.h @@ -103,7 +103,7 @@ static int initIRQ(struct isrInitInfo *i) if (i->isr[0]) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, i->isr[0], - i->arg[0]); + i->arg[0], 0); if (-1 == vector) { return -1; } @@ -113,7 +113,7 @@ static int initIRQ(struct isrInitInfo *i) #if NUM_SW_IRQS >= 2 if (i->isr[1]) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, i->isr[1], - i->arg[1]); + i->arg[1], 0); if (-1 == vector) { return -1; } @@ -123,11 +123,11 @@ static int initIRQ(struct isrInitInfo *i) #elif defined(CONFIG_ARM) #if defined(CONFIG_CPU_CORTEX_M) if (i->isr[0]) { - (void) irq_connect(0, IRQ_PRIORITY, i->isr[0], i->arg[0]); + (void) irq_connect(0, IRQ_PRIORITY, i->isr[0], i->arg[0], 0); irq_enable(0); } if (i->isr[1]) { - (void) irq_connect(1, IRQ_PRIORITY, i->isr[1], i->arg[1]); + (void) irq_connect(1, IRQ_PRIORITY, i->isr[1], i->arg[1], 0); irq_enable(1); } #endif /* CONFIG_CPU_CORTEX_M */ diff --git a/samples/microkernel/apps/nfc_hello/src/main.c b/samples/microkernel/apps/nfc_hello/src/main.c index 74e888354f7..e3f9bdc908c 100644 --- a/samples/microkernel/apps/nfc_hello/src/main.c +++ b/samples/microkernel/apps/nfc_hello/src/main.c @@ -69,7 +69,7 @@ static void uart1_init(void) uart_init(UART1, &uart1); - irq_connect(UART1_IRQ, uart1.irq_pri, uart1_isr, 0); + irq_connect(UART1_IRQ, uart1.irq_pri, uart1_isr, 0, UART_IRQ_FLAGS); irq_enable(UART1_IRQ); diff --git a/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c b/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c index 5bd9da7721f..566687b1da9 100644 --- a/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c +++ b/samples/microkernel/benchmark/footprint/src/microkernel_footprint.c @@ -158,7 +158,7 @@ void fgTaskEntry(void) { #ifdef TEST_max /* dynamically link in dummy ISR */ - irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, (void *) 0); + irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, (void *) 0, 0); #endif /* TEST_max */ /* note: referencing "func_array" ensures it isn't optimized out */ diff --git a/samples/microkernel/benchmark/latency_measure/src/utils.c b/samples/microkernel/benchmark/latency_measure/src/utils.c index eaec305c517..ffd67df61dc 100644 --- a/samples/microkernel/benchmark/latency_measure/src/utils.c +++ b/samples/microkernel/benchmark/latency_measure/src/utils.c @@ -46,7 +46,7 @@ char tmpString[TMP_STRING_SIZE]; int initSwInterrupt(ptestIsr pIsrHdlr) { vector = irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, pIsrHdlr, - (void *) 0); + (void *) 0, 0); return vector; } diff --git a/samples/microkernel/test/test_task_irq/src/test_device.c b/samples/microkernel/test/test_task_irq/src/test_device.c index 5ee62657481..5ef007d5d82 100644 --- a/samples/microkernel/test/test_task_irq/src/test_device.c +++ b/samples/microkernel/test/test_task_irq/src/test_device.c @@ -67,14 +67,14 @@ uint32_t irq_vectors[NUM_OBJECTS] = {[0 ... (NUM_OBJECTS - 1)] = INVALID_VECTOR} int taskA(ksem_t semRdy) { - irq_vectors[DEV1_ID] = task_irq_alloc(DEV1_ID, DEV1_IRQ, 1); + irq_vectors[DEV1_ID] = task_irq_alloc(DEV1_ID, DEV1_IRQ, 1, 0); if (irq_vectors[DEV1_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; } TC_PRINT("IRQ object %d using IRQ%d allocated\n", DEV1_ID, DEV1_IRQ); - irq_vectors[DEV2_ID] = task_irq_alloc(DEV2_ID, DEV2_IRQ, 2); + irq_vectors[DEV2_ID] = task_irq_alloc(DEV2_ID, DEV2_IRQ, 2, 0); if (irq_vectors[DEV2_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; @@ -105,7 +105,7 @@ int taskA(ksem_t semRdy) TC_PRINT("\nAttempt to allocate an IRQ object that\n"); TC_PRINT("is already allocated by another task...\n"); - if (task_irq_alloc(DEV4_ID, DEV4_IRQ, 1) != INVALID_VECTOR) { + if (task_irq_alloc(DEV4_ID, DEV4_IRQ, 1, 0) != INVALID_VECTOR) { TC_ERROR("Error: Was able to allocate\n\n"); return TC_FAIL; } @@ -113,7 +113,7 @@ int taskA(ksem_t semRdy) TC_PRINT("\nAttempt to allocate an IRQ that\n" "is already allocated by another task...\n"); - if (task_irq_alloc(DEV5_ID, DEV4_IRQ, 1) != INVALID_VECTOR) { + if (task_irq_alloc(DEV5_ID, DEV4_IRQ, 1, 0) != INVALID_VECTOR) { TC_ERROR("Error: Was able to allocate\n\n"); return TC_FAIL; } @@ -139,14 +139,14 @@ int taskA(ksem_t semRdy) int taskB(ksem_t semRdy) { - irq_vectors[DEV3_ID] = task_irq_alloc(DEV3_ID, DEV3_IRQ, 1); + irq_vectors[DEV3_ID] = task_irq_alloc(DEV3_ID, DEV3_IRQ, 1, 0); if (irq_vectors[DEV3_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; } TC_PRINT("IRQ object %d using IRQ%d allocated\n", DEV3_ID, DEV3_IRQ); - irq_vectors[DEV4_ID] = task_irq_alloc(DEV4_ID, DEV4_IRQ, 1); + irq_vectors[DEV4_ID] = task_irq_alloc(DEV4_ID, DEV4_IRQ, 1, 0); if (irq_vectors[DEV4_ID] == INVALID_VECTOR) { TC_ERROR("Not able to allocate IRQ object\n"); return TC_FAIL; diff --git a/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c b/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c index 9b22190fb3f..55e82d00f7e 100644 --- a/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c +++ b/samples/nanokernel/benchmark/footprint/src/nanokernel_footprint.c @@ -160,7 +160,7 @@ void main(void) #ifdef TEST_max /* dynamically link in dummy ISR */ irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, - (void *) 0); + (void *) 0, 0); #endif /* TEST_max */ #ifndef TEST_min /* start a trivial fiber */ diff --git a/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c b/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c index 2ecd9c5ca7c..e242fcc1ea8 100644 --- a/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c +++ b/samples/nanokernel/benchmark/object_footprint/src/nanokernel_objects.c @@ -147,7 +147,7 @@ void main(void) #ifdef CONFIG_DYNAMIC_ISR /* dynamically link in dummy ISR */ irq_connect(NANO_SOFT_IRQ, IRQ_PRIORITY, dummyIsr, - (void *) 0); + (void *) 0, 0); #endif #ifdef CONFIG_OBJECTS_FIBER