162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * mcfmmu.h -- definitions for the ColdFire v4e MMU 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * (C) Copyright 2011, Greg Ungerer <gerg@uclinux.org> 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 762306a36Sopenharmony_ci * License. See the file COPYING in the main directory of this archive 862306a36Sopenharmony_ci * for more details. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef MCFMMU_H 1262306a36Sopenharmony_ci#define MCFMMU_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* 1562306a36Sopenharmony_ci * The MMU support registers are mapped into the address space using 1662306a36Sopenharmony_ci * the processor MMUBASE register. We used a fixed address for mapping, 1762306a36Sopenharmony_ci * there doesn't seem any need to make this configurable yet. 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#define MMUBASE 0xfe000000 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci/* 2262306a36Sopenharmony_ci * The support registers of the MMU. Names are the sames as those 2362306a36Sopenharmony_ci * used in the Freescale v4e documentation. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci#define MMUCR (MMUBASE + 0x00) /* Control register */ 2662306a36Sopenharmony_ci#define MMUOR (MMUBASE + 0x04) /* Operation register */ 2762306a36Sopenharmony_ci#define MMUSR (MMUBASE + 0x08) /* Status register */ 2862306a36Sopenharmony_ci#define MMUAR (MMUBASE + 0x10) /* TLB Address register */ 2962306a36Sopenharmony_ci#define MMUTR (MMUBASE + 0x14) /* TLB Tag register */ 3062306a36Sopenharmony_ci#define MMUDR (MMUBASE + 0x18) /* TLB Data register */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * MMU Control register bit flags 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci#define MMUCR_EN 0x00000001 /* Virtual mode enable */ 3662306a36Sopenharmony_ci#define MMUCR_ASM 0x00000002 /* Address space mode */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * MMU Operation register. 4062306a36Sopenharmony_ci */ 4162306a36Sopenharmony_ci#define MMUOR_UAA 0x00000001 /* Update allocation address */ 4262306a36Sopenharmony_ci#define MMUOR_ACC 0x00000002 /* TLB access */ 4362306a36Sopenharmony_ci#define MMUOR_RD 0x00000004 /* TLB access read */ 4462306a36Sopenharmony_ci#define MMUOR_WR 0x00000000 /* TLB access write */ 4562306a36Sopenharmony_ci#define MMUOR_ADR 0x00000008 /* TLB address select */ 4662306a36Sopenharmony_ci#define MMUOR_ITLB 0x00000010 /* ITLB operation */ 4762306a36Sopenharmony_ci#define MMUOR_CAS 0x00000020 /* Clear non-locked ASID TLBs */ 4862306a36Sopenharmony_ci#define MMUOR_CNL 0x00000040 /* Clear non-locked TLBs */ 4962306a36Sopenharmony_ci#define MMUOR_CA 0x00000080 /* Clear all TLBs */ 5062306a36Sopenharmony_ci#define MMUOR_STLB 0x00000100 /* Search TLBs */ 5162306a36Sopenharmony_ci#define MMUOR_AAN 16 /* TLB allocation address */ 5262306a36Sopenharmony_ci#define MMUOR_AAMASK 0xffff0000 /* AA mask */ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* 5562306a36Sopenharmony_ci * MMU Status register. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_ci#define MMUSR_HIT 0x00000002 /* Search TLB hit */ 5862306a36Sopenharmony_ci#define MMUSR_WF 0x00000008 /* Write access fault */ 5962306a36Sopenharmony_ci#define MMUSR_RF 0x00000010 /* Read access fault */ 6062306a36Sopenharmony_ci#define MMUSR_SPF 0x00000020 /* Supervisor protect fault */ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* 6362306a36Sopenharmony_ci * MMU Read/Write Tag register. 6462306a36Sopenharmony_ci */ 6562306a36Sopenharmony_ci#define MMUTR_V 0x00000001 /* Valid */ 6662306a36Sopenharmony_ci#define MMUTR_SG 0x00000002 /* Shared global */ 6762306a36Sopenharmony_ci#define MMUTR_IDN 2 /* Address Space ID */ 6862306a36Sopenharmony_ci#define MMUTR_IDMASK 0x000003fc /* ASID mask */ 6962306a36Sopenharmony_ci#define MMUTR_VAN 10 /* Virtual Address */ 7062306a36Sopenharmony_ci#define MMUTR_VAMASK 0xfffffc00 /* VA mask */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * MMU Read/Write Data register. 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci#define MMUDR_LK 0x00000002 /* Lock entry */ 7662306a36Sopenharmony_ci#define MMUDR_X 0x00000004 /* Execute access enable */ 7762306a36Sopenharmony_ci#define MMUDR_W 0x00000008 /* Write access enable */ 7862306a36Sopenharmony_ci#define MMUDR_R 0x00000010 /* Read access enable */ 7962306a36Sopenharmony_ci#define MMUDR_SP 0x00000020 /* Supervisor access enable */ 8062306a36Sopenharmony_ci#define MMUDR_CM_CWT 0x00000000 /* Cachable write thru */ 8162306a36Sopenharmony_ci#define MMUDR_CM_CCB 0x00000040 /* Cachable copy back */ 8262306a36Sopenharmony_ci#define MMUDR_CM_NCP 0x00000080 /* Non-cachable precise */ 8362306a36Sopenharmony_ci#define MMUDR_CM_NCI 0x000000c0 /* Non-cachable imprecise */ 8462306a36Sopenharmony_ci#define MMUDR_SZ_1MB 0x00000000 /* 1MB page size */ 8562306a36Sopenharmony_ci#define MMUDR_SZ_4KB 0x00000100 /* 4kB page size */ 8662306a36Sopenharmony_ci#define MMUDR_SZ_8KB 0x00000200 /* 8kB page size */ 8762306a36Sopenharmony_ci#define MMUDR_SZ_1KB 0x00000300 /* 1kB page size */ 8862306a36Sopenharmony_ci#define MMUDR_PAN 10 /* Physical address */ 8962306a36Sopenharmony_ci#define MMUDR_PAMASK 0xfffffc00 /* PA mask */ 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* 9462306a36Sopenharmony_ci * Simple access functions for the MMU registers. Nothing fancy 9562306a36Sopenharmony_ci * currently required, just simple 32bit access. 9662306a36Sopenharmony_ci */ 9762306a36Sopenharmony_cistatic inline u32 mmu_read(u32 a) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci return *((volatile u32 *) a); 10062306a36Sopenharmony_ci} 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistatic inline void mmu_write(u32 a, u32 v) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci *((volatile u32 *) a) = v; 10562306a36Sopenharmony_ci __asm__ __volatile__ ("nop"); 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_civoid cf_bootmem_alloc(void); 10962306a36Sopenharmony_civoid cf_mmu_context_init(void); 11062306a36Sopenharmony_ciint cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word); 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci#endif 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#endif /* MCFMMU_H */ 115