forked from armbian/build
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
rk3588: edge: update kernel to 6.5-rc5 and fix its timeout issue
- Loading branch information
1 parent
c268d2f
commit c6ba228
Showing
5 changed files
with
221 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
36 changes: 0 additions & 36 deletions
36
...588-edge/0010-irqchip-gic-v3-Enable-Rockchip-3588001-erratum-workaround-for-RK3588S.patch
This file was deleted.
Oops, something went wrong.
215 changes: 215 additions & 0 deletions
215
patch/kernel/rockchip-rk3588-edge/0011-irqchip-fix-its-timeout-issue.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,215 @@ | ||
From d441305416aa91190df5865bbc0e3c684ec183b0 Mon Sep 17 00:00:00 2001 | ||
From: Muhammed Efe Cetin <[email protected]> | ||
Date: Fri, 11 Aug 2023 17:56:00 +0300 | ||
Subject: [PATCH 1/1] irqchip/irq-gic-v3-its: fix its timeout issue for rk35xx | ||
boards | ||
|
||
--- | ||
drivers/irqchip/irq-gic-v3-its.c | 79 +++++++++++++++++++++++++++++--- | ||
1 file changed, 72 insertions(+), 7 deletions(-) | ||
|
||
diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c | ||
index e0c2b10d154d..eef86e179a52 100644 | ||
--- a/drivers/irqchip/irq-gic-v3-its.c | ||
+++ b/drivers/irqchip/irq-gic-v3-its.c | ||
@@ -167,6 +167,7 @@ struct its_device { | ||
struct its_node *its; | ||
struct event_lpi_map event_map; | ||
void *itt; | ||
+ u32 itt_sz; | ||
u32 nr_ites; | ||
u32 device_id; | ||
bool shared; | ||
@@ -2204,6 +2205,9 @@ static void gic_reset_prop_table(void *va) | ||
static struct page *its_allocate_prop_table(gfp_t gfp_flags) | ||
{ | ||
struct page *prop_page; | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ gfp_flags |= GFP_DMA32; | ||
|
||
prop_page = alloc_pages(gfp_flags, get_order(LPI_PROPBASE_SZ)); | ||
if (!prop_page) | ||
@@ -2328,6 +2332,7 @@ static int its_setup_baser(struct its_node *its, struct its_baser *baser, | ||
u32 alloc_pages, psz; | ||
struct page *page; | ||
void *base; | ||
+ gfp_t gfp_flags; | ||
|
||
psz = baser->psz; | ||
alloc_pages = (PAGE_ORDER_TO_SIZE(order) / psz); | ||
@@ -2339,7 +2344,11 @@ static int its_setup_baser(struct its_node *its, struct its_baser *baser, | ||
order = get_order(GITS_BASER_PAGES_MAX * psz); | ||
} | ||
|
||
- page = alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, order); | ||
+ gfp_flags = GFP_KERNEL | __GFP_ZERO; | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ gfp_flags |= GFP_DMA32; | ||
+ | ||
+ page = alloc_pages_node(its->numa_node, gfp_flags, order); | ||
if (!page) | ||
return -ENOMEM; | ||
|
||
@@ -2389,6 +2398,15 @@ static int its_setup_baser(struct its_node *its, struct its_baser *baser, | ||
if (its->flags & ITS_FLAGS_FORCE_NON_SHAREABLE) | ||
tmp &= ~GITS_BASER_SHAREABILITY_MASK; | ||
|
||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || | ||
+ of_machine_is_compatible("rockchip,rk3588")) { | ||
+ if (tmp & GITS_BASER_SHAREABILITY_MASK) | ||
+ tmp &= ~GITS_BASER_SHAREABILITY_MASK; | ||
+ else | ||
+ gic_flush_dcache_to_poc(base, PAGE_ORDER_TO_SIZE(order)); | ||
+ } | ||
+ | ||
if ((val ^ tmp) & GITS_BASER_SHAREABILITY_MASK) { | ||
/* | ||
* Shareability didn't stick. Just use | ||
@@ -2970,7 +2988,9 @@ static int its_alloc_collections(struct its_node *its) | ||
static struct page *its_allocate_pending_table(gfp_t gfp_flags) | ||
{ | ||
struct page *pend_page; | ||
- | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ gfp_flags |= GFP_DMA32; | ||
pend_page = alloc_pages(gfp_flags | __GFP_ZERO, | ||
get_order(LPI_PENDBASE_SZ)); | ||
if (!pend_page) | ||
@@ -3129,6 +3149,11 @@ static void its_cpu_init_lpis(void) | ||
if (gic_rdists->flags & RDIST_FLAGS_FORCE_NON_SHAREABLE) | ||
tmp &= ~GICR_PROPBASER_SHAREABILITY_MASK; | ||
|
||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || | ||
+ of_machine_is_compatible("rockchip,rk3588")) | ||
+ tmp &= ~GICR_PROPBASER_SHAREABILITY_MASK; | ||
+ | ||
if ((tmp ^ val) & GICR_PROPBASER_SHAREABILITY_MASK) { | ||
if (!(tmp & GICR_PROPBASER_SHAREABILITY_MASK)) { | ||
/* | ||
@@ -3156,6 +3181,11 @@ static void its_cpu_init_lpis(void) | ||
if (gic_rdists->flags & RDIST_FLAGS_FORCE_NON_SHAREABLE) | ||
tmp &= ~GICR_PENDBASER_SHAREABILITY_MASK; | ||
|
||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || | ||
+ of_machine_is_compatible("rockchip,rk3588")) | ||
+ tmp &= ~GICR_PENDBASER_SHAREABILITY_MASK; | ||
+ | ||
if (!(tmp & GICR_PENDBASER_SHAREABILITY_MASK)) { | ||
/* | ||
* The HW reports non-shareable, we must remove the | ||
@@ -3319,7 +3349,11 @@ static bool its_alloc_table_entry(struct its_node *its, | ||
|
||
/* Allocate memory for 2nd level table */ | ||
if (!table[idx]) { | ||
- page = alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, | ||
+ gfp_t gfp_flags = GFP_KERNEL | __GFP_ZERO; | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ gfp_flags |= GFP_DMA32; | ||
+ page = alloc_pages_node(its->numa_node, gfp_flags, | ||
get_order(baser->psz)); | ||
if (!page) | ||
return false; | ||
@@ -3408,6 +3442,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | ||
int nr_lpis; | ||
int nr_ites; | ||
int sz; | ||
+ gfp_t gfp_flags; | ||
|
||
if (!its_alloc_device_table(its, dev_id)) | ||
return NULL; | ||
@@ -3423,7 +3458,15 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | ||
nr_ites = max(2, nvecs); | ||
sz = nr_ites * (FIELD_GET(GITS_TYPER_ITT_ENTRY_SIZE, its->typer) + 1); | ||
sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1; | ||
- itt = kzalloc_node(sz, GFP_KERNEL, its->numa_node); | ||
+ gfp_flags = GFP_KERNEL; | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) { | ||
+ gfp_flags |= GFP_DMA32; | ||
+ itt = (void *)__get_free_pages(gfp_flags, get_order(sz)); | ||
+ } else { | ||
+ itt = kzalloc_node(sz, gfp_flags, its->numa_node); | ||
+ } | ||
+ | ||
if (alloc_lpis) { | ||
lpi_map = its_lpi_alloc(nvecs, &lpi_base, &nr_lpis); | ||
if (lpi_map) | ||
@@ -3437,7 +3480,13 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | ||
|
||
if (!dev || !itt || !col_map || (!lpi_map && alloc_lpis)) { | ||
kfree(dev); | ||
- kfree(itt); | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ free_pages((unsigned long)itt, get_order(sz)); | ||
+ else | ||
+ kfree(itt); | ||
+ | ||
bitmap_free(lpi_map); | ||
kfree(col_map); | ||
return NULL; | ||
@@ -3447,6 +3496,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id, | ||
|
||
dev->its = its; | ||
dev->itt = itt; | ||
+ dev->itt_sz = sz; | ||
dev->nr_ites = nr_ites; | ||
dev->event_map.lpi_map = lpi_map; | ||
dev->event_map.col_map = col_map; | ||
@@ -3474,7 +3524,13 @@ static void its_free_device(struct its_device *its_dev) | ||
list_del(&its_dev->entry); | ||
raw_spin_unlock_irqrestore(&its_dev->its->lock, flags); | ||
kfree(its_dev->event_map.col_map); | ||
- kfree(its_dev->itt); | ||
+ | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ free_pages((unsigned long)its_dev->itt, get_order(its_dev->itt_sz)); | ||
+ else | ||
+ kfree(its_dev->itt); | ||
+ | ||
kfree(its_dev); | ||
} | ||
|
||
@@ -5064,6 +5120,7 @@ static int __init its_probe_one(struct resource *res, | ||
struct page *page; | ||
u32 ctlr; | ||
int err; | ||
+ gfp_t gfp_flags; | ||
|
||
its_base = its_map_one(res, &err); | ||
if (!its_base) | ||
@@ -5117,7 +5174,10 @@ static int __init its_probe_one(struct resource *res, | ||
|
||
its->numa_node = numa_node; | ||
|
||
- page = alloc_pages_node(its->numa_node, GFP_KERNEL | __GFP_ZERO, | ||
+ gfp_flags = GFP_KERNEL | __GFP_ZERO; | ||
+ if (of_machine_is_compatible("rockchip,rk3568") || of_machine_is_compatible("rockchip,rk3566") || of_machine_is_compatible("rockchip,rk3588")) | ||
+ gfp_flags |= GFP_DMA32; | ||
+ page = alloc_pages_node(its->numa_node, gfp_flags, | ||
get_order(ITS_CMD_QUEUE_SZ)); | ||
if (!page) { | ||
err = -ENOMEM; | ||
@@ -5151,6 +5211,11 @@ static int __init its_probe_one(struct resource *res, | ||
if (its->flags & ITS_FLAGS_FORCE_NON_SHAREABLE) | ||
tmp &= ~GITS_CBASER_SHAREABILITY_MASK; | ||
|
||
+ if (of_machine_is_compatible("rockchip,rk3568") || | ||
+ of_machine_is_compatible("rockchip,rk3566") || | ||
+ of_machine_is_compatible("rockchip,rk3588")) | ||
+ tmp &= ~GITS_CBASER_SHAREABILITY_MASK; | ||
+ | ||
if ((tmp ^ baser) & GITS_CBASER_SHAREABILITY_MASK) { | ||
if (!(tmp & GITS_CBASER_SHAREABILITY_MASK)) { | ||
/* | ||
-- | ||
2.41.0 | ||
|