diff mbox

[RESEND,05/12] sh: DeviceTree support update

Message ID 1462079316-27771-6-git-send-email-ysato@users.sourceforge.jp (mailing list archive)
State New, archived
Headers show

Commit Message

Yoshinori Sato May 1, 2016, 5:08 a.m. UTC
Changes bellow
- FDT setup timing fix.
- chosen/bootargs support.
- zImage support.
- DT binding helper macro.

Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
---
 arch/sh/boards/of-generic.c                        | 23 +++++++++++-----------
 arch/sh/boot/compressed/head_32.S                  |  5 +++--
 arch/sh/boot/dts/include/dt-bindings               |  1 +
 arch/sh/kernel/setup.c                             | 19 ++++++++++++++++++
 include/dt-bindings/interrupt-controller/sh_intc.h |  2 ++
 5 files changed, 36 insertions(+), 14 deletions(-)
 create mode 120000 arch/sh/boot/dts/include/dt-bindings
 create mode 100644 include/dt-bindings/interrupt-controller/sh_intc.h

Comments

Rich Felker May 4, 2016, 3:10 a.m. UTC | #1
On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
> Changes bellow
> - FDT setup timing fix.
> - chosen/bootargs support.
> - zImage support.
> - DT binding helper macro.
> 
> Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
> ---
>  arch/sh/boards/of-generic.c                        | 23 +++++++++++-----------
>  arch/sh/boot/compressed/head_32.S                  |  5 +++--
>  arch/sh/boot/dts/include/dt-bindings               |  1 +
>  arch/sh/kernel/setup.c                             | 19 ++++++++++++++++++
>  include/dt-bindings/interrupt-controller/sh_intc.h |  2 ++
>  5 files changed, 36 insertions(+), 14 deletions(-)
>  create mode 120000 arch/sh/boot/dts/include/dt-bindings
>  create mode 100644 include/dt-bindings/interrupt-controller/sh_intc.h
> 
> diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
> index bf3a166..9570873 100644
> --- a/arch/sh/boards/of-generic.c
> +++ b/arch/sh/boards/of-generic.c
> @@ -112,29 +112,25 @@ static int noopi(void)
>  	return 0;
>  }
>  
> -static void __init sh_of_mem_reserve(void)
> +static void __init sh_of_mem_init(void)
>  {
>  	early_init_fdt_reserve_self();
>  	early_init_fdt_scan_reserved_mem();
>  }
>  
> -static void __init sh_of_time_init(void)
> -{
> -	pr_info("SH generic board support: scanning for clocksource devices\n");
> -	clocksource_probe();
> -}

Why did you remove this? Without it you won't get clock
event/clocksource devices from the device tree so the only way to have
a working timer interrupt is if the driver is hard-coded somewhere.

>  static void __init sh_of_setup(char **cmdline_p)
>  {
> -	unflatten_device_tree();
> -
> -	board_time_init = sh_of_time_init;
> +	struct device_node *cpu;
> +	int freq;
>  
>  	sh_mv.mv_name = of_flat_dt_get_machine_name();
>  	if (!sh_mv.mv_name)
>  		sh_mv.mv_name = "Unknown SH model";
>  
>  	sh_of_smp_probe();
> +	cpu = of_find_node_by_name(NULL, "cpu");
> +	if (!of_property_read_u32(cpu, "clock-frequency", &freq))
> +		preset_lpj = freq / 500;
>  }

I setup the DT-based pseudo-board to use the generic calibrate-delay
rather than hard-coding lpj. Ideally we could just get rid of bogomips
completely but there are probably still some things using it. Is there
a reason you prefer making up a value for lpj based on the cpu clock
rate?

>  static int sh_of_irq_demux(int irq)
> @@ -167,8 +163,7 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = {
>  	.mv_init_irq	= sh_of_init_irq,
>  	.mv_clk_init	= sh_of_clk_init,
>  	.mv_mode_pins	= noopi,
> -	.mv_mem_init	= noop,
> -	.mv_mem_reserve	= sh_of_mem_reserve,
> +	.mv_mem_init	= sh_of_mem_init,

Is there a reason for this renaming? The function seems to be dealing
purely with reserving memory ranges.

>  struct sh_clk_ops;
> @@ -194,3 +189,7 @@ static int __init sh_of_device_init(void)
>  	return 0;
>  }
>  arch_initcall_sync(sh_of_device_init);
> +
> +void intc_finalize(void)
> +{
> +}
> diff --git a/arch/sh/boot/compressed/head_32.S b/arch/sh/boot/compressed/head_32.S
> index 3e15032..cd34377 100644
> --- a/arch/sh/boot/compressed/head_32.S
> +++ b/arch/sh/boot/compressed/head_32.S
> @@ -14,7 +14,8 @@ startup:
>  	/* Load initial status register */
>  	mov.l   init_sr, r1
>  	ldc     r1, sr
> -
> +	/* Save FDT address */
> +	mov	r4, r13
>  	/* Move myself to proper location if necessary */
>  	mova	1f, r0
>  	mov.l	1f, r2
> @@ -83,7 +84,7 @@ l1:
>  	/* Jump to the start of the decompressed kernel */
>  	mov.l	kernel_start_addr, r0
>  	jmp	@r0
> -	nop
> +	  mov	r13,r4
>  	
>  	.align	2
>  bss_start_addr:

This should probably be its own patch, adding DT support for
compressed kernel images. It's independent from everything else in
this patch.

> diff --git a/arch/sh/boot/dts/include/dt-bindings b/arch/sh/boot/dts/include/dt-bindings
> new file mode 120000
> index 0000000..08c00e4
> --- /dev/null
> +++ b/arch/sh/boot/dts/include/dt-bindings
> @@ -0,0 +1 @@
> +../../../../../include/dt-bindings
> \ No newline at end of file
> diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
> index 5d34605..f6bb105 100644
> --- a/arch/sh/kernel/setup.c
> +++ b/arch/sh/kernel/setup.c
> @@ -177,7 +177,12 @@ disable:
>  #ifndef CONFIG_GENERIC_CALIBRATE_DELAY
>  void calibrate_delay(void)
>  {
> +#ifndef CONFIG_OF
>  	struct clk *clk = clk_get(NULL, "cpu_clk");
> +#else
> +	struct device_node *cpu = of_find_node_by_name(NULL, "cpu");
> +	struct clk *clk = of_clk_get_by_name(cpu, NULL);
> +#endif
>  
>  	if (IS_ERR(clk))
>  		panic("Need a sane CPU clock definition!");
> @@ -251,7 +256,11 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
>  	/* Avoid calling an __init function on secondary cpus. */
>  	if (done) return;
>  
> +#ifdef CONFIG_USE_BUILTIN_DTB
> +	dt_virt = __dtb_start;
> +#else
>  	dt_virt = phys_to_virt(dt_phys);
> +#endif

This is also part of the bultin-dtb patch, which seems to have been
spread out across several of your patches.

>  	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
>  		pr_crit("Error: invalid device tree blob"
> @@ -267,8 +276,13 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
>  
>  void __init setup_arch(char **cmdline_p)
>  {
> +#ifdef CONFIG_OF
> +	unflatten_device_tree();
> +#endif
>  	enable_mmu();

Was this moved to setup_arch to have it before enable_mmu? I think
that makes sense.

> +#ifndef CONFIG_OF
>  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
>  
>  	printk(KERN_NOTICE "Boot params:\n"
> @@ -290,6 +304,7 @@ void __init setup_arch(char **cmdline_p)
>  
>  	if (!MOUNT_ROOT_RDONLY)
>  		root_mountflags &= ~MS_RDONLY;
> +#endif

Do these boot params only make sense for non-DT setups?

> +#if !defined(CONFIG_OF) || defined(USE_BUILTIN_DTB)
>  	/* Save unparsed command line copy for /proc/cmdline */
>  	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
>  	*cmdline_p = command_line;
> +#else
> +	*cmdline_p = boot_command_line;
> +#endif

I think this is wrong -- it causes the builtin command line and
bootloader-provided command line to be ignored on DT kernels. Do you
just want to deprecate builtin and bootloader-provided command lines?
Or is it just a side effect of adding support for chosen/bootarg?

>  	parse_early_param();
>  
> diff --git a/include/dt-bindings/interrupt-controller/sh_intc.h b/include/dt-bindings/interrupt-controller/sh_intc.h
> new file mode 100644
> index 0000000..8c9dcdc
> --- /dev/null
> +++ b/include/dt-bindings/interrupt-controller/sh_intc.h
> @@ -0,0 +1,2 @@
> +#define evt2irq(evt)		(((evt) >> 5) - 16)
> +#define irq2evt(irq)		(((irq) + 16) << 5)

This seems unrelated to other things in this patch.

Rich
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Geert Uytterhoeven May 4, 2016, 6:41 a.m. UTC | #2
On Wed, May 4, 2016 at 5:10 AM, Rich Felker <dalias@libc.org> wrote:
>On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
>>  static void __init sh_of_setup(char **cmdline_p)
>>  {
>> -     unflatten_device_tree();
>> -
>> -     board_time_init = sh_of_time_init;
>> +     struct device_node *cpu;
>> +     int freq;

You better make freq unsigned.

>>       sh_mv.mv_name = of_flat_dt_get_machine_name();
>>       if (!sh_mv.mv_name)
>>               sh_mv.mv_name = "Unknown SH model";
>>
>>       sh_of_smp_probe();
>> +     cpu = of_find_node_by_name(NULL, "cpu");
>> +     if (!of_property_read_u32(cpu, "clock-frequency", &freq))
>> +             preset_lpj = freq / 500;
>>  }
>
> I setup the DT-based pseudo-board to use the generic calibrate-delay
> rather than hard-coding lpj. Ideally we could just get rid of bogomips
> completely but there are probably still some things using it. Is there
> a reason you prefer making up a value for lpj based on the cpu clock
> rate?

Calibrating the delay loop takes some time.
However, you shouldn't hardcode 500, but take HZ into account.
I assume you used the default HZ=250, so

        preset_lpj = freq / HZ / 2;

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yoshinori Sato May 10, 2016, 8:25 a.m. UTC | #3
On Wed, 04 May 2016 12:10:05 +0900,
Rich Felker wrote:
> 
> On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
> > Changes bellow
> > - FDT setup timing fix.
> > - chosen/bootargs support.
> > - zImage support.
> > - DT binding helper macro.
> > 
> > Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
> > ---
> >  arch/sh/boards/of-generic.c                        | 23 +++++++++++-----------
> >  arch/sh/boot/compressed/head_32.S                  |  5 +++--
> >  arch/sh/boot/dts/include/dt-bindings               |  1 +
> >  arch/sh/kernel/setup.c                             | 19 ++++++++++++++++++
> >  include/dt-bindings/interrupt-controller/sh_intc.h |  2 ++
> >  5 files changed, 36 insertions(+), 14 deletions(-)
> >  create mode 120000 arch/sh/boot/dts/include/dt-bindings
> >  create mode 100644 include/dt-bindings/interrupt-controller/sh_intc.h
> > 
> > diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
> > index bf3a166..9570873 100644
> > --- a/arch/sh/boards/of-generic.c
> > +++ b/arch/sh/boards/of-generic.c
> > @@ -112,29 +112,25 @@ static int noopi(void)
> >  	return 0;
> >  }
> >  
> > -static void __init sh_of_mem_reserve(void)
> > +static void __init sh_of_mem_init(void)
> >  {
> >  	early_init_fdt_reserve_self();
> >  	early_init_fdt_scan_reserved_mem();
> >  }
> >  
> > -static void __init sh_of_time_init(void)
> > -{
> > -	pr_info("SH generic board support: scanning for clocksource devices\n");
> > -	clocksource_probe();
> > -}
> 
> Why did you remove this? Without it you won't get clock
> event/clocksource devices from the device tree so the only way to have
> a working timer interrupt is if the driver is hard-coded somewhere.

It not needed on Common Clock Framework.
tmu define in dts.

> >  static void __init sh_of_setup(char **cmdline_p)
> >  {
> > -	unflatten_device_tree();
> > -
> > -	board_time_init = sh_of_time_init;
> > +	struct device_node *cpu;
> > +	int freq;
> >  
> >  	sh_mv.mv_name = of_flat_dt_get_machine_name();
> >  	if (!sh_mv.mv_name)
> >  		sh_mv.mv_name = "Unknown SH model";
> >  
> >  	sh_of_smp_probe();
> > +	cpu = of_find_node_by_name(NULL, "cpu");
> > +	if (!of_property_read_u32(cpu, "clock-frequency", &freq))
> > +		preset_lpj = freq / 500;
> >  }
> 
> I setup the DT-based pseudo-board to use the generic calibrate-delay
> rather than hard-coding lpj. Ideally we could just get rid of bogomips
> completely but there are probably still some things using it. Is there
> a reason you prefer making up a value for lpj based on the cpu clock
> rate?

clockevent initalize after calibrate delay.
So don't work interrupt based calibrate.

> >  static int sh_of_irq_demux(int irq)
> > @@ -167,8 +163,7 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = {
> >  	.mv_init_irq	= sh_of_init_irq,
> >  	.mv_clk_init	= sh_of_clk_init,
> >  	.mv_mode_pins	= noopi,
> > -	.mv_mem_init	= noop,
> > -	.mv_mem_reserve	= sh_of_mem_reserve,
> > +	.mv_mem_init	= sh_of_mem_init,
> 
> Is there a reason for this renaming? The function seems to be dealing
> purely with reserving memory ranges.

mv_mem_reserve too late call in MMU system.

> 
> >  struct sh_clk_ops;
> > @@ -194,3 +189,7 @@ static int __init sh_of_device_init(void)
> >  	return 0;
> >  }
> >  arch_initcall_sync(sh_of_device_init);
> > +
> > +void intc_finalize(void)
> > +{
> > +}
> > diff --git a/arch/sh/boot/compressed/head_32.S b/arch/sh/boot/compressed/head_32.S
> > index 3e15032..cd34377 100644
> > --- a/arch/sh/boot/compressed/head_32.S
> > +++ b/arch/sh/boot/compressed/head_32.S
> > @@ -14,7 +14,8 @@ startup:
> >  	/* Load initial status register */
> >  	mov.l   init_sr, r1
> >  	ldc     r1, sr
> > -
> > +	/* Save FDT address */
> > +	mov	r4, r13
> >  	/* Move myself to proper location if necessary */
> >  	mova	1f, r0
> >  	mov.l	1f, r2
> > @@ -83,7 +84,7 @@ l1:
> >  	/* Jump to the start of the decompressed kernel */
> >  	mov.l	kernel_start_addr, r0
> >  	jmp	@r0
> > -	nop
> > +	  mov	r13,r4
> >  	
> >  	.align	2
> >  bss_start_addr:
> 
> This should probably be its own patch, adding DT support for
> compressed kernel images. It's independent from everything else in
> this patch.

OK. separated.

> > diff --git a/arch/sh/boot/dts/include/dt-bindings b/arch/sh/boot/dts/include/dt-bindings
> > new file mode 120000
> > index 0000000..08c00e4
> > --- /dev/null
> > +++ b/arch/sh/boot/dts/include/dt-bindings
> > @@ -0,0 +1 @@
> > +../../../../../include/dt-bindings
> > \ No newline at end of file
> > diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
> > index 5d34605..f6bb105 100644
> > --- a/arch/sh/kernel/setup.c
> > +++ b/arch/sh/kernel/setup.c
> > @@ -177,7 +177,12 @@ disable:
> >  #ifndef CONFIG_GENERIC_CALIBRATE_DELAY
> >  void calibrate_delay(void)
> >  {
> > +#ifndef CONFIG_OF
> >  	struct clk *clk = clk_get(NULL, "cpu_clk");
> > +#else
> > +	struct device_node *cpu = of_find_node_by_name(NULL, "cpu");
> > +	struct clk *clk = of_clk_get_by_name(cpu, NULL);
> > +#endif
> >  
> >  	if (IS_ERR(clk))
> >  		panic("Need a sane CPU clock definition!");
> > @@ -251,7 +256,11 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
> >  	/* Avoid calling an __init function on secondary cpus. */
> >  	if (done) return;
> >  
> > +#ifdef CONFIG_USE_BUILTIN_DTB
> > +	dt_virt = __dtb_start;
> > +#else
> >  	dt_virt = phys_to_virt(dt_phys);
> > +#endif
> 
> This is also part of the bultin-dtb patch, which seems to have been
> spread out across several of your patches.

Sorry. It my mistake.

> >  	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
> >  		pr_crit("Error: invalid device tree blob"
> > @@ -267,8 +276,13 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
> >  
> >  void __init setup_arch(char **cmdline_p)
> >  {
> > +#ifdef CONFIG_OF
> > +	unflatten_device_tree();
> > +#endif
> >  	enable_mmu();
> 
> Was this moved to setup_arch to have it before enable_mmu? I think
> that makes sense.

early_init_dt_alloc_memory_arch used physical address.
It override on sh-specific, can after enable_mmu.
But I don't feel an advantage.

> > +#ifndef CONFIG_OF
> >  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
> >  
> >  	printk(KERN_NOTICE "Boot params:\n"
> > @@ -290,6 +304,7 @@ void __init setup_arch(char **cmdline_p)
> >  
> >  	if (!MOUNT_ROOT_RDONLY)
> >  		root_mountflags &= ~MS_RDONLY;
> > +#endif
> 
> Do these boot params only make sense for non-DT setups?
> 
> > +#if !defined(CONFIG_OF) || defined(USE_BUILTIN_DTB)
> >  	/* Save unparsed command line copy for /proc/cmdline */
> >  	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
> >  	*cmdline_p = command_line;
> > +#else
> > +	*cmdline_p = boot_command_line;
> > +#endif
> 
> I think this is wrong -- it causes the builtin command line and
> bootloader-provided command line to be ignored on DT kernels. Do you
> just want to deprecate builtin and bootloader-provided command lines?
> Or is it just a side effect of adding support for chosen/bootarg?

Yes. I think zero-page passing only non-DT.
DT using chosen/bootargs.

> >  	parse_early_param();
> >  
> > diff --git a/include/dt-bindings/interrupt-controller/sh_intc.h b/include/dt-bindings/interrupt-controller/sh_intc.h
> > new file mode 100644
> > index 0000000..8c9dcdc
> > --- /dev/null
> > +++ b/include/dt-bindings/interrupt-controller/sh_intc.h
> > @@ -0,0 +1,2 @@
> > +#define evt2irq(evt)		(((evt) >> 5) - 16)
> > +#define irq2evt(irq)		(((irq) + 16) << 5)
> 
> This seems unrelated to other things in this patch.

It using DT define.

> Rich
Yoshinori Sato May 10, 2016, 8:27 a.m. UTC | #4
On Wed, 04 May 2016 15:41:18 +0900,
Geert Uytterhoeven wrote:
> 
> On Wed, May 4, 2016 at 5:10 AM, Rich Felker <dalias@libc.org> wrote:
> >On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
> >>  static void __init sh_of_setup(char **cmdline_p)
> >>  {
> >> -     unflatten_device_tree();
> >> -
> >> -     board_time_init = sh_of_time_init;
> >> +     struct device_node *cpu;
> >> +     int freq;
> 
> You better make freq unsigned.

OK.

> >>       sh_mv.mv_name = of_flat_dt_get_machine_name();
> >>       if (!sh_mv.mv_name)
> >>               sh_mv.mv_name = "Unknown SH model";
> >>
> >>       sh_of_smp_probe();
> >> +     cpu = of_find_node_by_name(NULL, "cpu");
> >> +     if (!of_property_read_u32(cpu, "clock-frequency", &freq))
> >> +             preset_lpj = freq / 500;
> >>  }
> >
> > I setup the DT-based pseudo-board to use the generic calibrate-delay
> > rather than hard-coding lpj. Ideally we could just get rid of bogomips
> > completely but there are probably still some things using it. Is there
> > a reason you prefer making up a value for lpj based on the cpu clock
> > rate?
> 
> Calibrating the delay loop takes some time.
> However, you shouldn't hardcode 500, but take HZ into account.
> I assume you used the default HZ=250, so

That's right.
I'll fix it.

>         preset_lpj = freq / HZ / 2;
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
> 
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
> 
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
>                                 -- Linus Torvalds
Rich Felker May 10, 2016, 4:28 p.m. UTC | #5
On Tue, May 10, 2016 at 05:25:36PM +0900, Yoshinori Sato wrote:
> On Wed, 04 May 2016 12:10:05 +0900,
> Rich Felker wrote:
> > 
> > On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
> > > Changes bellow
> > > - FDT setup timing fix.
> > > - chosen/bootargs support.
> > > - zImage support.
> > > - DT binding helper macro.
> > > 
> > > Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
> > > ---
> > >  arch/sh/boards/of-generic.c                        | 23 +++++++++++-----------
> > >  arch/sh/boot/compressed/head_32.S                  |  5 +++--
> > >  arch/sh/boot/dts/include/dt-bindings               |  1 +
> > >  arch/sh/kernel/setup.c                             | 19 ++++++++++++++++++
> > >  include/dt-bindings/interrupt-controller/sh_intc.h |  2 ++
> > >  5 files changed, 36 insertions(+), 14 deletions(-)
> > >  create mode 120000 arch/sh/boot/dts/include/dt-bindings
> > >  create mode 100644 include/dt-bindings/interrupt-controller/sh_intc.h
> > > 
> > > diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
> > > index bf3a166..9570873 100644
> > > --- a/arch/sh/boards/of-generic.c
> > > +++ b/arch/sh/boards/of-generic.c
> > > @@ -112,29 +112,25 @@ static int noopi(void)
> > >  	return 0;
> > >  }
> > >  
> > > -static void __init sh_of_mem_reserve(void)
> > > +static void __init sh_of_mem_init(void)
> > >  {
> > >  	early_init_fdt_reserve_self();
> > >  	early_init_fdt_scan_reserved_mem();
> > >  }
> > >  
> > > -static void __init sh_of_time_init(void)
> > > -{
> > > -	pr_info("SH generic board support: scanning for clocksource devices\n");
> > > -	clocksource_probe();
> > > -}
> > 
> > Why did you remove this? Without it you won't get clock
> > event/clocksource devices from the device tree so the only way to have
> > a working timer interrupt is if the driver is hard-coded somewhere.
> 
> It not needed on Common Clock Framework.
> tmu define in dts.

It is needed. clocksources are something completely different from
"clk"s. A clocksource is the modern source of time data for the kernel
timekeeping system (without one, you're stuck using jiffies and very
low-res time), and the probe also gets clock_event_devices which are
the source of timer interrupts. Without this, unless you have a
hard-coded source of timer interrupt for the board, you won't get a
timer interrupt and the kernel will hang early in the boot process.

> > >  static void __init sh_of_setup(char **cmdline_p)
> > >  {
> > > -	unflatten_device_tree();
> > > -
> > > -	board_time_init = sh_of_time_init;
> > > +	struct device_node *cpu;
> > > +	int freq;
> > >  
> > >  	sh_mv.mv_name = of_flat_dt_get_machine_name();
> > >  	if (!sh_mv.mv_name)
> > >  		sh_mv.mv_name = "Unknown SH model";
> > >  
> > >  	sh_of_smp_probe();
> > > +	cpu = of_find_node_by_name(NULL, "cpu");
> > > +	if (!of_property_read_u32(cpu, "clock-frequency", &freq))
> > > +		preset_lpj = freq / 500;
> > >  }
> > 
> > I setup the DT-based pseudo-board to use the generic calibrate-delay
> > rather than hard-coding lpj. Ideally we could just get rid of bogomips
> > completely but there are probably still some things using it. Is there
> > a reason you prefer making up a value for lpj based on the cpu clock
> > rate?
> 
> clockevent initalize after calibrate delay.
> So don't work interrupt based calibrate.

Currently, it initializes before, but you removed the probe that
initializes it (above), clocksource_probe().

> > >  static int sh_of_irq_demux(int irq)
> > > @@ -167,8 +163,7 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = {
> > >  	.mv_init_irq	= sh_of_init_irq,
> > >  	.mv_clk_init	= sh_of_clk_init,
> > >  	.mv_mode_pins	= noopi,
> > > -	.mv_mem_init	= noop,
> > > -	.mv_mem_reserve	= sh_of_mem_reserve,
> > > +	.mv_mem_init	= sh_of_mem_init,
> > 
> > Is there a reason for this renaming? The function seems to be dealing
> > purely with reserving memory ranges.
> 
> mv_mem_reserve too late call in MMU system.

OK.

> > >  	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
> > >  		pr_crit("Error: invalid device tree blob"
> > > @@ -267,8 +276,13 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
> > >  
> > >  void __init setup_arch(char **cmdline_p)
> > >  {
> > > +#ifdef CONFIG_OF
> > > +	unflatten_device_tree();
> > > +#endif
> > >  	enable_mmu();
> > 
> > Was this moved to setup_arch to have it before enable_mmu? I think
> > that makes sense.
> 
> early_init_dt_alloc_memory_arch used physical address.
> It override on sh-specific, can after enable_mmu.
> But I don't feel an advantage.

I dont think we should be putting sh-specific code in
early_init_dt_alloc_memory. If calling unflatten_device_tree before
enable_mmu avoids the need to do that, it seems like the right choice.
Is this how other archs do it? I think we should try to be as
consistent as possible with general practice across the kernel.

> > > +#ifndef CONFIG_OF
> > >  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
> > >  
> > >  	printk(KERN_NOTICE "Boot params:\n"
> > > @@ -290,6 +304,7 @@ void __init setup_arch(char **cmdline_p)
> > >  
> > >  	if (!MOUNT_ROOT_RDONLY)
> > >  		root_mountflags &= ~MS_RDONLY;
> > > +#endif
> > 
> > Do these boot params only make sense for non-DT setups?
> > 
> > > +#if !defined(CONFIG_OF) || defined(USE_BUILTIN_DTB)
> > >  	/* Save unparsed command line copy for /proc/cmdline */
> > >  	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
> > >  	*cmdline_p = command_line;
> > > +#else
> > > +	*cmdline_p = boot_command_line;
> > > +#endif
> > 
> > I think this is wrong -- it causes the builtin command line and
> > bootloader-provided command line to be ignored on DT kernels. Do you
> > just want to deprecate builtin and bootloader-provided command lines?
> > Or is it just a side effect of adding support for chosen/bootarg?
> 
> Yes. I think zero-page passing only non-DT.
> DT using chosen/bootargs.

This precludes having the bootloader provide a DTB from ROM, since it
needs to be able to patch the DTB with user preferences, and also
requires DTB-patching code to be added to the bootloader. At the very
least we should retain the ability to have a builtin command line in
the kernel that's appended to the one from the DTB (and possibly allow
the order to be changed), but I think we should also allow the
bootloader to pass in a command line like in the non-DTB setup.

DTB and command line are very different things (hardware description
vs user preference, and OS-generic vs OS-specific) and the whole
chosen/bootargs system is something of a hack.

> > >  	parse_early_param();
> > >  
> > > diff --git a/include/dt-bindings/interrupt-controller/sh_intc.h b/include/dt-bindings/interrupt-controller/sh_intc.h
> > > new file mode 100644
> > > index 0000000..8c9dcdc
> > > --- /dev/null
> > > +++ b/include/dt-bindings/interrupt-controller/sh_intc.h
> > > @@ -0,0 +1,2 @@
> > > +#define evt2irq(evt)		(((evt) >> 5) - 16)
> > > +#define irq2evt(irq)		(((irq) + 16) << 5)
> > 
> > This seems unrelated to other things in this patch.
> 
> It using DT define.

Ah, I see, it's used later in the dts itself. But why not just put the
actual IRQ numbers in the dts directly? The evt numbers seem like an
implementation detail, whereas device tree bindings should be stable
and independent of kernel sources.

If evt numbers are really what makes sense to have in the dts, then
sh_intc should probably define its irq_domain so that it maps evt
numbers to irq numbers. But that doesn't seem necessary.

Rich
--
To unsubscribe from this list: send the line "unsubscribe linux-sh" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yoshinori Sato May 16, 2016, 7:36 a.m. UTC | #6
On Wed, 11 May 2016 01:28:07 +0900,
Rich Felker wrote:
> 
> On Tue, May 10, 2016 at 05:25:36PM +0900, Yoshinori Sato wrote:
> > On Wed, 04 May 2016 12:10:05 +0900,
> > Rich Felker wrote:
> > > 
> > > On Sun, May 01, 2016 at 02:08:29PM +0900, Yoshinori Sato wrote:
> > > > Changes bellow
> > > > - FDT setup timing fix.
> > > > - chosen/bootargs support.
> > > > - zImage support.
> > > > - DT binding helper macro.
> > > > 
> > > > Signed-off-by: Yoshinori Sato <ysato@users.sourceforge.jp>
> > > > ---
> > > >  arch/sh/boards/of-generic.c                        | 23 +++++++++++-----------
> > > >  arch/sh/boot/compressed/head_32.S                  |  5 +++--
> > > >  arch/sh/boot/dts/include/dt-bindings               |  1 +
> > > >  arch/sh/kernel/setup.c                             | 19 ++++++++++++++++++
> > > >  include/dt-bindings/interrupt-controller/sh_intc.h |  2 ++
> > > >  5 files changed, 36 insertions(+), 14 deletions(-)
> > > >  create mode 120000 arch/sh/boot/dts/include/dt-bindings
> > > >  create mode 100644 include/dt-bindings/interrupt-controller/sh_intc.h
> > > > 
> > > > diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
> > > > index bf3a166..9570873 100644
> > > > --- a/arch/sh/boards/of-generic.c
> > > > +++ b/arch/sh/boards/of-generic.c
> > > > @@ -112,29 +112,25 @@ static int noopi(void)
> > > >  	return 0;
> > > >  }
> > > >  
> > > > -static void __init sh_of_mem_reserve(void)
> > > > +static void __init sh_of_mem_init(void)
> > > >  {
> > > >  	early_init_fdt_reserve_self();
> > > >  	early_init_fdt_scan_reserved_mem();
> > > >  }
> > > >  
> > > > -static void __init sh_of_time_init(void)
> > > > -{
> > > > -	pr_info("SH generic board support: scanning for clocksource devices\n");
> > > > -	clocksource_probe();
> > > > -}
> > > 
> > > Why did you remove this? Without it you won't get clock
> > > event/clocksource devices from the device tree so the only way to have
> > > a working timer interrupt is if the driver is hard-coded somewhere.
> > 
> > It not needed on Common Clock Framework.
> > tmu define in dts.
> 
> It is needed. clocksources are something completely different from
> "clk"s. A clocksource is the modern source of time data for the kernel
> timekeeping system (without one, you're stuck using jiffies and very
> low-res time), and the probe also gets clock_event_devices which are
> the source of timer interrupts. Without this, unless you have a
> hard-coded source of timer interrupt for the board, you won't get a
> timer interrupt and the kernel will hang early in the boot process.

OK.

> > > >  {
> > > > -	unflatten_device_tree();
> > > > -
> > > > -	board_time_init = sh_of_time_init;
> > > > +	struct device_node *cpu;
> > > > +	int freq;
> > > >  
> > > >  	sh_mv.mv_name = of_flat_dt_get_machine_name();
> > > >  	if (!sh_mv.mv_name)
> > > >  		sh_mv.mv_name = "Unknown SH model";
> > > >  
> > > >  	sh_of_smp_probe();
> > > > +	cpu = of_find_node_by_name(NULL, "cpu");
> > > > +	if (!of_property_read_u32(cpu, "clock-frequency", &freq))
> > > > +		preset_lpj = freq / 500;
> > > >  }
> > > 
> > > I setup the DT-based pseudo-board to use the generic calibrate-delay
> > > rather than hard-coding lpj. Ideally we could just get rid of bogomips
> > > completely but there are probably still some things using it. Is there
> > > a reason you prefer making up a value for lpj based on the cpu clock
> > > rate?
> > 
> > clockevent initalize after calibrate delay.
> > So don't work interrupt based calibrate.
> 
> Currently, it initializes before, but you removed the probe that
> initializes it (above), clocksource_probe().

OK.

> > > >  static int sh_of_irq_demux(int irq)
> > > > @@ -167,8 +163,7 @@ static struct sh_machine_vector __initmv sh_of_generic_mv = {
> > > >  	.mv_init_irq	= sh_of_init_irq,
> > > >  	.mv_clk_init	= sh_of_clk_init,
> > > >  	.mv_mode_pins	= noopi,
> > > > -	.mv_mem_init	= noop,
> > > > -	.mv_mem_reserve	= sh_of_mem_reserve,
> > > > +	.mv_mem_init	= sh_of_mem_init,
> > > 
> > > Is there a reason for this renaming? The function seems to be dealing
> > > purely with reserving memory ranges.
> > 
> > mv_mem_reserve too late call in MMU system.
> 
> OK.
> 
> > > >  	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
> > > >  		pr_crit("Error: invalid device tree blob"
> > > > @@ -267,8 +276,13 @@ void __ref sh_fdt_init(phys_addr_t dt_phys)
> > > >  
> > > >  void __init setup_arch(char **cmdline_p)
> > > >  {
> > > > +#ifdef CONFIG_OF
> > > > +	unflatten_device_tree();
> > > > +#endif
> > > >  	enable_mmu();
> > > 
> > > Was this moved to setup_arch to have it before enable_mmu? I think
> > > that makes sense.
> > 
> > early_init_dt_alloc_memory_arch used physical address.
> > It override on sh-specific, can after enable_mmu.
> > But I don't feel an advantage.
> 
> I dont think we should be putting sh-specific code in
> early_init_dt_alloc_memory. If calling unflatten_device_tree before
> enable_mmu avoids the need to do that, it seems like the right choice.
> Is this how other archs do it? I think we should try to be as
> consistent as possible with general practice across the kernel.

OK.
It's considered.

> > > > +#ifndef CONFIG_OF
> > > >  	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
> > > >  
> > > >  	printk(KERN_NOTICE "Boot params:\n"
> > > > @@ -290,6 +304,7 @@ void __init setup_arch(char **cmdline_p)
> > > >  
> > > >  	if (!MOUNT_ROOT_RDONLY)
> > > >  		root_mountflags &= ~MS_RDONLY;
> > > > +#endif
> > > 
> > > Do these boot params only make sense for non-DT setups?
> > > 
> > > > +#if !defined(CONFIG_OF) || defined(USE_BUILTIN_DTB)
> > > >  	/* Save unparsed command line copy for /proc/cmdline */
> > > >  	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
> > > >  	*cmdline_p = command_line;
> > > > +#else
> > > > +	*cmdline_p = boot_command_line;
> > > > +#endif
> > > 
> > > I think this is wrong -- it causes the builtin command line and
> > > bootloader-provided command line to be ignored on DT kernels. Do you
> > > just want to deprecate builtin and bootloader-provided command lines?
> > > Or is it just a side effect of adding support for chosen/bootarg?
> > 
> > Yes. I think zero-page passing only non-DT.
> > DT using chosen/bootargs.
> 
> This precludes having the bootloader provide a DTB from ROM, since it
> needs to be able to patch the DTB with user preferences, and also
> requires DTB-patching code to be added to the bootloader. At the very
> least we should retain the ability to have a builtin command line in
> the kernel that's appended to the one from the DTB (and possibly allow
> the order to be changed), but I think we should also allow the
> bootloader to pass in a command line like in the non-DTB setup.
> 
> DTB and command line are very different things (hardware description
> vs user preference, and OS-generic vs OS-specific) and the whole
> chosen/bootargs system is something of a hack.

It's better to decide a requirement to a boot loader.
u-boot is passing to bootargs in easy way.

> > > >  	parse_early_param();
> > > >  
> > > > diff --git a/include/dt-bindings/interrupt-controller/sh_intc.h b/include/dt-bindings/interrupt-controller/sh_intc.h
> > > > new file mode 100644
> > > > index 0000000..8c9dcdc
> > > > --- /dev/null
> > > > +++ b/include/dt-bindings/interrupt-controller/sh_intc.h
> > > > @@ -0,0 +1,2 @@
> > > > +#define evt2irq(evt)		(((evt) >> 5) - 16)
> > > > +#define irq2evt(irq)		(((irq) + 16) << 5)
> > > 
> > > This seems unrelated to other things in this patch.
> > 
> > It using DT define.
> 
> Ah, I see, it's used later in the dts itself. But why not just put the
> actual IRQ numbers in the dts directly? The evt numbers seem like an
> implementation detail, whereas device tree bindings should be stable
> and independent of kernel sources.

An IRQ is the virtual value, so it's necessary to convert from EVT.
SH3/4 interrupt controller using EVT.

> If evt numbers are really what makes sense to have in the dts, then
> sh_intc should probably define its irq_domain so that it maps evt
> numbers to irq numbers. But that doesn't seem necessary.

It good way.

> 
> Rich
diff mbox

Patch

diff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c
index bf3a166..9570873 100644
--- a/arch/sh/boards/of-generic.c
+++ b/arch/sh/boards/of-generic.c
@@ -112,29 +112,25 @@  static int noopi(void)
 	return 0;
 }
 
-static void __init sh_of_mem_reserve(void)
+static void __init sh_of_mem_init(void)
 {
 	early_init_fdt_reserve_self();
 	early_init_fdt_scan_reserved_mem();
 }
 
-static void __init sh_of_time_init(void)
-{
-	pr_info("SH generic board support: scanning for clocksource devices\n");
-	clocksource_probe();
-}
-
 static void __init sh_of_setup(char **cmdline_p)
 {
-	unflatten_device_tree();
-
-	board_time_init = sh_of_time_init;
+	struct device_node *cpu;
+	int freq;
 
 	sh_mv.mv_name = of_flat_dt_get_machine_name();
 	if (!sh_mv.mv_name)
 		sh_mv.mv_name = "Unknown SH model";
 
 	sh_of_smp_probe();
+	cpu = of_find_node_by_name(NULL, "cpu");
+	if (!of_property_read_u32(cpu, "clock-frequency", &freq))
+		preset_lpj = freq / 500;
 }
 
 static int sh_of_irq_demux(int irq)
@@ -167,8 +163,7 @@  static struct sh_machine_vector __initmv sh_of_generic_mv = {
 	.mv_init_irq	= sh_of_init_irq,
 	.mv_clk_init	= sh_of_clk_init,
 	.mv_mode_pins	= noopi,
-	.mv_mem_init	= noop,
-	.mv_mem_reserve	= sh_of_mem_reserve,
+	.mv_mem_init	= sh_of_mem_init,
 };
 
 struct sh_clk_ops;
@@ -194,3 +189,7 @@  static int __init sh_of_device_init(void)
 	return 0;
 }
 arch_initcall_sync(sh_of_device_init);
+
+void intc_finalize(void)
+{
+}
diff --git a/arch/sh/boot/compressed/head_32.S b/arch/sh/boot/compressed/head_32.S
index 3e15032..cd34377 100644
--- a/arch/sh/boot/compressed/head_32.S
+++ b/arch/sh/boot/compressed/head_32.S
@@ -14,7 +14,8 @@  startup:
 	/* Load initial status register */
 	mov.l   init_sr, r1
 	ldc     r1, sr
-
+	/* Save FDT address */
+	mov	r4, r13
 	/* Move myself to proper location if necessary */
 	mova	1f, r0
 	mov.l	1f, r2
@@ -83,7 +84,7 @@  l1:
 	/* Jump to the start of the decompressed kernel */
 	mov.l	kernel_start_addr, r0
 	jmp	@r0
-	nop
+	  mov	r13,r4
 	
 	.align	2
 bss_start_addr:
diff --git a/arch/sh/boot/dts/include/dt-bindings b/arch/sh/boot/dts/include/dt-bindings
new file mode 120000
index 0000000..08c00e4
--- /dev/null
+++ b/arch/sh/boot/dts/include/dt-bindings
@@ -0,0 +1 @@ 
+../../../../../include/dt-bindings
\ No newline at end of file
diff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c
index 5d34605..f6bb105 100644
--- a/arch/sh/kernel/setup.c
+++ b/arch/sh/kernel/setup.c
@@ -177,7 +177,12 @@  disable:
 #ifndef CONFIG_GENERIC_CALIBRATE_DELAY
 void calibrate_delay(void)
 {
+#ifndef CONFIG_OF
 	struct clk *clk = clk_get(NULL, "cpu_clk");
+#else
+	struct device_node *cpu = of_find_node_by_name(NULL, "cpu");
+	struct clk *clk = of_clk_get_by_name(cpu, NULL);
+#endif
 
 	if (IS_ERR(clk))
 		panic("Need a sane CPU clock definition!");
@@ -251,7 +256,11 @@  void __ref sh_fdt_init(phys_addr_t dt_phys)
 	/* Avoid calling an __init function on secondary cpus. */
 	if (done) return;
 
+#ifdef CONFIG_USE_BUILTIN_DTB
+	dt_virt = __dtb_start;
+#else
 	dt_virt = phys_to_virt(dt_phys);
+#endif
 
 	if (!dt_virt || !early_init_dt_scan(dt_virt)) {
 		pr_crit("Error: invalid device tree blob"
@@ -267,8 +276,13 @@  void __ref sh_fdt_init(phys_addr_t dt_phys)
 
 void __init setup_arch(char **cmdline_p)
 {
+#ifdef CONFIG_OF
+	unflatten_device_tree();
+#endif
 	enable_mmu();
 
+
+#ifndef CONFIG_OF
 	ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
 
 	printk(KERN_NOTICE "Boot params:\n"
@@ -290,6 +304,7 @@  void __init setup_arch(char **cmdline_p)
 
 	if (!MOUNT_ROOT_RDONLY)
 		root_mountflags &= ~MS_RDONLY;
+#endif
 	init_mm.start_code = (unsigned long) _text;
 	init_mm.end_code = (unsigned long) _etext;
 	init_mm.end_data = (unsigned long) _edata;
@@ -312,9 +327,13 @@  void __init setup_arch(char **cmdline_p)
 #endif
 #endif
 
+#if !defined(CONFIG_OF) || defined(USE_BUILTIN_DTB)
 	/* Save unparsed command line copy for /proc/cmdline */
 	memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
 	*cmdline_p = command_line;
+#else
+	*cmdline_p = boot_command_line;
+#endif
 
 	parse_early_param();
 
diff --git a/include/dt-bindings/interrupt-controller/sh_intc.h b/include/dt-bindings/interrupt-controller/sh_intc.h
new file mode 100644
index 0000000..8c9dcdc
--- /dev/null
+++ b/include/dt-bindings/interrupt-controller/sh_intc.h
@@ -0,0 +1,2 @@ 
+#define evt2irq(evt)		(((evt) >> 5) - 16)
+#define irq2evt(irq)		(((irq) + 16) << 5)