summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@sigma-chemnitz.de>2024-04-12 18:28:35 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2024-04-16 13:55:36 +0200
commit65ef5d885263dd9fc61c1d78bd5b951396058d88 (patch)
tree501d90a9ad41775f92b3380eb3ff1949a08fa763
parent7b7ab4a37d255ef8261e6a33c6e3e488c609e811 (diff)
downloadbarebox-65ef5d885263dd9fc61c1d78bd5b951396058d88.tar.gz
barebox-65ef5d885263dd9fc61c1d78bd5b951396058d88.tar.xz
ARM64: let 'end' point after the range in cache functions
v8_flush_dcache_range() and v8_inv_dcache_range() are implemented under the assumption that their 'end' parameter points *after* the range. Fix callers to use it in this way. This fixes e.g. spurious corruptions in the last octet when sending 129 bytes over ethernet. Signed-off-by: Enrico Scholz <enrico.scholz@sigma-chemnitz.de> Link: https://lore.barebox.org/20240412162836.284671-1-enrico.scholz@sigma-chemnitz.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--arch/arm/cpu/dma_64.c2
-rw-r--r--arch/arm/cpu/mmu_64.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/arch/arm/cpu/dma_64.c b/arch/arm/cpu/dma_64.c
index 74d7167860..b50572f5e6 100644
--- a/arch/arm/cpu/dma_64.c
+++ b/arch/arm/cpu/dma_64.c
@@ -6,7 +6,7 @@ void arch_sync_dma_for_device(void *vaddr, size_t size,
enum dma_data_direction dir)
{
unsigned long start = (unsigned long)vaddr;
- unsigned long end = start + size - 1;
+ unsigned long end = start + size;
if (dir == DMA_FROM_DEVICE)
v8_inv_dcache_range(start, end);
diff --git a/arch/arm/cpu/mmu_64.c b/arch/arm/cpu/mmu_64.c
index f907421da9..71c0d8930e 100644
--- a/arch/arm/cpu/mmu_64.c
+++ b/arch/arm/cpu/mmu_64.c
@@ -282,7 +282,7 @@ void mmu_disable(void)
void dma_inv_range(void *ptr, size_t size)
{
unsigned long start = (unsigned long)ptr;
- unsigned long end = start + size - 1;
+ unsigned long end = start + size;
v8_inv_dcache_range(start, end);
}
@@ -290,7 +290,7 @@ void dma_inv_range(void *ptr, size_t size)
void dma_flush_range(void *ptr, size_t size)
{
unsigned long start = (unsigned long)ptr;
- unsigned long end = start + size - 1;
+ unsigned long end = start + size;
v8_flush_dcache_range(start, end);
}