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