All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] Antw: Re: [PATCH] Add first Netstal board HCU4
Date: Tue, 10 Apr 2007 10:30:20 +0200	[thread overview]
Message-ID: <200704101030.21228.sr@denx.de> (raw)
In-Reply-To: <ev5roc$qoo$1@sea.gmane.org>

Hi Niklaus,

please find some comments below:

On Friday 06 April 2007 18:16, Niklaus Giger wrote:
> diff --git a/cpu/ppc4xx/40x_spd_sdram.c b/cpu/ppc4xx/40x_spd_sdram.c
> index 19c4f76..f1e9b38 100644
> --- a/cpu/ppc4xx/40x_spd_sdram.c
> +++ b/cpu/ppc4xx/40x_spd_sdram.c
> @@ -104,6 +104,7 @@
>  
>  /* function prototypes */
>  int spd_read(uint addr);
> +void program_ecc (void *bank_base_addr, unsigned long num_bytes, int bank);
>  
>  
>  /*
> @@ -306,6 +307,10 @@ long int spd_sdram(int(read_spd)(uint addr))
>                 sdram0_ecccfg = 0xf << SDRAM0_ECCCFG_SHIFT;
>                 ecc_on = 1;
>         } else {
> +#if defined(CONFIG_ECC)
> +               debug("%s: no ECC as spd 11: %d   6: %d 14: %d\n", __FUNCTION__,
> +                      read_spd(11), read_spd(6), read_spd(14));
> +#endif
>                 sdram0_ecccfg = 0;
>                 ecc_on = 0;
>         }
> @@ -426,7 +431,9 @@ long int spd_sdram(int(read_spd)(uint addr))
>          * program all the registers.
>          * -------------------------------------------------------------------*/
>  
> -#define mtsdram0(reg, data)  mtdcr(memcfga,reg);mtdcr(memcfgd,data)
> +#define mfsdram0(reg, data)  { mtdcr(memcfga,reg);data = mfdcr(memcfgd); }
> +#define mtsdram0(reg, data)    mtdcr(memcfga,reg);mtdcr(memcfgd,data)
> +

As Wolfgang already mentioned, this needs to be implemented differently.
I know, the current implementation lacks this too. I suggest to remove
these #defines from this file completely and move them to
include/ppc405.h (as done in include/ppc440.h already):

/*
 * Macros for accessing the indirect SDRAM controller registers
 */
#define mtsdram(reg, data)      do { mtdcr(memcfga,reg);mtdcr(memcfgd,data); } while (0)
#define mfsdram(reg, data)      do { mtdcr(memcfga,reg);data = mfdcr(memcfgd); } while (0)

And please change the name from "mtsdram0" to "mtsdram" so they match
the defines done in include/ppc440.h.

>         /* disable memcontroller so updates work */
>         mtsdram0( mem_mcopt1, 0 );
>  
> @@ -449,9 +456,11 @@ long int spd_sdram(int(read_spd)(uint addr))
>         /* SDRAM have a power on delay,  500 micro should do */
>         udelay(500);
>         sdram0_cfg = SDRAM0_CFG_DCE | SDRAM0_CFG_BRPF(1) | SDRAM0_CFG_ECCDD |
> SDRAM0_CFG_EMDULR;

Your patch is line wrapped. Please make sure this doesn't happen with
the next version.

> -       if (ecc_on)
> -               sdram0_cfg |= SDRAM0_CFG_MEMCHK;
>         mtsdram0(mem_mcopt1, sdram0_cfg);
> +#ifdef CONFIG_ECC
> +       if (ecc_on)
> +               program_ecc(0, total_size, 0);
> +#endif
>  
>         return (total_size);
>  }
> @@ -466,4 +475,75 @@ int spd_read(uint addr)
>                 return 0;
>  }
>  
> +#define SDRAM_ECCCFG_CE0 0x00800000 /* ECC Correction Enable for Bank 0 */
> +#define SDRAM_ECCCFG_CE1 0x00400000 /* ECC Correction Enable for Bank 1 */
> +#define SDRAM_ECCCFG_CE2 0x00200000 /* ECC Correction Enable for Bank 2 */
> +#define SDRAM_ECCCFG_CE3 0x00100000 /* ECC Correction Enable for Bank 3 */
> +
> +#define SDRAM_ECCESR_ERROR_MASK 0xFFF0F000 /* All possible ECC errors */

Please move these defines to the include/ppc405.h header.

> +#define ECC_TEST_VALUE 0xaffeaffe
> +
> +/*
> + * Prepare for ECC operation
> + * Step 1: Enable ECC generation but not checks
> + * Step 2: Fill all memory
> + * Step 3: Enable ECC generation and checks
> + * Only programmed for and tested on a PPC405GPr board using:
> + *    bank 0 and 32 bit wide !!!
> + */
> +void program_ecc (void *bank_base_addr, unsigned long num_bytes, int bank)
> +{
> +       unsigned long current_address;
> +       unsigned long end_address;
> +       unsigned long address_increment;
> +       unsigned long cfg0;

Please insert a blank line after the variable declarations.

> +       if (bank != 0)
> +       {
> +               printf("\n%s: only bank 0 supported",  __FUNCTION__);
> +               return;
> +       }
> +
> +       /*
> +        * get Memory Controller Options 0 data
> +        */
> +       mfsdram0(mem_mcopt1, cfg0);
> +
> +       cfg0 &= ~SDRAM0_CFG_EMDULR & ~SDRAM0_CFG_MEMCHK;

I find this better readable:

	cfg0 &= ~(SDRAM0_CFG_EMDULR | SDRAM0_CFG_MEMCHK);

> +       debug("%s: length 0x%x bytes bank_base_addr %p\n",  __FUNCTION__,
> +             num_bytes, bank_base_addr);
> +       debug("%s: cfg0 disable checking -> 0x%08x\n",  __FUNCTION__,  cfg0);
> +       /*
> +        * reset the bank_base address
> +        */
> +       mtsdram0(mem_ecccf,  0); /* disable correction */
> +       mtsdram0(mem_eccerr, SDRAM_ECCESR_ERROR_MASK); /* Clear all errors */
> +       mtsdram0(mem_mcopt1, cfg0);
> +
> +       address_increment = 4;
> +       current_address = (unsigned long)(bank_base_addr);
> +       end_address = (unsigned long)(bank_base_addr) + num_bytes;
> +
> +       while (current_address < end_address) {
> +               *((unsigned long*)current_address) = 0;
> +               current_address += address_increment;
> +       }
> +
> +       mtsdram0(mem_eccerr, SDRAM_ECCESR_ERROR_MASK); /* Clear all errors */
> +
> +       debug("%s: cfg0 enable checking\n",  __FUNCTION__);
> +       mtsdram0(mem_ecccf, SDRAM_ECCCFG_CE0); /* enable correction */
> +       printf("ECC ");
> +
> +#ifdef DEBUG
> +       { /* A small sanity check */
> +               unsigned long *check;
> +               check= (unsigned long *)bank_base_addr;
> +               *check=ECC_TEST_VALUE;

Spaces before and after the "=" please.

> +               if (*check != ECC_TEST_VALUE)
> +                       debug("%s: checking at %p is 0x%x failed\n",
> +                             __FUNCTION__, check, *check);
> +       }
> +#endif
> +}
> +
>  #endif /* CONFIG_SPD_EEPROM */ 
> 
> Best regards
> 
> Stefan Roese wrote:
> > Hi Niklaus,
> > 
> > On Wednesday 14 February 2007 18:10, Niklaus Giger wrote:
> >> Here it is:
> >>
> >> diff --git a/cpu/ppc4xx/spd_sdram.c b/cpu/ppc4xx/spd_sdram.c
> > 
> > Could you please generate a new patch against the current git
> > repository? I reorganized the SPD files. "40x_spd_sdram.c" is now
> > the file you want.
> > 

  parent reply	other threads:[~2007-04-10  8:30 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-09 20:37 [U-Boot-Users] [PATCH] Add first Netstal board HCU4 Niklaus Giger
2007-02-10  7:59 ` Stefan Roese
2007-02-10  9:01   ` Niklaus Giger
2007-02-10 19:15     ` Stefan Roese
2007-02-12 18:13       ` [U-Boot-Users] Antw: " Niklaus Giger
2007-02-12 19:25         ` Stefan Roese
2007-02-14 17:10   ` Niklaus Giger
2007-04-04 15:30     ` Stefan Roese
2007-04-06 16:16       ` Niklaus Giger
2007-04-06 16:58         ` Stefan Roese
2007-04-06 19:31         ` Wolfgang Denk
2007-04-06 19:39         ` Wolfgang Denk
2007-04-10  6:55           ` Stefan Roese
2007-04-10  8:30         ` Stefan Roese [this message]
2007-04-04 15:40 ` [U-Boot-Users] " Stefan Roese
2007-04-06 16:22   ` Niklaus Giger
2007-04-10 12:36     ` Stefan Roese

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=200704101030.21228.sr@denx.de \
    --to=sr@denx.de \
    --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.