Re: [RFC PATCH v2 20/31] kvx: Add memory management
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
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)