aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/irqchip/irq-gic-v3.c')
-rw-r--r--drivers/irqchip/irq-gic-v3.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
index 16fecc0febe8..a17b6cf9b682 100644
--- a/drivers/irqchip/irq-gic-v3.c
+++ b/drivers/irqchip/irq-gic-v3.c
@@ -18,6 +18,10 @@
18#include <linux/percpu.h> 18#include <linux/percpu.h>
19#include <linux/refcount.h> 19#include <linux/refcount.h>
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/syscore_ops.h>
22#include <linux/wakeup_reason.h>
23#include <trace/hooks/gic_v3.h>
24
21 25
22#include <linux/irqchip.h> 26#include <linux/irqchip.h>
23#include <linux/irqchip/arm-gic-common.h> 27#include <linux/irqchip/arm-gic-common.h>
@@ -29,6 +33,8 @@
29#include <asm/smp_plat.h> 33#include <asm/smp_plat.h>
30#include <asm/virt.h> 34#include <asm/virt.h>
31 35
36#include <trace/hooks/gic.h>
37
32#include "irq-gic-common.h" 38#include "irq-gic-common.h"
33 39
34#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) 40#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80)
@@ -670,6 +676,7 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs
670 676
671 if (handle_domain_irq(gic_data.domain, irqnr, regs)) { 677 if (handle_domain_irq(gic_data.domain, irqnr, regs)) {
672 WARN_ONCE(true, "Unexpected interrupt received!\n"); 678 WARN_ONCE(true, "Unexpected interrupt received!\n");
679 log_abnormal_wakeup_reason("unexpected HW IRQ %u", irqnr);
673 gic_deactivate_unhandled(irqnr); 680 gic_deactivate_unhandled(irqnr);
674 } 681 }
675} 682}
@@ -764,11 +771,15 @@ static void __init gic_dist_init(void)
764 * enabled. 771 * enabled.
765 */ 772 */
766 affinity = gic_mpidr_to_affinity(cpu_logical_map(smp_processor_id())); 773 affinity = gic_mpidr_to_affinity(cpu_logical_map(smp_processor_id()));
767 for (i = 32; i < GIC_LINE_NR; i++) 774 for (i = 32; i < GIC_LINE_NR; i++) {
775 trace_android_vh_gic_v3_affinity_init(i, GICD_IROUTER, &affinity);
768 gic_write_irouter(affinity, base + GICD_IROUTER + i * 8); 776 gic_write_irouter(affinity, base + GICD_IROUTER + i * 8);
777 }
769 778
770 for (i = 0; i < GIC_ESPI_NR; i++) 779 for (i = 0; i < GIC_ESPI_NR; i++) {
780 trace_android_vh_gic_v3_affinity_init(i, GICD_IROUTERnE, &affinity);
771 gic_write_irouter(affinity, base + GICD_IROUTERnE + i * 8); 781 gic_write_irouter(affinity, base + GICD_IROUTERnE + i * 8);
782 }
772} 783}
773 784
774static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *)) 785static int gic_iterate_rdists(int (*fn)(struct redist_region *, void __iomem *))
@@ -1200,6 +1211,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
1200 reg = gic_dist_base(d) + offset + (index * 8); 1211 reg = gic_dist_base(d) + offset + (index * 8);
1201 val = gic_mpidr_to_affinity(cpu_logical_map(cpu)); 1212 val = gic_mpidr_to_affinity(cpu_logical_map(cpu));
1202 1213
1214 trace_android_vh_gic_v3_set_affinity(d, mask_val, &val);
1203 gic_write_irouter(val, reg); 1215 gic_write_irouter(val, reg);
1204 1216
1205 /* 1217 /*
@@ -1254,6 +1266,26 @@ static void gic_cpu_pm_init(void)
1254static inline void gic_cpu_pm_init(void) { } 1266static inline void gic_cpu_pm_init(void) { }
1255#endif /* CONFIG_CPU_PM */ 1267#endif /* CONFIG_CPU_PM */
1256 1268
1269#ifdef CONFIG_PM
1270static void gic_resume(void)
1271{
1272 trace_android_vh_gic_resume(gic_data.domain, gic_data.dist_base);
1273}
1274
1275static struct syscore_ops gic_syscore_ops = {
1276 .resume = gic_resume,
1277};
1278
1279static void gic_syscore_init(void)
1280{
1281 register_syscore_ops(&gic_syscore_ops);
1282}
1283
1284#else
1285static inline void gic_syscore_init(void) { }
1286#endif
1287
1288
1257static struct irq_chip gic_chip = { 1289static struct irq_chip gic_chip = {
1258 .name = "GICv3", 1290 .name = "GICv3",
1259 .irq_mask = gic_mask_irq, 1291 .irq_mask = gic_mask_irq,
@@ -1710,6 +1742,7 @@ static int __init gic_init_bases(void __iomem *dist_base,
1710 gic_cpu_init(); 1742 gic_cpu_init();
1711 gic_smp_init(); 1743 gic_smp_init();
1712 gic_cpu_pm_init(); 1744 gic_cpu_pm_init();
1745 gic_syscore_init();
1713 1746
1714 if (gic_dist_supports_lpis()) { 1747 if (gic_dist_supports_lpis()) {
1715 its_init(handle, &gic_data.rdists, gic_data.domain); 1748 its_init(handle, &gic_data.rdists, gic_data.domain);