From 072de836f53be56a70cecf70b43ae43b7ce17376 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 10:08:36 +0000
Subject: [PATCH] mk-rootfs.sh
---
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