All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tom Rix <tom@bumblecow.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] ARM1176: Coexist with other ARM1176 platforms
Date: Mon, 26 Apr 2010 08:10:45 -0500	[thread overview]
Message-ID: <4BD590D5.200@bumblecow.com> (raw)
In-Reply-To: <1268327842-20372-1-git-send-email-cyril@ti.com>

Cyril Chemparathy wrote:
> The current ARM1176 CPU specific code is too specific to the SMDK6400
> architecture.  The following changes were necessary prerequisites for the
> addition of other SoCs based on ARM1176.
> 
> Existing board's (SMDK6400) configuration has been modified to keep behavior
> unchanged despite these changes.
> 
> 1. Peripheral port remap configurability
> The earlier code had hardcoded remap values specific to s3c64xx in start.S.
> This change makes the peripheral port remap addresses and sizes configurable.
> 
> 2. Skip low level initialization
> Ability to skip low level initialization if necessary.  Many other platforms
> have a similar capability, and this is quite useful during debug/bring-up.
> 
> 3. U-Boot code relocation support
> Most architectures allow u-boot code to run initially at a different
> address (possibly in NOR) and then get relocated to its final resting place
> in RAM.  Added support for this capability in ARM1176 architecture.
> 
> 4. Disable TCM if necessary
> If a ROM based bootloader happened to have initialized TCM, we disable it here
> to keep things sane.
> 
> 5. Remove unnecessary SoC specific includes
> ARM1176 code does not really need this SoC specific include.  The presence
> of this include prevents builds on other ARM1176 archs.
> 
> 6. ARM926 style MMU disable when !CONFIG_ENABLE_MMU
> The original MMU disable code masks out too many bits from the load address
> when it tries to figure out the physical address of the jump target label.
> Consequently, it ends up branching to the wrong address after disabling the
> MMU.
> 
> Signed-off-by: Cyril Chemparathy <cyril@ti.com>
> ---
>  cpu/arm1176/cpu.c          |    1 -
>  cpu/arm1176/start.S        |   60 ++++++++++++++++++++++++++++++++++++++------
>  include/configs/smdk6400.h |    6 ++++
>  3 files changed, 58 insertions(+), 9 deletions(-)
> 
> diff --git a/cpu/arm1176/cpu.c b/cpu/arm1176/cpu.c
> index 2c0014f..c0fd114 100644
> --- a/cpu/arm1176/cpu.c
> +++ b/cpu/arm1176/cpu.c
> @@ -33,7 +33,6 @@
>  
>  #include <common.h>
>  #include <command.h>
> -#include <asm/arch/s3c6400.h>
>  #include <asm/system.h>
>  
>  static void cache_flush (void);
> diff --git a/cpu/arm1176/start.S b/cpu/arm1176/start.S
> index 68a356d..beec574 100644
> --- a/cpu/arm1176/start.S
> +++ b/cpu/arm1176/start.S
> @@ -1,5 +1,5 @@
>  /*
> - *  armboot - Startup Code for S3C6400/ARM1176 CPU-core
> + *  armboot - Startup Code for ARM1176 CPU-core
>   *
>   * Copyright (c) 2007	Samsung Electronics
>   *
> @@ -35,7 +35,6 @@
>  #ifdef CONFIG_ENABLE_MMU
>  #include <asm/proc/domain.h>
>  #endif
> -#include <asm/arch/s3c6400.h>
>  
>  #if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)
>  #define CONFIG_SYS_PHY_UBOOT_BASE	CONFIG_SYS_UBOOT_BASE
> @@ -145,6 +144,7 @@ reset:
>   *
>   *************************************************************************
>   */
> +#ifndef CONFIG_SKIP_LOWLEVEL_INIT

CONFIG_SKIP_LOWLEVEL_INIT is not used in the other patches.
Why is this needed ?
board/samsung/samsung/smdk6400 has a lowlevel_init.o function.
It is confusing why this function is being if-def and not the real
lowlevel_init..

>  	/*
>  	 * we do sys-critical inits only at reboot,
>  	 * not when booting from ram!
> @@ -170,6 +170,8 @@ cpu_init_crit:
>  	bic	r0, r0, #0x00000087	@ clear bits 7, 2:0 (B--- -CAM)
>  	orr	r0, r0, #0x00000002	@ set bit 2 (A) Align
>  	orr	r0, r0, #0x00001000	@ set bit 12 (I) I-Cache
> +
> +#ifdef CONFIG_ENABLE_MMU

This logic is may not be quite correct
 From include/configs/smdk6400.h
#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
Please check

>  	/* Prepare to disable the MMU */
>  	adr	r1, mmu_disable_phys
>  	/* We presume we're within the first 1024 bytes */
> @@ -187,20 +189,60 @@ mmu_disable:
>  	nop
>  	nop
>  	mov	pc, r2
> +mmu_disable_phys:
> +#else
> +	mcr	p15, 0, r0, c1, c0, 0

Are the noop's above needed here?

>  #endif
>  
> -mmu_disable_phys:
> +#ifdef CONFIG_DISABLE_TCM
> +	/*
> +	 * Disable the TCMs
> +	 */
> +	mrc	p15, 0, r0, c0, c0, 2	/* Return TCM details */
> +	cmp	r0, #0
> +	beq	skip_tcmdisable
> +	mov	r1, #0
> +	mov	r2, #1
> +	tst	r0, r2
> +	mcrne	p15, 0, r1, c9, c1, 1	/* Disable Instruction TCM if present*/
> +	tst	r0, r2, LSL #16
> +	mcrne	p15, 0, r1, c9, c1, 0	/* Disable Data TCM if present*/
> +skip_tcmdisable:
> +#endif
> +#endif
> +
> +#ifdef CONFIG_PERIPORT_REMAP
>  	/* Peri port setup */
> -	ldr	r0, =0x70000000
> -	orr	r0, r0, #0x13
> +	ldr	r0, =CONFIG_PERIPORT_BASE
> +	orr	r0, r0, #CONFIG_PERIPORT_SIZE
>  	mcr	p15,0,r0,c15,c2,4       @ 256M (0x70000000 - 0x7fffffff)

This comment '@ 256 .. ' is no longer valid.

> +#endif
>  
>  	/*
>  	 * Go setup Memory and board specific bits prior to relocation.
>  	 */
>  	bl	lowlevel_init		/* go setup pll,mux,memory */
> +#endif /* CONFIG_SKIP_LOWLEVEL_INIT */
> +
> +#ifndef CONFIG_SKIP_RELOCATE_UBOOT
> +relocate:				/* relocate U-Boot to RAM	    */
> +	adr	r0, _start		/* r0 <- current position of code   */
> +	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
> +	cmp     r0, r1                  /* don't reloc during debug         */
> +	beq     stack_setup
> +
> +	ldr	r2, _armboot_start
> +	ldr	r3, _bss_start
> +	sub	r2, r3, r2		/* r2 <- size of armboot            */
> +	add	r2, r0, r2		/* r2 <- source end address         */
> +
> +copy_loop:
> +	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
> +	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
> +	cmp	r0, r2			/* until source end addreee [r2]    */
> +	ble	copy_loop
> +#endif	/* CONFIG_SKIP_RELOCATE_UBOOT */
>  
> -after_copy:
>  #ifdef CONFIG_ENABLE_MMU
>  enable_mmu:
>  	/* enable domain access */
> @@ -236,9 +278,9 @@ mmu_enable:
>  	nop
>  	nop
>  	mov	pc, r2
> +skip_hw_init:
>  #endif
>  
> -skip_hw_init:
>  	/* Set up the stack						    */
>  stack_setup:
>  	ldr	r0, =CONFIG_SYS_UBOOT_BASE	/* base of copy in DRAM	    */
> @@ -306,6 +348,8 @@ phy_last_jump:
>  	mov	r0, #0
>  	mov	pc, r9
>  #endif
> +
> +
>  /*
>   *************************************************************************
>   *
> @@ -373,7 +417,7 @@ phy_last_jump:
>  	ldr	r13, _armboot_start
>  	/* move past malloc pool */
>  	sub	r13, r13, #(CONFIG_SYS_MALLOC_LEN)
> -	/* move to reserved a couple spots for abort stack */
> +	/* reserved a couple spots for abort stack */

The old comment makes more sense.
Revert this.


>  	sub	r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE + 8)
>  
>  	/* save caller lr in position 0 of saved stack */
> diff --git a/include/configs/smdk6400.h b/include/configs/smdk6400.h
> index f04feae..7b4501d 100644
> --- a/include/configs/smdk6400.h
> +++ b/include/configs/smdk6400.h
> @@ -40,6 +40,12 @@
>  #define CONFIG_S3C64XX		1	/* in a SAMSUNG S3C64XX Family  */
>  #define CONFIG_SMDK6400		1	/* on a SAMSUNG SMDK6400 Board  */
>  
> +#define CONFIG_SKIP_RELOCATE_UBOOT

There is logic later in this file to undef this value.
This is likely an error.
If it isn't, add a comment.

> +
> +#define CONFIG_PERIPORT_REMAP
> +#define CONFIG_PERIPORT_BASE	0x70000000
> +#define CONFIG_PERIPORT_SIZE	0x13
> +
>  #define CONFIG_SYS_SDRAM_BASE	0x50000000
>  
>  /* input clock of PLL: SMDK6400 has 12MHz input clock */

Tom

  parent reply	other threads:[~2010-04-26 13:10 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-11 17:17 [U-Boot] [PATCH] ARM1176: Coexist with other ARM1176 platforms Cyril Chemparathy
2010-03-14 20:53 ` Tom
2010-03-14 21:47   ` Chemparathy, Cyril
2010-03-16 13:09     ` Tom
2010-03-16 19:16       ` Chemparathy, Cyril
2010-04-26 13:10 ` Tom Rix [this message]
2010-04-30 19:43   ` Cyril Chemparathy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BD590D5.200@bumblecow.com \
    --to=tom@bumblecow.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.