diff options
Diffstat (limited to 'arch/mips/mm')
| -rw-r--r-- | arch/mips/mm/dma-default.c | 23 | ||||
| -rw-r--r-- | arch/mips/mm/mmap.c | 2 | ||||
| -rw-r--r-- | arch/mips/mm/pgtable-32.c | 6 | 
3 files changed, 22 insertions, 9 deletions
| diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c index fe8df14b6169..e08598c70b3e 100644 --- a/arch/mips/mm/dma-default.c +++ b/arch/mips/mm/dma-default.c @@ -68,12 +68,25 @@ static inline struct page *dma_addr_to_page(struct device *dev,   * systems and only the R10000 and R12000 are used in such systems, the   * SGI IP28 Indigo² rsp. SGI IP32 aka O2.   */ -static inline int cpu_needs_post_dma_flush(struct device *dev) +static inline bool cpu_needs_post_dma_flush(struct device *dev)  { -	return !plat_device_is_coherent(dev) && -	       (boot_cpu_type() == CPU_R10000 || -		boot_cpu_type() == CPU_R12000 || -		boot_cpu_type() == CPU_BMIPS5000); +	if (plat_device_is_coherent(dev)) +		return false; + +	switch (boot_cpu_type()) { +	case CPU_R10000: +	case CPU_R12000: +	case CPU_BMIPS5000: +		return true; + +	default: +		/* +		 * Presence of MAARs suggests that the CPU supports +		 * speculatively prefetching data, and therefore requires +		 * the post-DMA flush/invalidate. +		 */ +		return cpu_has_maar; +	}  }  static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp) diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c index 64dd8bdd92c3..28adeabe851f 100644 --- a/arch/mips/mm/mmap.c +++ b/arch/mips/mm/mmap.c @@ -93,7 +93,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,  		vma = find_vma(mm, addr);  		if (TASK_SIZE - len >= addr && -		    (!vma || addr + len <= vma->vm_start)) +		    (!vma || addr + len <= vm_start_gap(vma)))  			return addr;  	} diff --git a/arch/mips/mm/pgtable-32.c b/arch/mips/mm/pgtable-32.c index adc6911ba748..b19a3c506b1e 100644 --- a/arch/mips/mm/pgtable-32.c +++ b/arch/mips/mm/pgtable-32.c @@ -51,15 +51,15 @@ void __init pagetable_init(void)  	/*  	 * Fixed mappings:  	 */ -	vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; -	fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base); +	vaddr = __fix_to_virt(__end_of_fixed_addresses - 1); +	fixrange_init(vaddr & PMD_MASK, vaddr + FIXADDR_SIZE, pgd_base);  #ifdef CONFIG_HIGHMEM  	/*  	 * Permanent kmaps:  	 */  	vaddr = PKMAP_BASE; -	fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base); +	fixrange_init(vaddr & PMD_MASK, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);  	pgd = swapper_pg_dir + __pgd_offset(vaddr);  	pud = pud_offset(pgd, vaddr); |