2021-07-14 00:44:10 +02:00
|
|
|
/*
|
|
|
|
* native E2K MMU structures & registers.
|
|
|
|
*
|
|
|
|
* Copyright 2014 Salavat S. Guiliazov (atic@mcst.ru)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _E2K_NATIVE_MMU_REGS_ACCESS_H_
|
|
|
|
#define _E2K_NATIVE_MMU_REGS_ACCESS_H_
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/irqflags.h>
|
|
|
|
#include <asm/e2k_api.h>
|
|
|
|
#include <asm/e2k.h>
|
|
|
|
#include <asm/debug_print.h>
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
|
|
|
|
#include <asm/mmu_regs_types.h>
|
|
|
|
#include <asm/mas.h>
|
|
|
|
#include <asm/native_dcache_regs_access.h>
|
|
|
|
|
|
|
|
|
|
|
|
#undef DEBUG_MR_MODE
|
|
|
|
#undef DebugMR
|
|
|
|
#define DEBUG_MR_MODE 0 /* MMU registers access */
|
|
|
|
#define DebugMR(...) DebugPrint(DEBUG_MR_MODE, ##__VA_ARGS__)
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write/read MMU register
|
|
|
|
*/
|
|
|
|
#define NATIVE_WRITE_MMU_REG(addr_val, reg_val) \
|
|
|
|
NATIVE_WRITE_MAS_D((addr_val), (reg_val), MAS_MMU_REG)
|
|
|
|
|
|
|
|
#define NATIVE_READ_MMU_REG(addr_val) \
|
|
|
|
NATIVE_READ_MAS_D((addr_val), MAS_MMU_REG)
|
|
|
|
#define NATIVE_WRITE_MMU_CR(mmu_cr) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_CR_NO), \
|
2022-01-17 12:36:48 +01:00
|
|
|
AW(mmu_cr))
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_MMU_TRAP_POINT(mmu_tc) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_TRAP_POINT_NO), \
|
|
|
|
mmu_reg_val(mmu_tc))
|
|
|
|
#define NATIVE_READ_MMU_TRAP_POINT() \
|
|
|
|
NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_TRAP_POINT_NO))
|
2021-07-14 00:45:56 +02:00
|
|
|
#define NATIVE_WRITE_MMU_US_CL_D(us_cl_d) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_US_CL_D_NO), \
|
|
|
|
mmu_reg_val(us_cl_d))
|
|
|
|
#define NATIVE_READ_MMU_US_CL_D() \
|
|
|
|
NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_US_CL_D_NO))
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_MMU_OS_PPTB_REG_VALUE(mmu_phys_ptb) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_PPTB_NO), \
|
|
|
|
mmu_reg_val(mmu_phys_ptb))
|
|
|
|
#define NATIVE_READ_MMU_OS_PPTB_REG_VALUE() \
|
|
|
|
NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_PPTB_NO))
|
|
|
|
#define NATIVE_WRITE_MMU_OS_VPTB_REG_VALUE(mmu_virt_ptb) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VPTB_NO), \
|
|
|
|
mmu_reg_val(mmu_virt_ptb))
|
|
|
|
#define NATIVE_READ_MMU_OS_VPTB_REG_VALUE() \
|
|
|
|
NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VPTB_NO))
|
|
|
|
#define NATIVE_WRITE_MMU_OS_VAB_REG_VALUE(kernel_offset) \
|
|
|
|
NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VAB_NO), \
|
|
|
|
mmu_reg_val(kernel_offset))
|
|
|
|
#define NATIVE_READ_MMU_OS_VAB_REG_VALUE() \
|
|
|
|
NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VAB_NO))
|
|
|
|
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_REG(addr_val, reg_val) \
|
|
|
|
NATIVE_WRITE_MMU_REG(addr_val, reg_val)
|
|
|
|
#define BOOT_NATIVE_READ_MMU_REG(addr_val) \
|
|
|
|
NATIVE_READ_MMU_REG(addr_val)
|
|
|
|
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_CR(mmu_cr) \
|
|
|
|
BOOT_NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_CR_NO), \
|
|
|
|
mmu_reg_val(mmu_cr))
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_TRAP_POINT(mmu_tc) \
|
|
|
|
BOOT_NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_TRAP_POINT_NO), \
|
|
|
|
mmu_reg_val(mmu_tc))
|
|
|
|
#define BOOT_NATIVE_READ_MMU_TRAP_POINT() \
|
|
|
|
BOOT_NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_TRAP_POINT_NO))
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_OS_PPTB_REG_VALUE(mmu_phys_ptb) \
|
|
|
|
BOOT_NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_PPTB_NO), \
|
|
|
|
mmu_reg_val(mmu_phys_ptb))
|
|
|
|
#define BOOT_NATIVE_READ_MMU_OS_PPTB_REG_VALUE() \
|
|
|
|
BOOT_NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_PPTB_NO))
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_OS_VPTB_REG_VALUE(mmu_virt_ptb) \
|
|
|
|
BOOT_NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VPTB_NO), \
|
|
|
|
mmu_reg_val(mmu_virt_ptb))
|
|
|
|
#define BOOT_NATIVE_READ_MMU_OS_VPTB_REG_VALUE() \
|
|
|
|
BOOT_NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VPTB_NO))
|
|
|
|
#define BOOT_NATIVE_WRITE_MMU_OS_VAB_REG_VALUE(kernel_offset) \
|
|
|
|
BOOT_NATIVE_WRITE_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VAB_NO), \
|
|
|
|
mmu_reg_val(kernel_offset))
|
|
|
|
#define BOOT_NATIVE_READ_MMU_OS_VAB_REG_VALUE() \
|
|
|
|
BOOT_NATIVE_READ_MMU_REG( \
|
|
|
|
_MMU_REG_NO_TO_MMU_ADDR_VAL(_MMU_OS_VAB_NO))
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Write/read Data TLB register
|
|
|
|
*/
|
|
|
|
#define NATIVE_WRITE_DTLB_REG(tlb_addr, tlb_value) \
|
|
|
|
NATIVE_WRITE_MAS_D((tlb_addr), (tlb_value), MAS_DTLB_REG)
|
|
|
|
|
|
|
|
#define NATIVE_READ_DTLB_REG(tlb_addr) \
|
|
|
|
NATIVE_READ_MAS_D((tlb_addr), MAS_DTLB_REG)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush TLB page/entry
|
|
|
|
*/
|
|
|
|
#define NATIVE_FLUSH_TLB_ENTRY(flush_op, addr) \
|
|
|
|
NATIVE_WRITE_MAS_D((flush_op), (addr), MAS_TLB_PAGE_FLUSH)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush ICACHE line
|
|
|
|
*/
|
|
|
|
#define NATIVE_FLUSH_ICACHE_LINE(flush_op, addr) \
|
|
|
|
NATIVE_WRITE_MAS_D((flush_op), (addr), MAS_ICACHE_LINE_FLUSH)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush and invalidate or write back CACHE(s) (invalidate all caches
|
|
|
|
* of the processor)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NATIVE_FLUSH_CACHE_L12(flush_op) \
|
|
|
|
NATIVE_WRITE_MAS_D((flush_op), (0), MAS_CACHE_FLUSH)
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
native_write_back_CACHE_L12(void)
|
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
DebugMR("Flush : Write back all CACHEs (op 0x%lx)\n",
|
2021-11-14 16:13:25 +01:00
|
|
|
flush_op_write_back_cache_L12);
|
2021-07-14 00:44:10 +02:00
|
|
|
raw_all_irq_save(flags);
|
|
|
|
E2K_WAIT_MA;
|
2021-11-14 16:13:25 +01:00
|
|
|
NATIVE_FLUSH_CACHE_L12(flush_op_write_back_cache_L12);
|
2021-07-14 00:44:10 +02:00
|
|
|
E2K_WAIT_FLUSH;
|
|
|
|
raw_all_irq_restore(flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush TLB (invalidate all TLBs of the processor)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NATIVE_FLUSH_TLB_ALL(flush_op) \
|
|
|
|
NATIVE_WRITE_MAS_D((flush_op), (0), MAS_TLB_FLUSH)
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
native_flush_TLB_all(void)
|
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
|
2021-11-14 16:13:25 +01:00
|
|
|
DebugMR("Flush all TLBs (op 0x%lx)\n", flush_op_tlb_all);
|
2021-07-14 00:44:10 +02:00
|
|
|
raw_all_irq_save(flags);
|
|
|
|
E2K_WAIT_ST;
|
2021-11-14 16:13:25 +01:00
|
|
|
NATIVE_FLUSH_TLB_ALL(flush_op_tlb_all);
|
2021-07-14 00:44:10 +02:00
|
|
|
E2K_WAIT(_fl_c | _ma_c);
|
|
|
|
raw_all_irq_restore(flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Flush ICACHE (invalidate instruction caches of the processor)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define NATIVE_FLUSH_ICACHE_ALL(flush_op) \
|
|
|
|
NATIVE_WRITE_MAS_D((flush_op), (0), MAS_ICACHE_FLUSH)
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
native_flush_ICACHE_all(void)
|
|
|
|
{
|
2021-11-14 16:13:25 +01:00
|
|
|
DebugMR("Flush all ICACHE op 0x%lx\n", flush_op_icache_all);
|
2021-07-14 00:44:10 +02:00
|
|
|
E2K_WAIT_ST;
|
2021-11-14 16:13:25 +01:00
|
|
|
NATIVE_FLUSH_ICACHE_ALL(flush_op_icache_all);
|
2021-07-14 00:44:10 +02:00
|
|
|
E2K_WAIT_FLUSH;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Get Entry probe for virtual address
|
|
|
|
*/
|
|
|
|
#define NATIVE_ENTRY_PROBE_MMU_OP(addr_val) \
|
|
|
|
NATIVE_READ_MAS_D((addr_val), MAS_ENTRY_PROBE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Get physical address for virtual address
|
|
|
|
*/
|
|
|
|
#define NATIVE_ADDRESS_PROBE_MMU_OP(addr_val) \
|
|
|
|
NATIVE_READ_MAS_D((addr_val), MAS_VA_PROBE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Read CLW register
|
|
|
|
*/
|
|
|
|
#define NATIVE_READ_CLW_REG(clw_addr) \
|
|
|
|
NATIVE_READ_MAS_D_5((clw_addr), MAS_CLW_REG)
|
|
|
|
|
2021-07-14 00:45:56 +02:00
|
|
|
/*
|
|
|
|
* Write CLW register
|
|
|
|
*/
|
|
|
|
#define NATIVE_WRITE_CLW_REG(clw_addr, val) \
|
|
|
|
NATIVE_WRITE_MAS_D((clw_addr), (val), MAS_CLW_REG)
|
|
|
|
|
2021-07-14 00:44:10 +02:00
|
|
|
/*
|
|
|
|
* native MMU DEBUG registers access
|
|
|
|
*/
|
|
|
|
#define NATIVE_READ_DDBAR0_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbar0)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDBAR1_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbar1)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDBAR2_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbar2)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDBAR3_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbar3)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDBCR_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbcr)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDBSR_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddbsr)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDMAR0_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddmar0)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDMAR1_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddmar1)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_READ_DDMCR_REG_VALUE() \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_GET_MMUREG(ddmcr)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBAR0_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbar0, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBAR1_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbar1, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBAR2_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbar2, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBAR3_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbar3, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBCR_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbcr, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDBSR_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddbsr, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDMAR0_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddmar0, value)
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDMAR1_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG(ddmar1, value)
|
|
|
|
/* 4 cycles delay guarantess that all counting
|
|
|
|
* is stopped and %ddbsr is updated accordingly. */
|
2021-07-14 00:44:10 +02:00
|
|
|
#define NATIVE_WRITE_DDMCR_REG_VALUE(value) \
|
2021-07-14 00:51:52 +02:00
|
|
|
NATIVE_SET_MMUREG_CLOSED(ddmcr, value, 3)
|
2021-07-14 00:44:10 +02:00
|
|
|
|
|
|
|
#define NATIVE_READ_DDBAR0_REG() \
|
|
|
|
NATIVE_READ_DDBAR0_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDBAR1_REG() \
|
|
|
|
NATIVE_READ_DDBAR1_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDBAR2_REG() \
|
|
|
|
NATIVE_READ_DDBAR2_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDBAR3_REG() \
|
|
|
|
NATIVE_READ_DDBAR3_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDBCR_REG() \
|
|
|
|
({ \
|
|
|
|
e2k_ddbcr_t ddbcr; \
|
|
|
|
\
|
|
|
|
ddbcr.DDBCR_reg = NATIVE_READ_DDBCR_REG_VALUE(); \
|
|
|
|
ddbcr; \
|
|
|
|
})
|
|
|
|
#define NATIVE_READ_DDBSR_REG() \
|
|
|
|
({ \
|
|
|
|
e2k_ddbsr_t ddbsr; \
|
|
|
|
\
|
|
|
|
ddbsr.DDBSR_reg = NATIVE_READ_DDBSR_REG_VALUE(); \
|
|
|
|
ddbsr; \
|
|
|
|
})
|
|
|
|
#define NATIVE_READ_DDMAR0_REG() \
|
|
|
|
NATIVE_READ_DDMAR0_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDMAR1_REG() \
|
|
|
|
NATIVE_READ_DDMAR1_REG_VALUE()
|
|
|
|
#define NATIVE_READ_DDMCR_REG() \
|
|
|
|
({ \
|
|
|
|
e2k_ddmcr_t ddmcr; \
|
|
|
|
\
|
|
|
|
ddmcr.DDMCR_reg = NATIVE_READ_DDMCR_REG_VALUE(); \
|
|
|
|
ddmcr; \
|
|
|
|
})
|
|
|
|
#define NATIVE_WRITE_DDBAR0_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBAR0_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDBAR1_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBAR1_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDBAR2_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBAR2_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDBAR3_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBAR3_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDBCR_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBCR_REG_VALUE(value.DDBCR_reg)
|
|
|
|
#define NATIVE_WRITE_DDBSR_REG(value) \
|
|
|
|
NATIVE_WRITE_DDBSR_REG_VALUE(value.DDBSR_reg)
|
|
|
|
#define NATIVE_WRITE_DDMAR0_REG(value) \
|
|
|
|
NATIVE_WRITE_DDMAR0_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDMAR1_REG(value) \
|
|
|
|
NATIVE_WRITE_DDMAR1_REG_VALUE(value)
|
|
|
|
#define NATIVE_WRITE_DDMCR_REG(value) \
|
|
|
|
NATIVE_WRITE_DDMCR_REG_VALUE(value.DDMCR_reg)
|
|
|
|
|
|
|
|
#endif /* ! __ASSEMBLY__ */
|
|
|
|
|
|
|
|
#endif /* _E2K_NATIVE_MMU_REGS_ACCESS_H_ */
|