diff options
Diffstat (limited to 'arch/arm/mm')
| -rw-r--r-- | arch/arm/mm/Kconfig | 5 | ||||
| -rw-r--r-- | arch/arm/mm/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/mm/cache-feroceon-l2.c | 1 | ||||
| -rw-r--r-- | arch/arm/mm/cache-v3.S | 137 | ||||
| -rw-r--r-- | arch/arm/mm/cache-v4.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/init.c | 50 | ||||
| -rw-r--r-- | arch/arm/mm/mmu.c | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-arm740.S | 30 | ||||
| -rw-r--r-- | arch/arm/mm/proc-arm920.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-arm926.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-mohawk.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-sa1100.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-syms.c | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-v6.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-xsc3.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/proc-xscale.S | 2 | ||||
| -rw-r--r-- | arch/arm/mm/tcm.h | 17 | 
17 files changed, 65 insertions, 196 deletions
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 025d1732873..4045c4931a3 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -43,7 +43,7 @@ config CPU_ARM740T  	depends on !MMU  	select CPU_32v4T  	select CPU_ABRT_LV4T -	select CPU_CACHE_V3	# although the core is v4t +	select CPU_CACHE_V4  	select CPU_CP15_MPU  	select CPU_PABRT_LEGACY  	help @@ -469,9 +469,6 @@ config CPU_PABRT_V7  	bool  # The cache model -config CPU_CACHE_V3 -	bool -  config CPU_CACHE_V4  	bool diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 4e333fa2756..9e51be96f63 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile @@ -33,7 +33,6 @@ obj-$(CONFIG_CPU_PABRT_LEGACY)	+= pabort-legacy.o  obj-$(CONFIG_CPU_PABRT_V6)	+= pabort-v6.o  obj-$(CONFIG_CPU_PABRT_V7)	+= pabort-v7.o -obj-$(CONFIG_CPU_CACHE_V3)	+= cache-v3.o  obj-$(CONFIG_CPU_CACHE_V4)	+= cache-v4.o  obj-$(CONFIG_CPU_CACHE_V4WT)	+= cache-v4wt.o  obj-$(CONFIG_CPU_CACHE_V4WB)	+= cache-v4wb.o diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index dd3d59122cc..48bc3c0a87c 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c @@ -343,6 +343,7 @@ void __init feroceon_l2_init(int __l2_wt_override)  	outer_cache.inv_range = feroceon_l2_inv_range;  	outer_cache.clean_range = feroceon_l2_clean_range;  	outer_cache.flush_range = feroceon_l2_flush_range; +	outer_cache.inv_all = l2_inv_all;  	enable_l2(); diff --git a/arch/arm/mm/cache-v3.S b/arch/arm/mm/cache-v3.S deleted file mode 100644 index 8a3fadece8d..00000000000 --- a/arch/arm/mm/cache-v3.S +++ /dev/null @@ -1,137 +0,0 @@ -/* - *  linux/arch/arm/mm/cache-v3.S - * - *  Copyright (C) 1997-2002 Russell king - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -#include <linux/linkage.h> -#include <linux/init.h> -#include <asm/page.h> -#include "proc-macros.S" - -/* - *	flush_icache_all() - * - *	Unconditionally clean and invalidate the entire icache. - */ -ENTRY(v3_flush_icache_all) -	mov	pc, lr -ENDPROC(v3_flush_icache_all) - -/* - *	flush_user_cache_all() - * - *	Invalidate all cache entries in a particular address - *	space. - * - *	- mm	- mm_struct describing address space - */ -ENTRY(v3_flush_user_cache_all) -	/* FALLTHROUGH */ -/* - *	flush_kern_cache_all() - * - *	Clean and invalidate the entire cache. - */ -ENTRY(v3_flush_kern_cache_all) -	/* FALLTHROUGH */ - -/* - *	flush_user_cache_range(start, end, flags) - * - *	Invalidate a range of cache entries in the specified - *	address space. - * - *	- start - start address (may not be aligned) - *	- end	- end address (exclusive, may not be aligned) - *	- flags	- vma_area_struct flags describing address space - */ -ENTRY(v3_flush_user_cache_range) -	mov	ip, #0 -	mcreq	p15, 0, ip, c7, c0, 0		@ flush ID cache -	mov	pc, lr - -/* - *	coherent_kern_range(start, end) - * - *	Ensure coherency between the Icache and the Dcache in the - *	region described by start.  If you have non-snooping - *	Harvard caches, you need to implement this function. - * - *	- start  - virtual start address - *	- end	 - virtual end address - */ -ENTRY(v3_coherent_kern_range) -	/* FALLTHROUGH */ - -/* - *	coherent_user_range(start, end) - * - *	Ensure coherency between the Icache and the Dcache in the - *	region described by start.  If you have non-snooping - *	Harvard caches, you need to implement this function. - * - *	- start  - virtual start address - *	- end	 - virtual end address - */ -ENTRY(v3_coherent_user_range) -	mov	r0, #0 -	mov	pc, lr - -/* - *	flush_kern_dcache_area(void *page, size_t size) - * - *	Ensure no D cache aliasing occurs, either with itself or - *	the I cache - * - *	- addr	- kernel address - *	- size	- region size - */ -ENTRY(v3_flush_kern_dcache_area) -	/* FALLTHROUGH */ - -/* - *	dma_flush_range(start, end) - * - *	Clean and invalidate the specified virtual address range. - * - *	- start  - virtual start address - *	- end	 - virtual end address - */ -ENTRY(v3_dma_flush_range) -	mov	r0, #0 -	mcr	p15, 0, r0, c7, c0, 0		@ flush ID cache -	mov	pc, lr - -/* - *	dma_unmap_area(start, size, dir) - *	- start	- kernel virtual start address - *	- size	- size of region - *	- dir	- DMA direction - */ -ENTRY(v3_dma_unmap_area) -	teq	r2, #DMA_TO_DEVICE -	bne	v3_dma_flush_range -	/* FALLTHROUGH */ - -/* - *	dma_map_area(start, size, dir) - *	- start	- kernel virtual start address - *	- size	- size of region - *	- dir	- DMA direction - */ -ENTRY(v3_dma_map_area) -	mov	pc, lr -ENDPROC(v3_dma_unmap_area) -ENDPROC(v3_dma_map_area) - -	.globl	v3_flush_kern_cache_louis -	.equ	v3_flush_kern_cache_louis, v3_flush_kern_cache_all - -	__INITDATA - -	@ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S) -	define_cache_functions v3 diff --git a/arch/arm/mm/cache-v4.S b/arch/arm/mm/cache-v4.S index 43e5d77be67..a7ba68f59f0 100644 --- a/arch/arm/mm/cache-v4.S +++ b/arch/arm/mm/cache-v4.S @@ -58,7 +58,7 @@ ENTRY(v4_flush_kern_cache_all)  ENTRY(v4_flush_user_cache_range)  #ifdef CONFIG_CPU_CP15  	mov	ip, #0 -	mcreq	p15, 0, ip, c7, c7, 0		@ flush ID cache +	mcr	p15, 0, ip, c7, c7, 0		@ flush ID cache  	mov	pc, lr  #else  	/* FALLTHROUGH */ diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index ad722f1208a..9a5cdc01fcd 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -99,6 +99,9 @@ void show_mem(unsigned int filter)  	printk("Mem-info:\n");  	show_free_areas(filter); +	if (filter & SHOW_MEM_FILTER_PAGE_COUNT) +		return; +  	for_each_bank (i, mi) {  		struct membank *bank = &mi->bank[i];  		unsigned int pfn1, pfn2; @@ -424,24 +427,6 @@ void __init bootmem_init(void)  	max_pfn = max_high - PHYS_PFN_OFFSET;  } -static inline int free_area(unsigned long pfn, unsigned long end, char *s) -{ -	unsigned int pages = 0, size = (end - pfn) << (PAGE_SHIFT - 10); - -	for (; pfn < end; pfn++) { -		struct page *page = pfn_to_page(pfn); -		ClearPageReserved(page); -		init_page_count(page); -		__free_page(page); -		pages++; -	} - -	if (size && s) -		printk(KERN_INFO "Freeing %s memory: %dK\n", s, size); - -	return pages; -} -  /*   * Poison init memory with an undefined instruction (ARM) or a branch to an   * undefined instruction (Thumb). @@ -534,6 +519,14 @@ static void __init free_unused_memmap(struct meminfo *mi)  #endif  } +#ifdef CONFIG_HIGHMEM +static inline void free_area_high(unsigned long pfn, unsigned long end) +{ +	for (; pfn < end; pfn++) +		free_highmem_page(pfn_to_page(pfn)); +} +#endif +  static void __init free_highpages(void)  {  #ifdef CONFIG_HIGHMEM @@ -569,8 +562,7 @@ static void __init free_highpages(void)  			if (res_end > end)  				res_end = end;  			if (res_start != start) -				totalhigh_pages += free_area(start, res_start, -							     NULL); +				free_area_high(start, res_start);  			start = res_end;  			if (start == end)  				break; @@ -578,9 +570,8 @@ static void __init free_highpages(void)  		/* And now free anything which remains */  		if (start < end) -			totalhigh_pages += free_area(start, end, NULL); +			free_area_high(start, end);  	} -	totalram_pages += totalhigh_pages;  #endif  } @@ -609,8 +600,7 @@ void __init mem_init(void)  #ifdef CONFIG_SA1111  	/* now that our DMA memory is actually so designated, we can free it */ -	totalram_pages += free_area(PHYS_PFN_OFFSET, -				    __phys_to_pfn(__pa(swapper_pg_dir)), NULL); +	free_reserved_area(__va(PHYS_PFN_OFFSET), swapper_pg_dir, 0, NULL);  #endif  	free_highpages(); @@ -738,16 +728,12 @@ void free_initmem(void)  	extern char __tcm_start, __tcm_end;  	poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start); -	totalram_pages += free_area(__phys_to_pfn(__pa(&__tcm_start)), -				    __phys_to_pfn(__pa(&__tcm_end)), -				    "TCM link"); +	free_reserved_area(&__tcm_start, &__tcm_end, 0, "TCM link");  #endif  	poison_init_mem(__init_begin, __init_end - __init_begin);  	if (!machine_is_integrator() && !machine_is_cintegrator()) -		totalram_pages += free_area(__phys_to_pfn(__pa(__init_begin)), -					    __phys_to_pfn(__pa(__init_end)), -					    "init"); +		free_initmem_default(0);  }  #ifdef CONFIG_BLK_DEV_INITRD @@ -758,9 +744,7 @@ void free_initrd_mem(unsigned long start, unsigned long end)  {  	if (!keep_initrd) {  		poison_init_mem((void *)start, PAGE_ALIGN(end) - start); -		totalram_pages += free_area(__phys_to_pfn(__pa(start)), -					    __phys_to_pfn(__pa(end)), -					    "initrd"); +		free_reserved_area(start, end, 0, "initrd");  	}  } diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 78978945492..a84ff763ac3 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -34,6 +34,7 @@  #include <asm/mach/pci.h>  #include "mm.h" +#include "tcm.h"  /*   * empty_zero_page is a special page that is used for @@ -1277,6 +1278,7 @@ void __init paging_init(struct machine_desc *mdesc)  	dma_contiguous_remap();  	devicemaps_init(mdesc);  	kmap_init(); +	tcm_init();  	top_pmd = pmd_off_k(0xffff0000); diff --git a/arch/arm/mm/proc-arm740.S b/arch/arm/mm/proc-arm740.S index dc5de5d53f2..fde2d2a794c 100644 --- a/arch/arm/mm/proc-arm740.S +++ b/arch/arm/mm/proc-arm740.S @@ -77,24 +77,27 @@ __arm740_setup:  	mcr	p15, 0, r0, c6,	c0		@ set area 0, default  	ldr	r0, =(CONFIG_DRAM_BASE & 0xFFFFF000) @ base[31:12] of RAM -	ldr	r1, =(CONFIG_DRAM_SIZE >> 12)	@ size of RAM (must be >= 4KB) -	mov	r2, #10				@ 11 is the minimum (4KB) -1:	add	r2, r2, #1			@ area size *= 2 -	mov	r1, r1, lsr #1 +	ldr	r3, =(CONFIG_DRAM_SIZE >> 12)	@ size of RAM (must be >= 4KB) +	mov	r4, #10				@ 11 is the minimum (4KB) +1:	add	r4, r4, #1			@ area size *= 2 +	movs	r3, r3, lsr #1  	bne	1b				@ count not zero r-shift -	orr	r0, r0, r2, lsl #1		@ the area register value +	orr	r0, r0, r4, lsl #1		@ the area register value  	orr	r0, r0, #1			@ set enable bit  	mcr	p15, 0, r0, c6,	c1		@ set area 1, RAM  	ldr	r0, =(CONFIG_FLASH_MEM_BASE & 0xFFFFF000) @ base[31:12] of FLASH -	ldr	r1, =(CONFIG_FLASH_SIZE >> 12)	@ size of FLASH (must be >= 4KB) -	mov	r2, #10				@ 11 is the minimum (4KB) -1:	add	r2, r2, #1			@ area size *= 2 -	mov	r1, r1, lsr #1 +	ldr	r3, =(CONFIG_FLASH_SIZE >> 12)	@ size of FLASH (must be >= 4KB) +	cmp	r3, #0 +	moveq	r0, #0 +	beq	2f +	mov	r4, #10				@ 11 is the minimum (4KB) +1:	add	r4, r4, #1			@ area size *= 2 +	movs	r3, r3, lsr #1  	bne	1b				@ count not zero r-shift -	orr	r0, r0, r2, lsl #1		@ the area register value +	orr	r0, r0, r4, lsl #1		@ the area register value  	orr	r0, r0, #1			@ set enable bit -	mcr	p15, 0, r0, c6,	c2		@ set area 2, ROM/FLASH +2:	mcr	p15, 0, r0, c6,	c2		@ set area 2, ROM/FLASH  	mov	r0, #0x06  	mcr	p15, 0, r0, c2, c0		@ Region 1&2 cacheable @@ -137,13 +140,14 @@ __arm740_proc_info:  	.long	0x41807400  	.long	0xfffffff0  	.long	0 +	.long	0  	b	__arm740_setup  	.long	cpu_arch_name  	.long	cpu_elf_name -	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_26BIT +	.long	HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_26BIT  	.long	cpu_arm740_name  	.long	arm740_processor_functions  	.long	0  	.long	0 -	.long	v3_cache_fns			@ cache model +	.long	v4_cache_fns			@ cache model  	.size	__arm740_proc_info, . - __arm740_proc_info diff --git a/arch/arm/mm/proc-arm920.S b/arch/arm/mm/proc-arm920.S index 2c3b9421ab5..2556cf1c2da 100644 --- a/arch/arm/mm/proc-arm920.S +++ b/arch/arm/mm/proc-arm920.S @@ -387,7 +387,7 @@ ENTRY(cpu_arm920_set_pte_ext)  /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */  .globl	cpu_arm920_suspend_size  .equ	cpu_arm920_suspend_size, 4 * 3 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_arm920_do_suspend)  	stmfd	sp!, {r4 - r6, lr}  	mrc	p15, 0, r4, c13, c0, 0	@ PID diff --git a/arch/arm/mm/proc-arm926.S b/arch/arm/mm/proc-arm926.S index f1803f7e297..344c8a548cc 100644 --- a/arch/arm/mm/proc-arm926.S +++ b/arch/arm/mm/proc-arm926.S @@ -402,7 +402,7 @@ ENTRY(cpu_arm926_set_pte_ext)  /* Suspend/resume support: taken from arch/arm/plat-s3c24xx/sleep.S */  .globl	cpu_arm926_suspend_size  .equ	cpu_arm926_suspend_size, 4 * 3 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_arm926_do_suspend)  	stmfd	sp!, {r4 - r6, lr}  	mrc	p15, 0, r4, c13, c0, 0	@ PID diff --git a/arch/arm/mm/proc-mohawk.S b/arch/arm/mm/proc-mohawk.S index 82f9cdc751d..0b60dd3d742 100644 --- a/arch/arm/mm/proc-mohawk.S +++ b/arch/arm/mm/proc-mohawk.S @@ -350,7 +350,7 @@ ENTRY(cpu_mohawk_set_pte_ext)  .globl	cpu_mohawk_suspend_size  .equ	cpu_mohawk_suspend_size, 4 * 6 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_mohawk_do_suspend)  	stmfd	sp!, {r4 - r9, lr}  	mrc	p14, 0, r4, c6, c0, 0	@ clock configuration, for turbo mode diff --git a/arch/arm/mm/proc-sa1100.S b/arch/arm/mm/proc-sa1100.S index 3aa0da11fd8..d92dfd08142 100644 --- a/arch/arm/mm/proc-sa1100.S +++ b/arch/arm/mm/proc-sa1100.S @@ -172,7 +172,7 @@ ENTRY(cpu_sa1100_set_pte_ext)  .globl	cpu_sa1100_suspend_size  .equ	cpu_sa1100_suspend_size, 4 * 3 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_sa1100_do_suspend)  	stmfd	sp!, {r4 - r6, lr}  	mrc	p15, 0, r4, c3, c0, 0		@ domain ID diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c index 3e6210b4d6d..054b491ff76 100644 --- a/arch/arm/mm/proc-syms.c +++ b/arch/arm/mm/proc-syms.c @@ -17,7 +17,9 @@  #ifndef MULTI_CPU  EXPORT_SYMBOL(cpu_dcache_clean_area); +#ifdef CONFIG_MMU  EXPORT_SYMBOL(cpu_set_pte_ext); +#endif  #else  EXPORT_SYMBOL(processor);  #endif diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index bcaaa8de932..5c07ee4fe3e 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -138,7 +138,7 @@ ENTRY(cpu_v6_set_pte_ext)  /* Suspend/resume support: taken from arch/arm/mach-s3c64xx/sleep.S */  .globl	cpu_v6_suspend_size  .equ	cpu_v6_suspend_size, 4 * 6 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_v6_do_suspend)  	stmfd	sp!, {r4 - r9, lr}  	mrc	p15, 0, r4, c13, c0, 0	@ FCSE/PID diff --git a/arch/arm/mm/proc-xsc3.S b/arch/arm/mm/proc-xsc3.S index eb93d6487f3..e8efd83b6f2 100644 --- a/arch/arm/mm/proc-xsc3.S +++ b/arch/arm/mm/proc-xsc3.S @@ -413,7 +413,7 @@ ENTRY(cpu_xsc3_set_pte_ext)  .globl	cpu_xsc3_suspend_size  .equ	cpu_xsc3_suspend_size, 4 * 6 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_xsc3_do_suspend)  	stmfd	sp!, {r4 - r9, lr}  	mrc	p14, 0, r4, c6, c0, 0	@ clock configuration, for turbo mode diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S index 25510361aa1..e766f889bfd 100644 --- a/arch/arm/mm/proc-xscale.S +++ b/arch/arm/mm/proc-xscale.S @@ -528,7 +528,7 @@ ENTRY(cpu_xscale_set_pte_ext)  .globl	cpu_xscale_suspend_size  .equ	cpu_xscale_suspend_size, 4 * 6 -#ifdef CONFIG_PM_SLEEP +#ifdef CONFIG_ARM_CPU_SUSPEND  ENTRY(cpu_xscale_do_suspend)  	stmfd	sp!, {r4 - r9, lr}  	mrc	p14, 0, r4, c6, c0, 0	@ clock configuration, for turbo mode diff --git a/arch/arm/mm/tcm.h b/arch/arm/mm/tcm.h new file mode 100644 index 00000000000..8015ad434a4 --- /dev/null +++ b/arch/arm/mm/tcm.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2008-2009 ST-Ericsson AB + * License terms: GNU General Public License (GPL) version 2 + * TCM memory handling for ARM systems + * + * Author: Linus Walleij <linus.walleij@stericsson.com> + * Author: Rickard Andersson <rickard.andersson@stericsson.com> + */ + +#ifdef CONFIG_HAVE_TCM +void __init tcm_init(void); +#else +/* No TCM support, just blank inlines to be optimized out */ +inline void tcm_init(void) +{ +} +#endif  |