Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 58fe01c0 authored by Cassidy Burden's avatar Cassidy Burden
Browse files

irqchip: gic-v3: Add panic handler to save registers



Save gic-v3 distributor registers on panic. Allows for inspection of
gic-v3 state at the time of a panic.

Change-Id: I3236577161abab4e292a01254e1e1ecb50bb38de
Signed-off-by: default avatarCassidy Burden <cburden@codeaurora.org>
parent d231399e
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -48,6 +48,10 @@ struct gic_chip_data {
	unsigned int wakeup_irqs[32];
	unsigned int enabled_irqs[32];
#endif
#ifdef CONFIG_ARM_GIC_PANIC_HANDLER
	u32 saved_dist_regs[0x400];
	u32 saved_router_regs[0x800];
#endif
};

static struct gic_chip_data gic_data __read_mostly;
@@ -302,6 +306,29 @@ static inline void __iomem *gic_data_dist_base(struct gic_chip_data *data)
	return data->dist_base;
}

#ifdef CONFIG_ARM_GIC_PANIC_HANDLER
static int gic_panic_handler(struct notifier_block *this,
			unsigned long event, void *ptr)
{
	int i;
	void __iomem *base;

	base = gic_data.dist_base;
	for (i = 0; i < 0x400; i += 1)
		gic_data.saved_dist_regs[i] = readl_relaxed(base + 4 * i);

	base = gic_data.dist_base + GICD_IROUTER;
	for (i = 0; i < 0x800; i += 1)
		gic_data.saved_router_regs[i] = readl_relaxed(base + 4 * i);

	return NOTIFY_DONE;
}

static struct notifier_block gic_panic_blk = {
	.notifier_call = gic_panic_handler,
};
#endif

#ifdef CONFIG_PM
static int gic_suspend_one(struct gic_chip_data *gic)
{
@@ -864,6 +891,10 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
	gic_cpu_init();
	gic_cpu_pm_init();

#ifdef CONFIG_ARM_GIC_PANIC_HANDLER
	atomic_notifier_chain_register(&panic_notifier_list, &gic_panic_blk);
#endif

	return 0;

out_free: