All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC] MIPS: add support for vmlinux appended DTB
@ 2014-07-08 15:14 Jonas Gorski
  2014-07-08 16:01   ` James Hogan
  0 siblings, 1 reply; 4+ messages in thread
From: Jonas Gorski @ 2014-07-08 15:14 UTC (permalink / raw)
  To: linux-mips; +Cc: Ralf Baechle, John Crispin, Markos Chandras

Add support for populating initial_device_params through a dtb
blob appended to vmlinux.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
---
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_device_params is a good
idea, or a new variable should be introduced.

The reasoning for initial_device_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 bootloade expects
an lzma compressed kernel, so I wanted to not 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 |  6 ++++++
 3 files changed, 43 insertions(+)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 3f05b56..58527cd 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -2476,6 +2476,24 @@ config USE_OF
 	select OF_EARLY_FLATTREE
 	select IRQ_DOMAIN
 
+config MIPS_APPENDED_DTB
+	bool "Use appended device tree blob to vmlinux (EXPERIMENTAL)"
+	depends on OF
+	help
+	  With this option, the boot code will look for a device tree binary
+	  DTB) appended to vmlinux
+	  (e.g. cat vmlinux <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.  Do not leave this option active in a production kernel
+	  if you don't intend to always append a DTB.
+
 endmenu
 
 config LOCKDEP_SUPPORT
diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
index 95afd66..72c1049 100644
--- a/arch/mips/kernel/head.S
+++ b/arch/mips/kernel/head.S
@@ -93,7 +93,22 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
 	PTR_LA	t0, 0f
 	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
@@ -107,6 +122,10 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
 	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.  */
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
index 3b46f7c..8009530 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -127,6 +127,12 @@ SECTIONS
 	}
 
 	PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
+
+#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
-- 
2.0.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH RFC] MIPS: add support for vmlinux appended DTB
@ 2014-07-08 16:01   ` James Hogan
  0 siblings, 0 replies; 4+ messages in thread
From: James Hogan @ 2014-07-08 16:01 UTC (permalink / raw)
  To: Jonas Gorski, linux-mips; +Cc: Ralf Baechle, John Crispin, Markos Chandras

Hi Jonas,

On 08/07/14 16:14, Jonas Gorski wrote:
> Add support for populating initial_device_params through a dtb

initial_boot_params here and above?

> blob appended to vmlinux.

should that be vmlinux.bin? Presumably it isn't appended to the ELF file?

> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
> 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_device_params is a good
> idea, or a new variable should be introduced.
> 
> The reasoning for initial_device_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.

Does it matter that this will be ignored if the bootloader does provide
a DT (initial_boot_params overwritten by early_init_dt_scan() call), and
that if no DT is provided by the bootloader the of_scan_flat_dt() calls
at the bottom of early_init_dt_scan will never happen?

> 
> This patch works for me on bcm63xx, where the bootloade expects

s/bootloade/bootloader/

> an lzma compressed kernel, so I wanted to not 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 |  6 ++++++
>  3 files changed, 43 insertions(+)
> 
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 3f05b56..58527cd 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -2476,6 +2476,24 @@ config USE_OF
>  	select OF_EARLY_FLATTREE
>  	select IRQ_DOMAIN
>  
> +config MIPS_APPENDED_DTB
> +	bool "Use appended device tree blob to vmlinux (EXPERIMENTAL)"
> +	depends on OF
> +	help
> +	  With this option, the boot code will look for a device tree binary
> +	  DTB) appended to vmlinux

s/DTB)/(DTB)/

vmlinux.bin again?

> +	  (e.g. cat vmlinux <filename>.dtb > vmlinux_w_dtb).

here too I think.

> +
> +	  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.  Do not leave this option active in a production kernel

maybe same here too.

Can't fault the rest though.

Cheers
James

> +	  if you don't intend to always append a DTB.
> +
>  endmenu
>  
>  config LOCKDEP_SUPPORT
> diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
> index 95afd66..72c1049 100644
> --- a/arch/mips/kernel/head.S
> +++ b/arch/mips/kernel/head.S
> @@ -93,7 +93,22 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
>  	PTR_LA	t0, 0f
>  	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
> @@ -107,6 +122,10 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
>  	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.  */
> diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
> index 3b46f7c..8009530 100644
> --- a/arch/mips/kernel/vmlinux.lds.S
> +++ b/arch/mips/kernel/vmlinux.lds.S
> @@ -127,6 +127,12 @@ SECTIONS
>  	}
>  
>  	PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
> +
> +#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
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH RFC] MIPS: add support for vmlinux appended DTB
@ 2014-07-08 16:01   ` James Hogan
  0 siblings, 0 replies; 4+ messages in thread
From: James Hogan @ 2014-07-08 16:01 UTC (permalink / raw)
  To: Jonas Gorski, linux-mips; +Cc: Ralf Baechle, John Crispin, Markos Chandras

Hi Jonas,

On 08/07/14 16:14, Jonas Gorski wrote:
> Add support for populating initial_device_params through a dtb

initial_boot_params here and above?

> blob appended to vmlinux.

should that be vmlinux.bin? Presumably it isn't appended to the ELF file?

> 
> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
> ---
> 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_device_params is a good
> idea, or a new variable should be introduced.
> 
> The reasoning for initial_device_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.

Does it matter that this will be ignored if the bootloader does provide
a DT (initial_boot_params overwritten by early_init_dt_scan() call), and
that if no DT is provided by the bootloader the of_scan_flat_dt() calls
at the bottom of early_init_dt_scan will never happen?

> 
> This patch works for me on bcm63xx, where the bootloade expects

s/bootloade/bootloader/

> an lzma compressed kernel, so I wanted to not 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 |  6 ++++++
>  3 files changed, 43 insertions(+)
> 
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index 3f05b56..58527cd 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -2476,6 +2476,24 @@ config USE_OF
>  	select OF_EARLY_FLATTREE
>  	select IRQ_DOMAIN
>  
> +config MIPS_APPENDED_DTB
> +	bool "Use appended device tree blob to vmlinux (EXPERIMENTAL)"
> +	depends on OF
> +	help
> +	  With this option, the boot code will look for a device tree binary
> +	  DTB) appended to vmlinux

s/DTB)/(DTB)/

vmlinux.bin again?

> +	  (e.g. cat vmlinux <filename>.dtb > vmlinux_w_dtb).

here too I think.

> +
> +	  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.  Do not leave this option active in a production kernel

maybe same here too.

Can't fault the rest though.

Cheers
James

> +	  if you don't intend to always append a DTB.
> +
>  endmenu
>  
>  config LOCKDEP_SUPPORT
> diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
> index 95afd66..72c1049 100644
> --- a/arch/mips/kernel/head.S
> +++ b/arch/mips/kernel/head.S
> @@ -93,7 +93,22 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
>  	PTR_LA	t0, 0f
>  	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
> @@ -107,6 +122,10 @@ NESTED(kernel_entry, 16, sp)			# kernel entry point
>  	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.  */
> diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
> index 3b46f7c..8009530 100644
> --- a/arch/mips/kernel/vmlinux.lds.S
> +++ b/arch/mips/kernel/vmlinux.lds.S
> @@ -127,6 +127,12 @@ SECTIONS
>  	}
>  
>  	PERCPU_SECTION(1 << CONFIG_MIPS_L1_CACHE_SHIFT)
> +
> +#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
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH RFC] MIPS: add support for vmlinux appended DTB
  2014-07-08 16:01   ` James Hogan
  (?)
@ 2014-07-09 12:25   ` Jonas Gorski
  -1 siblings, 0 replies; 4+ messages in thread
From: Jonas Gorski @ 2014-07-09 12:25 UTC (permalink / raw)
  To: James Hogan
  Cc: MIPS Mailing List, Ralf Baechle, John Crispin, Markos Chandras

On Tue, Jul 8, 2014 at 6:01 PM, James Hogan <james.hogan@imgtec.com> wrote:
> Hi Jonas,
>
> On 08/07/14 16:14, Jonas Gorski wrote:
>> Add support for populating initial_device_params through a dtb
>
> initial_boot_params here and above?

Yes, that's what I meant. I must have been distracted by the
thunderstorm outside.

>
>> blob appended to vmlinux.
>
> should that be vmlinux.bin? Presumably it isn't appended to the ELF file?

Hmmm, you are right, indeed it should. I was always taking the OpenWrt
names for granted, so I never looked at how the kernel itself named
them. OpenWrt uses "vmlinux" for binary only, and "vmlinux.elf" for
the unstripped elf one.

As far as I can tell, there is no simple vmlinux.bin target without
the decompressor wrapper included, but for the description I will
change the name and clarify that I am talking about a binary kernel
without the decompressing wrapper.

>
>>
>> Signed-off-by: Jonas Gorski <jogo@openwrt.org>
>> ---
>> 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_device_params is a good
>> idea, or a new variable should be introduced.
>>
>> The reasoning for initial_device_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.
>
> Does it matter that this will be ignored if the bootloader does provide
> a DT (initial_boot_params overwritten by early_init_dt_scan() call), and
> that if no DT is provided by the bootloader the of_scan_flat_dt() calls
> at the bottom of early_init_dt_scan will never happen?

Since (AFAIK) there is no common interface on mips for a bootloader to
pass a dtb to the kernel, it is currently up to the individual targets
to do something with an appended dtb, and decide which one has a
higher priority. They already need to manually "extract" the passed
dtb from the bootloader and pass it to the kernel, so all this patch
does is provide another source for one.


>>
>> This patch works for me on bcm63xx, where the bootloade expects
>
> s/bootloade/bootloader/
>
>> an lzma compressed kernel, so I wanted to not 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 |  6 ++++++
>>  3 files changed, 43 insertions(+)
>>
>> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
>> index 3f05b56..58527cd 100644
>> --- a/arch/mips/Kconfig
>> +++ b/arch/mips/Kconfig
>> @@ -2476,6 +2476,24 @@ config USE_OF
>>       select OF_EARLY_FLATTREE
>>       select IRQ_DOMAIN
>>
>> +config MIPS_APPENDED_DTB
>> +     bool "Use appended device tree blob to vmlinux (EXPERIMENTAL)"
>> +     depends on OF
>> +     help
>> +       With this option, the boot code will look for a device tree binary
>> +       DTB) appended to vmlinux
>
> s/DTB)/(DTB)/
>
> vmlinux.bin again?

Right.

>> +       (e.g. cat vmlinux <filename>.dtb > vmlinux_w_dtb).
>
> here too I think.

Right again.

>> +
>> +       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.  Do not leave this option active in a production kernel
>
> maybe same here too.

Will fix that, too.

>
> Can't fault the rest though.
>
> Cheers
> James

Thanks for the review!


Jonas

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2014-07-09 12:25 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-08 15:14 [PATCH RFC] MIPS: add support for vmlinux appended DTB Jonas Gorski
2014-07-08 16:01 ` James Hogan
2014-07-08 16:01   ` James Hogan
2014-07-09 12:25   ` Jonas Gorski

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.