From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/irqchip/irq-gic.c | 61 ++++++++++++++++++++++++++++++ 1 files changed, 61 insertions(+), 0 deletions(-) diff --git a/kernel/drivers/irqchip/irq-gic.c b/kernel/drivers/irqchip/irq-gic.c index ac027de..cd3f72b 100644 --- a/kernel/drivers/irqchip/irq-gic.c +++ b/kernel/drivers/irqchip/irq-gic.c @@ -47,6 +47,10 @@ #include "irq-gic-common.h" +#ifdef CONFIG_ROCKCHIP_AMP +#include <soc/rockchip/rockchip_amp.h> +#endif + #ifdef CONFIG_ARM64 #include <asm/cpufeature.h> @@ -194,11 +198,19 @@ static void gic_mask_irq(struct irq_data *d) { +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return; +#endif gic_poke_irq(d, GIC_DIST_ENABLE_CLEAR); } static void gic_eoimode1_mask_irq(struct irq_data *d) { +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return; +#endif gic_mask_irq(d); /* * When masking a forwarded interrupt, make sure it is @@ -214,6 +226,10 @@ static void gic_unmask_irq(struct irq_data *d) { +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return; +#endif gic_poke_irq(d, GIC_DIST_ENABLE_SET); } @@ -221,6 +237,10 @@ { u32 hwirq = gic_irq(d); +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(hwirq)) + return; +#endif if (hwirq < 16) hwirq = this_cpu_read(sgi_intid); @@ -231,6 +251,10 @@ { u32 hwirq = gic_irq(d); +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return; +#endif /* Do not deactivate an IRQ forwarded to a vcpu. */ if (irqd_is_forwarded_to_vcpu(d)) return; @@ -246,6 +270,10 @@ { u32 reg; +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return -EINVAL; +#endif switch (which) { case IRQCHIP_STATE_PENDING: reg = val ? GIC_DIST_PENDING_SET : GIC_DIST_PENDING_CLEAR; @@ -295,6 +323,11 @@ void __iomem *base = gic_dist_base(d); unsigned int gicirq = gic_irq(d); int ret; + +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return -EINVAL; +#endif /* Interrupt configuration for SGIs can't be changed */ if (gicirq < 16) @@ -492,10 +525,29 @@ * Set all global interrupts to this CPU only. */ cpumask = gic_get_cpumask(gic); + +#ifdef CONFIG_ROCKCHIP_AMP + for (i = 32; i < gic_irqs; i += 4) { + u32 maskval; + unsigned int j; + + maskval = 0; + for (j = 0; j < 4; j++) { + if (rockchip_amp_check_amp_irq(i + j)) { + maskval |= rockchip_amp_get_irq_cpumask(i + j) << + (j * 8); + } else { + maskval |= cpumask << (j * 8); + } + } + writel_relaxed(maskval, base + GIC_DIST_TARGET + i * 4 / 4); + } +#else cpumask |= cpumask << 8; cpumask |= cpumask << 16; for (i = 32; i < gic_irqs; i += 4) writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); +#endif gic_dist_config(base, gic_irqs, NULL); @@ -846,6 +898,11 @@ { void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + gic_irq(d); unsigned int cpu; + +#ifdef CONFIG_ROCKCHIP_AMP + if (rockchip_amp_check_amp_irq(gic_irq(d))) + return -EINVAL; +#endif if (!force) cpu = cpumask_any_and(mask_val, cpu_online_mask); @@ -1509,6 +1566,10 @@ gic_enable_of_quirks(node, gic_quirks, gic); +#ifdef CONFIG_ROCKCHIP_AMP + rockchip_amp_get_gic_info(); +#endif + return 0; error: -- Gitblit v1.6.2