mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	powerpc/fsl-booke: Fix CONFIG_RELOCATABLE support on FSL Book-E ppc32
The following commit broke CONFIG_RELOCATABLE support on FSL Book-E
parts:
commit 549e8152de
Author: Paul Mackerras <paulus@samba.org>
Date:   Sat Aug 30 11:43:47 2008 +1000
    powerpc: Make the 64-bit kernel as a position-independent executable
The change to __va and __pa to use PAGE_OFFSET & MEMORY_START causes
problems on the Book-E parts because we don't know MEMORY_START until
after we parse the device tree.  We need __va to work properly to even
parse the device tree so we have a chicken an egg.  So go back to using
he other definition of __va/__pa on CONFIG_BOOKE and use the
PAGE_OFFSET/MEMORY_START version on "Classic" PPC64.
Also updated casts to handle phys_addr_t being a different size from
unsigned long (ie 36-bit physical on PPC32).
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
			
			
This commit is contained in:
		
							parent
							
								
									b4d0a038e0
								
							
						
					
					
						commit
						dbc9632a8c
					
				
					 1 changed files with 14 additions and 1 deletions
				
			
		|  | @ -108,8 +108,21 @@ extern phys_addr_t kernstart_addr; | |||
| #define pfn_to_kaddr(pfn)	__va((pfn) << PAGE_SHIFT) | ||||
| #define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT) | ||||
| 
 | ||||
| #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - MEMORY_START)) | ||||
| /*
 | ||||
|  * On Book-E parts we need __va to parse the device tree and we can't | ||||
|  * determine MEMORY_START until then.  However we can determine PHYSICAL_START | ||||
|  * from information at hand (program counter, TLB lookup). | ||||
|  * | ||||
|  * On non-Book-E PPC64 PAGE_OFFSET and MEMORY_START are constants so use | ||||
|  * the other definitions for __va & __pa. | ||||
|  */ | ||||
| #ifdef CONFIG_BOOKE | ||||
| #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) - PHYSICAL_START + KERNELBASE)) | ||||
| #define __pa(x) ((unsigned long)(x) + PHYSICAL_START - KERNELBASE) | ||||
| #else | ||||
| #define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START)) | ||||
| #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START) | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI, | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Kumar Gala
						Kumar Gala