|
12 | 12 | #include <linux/delay.h> |
13 | 13 | #include <linux/interrupt.h> |
14 | 14 | #include <linux/irqdomain.h> |
| 15 | +#include <linux/kernel.h> |
15 | 16 | #include <linux/kstrtox.h> |
16 | 17 | #include <linux/of.h> |
17 | 18 | #include <linux/of_address.h> |
|
36 | 37 |
|
37 | 38 | #include "irq-gic-common.h" |
38 | 39 |
|
39 | | -#define GICD_INT_NMI_PRI (GICD_INT_DEF_PRI & ~0x80) |
| 40 | +static u8 dist_prio_irq __ro_after_init = GICD_INT_DEF_PRI; |
| 41 | +static u8 dist_prio_nmi __ro_after_init = GICD_INT_DEF_PRI & ~0x80; |
40 | 42 |
|
41 | 43 | #define FLAGS_WORKAROUND_GICR_WAKER_MSM8996 (1ULL << 0) |
42 | 44 | #define FLAGS_WORKAROUND_CAVIUM_ERRATUM_38539 (1ULL << 1) |
@@ -556,7 +558,7 @@ static int gic_irq_nmi_setup(struct irq_data *d) |
556 | 558 | desc->handle_irq = handle_fasteoi_nmi; |
557 | 559 | } |
558 | 560 |
|
559 | | - gic_irq_set_prio(d, GICD_INT_NMI_PRI); |
| 561 | + gic_irq_set_prio(d, dist_prio_nmi); |
560 | 562 |
|
561 | 563 | return 0; |
562 | 564 | } |
@@ -591,7 +593,7 @@ static void gic_irq_nmi_teardown(struct irq_data *d) |
591 | 593 | desc->handle_irq = handle_fasteoi_irq; |
592 | 594 | } |
593 | 595 |
|
594 | | - gic_irq_set_prio(d, GICD_INT_DEF_PRI); |
| 596 | + gic_irq_set_prio(d, dist_prio_irq); |
595 | 597 | } |
596 | 598 |
|
597 | 599 | static bool gic_arm64_erratum_2941627_needed(struct irq_data *d) |
@@ -753,7 +755,7 @@ static bool gic_rpr_is_nmi_prio(void) |
753 | 755 | if (!gic_supports_nmi()) |
754 | 756 | return false; |
755 | 757 |
|
756 | | - return unlikely(gic_read_rpr() == GICD_INT_RPR_PRI(GICD_INT_NMI_PRI)); |
| 758 | + return unlikely(gic_read_rpr() == GICD_INT_RPR_PRI(dist_prio_nmi)); |
757 | 759 | } |
758 | 760 |
|
759 | 761 | static bool gic_irqnr_is_special(u32 irqnr) |
@@ -937,10 +939,11 @@ static void __init gic_dist_init(void) |
937 | 939 | writel_relaxed(0, base + GICD_ICFGRnE + i / 4); |
938 | 940 |
|
939 | 941 | for (i = 0; i < GIC_ESPI_NR; i += 4) |
940 | | - writel_relaxed(GICD_INT_DEF_PRI_X4, base + GICD_IPRIORITYRnE + i); |
| 942 | + writel_relaxed(REPEAT_BYTE_U32(dist_prio_irq), |
| 943 | + base + GICD_IPRIORITYRnE + i); |
941 | 944 |
|
942 | 945 | /* Now do the common stuff */ |
943 | | - gic_dist_config(base, GIC_LINE_NR); |
| 946 | + gic_dist_config(base, GIC_LINE_NR, dist_prio_irq); |
944 | 947 |
|
945 | 948 | val = GICD_CTLR_ARE_NS | GICD_CTLR_ENABLE_G1A | GICD_CTLR_ENABLE_G1; |
946 | 949 | if (gic_data.rdists.gicd_typer2 & GICD_TYPER2_nASSGIcap) { |
@@ -1282,7 +1285,7 @@ static void gic_cpu_init(void) |
1282 | 1285 | for (i = 0; i < gic_data.ppi_nr + SGI_NR; i += 32) |
1283 | 1286 | writel_relaxed(~0, rbase + GICR_IGROUPR0 + i / 8); |
1284 | 1287 |
|
1285 | | - gic_cpu_config(rbase, gic_data.ppi_nr + SGI_NR); |
| 1288 | + gic_cpu_config(rbase, gic_data.ppi_nr + SGI_NR, dist_prio_irq); |
1286 | 1289 | gic_redist_wait_for_rwp(); |
1287 | 1290 |
|
1288 | 1291 | /* initialise system registers */ |
@@ -2066,7 +2069,7 @@ static int __init gic_init_bases(phys_addr_t dist_phys_base, |
2066 | 2069 | gic_cpu_pm_init(); |
2067 | 2070 |
|
2068 | 2071 | if (gic_dist_supports_lpis()) { |
2069 | | - its_init(handle, &gic_data.rdists, gic_data.domain); |
| 2072 | + its_init(handle, &gic_data.rdists, gic_data.domain, dist_prio_irq); |
2070 | 2073 | its_cpu_init(); |
2071 | 2074 | its_lpi_memreserve_init(); |
2072 | 2075 | } else { |
|
0 commit comments