Commit c55bdaec authored by Philippe Gerum's avatar Philippe Gerum
Browse files

arm64/ipipe: fixup GIC v3 irq chip

parent 086b3877
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#ifndef __ARM_IPIPE_H #ifndef __ARM_IPIPE_H
#define __ARM_IPIPE_H #define __ARM_IPIPE_H
struct irq_domain;
#ifdef CONFIG_IPIPE #ifdef CONFIG_IPIPE
#include <linux/jump_label.h> #include <linux/jump_label.h>
...@@ -212,9 +214,11 @@ void __ipipe_grab_irq(int irq, struct pt_regs *regs); ...@@ -212,9 +214,11 @@ void __ipipe_grab_irq(int irq, struct pt_regs *regs);
void __ipipe_exit_irq(struct pt_regs *regs); void __ipipe_exit_irq(struct pt_regs *regs);
static inline void ipipe_handle_multi_irq(int irq, struct pt_regs *regs) static inline int ipipe_handle_multi_irq(struct irq_domain *domain,
unsigned int irq, struct pt_regs *regs)
{ {
__ipipe_grab_irq(irq, regs); __ipipe_grab_irq(irq, regs);
return 0;
} }
static inline unsigned long __ipipe_ffnz(unsigned long ul) static inline unsigned long __ipipe_ffnz(unsigned long ul)
...@@ -255,9 +259,10 @@ struct task_struct *ipipe_switch_to(struct task_struct *prev, ...@@ -255,9 +259,10 @@ struct task_struct *ipipe_switch_to(struct task_struct *prev,
(void) (flags); \ (void) (flags); \
} while(0) } while(0)
static inline void ipipe_handle_multi_irq(int irq, struct pt_regs *regs) static inline int ipipe_handle_multi_irq(struct irq_domain *domain,
unsigned int irq, struct pt_regs *regs)
{ {
__handle_domain_irq(NULL, irq, false, regs); return handle_domain_irq(domain, irq, regs);
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -343,7 +343,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs ...@@ -343,7 +343,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) { if (likely(irqnr > 15 && irqnr < 1020) || irqnr >= 8192) {
int err; int err;
err = handle_domain_irq(gic_data.domain, irqnr, regs); err = ipipe_handle_multi_irq(gic_data.domain, irqnr, regs);
if (err) { if (err) {
WARN_ONCE(true, "Unexpected interrupt received!\n"); WARN_ONCE(true, "Unexpected interrupt received!\n");
gic_write_eoir(irqnr); gic_write_eoir(irqnr);
...@@ -353,7 +353,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs ...@@ -353,7 +353,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
if (irqnr < 16) { if (irqnr < 16) {
gic_write_eoir(irqnr); gic_write_eoir(irqnr);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
handle_IPI(irqnr, regs); ipipe_handle_multi_ipi(irqnr, regs);
#else #else
WARN_ONCE(true, "Unexpected SGI received!\n"); WARN_ONCE(true, "Unexpected SGI received!\n");
#endif #endif
......
...@@ -298,8 +298,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) ...@@ -298,8 +298,7 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
irqnr = irqstat & GICC_IAR_INT_ID_MASK; irqnr = irqstat & GICC_IAR_INT_ID_MASK;
if (likely(irqnr > 15 && irqnr < 1021)) { if (likely(irqnr > 15 && irqnr < 1021)) {
irqnr = irq_find_mapping(gic->domain, irqnr); ipipe_handle_multi_irq(gic->domain, irqnr, regs);
ipipe_handle_multi_irq(irqnr, regs);
continue; continue;
} }
if (irqnr < 16) { if (irqnr < 16) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment