1/* SPDX-License-Identifier: GPL-2.0 */ 2// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 3 4#ifndef __ASM_CSKY_CKMMUV2_H 5#define __ASM_CSKY_CKMMUV2_H 6 7#include <abi/reg_ops.h> 8#include <asm/barrier.h> 9 10static inline int read_mmu_index(void) 11{ 12 return mfcr("cr<0, 15>"); 13} 14 15static inline void write_mmu_index(int value) 16{ 17 mtcr("cr<0, 15>", value); 18} 19 20static inline int read_mmu_entrylo0(void) 21{ 22 return mfcr("cr<2, 15>"); 23} 24 25static inline int read_mmu_entrylo1(void) 26{ 27 return mfcr("cr<3, 15>"); 28} 29 30static inline void write_mmu_pagemask(int value) 31{ 32 mtcr("cr<6, 15>", value); 33} 34 35static inline int read_mmu_entryhi(void) 36{ 37 return mfcr("cr<4, 15>"); 38} 39 40static inline void write_mmu_entryhi(int value) 41{ 42 mtcr("cr<4, 15>", value); 43} 44 45static inline unsigned long read_mmu_msa0(void) 46{ 47 return mfcr("cr<30, 15>"); 48} 49 50static inline void write_mmu_msa0(unsigned long value) 51{ 52 mtcr("cr<30, 15>", value); 53} 54 55static inline unsigned long read_mmu_msa1(void) 56{ 57 return mfcr("cr<31, 15>"); 58} 59 60static inline void write_mmu_msa1(unsigned long value) 61{ 62 mtcr("cr<31, 15>", value); 63} 64 65/* 66 * TLB operations. 67 */ 68static inline void tlb_probe(void) 69{ 70 mtcr("cr<8, 15>", 0x80000000); 71} 72 73static inline void tlb_read(void) 74{ 75 mtcr("cr<8, 15>", 0x40000000); 76} 77 78static inline void tlb_invalid_all(void) 79{ 80#ifdef CONFIG_CPU_HAS_TLBI 81 asm volatile("tlbi.alls\n":::"memory"); 82 sync_is(); 83#else 84 mtcr("cr<8, 15>", 0x04000000); 85#endif 86} 87 88static inline void local_tlb_invalid_all(void) 89{ 90#ifdef CONFIG_CPU_HAS_TLBI 91 asm volatile("tlbi.all\n":::"memory"); 92 sync_is(); 93#else 94 tlb_invalid_all(); 95#endif 96} 97 98static inline void tlb_invalid_indexed(void) 99{ 100 mtcr("cr<8, 15>", 0x02000000); 101} 102 103static inline void setup_pgd(unsigned long pgd, bool kernel) 104{ 105 if (kernel) 106 mtcr("cr<28, 15>", pgd | BIT(0)); 107 else 108 mtcr("cr<29, 15>", pgd | BIT(0)); 109} 110 111static inline unsigned long get_pgd(void) 112{ 113 return mfcr("cr<29, 15>") & ~BIT(0); 114} 115#endif /* __ASM_CSKY_CKMMUV2_H */ 116