mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	arm: provide a function for boards init code to modify MMU virtual-physical map
Provide function for setting arbitrary virtual-physical MMU mapping and cache settings for the given region. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
		
				
					committed by
					
						 Tom Rini
						Tom Rini
					
				
			
			
				
	
			
			
			
						parent
						
							f5a9fcc602
						
					
				
				
					commit
					d877f8fd0f
				
			
							
								
								
									
										8
									
								
								arch/arm/include/asm/mmu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								arch/arm/include/asm/mmu.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | /* SPDX-License-Identifier: GPL-2.0+ */ | ||||||
|  |  | ||||||
|  | #ifndef __ASM_ARM_MMU_H | ||||||
|  | #define __ASM_ARM_MMU_H | ||||||
|  |  | ||||||
|  | void init_addr_map(void); | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @@ -587,6 +587,19 @@ s32 psci_features(u32 function_id, u32 psci_fid); | |||||||
|  */ |  */ | ||||||
| void save_boot_params_ret(void); | void save_boot_params_ret(void); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * mmu_set_region_dcache_behaviour_phys() - set virt/phys mapping | ||||||
|  |  * | ||||||
|  |  * Change the virt/phys mapping and cache settings for a region. | ||||||
|  |  * | ||||||
|  |  * @virt:	virtual start address of memory region to change | ||||||
|  |  * @phys:	physical address for the memory region to set | ||||||
|  |  * @size:	size of memory region to change | ||||||
|  |  * @option:	dcache option to select | ||||||
|  |  */ | ||||||
|  | void mmu_set_region_dcache_behaviour_phys(phys_addr_t virt, phys_addr_t phys, | ||||||
|  | 					size_t size, enum dcache_option option); | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * mmu_set_region_dcache_behaviour() - set cache settings |  * mmu_set_region_dcache_behaviour() - set cache settings | ||||||
|  * |  * | ||||||
|   | |||||||
| @@ -25,7 +25,8 @@ __weak void arm_init_domains(void) | |||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
| void set_section_dcache(int section, enum dcache_option option) | static void set_section_phys(int section, phys_addr_t phys, | ||||||
|  | 			     enum dcache_option option) | ||||||
| { | { | ||||||
| #ifdef CONFIG_ARMV7_LPAE | #ifdef CONFIG_ARMV7_LPAE | ||||||
| 	u64 *page_table = (u64 *)gd->arch.tlb_addr; | 	u64 *page_table = (u64 *)gd->arch.tlb_addr; | ||||||
| @@ -37,7 +38,7 @@ void set_section_dcache(int section, enum dcache_option option) | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| 	/* Add the page offset */ | 	/* Add the page offset */ | ||||||
| 	value |= ((u32)section << MMU_SECTION_SHIFT); | 	value |= phys; | ||||||
|  |  | ||||||
| 	/* Add caching bits */ | 	/* Add caching bits */ | ||||||
| 	value |= option; | 	value |= option; | ||||||
| @@ -46,13 +47,18 @@ void set_section_dcache(int section, enum dcache_option option) | |||||||
| 	page_table[section] = value; | 	page_table[section] = value; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void set_section_dcache(int section, enum dcache_option option) | ||||||
|  | { | ||||||
|  | 	set_section_phys(section, (u32)section << MMU_SECTION_SHIFT, option); | ||||||
|  | } | ||||||
|  |  | ||||||
| __weak void mmu_page_table_flush(unsigned long start, unsigned long stop) | __weak void mmu_page_table_flush(unsigned long start, unsigned long stop) | ||||||
| { | { | ||||||
| 	debug("%s: Warning: not implemented\n", __func__); | 	debug("%s: Warning: not implemented\n", __func__); | ||||||
| } | } | ||||||
|  |  | ||||||
| void mmu_set_region_dcache_behaviour(phys_addr_t start, size_t size, | void mmu_set_region_dcache_behaviour_phys(phys_addr_t start, phys_addr_t phys, | ||||||
| 				     enum dcache_option option) | 					size_t size, enum dcache_option option) | ||||||
| { | { | ||||||
| #ifdef CONFIG_ARMV7_LPAE | #ifdef CONFIG_ARMV7_LPAE | ||||||
| 	u64 *page_table = (u64 *)gd->arch.tlb_addr; | 	u64 *page_table = (u64 *)gd->arch.tlb_addr; | ||||||
| @@ -74,8 +80,8 @@ void mmu_set_region_dcache_behaviour(phys_addr_t start, size_t size, | |||||||
| 	debug("%s: start=%pa, size=%zu, option=0x%x\n", __func__, &start, size, | 	debug("%s: start=%pa, size=%zu, option=0x%x\n", __func__, &start, size, | ||||||
| 	      option); | 	      option); | ||||||
| #endif | #endif | ||||||
| 	for (upto = start; upto < end; upto++) | 	for (upto = start; upto < end; upto++, phys += MMU_SECTION_SIZE) | ||||||
| 		set_section_dcache(upto, option); | 		set_section_phys(upto, phys, option); | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	 * Make sure range is cache line aligned | 	 * Make sure range is cache line aligned | ||||||
| @@ -90,6 +96,12 @@ void mmu_set_region_dcache_behaviour(phys_addr_t start, size_t size, | |||||||
| 	mmu_page_table_flush(startpt, stoppt); | 	mmu_page_table_flush(startpt, stoppt); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void mmu_set_region_dcache_behaviour(phys_addr_t start, size_t size, | ||||||
|  | 				     enum dcache_option option) | ||||||
|  | { | ||||||
|  | 	mmu_set_region_dcache_behaviour_phys(start, start, size, option); | ||||||
|  | } | ||||||
|  |  | ||||||
| __weak void dram_bank_mmu_setup(int bank) | __weak void dram_bank_mmu_setup(int bank) | ||||||
| { | { | ||||||
| 	bd_t *bd = gd->bd; | 	bd_t *bd = gd->bd; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user