Re: [RFC PATCH v2 20/31] kvx: Add memory management

2023-01-23 Thread Mike Rapoport
On Fri, Jan 20, 2023 at 03:09:51PM +0100, Yann Sionneau wrote:
> Add memory management support for kvx, including: cache and tlb
> management, page fault handling, ioremap/mmap and streaming dma support.
> 
> Co-developed-by: Clement Leger 
> Signed-off-by: Clement Leger 
> Co-developed-by: Guillaume Thouvenin 
> Signed-off-by: Guillaume Thouvenin 
> Co-developed-by: Jean-Christophe Pince 
> Signed-off-by: Jean-Christophe Pince 
> Co-developed-by: Jules Maselbas 
> Signed-off-by: Jules Maselbas 
> Co-developed-by: Julian Vetter 
> Signed-off-by: Julian Vetter 
> Co-developed-by: Julien Hascoet 
> Signed-off-by: Julien Hascoet 
> Co-developed-by: Louis Morhet 
> Signed-off-by: Louis Morhet 
> Co-developed-by: Marc Poulhiès 
> Signed-off-by: Marc Poulhiès 
> Co-developed-by: Marius Gligor 
> Signed-off-by: Marius Gligor 
> Co-developed-by: Vincent Chardon 
> Signed-off-by: Vincent Chardon 
> Co-developed-by: Yann Sionneau 
> Signed-off-by: Yann Sionneau 
> ---
> 
> Notes:
> V1 -> V2: removed L2 cache management
> 
>  arch/kvx/include/asm/cache.h|  43 +++
>  arch/kvx/include/asm/cacheflush.h   | 158 ++
>  arch/kvx/include/asm/fixmap.h   |  47 +++
>  arch/kvx/include/asm/hugetlb.h  |  36 +++
>  arch/kvx/include/asm/mem_map.h  |  44 +++
>  arch/kvx/include/asm/mmu.h  | 289 ++
>  arch/kvx/include/asm/mmu_context.h  | 156 ++
>  arch/kvx/include/asm/mmu_stats.h|  38 +++
>  arch/kvx/include/asm/page.h | 187 
>  arch/kvx/include/asm/page_size.h|  29 ++
>  arch/kvx/include/asm/pgalloc.h  | 101 +++
>  arch/kvx/include/asm/pgtable-bits.h | 102 +++
>  arch/kvx/include/asm/pgtable.h  | 451 
>  arch/kvx/include/asm/rm_fw.h|  16 +
>  arch/kvx/include/asm/sparsemem.h|  15 +
>  arch/kvx/include/asm/symbols.h  |  16 +
>  arch/kvx/include/asm/tlb.h  |  24 ++
>  arch/kvx/include/asm/tlb_defs.h | 131 
>  arch/kvx/include/asm/tlbflush.h |  58 
>  arch/kvx/include/asm/vmalloc.h  |  10 +
>  arch/kvx/mm/cacheflush.c| 154 ++
>  arch/kvx/mm/dma-mapping.c   |  85 ++
>  arch/kvx/mm/extable.c   |  24 ++
>  arch/kvx/mm/fault.c | 264 
>  arch/kvx/mm/init.c  | 277 +
>  arch/kvx/mm/mmap.c  |  31 ++
>  arch/kvx/mm/mmu.c   | 202 +
>  arch/kvx/mm/mmu_stats.c |  94 ++
>  arch/kvx/mm/tlb.c   | 433 ++
>  29 files changed, 3515 insertions(+)
>  create mode 100644 arch/kvx/include/asm/cache.h
>  create mode 100644 arch/kvx/include/asm/cacheflush.h
>  create mode 100644 arch/kvx/include/asm/fixmap.h
>  create mode 100644 arch/kvx/include/asm/hugetlb.h
>  create mode 100644 arch/kvx/include/asm/mem_map.h
>  create mode 100644 arch/kvx/include/asm/mmu.h
>  create mode 100644 arch/kvx/include/asm/mmu_context.h
>  create mode 100644 arch/kvx/include/asm/mmu_stats.h
>  create mode 100644 arch/kvx/include/asm/page.h
>  create mode 100644 arch/kvx/include/asm/page_size.h
>  create mode 100644 arch/kvx/include/asm/pgalloc.h
>  create mode 100644 arch/kvx/include/asm/pgtable-bits.h
>  create mode 100644 arch/kvx/include/asm/pgtable.h
>  create mode 100644 arch/kvx/include/asm/rm_fw.h
>  create mode 100644 arch/kvx/include/asm/sparsemem.h
>  create mode 100644 arch/kvx/include/asm/symbols.h
>  create mode 100644 arch/kvx/include/asm/tlb.h
>  create mode 100644 arch/kvx/include/asm/tlb_defs.h
>  create mode 100644 arch/kvx/include/asm/tlbflush.h
>  create mode 100644 arch/kvx/include/asm/vmalloc.h
>  create mode 100644 arch/kvx/mm/cacheflush.c
>  create mode 100644 arch/kvx/mm/dma-mapping.c
>  create mode 100644 arch/kvx/mm/extable.c
>  create mode 100644 arch/kvx/mm/fault.c
>  create mode 100644 arch/kvx/mm/init.c
>  create mode 100644 arch/kvx/mm/mmap.c
>  create mode 100644 arch/kvx/mm/mmu.c
>  create mode 100644 arch/kvx/mm/mmu_stats.c
>  create mode 100644 arch/kvx/mm/tlb.c

... 

> diff --git a/arch/kvx/include/asm/mmu.h b/arch/kvx/include/asm/mmu.h
> new file mode 100644
> index ..09f3fdd66a34
> --- /dev/null
> +++ b/arch/kvx/include/asm/mmu.h
> @@ -0,0 +1,289 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (C) 2017-2023 Kalray Inc.
> + * Author(s): Guillaume Thouvenin
> + *Clement Leger
> + *Marc Poulhiès
> + */
> +
> +#ifndef _ASM_KVX_MMU_H
> +#define _ASM_KVX_MMU_H
> +
> +#include 
> +#include 
> +#include 
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +/* Virtual addresses can use at most 41 bits */
> +#define MMU_VIRT_BITS41
> +
> +/*
> + * See Documentation/kvx/kvx-mmu.txt for details about the division of the
> + * virtual memory space.
> + */
> +#if defined(CONFIG_KVX_4K_PAGES)
> +#define MMU_USR_ADDR_BITS39
> +#else
> +#error "Only 4Ko page size is 

[RFC PATCH v2 20/31] kvx: Add memory management

2023-01-20 Thread Yann Sionneau
Add memory management support for kvx, including: cache and tlb
management, page fault handling, ioremap/mmap and streaming dma support.

Co-developed-by: Clement Leger 
Signed-off-by: Clement Leger 
Co-developed-by: Guillaume Thouvenin 
Signed-off-by: Guillaume Thouvenin 
Co-developed-by: Jean-Christophe Pince 
Signed-off-by: Jean-Christophe Pince 
Co-developed-by: Jules Maselbas 
Signed-off-by: Jules Maselbas 
Co-developed-by: Julian Vetter 
Signed-off-by: Julian Vetter 
Co-developed-by: Julien Hascoet 
Signed-off-by: Julien Hascoet 
Co-developed-by: Louis Morhet 
Signed-off-by: Louis Morhet 
Co-developed-by: Marc Poulhiès 
Signed-off-by: Marc Poulhiès 
Co-developed-by: Marius Gligor 
Signed-off-by: Marius Gligor 
Co-developed-by: Vincent Chardon 
Signed-off-by: Vincent Chardon 
Co-developed-by: Yann Sionneau 
Signed-off-by: Yann Sionneau 
---

Notes:
V1 -> V2: removed L2 cache management

 arch/kvx/include/asm/cache.h|  43 +++
 arch/kvx/include/asm/cacheflush.h   | 158 ++
 arch/kvx/include/asm/fixmap.h   |  47 +++
 arch/kvx/include/asm/hugetlb.h  |  36 +++
 arch/kvx/include/asm/mem_map.h  |  44 +++
 arch/kvx/include/asm/mmu.h  | 289 ++
 arch/kvx/include/asm/mmu_context.h  | 156 ++
 arch/kvx/include/asm/mmu_stats.h|  38 +++
 arch/kvx/include/asm/page.h | 187 
 arch/kvx/include/asm/page_size.h|  29 ++
 arch/kvx/include/asm/pgalloc.h  | 101 +++
 arch/kvx/include/asm/pgtable-bits.h | 102 +++
 arch/kvx/include/asm/pgtable.h  | 451 
 arch/kvx/include/asm/rm_fw.h|  16 +
 arch/kvx/include/asm/sparsemem.h|  15 +
 arch/kvx/include/asm/symbols.h  |  16 +
 arch/kvx/include/asm/tlb.h  |  24 ++
 arch/kvx/include/asm/tlb_defs.h | 131 
 arch/kvx/include/asm/tlbflush.h |  58 
 arch/kvx/include/asm/vmalloc.h  |  10 +
 arch/kvx/mm/cacheflush.c| 154 ++
 arch/kvx/mm/dma-mapping.c   |  85 ++
 arch/kvx/mm/extable.c   |  24 ++
 arch/kvx/mm/fault.c | 264 
 arch/kvx/mm/init.c  | 277 +
 arch/kvx/mm/mmap.c  |  31 ++
 arch/kvx/mm/mmu.c   | 202 +
 arch/kvx/mm/mmu_stats.c |  94 ++
 arch/kvx/mm/tlb.c   | 433 ++
 29 files changed, 3515 insertions(+)
 create mode 100644 arch/kvx/include/asm/cache.h
 create mode 100644 arch/kvx/include/asm/cacheflush.h
 create mode 100644 arch/kvx/include/asm/fixmap.h
 create mode 100644 arch/kvx/include/asm/hugetlb.h
 create mode 100644 arch/kvx/include/asm/mem_map.h
 create mode 100644 arch/kvx/include/asm/mmu.h
 create mode 100644 arch/kvx/include/asm/mmu_context.h
 create mode 100644 arch/kvx/include/asm/mmu_stats.h
 create mode 100644 arch/kvx/include/asm/page.h
 create mode 100644 arch/kvx/include/asm/page_size.h
 create mode 100644 arch/kvx/include/asm/pgalloc.h
 create mode 100644 arch/kvx/include/asm/pgtable-bits.h
 create mode 100644 arch/kvx/include/asm/pgtable.h
 create mode 100644 arch/kvx/include/asm/rm_fw.h
 create mode 100644 arch/kvx/include/asm/sparsemem.h
 create mode 100644 arch/kvx/include/asm/symbols.h
 create mode 100644 arch/kvx/include/asm/tlb.h
 create mode 100644 arch/kvx/include/asm/tlb_defs.h
 create mode 100644 arch/kvx/include/asm/tlbflush.h
 create mode 100644 arch/kvx/include/asm/vmalloc.h
 create mode 100644 arch/kvx/mm/cacheflush.c
 create mode 100644 arch/kvx/mm/dma-mapping.c
 create mode 100644 arch/kvx/mm/extable.c
 create mode 100644 arch/kvx/mm/fault.c
 create mode 100644 arch/kvx/mm/init.c
 create mode 100644 arch/kvx/mm/mmap.c
 create mode 100644 arch/kvx/mm/mmu.c
 create mode 100644 arch/kvx/mm/mmu_stats.c
 create mode 100644 arch/kvx/mm/tlb.c

diff --git a/arch/kvx/include/asm/cache.h b/arch/kvx/include/asm/cache.h
new file mode 100644
index ..a51a68d23cfc
--- /dev/null
+++ b/arch/kvx/include/asm/cache.h
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2017-2023 Kalray Inc.
+ * Author(s): Clement Leger
+ */
+
+#ifndef _ASM_KVX_CACHE_H
+#define _ASM_KVX_CACHE_H
+
+/**
+ * On kvx I$ and D$ have the same size (16KB).
+ * Caches are 16K bytes big, VIPT 4-way set associative, true LRU, with 64-byte
+ * lines. The D$ is also write-through.
+ */
+#define KVX_ICACHE_WAY_COUNT   4
+#define KVX_ICACHE_SET_COUNT   64
+#define KVX_ICACHE_LINE_SHIFT  6
+#define KVX_ICACHE_LINE_SIZE   (1 << KVX_ICACHE_LINE_SHIFT)
+#define KVX_ICACHE_SIZE\
+   (KVX_ICACHE_WAY_COUNT * KVX_ICACHE_SET_COUNT * KVX_ICACHE_LINE_SIZE)
+
+/**
+ * Invalidate the whole I-cache if the size to flush is more than this value
+ */
+#define KVX_ICACHE_INVAL_SIZE  (KVX_ICACHE_SIZE)
+
+/* D-Cache */
+#define KVX_DCACHE_WAY_COUNT   4
+#define KVX_DCACHE_SET_COUNT   64
+#define KVX_DCACHE_LINE_SHIFT  6
+#define KVX_DCACHE_LINE_SIZE   (1 << KVX_DCACHE_LINE_SHIFT)