sh: update the TLB replacement counter for entry wiring.
Presently the TLB wiring code depends on MMUCR.URB for working out where to place the wired entry, but fails to take the replacment counter in to consideration. This fixes up the wiring logic and ensures that wired entries remain so. Signed-off-by: Matt Fleming <matt@console-pimps.org> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
		
					parent
					
						
							
								01e77706cd
							
						
					
				
			
			
				commit
				
					
						4539282dbc
					
				
			
		
					 2 changed files with 19 additions and 5 deletions
				
			
		| 
						 | 
					@ -30,6 +30,8 @@
 | 
				
			||||||
#define MMUCR_URB		0x00FC0000
 | 
					#define MMUCR_URB		0x00FC0000
 | 
				
			||||||
#define MMUCR_URB_SHIFT		18
 | 
					#define MMUCR_URB_SHIFT		18
 | 
				
			||||||
#define MMUCR_URB_NENTRIES	64
 | 
					#define MMUCR_URB_NENTRIES	64
 | 
				
			||||||
 | 
					#define MMUCR_URC		0x0000FC00
 | 
				
			||||||
 | 
					#define MMUCR_URC_SHIFT		10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40)
 | 
					#if defined(CONFIG_32BIT) && defined(CONFIG_CPU_SUBTYPE_ST40)
 | 
				
			||||||
#define MMUCR_SE		(1 << 4)
 | 
					#define MMUCR_SE		(1 << 4)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,13 +24,9 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_irq_save(flags);
 | 
						local_irq_save(flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Load the entry into the TLB */
 | 
					 | 
				
			||||||
	__update_tlb(vma, addr, pte);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* ... and wire it up. */
 | 
					 | 
				
			||||||
	status = __raw_readl(MMUCR);
 | 
						status = __raw_readl(MMUCR);
 | 
				
			||||||
	urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT;
 | 
						urb = (status & MMUCR_URB) >> MMUCR_URB_SHIFT;
 | 
				
			||||||
	status &= ~MMUCR_URB;
 | 
						status &= ~MMUCR_URC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Make sure we're not trying to wire the last TLB entry slot.
 | 
						 * Make sure we're not trying to wire the last TLB entry slot.
 | 
				
			||||||
| 
						 | 
					@ -39,7 +35,23 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	urb = urb % MMUCR_URB_NENTRIES;
 | 
						urb = urb % MMUCR_URB_NENTRIES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Insert this entry into the highest non-wired TLB slot (via
 | 
				
			||||||
 | 
						 * the URC field).
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						status |= (urb << MMUCR_URC_SHIFT);
 | 
				
			||||||
 | 
						__raw_writel(status, MMUCR);
 | 
				
			||||||
 | 
						ctrl_barrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Load the entry into the TLB */
 | 
				
			||||||
 | 
						__update_tlb(vma, addr, pte);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* ... and wire it up. */
 | 
				
			||||||
 | 
						status = __raw_readl(MMUCR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						status &= ~MMUCR_URB;
 | 
				
			||||||
	status |= (urb << MMUCR_URB_SHIFT);
 | 
						status |= (urb << MMUCR_URB_SHIFT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__raw_writel(status, MMUCR);
 | 
						__raw_writel(status, MMUCR);
 | 
				
			||||||
	ctrl_barrier();
 | 
						ctrl_barrier();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue