[U-Boot] [PATCH] ppc4xx: Optimize PLB4 arbiter and Memory Queue settings for PPC 440SP/SPe and 460EX/GT/SX

Stefan Roese sr at denx.de
Tue Aug 12 09:40:36 CEST 2008


On Tuesday 12 August 2008, prodyut hazarika wrote:
> Read Pipeline depth should be set to 4 for PPC440SP/SPE, PPC405EX,
> PPC460EX/GT/SX processors.
> Optimize Memory Queue settings for PPC440SP/SPE and  PPC460EX/GT/SX
> processors Please apply patch against next branch of Stefan's git tree.
>
> Signed-off-by: Prodyut Hazarika <phazarika at amcc.com>

Patch is line-wrapped this time. I suggest that you use git-send-email to send 
your git formatted patches.

Please find some more comments below.

> ---
>  cpu/ppc4xx/44x_spd_ddr2.c      |   28 +++++++++++++++++---
>  cpu/ppc4xx/cpu_init.c          |   21 ++++++++++++++-
>  include/asm-ppc/ppc4xx-sdram.h |   48 +++++++++++++++++++++++-----------
>  include/ppc440.h               |   47 ----------------------------------
>  include/ppc4xx.h               |   55
> ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 131
> insertions(+), 68 deletions(-)
>
> diff --git a/cpu/ppc4xx/44x_spd_ddr2.c b/cpu/ppc4xx/44x_spd_ddr2.c
> index 1c36324..2ba7715 100644
> --- a/cpu/ppc4xx/44x_spd_ddr2.c
> +++ b/cpu/ppc4xx/44x_spd_ddr2.c
> @@ -2172,6 +2172,11 @@ static void program_memory_queue(unsigned long
> *dimm_populated,
>  	unsigned long i;
>  	unsigned long bank_0_populated = 0;
>  	phys_size_t total_size = 0;
> +#if defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
> +    defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
> +    defined(CONFIG_460SX)
> +	unsigned long val;
> +#endif
>
>  	/*------------------------------------------------------------------
>  	 * Reset the rank_base_address.
> @@ -2249,18 +2254,33 @@ static void program_memory_queue(unsigned long
> *dimm_populated,
>  		}
>  	}
>
> -#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
> +#if defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
> +    defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
> +    defined(CONFIG_460SX)
> +
>  	/*
> -	 * Enable high bandwidth access on 460EX/GT.
> -	 * This should/could probably be done on other
> -	 * PPC's too, like 440SPe.
> +	 * Enable high bandwidth access
>  	 * This is currently not used, but with this setup
>  	 * it is possible to use it later on in e.g. the Linux
>  	 * EMAC driver for performance gain.
>  	 */
>  	mtdcr(SDRAM_PLBADDULL, 0x00000000); /* MQ0_BAUL */
>  	mtdcr(SDRAM_PLBADDUHB, 0x00000008); /* MQ0_BAUH */
> +
> +	/*
> +	 * Set optimal value for Memory Queue HB/LL Configuration registers
> +	 */
> +
> +	val = (mfdcr(SDRAM_CONF1HB) | SDRAM_CONF1HB_AAFR |
> SDRAM_CONF1HB_RPEN | SDRAM_CONF1HB_RFTE);
> +	mtdcr(SDRAM_CONF1HB, val);
> +
> +	val = (mfdcr(SDRAM_CONF1LL) | SDRAM_CONF1LL_AAFR |
> SDRAM_CONF1LL_RPEN | SDRAM_CONF1LL_RFTE);
> +	mtdcr(SDRAM_CONF1LL, val);
> +
> +	val = (mfdcr(SDRAM_CONFPATHB) | SDRAM_CONFPATHB_TPEN);
> +	mtdcr(SDRAM_CONFPATHB, val);
>  #endif
> +

Nitpick: Don't add this empty line here.

>  }
>
> 
> /*-------------------------------------------------------------------------
>----+ diff --git a/cpu/ppc4xx/cpu_init.c b/cpu/ppc4xx/cpu_init.c
> index e2d0402..033d4f5 100644
> --- a/cpu/ppc4xx/cpu_init.c
> +++ b/cpu/ppc4xx/cpu_init.c
> @@ -138,7 +138,9 @@ void reconfigure_pll(u32 new_cpu_freq)
>  void
>  cpu_init_f (void)
>  {
> -#if defined(CONFIG_WATCHDOG) || defined(CONFIG_440GX) ||
> defined(CONFIG_460EX) +#if defined(CONFIG_WATCHDOG) ||
> defined(CONFIG_440GX) ||
> defined(CONFIG_460EX) || \
> +    defined(CONFIG_440SP) || defined(CONFIG_440SPE) ||
> defined(CONFIG_405EX)    || \
> +    defined (CONFIG_460GT) || defined(CONFIG_460SX)

No space after "defined" please. -> "defined("

>  	u32 val;
>  #endif
>
> @@ -301,6 +303,23 @@ cpu_init_f (void)
>  	val |= 0x400;
>  	mtsdr(SDR0_USB2HOST_CFG, val);
>  #endif /* CONFIG_460EX */
> +
> +#if defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
> +    defined(CONFIG_460EX) || defined(CONFIG_460GT)  || \
> +    defined(CONFIG_405EX) || defined(CONFIG_460SX)

Why don't you add 440GP and 440GX here? From my understanding they would 
benefit from this pipeline change too.

> +
> +	/*
> +	 * Set PLB4 arbiter (Segment 0 and 1) to 4 deep pipeline read
> +	 */
> +
> +	val = (mfdcr(plb0_acr) & ~plb0_acr_rdp_mask) | plb0_acr_rdp_4deep;
> +	mtdcr(plb0_acr, val);
> +
> +	val = (mfdcr(plb1_acr) & ~plb1_acr_rdp_mask) | plb1_acr_rdp_4deep;
> +	mtdcr(plb1_acr, val);
> +
> +#endif /* CONFIG_440SP/SPE || CONFIG_460EX/GT || CONFIG_405EX */
> +

Again, please don't add this empty line here before the "}".

>  }
>
>  /*
> diff --git a/include/asm-ppc/ppc4xx-sdram.h
> b/include/asm-ppc/ppc4xx-sdram.h index df787b3..d2e3b42 100644
> --- a/include/asm-ppc/ppc4xx-sdram.h
> +++ b/include/asm-ppc/ppc4xx-sdram.h
> @@ -259,23 +259,39 @@
>  /*
>   * Memory queue defines
>   */
> -#define SDRAMQ_DCR_BASE	0x040
> -
> -#define SDRAM_R0BAS	(SDRAMQ_DCR_BASE+0x0)	/* rank 0 base address & size 
> */ -#define SDRAM_R1BAS	(SDRAMQ_DCR_BASE+0x1)	/* rank 1 base address & size
>  */ -#define SDRAM_R2BAS	(SDRAMQ_DCR_BASE+0x2)	/* rank 2 base address &
> size  */ -#define SDRAM_R3BAS	(SDRAMQ_DCR_BASE+0x3)	/* rank 3 base address
> & size  */ -#define SDRAM_CONF1HB	(SDRAMQ_DCR_BASE+0x5)	/* configuration 1
> HB          */ -#define SDRAM_ERRSTATHB	(SDRAMQ_DCR_BASE+0x7)	/* error
> status HB             */ -#define SDRAM_ERRADDUHB	(SDRAMQ_DCR_BASE+0x8)	/*
> error address upper 32 HB   */ -#define
> SDRAM_ERRADDLHB	(SDRAMQ_DCR_BASE+0x9)	/* error address lower 32 HB   */
> -#define SDRAM_PLBADDULL	(SDRAMQ_DCR_BASE+0xA)	/* PLB base address upper 32
> LL */
> -#define SDRAM_CONF1LL	(SDRAMQ_DCR_BASE+0xB)	/* configuration 1 LL         
> */ -#define SDRAM_ERRSTATLL	(SDRAMQ_DCR_BASE+0xC)	/* error status LL       
>      */ -#define SDRAM_ERRADDULL	(SDRAMQ_DCR_BASE+0xD)	/* error address
> upper 32 LL   */ -#define SDRAM_ERRADDLLL	(SDRAMQ_DCR_BASE+0xE)	/* error
> address lower 32 LL   */ -#define SDRAM_CONFPATHB	(SDRAMQ_DCR_BASE+0xF)	/*
> configuration between paths */ -#define
> SDRAM_PLBADDUHB	(SDRAMQ_DCR_BASE+0x10)	/* PLB base address upper 32 LL */
> +#define SDRAMQ_DCR_BASE 0x040
> +
> +#define SDRAM_R0BAS     (SDRAMQ_DCR_BASE+0x0)   /* rank 0 base
> address & size  */
> +#define SDRAM_R1BAS     (SDRAMQ_DCR_BASE+0x1)   /* rank 1 base
> address & size  */
> +#define SDRAM_R2BAS     (SDRAMQ_DCR_BASE+0x2)   /* rank 2 base
> address & size  */
> +#define SDRAM_R3BAS     (SDRAMQ_DCR_BASE+0x3)   /* rank 3 base
> address & size  */
> +#define SDRAM_CONF1HB   (SDRAMQ_DCR_BASE+0x5)   /* configuration 1 HB
>          */
> +#define SDRAM_CONF1HB_AAFR   0x80000000         /* Address Ack on
> First Request - Bit 0 */
> +#define SDRAM_CONF1HB_PRPD   0x00080000         /* PLB Read pipeline
> Disable - Bit 12 */
> +#define SDRAM_CONF1HB_PWPD   0x00040000         /* PLB Write pipeline
> Disable - Bit 13 */
> +#define SDRAM_CONF1HB_PRW    0x00020000         /* PLB Read Wait - Bit 14
> */ +#define SDRAM_CONF1HB_RPEN   0x00000800         /* Read Passing
> Enable - Bit 20 */
> +#define SDRAM_CONF1HB_RFTE   0x00000400         /* Read Flow Through
> Enable - Bit 21 */
> +
> +#define SDRAM_ERRSTATHB (SDRAMQ_DCR_BASE+0x7)   /* error status HB
>          */
> +#define SDRAM_ERRADDUHB (SDRAMQ_DCR_BASE+0x8)   /* error address
> upper 32 HB   */
> +#define SDRAM_ERRADDLHB (SDRAMQ_DCR_BASE+0x9)   /* error address
> lower 32 HB   */
> +#define SDRAM_PLBADDULL (SDRAMQ_DCR_BASE+0xA)   /* PLB base address
> upper 32 LL */
> +#define SDRAM_CONF1LL   (SDRAMQ_DCR_BASE+0xB)   /* configuration 1 LL
>          */
> +#define SDRAM_CONF1LL_AAFR   0x80000000         /* Address Ack on
> First Request - Bit 0 */
> +#define SDRAM_CONF1LL_PRPD   0x00080000         /* PLB Read pipeline
> Disable - Bit 12 */
> +#define SDRAM_CONF1LL_PWPD   0x00040000         /* PLB Write pipeline
> Disable - Bit 13 */
> +#define SDRAM_CONF1LL_PRW    0x00020000         /* PLB Read Wait - Bit 14
> */ +#define SDRAM_CONF1LL_RPEN   0x00000800         /* Read Passing
> Enable - Bit 20 */
> +#define SDRAM_CONF1LL_RFTE   0x00000400         /* Read Flow Through
> Enable - Bit 21 */
> +
> +#define SDRAM_ERRSTATLL (SDRAMQ_DCR_BASE+0xC)   /* error status LL
>          */
> +#define SDRAM_ERRADDULL (SDRAMQ_DCR_BASE+0xD)   /* error address
> upper 32 LL   */
> +#define SDRAM_ERRADDLLL (SDRAMQ_DCR_BASE+0xE)   /* error address
> lower 32 LL   */
> +#define SDRAM_CONFPATHB (SDRAMQ_DCR_BASE+0xF)   /* configuration
> between paths */
> +#define SDRAM_CONFPATHB_TPEN  0x08000000        /* Transaction
> Passing Enable - Bit 4 */
> +
> +#define SDRAM_PLBADDUHB (SDRAMQ_DCR_BASE+0x10)  /* PLB base address
> upper 32 LL */
>
>  #if !defined(CONFIG_405EX)
>  /*
> diff --git a/include/ppc440.h b/include/ppc440.h
> index 92db15f..3584fd2 100644
> --- a/include/ppc440.h
> +++ b/include/ppc440.h
> @@ -341,53 +341,6 @@
>
>  #define PLB4_ACR_WRP		(0x80000000 >> 7)
>
> -/* Nebula PLB4 Arbiter - PowerPC440EP */
> -#define PLB_ARBITER_BASE   0x80
> -
> -#define plb0_revid                (PLB_ARBITER_BASE+ 0x00)
> -#define plb0_acr                  (PLB_ARBITER_BASE+ 0x01)
> -#define   plb0_acr_ppm_mask             0xF0000000
> -#define   plb0_acr_ppm_fixed            0x00000000
> -#define   plb0_acr_ppm_fair             0xD0000000
> -#define   plb0_acr_hbu_mask             0x08000000
> -#define   plb0_acr_hbu_disabled         0x00000000
> -#define   plb0_acr_hbu_enabled          0x08000000
> -#define   plb0_acr_rdp_mask             0x06000000
> -#define   plb0_acr_rdp_disabled         0x00000000
> -#define   plb0_acr_rdp_2deep            0x02000000
> -#define   plb0_acr_rdp_3deep            0x04000000
> -#define   plb0_acr_rdp_4deep            0x06000000
> -#define   plb0_acr_wrp_mask             0x01000000
> -#define   plb0_acr_wrp_disabled         0x00000000
> -#define   plb0_acr_wrp_2deep            0x01000000
> -
> -#define plb0_besrl                (PLB_ARBITER_BASE+ 0x02)
> -#define plb0_besrh                (PLB_ARBITER_BASE+ 0x03)
> -#define plb0_bearl                (PLB_ARBITER_BASE+ 0x04)
> -#define plb0_bearh                (PLB_ARBITER_BASE+ 0x05)
> -#define plb0_ccr                  (PLB_ARBITER_BASE+ 0x08)
> -
> -#define plb1_acr                  (PLB_ARBITER_BASE+ 0x09)
> -#define   plb1_acr_ppm_mask             0xF0000000
> -#define   plb1_acr_ppm_fixed            0x00000000
> -#define   plb1_acr_ppm_fair             0xD0000000
> -#define   plb1_acr_hbu_mask             0x08000000
> -#define   plb1_acr_hbu_disabled         0x00000000
> -#define   plb1_acr_hbu_enabled          0x08000000
> -#define   plb1_acr_rdp_mask             0x06000000
> -#define   plb1_acr_rdp_disabled         0x00000000
> -#define   plb1_acr_rdp_2deep            0x02000000
> -#define   plb1_acr_rdp_3deep            0x04000000
> -#define   plb1_acr_rdp_4deep            0x06000000
> -#define   plb1_acr_wrp_mask             0x01000000
> -#define   plb1_acr_wrp_disabled         0x00000000
> -#define   plb1_acr_wrp_2deep            0x01000000
> -
> -#define plb1_besrl                (PLB_ARBITER_BASE+ 0x0A)
> -#define plb1_besrh                (PLB_ARBITER_BASE+ 0x0B)
> -#define plb1_bearl                (PLB_ARBITER_BASE+ 0x0C)
> -#define plb1_bearh                (PLB_ARBITER_BASE+ 0x0D)
> -
>  /* Pin Function Control Register 1 */
>  #define SDR0_PFC1                    0x4101
>  #define   SDR0_PFC1_U1ME_MASK         0x02000000    /* UART1 Mode Enable
> */ diff --git a/include/ppc4xx.h b/include/ppc4xx.h
> index c71da60..154956e 100644
> --- a/include/ppc4xx.h
> +++ b/include/ppc4xx.h
> @@ -46,6 +46,61 @@
>  #define CONFIG_SDRAM_PPC4xx_IBM_DDR2	/* IBM DDR(2) controller */
>  #endif
>
> +/* PLB4 CrossBar Arbiter Core supported across PPC4xx families */
> +#if defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
> +    defined(CONFIG_440GR) || defined(CONFIG_440GRX) || \
> +    defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
> +    defined(CONFIG_460EX) || defined(CONFIG_460GT)  || \
> +    defined(CONFIG_460SX) || defined(CONFIG_405EX)
> +
> +#define PLB_ARBITER_BASE   0x80
> +
> +#define plb0_revid                (PLB_ARBITER_BASE+ 0x00)
> +#define plb0_acr                  (PLB_ARBITER_BASE+ 0x01)

No upper case defines in this patch. I'm fine with this as long as we update 
this in a later patch.

And from a quick check of the manuals the 440GP/GX have a slightly different 
register layout. Is this the reason you didn't include those PPC's in this 
patch version? What are your plans for those PPC's?

Thanks.

Best regards,
Stefan

=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
=====================================================================



More information about the U-Boot mailing list