114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras/*
214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * Declarations of procedures and variables shared between files
314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * in arch/ppc/mm/.
414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  Derived from arch/ppc/mm/init.c:
614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au)
914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  and Cort Dougan (PReP) (cort@cs.nmt.edu)
1014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *    Copyright (C) 1996 Paul Mackerras
1114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
1214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  Derived from "arch/i386/mm/init.c"
1314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *    Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
1414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
1514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  This program is free software; you can redistribute it and/or
1614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  modify it under the terms of the GNU General Public License
1714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  as published by the Free Software Foundation; either version
1814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  2 of the License, or (at your option) any later version.
1914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
2014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras */
21621023072524fc0155ed16490255e1ea3aa11585David Gibson#include <linux/mm.h>
2214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#include <asm/tlbflush.h>
2314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#include <asm/mmu.h>
2414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
252a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#ifdef CONFIG_PPC_MMU_NOHASH
262a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
272a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt/*
282a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt * On 40x and 8xx, we directly inline tlbia and tlbivax
292a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt */
302a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#if defined(CONFIG_40x) || defined(CONFIG_8xx)
312a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtstatic inline void _tlbil_all(void)
322a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt{
334a0826824beb28390651a962987b0681b9e7fe93Benjamin Herrenschmidt	asm volatile ("sync; tlbia; isync" : : : "memory");
342a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt}
352a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtstatic inline void _tlbil_pid(unsigned int pid)
362a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt{
374a0826824beb28390651a962987b0681b9e7fe93Benjamin Herrenschmidt	asm volatile ("sync; tlbia; isync" : : : "memory");
382a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt}
39d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt#define _tlbil_pid_noind(pid)	_tlbil_pid(pid)
40d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt
412a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#else /* CONFIG_40x || CONFIG_8xx */
422a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtextern void _tlbil_all(void);
432a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtextern void _tlbil_pid(unsigned int pid);
4425d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#ifdef CONFIG_PPC_BOOK3E
4525d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidtextern void _tlbil_pid_noind(unsigned int pid);
4625d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#else
47d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt#define _tlbil_pid_noind(pid)	_tlbil_pid(pid)
4825d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#endif
492a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#endif /* !(CONFIG_40x || CONFIG_8xx) */
502a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
512a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt/*
522a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt * On 8xx, we directly inline tlbie, on others, it's extern
532a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt */
542a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#ifdef CONFIG_8xx
55d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidtstatic inline void _tlbil_va(unsigned long address, unsigned int pid,
56d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt			     unsigned int tsize, unsigned int ind)
572a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt{
584a0826824beb28390651a962987b0681b9e7fe93Benjamin Herrenschmidt	asm volatile ("tlbie %0; sync" : : "r" (address) : "memory");
592a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt}
6025d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#elif defined(CONFIG_PPC_BOOK3E)
6125d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidtextern void _tlbil_va(unsigned long address, unsigned int pid,
6225d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt		      unsigned int tsize, unsigned int ind);
6325d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#else
64d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidtextern void __tlbil_va(unsigned long address, unsigned int pid);
65d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidtstatic inline void _tlbil_va(unsigned long address, unsigned int pid,
66d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt			     unsigned int tsize, unsigned int ind)
67d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt{
68d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt	__tlbil_va(address, pid);
69d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt}
702a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#endif /* CONIFG_8xx */
712a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
72e7f75ad01d590243904c2d95ab47e6b2e9ef6dadDave Kleikamp#if defined(CONFIG_PPC_BOOK3E) || defined(CONFIG_PPC_47x)
7325d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidtextern void _tlbivax_bcast(unsigned long address, unsigned int pid,
7425d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt			   unsigned int tsize, unsigned int ind);
7525d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#else
76d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidtstatic inline void _tlbivax_bcast(unsigned long address, unsigned int pid,
77d4e167da4cb60910f6ac305aee03714937f70b71Benjamin Herrenschmidt				   unsigned int tsize, unsigned int ind)
782a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt{
792a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt	BUG();
802a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt}
8125d21ad6e799cccd097b9df2a2fefe19a7e1dfcfBenjamin Herrenschmidt#endif
822a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
832a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#else /* CONFIG_PPC_MMU_NOHASH */
842a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
85ee4f2ea48674b6c9d91bc854edc51a3e6a7168c4Benjamin Herrenschmidtextern void hash_preload(struct mm_struct *mm, unsigned long ea,
86ee4f2ea48674b6c9d91bc854edc51a3e6a7168c4Benjamin Herrenschmidt			 unsigned long access, unsigned long trap);
87ee4f2ea48674b6c9d91bc854edc51a3e6a7168c4Benjamin Herrenschmidt
88ee4f2ea48674b6c9d91bc854edc51a3e6a7168c4Benjamin Herrenschmidt
892a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtextern void _tlbie(unsigned long address);
902a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidtextern void _tlbia(void);
912a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
922a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt#endif /* CONFIG_PPC_MMU_NOHASH */
932a4aca1144394653269720ffbb5a325a77abd5faBenjamin Herrenschmidt
94ab1f9dac6eea25ee59e4c8e1cf0b7476afbbfe07Paul Mackerras#ifdef CONFIG_PPC32
9519f5465e823858a2f0b0e9a92e52816ba3ee70bbTrent Piepho
9614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern void mapin_ram(void);
9714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern int map_page(unsigned long va, phys_addr_t pa, int flags);
987c5c4325d2d911fe54db3bc14149bfa558ae0acbBecky Bruceextern void setbat(int index, unsigned long virt, phys_addr_t phys,
9914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras		   unsigned int size, int flags);
10014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
10114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern int __map_without_bats;
102c5df7f775148723de39274537a886e9502eef336Albert Herranzextern int __allow_ioremap_reserved;
10314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern unsigned long ioremap_base;
10414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern unsigned int rtas_data, rtas_size;
10514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
1068e561e7eda02819c711a75b64a000bf34948cdbbDavid Gibsonstruct hash_pte;
1078e561e7eda02819c711a75b64a000bf34948cdbbDavid Gibsonextern struct hash_pte *Hash, *Hash_end;
10814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern unsigned long Hash_size, Hash_mask;
10932a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidt
11032a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidt#endif /* CONFIG_PPC32 */
11132a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidt
11232a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidt#ifdef CONFIG_PPC64
11332a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidtextern int map_kernel_page(unsigned long ea, unsigned long pa, int flags);
11432a74949b7337726e76d69f51c48715431126c6cBenjamin Herrenschmidt#endif /* CONFIG_PPC64 */
115ab1f9dac6eea25ee59e4c8e1cf0b7476afbbfe07Paul Mackerras
116800fc3eeb0eed3bf98d621c0da24d68cabcf6526David Gibsonextern unsigned long ioremap_bot;
117ab1f9dac6eea25ee59e4c8e1cf0b7476afbbfe07Paul Mackerrasextern unsigned long __max_low_memory;
11809b5e63f827016732d956abb7a4c74a312d20521Kumar Galaextern phys_addr_t __initial_memory_limit_addr;
1192bf3016f89344d4cd8b2c96bbec2b642a2bde413Stefan Roeseextern phys_addr_t total_memory;
1202bf3016f89344d4cd8b2c96bbec2b642a2bde413Stefan Roeseextern phys_addr_t total_lowmem;
12199c62dd773797b68f3b1ca6bb3274725d1852fa2Kumar Galaextern phys_addr_t memstart_addr;
122d7917ba7051e3fd12ebe2d5a09b29fb3a2b38190Kumar Galaextern phys_addr_t lowmem_end_addr;
12314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
124de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranz#ifdef CONFIG_WII
125de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranzextern unsigned long wii_hole_start;
126de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranzextern unsigned long wii_hole_size;
127de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranz
128de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranzextern unsigned long wii_mmu_mapin_mem2(unsigned long top);
129de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranzextern void wii_memory_fixups(void);
130de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranz#endif
131de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranz
13214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras/* ...and now those things that may be slightly different between processor
13314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * architectures.  -- Dan
13414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras */
13514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#if defined(CONFIG_8xx)
13614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#define MMU_init_hw()		do { } while(0)
137ae4cec4736969ec2196a6bbce4ab263ff7cb7eefStephen Rothwell#define mmu_mapin_ram(top)	(0UL)
13814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
13914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#elif defined(CONFIG_4xx)
14014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern void MMU_init_hw(void);
141ae4cec4736969ec2196a6bbce4ab263ff7cb7eefStephen Rothwellextern unsigned long mmu_mapin_ram(unsigned long top);
14214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
14355fd766b5fad8240b7a6e994b5779a46d28f73d4Kumar Gala#elif defined(CONFIG_PPC_FSL_BOOK3E)
14455fd766b5fad8240b7a6e994b5779a46d28f73d4Kumar Galaextern unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx);
1451dc91c3eb374ca01ec99dc0ca2a38babc509beb3Kumar Galaextern unsigned long calc_cam_sz(unsigned long ram, unsigned long virt,
1461dc91c3eb374ca01ec99dc0ca2a38babc509beb3Kumar Gala				 phys_addr_t phys);
14755fd766b5fad8240b7a6e994b5779a46d28f73d4Kumar Gala#ifdef CONFIG_PPC32
14814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern void MMU_init_hw(void);
149ae4cec4736969ec2196a6bbce4ab263ff7cb7eefStephen Rothwellextern unsigned long mmu_mapin_ram(unsigned long top);
15014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern void adjust_total_lowmem(void);
15178a235efdc42ff363de81fdbc171385e8b86b69bKevin Haoextern int switch_to_as1(void);
1520be7d969b0efef085ed6497d462ba16a875ca737Kevin Haoextern void restore_to_as0(int esel, int offset, void *dt_ptr, int bootcpu);
15355fd766b5fad8240b7a6e994b5779a46d28f73d4Kumar Gala#endif
15478f622377f7d31d988db350a43c5689dd5f31876Kumar Galaextern void loadcam_entry(unsigned int index);
15578f622377f7d31d988db350a43c5689dd5f31876Kumar Gala
15678f622377f7d31d988db350a43c5689dd5f31876Kumar Galastruct tlbcam {
15778f622377f7d31d988db350a43c5689dd5f31876Kumar Gala	u32	MAS0;
15878f622377f7d31d988db350a43c5689dd5f31876Kumar Gala	u32	MAS1;
15978f622377f7d31d988db350a43c5689dd5f31876Kumar Gala	unsigned long	MAS2;
16078f622377f7d31d988db350a43c5689dd5f31876Kumar Gala	u32	MAS3;
16178f622377f7d31d988db350a43c5689dd5f31876Kumar Gala	u32	MAS7;
16278f622377f7d31d988db350a43c5689dd5f31876Kumar Gala};
163ab1f9dac6eea25ee59e4c8e1cf0b7476afbbfe07Paul Mackerras#elif defined(CONFIG_PPC32)
164ab1f9dac6eea25ee59e4c8e1cf0b7476afbbfe07Paul Mackerras/* anything 32-bit except 4xx or 8xx */
16514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern void MMU_init_hw(void);
166de32400dd26e743c5d500aa42d8d6818b79edb73Albert Herranzextern unsigned long mmu_mapin_ram(unsigned long top);
16714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#endif
168