Fix locking and lock usage, making it compile for SMP. Signed-off-by: Jonas Gorski <jogo@openwrt.org> SVN-Revision: 43578
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 318c1fce4aeef298cbb6153416c499c94ad7cda0 Mon Sep 17 00:00:00 2001
 | |
| From: Jonas Gorski <jogo@openwrt.org>
 | |
| Date: Tue, 24 Jun 2014 10:53:15 +0200
 | |
| Subject: [PATCH RFC v3] MIPS: add support for vmlinux.bin appended DTB
 | |
| 
 | |
| Add support for populating initial_boot_params through a dtb
 | |
| blob appended to raw vmlinux.bin.
 | |
| 
 | |
| Signed-off-by: Jonas Gorski <jogo@openwrt.org>
 | |
| ---
 | |
| Changes RFC v2 -> v3
 | |
| 
 | |
| * fixed !smp kernels (TODO: move it to its own patch
 | |
| 
 | |
| Changes RFC v1 -> v2
 | |
| 
 | |
| * changed all occurences of vmlinux to vmlinux.bin
 | |
| * clarified this applies to the raw vmlinux.bin without decompressor
 | |
| * s/initial_device_params/initial_boot_params/
 | |
| 
 | |
| Initial comments by me still valid:
 | |
| 
 | |
| Mostly adapted from how ARM is doing it.
 | |
| 
 | |
| Sent as an RFC PATCH because I am not sure if this is the right way to
 | |
| it, and whether storing the pointer in initial_boot_params is a good
 | |
| idea, or a new variable should be introduced.
 | |
| 
 | |
| The reasoning for initial_boot_params is that there is no common
 | |
| MIPS interface yet, so the next best thing was using that. This also
 | |
| has the advantage of keeping the original fw_args intact.
 | |
| 
 | |
| This patch works for me on bcm63xx, where the bootloader expects
 | |
| an lzma compressed kernel, so I didn't want to double compress using
 | |
| the in-kernel compressed kernel support.
 | |
| 
 | |
| Completely untested on anything except MIPS32 / big endian.
 | |
| 
 | |
|  arch/mips/Kconfig              | 18 ++++++++++++++++++
 | |
|  arch/mips/kernel/head.S        | 19 +++++++++++++++++++
 | |
|  arch/mips/kernel/vmlinux.lds.S |  7 +++++++
 | |
|  3 files changed, 43 insertions(+)
 | |
| 
 | |
| --- a/arch/mips/Kconfig
 | |
| +++ b/arch/mips/Kconfig
 | |
| @@ -2655,6 +2655,24 @@ config RAPIDIO
 | |
|  
 | |
|  source "drivers/rapidio/Kconfig"
 | |
|  
 | |
| +config MIPS_APPENDED_DTB
 | |
| +	bool "Use appended device tree blob to vmlinux.bin (EXPERIMENTAL)"
 | |
| +	depends on OF
 | |
| +	help
 | |
| +	  With this option, the boot code will look for a device tree binary
 | |
| +	  DTB) appended to raw vmlinux.bin (without decompressor).
 | |
| +	  (e.g. cat vmlinux.bin <filename>.dtb > vmlinux_w_dtb).
 | |
| +
 | |
| +	  This is meant as a backward compatibility convenience for those
 | |
| +	  systems with a bootloader that can't be upgraded to accommodate
 | |
| +	  the documented boot protocol using a device tree.
 | |
| +
 | |
| +	  Beware that there is very little in terms of protection against
 | |
| +	  this option being confused by leftover garbage in memory that might
 | |
| +	  look like a DTB header after a reboot if no actual DTB is appended
 | |
| +	  to vmlinux.bin.  Do not leave this option active in a production kernel
 | |
| +	  if you don't intend to always append a DTB.
 | |
| +
 | |
|  endmenu
 | |
|  
 | |
|  menu "Executable file formats"
 | |
| --- a/arch/mips/kernel/head.S
 | |
| +++ b/arch/mips/kernel/head.S
 | |
| @@ -100,6 +100,22 @@ NESTED(kernel_entry, 16, sp)			# kernel
 | |
|  	jr	t0
 | |
|  0:
 | |
|  
 | |
| +#ifdef CONFIG_MIPS_APPENDED_DTB
 | |
| +	PTR_LA		t0, __appended_dtb
 | |
| +	PTR_LI		t3, 0
 | |
| +
 | |
| +#ifdef CONFIG_CPU_BIG_ENDIAN
 | |
| +	PTR_LI		t1, 0xd00dfeed
 | |
| +#else
 | |
| +	PTR_LI		t1, 0xedfe0dd0
 | |
| +#endif
 | |
| +	LONG_L		t2, (t0)
 | |
| +	bne		t1, t2, not_found
 | |
| +
 | |
| +	PTR_LA		t3, __appended_dtb
 | |
| +
 | |
| +not_found:
 | |
| +#endif
 | |
|  	PTR_LA		t0, __bss_start		# clear .bss
 | |
|  	LONG_S		zero, (t0)
 | |
|  	PTR_LA		t1, __bss_stop - LONGSIZE
 | |
| @@ -113,6 +129,10 @@ NESTED(kernel_entry, 16, sp)			# kernel
 | |
|  	LONG_S		a2, fw_arg2
 | |
|  	LONG_S		a3, fw_arg3
 | |
|  
 | |
| +#ifdef CONFIG_MIPS_APPENDED_DTB
 | |
| +	LONG_S		t3, initial_boot_params
 | |
| +#endif
 | |
| +
 | |
|  	MTC0		zero, CP0_CONTEXT	# clear context register
 | |
|  	PTR_LA		$28, init_thread_union
 | |
|  	/* Set the SP after an empty pt_regs.  */
 | |
| --- a/arch/mips/kernel/vmlinux.lds.S
 | |
| +++ b/arch/mips/kernel/vmlinux.lds.S
 | |
| @@ -125,8 +125,14 @@ SECTIONS
 | |
|  	.exit.data : {
 | |
|  		EXIT_DATA
 | |
|  	}
 | |
| -
 | |
| +#ifdef CONFIG_SMP
 | |
|  	PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
 | |
| +#endif
 | |
| +#ifdef CONFIG_MIPS_APPENDED_DTB
 | |
| +	__appended_dtb = .;
 | |
| +	/* leave space for appended DTB */
 | |
| +	. = . + 0x100000;
 | |
| +#endif
 | |
|  	/*
 | |
|  	 * Align to 64K in attempt to eliminate holes before the
 | |
|  	 * .bss..swapper_pg_dir section at the start of .bss.  This
 |