diff options
Diffstat (limited to 'arch/sh/mm/tlb-pteaex.c')
| -rw-r--r-- | arch/sh/mm/tlb-pteaex.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/sh/mm/tlb-pteaex.c b/arch/sh/mm/tlb-pteaex.c index 32dc674c550..b71db6af806 100644 --- a/arch/sh/mm/tlb-pteaex.c +++ b/arch/sh/mm/tlb-pteaex.c @@ -73,5 +73,35 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)  	jump_to_uncached();  	__raw_writel(page, MMU_UTLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT);  	__raw_writel(asid, MMU_UTLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT); +	__raw_writel(page, MMU_ITLB_ADDRESS_ARRAY | MMU_PAGE_ASSOC_BIT); +	__raw_writel(asid, MMU_ITLB_ADDRESS_ARRAY2 | MMU_PAGE_ASSOC_BIT);  	back_to_cached();  } + +void local_flush_tlb_all(void) +{ +	unsigned long flags, status; +	int i; + +	/* +	 * Flush all the TLB. +	 */ +	local_irq_save(flags); +	jump_to_uncached(); + +	status = __raw_readl(MMUCR); +	status = ((status & MMUCR_URB) >> MMUCR_URB_SHIFT); + +	if (status == 0) +		status = MMUCR_URB_NENTRIES; + +	for (i = 0; i < status; i++) +		__raw_writel(0x0, MMU_UTLB_ADDRESS_ARRAY | (i << 8)); + +	for (i = 0; i < 4; i++) +		__raw_writel(0x0, MMU_ITLB_ADDRESS_ARRAY | (i << 8)); + +	back_to_cached(); +	ctrl_barrier(); +	local_irq_restore(flags); +}  |