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
next prev parent 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