#ifndef _JAILHOUSE_ASM_IRQCHIP_H
#define _JAILHOUSE_ASM_IRQCHIP_H
-#include <asm/percpu.h>
+#define MAX_PENDING_IRQS 256
+
+#include <jailhouse/cell.h>
+#include <jailhouse/mmio.h>
#ifndef __ASSEMBLY__
+struct per_cpu;
+
struct sgi {
/*
* Routing mode values:
struct irqchip_ops {
int (*init)(void);
int (*cpu_init)(struct per_cpu *cpu_data);
+ int (*cell_init)(struct cell *cell);
+ void (*cell_exit)(struct cell *cell);
+ int (*cpu_reset)(struct per_cpu *cpu_data, bool is_shutdown);
+ void (*adjust_irq_target)(struct cell *cell, u16 irq_id);
int (*send_sgi)(struct sgi *sgi);
void (*handle_irq)(struct per_cpu *cpu_data);
+ void (*eoi_irq)(u32 irqn, bool deactivate);
+ int (*inject_irq)(struct per_cpu *cpu_data, u16 irq_id);
+ void (*enable_maint_irq)(bool enable);
+
+ int (*mmio_access)(struct mmio_access *access);
};
+unsigned int irqchip_mmio_count_regions(struct cell *cell);
+
int irqchip_init(void);
int irqchip_cpu_init(struct per_cpu *cpu_data);
+int irqchip_cpu_reset(struct per_cpu *cpu_data);
+void irqchip_cpu_shutdown(struct per_cpu *cpu_data);
+
+int irqchip_cell_init(struct cell *cell);
+void irqchip_cell_exit(struct cell *cell);
int irqchip_send_sgi(struct sgi *sgi);
void irqchip_handle_irq(struct per_cpu *cpu_data);
+void irqchip_eoi_irq(u32 irqn, bool deactivate);
+
+void irqchip_inject_pending(struct per_cpu *cpu_data);
+void irqchip_set_pending(struct per_cpu *cpu_data, u16 irq_id);
+
+bool irqchip_irq_in_cell(struct cell *cell, unsigned int irq_id);
#endif /* __ASSEMBLY__ */
#endif /* _JAILHOUSE_ASM_IRQCHIP_H */