public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Niklaus Giger <niklaus.giger@member.fsf.org>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] Antw: Re: [PATCH] Add first Netstal board HCU4
Date: Fri, 06 Apr 2007 18:16:12 +0200	[thread overview]
Message-ID: <ev5roc$qoo$1@sea.gmane.org> (raw)
In-Reply-To: 200704041730.19108.sr@denx.de

Hi Stefan

Here my reworked patch. Tried a follow all of your comments.

 cpu/ppc4xx/40x_spd_sdram.c |   86
++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 83 insertions(+), 3 deletions(-)

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)
+
        /* 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;
-       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 */
+#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;
+       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;
+       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;
+               if (*check != ECC_TEST_VALUE)
+                       debug("%s: checking@%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.
> 

-- 
Niklaus Giger

  reply	other threads:[~2007-04-06 16:16 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 [this message]
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
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='ev5roc$qoo$1@sea.gmane.org' \
    --to=niklaus.giger@member.fsf.org \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox