mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	powerpc: allow ioremap within reserved memory regions
Add a flag to let a platform ioremap memory regions marked as reserved. This flag will be used later by the Nintendo Wii support code to allow ioremapping the I/O region sitting between MEM1 and MEM2 and marked as reserved RAM in the patch "wii: use both mem1 and mem2 as ram". This will no longer be needed when proper discontig memory support for 32-bit PowerPC is added to the kernel. Signed-off-by: Albert Herranz <albert_herranz@yahoo.es> Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
		
							parent
							
								
									de32400dd2
								
							
						
					
					
						commit
						c5df7f7751
					
				
					 5 changed files with 16 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -82,6 +82,11 @@ extern struct task_struct *current_set[NR_CPUS];
 | 
			
		|||
int __map_without_bats;
 | 
			
		||||
int __map_without_ltlbs;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This tells the system to allow ioremapping memory marked as reserved.
 | 
			
		||||
 */
 | 
			
		||||
int __allow_ioremap_reserved;
 | 
			
		||||
 | 
			
		||||
/* max amount of low RAM to map in */
 | 
			
		||||
unsigned long __max_low_memory = MAX_LOW_MEM;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -115,6 +115,7 @@ extern void settlbcam(int index, unsigned long virt, phys_addr_t phys,
 | 
			
		|||
extern void invalidate_tlbcam_entry(int index);
 | 
			
		||||
 | 
			
		||||
extern int __map_without_bats;
 | 
			
		||||
extern int __allow_ioremap_reserved;
 | 
			
		||||
extern unsigned long ioremap_base;
 | 
			
		||||
extern unsigned int rtas_data, rtas_size;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,7 @@
 | 
			
		|||
#include <linux/vmalloc.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/highmem.h>
 | 
			
		||||
#include <linux/lmb.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/pgalloc.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -191,7 +192,8 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
 | 
			
		|||
	 * Don't allow anybody to remap normal RAM that we're using.
 | 
			
		||||
	 * mem_init() sets high_memory so only do the check after that.
 | 
			
		||||
	 */
 | 
			
		||||
	if (mem_init_done && (p < virt_to_phys(high_memory))) {
 | 
			
		||||
	if (mem_init_done && (p < virt_to_phys(high_memory)) &&
 | 
			
		||||
	    !(__allow_ioremap_reserved && lmb_is_region_reserved(p, size))) {
 | 
			
		||||
		printk("__ioremap(): phys addr 0x%llx is RAM lr %p\n",
 | 
			
		||||
		       (unsigned long long)p, __builtin_return_address(0));
 | 
			
		||||
		return NULL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,6 +54,7 @@ extern u64 __init lmb_phys_mem_size(void);
 | 
			
		|||
extern u64 lmb_end_of_DRAM(void);
 | 
			
		||||
extern void __init lmb_enforce_memory_limit(u64 memory_limit);
 | 
			
		||||
extern int __init lmb_is_reserved(u64 addr);
 | 
			
		||||
extern int lmb_is_region_reserved(u64 base, u64 size);
 | 
			
		||||
extern int lmb_find(struct lmb_property *res);
 | 
			
		||||
 | 
			
		||||
extern void lmb_dump_all(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -263,7 +263,7 @@ long __init lmb_reserve(u64 base, u64 size)
 | 
			
		|||
	return lmb_add_region(_rgn, base, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long __init lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
 | 
			
		||||
long lmb_overlaps_region(struct lmb_region *rgn, u64 base, u64 size)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long i;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -493,6 +493,11 @@ int __init lmb_is_reserved(u64 addr)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int lmb_is_region_reserved(u64 base, u64 size)
 | 
			
		||||
{
 | 
			
		||||
	return lmb_overlaps_region(&lmb.reserved, base, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Given a <base, len>, find which memory regions belong to this range.
 | 
			
		||||
 * Adjust the request and return a contiguous chunk.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue