| /* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ |
| /* |
| * Copyright (c) 2018 Microsemi Corporation |
| */ |
| |
| #ifndef __ASM_MACH_TLB_H |
| #define __ASM_MACH_TLB_H |
| |
| #include <asm/mipsregs.h> |
| #include <mach/common.h> |
| #include <linux/sizes.h> |
| |
| #define TLB_HI_MASK 0xffffe000 |
| #define TLB_LO_MASK 0x3fffffff /* Masks off Fill bits */ |
| #define TLB_LO_SHIFT 6 /* PFN Start bit */ |
| |
| #define PAGEMASK_SHIFT 13 |
| |
| #define MMU_PAGE_CACHED (3 << 3) /* C(5:3) Cache Coherency Attributes */ |
| #define MMU_PAGE_UNCACHED (2 << 3) /* C(5:3) Cache Coherency Attributes */ |
| #define MMU_PAGE_DIRTY BIT(2) /* = Writeable */ |
| #define MMU_PAGE_VALID BIT(1) |
| #define MMU_PAGE_GLOBAL BIT(0) |
| #define MMU_REGIO_RO_C (MMU_PAGE_CACHED | MMU_PAGE_VALID | MMU_PAGE_GLOBAL) |
| #define MMU_REGIO_RO (MMU_PAGE_UNCACHED | MMU_PAGE_VALID | MMU_PAGE_GLOBAL) |
| #define MMU_REGIO_RW (MMU_PAGE_DIRTY | MMU_REGIO_RO) |
| #define MMU_REGIO_INVAL (MMU_PAGE_GLOBAL) |
| |
| #define TLB_COUNT_MASK GENMASK(5, 0) |
| #define TLB_COUNT_OFF 25 |
| |
| static inline u32 get_tlb_count(void) |
| { |
| register u32 config1; |
| |
| config1 = read_c0_config1(); |
| config1 >>= TLB_COUNT_OFF; |
| config1 &= TLB_COUNT_MASK; |
| |
| return 1 + config1; |
| } |
| |
| static inline void create_tlb(int index, u32 offset, u32 size, u32 tlb_attrib1, |
| u32 tlb_attrib2) |
| { |
| register u32 tlb_mask, tlb_lo0, tlb_lo1; |
| |
| tlb_mask = ((size >> 12) - 1) << PAGEMASK_SHIFT; |
| tlb_lo0 = tlb_attrib1 | (offset >> TLB_LO_SHIFT); |
| tlb_lo1 = tlb_attrib2 | ((offset + size) >> TLB_LO_SHIFT); |
| |
| write_one_tlb(index, tlb_mask, offset & TLB_HI_MASK, |
| tlb_lo0 & TLB_LO_MASK, tlb_lo1 & TLB_LO_MASK); |
| } |
| #endif /* __ASM_MACH_TLB_H */ |