diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /arch/sh/mm | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/sh/mm')
| -rw-r--r-- | arch/sh/mm/consistent.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/hugetlbpage.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/init.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/ioremap.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/ioremap_fixed.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/pgtable.c | 1 | ||||
| -rw-r--r-- | arch/sh/mm/pmb.c | 5 | ||||
| -rw-r--r-- | arch/sh/mm/tlb-pteaex.c | 30 | ||||
| -rw-r--r-- | arch/sh/mm/tlb-sh3.c | 19 | ||||
| -rw-r--r-- | arch/sh/mm/tlb-sh4.c | 28 | ||||
| -rw-r--r-- | arch/sh/mm/tlb-urb.c | 22 | ||||
| -rw-r--r-- | arch/sh/mm/tlbflush_32.c | 19 | ||||
| -rw-r--r-- | arch/sh/mm/uncached.c | 9 | 
13 files changed, 110 insertions, 28 deletions
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index 902967e3f84..c86a0854025 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c @@ -16,6 +16,7 @@  #include <linux/dma-debug.h>  #include <linux/io.h>  #include <linux/module.h> +#include <linux/gfp.h>  #include <asm/cacheflush.h>  #include <asm/addrspace.h> diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c index 9304117039c..9163db3e8d1 100644 --- a/arch/sh/mm/hugetlbpage.c +++ b/arch/sh/mm/hugetlbpage.c @@ -13,7 +13,6 @@  #include <linux/mm.h>  #include <linux/hugetlb.h>  #include <linux/pagemap.h> -#include <linux/slab.h>  #include <linux/sysctl.h>  #include <asm/mman.h> diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c index 68028e8f26c..c505de61a5c 100644 --- a/arch/sh/mm/init.c +++ b/arch/sh/mm/init.c @@ -10,6 +10,7 @@  #include <linux/mm.h>  #include <linux/swap.h>  #include <linux/init.h> +#include <linux/gfp.h>  #include <linux/bootmem.h>  #include <linux/proc_fs.h>  #include <linux/pagemap.h> diff --git a/arch/sh/mm/ioremap.c b/arch/sh/mm/ioremap.c index 1ab2385ecef..0c99ec2e7ed 100644 --- a/arch/sh/mm/ioremap.c +++ b/arch/sh/mm/ioremap.c @@ -14,6 +14,7 @@   */  #include <linux/vmalloc.h>  #include <linux/module.h> +#include <linux/slab.h>  #include <linux/mm.h>  #include <linux/pci.h>  #include <linux/io.h> diff --git a/arch/sh/mm/ioremap_fixed.c b/arch/sh/mm/ioremap_fixed.c index 7f682e5dafc..efbe84af998 100644 --- a/arch/sh/mm/ioremap_fixed.c +++ b/arch/sh/mm/ioremap_fixed.c @@ -15,7 +15,6 @@  #include <linux/io.h>  #include <linux/bootmem.h>  #include <linux/proc_fs.h> -#include <linux/slab.h>  #include <asm/fixmap.h>  #include <asm/page.h>  #include <asm/pgalloc.h> diff --git a/arch/sh/mm/pgtable.c b/arch/sh/mm/pgtable.c index 6f21fb1d872..26e03a1f7ca 100644 --- a/arch/sh/mm/pgtable.c +++ b/arch/sh/mm/pgtable.c @@ -1,4 +1,5 @@  #include <linux/mm.h> +#include <linux/slab.h>  #define PGALLOC_GFP GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO diff --git a/arch/sh/mm/pmb.c b/arch/sh/mm/pmb.c index a4662e2782c..e43ec600afc 100644 --- a/arch/sh/mm/pmb.c +++ b/arch/sh/mm/pmb.c @@ -15,7 +15,6 @@  #include <linux/sysdev.h>  #include <linux/cpu.h>  #include <linux/module.h> -#include <linux/slab.h>  #include <linux/bitops.h>  #include <linux/debugfs.h>  #include <linux/fs.h> @@ -323,6 +322,7 @@ static void __clear_pmb_entry(struct pmb_entry *pmbe)  	writel_uncached(data_val & ~PMB_V, data);  } +#ifdef CONFIG_PM  static void set_pmb_entry(struct pmb_entry *pmbe)  {  	unsigned long flags; @@ -331,6 +331,7 @@ static void set_pmb_entry(struct pmb_entry *pmbe)  	__set_pmb_entry(pmbe);  	spin_unlock_irqrestore(&pmbe->lock, flags);  } +#endif /* CONFIG_PM */  int pmb_bolt_mapping(unsigned long vaddr, phys_addr_t phys,  		     unsigned long size, pgprot_t prot) @@ -802,7 +803,7 @@ void __init pmb_init(void)  	writel_uncached(0, PMB_IRMCR);  	/* Flush out the TLB */ -	__raw_writel(__raw_readl(MMUCR) | MMUCR_TI, MMUCR); +	local_flush_tlb_all();  	ctrl_barrier();  } 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); +} diff --git a/arch/sh/mm/tlb-sh3.c b/arch/sh/mm/tlb-sh3.c index 4f5f7cbdd50..7a940dbfc2e 100644 --- a/arch/sh/mm/tlb-sh3.c +++ b/arch/sh/mm/tlb-sh3.c @@ -77,3 +77,22 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)  	for (i = 0; i < ways; i++)  		__raw_writel(data, addr + (i << 8));  } + +void local_flush_tlb_all(void) +{ +	unsigned long flags, status; + +	/* +	 * Flush all the TLB. +	 * +	 * Write to the MMU control register's bit: +	 *	TF-bit for SH-3, TI-bit for SH-4. +	 *      It's same position, bit #2. +	 */ +	local_irq_save(flags); +	status = __raw_readl(MMUCR); +	status |= 0x04; +	__raw_writel(status, MMUCR); +	ctrl_barrier(); +	local_irq_restore(flags); +} diff --git a/arch/sh/mm/tlb-sh4.c b/arch/sh/mm/tlb-sh4.c index ccac77f504a..cfdf7930d29 100644 --- a/arch/sh/mm/tlb-sh4.c +++ b/arch/sh/mm/tlb-sh4.c @@ -80,3 +80,31 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)  	__raw_writel(data, addr);  	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); +} diff --git a/arch/sh/mm/tlb-urb.c b/arch/sh/mm/tlb-urb.c index bb5b9098956..c92ce20db39 100644 --- a/arch/sh/mm/tlb-urb.c +++ b/arch/sh/mm/tlb-urb.c @@ -24,13 +24,9 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)  	local_irq_save(flags); -	/* Load the entry into the TLB */ -	__update_tlb(vma, addr, pte); - -	/* ... and wire it up. */  	status = __raw_readl(MMUCR);  	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. @@ -39,7 +35,23 @@ void tlb_wire_entry(struct vm_area_struct *vma, unsigned long addr, pte_t pte)  	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); +  	__raw_writel(status, MMUCR);  	ctrl_barrier(); diff --git a/arch/sh/mm/tlbflush_32.c b/arch/sh/mm/tlbflush_32.c index 004bb3f25b5..3fbe03ce8fe 100644 --- a/arch/sh/mm/tlbflush_32.c +++ b/arch/sh/mm/tlbflush_32.c @@ -119,22 +119,3 @@ void local_flush_tlb_mm(struct mm_struct *mm)  		local_irq_restore(flags);  	}  } - -void local_flush_tlb_all(void) -{ -	unsigned long flags, status; - -	/* -	 * Flush all the TLB. -	 * -	 * Write to the MMU control register's bit: -	 *	TF-bit for SH-3, TI-bit for SH-4. -	 *      It's same position, bit #2. -	 */ -	local_irq_save(flags); -	status = __raw_readl(MMUCR); -	status |= 0x04; -	__raw_writel(status, MMUCR); -	ctrl_barrier(); -	local_irq_restore(flags); -} diff --git a/arch/sh/mm/uncached.c b/arch/sh/mm/uncached.c index cf20a5c5136..8a4eca551fc 100644 --- a/arch/sh/mm/uncached.c +++ b/arch/sh/mm/uncached.c @@ -1,6 +1,8 @@  #include <linux/init.h> +#include <linux/module.h>  #include <asm/sizes.h>  #include <asm/page.h> +#include <asm/addrspace.h>  /*   * This is the offset of the uncached section from its cached alias. @@ -15,15 +17,22 @@  unsigned long cached_to_uncached = SZ_512M;  unsigned long uncached_size = SZ_512M;  unsigned long uncached_start, uncached_end; +EXPORT_SYMBOL(uncached_start); +EXPORT_SYMBOL(uncached_end);  int virt_addr_uncached(unsigned long kaddr)  {  	return (kaddr >= uncached_start) && (kaddr < uncached_end);  } +EXPORT_SYMBOL(virt_addr_uncached);  void __init uncached_init(void)  { +#ifdef CONFIG_29BIT +	uncached_start = P2SEG; +#else  	uncached_start = memory_end; +#endif  	uncached_end = uncached_start + uncached_size;  }  |