/* * asm-e2k/mmu_regs.h: E2K MMU structures & registers. * * Copyright 2001 Salavat S. Guiliazov (atic@mcst.ru) */ #ifndef _E2K_MMU_REGS_TYPES_H_ #define _E2K_MMU_REGS_TYPES_H_ #include /* * MMU registers structures */ /* MMU address to access to MMU internal registers */ #ifndef __ASSEMBLY__ typedef e2k_addr_t mmu_addr_t; #define mmu_addr_val(mmu_addr) (mmu_addr) #define __mmu_addr(mmu_addr_val) (mmu_addr_val) #endif /* __ASSEMBLY__ */ #define _MMU_ADDR_REG_NO_SHIFT 4 /* [ 9: 4] */ #define _MMU_ADDR_REG_NO 0x0000000000000ff0 /* # of register */ #define _MMU_CR_NO 0x00 /* Control register */ #define _MMU_CONT_NO 0x01 /* Context register */ #define _MMU_PID_NO _MMU_CONT_NO /* renamed name of CONT */ #define _MMU_CR3_RG_NO 0x02 /* CR3 register for secondary space */ #define _MMU_U2_PPTB_NO _MMU_CR3_RG_NO /* renamed name of CR3 */ #define _MMU_ELB_PTB_NO 0x03 /* ELBRUS page table virtual base */ #define _MMU_U_VPTB_NO _MMU_ELB_PTB_NO /* renamed name of ELB_PTB */ #define _MMU_ROOT_PTB_NO 0x04 /* Root Page Table Base register */ #define _MMU_U_PPTB_NO _MMU_ROOT_PTB_NO /* renamed name of ROOT_PTB */ #define _MMU_TRAP_POINT_NO 0x05 /* Trap Pointer register */ #define _MMU_TRAP_COUNT_NO 0x06 /* Trap Counter register */ #define _MMU_MPT_B_NO 0x07 /* Phys Protection Table Base */ /* register for secondary space */ #define _MMU_PCI_L_B_NO 0x08 /* PCI Low Bound register */ /* for secondary space */ #define _MMU_US_CL_D_NO 0x09 /* User Stack Clearing Disable */ /* register */ #define _MMU_PH_H_B_NO 0x0a /* Low Phys memory High Bound */ /* for secondary space */ #define _MMU_USED_4KB_DTLB_NO 0x0b /* ??? */ #define _MMU_USED_DTLB_MPT_DW_NO 0x0c /* ??? */ #define _MMU_APIC_BASE_NO 0x0d /* local APIC/EPIC registers base */ #define _MMU_HW0_NO 0x0e /* MMU hardware register #0 */ #define _MMU_PID2_NO 0x0f /* secondary process ID */ #define _MMU_MTRR_START_NO 0x10 /* Memory Type Range Register */ /* (first register) */ /* for secondary space */ #define _MMU_MTRR_PAIRS_END_NO 0x1f /* Memory Type Range Register */ /* (mtrr15 - last pairs register) */ /* for secondary space */ #define _MMU_MTRR_END_NO 0x30 /* Memory Type Range Register */ /* (last register) */ /* for secondary space */ #define _MMU_PAT_NO 0x31 /* page attribute table */ #define _MMU_PH_HI_L_B_NO 0x32 /* High Phys memory Low Bound */ /* for secondary space */ #define _MMU_PH_HI_H_B_NO 0x33 /* High Phys memory High Bound */ /* for secondary space */ #define _MMU_OS_VPTB_NO 0x34 /* virtual base of kernel PTs */ #define _MMU_OS_PPTB_NO 0x35 /* physical base of kernel PTs */ #define _MMU_PDPTE0_NO 0x38 /* pud[0] 3-th level PT entry #0 */ #define _MMU_PDPTE1_NO 0x39 /* pud[1] 3-th level PT entry #1 */ #define _MMU_PDPTE2_NO 0x3a /* pud[2] 3-th level PT entry #2 */ #define _MMU_PDPTE3_NO 0x3b /* pud[3] 3-th level PT entry #3 */ #define _MMU_TLU_CACHE_NO 0x3c /* TLU cache ??? */ #define _MMU_OS_VAB_NO 0x4c /* kernel virtual space base */ /* PAGE_OFFSET */ #define MMU_REGS_NUM (_MMU_MTRR_END_NO + 1) #define MTRR_LAST_DEFAULT 0x806 /* Default value of last MTRR */ #define _MMU_REG_NO_TO_MMU_ADDR_VAL(reg_no) \ (((reg_no) << _MMU_ADDR_REG_NO_SHIFT) & _MMU_ADDR_REG_NO) #define MMU_REG_NO_TO_MMU_ADDR(reg_no) \ __mmu_addr(_MMU_REG_NO_TO_MMU_ADDR_VAL(reg_no)) #define MMU_REG_NO_FROM_MMU_ADDR(mmu_addr) \ ((mmu_addr_val(mmu_addr) & _MMU_ADDR_REG_NO) >> \ _MMU_ADDR_REG_NO_SHIFT) #define MMU_ADDR_CR MMU_REG_NO_TO_MMU_ADDR(_MMU_CR_NO) #define MMU_ADDR_CONT MMU_REG_NO_TO_MMU_ADDR(_MMU_CONT_NO) #define MMU_ADDR_PID MMU_ADDR_CONT /* renamed name */ #define MMU_ADDR_CR3_RG MMU_REG_NO_TO_MMU_ADDR(_MMU_CR3_RG_NO) #define MMU_ADDR_U2_PGTB MMU_ADDR_CR3_RG /* renamed name */ #define MMU_ADDR_ELB_PTB MMU_REG_NO_TO_MMU_ADDR(_MMU_ELB_PTB_NO) #define MMU_ADDR_U_VPTB MMU_ADDR_ELB_PTB /* rename name */ #define MMU_ADDR_ROOT_PTB MMU_REG_NO_TO_MMU_ADDR(_MMU_ROOT_PTB_NO) #define MMU_ADDR_U_PPTB MMU_ADDR_ROOT_PTB /* rename name */ #define MMU_ADDR_TRAP_POINT MMU_REG_NO_TO_MMU_ADDR(_MMU_TRAP_POINT_NO) #define MMU_ADDR_TRAP_COUNT MMU_REG_NO_TO_MMU_ADDR(_MMU_TRAP_COUNT_NO) #define MMU_ADDR_MPT_B MMU_REG_NO_TO_MMU_ADDR(_MMU_MPT_B_NO) #define MMU_ADDR_PCI_L_B MMU_REG_NO_TO_MMU_ADDR(_MMU_PCI_L_B_NO) #define MMU_ADDR_US_CL_D MMU_REG_NO_TO_MMU_ADDR(_MMU_US_CL_D_NO) #define MMU_ADDR_PH_H_B MMU_REG_NO_TO_MMU_ADDR(_MMU_PH_H_B_NO) #define MMU_ADDR_WATCH_POINT MMU_REG_NO_TO_MMU_ADDR(_MMU_WATCH_POINT_NO) #define MMU_ADDR_MTRR_START MMU_REG_NO_TO_MMU_ADDR(_MMU_MTRR_START_NO) #define MMU_ADDR_MTRR_END MMU_REG_NO_TO_MMU_ADDR(_MMU_MTRR_END_NO) #define MMU_ADDR_MTRR(no) MMU_REG_NO_TO_MMU_ADDR(no) #define MMU_ADDR_OS_VPTB MMU_REG_NO_TO_MMU_ADDR(_MMU_OS_VPTB_NO) #define MMU_ADDR_OS_PPTB MMU_REG_NO_TO_MMU_ADDR(_MMU_OS_PPTB_NO) #define MMU_ADDR_SH_OS_VPTB MMU_REG_NO_TO_MMU_ADDR(_MMU_SH_OS_VPTB_NO) #define MMU_ADDR_SH_OS_PPTB MMU_REG_NO_TO_MMU_ADDR(_MMU_SH_OS_PPTB_NO) #define MMU_ADDR_OS_VAB MMU_REG_NO_TO_MMU_ADDR(_MMU_OS_VAB_NO) /* MMU internel register contents */ #ifndef __ASSEMBLY__ typedef unsigned long long mmu_reg_t; #define mmu_reg_val(mmu_reg) (mmu_reg) #define __mmu_reg(mmu_reg_val) (mmu_reg_val) #endif /* __ASSEMBLY__ */ /* Size of trap_cellar */ /* while bug for size of env for setjmp use TC_INTO_PT_REGS == 0 */ #define MAX_TC_SIZE 10 /* * MMU Control Register MMU_CR */ #define _MMU_CR_CD_SHIFT 1 #define _MMU_CR_IPD_SHIFT 11 #define _MMU_CR_TLB_EN 0x0000000000000001 /* translation enable */ #define _MMU_CR_CD_MASK 0x0000000000000006 /* cache disable bits */ #define _MMU_CR_SET1 0x0000000000000008 /* set #1 enable for */ /* 4 MB pages */ #define _MMU_CR_SET2 0x0000000000000010 /* set #2 enable for */ /* 4 MB pages */ #define _MMU_CR_SET3 0x0000000000000020 /* set #3 enable for */ /* 4 MB pages */ #define _MMU_CR_CR0_PG 0x0000000000000040 /* paging enable for */ /* second space INTEL */ #define _MMU_CR_CR4_PSE 0x0000000000000080 /* page size 4Mb */ /* enable for second */ /* space INTEL */ #define _MMU_CR_CR0_CD 0x0000000000000100 /* cache disable for */ /* secondary space */ /* INTEL */ #define _MMU_CR_TLU2_EN 0x0000000000000200 /* TLU enable for */ /* secondary space */ /* INTEL */ #define _MMU_CR_LD_MPT 0x0000000000000400 /* memory protection */ /* table enable for */ /* LD from secondary */ /* space INTEL */ #define _MMU_CR_IPD_MASK 0x0000000000000800 /* Instruction */ /* Prefetch Depth */ #define _MMU_CR_UPT_EN 0x0000000000001000 /* enable UPT */ #define _MMU_CR_SNXE 0x0000000000008000 /* enable SNXE */ #define _MMU_CR_CD_VAL(x) (((x) << _MMU_CR_CD_SHIFT) & _MMU_CR_CD_MASK) #define _MMU_CD_EN _MMU_CR_CD_VAL(0UL) /* all caches enabled */ #define _MMU_CD_D1_DIS _MMU_CR_CD_VAL(1UL) /* DCACHE1 disabled */ #define _MMU_CD_D_DIS _MMU_CR_CD_VAL(2UL) /* DCACHE1, DCACHE2 disabled */ #define _MMU_CD_DIS _MMU_CR_CD_VAL(3UL) /* DCACHE1, DCACHE2, ECACHE */ /* disabled */ #define _MMU_CR_IPD_VAL(x) (((x) << _MMU_CR_IPD_SHIFT) & _MMU_CR_IPD_MASK) #define _MMU_IPD_DIS _MMU_CR_IPD_VAL(0UL) /* none prefetch */ #define _MMU_IPD_2_LINE _MMU_CR_IPD_VAL(1UL) /* 2 line of ICACHE prefetch */ #ifdef CONFIG_IPD_DISABLE #define KERNEL_MMU_IPD _MMU_IPD_DIS /* none prefetch */ #else #define KERNEL_MMU_IPD _MMU_IPD_2_LINE /* 2 line of ICACHE prefetch */ #endif /* CONFIG_IPD_DISABLE */ #ifndef CONFIG_SECONDARY_SPACE_SUPPORT #define _MMU_CR_SEC_SPACE_EN #define _MMU_CR_SEC_SPACE_DIS #else /* CONFIG_SECONDARY_SPACE_SUPPORT */ #define _MMU_CR_SEC_SPACE_EN (_MMU_CR_CR0_PG | _MMU_CR_TLU2_EN) #define _MMU_CR_SEC_SPACE_DIS (_MMU_CR_CR0_CD) #endif /* ! CONFIG_SECONDARY_SPACE_SUPPORT */ #define __MMU_CR_KERNEL (_MMU_CR_TLB_EN | _MMU_CD_EN | KERNEL_MMU_IPD) #define __MMU_CR_KERNEL_OFF (_MMU_CD_DIS | _MMU_IPD_DIS) #ifdef CONFIG_HUGETLB_PAGE # define _MMU_CR_KERNEL (__MMU_CR_KERNEL | _MMU_CR_SET3) #else # define _MMU_CR_KERNEL (boot_cpu_has(CPU_HWBUG_LARGE_PAGES) ? \ (__MMU_CR_KERNEL) : (__MMU_CR_KERNEL | _MMU_CR_SET3)) #endif /* CONFIG_HUGETLB_PAGE */ #define MMU_CR_KERNEL __mmu_reg(_MMU_CR_KERNEL) #define MMU_CR_KERNEL_OFF __mmu_reg(__MMU_CR_KERNEL_OFF) #define mmu_cr_set_tlb_enable(mmu_reg) \ (mmu_reg_val(mmu_reg) | _MMU_CR_TLB_EN) #define mmu_cr_set_vaddr_enable(mmu_reg) \ (mmu_reg_val(mmu_reg) | _MMU_CR_TLB_EN) #define mmu_cr_reset_tlb_enable(mmu_reg) \ (mmu_reg_val(mmu_reg) & ~(_MMU_CR_TLB_EN)) #define mmu_cr_reset_vaddr_enable(mmu_reg) \ (mmu_reg_val(mmu_reg) & ~(_MMU_CR_TLB_EN)) # define mmu_cr_set_large_pages(mmu_reg) \ (mmu_reg_val(mmu_reg) | _MMU_CR_SET3) # define mmu_cr_reset_large_pages(mmu_reg) \ (mmu_reg_val(mmu_reg) & ~_MMU_CR_SET3) /* * MMU Process ID Register MMU_PID (renamed name from MMU_CONT) */ #define _MMU_CONTEXT 0x0000000000000fff #define _MMU_CONTEXT_SIZE (_MMU_CONTEXT + 1) #define MMU_PID_SIZE _MMU_CONTEXT_SIZE /* * Kernel virtual memory context */ #define E2K_KERNEL_CONTEXT 0x000 #define E2K_KERNEL_PID E2K_KERNEL_CONTEXT /* renamed name */ #define MMU_CONTEXT(context) __mmu_reg(context) #define MMU_KERNEL_CONTEXT MMU_CONTEXT(E2K_KERNEL_CONTEXT) #define MMU_PID(pid) MMU_CONTEXT(pid) /* renamed name */ #define MMU_KERNEL_PID MMU_KERNEL_CONTEXT /* renamed name */ /* * MMU Control Register of secondary space table MMU_CR3_RG * The physical address of the INTEL page directory base, * aligned to table size */ #define _MMU_CR3_PAGE_DIR 0x0000000fffff000UL #define _MMU_CR3_PCD 0x000000000000010UL #define _MMU_CR3_PWT 0x000000000000008UL #define MMU_CR3_KERNEL(page_dir) \ (((e2k_addr_t)(page_dir)) & _MMU_CR3_PAGE_DIR) /* * MMU Page Table virtual Base Registers MMU_OS_VPTB & MMU_U_VPTB * (renamed MMU_ELB_PTB) * The virtual address of the page table beginning, aligned to table size */ /* OS page table virtual base for separate virtual spaces */ #define _MMU_VPTB_MASK (PGDIR_MASK & E2K_VA_PAGE_MASK) #define MMU_ADDR_TO_VPTB(virt_addr) \ __mmu_reg((virt_addr) & _MMU_VPTB_MASK) /* Separate Page Tables virtual bases */ #define MMU_SEPARATE_KERNEL_VPTB MMU_ADDR_TO_VPTB(KERNEL_VPTB_BASE_ADDR) #define MMU_SEPARATE_USER_VPTB MMU_ADDR_TO_VPTB(USER_VPTB_BASE_ADDR) /* United Page Tables virtual base */ #define MMU_UNITED_KERNEL_VPTB MMU_ADDR_TO_VPTB(KERNEL_VPTB_BASE_ADDR) #define MMU_UNITED_USER_VPTB MMU_UNITED_KERNEL_VPTB /* * MMU Root Page Table physical Bases register MMU_OS_PPTB & MMU_U_PPTB * (renamed MMU_ROOT_PTB) * The physical address of the root elbrus page table beginning, * aligned to table size */ #define _MMU_PPTB_MASK (MAX_PA_MASK & PAGE_MASK) #define MMU_ADDR_TO_PPTB(phys_addr) __mmu_reg((phys_addr) & _MMU_PPTB_MASK) #define MMU_KERNEL_PPTB MMU_ADDR_TO_PPTB(KERNEL_PPTB_BASE_ADDR) /* Separate Page Tables physical bases */ #define MMU_SEPARATE_KERNEL_PPTB MMU_KERNEL_PPTB #define MMU_SEPARATE_USER_PPTB(phys_addr) MMU_ADDR_TO_PPTB(phys_addr) /* United Page Tables virtual base */ #define MMU_UNITED_KERNEL_PPTB MMU_KERNEL_PPTB #define MMU_UNITED_USER_PPTB(phys_addr) MMU_ADDR_TO_PPTB(phys_addr) /* * MMU Base address of virtual space of kernel MMU_OS_VAB * The virtual address of the kernel space should be aligned to 2**44 */ #define _MMU_VAB_MASK 0x0000f00000000000 #define MMU_ADDR_TO_VAB(virt_addr) __mmu_reg((virt_addr) & _MMU_VAB_MASK) #define MMU_SEPARATE_KERNEL_VAB MMU_ADDR_TO_VAB(PAGE_OFFSET) /* * MMU Trap Pointer register MMU_TRAP_POINT * The physical address of the beginning of an area, where the attributes * of nonexecuted requests to memory are stored in case of the exception * arising on it ("cellar") */ #define MMU_ALIGN_TRAP_POINT_BASE_V2 9 #define MMU_ALIGN_TRAP_POINT_BASE_MASK_V2 \ ((1UL << MMU_ALIGN_TRAP_POINT_BASE_V2) - 1) #define MMU_TRAP_POINT_MASK_V2 ~MMU_ALIGN_TRAP_POINT_BASE_MASK_V2 #define MMU_TRAP_CELLAR_MAX_SIZE_V2 64 /* double-words */ #define MMU_ALIGN_TRAP_POINT_BASE 10 #define MMU_ALIGN_TRAP_POINT_BASE_MASK ((1UL << MMU_ALIGN_TRAP_POINT_BASE) - 1) #define MMU_TRAP_POINT_MASK ~MMU_ALIGN_TRAP_POINT_BASE_MASK #define MMU_TRAP_CELLAR_MAX_SIZE \ ((TC_EXT_OFFSET + 7)/8 + 64) /* double-words */ #define _MMU_TRAP_POINT(phys_addr) ((phys_addr) & MMU_TRAP_POINT_MASK) #define MMU_TRAP_POINT(phys_addr) __mmu_reg(_MMU_TRAP_POINT(phys_addr)) #define MMU_KERNEL_TRAP_POINT MMU_TRAP_POINT(KERNEL_TRAP_CELLAR) /* * MMU Trap Counter register MMU_TRAP_COUNT * Number of double-words in the "cellar" of the trap */ #define _MMU_TRAP_COUNT_MASK 0x000000000000002f #define _MMU_TRAP_COUNT(counter) (counter & _MMU_TRAP_COUNT_MASK) #define MMU_TRAP_COUNT(counter) __mmu_reg(_MMU_TRAP_COUNT(counter)) #define MMU_TRAP_COUNT_GET(mmu_reg) _MMU_TRAP_COUNT(mmu_reg_val(mmu_reg)) #define mmu_trap_count_get(mmu_reg) MMU_TRAP_COUNT_GET(mmu_reg) /* * MMU PCI Low Bound MMU_PCI_L_B * Fix the boundary between PCIand main memory addresses * for Intel accesses */ #define _MMU_PCI_L_B 0x00000000ffc00000UL #define _MMU_PCI_L_B_ALIGN_MASK 0x00000000003fffffUL /* * MMU Phys High Bound MMU_PH_H_B * Fix the high boundary Intel physical memory * for Intel accesses */ #define _MMU_PH_H_B 0x00000000ffc00000UL #define _MMU_PH_H_B_ALIGN_MASK 0x00000000003fffffUL /* * CACHEs (DCACHE & ICACHE) structure */ #define E2K_DCACHE_L1_LINES_BITS_NUM 9 #define E2K_DCACHE_L1_LINES_NUM (1 << E2K_DCACHE_L1_LINES_BITS_NUM) #define E2K_DCACHE_L1_SETS_BITS_NUM 2 #define E2K_DCACHE_L1_SETS_NUM (1 << E2K_DCACHE_L1_SETS_BITS_NUM) #define E2K_DCACHE_L2_LINES_BITS_NUM 10 #define E2K_DCACHE_L2_LINES_NUM (1 << E2K_DCACHE_L2_LINES_BITS_NUM) #define E2K_DCACHE_L2_SETS_BITS_NUM 2 #define E2K_DCACHE_L2_SETS_NUM (1 << E2K_DCACHE_L2_SETS_BITS_NUM) #define E2K_ICACHE_SETS_NUM 4 #define E2K_ICACHE_SET_SIZE 256 #define E2K_ICACHE_SET_MASK (E2K_ICACHE_SET_SIZE - 1) #define E2K_ICACHE_LINES_NUM 64 /* * CACHEs (DCACHE & ICACHE) registers operations */ /* CACHEs (DCACHE & ICACHE) registers access operations address */ #ifndef __ASSEMBLY__ typedef e2k_addr_t dcache_addr_t; typedef dcache_addr_t dcache_l1_addr_t; typedef dcache_addr_t dcache_l2_addr_t; #endif /* ! __ASSEMBLY__ */ #define dcache_addr_val(dcache_addr) (dcache_addr) #define dcache_l1_addr_val(dcache_l1_addr) dcache_addr_val(dcache_l1_addr) #define dcache_l2_addr_val(dcache_l2_addr) dcache_addr_val(dcache_l2_addr) #define __dcache_addr(dcache_addr_val) (dcache_addr_val) #define __dcache_l1_addr(dcache_l1_addr_val) __dcache_addr(dcache_l1_addr_val) #define __dcache_l2_addr(dcache_l2_addr_val) __dcache_addr(dcache_l2_addr_val) #define _E2K_DCACHE_L1_SET 0x00000000C0000000 #define _E2K_DCACHE_L1_TYPE 0x0000000020000000 #define _E2K_DCACHE_L1_LINE 0x0000000000003FE0 #define _E2K_DCACHE_L1_WORD 0x0000000000000018 #define _E2K_DCACHE_L1_SET_SHIFT 30 #define _E2K_DCACHE_L1_TYPE_SHIFT 29 #define _E2K_DCACHE_L1_LINE_SHIFT 5 #define _E2K_DCACHE_L1_WORD_SHIFT 3 #define DCACHE_L1_VADDR_TO_ADDR(virt_addr) \ ((virt_addr) & _E2K_DCACHE_L1_LINE) #define dcache_l1_set_set(addr, set) \ (__dcache_l1_addr( \ (dcache_l1_addr_val(addr) & ~_E2K_DCACHE_L1_SET) | \ ((set) << _E2K_DCACHE_L1_SET_SHIFT) & \ _E2K_DCACHE_L1_SET)) #define dcache_l1_get_set(addr) \ (dcache_l1_addr_val(addr) & _E2K_DCACHE_L1_SET) #define dcache_l1_set_type(addr, type) \ (__dcache_l1_addr( \ (dcache_l1_addr_val(addr) & ~_E2K_DCACHE_L1_TYPE) | \ ((type) << _E2K_DCACHE_L1_TYPE_SHIFT) & \ _E2K_DCACHE_L1_TYPE)) #define dcache_l1_get_type(addr) \ (dcache_l1_addr_val(addr) & _E2K_DCACHE_L1_TYPE) #define dcache_l1_set_line(addr, line) \ (__dcache_l1_addr( \ (dcache_l1_addr_val(addr) & ~_E2K_DCACHE_L1_LINE) | \ ((line) << _E2K_DCACHE_L1_LINE_SHIFT) & \ _E2K_DCACHE_L1_LINE)) #define dcache_l1_get_line(addr) \ (dcache_l1_addr_val(addr) & _E2K_DCACHE_L1_LINE) #define dcache_l1_set_word(addr, word) \ (__dcache_l1_addr( \ (dcache_l1_addr_val(addr) & ~_E2K_DCACHE_L1_WORD) | \ ((word) << _E2K_DCACHE_L1_WORD_SHIFT) & \ _E2K_DCACHE_L1_WORD)) #define dcache_l1_get_word(addr) \ (dcache_l1_addr_val(addr) & _E2K_DCACHE_L1_WORD) #define mk_dcache_l1_addr(virt_addr, set, type, word) \ ({ \ dcache_l1_addr_t addr; \ addr = __dcache_l1_addr(DCACHE_L1_VADDR_TO_ADDR(virt_addr)); \ addr = dcache_l1_set_set(addr, set); \ addr = dcache_l1_set_type(addr, type); \ addr = dcache_l1_set_word(addr, word); \ addr; \ }) #define _E2K_DCACHE_L2_TYPE 0x0000000030000000 #define _E2K_DCACHE_L2_DATA_TYPE 0x0 #define _E2K_DCACHE_L2_REGS_TYPE 0x1 #define _E2K_DCACHE_L2_TAG_TYPE 0x2 #define _E2K_DCACHE_L2_REGS_TYPE2 0x3 #define _E2K_DCACHE_L2_LINE 0x000000000007ffc0 #define _E2K_DCACHE_L2_REG_NUM 0x000000000000ff00 #define _E2K_DCACHE_L2_BIST_SIG1_REG 0x00 #define _E2K_DCACHE_L2_BIST_SIG2_REG 0x01 #define _E2K_DCACHE_L2_BISR_CTRL_REG 0x02 #define _E2K_DCACHE_L2_CTRL_REG 0x03 #define _E2K_DCACHE_L2_ECC_DBG_REG 0x04 #define _E2K_DCACHE_L2_ERR_REG 0x05 #define _E2K_DCACHE_L2_CNT_ERR1_REG 0x06 #define _E2K_DCACHE_L2_CNT_ERR2_REG 0x07 #define _E2K_DCACHE_L2_CTRL_EXT_REG 0x08 #define _E2K_DCACHE_L2_BANK_NUM 0x00000000000000c0 #define _E2K_DCACHE_L2_WORD 0x0000000000000038 #define _E2K_DCACHE_L2_TYPE_SHIFT 28 #define _E2K_DCACHE_L2_LINE_SHIFT 6 #define _E2K_DCACHE_L2_REG_NUM_SHIFT 8 #define _E2K_DCACHE_L2_BANK_NUM_SHIFT 6 #define _E2K_DCACHE_L2_WORD_SHIFT 3 #define E2K_L2_BANK_NUM 4 #define E2K_L2_CNTR_EN_CORR 0x0000000000000001 #define E2K_L2_CNTR_EN_DET 0x0000000000000002 #define E2K_L2_CNTR_EN_CINT 0x0000000000000004 #define DCACHE_L2_PADDR_TO_ADDR(phys_addr) \ ((virt_addr) & _E2K_DCACHE_L2_LINE) #define dcache_l2_set_type(addr, type) \ (__dcache_l2_addr( \ (dcache_l2_addr_val(addr) & ~_E2K_DCACHE_L2_TYPE) | \ ((type) << _E2K_DCACHE_L2_TYPE_SHIFT) & \ _E2K_DCACHE_L2_TYPE)) #define dcache_l2_get_type(addr) \ (dcache_l2_addr_val(addr) & _E2K_DCACHE_L2_TYPE) #define dcache_l2_set_line(addr, line) \ (__dcache_l2_addr( \ (dcache_l2_addr_val(addr) & ~_E2K_DCACHE_L2_LINE) | \ ((index) << _E2K_DCACHE_L2_LINE_SHIFT) & \ _E2K_DCACHE_L2_LINE)) #define dcache_l2_get_line(addr) \ (dcache_l2_addr_val(addr) & _E2K_DCACHE_L2_LINE) #define dcache_l2_set_reg_num(addr, reg_num) \ (__dcache_l2_addr( \ (dcache_l2_addr_val(addr) & \ ~_E2K_DCACHE_L2_REG_NUM) | \ ((reg_num) << _E2K_DCACHE_L2_REG_NUM_SHIFT) & \ _E2K_DCACHE_L2_REG_NUM)) #define dcache_l2_get_reg_num(addr) \ (dcache_l2_addr_val(addr) & _E2K_DCACHE_L2_REG_NUM_SHIFT) #define dcache_l2_set_bank_num(addr, bank_num) \ (__dcache_l2_addr( \ (dcache_l2_addr_val(addr) & \ ~_E2K_DCACHE_L2_BANK_NUM) | \ ((bank_num) << _E2K_DCACHE_L2_BANK_NUM_SHIFT) & \ _E2K_DCACHE_L2_BANK_NUM)) #define dcache_l2_get_bank_num(addr) \ (dcache_l2_addr_val(addr) & _E2K_DCACHE_L2_BANK_NUM_SHIFT) #define dcache_l2_set_word(addr, word) \ (__dcache_l2_addr( \ (dcache_l2_addr_val(addr) & ~_E2K_DCACHE_L2_WORD) | \ ((word) << _E2K_DCACHE_L2_WORD_SHIFT) & \ _E2K_DCACHE_L2_WORD)) #define dcache_l2_get_word(addr) \ (dcache_l2_addr_val(addr) & _E2K_DCACHE_L2_WORD) #define mk_dcache_l2_addr(phys_addr, type, word) \ ({ \ dcache_l2_addr_t addr = 0; \ addr = __dcache_l2_addr(DCACHE_L1_PADDR_TO_ADDR(phys_addr)); \ addr = dcache_l2_set_type(addr, type); \ addr = dcache_l2_set_word(addr, word); \ addr; \ }) #define mk_dcache_l2_reg_addr(reg_num, bank_num) \ ({ \ dcache_l2_addr_t addr = 0; \ addr = dcache_l2_set_type(addr, _E2K_DCACHE_L2_REGS_TYPE); \ addr = dcache_l2_set_reg_num(addr, reg_num); \ addr = dcache_l2_set_bank_num(addr, bank_num); \ addr; \ }) /* * ICACHE/DTLB/ITLB line flush operations */ /* ICACHE/DTLB/ITLB line flush operations address */ #ifndef __ASSEMBLY__ typedef e2k_addr_t flush_op_t; #endif /* ! __ASSEMBLY__ */ #define flush_op_val(flush_op) (flush_op) #define __flush_op(flush_op_val) (flush_op_val) #define _FLUSH_OP_TYPE 0x0000000000000007 /* type of */ /* operation */ #define _FLUSH_ICACHE_LINE_USER_OP 0x0000000000000000 #define _FLUSH_TLB_PAGE_SYS_OP 0x0000000000000001 #define _FLUSH_ICACHE_LINE_SYS_OP 0x0000000000000002 #define flush_op_get_type(flush_op) \ (flush_op_val(flush_op) & _FLUSH_OP_TYPE) #define flush_op_set_type(flush_op, type) \ (__flush_op((flush_op_val(flush_op) & ~_FLUSH_OP_TYPE) | \ ((type) & _FLUSH_OP_TYPE))) #define flush_op_set_icache_line_user(flush_op) \ flush_op_set_type(flush_op, _FLUSH_ICACHE_LINE_USER_OP) #define flush_op_set_icache_line_sys(flush_op) \ flush_op_set_type(flush_op, _FLUSH_ICACHE_LINE_SYS_OP) #define flush_op_set_tlb_page_sys(flush_op) \ flush_op_set_type(flush_op, _FLUSH_TLB_PAGE_SYS_OP) #define _flush_op_icache_line_user ((long)_FLUSH_ICACHE_LINE_USER_OP) #define _flush_op_icache_line_sys ((long)_FLUSH_ICACHE_LINE_SYS_OP) #define _flush_op_tlb_page_sys ((long)_FLUSH_TLB_PAGE_SYS_OP) #define flush_op_icache_line_user __flush_op(_flush_op_icache_line_user) #define flush_op_icache_line_sys __flush_op(_flush_op_icache_line_sys) #define flush_op_tlb_page_sys __flush_op(_flush_op_tlb_page_sys) /* ICACHE/DTLB/ITLB line flush extended virtual address structure */ #ifndef __ASSEMBLY__ typedef e2k_addr_t flush_addr_t; #endif /* ! __ASSEMBLY__ */ #define flush_addr_val(flush_addr) (flush_addr) #define __flush_addr(flush_addr_val) (flush_addr_val) #define _FLUSH_ADDR_CONTEXT_SHIFT 50 /* [61:50] */ #define _FLUSH_ADDR_VA 0x0000ffffffffffff /* virtual address */ /* [47: 0] */ #define _FLUSH_ADDR_CONTEXT 0x3ffc000000000000 /* context # */ #define _FLUSH_ADDR_ROOT 0x4000000000000000 /* should be 0 */ #define _FLUSH_ADDR_PHYS 0x8000000000000000 /* should be 0 */ #define FLUSH_VADDR_TO_VA(virt_addr) ((virt_addr) & _FLUSH_ADDR_VA) #define _FLUSH_ADDR_KERNEL(virt_addr) (FLUSH_VADDR_TO_VA(virt_addr) | \ ((long)E2K_KERNEL_CONTEXT << _FLUSH_ADDR_CONTEXT_SHIFT)) #define FLUSH_ADDR_KERNEL(virt_addr) \ __flush_addr(_FLUSH_ADDR_KERNEL(virt_addr)) #define flush_addr_get_va(flush_addr) \ (flush_addr_val(flush_addr) & _FLUSH_ADDR_VA) #define flush_addr_set_va(flush_addr, virt_addr) \ (__flush_addr((flush_addr_val(flush_addr) & ~_FLUSH_ADDR_VA) | \ ((va_page) & _FLUSH_ADDR_VA))) #define flush_addr_get_pid(flush_addr) \ ((flush_addr_val(flush_addr) & _FLUSH_ADDR_CONTEXT) >> \ _FLUSH_ADDR_CONTEXT_SHIFT) #define flush_addr_get_context(flush_addr) \ (flush_addr_val(flush_addr) & _FLUSH_ADDR_CONTEXT) #define flush_addr_set_context(flush_addr, context) \ (__flush_addr((flush_addr_val(flush_addr) & \ ~_FLUSH_ADDR_CONTEXT) | \ ((long)(context) << _FLUSH_ADDR_CONTEXT_SHIFT) & \ _FLUSH_ADDR_CONTEXT)) #define _flush_addr_make_sys(virt_addr, context, root) \ ({ \ e2k_addr_t __addr_val = FLUSH_VADDR_TO_VA(virt_addr); \ __addr_val |= (((long)(context) << \ _FLUSH_ADDR_CONTEXT_SHIFT) & \ _FLUSH_ADDR_CONTEXT); \ if (root) \ __addr_val |= _FLUSH_ADDR_ROOT; \ __addr_val; \ }) #define _flush_addr_make_user(virt_addr) \ FLUSH_VADDR_TO_VA(virt_addr) #define flush_addr_make_sys(virt_addr, context) \ __flush_addr(_flush_addr_make_sys(virt_addr, context, 0)) #define flush_addr_make_user(virt_addr) \ __flush_addr(_flush_addr_make_user(virt_addr)) #define flush_addr_make_ss(virt_addr, context) \ __flush_addr(_flush_addr_make_sys(virt_addr, context, 1)) /* * CACHE(s) flush operations */ /* CACHE(s) flush operations address */ #define _FLUSH_INVALIDATE_CACHE_L12_OP 0x0000000000000000 #define _FLUSH_WRITE_BACK_CACHE_L12_OP 0x0000000000000001 /* instruction set begining V3 has not invalidate operation */ /* only flush all caches (same as write back) */ #define _FLUSH_CACHE_L12_OP _FLUSH_WRITE_BACK_CACHE_L12_OP #define flush_op_set_invalidate_cache_L12(flush_op) \ flush_op_set_type(flush_op, _FLUSH_INVALIDATE_CACHE_L12_OP) #define flush_op_set_write_back_cache_L12(flush_op) \ flush_op_set_type(flush_op, _FLUSH_WRITE_BACK_CACHE_L12_OP) #define flush_op_set_cache_all(flush_op) \ flush_op_set_write_back_cache_L12(flush_op) #define _flush_op_invalidate_cache_L12 ((long)_FLUSH_INVALIDATE_CACHE_L12_OP) #define _flush_op_write_back_cache_L12 ((long)_FLUSH_WRITE_BACK_CACHE_L12_OP) #define _flush_op_cache_all _flush_op_write_back_cache_L12 #define flush_op_invalidate_cache_L12 \ __flush_op(_flush_op_invalidate_cache_L12) #define flush_op_write_back_cache_L12 \ __flush_op(_flush_op_write_back_cache_L12) #define flush_op_cache_all flush_op_write_back_cache_L12 /* * ICACHE/TLB flush operations */ /* ICACHE/TLB flush operations address */ #define _FLUSH_ICACHE_ALL_OP 0x0000000000000000 #define _FLUSH_TLB_ALL_OP 0x0000000000000001 #define flush_op_set_icache_all(flush_op) \ flush_op_set_type(flush_op, _FLUSH_ICACHE_ALL_OP) #define flush_op_set_tlb_all(flush_op) \ flush_op_set_type(flush_op, _FLUSH_TLB_ALL_OP) #define _flush_op_icache_all ((long)_FLUSH_ICACHE_ALL_OP) #define _flush_op_tlb_all ((long)_FLUSH_TLB_ALL_OP) #define flush_op_icache_all __flush_op(_flush_op_icache_all) #define flush_op_tlb_all __flush_op(_flush_op_tlb_all) /* * MU address to access to CLW internal registers */ #ifndef __ASSEMBLY__ typedef e2k_addr_t clw_addr_t; #endif /* __ASSEMBLY__ */ #define ADDR_US_CL_B 0x024 /* User stack bottom to clean */ #define ADDR_US_CL_UP 0x124 /* User stack up to clean */ #define ADDR_US_CL_M0 0x004 /* User stack bit-mask [0:63] */ #define ADDR_US_CL_M1 0x084 /* User stack bit-mask [64:127] */ #define ADDR_US_CL_M2 0x104 /* User stack bit-mask [128:195] */ #define ADDR_US_CL_M3 0x184 /* User stack bit-mask [196:255] */ /* CLW internel register contents */ #ifndef __ASSEMBLY__ typedef unsigned long clw_reg_t; #endif /* __ASSEMBLY__ */ /* * User Stack Window clean bit-mask structure */ #define CLW_MASK_WORD_NUM 4 /* number of words in bit-mask */ #define CLW_BITS_PER_MASK_WORD 64 /* number of bits in one bit-mask */ /* word */ #define CLW_BYTES_PER_BIT 32 /* one bit describes 32 bytes of */ /* stack area */ #define CLW_BYTES_PER_MASK /* number of bytes in full bit-mask */ \ (CLW_BYTES_PER_BIT * CLW_MASK_WORD_NUM * CLW_BITS_PER_MASK_WORD) /* * MMU DEBUG registers */ #define _MMU_ADDR_REGS_TYPE 0x0000000000000007 /* [2:0] type of op. */ #define _MMU_ADDR_DEBUG_REG_NO 0x00000000000001e0 /* [8:5] # of reg. */ #define _MMU_ADDR_DEBUG_REG_NO_SHIFT 5 /* [8:5] */ #define _MMU_ADDR_DEBUG_REG_TYPE 7 /* access to DEBUG */ /* registers */ #define MMU_DDBAR0_REG_NO 0 /* Data access breakpoint address */ #define MMU_DDBAR1_REG_NO 1 /* registers # 0 - 3 */ #define MMU_DDBAR2_REG_NO 2 #define MMU_DDBAR3_REG_NO 3 #define MMU_DDBCR_REG_NO 4 /* Data access breakpoint control */ #define MMU_DDBSR_REG_NO 5 /* Data access breakpoint status */ #define MMU_DDMAR0_REG_NO 6 /* Data monitor accumulator */ #define MMU_DDMAR1_REG_NO 7 /* registers # 0 - 1 */ #define MMU_DDMCR_REG_NO 8 /* Data monitor control register */ #define MMU_DEBUG_REGS_NUM (MMU_DDMCR_REG_NO + 1) #define _DEBUG_REG_NO_TO_MMU_ADDR(reg_no) \ ((((reg_no) << _MMU_ADDR_DEBUG_REG_NO_SHIFT) & \ _MMU_ADDR_DEBUG_REG_NO) | _MMU_ADDR_DEBUG_REG_TYPE) #ifndef __ASSEMBLY__ typedef union { u32 half_word[2]; struct { /* structure of register */ u32 user : 1; /* [ 0: 0] */ u32 system : 1; /* [ 1: 1] */ u32 trap : 1; /* [ 2: 2] */ u32 unused : 13; /* [15: 3] */ u32 event : 7; /* [22:16] */ u32 unused2 : 9; /* [31:23] */ } fields[2]; u64 word; } e2k_ddmcr_t; #define DDMCR_reg word typedef union { struct { u64 b0 : 8; u64 unus7 : 4; u64 b1 : 8; u64 unus8 : 4; u64 b2 : 8; u64 unus9 : 4; u64 b3 : 8; u64 unu10 : 4; u64 unu11 : 1; u64 m0 : 1; u64 m1 : 1; u64 unu12 : 13; }; union { struct { u64 sprg0 : 1; u64 spec0 : 1; u64 aprg0 : 1; u64 psf0 : 1; u64 csf0 : 1; u64 cut0 : 1; u64 pt0 : 1; u64 clw0 : 1; u64 unus1 : 4; u64 sprg1 : 1; u64 spec1 : 1; u64 aprg1 : 1; u64 psf1 : 1; u64 csf1 : 1; u64 cut1 : 1; u64 pt1 : 1; u64 clw1 : 1; u64 unus2 : 4; u64 sprg2 : 1; u64 spec2 : 1; u64 aprg2 : 1; u64 psf2 : 1; u64 csf2 : 1; u64 cut2 : 1; u64 pt2 : 1; u64 clw2 : 1; u64 unus3 : 4; u64 sprg3 : 1; u64 spec3 : 1; u64 aprg3 : 1; u64 psf3 : 1; u64 csf3 : 1; u64 cut3 : 1; u64 pt3 : 1; u64 clw3 : 1; u64 unus4 : 4; u64 unus5 : 1; u64 m0 : 1; /* [49] */ u64 m1 : 1; /* [50] */ u64 unus6 : 13; }; struct { u64 b0 : 8; u64 unus7 : 4; u64 b1 : 8; u64 unus8 : 4; u64 b2 : 8; u64 unus9 : 4; u64 b3 : 8; u64 unu10 : 4; u64 unu11 : 16; }; } fields; u64 word; } e2k_ddbsr_t; #define DDBSR_reg word #define E2K_DDBSR_MASK(cp_num) (0xffULL << ((cp_num) * 12)) #define E2K_DDBSR_MASK_ALL_BP 0xff0ff0ff0ffULL typedef union { struct { u64 v0 : 1; u64 root0 : 1; u64 rw0 : 2; u64 lng0 : 3; u64 sync0 : 1; u64 spec0 : 1; u64 ap0 : 1; u64 sf0 : 1; u64 hw0 : 1; u64 t0 : 1; u64 __x0 : 1; u64 v1 : 1; u64 root1 : 1; u64 rw1 : 2; u64 lng1 : 3; u64 sync1 : 1; u64 spec1 : 1; u64 ap1 : 1; u64 sf1 : 1; u64 hw1 : 1; u64 t1 : 1; u64 __x1 : 1; u64 v2 : 1; u64 root2 : 1; u64 rw2 : 2; u64 lng2 : 3; u64 sync2 : 1; u64 spec2 : 1; u64 ap2 : 1; u64 sf2 : 1; u64 hw2 : 1; u64 t2 : 1; u64 __x2 : 1; u64 v3 : 1; u64 root3 : 1; u64 rw3 : 2; u64 lng3 : 3; u64 sync3 : 1; u64 spec3 : 1; u64 ap3 : 1; u64 sf3 : 1; u64 hw3 : 1; u64 t3 : 1; u64 __x3 : 1; u64 gm : 1; }; struct { u64 v0 : 1; u64 root0 : 1; u64 rw0 : 2; u64 lng0 : 3; u64 sync0 : 1; u64 spec0 : 1; u64 ap0 : 1; u64 sf0 : 1; u64 hw0 : 1; u64 t0 : 1; u64 __x0 : 1; u64 v1 : 1; u64 root1 : 1; u64 rw1 : 2; u64 lng1 : 3; u64 sync1 : 1; u64 spec1 : 1; u64 ap1 : 1; u64 sf1 : 1; u64 hw1 : 1; u64 t1 : 1; u64 __x1 : 1; u64 v2 : 1; u64 root2 : 1; u64 rw2 : 2; u64 lng2 : 3; u64 sync2 : 1; u64 spec2 : 1; u64 ap2 : 1; u64 sf2 : 1; u64 hw2 : 1; u64 t2 : 1; u64 __x2 : 1; u64 v3 : 1; u64 root3 : 1; u64 rw3 : 2; u64 lng3 : 3; u64 sync3 : 1; u64 spec3 : 1; u64 ap3 : 1; u64 sf3 : 1; u64 hw3 : 1; u64 t3 : 1; u64 __x3 : 1; u64 gm : 1; } fields; u64 word; } e2k_ddbcr_t; #define DDBCR_reg word #define E2K_DDBCR_MASK(cp_num) (0x3FFFULL << ((cp_num) * 14)) #endif /* ! __ASSEMBLY__ */ #endif /* _E2K_MMU_REGS_TYPES_H_ */