2009-04-03 01:49:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  This  file  is  subject  to  the  terms  and  conditions  of  the  GNU  General  Public 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  License .   See  the  file  " COPYING "  in  the  main  directory  of  this  archive 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 19:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 *  Copyright  ( C )  1999 - 2006  Helge  Deller  < deller @ gmx . de >  ( 07 - 13 - 1999 ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 *  Copyright  ( C )  1999  SuSE  GmbH  Nuernberg 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Copyright  ( C )  2000  Philipp  Rumpf  ( prumpf @ tux . org ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Cache  and  TLB  management 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/init.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/kernel.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/mm.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/module.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/seq_file.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <linux/pagemap.h> 
  
						 
					
						
							
								
									
										
											 
										
											
												Detach sched.h from mm.h
First thing mm.h does is including sched.h solely for can_do_mlock() inline
function which has "current" dereference inside. By dealing with can_do_mlock()
mm.h can be detached from sched.h which is good. See below, why.
This patch
a) removes unconditional inclusion of sched.h from mm.h
b) makes can_do_mlock() normal function in mm/mlock.c
c) exports can_do_mlock() to not break compilation
d) adds sched.h inclusions back to files that were getting it indirectly.
e) adds less bloated headers to some files (asm/signal.h, jiffies.h) that were
   getting them indirectly
Net result is:
a) mm.h users would get less code to open, read, preprocess, parse, ... if
   they don't need sched.h
b) sched.h stops being dependency for significant number of files:
   on x86_64 allmodconfig touching sched.h results in recompile of 4083 files,
   after patch it's only 3744 (-8.3%).
Cross-compile tested on
	all arm defconfigs, all mips defconfigs, all powerpc defconfigs,
	alpha alpha-up
	arm
	i386 i386-up i386-defconfig i386-allnoconfig
	ia64 ia64-up
	m68k
	mips
	parisc parisc-up
	powerpc powerpc-up
	s390 s390-up
	sparc sparc-up
	sparc64 sparc64-up
	um-x86_64
	x86_64 x86_64-up x86_64-defconfig x86_64-allnoconfig
as well as my two usual configs.
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
											 
										 
										
											2007-05-21 01:22:52 +04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <linux/sched.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# include  <asm/pdc.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/cache.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/cacheflush.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/tlbflush.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/page.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/pgalloc.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <asm/processor.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-10-21 22:44:14 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <asm/sections.h> 
  
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <asm/shmparam.h> 
  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-10 20:35:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  split_tlb  __read_mostly ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  dcache_stride  __read_mostly ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  icache_stride  __read_mostly ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( dcache_stride ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  flush_dcache_page_asm ( unsigned  long  phys_addr ,  unsigned  long  vaddr ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_dcache_page_asm ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  flush_icache_page_asm ( unsigned  long  phys_addr ,  unsigned  long  vaddr ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* On some machines (e.g. ones with the Merced bus), there can be
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  only  a  single  PxTLB  broadcast  at  a  time ;  this  must  be  guaranteed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  by  software .   We  put  a  spinlock  around  all  TLB  flushes   to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  ensure  this . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								DEFINE_SPINLOCK ( pa_tlb_lock ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-01-10 20:35:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  pdc_cache_info  cache_info  __read_mostly ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# ifndef CONFIG_PA20 
  
						 
					
						
							
								
									
										
										
										
											2006-01-10 20:35:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  struct  pdc_btlb_info  btlb_info  __read_mostly ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef CONFIG_SMP 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_data_cache ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-09 09:39:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									on_each_cpu ( flush_data_cache_local ,  NULL ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_instruction_cache ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-09 09:39:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									on_each_cpu ( flush_instruction_cache_local ,  NULL ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_cache_all_local ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-01-10 20:47:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flush_instruction_cache_local ( NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_data_cache_local ( NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_cache_all_local ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/* Virtual address of pfn.  */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define pfn_va(pfn)	__va(PFN_PHYS(pfn)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
									
										
											 
										
											
												MM: Pass a PTE pointer to update_mmu_cache() rather than the PTE itself
On VIVT ARM, when we have multiple shared mappings of the same file
in the same MM, we need to ensure that we have coherency across all
copies.  We do this via make_coherent() by making the pages
uncacheable.
This used to work fine, until we allowed highmem with highpte - we
now have a page table which is mapped as required, and is not available
for modification via update_mmu_cache().
Ralf Beache suggested getting rid of the PTE value passed to
update_mmu_cache():
  On MIPS update_mmu_cache() calls __update_tlb() which walks pagetables
  to construct a pointer to the pte again.  Passing a pte_t * is much
  more elegant.  Maybe we might even replace the pte argument with the
  pte_t?
Ben Herrenschmidt would also like the pte pointer for PowerPC:
  Passing the ptep in there is exactly what I want.  I want that
  -instead- of the PTE value, because I have issue on some ppc cases,
  for I$/D$ coherency, where set_pte_at() may decide to mask out the
  _PAGE_EXEC.
So, pass in the mapped page table pointer into update_mmu_cache(), and
remove the PTE value, updating all implementations and call sites to
suit.
Includes a fix from Stephen Rothwell:
  sparc: fix fallout from update_mmu_cache API change
  Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
											 
										 
										
											2009-12-18 16:40:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								update_mmu_cache ( struct  vm_area_struct  * vma ,  unsigned  long  address ,  pte_t  * ptep )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  pfn  =  pte_pfn ( * ptep ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  page  * page ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* We don't have pte special.  As a result, we can be called with
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   an  invalid  pfn  and  we  don ' t  need  to  flush  the  kernel  dcache  page . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   This  occurs  with  FireGL  card  in  C8000 .   */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! pfn_valid ( pfn ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									page  =  pfn_to_page ( pfn ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( page_mapping ( page )  & &  test_bit ( PG_dcache_dirty ,  & page - > flags ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_kernel_dcache_page_addr ( pfn_va ( pfn ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										clear_bit ( PG_dcache_dirty ,  & page - > flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  else  if  ( parisc_requires_coherency ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										flush_kernel_dcache_page_addr ( pfn_va ( pfn ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								show_cache_info ( struct  seq_file  * m )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  buf [ 32 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									seq_printf ( m ,  " I-cache \t \t : %ld KB \n " ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_size / 1024  ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2007-01-23 21:24:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cache_info . dc_loop  ! =  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										snprintf ( buf ,  32 ,  " %lu-way associative " ,  cache_info . dc_loop ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									seq_printf ( m ,  " D-cache \t \t : %ld KB (%s%s, %s) \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cache_info . dc_size / 1024 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( cache_info . dc_conf . cc_wt  ?  " WT " : " WB " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										( cache_info . dc_conf . cc_sh  ?  " , shared I/D " : " " ) , 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										( ( cache_info . dc_loop  = =  1 )  ?  " direct mapped "  :  buf ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									seq_printf ( m ,  " ITLB entries \t : %ld \n "  " DTLB entries \t : %ld%s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_sh  ?  "  - shared with ITLB " : " " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef CONFIG_PA20 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* BTLB - Block TLB */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( btlb_info . max_size = = 0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										seq_printf ( m ,  " BTLB \t \t : not supported \n "  ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										seq_printf ( m ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" BTLB fixed \t : max. %d pages, pagesize=%d (%dMB) \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" BTLB fix-entr. \t : %d instruction, %d data (%d combined) \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										" BTLB var-entr. \t : %d instruction, %d data (%d combined) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . max_size ,  ( int ) 4096 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . max_size > > 8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . fixed_range_info . num_i , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . fixed_range_info . num_d , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . fixed_range_info . num_comb ,  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . variable_range_info . num_i , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . variable_range_info . num_d , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										btlb_info . variable_range_info . num_comb 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  __init   
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								parisc_cache_init ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pdc_cache_info ( & cache_info )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										panic ( " parisc_cache_init: pdc_cache_info failed " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#if 0 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( " ic_size %lx dc_size %lx it_size %lx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( " DC  base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_base , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_stride , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_loop ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( " dc_conf = 0x%lx  alias %d blk %d line %d shift %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* ( unsigned  long  * )  ( & cache_info . dc_conf ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_alias , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_block , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_line , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_shift ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " 	wt %d sh %d cst %d hv %d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_wt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_sh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_cst , 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cache_info . dc_conf . cc_hv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( " IC  base 0x%lx stride 0x%lx count 0x%lx loop 0x%lx \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_base , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_stride , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_count , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_loop ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( " ic_conf = 0x%lx  alias %d blk %d line %d shift %d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										* ( unsigned  long  * )  ( & cache_info . ic_conf ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_alias , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_block , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_line , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_shift ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " 	wt %d sh %d cst %d hv %d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_wt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_sh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_cst , 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-14 20:26:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cache_info . ic_conf . cc_hv ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 17:47:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " D-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_sh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_page , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_cst , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_aid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . dt_conf . tc_pad1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-02-06 17:47:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( " I-TLB conf: sh %d page %d cst %d aid %d pad1 %d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										cache_info . it_conf . tc_sh , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_conf . tc_page , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_conf . tc_cst , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_conf . tc_aid , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										cache_info . it_conf . tc_pad1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									split_tlb  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( cache_info . dt_conf . tc_sh  = =  0  | |  cache_info . dt_conf . tc_sh  = =  2 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( cache_info . dt_conf . tc_sh  = =  2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											printk ( KERN_WARNING  " Unexpected TLB configuration.  " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											" Will flush I/D separately (could be optimized). \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										split_tlb  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* "New and Improved" version from Jim Hull 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 * 	( 1  < <  ( cc_block - 1 ) )  *  ( cc_line  < <  ( 4  +  cnf . cc_shift ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 22:44:14 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									 *  The  following  CAFL_STRIDE  is  an  optimized  version ,  see 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  http : //lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023625.html
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  http : //lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023671.html
 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + cnf.cc_shift)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									dcache_stride  =  CAFL_STRIDE ( cache_info . dc_conf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									icache_stride  =  CAFL_STRIDE ( cache_info . ic_conf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# undef CAFL_STRIDE 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifndef CONFIG_PA20 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( pdc_btlb_info ( & btlb_info )  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										memset ( & btlb_info ,  0 ,  sizeof  btlb_info ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( boot_cpu_data . pdc . capabilities  &  PDC_MODEL_NVA_MASK )  = = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														PDC_MODEL_NVA_UNSUPPORTED )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										printk ( KERN_WARNING  " parisc_cache_init: Only equivalent aliasing supported! \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#if 0 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										panic ( " SMP kernel required to avoid non-equivalent aliasing " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  disable_sr_hashing ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2006-06-16 18:20:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  srhash_type ,  retval ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  space_bits ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  ( boot_cpu_data . cpu_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcx :  /* We shouldn't get this far.  setup.c should prevent it. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										BUG ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcxs : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcxt : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcxt_ : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										srhash_type  =  SRHASH_PCXST ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcxl : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										srhash_type  =  SRHASH_PCXL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  pcxl2 :  /* pcxl2 doesn't support space register hashing */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default :  /* Currently all PA2.0 machines use the same ins. sequence */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										srhash_type  =  SRHASH_PA20 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									disable_sr_hashing_asm ( srhash_type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-06-16 18:20:00 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									retval  =  pdc_spaceid_bits ( & space_bits ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* If this procedure isn't implemented, don't panic. */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( retval  <  0  & &  retval  ! =  PDC_BAD_OPTION ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										panic ( " pdc_spaceid_bits call failed. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( space_bits  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										panic ( " SpaceID hashing is still on! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								__flush_cache_page ( struct  vm_area_struct  * vma ,  unsigned  long  vmaddr ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										   unsigned  long  physaddr ) 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-02-02 23:41:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									preempt_disable ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flush_dcache_page_asm ( physaddr ,  vmaddr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vma - > vm_flags  &  VM_EXEC ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_icache_page_asm ( physaddr ,  vmaddr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-02 23:41:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									preempt_enable ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								void  flush_dcache_page ( struct  page  * page )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  address_space  * mapping  =  page_mapping ( page ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  vm_area_struct  * mpnt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  offset ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  addr ,  old_addr  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									pgoff_t  pgoff ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( mapping  & &  ! mapping_mapped ( mapping ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										set_bit ( PG_dcache_dirty ,  & page - > flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-22 09:42:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flush_kernel_dcache_page ( page ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! mapping ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pgoff  =  page - > index  < <  ( PAGE_CACHE_SHIFT  -  PAGE_SHIFT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* We have carefully arranged in arch_get_unmapped_area() that
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  * any *  mappings  of  a  file  are  always  congruently  mapped  ( whether 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  declared  as  MAP_PRIVATE  or  MAP_SHARED ) ,  so  we  only  need 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									 *  to  flush  one  address  here  for  them  all  to  become  coherent  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_dcache_mmap_lock ( mapping ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-10-08 16:31:25 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vma_interval_tree_foreach ( mpnt ,  & mapping - > i_mmap ,  pgoff ,  pgoff )  { 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
										offset  =  ( pgoff  -  mpnt - > vm_pgoff )  < <  PAGE_SHIFT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										addr  =  mpnt - > vm_start  +  offset ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 12:37:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										/* The TLB is the engine of coherence on parisc: The
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  CPU  is  entitled  to  speculate  any  page  with  a  TLB 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  mapping ,  so  here  we  kill  the  mapping  then  flush  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  page  along  a  special  flush  only  alias  mapping . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  This  guarantees  that  the  page  is  no - longer  in  the 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  cache  for  any  process  and  nor  may  it  be 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  speculatively  read  in  ( until  the  user  or  kernel 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										 *  specifically  accesses  it ,  of  course )  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_tlb_page ( mpnt ,  addr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2014-04-09 19:49:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( old_addr  = =  0  | |  ( old_addr  &  ( SHM_COLOUR  -  1 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												      ! =  ( addr  &  ( SHM_COLOUR  -  1 ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											__flush_cache_page ( mpnt ,  addr ,  page_to_phys ( page ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( old_addr ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-04-15 12:37:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												printk ( KERN_ERR  " INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s \n " ,  old_addr ,  addr ,  mpnt - > vm_file  ?  ( char  * ) mpnt - > vm_file - > f_path . dentry - > d_name . name  :  " (null) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-22 10:22:11 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											old_addr  =  addr ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-29 18:16:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_dcache_mmap_unlock ( mapping ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_dcache_page ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* Defined in arch/parisc/kernel/pacache.S */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_kernel_dcache_range_asm ) ;  
						 
					
						
							
								
									
										
										
										
											2006-03-22 09:42:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_kernel_dcache_page_asm ) ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_data_cache_local ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_kernel_icache_range_asm ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define FLUSH_THRESHOLD 0x80000  /* 0.5MB */ 
  
						 
					
						
							
								
									
										
										
										
											2006-01-10 20:35:03 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								int  parisc_cache_flush_threshold  __read_mostly  =  FLUSH_THRESHOLD ;  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  __init  parisc_setup_cache_timing ( void )  
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  rangetime ,  alltime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									alltime  =  mfctl ( 16 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_data_cache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									alltime  =  mfctl ( 16 )  -  alltime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 22:44:14 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									size  =  ( unsigned  long ) ( _end  -  _text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									rangetime  =  mfctl ( 16 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-10-21 22:44:14 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flush_kernel_dcache_range ( ( unsigned  long ) _text ,  size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									rangetime  =  mfctl ( 16 )  -  rangetime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									printk ( KERN_DEBUG  " Whole cache flush %lu cycles, flushing %lu bytes %lu cycles \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										alltime ,  size ,  rangetime ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Racy, but if we see an intermediate value, it's ok too... */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									parisc_cache_flush_threshold  =  size  *  alltime  /  rangetime ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									parisc_cache_flush_threshold  =  ( parisc_cache_flush_threshold  +  L1_CACHE_BYTES  -  1 )  & ~  ( L1_CACHE_BYTES  -  1 ) ;  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! parisc_cache_flush_threshold ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										parisc_cache_flush_threshold  =  FLUSH_THRESHOLD ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( parisc_cache_flush_threshold  >  cache_info . dc_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										parisc_cache_flush_threshold  =  cache_info . dc_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-03-27 19:52:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									printk ( KERN_INFO  " Setting cache flush threshold to %x (%d CPUs online) \n " ,  parisc_cache_flush_threshold ,  num_online_cpus ( ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2005-04-16 15:20:36 -07:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-03 22:59:09 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								extern  void  purge_kernel_dcache_page_asm ( unsigned  long ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								extern  void  clear_user_page_asm ( void  * ,  unsigned  long ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								extern  void  copy_user_page_asm ( void  * ,  void  * ,  unsigned  long ) ;  
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  flush_kernel_dcache_page_addr ( void  * addr )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2009-06-16 20:51:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									flush_kernel_dcache_page_asm ( addr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-16 20:51:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									purge_tlb_start ( flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pdtlb_kernel ( addr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-16 20:51:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									purge_tlb_end ( flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-08-23 09:00:04 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( flush_kernel_dcache_page_addr ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2014-01-31 21:33:17 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  copy_user_page ( void  * vto ,  void  * vfrom ,  unsigned  long  vaddr ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  page  * pg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       /* Copy using kernel mapping.  No coherency is needed (all in
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									  kunmap )  for  the  ` to '  page .   However ,  the  ` from '  page  needs  to 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									  be  flushed  through  a  mapping  equivalent  to  the  user  mapping 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									  before  it  can  be  accessed  through  the  kernel  mapping .  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									preempt_disable ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_dcache_page_asm ( __pa ( vfrom ) ,  vaddr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									preempt_enable ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									copy_page_asm ( vto ,  vfrom ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( copy_user_page ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 19:45:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  purge_tlb_entries ( struct  mm_struct  * mm ,  unsigned  long  addr )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									/* Note: purge_tlb_entries can be called at startup with
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   no  context .   */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									purge_tlb_start ( flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-23 22:42:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									mtsp ( mm - > context ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-14 19:45:00 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pdtlb ( addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pitlb ( addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									purge_tlb_end ( flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								EXPORT_SYMBOL ( purge_tlb_entries ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  __flush_tlb_range ( unsigned  long  sid ,  unsigned  long  start ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										       unsigned  long  end ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  npages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									npages  =  ( ( end  -  ( start  &  PAGE_MASK ) )  +  ( PAGE_SIZE  -  1 ) )  > >  PAGE_SHIFT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( npages  > =  512 )   /* 2MB of space: arbitrary, should be tuned */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_tlb_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else  { 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-16 20:51:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										unsigned  long  flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										purge_tlb_start ( flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-29 16:42:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										mtsp ( sid ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( split_tlb )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( npages - - )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pdtlb ( start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pitlb ( start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												start  + =  PAGE_SIZE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											while  ( npages - - )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												pdtlb ( start ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												start  + =  PAGE_SIZE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-06-16 20:51:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										purge_tlb_end ( flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  cacheflush_h_tmp_function ( void  * dummy )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									flush_cache_all_local ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  flush_cache_all ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2008-05-09 09:39:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									on_each_cpu ( cacheflush_h_tmp_function ,  NULL ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-03 23:01:47 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  unsigned  long  mm_total_size ( struct  mm_struct  * mm )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									struct  vm_area_struct  * vma ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  long  usize  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( vma  =  mm - > mmap ;  vma ;  vma  =  vma - > vm_next ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										usize  + =  vma - > vm_end  -  vma - > vm_start ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  usize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  inline  pte_t  * get_ptep ( pgd_t  * pgd ,  unsigned  long  addr )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pte_t  * ptep  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! pgd_none ( * pgd ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pud_t  * pud  =  pud_offset ( pgd ,  addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! pud_none ( * pud ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pmd_t  * pmd  =  pmd_offset ( pud ,  addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! pmd_none ( * pmd ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												ptep  =  pte_offset_map ( pmd ,  addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  ptep ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  flush_cache_mm ( struct  mm_struct  * mm )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									struct  vm_area_struct  * vma ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pgd_t  * pgd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-02-03 23:01:47 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									/* Flushing the whole cache on each cpu takes forever on
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									   rp3440 ,  etc .   So ,  avoid  it  if  the  mm  isn ' t  too  big .   */ 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( mm_total_size ( mm )  > =  parisc_cache_flush_threshold )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_cache_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( mm - > context  = =  mfsp ( 3 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( vma  =  mm - > mmap ;  vma ;  vma  =  vma - > vm_next )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											flush_user_dcache_range_asm ( vma - > vm_start ,  vma - > vm_end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ( vma - > vm_flags  &  VM_EXEC )  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											flush_user_icache_range_asm ( vma - > vm_start ,  vma - > vm_end ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-03 23:01:47 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pgd  =  mm - > pgd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( vma  =  mm - > mmap ;  vma ;  vma  =  vma - > vm_next )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  addr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( addr  =  vma - > vm_start ;  addr  <  vma - > vm_end ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										     addr  + =  PAGE_SIZE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  long  pfn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pte_t  * ptep  =  get_ptep ( pgd ,  addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! ptep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											pfn  =  pte_pfn ( * ptep ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( ! pfn_valid ( pfn ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											__flush_cache_page ( vma ,  addr ,  PFN_PHYS ( pfn ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_user_dcache_range ( unsigned  long  start ,  unsigned  long  end )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( end  -  start )  <  parisc_cache_flush_threshold ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_user_dcache_range_asm ( start , end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_data_cache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_user_icache_range ( unsigned  long  start ,  unsigned  long  end )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ( end  -  start )  <  parisc_cache_flush_threshold ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_user_icache_range_asm ( start , end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_instruction_cache ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  flush_cache_range ( struct  vm_area_struct  * vma ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  start ,  unsigned  long  end ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  long  addr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pgd_t  * pgd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-01-06 12:57:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									BUG_ON ( ! vma - > vm_mm - > context ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( end  -  start )  > =  parisc_cache_flush_threshold )  { 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										flush_cache_all ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( vma - > vm_mm - > context  = =  mfsp ( 3 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_user_dcache_range_asm ( start ,  end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( vma - > vm_flags  &  VM_EXEC ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											flush_user_icache_range_asm ( start ,  end ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pgd  =  vma - > vm_mm - > pgd ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( addr  =  start  &  PAGE_MASK ;  addr  <  end ;  addr  + =  PAGE_SIZE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unsigned  long  pfn ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pte_t  * ptep  =  get_ptep ( pgd ,  addr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ! ptep ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										pfn  =  pte_pfn ( * ptep ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( pfn_valid ( pfn ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											__flush_cache_page ( vma ,  addr ,  PFN_PHYS ( pfn ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								flush_cache_page ( struct  vm_area_struct  * vma ,  unsigned  long  vmaddr ,  unsigned  long  pfn )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									BUG_ON ( ! vma - > vm_mm - > context ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 12:27:52 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( pfn_valid ( pfn ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										flush_tlb_page ( vma ,  vmaddr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										__flush_cache_page ( vma ,  vmaddr ,  PFN_PHYS ( pfn ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2006-12-12 05:51:54 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}