csky: MMU and page table management
This patch adds files related to memory management and here is our memory-layout: Fixmap : 0xffc02000 – 0xfffff000 (4 MB - 12KB) Pkmap : 0xff800000 – 0xffc00000 (4 MB) Vmalloc : 0xf0200000 – 0xff000000 (238 MB) Lowmem : 0x80000000 – 0xc0000000 (1GB) abiv1 CPU (CK610) is VIPT cache and it doesn't support highmem. abiv2 CPUs are all PIPT cache and they could support highmem. Lowmem is directly mapped by msa0 & msa1 reg, and we needn't setup memory page table for it. Link:https://lore.kernel.org/lkml/20180518215548.GH17671@n2100.armlinux.org.uk/ Signed-off-by: Guo Ren <ren_guo@c-sky.com> Cc: Christoph Hellwig <hch@infradead.org> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
87
arch/csky/abiv2/inc/abi/ckmmu.h
Normal file
87
arch/csky/abiv2/inc/abi/ckmmu.h
Normal file
@@ -0,0 +1,87 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
|
||||
|
||||
#ifndef __ASM_CSKY_CKMMUV2_H
|
||||
#define __ASM_CSKY_CKMMUV2_H
|
||||
|
||||
#include <abi/reg_ops.h>
|
||||
#include <asm/barrier.h>
|
||||
|
||||
static inline int read_mmu_index(void)
|
||||
{
|
||||
return mfcr("cr<0, 15>");
|
||||
}
|
||||
|
||||
static inline void write_mmu_index(int value)
|
||||
{
|
||||
mtcr("cr<0, 15>", value);
|
||||
}
|
||||
|
||||
static inline int read_mmu_entrylo0(void)
|
||||
{
|
||||
return mfcr("cr<2, 15>");
|
||||
}
|
||||
|
||||
static inline int read_mmu_entrylo1(void)
|
||||
{
|
||||
return mfcr("cr<3, 15>");
|
||||
}
|
||||
|
||||
static inline void write_mmu_pagemask(int value)
|
||||
{
|
||||
mtcr("cr<6, 15>", value);
|
||||
}
|
||||
|
||||
static inline int read_mmu_entryhi(void)
|
||||
{
|
||||
return mfcr("cr<4, 15>");
|
||||
}
|
||||
|
||||
static inline void write_mmu_entryhi(int value)
|
||||
{
|
||||
mtcr("cr<4, 15>", value);
|
||||
}
|
||||
|
||||
/*
|
||||
* TLB operations.
|
||||
*/
|
||||
static inline void tlb_probe(void)
|
||||
{
|
||||
mtcr("cr<8, 15>", 0x80000000);
|
||||
}
|
||||
|
||||
static inline void tlb_read(void)
|
||||
{
|
||||
mtcr("cr<8, 15>", 0x40000000);
|
||||
}
|
||||
|
||||
static inline void tlb_invalid_all(void)
|
||||
{
|
||||
#ifdef CONFIG_CPU_HAS_TLBI
|
||||
asm volatile("tlbi.alls\n":::"memory");
|
||||
sync_is();
|
||||
#else
|
||||
mtcr("cr<8, 15>", 0x04000000);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void tlb_invalid_indexed(void)
|
||||
{
|
||||
mtcr("cr<8, 15>", 0x02000000);
|
||||
}
|
||||
|
||||
/* setup hardrefil pgd */
|
||||
static inline unsigned long get_pgd(void)
|
||||
{
|
||||
return mfcr("cr<29, 15>");
|
||||
}
|
||||
|
||||
static inline void setup_pgd(unsigned long pgd, bool kernel)
|
||||
{
|
||||
if (kernel)
|
||||
mtcr("cr<28, 15>", pgd);
|
||||
else
|
||||
mtcr("cr<29, 15>", pgd);
|
||||
}
|
||||
|
||||
#endif /* __ASM_CSKY_CKMMUV2_H */
|
14
arch/csky/abiv2/inc/abi/page.h
Normal file
14
arch/csky/abiv2/inc/abi/page.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
|
||||
|
||||
static inline void clear_user_page(void *addr, unsigned long vaddr,
|
||||
struct page *page)
|
||||
{
|
||||
clear_page(addr);
|
||||
}
|
||||
|
||||
static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
|
||||
struct page *page)
|
||||
{
|
||||
copy_page(to, from);
|
||||
}
|
37
arch/csky/abiv2/inc/abi/pgtable-bits.h
Normal file
37
arch/csky/abiv2/inc/abi/pgtable-bits.h
Normal file
@@ -0,0 +1,37 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
|
||||
|
||||
#ifndef __ASM_CSKY_PGTABLE_BITS_H
|
||||
#define __ASM_CSKY_PGTABLE_BITS_H
|
||||
|
||||
/* implemented in software */
|
||||
#define _PAGE_ACCESSED (1<<7)
|
||||
#define PAGE_ACCESSED_BIT (7)
|
||||
|
||||
#define _PAGE_READ (1<<8)
|
||||
#define _PAGE_WRITE (1<<9)
|
||||
#define _PAGE_PRESENT (1<<10)
|
||||
|
||||
#define _PAGE_MODIFIED (1<<11)
|
||||
#define PAGE_MODIFIED_BIT (11)
|
||||
|
||||
/* implemented in hardware */
|
||||
#define _PAGE_GLOBAL (1<<0)
|
||||
|
||||
#define _PAGE_VALID (1<<1)
|
||||
#define PAGE_VALID_BIT (1)
|
||||
|
||||
#define _PAGE_DIRTY (1<<2)
|
||||
#define PAGE_DIRTY_BIT (2)
|
||||
|
||||
#define _PAGE_SO (1<<5)
|
||||
#define _PAGE_BUF (1<<6)
|
||||
|
||||
#define _PAGE_CACHE (1<<3)
|
||||
|
||||
#define _CACHE_MASK _PAGE_CACHE
|
||||
|
||||
#define _CACHE_CACHED (_PAGE_VALID | _PAGE_CACHE | _PAGE_BUF)
|
||||
#define _CACHE_UNCACHED (_PAGE_VALID | _PAGE_SO)
|
||||
|
||||
#endif /* __ASM_CSKY_PGTABLE_BITS_H */
|
Referens i nytt ärende
Block a user