Move kernel config and patches to kernel 6.6. Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
68 lines
2.0 KiB
Diff
68 lines
2.0 KiB
Diff
From d3badb15613c14dd35d3495b1dde5c90fcd616dd Mon Sep 17 00:00:00 2001
|
|
From: Fang Xiang <fangxiang3@xiaomi.com>
|
|
Date: Mon, 30 Oct 2023 16:32:56 +0800
|
|
Subject: [PATCH] irqchip/gic-v3-its: Flush ITS tables correctly in
|
|
non-coherent GIC designs
|
|
|
|
In non-coherent GIC designs, the ITS tables must be flushed before writing
|
|
to the GITS_BASER<n> registers, otherwise the ITS could read dirty tables,
|
|
which results in unpredictable behavior.
|
|
|
|
Flush the tables right at the begin of its_setup_baser() to prevent that.
|
|
|
|
[ tglx: Massage changelog ]
|
|
|
|
Fixes: a8707f553884 ("irqchip/gic-v3: Add Rockchip 3588001 erratum workaround")
|
|
Suggested-by: Marc Zyngier <maz@kernel.org>
|
|
Signed-off-by: Fang Xiang <fangxiang3@xiaomi.com>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Reviewed-by: Marc Zyngier <maz@kernel.org>
|
|
Link: https://lore.kernel.org/r/20231030083256.4345-1-fangxiang3@xiaomi.com
|
|
---
|
|
drivers/irqchip/irq-gic-v3-its.c | 16 ++++++++++------
|
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/irqchip/irq-gic-v3-its.c
|
|
+++ b/drivers/irqchip/irq-gic-v3-its.c
|
|
@@ -2383,12 +2383,12 @@ retry_baser:
|
|
break;
|
|
}
|
|
|
|
+ if (!shr)
|
|
+ gic_flush_dcache_to_poc(base, PAGE_ORDER_TO_SIZE(order));
|
|
+
|
|
its_write_baser(its, baser, val);
|
|
tmp = baser->val;
|
|
|
|
- if (its->flags & ITS_FLAGS_FORCE_NON_SHAREABLE)
|
|
- tmp &= ~GITS_BASER_SHAREABILITY_MASK;
|
|
-
|
|
if ((val ^ tmp) & GITS_BASER_SHAREABILITY_MASK) {
|
|
/*
|
|
* Shareability didn't stick. Just use
|
|
@@ -2398,10 +2398,9 @@ retry_baser:
|
|
* non-cacheable as well.
|
|
*/
|
|
shr = tmp & GITS_BASER_SHAREABILITY_MASK;
|
|
- if (!shr) {
|
|
+ if (!shr)
|
|
cache = GITS_BASER_nC;
|
|
- gic_flush_dcache_to_poc(base, PAGE_ORDER_TO_SIZE(order));
|
|
- }
|
|
+
|
|
goto retry_baser;
|
|
}
|
|
|
|
@@ -2613,6 +2612,11 @@ static int its_alloc_tables(struct its_n
|
|
/* erratum 24313: ignore memory access type */
|
|
cache = GITS_BASER_nCnB;
|
|
|
|
+ if (its->flags & ITS_FLAGS_FORCE_NON_SHAREABLE) {
|
|
+ cache = GITS_BASER_nC;
|
|
+ shr = 0;
|
|
+ }
|
|
+
|
|
for (i = 0; i < GITS_BASER_NR_REGS; i++) {
|
|
struct its_baser *baser = its->tables + i;
|
|
u64 val = its_read_baser(its, baser);
|