[U-Boot] [PATCH 1/2] x86: Wrap calls to 8259 with CONFIG_I8259_PIC

mask_irq(), unmask_irq() and specific_eoi() are provided by the i8259 PIC driver and should be wrapped with CONFIG_I8259_PIC.
Signed-off-by: Bin Meng bmeng.cn@gmail.com ---
arch/x86/lib/interrupts.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/x86/lib/interrupts.c b/arch/x86/lib/interrupts.c index 297067d..b1dc6e1 100644 --- a/arch/x86/lib/interrupts.c +++ b/arch/x86/lib/interrupts.c @@ -64,7 +64,9 @@ void irq_install_handler(int irq, interrupt_handler_t *handler, void *arg) irq_handlers[irq].arg = arg; irq_handlers[irq].count = 0;
+#if CONFIG_IS_ENABLED(I8259_PIC) unmask_irq(irq); +#endif
if (status) enable_interrupts(); @@ -83,7 +85,9 @@ void irq_free_handler(int irq)
status = disable_interrupts();
+#if CONFIG_IS_ENABLED(I8259_PIC) mask_irq(irq); +#endif
irq_handlers[irq].handler = NULL; irq_handlers[irq].arg = NULL; @@ -104,14 +108,17 @@ void do_irq(int hw_irq) }
if (irq_handlers[irq].handler) { +#if CONFIG_IS_ENABLED(I8259_PIC) mask_irq(irq); +#endif
irq_handlers[irq].handler(irq_handlers[irq].arg); irq_handlers[irq].count++;
+#if CONFIG_IS_ENABLED(I8259_PIC) unmask_irq(irq); specific_eoi(irq); - +#endif } else { if ((irq & 7) != 7) { spurious_irq_cnt++;

At present the Kconfig options (CONFIG_I8259_PIC and CONFIG_APIC) do not include a prompt message, which makes it impossible to be disabled from a board defconfig file.
Signed-off-by: Bin Meng bmeng.cn@gmail.com ---
arch/x86/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 8fc9187..e052093 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -729,7 +729,7 @@ config PCIE_ECAM_SIZE maximum number of PCI buses as defined by the PCI specification.
config I8259_PIC - bool + bool "Enable Intel 8259 compatible interrupt controller" default y help Intel 8259 ISA compatible chipset incorporates two 8259 (master and @@ -737,7 +737,7 @@ config I8259_PIC the interrupt correctly.
config APIC - bool + bool "Enable Intel Advanced Programmable Interrupt Controller" default y help The (A)dvanced (P)rogrammable (I)nterrupt (C)ontroller is responsible

On Mon, 19 Nov 2018 at 03:44, Bin Meng bmeng.cn@gmail.com wrote:
At present the Kconfig options (CONFIG_I8259_PIC and CONFIG_APIC) do not include a prompt message, which makes it impossible to be disabled from a board defconfig file.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/Kconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org

On 11/19/18 11:49 AM, Bin Meng wrote:
mask_irq(), unmask_irq() and specific_eoi() are provided by the i8259 PIC driver and should be wrapped with CONFIG_I8259_PIC.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/lib/interrupts.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/arch/x86/lib/interrupts.c b/arch/x86/lib/interrupts.c index 297067d..b1dc6e1 100644 --- a/arch/x86/lib/interrupts.c +++ b/arch/x86/lib/interrupts.c @@ -64,7 +64,9 @@ void irq_install_handler(int irq, interrupt_handler_t *handler, void *arg) irq_handlers[irq].arg = arg; irq_handlers[irq].count = 0;
+#if CONFIG_IS_ENABLED(I8259_PIC) unmask_irq(irq); +#endif
if (status) enable_interrupts(); @@ -83,7 +85,9 @@ void irq_free_handler(int irq)
status = disable_interrupts();
+#if CONFIG_IS_ENABLED(I8259_PIC) mask_irq(irq); +#endif
irq_handlers[irq].handler = NULL; irq_handlers[irq].arg = NULL; @@ -104,14 +108,17 @@ void do_irq(int hw_irq) }
if (irq_handlers[irq].handler) { +#if CONFIG_IS_ENABLED(I8259_PIC) mask_irq(irq); +#endif
irq_handlers[irq].handler(irq_handlers[irq].arg); irq_handlers[irq].count++;
+#if CONFIG_IS_ENABLED(I8259_PIC) unmask_irq(irq); specific_eoi(irq);
+#endif } else { if ((irq & 7) != 7) { spurious_irq_cnt++;
Tested-by: Hannes Schmelzer oe5hpm@oevsv.at
Hi Bin, thanks for this patch. This is working for my board.
With this we may drop my X86-noirq patch.
cheers, Hannes

Hi Bin,
On Mon, 19 Nov 2018 at 03:44, Bin Meng bmeng.cn@gmail.com wrote:
mask_irq(), unmask_irq() and specific_eoi() are provided by the i8259 PIC driver and should be wrapped with CONFIG_I8259_PIC.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/lib/interrupts.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
Is it possible to use if() instead of #if ?
Regards, Simon

Hi Simon,
On Tue, Nov 27, 2018 at 9:02 AM Simon Glass sjg@chromium.org wrote:
Hi Bin,
On Mon, 19 Nov 2018 at 03:44, Bin Meng bmeng.cn@gmail.com wrote:
mask_irq(), unmask_irq() and specific_eoi() are provided by the i8259 PIC driver and should be wrapped with CONFIG_I8259_PIC.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
arch/x86/lib/interrupts.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
Is it possible to use if() instead of #if ?
Yes, I think so.
Regards, Bin
participants (3)
-
Bin Meng
-
Hannes Schmelzer
-
Simon Glass