Re: round2 [PATCH 3/6] Introduce the sparc-leon CPU type. Add sparc_leon enum, M_LEON|M_LEON3_SOC machine. Add compilation of leon.c in mm and kernel if CONFIG_SPARC_LEON is defined. Add sparc_leon dependent initialization to switch statements + head.S.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jun 12, 2009 at 10:44:04AM +0200, konrad@xxxxxxxxxxx wrote:
> From: Konrad Eisele <konrad@xxxxxxxxxxx>
> 
> ---
>  arch/sparc/include/asm/machines.h  |    6 +++++-
>  arch/sparc/include/asm/system_32.h |    1 +
>  arch/sparc/kernel/Makefile         |    2 ++
>  arch/sparc/kernel/cpu.c            |    5 +++++
>  arch/sparc/kernel/head_32.S        |    8 ++++++++
>  arch/sparc/kernel/idprom.c         |    2 ++
>  arch/sparc/kernel/irq_32.c         |    7 +++++++
>  arch/sparc/kernel/setup_32.c       |    5 +++++
>  arch/sparc/mm/Makefile             |    1 +
>  arch/sparc/mm/init_32.c            |    4 ++++
>  arch/sparc/mm/loadmmu.c            |    1 +
>  11 files changed, 41 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/sparc/include/asm/machines.h b/arch/sparc/include/asm/machines.h
> index c28c2f2..cd9c099 100644
> --- a/arch/sparc/include/asm/machines.h
> +++ b/arch/sparc/include/asm/machines.h
> @@ -15,7 +15,7 @@ struct Sun_Machine_Models {
>  /* Current number of machines we know about that has an IDPROM
>   * machtype entry including one entry for the 0x80 OBP machines.
>   */
> -#define NUM_SUN_MACHINES   15
> +#define NUM_SUN_MACHINES   16
>  
>  /* The machine type in the idprom area looks like this:
>   *
> @@ -30,6 +30,7 @@ struct Sun_Machine_Models {
>  
>  #define SM_ARCH_MASK  0xf0
>  #define SM_SUN4       0x20
> +#define  M_LEON       0x30
>  #define SM_SUN4C      0x50
>  #define SM_SUN4M      0x70
>  #define SM_SUN4M_OBP  0x80
> @@ -41,6 +42,9 @@ struct Sun_Machine_Models {
>  #define SM_4_330      0x03    /* Sun 4/300 series */
>  #define SM_4_470      0x04    /* Sun 4/400 series */
>  
> +/* Leon machines */
> +#define M_LEON3_SOC   0x02    /* Leon3 SoC */
> +
>  /* Sun4c machines                Full Name              - PROM NAME */
>  #define SM_4C_SS1     0x01    /* Sun4c SparcStation 1   - Sun 4/60  */
>  #define SM_4C_IPC     0x02    /* Sun4c SparcStation IPC - Sun 4/40  */
> diff --git a/arch/sparc/include/asm/system_32.h b/arch/sparc/include/asm/system_32.h
> index 751c8c1..890036b 100644
> --- a/arch/sparc/include/asm/system_32.h
> +++ b/arch/sparc/include/asm/system_32.h
> @@ -32,6 +32,7 @@ enum sparc_cpu {
>    sun4u       = 0x05, /* V8 ploos ploos */
>    sun_unknown = 0x06,
>    ap1000      = 0x07, /* almost a sun4m */
> +  sparc_leon  = 0x08, /* Leon SoC */
>  };
>  
>  /* Really, userland should not be looking at any of this... */
> diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
> index 54742e5..8518fba 100644
> --- a/arch/sparc/kernel/Makefile
> +++ b/arch/sparc/kernel/Makefile
> @@ -40,6 +40,8 @@ obj-y                   += prom_$(BITS).o
>  obj-y                   += of_device_$(BITS).o
>  obj-$(CONFIG_SPARC64)   += prom_irqtrans.o
>  
> +obj-$(CONFIG_SPARC_LEON)+= leon_kernel.o
> +
>  obj-$(CONFIG_SPARC64)   += reboot.o
>  obj-$(CONFIG_SPARC64)   += sysfs.o
>  obj-$(CONFIG_SPARC64)   += iommu.o
> diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c
> index d85c3dc..1446df9 100644
> --- a/arch/sparc/kernel/cpu.c
> +++ b/arch/sparc/kernel/cpu.c
> @@ -312,7 +312,12 @@ void __cpuinit cpu_probe(void)
>  
>  	psr = get_psr();
>  	put_psr(psr | PSR_EF);
> +#ifdef CONFIG_SPARC_LEON
> +	fpu_vers = 7;
> +#else
>  	fpu_vers = ((get_fsr() >> 17) & 0x7);
> +#endif
> +
>  	put_psr(psr);
>  
>  	set_cpu_and_fpu(psr_impl, psr_vers, fpu_vers);
> diff --git a/arch/sparc/kernel/head_32.S b/arch/sparc/kernel/head_32.S
> index f0b4b51..847b0ac 100644
> --- a/arch/sparc/kernel/head_32.S
> +++ b/arch/sparc/kernel/head_32.S
> @@ -814,6 +814,10 @@ got_prop:
>  
>  		cmp	%l1, ' '
>  		be	1f
> +#ifdef CONFIG_SPARC_LEON
> +		 cmp	%l1, '2'		! leon2 or compatible
> +		be	1f
> +#endif
>  		 cmp	%l1, 'c'
>  		be	1f
>  		 cmp	%l1, 'm'
> @@ -836,6 +840,10 @@ got_prop:
>  		be	sun4m_init
>  		 cmp	%l1, 'd'		! Let us see how the beast will die
>  		be	sun4d_init
> +#ifdef CONFIG_SPARC_LEON
> +		 cmp	%l1, '2'		! leon2 or compatible
> +		be	sun4c_continue_boot
> +#endif
>  		 nop

When I look at the above I ask myself:
Why does the sparc-leon need the ifdeffery but not
the rest?

Also this looks like some leon2 specifics but we only
support leon3 in this patch set?


> diff --git a/arch/sparc/kernel/irq_32.c b/arch/sparc/kernel/irq_32.c
> index ad800b8..c51641e 100644
> --- a/arch/sparc/kernel/irq_32.c
> +++ b/arch/sparc/kernel/irq_32.c
> @@ -639,6 +639,7 @@ void __init init_IRQ(void)
>  	extern void sun4c_init_IRQ( void );
>  	extern void sun4m_init_IRQ( void );
>  	extern void sun4d_init_IRQ( void );
> +	extern void leon_init_IRQ(void);

I do not care that the others does it so.
This prototype belongs in a header.

Bonus points for a patch that moves the other
to a header!

>  
>  	switch(sparc_cpu_model) {
>  	case sun4c:
> @@ -661,6 +662,12 @@ void __init init_IRQ(void)
>  		sun4d_init_IRQ();
>  		break;
>  
> +#ifdef CONFIG_SPARC_LEON
> +	case sparc_leon:
> +		leon_init_IRQ();
> +		break;
> +#endif

This ifdef makes some sense..
But I had rather avoided it.
It is included so we do not build leon3 support
per default.

Could we make leon_init_IRQ() a nop in the none-leon case and
drop the ifdef?


> +
>  	default:
>  		prom_printf("Cannot initialize IRQs on this Sun machine...");
>  		break;
> diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c
> index 998cadb..09c092d 100644
> --- a/arch/sparc/kernel/setup_32.c
> +++ b/arch/sparc/kernel/setup_32.c
> @@ -235,6 +235,8 @@ void __init setup_arch(char **cmdline_p)
>  		sparc_cpu_model = sun4e;
>  	if (!strcmp(&cputypval,"sun4u"))
>  		sparc_cpu_model = sun4u;
> +	if (!strcmp(&cputypval, "leon2"))
> +		sparc_cpu_model = sparc_leon;

leon2 or leon3?

>  
>  	printk("ARCH: ");
>  	switch(sparc_cpu_model) {
> @@ -256,6 +258,9 @@ void __init setup_arch(char **cmdline_p)
>  	case sun4u:
>  		printk("SUN4U\n");
>  		break;
> +	case sparc_leon:
> +		printk("LEON\n");
> +		break;
>  	default:
>  		printk("UNKNOWN!\n");
>  		break;
> diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile
> index 681abe0..79836a7 100644
> --- a/arch/sparc/mm/Makefile
> +++ b/arch/sparc/mm/Makefile
> @@ -11,6 +11,7 @@ obj-$(CONFIG_SPARC32)   += loadmmu.o
>  obj-y                   += generic_$(BITS).o
>  obj-$(CONFIG_SPARC32)   += extable.o btfixup.o srmmu.o iommu.o io-unit.o
>  obj-$(CONFIG_SPARC32)   += hypersparc.o viking.o tsunami.o swift.o
> +obj-$(CONFIG_SPARC_LEON)+= leon_mm.o
>  
>  # Only used by sparc64
>  obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
> diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c
> index 26bb391..54114ad 100644
> --- a/arch/sparc/mm/init_32.c
> +++ b/arch/sparc/mm/init_32.c
> @@ -34,6 +34,7 @@
>  #include <asm/pgalloc.h>	/* bug in asm-generic/tlb.h: check_pgt_cache */
>  #include <asm/tlb.h>
>  #include <asm/prom.h>
> +#include <asm/leon.h>
>  
>  DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
>  
> @@ -326,6 +327,9 @@ void __init paging_init(void)
>  		sparc_unmapped_base = 0xe0000000;
>  		BTFIXUPSET_SETHI(sparc_unmapped_base, 0xe0000000);
>  		break;
> +	case sparc_leon:
> +		leon_init();
> +		/* fall through */
>  	case sun4m:
>  	case sun4d:
>  		srmmu_paging_init();
> diff --git a/arch/sparc/mm/loadmmu.c b/arch/sparc/mm/loadmmu.c
> index 652be05..82ec8f6 100644
> --- a/arch/sparc/mm/loadmmu.c
> +++ b/arch/sparc/mm/loadmmu.c
> @@ -33,6 +33,7 @@ void __init load_mmu(void)
>  		break;
>  	case sun4m:
>  	case sun4d:
> +	case sparc_leon:
>  		ld_mmu_srmmu();
>  		break;
>  	default:
> -- 
> 1.6.3.2
> 
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux