Commit 46e589a3 authored by Marc Zyngier's avatar Marc Zyngier Committed by Rafael J. Wysocki
Browse files

irqchip / ACPI: Add probing infrastructure for ACPI-based irqchips



DT enjoys a rather nice probing infrastructure for irqchips, while
ACPI is so far stuck into a very distant past.

This patch introduces a declarative API, allowing irqchips to be
self-contained and be called when a particular entry is matched
in the MADT table.

Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
Tested-by: default avatarHanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e647b532
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -10,15 +10,4 @@ struct pt_regs;
extern void migrate_irqs(void);
extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));

static inline void acpi_irq_init(void)
{
	/*
	 * Hardcode ACPI IRQ chip initialization to GICv2 for now.
	 * Proper irqchip infrastructure will be implemented along with
	 * incoming  GICv2m|GICv3|ITS bits.
	 */
	acpi_gic_init();
}
#define acpi_irq_init acpi_irq_init

#endif
+5 −3
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
 * warranty of any kind, whether express or implied.
 */

#include <linux/acpi_irq.h>
#include <linux/acpi.h>
#include <linux/init.h>
#include <linux/of_irq.h>
#include <linux/irqchip.h>
@@ -27,6 +27,8 @@ extern struct of_device_id __irqchip_of_table[];
void __init irqchip_init(void)
{
	of_irq_init(__irqchip_of_table);

	acpi_irq_init();
#if defined(CONFIG_ARM64) && defined(CONFIG_ACPI)
	acpi_gic_init();	/* Temporary hack */
#endif
	acpi_probe_device_table(irqchip);
}
+1 −0
Original line number Diff line number Diff line
@@ -524,6 +524,7 @@
	CPUIDLE_METHOD_OF_TABLES()					\
	KERNEL_DTB()							\
	IRQCHIP_OF_MATCH_TABLE()					\
	ACPI_PROBE_TABLE(irqchip)					\
	EARLYCON_TABLE()						\
	EARLYCON_OF_TABLES()

include/linux/acpi_irq.h

deleted100644 → 0
+0 −10
Original line number Diff line number Diff line
#ifndef _LINUX_ACPI_IRQ_H
#define _LINUX_ACPI_IRQ_H

#include <linux/irq.h>

#ifndef acpi_irq_init
static inline void acpi_irq_init(void) { }
#endif

#endif /* _LINUX_ACPI_IRQ_H */
+17 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@
#ifndef _LINUX_IRQCHIP_H
#define _LINUX_IRQCHIP_H

#include <linux/acpi.h>
#include <linux/of.h>

/*
@@ -25,6 +26,22 @@
 */
#define IRQCHIP_DECLARE(name, compat, fn) OF_DECLARE_2(irqchip, name, compat, fn)

/*
 * This macro must be used by the different irqchip drivers to declare
 * the association between their version and their initialization function.
 *
 * @name: name that must be unique accross all IRQCHIP_ACPI_DECLARE of the
 * same file.
 * @subtable: Subtable to be identified in MADT
 * @validate: Function to be called on that subtable to check its validity.
 *            Can be NULL.
 * @data: data to be checked by the validate function.
 * @fn: initialization function
 */
#define IRQCHIP_ACPI_DECLARE(name, subtable, validate, data, fn)	\
	ACPI_DECLARE_PROBE_ENTRY(irqchip, name, ACPI_SIG_MADT, 		\
				 subtable, validate, data, fn)

#ifdef CONFIG_IRQCHIP
void irqchip_init(void);
#else