diff mbox

[U-Boot,v3,2/2] mpc85xx: support for Freescale COM Express P2020

Message ID 1320959487-27606-3-git-send-email-iws@ovro.caltech.edu
State Changes Requested
Delegated to: Kumar Gala
Headers show

Commit Message

Ira Snyder Nov. 10, 2011, 9:11 p.m. UTC
This adds support for the Freescale COM Express P2020 board. This board
is similar to the P1_P2_RDB, but has some extra (as well as missing)
peripherals.

Unlike all other mpc85xx boards, it uses a watchdog timeout to reset.
Using the HRESET_REQ register does not work.

This board has no NOR flash, and can only be booted via SD or SPI. This
procedure is documented in Freescale Document Number AN3659 "Booting
from On-Chip RAM (eSDHC or eSPI)." Some alternative documentation is
provided in Freescale Document Number P2020RM "P2020 QorIQ Integrated
Processor Reference Manual" (section 4.5).

Signed-off-by: Ira W. Snyder <iws@ovro.caltech.edu>
---

The CCSR relocation issue is solved by Timur's 5 part patchset containing
the patch "powerpc/85xx: resize the boot page TLB before relocating CCSR".

This patch is checkpatch clean using the checkpatch and configuration file
provided in the patch from Joe Hershberger titled "tools: checkpatch.pl
from Linux added to tools".

Changes v2 -> v3:
- re-enable CCSR relocation

Changes v1 -> v2:
- fix checkpatch warnings
- remove all references to NAND
- update to top of tree U-Boot
- remove CCSR relocation (top of tree code doesn't work)

 MAINTAINERS                           |    4 +
 arch/powerpc/include/asm/immap_85xx.h |    1 +
 board/freescale/p2020come/Makefile    |   46 +++
 board/freescale/p2020come/ddr.c       |  245 ++++++++++++++
 board/freescale/p2020come/law.c       |   36 ++
 board/freescale/p2020come/p2020come.c |  401 +++++++++++++++++++++++
 board/freescale/p2020come/tlb.c       |  100 ++++++
 boards.cfg                            |    2 +
 include/configs/P2020COME.h           |  569 +++++++++++++++++++++++++++++++++
 9 files changed, 1404 insertions(+), 0 deletions(-)
 create mode 100644 board/freescale/p2020come/Makefile
 create mode 100644 board/freescale/p2020come/ddr.c
 create mode 100644 board/freescale/p2020come/law.c
 create mode 100644 board/freescale/p2020come/p2020come.c
 create mode 100644 board/freescale/p2020come/tlb.c
 create mode 100644 include/configs/P2020COME.h

Comments

Kumar Gala Nov. 11, 2011, 1:22 p.m. UTC | #1
On Nov 10, 2011, at 3:11 PM, Ira W. Snyder wrote:

> This adds support for the Freescale COM Express P2020 board. This board
> is similar to the P1_P2_RDB, but has some extra (as well as missing)
> peripherals.
> 
> Unlike all other mpc85xx boards, it uses a watchdog timeout to reset.
> Using the HRESET_REQ register does not work.
> 
> This board has no NOR flash, and can only be booted via SD or SPI. This
> procedure is documented in Freescale Document Number AN3659 "Booting
> from On-Chip RAM (eSDHC or eSPI)." Some alternative documentation is
> provided in Freescale Document Number P2020RM "P2020 QorIQ Integrated
> Processor Reference Manual" (section 4.5).
> 
> Signed-off-by: Ira W. Snyder <iws@ovro.caltech.edu>
> ---
> 


> diff --git a/board/freescale/p2020come/ddr.c b/board/freescale/p2020come/ddr.c
> new file mode 100644
> index 0000000..dd2a4dd
> --- /dev/null
> +++ b/board/freescale/p2020come/ddr.c
> @@ -0,0 +1,245 @@
> +/*
> + * Copyright 2009, 2011 Freescale Semiconductor, Inc.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <asm/mmu.h>
> +#include <asm/immap_85xx.h>
> +#include <asm/processor.h>
> +#include <asm/fsl_ddr_sdram.h>
> +#include <asm/io.h>
> +#include <asm/fsl_law.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define CONFIG_SYS_DDR_CS0_BNDS		0x0000003F
> +#define CONFIG_SYS_DDR_CS0_CONFIG	0x80014202
> +#define CONFIG_SYS_DDR_CS0_CONFIG_2	0x00000000
> +#define CONFIG_SYS_DDR_INIT_ADDR	0x00000000
> +#define CONFIG_SYS_DDR_INIT_EXT_ADDR	0x00000000
> +#define CONFIG_SYS_DDR_MODE_CONTROL	0x00000000
> +#define CONFIG_SYS_DDR_ZQ_CONTROL	0x00000000
> +#define CONFIG_SYS_DDR_WRLVL_CONTROL	0x00000000
> +#define CONFIG_SYS_DDR_SR_CNTR		0x00000000
> +#define CONFIG_SYS_DDR_RCW_1		0x00000000
> +#define CONFIG_SYS_DDR_RCW_2		0x00000000
> +#define CONFIG_SYS_DDR_CONTROL		0x43000000	/* Type = DDR2*/
> +#define CONFIG_SYS_DDR_CONTROL_2	0x24401000
> +#define CONFIG_SYS_DDR_TIMING_4		0x00000000
> +#define CONFIG_SYS_DDR_TIMING_5		0x00000000
> +
> +#define CONFIG_SYS_DDR_TIMING_3_400	0x00010000
> +#define CONFIG_SYS_DDR_TIMING_0_400	0x00260802
> +#define CONFIG_SYS_DDR_TIMING_1_400	0x39355322
> +#define CONFIG_SYS_DDR_TIMING_2_400	0x1f9048ca
> +#define CONFIG_SYS_DDR_CLK_CTRL_400	0x02800000
> +#define CONFIG_SYS_DDR_MODE_1_400	0x00480432
> +#define CONFIG_SYS_DDR_MODE_2_400	0x00000000
> +#define CONFIG_SYS_DDR_INTERVAL_400	0x06180100
> +
> +#define CONFIG_SYS_DDR_TIMING_3_533	0x00020000
> +#define CONFIG_SYS_DDR_TIMING_0_533	0x00260802
> +#define CONFIG_SYS_DDR_TIMING_1_533	0x4c47c432
> +#define CONFIG_SYS_DDR_TIMING_2_533	0x0f9848ce
> +#define CONFIG_SYS_DDR_CLK_CTRL_533	0x02800000
> +#define CONFIG_SYS_DDR_MODE_1_533	0x00040642
> +#define CONFIG_SYS_DDR_MODE_2_533	0x00000000
> +#define CONFIG_SYS_DDR_INTERVAL_533	0x08200100
> +
> +#define CONFIG_SYS_DDR_TIMING_3_667	0x00030000
> +#define CONFIG_SYS_DDR_TIMING_0_667	0x55770802
> +#define CONFIG_SYS_DDR_TIMING_1_667	0x5f599543
> +#define CONFIG_SYS_DDR_TIMING_2_667	0x0fa074d1
> +#define CONFIG_SYS_DDR_CLK_CTRL_667	0x03000000
> +#define CONFIG_SYS_DDR_MODE_1_667	0x00040852
> +#define CONFIG_SYS_DDR_MODE_2_667	0x00000000
> +#define CONFIG_SYS_DDR_INTERVAL_667	0x0a280100
> +
> +#define CONFIG_SYS_DDR_TIMING_3_800	0x00040000
> +#define CONFIG_SYS_DDR_TIMING_0_800	0x00770802
> +#define CONFIG_SYS_DDR_TIMING_1_800	0x6f6b6543
> +#define CONFIG_SYS_DDR_TIMING_2_800	0x0fa074d1
> +#define CONFIG_SYS_DDR_CLK_CTRL_800	0x02800000
> +#define CONFIG_SYS_DDR_MODE_1_800	0x00040852
> +#define CONFIG_SYS_DDR_MODE_2_800	0x00000000
> +#define CONFIG_SYS_DDR_INTERVAL_800	0x0c300100
> +
> +fsl_ddr_cfg_regs_t ddr_cfg_regs_400 = {
> +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_400,
> +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_400,
> +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_400,
> +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_400,
> +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_400,
> +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_400,
> +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_400,
> +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_400,
> +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> +};
> +
> +fsl_ddr_cfg_regs_t ddr_cfg_regs_533 = {
> +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_533,
> +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_533,
> +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_533,
> +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_533,
> +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_533,
> +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_533,
> +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_533,
> +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_533,
> +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> +};
> +
> +fsl_ddr_cfg_regs_t ddr_cfg_regs_667 = {
> +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_667,
> +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_667,
> +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_667,
> +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_667,
> +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_667,
> +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_667,
> +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_667,
> +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_667,
> +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> +};
> +
> +fsl_ddr_cfg_regs_t ddr_cfg_regs_800 = {
> +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_800,
> +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_800,
> +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_800,
> +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_800,
> +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_800,
> +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_800,
> +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_800,
> +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_800,
> +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> +};
> +
> +/*
> + * Fixed sdram init -- doesn't use serial presence detect.
> + */
> +
> +phys_size_t fixed_sdram(void)
> +{
> +	char buf[32];
> +	fsl_ddr_cfg_regs_t ddr_cfg_regs;
> +	size_t ddr_size;
> +	struct cpu_type *cpu;
> +	ulong ddr_freq, ddr_freq_mhz;
> +
> +	cpu = gd->cpu;
> +	/* P1020 and it's derivatives support max 32bit DDR width */
> +	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
> +		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
> +		ddr_size = (CONFIG_SYS_SDRAM_SIZE * 1024 * 1024 / 2);

These checks don't make sense if you are a P2020 SoC

> +	} else {
> +		ddr_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
> +	}
> +#if defined(CONFIG_SYS_RAMBOOT)
> +	return ddr_size;
> +#endif
> +	ddr_freq = get_ddr_freq(0);
> +	ddr_freq_mhz = ddr_freq / 1000000;
> +
> +	printf("Configuring DDR for %s MT/s data rate\n",
> +				strmhz(buf, ddr_freq));
> +
> +	if (ddr_freq_mhz <= 400)
> +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_400, sizeof(ddr_cfg_regs));
> +	else if (ddr_freq_mhz <= 533)
> +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_533, sizeof(ddr_cfg_regs));
> +	else if (ddr_freq_mhz <= 667)
> +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_667, sizeof(ddr_cfg_regs));
> +	else if (ddr_freq_mhz <= 800)
> +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_800, sizeof(ddr_cfg_regs));
> +	else
> +		panic("Unsupported DDR data rate %s MT/s data rate\n",
> +					strmhz(buf, ddr_freq));

Does the board really support different DDR freq or is this copy / paste?

> +
> +	/* P1020 and it's derivatives support max 32bit DDR width */
> +	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
> +		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
> +		ddr_cfg_regs.ddr_sdram_cfg |= SDRAM_CFG_32_BE;
> +		ddr_cfg_regs.cs[0].bnds = 0x0000001F;
> +	}

Same comment as above

> +
> +	fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0);
> +
> +	set_ddr_laws(0, ddr_size, LAW_TRGT_IF_DDR_1);
> +	return ddr_size;
> +}
> diff --git a/board/freescale/p2020come/law.c b/board/freescale/p2020come/law.c
> new file mode 100644
> index 0000000..56508db
> --- /dev/null
> +++ b/board/freescale/p2020come/law.c
> @@ -0,0 +1,36 @@
> +/*
> + * Copyright 2009 Freescale Semiconductor, Inc.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <asm/fsl_law.h>
> +#include <asm/mmu.h>
> +
> +struct law_entry law_table[] = {
> +	SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
> +	SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_1),
> +	SET_LAW(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_2),
> +	SET_LAW(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_2),
> +	SET_LAW(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_3),
> +	SET_LAW(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_3),

We normally set these up dynamically.

> +};
> +
> +int num_law_entries = ARRAY_SIZE(law_table);
> diff --git a/board/freescale/p2020come/p2020come.c b/board/freescale/p2020come/p2020come.c
> new file mode 100644
> index 0000000..2e334cf
> --- /dev/null
> +++ b/board/freescale/p2020come/p2020come.c
> @@ -0,0 +1,401 @@
> +/*
> + * Copyright 2009 Freescale Semiconductor, Inc.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <hwconfig.h>
> +#include <command.h>
> +#include <asm/processor.h>
> +#include <asm/mmu.h>
> +#include <asm/cache.h>
> +#include <asm/immap_85xx.h>
> +#include <asm/fsl_serdes.h>
> +#include <asm/io.h>
> +#include <miiphy.h>
> +#include <libfdt.h>
> +#include <fdt_support.h>
> +#include <fsl_mdio.h>
> +#include <tsec.h>
> +#include <vsc7385.h>
> +#include <netdev.h>
> +#include <mmc.h>
> +#include <malloc.h>
> +#include <i2c.h>
> +
> +#if defined(CONFIG_PCI)
> +#include <asm/fsl_pci.h>
> +#include <pci.h>
> +#endif
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#if defined(CONFIG_PCI)
> +void pci_init_board(void)
> +{
> +	fsl_pcie_init_board(0);
> +}
> +
> +void ft_pci_board_setup(void *blob)
> +{
> +	FT_FSL_PCI_SETUP;
> +}
> +#endif
> +
> +/*
> + * GPIO
> + * 0 - 3: CarryBoard Input;
> + * 4 - 7: CarryBoard Output;
> + * 8 : Mux as SDHC_CD (card detection)
> + * 9 : Mux as SDHC_WP
> + * 10 : Clear Watchdog timer
> + * 11 : LED Input
> + * 12 : Output to 1
> + * 13 : Open Drain
> + * 14 : LED Output
> + * 15 : Switch Input
> + */
> +#define GPIO_DIR		0x0f3a0000
> +#define GPIO_ODR		0x00000000
> +
> +#define BOARD_PERI_RST_SET	(VSC7385_RST_SET | SLIC_RST_SET | \
> +				 SGMII_PHY_RST_SET | PCIE_RST_SET | \
> +				 RGMII_PHY_RST_SET)
> +
> +#define SYSCLK_MASK	0x00200000
> +#define BOARDREV_MASK	0x10100000
> +#define BOARDREV_B	0x10100000
> +#define BOARDREV_C	0x00100000
> +#define BOARDREV_D	0x00000000
> +
> +#define SYSCLK_66	66666666
> +#define SYSCLK_50	50000000
> +#define SYSCLK_100	100000000
> +
> +unsigned long get_board_sys_clk(ulong dummy)
> +{
> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
> +
> +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
> +	switch (ddr_ratio) {
> +	case 0x0C:
> +		return SYSCLK_66;
> +	case 0x0A:
> +	case 0x08:
> +		return SYSCLK_100;
> +	default:
> +		puts("ERROR: unknown DDR ratio\n");
> +		return SYSCLK_100;
> +	}
> +}
> +
> +unsigned long get_board_ddr_clk(ulong dummy)
> +{
> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
> +
> +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
> +	switch (ddr_ratio) {
> +	case 0x0C:
> +	case 0x0A:
> +		return SYSCLK_66;
> +	case 0x08:
> +		return SYSCLK_100;
> +	default:
> +		puts("ERROR: unknown DDR ratio\n");
> +		return SYSCLK_100;
> +	}
> +}
> +
> +#ifdef CONFIG_MMC
> +int board_early_init_f(void)
> +{
> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +
> +	setbits_be32(&gur->pmuxcr,
> +			(MPC85xx_PMUXCR_SDHC_CD |
> +			 MPC85xx_PMUXCR_SDHC_WP));
> +
> +	/* All the device are enable except for SRIO12 */
> +	setbits_be32(&gur->devdisr, 0x80000);

Add a #define instead of magic 0x80000

> +	return 0;
> +}
> +#endif
> +
> +int checkboard(void)
> +{
> +	ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR + 0xC00);
> +
> +	/*
> +	 * GPIO
> +	 * 0 - 3: CarryBoard Input;
> +	 * 4 - 7: CarryBoard Output;
> +	 * 8 : Mux as SDHC_CD (card detection)
> +	 * 9 : Mux as SDHC_WP
> +	 * 10 : Clear Watchdog timer
> +	 * 11 : LED Input
> +	 * 12 : Output to 1
> +	 * 13 : Open Drain
> +	 * 14 : LED Output
> +	 * 15 : Switch Input
> +	 *
> +	 * Set GPIOs 11, 12, 14 to 1.
> +	 */
> +	out_be32(&pgpio->gpdir, GPIO_DIR);
> +	out_be32(&pgpio->gpodr, GPIO_ODR);
> +	out_be32(&pgpio->gpdat, 0x001A0000);

look at using mpc85xx_gpio.h

> +
> +	puts("Board: Freescale COM Express P2020\n");
> +	return 0;
> +}
> +
> +#define M41ST85W_ERROR(fmt, args...) printf("ERROR: M41ST85W: " fmt, ##args)
> +
> +static void m41st85w_clear_bit(u8 reg, u8 mask, const char *name)
> +{
> +	u8 data;
> +
> +	if (i2c_read(0x68, reg, 1, &data, 1)) {
> +		M41ST85W_ERROR("unable to read %s bit\n", name);
> +		return;
> +	}
> +
> +	if (data & mask) {
> +		data &= ~mask;
> +		if (i2c_write(0x68, reg, 1, &data, 1)) {
> +			M41ST85W_ERROR("unable to clear %s bit\n", name);
> +			return;
> +		}
> +	}
> +}
> +
> +/*
> + * The P2020COME board has a STMicro M41ST85W RTC/watchdog
> + * at i2c bus 1 address 0x68.
> + */
> +static void start_rtc(void)
> +{
> +	unsigned int bus = i2c_get_bus_num();
> +
> +	if (i2c_set_bus_num(1)) {
> +		M41ST85W_ERROR("unable to set i2c bus\n");
> +		goto out;
> +	}
> +
> +	/* ensure ST (stop) and HT (halt update) bits are cleared */
> +	m41st85w_clear_bit(0x1, 0x80, "ST");
> +	m41st85w_clear_bit(0xc, 0x40, "HT");
> +
> +out:
> +	/* reset the i2c bus */
> +	i2c_set_bus_num(bus);
> +}
> +
> +int board_early_init_r(void)
> +{
> +	start_rtc();
> +	return 0;
> +}
> +
> +void board_reset(void)
> +{
> +	u8 data = (1 << 2) | 0x82;

some #defines instead of magic #s

> +
> +	/* set the hardware watchdog timeout to 1 second, then hang */
> +	i2c_set_bus_num(1);
> +	i2c_write(0x68, 9, 1, &data, 1);
> +
> +	while (1)
> +		/* hang */;
> +}
> +
> +#ifdef CONFIG_TSEC_ENET
> +int board_eth_init(bd_t *bis)
> +{
> +	struct fsl_pq_mdio_info mdio_info;
> +	struct tsec_info_struct tsec_info[4];
> +	int num = 0;
> +
> +#ifdef CONFIG_TSEC1
> +	SET_STD_TSEC_INFO(tsec_info[num], 1);
> +	num++;
> +#endif
> +#ifdef CONFIG_TSEC2
> +	SET_STD_TSEC_INFO(tsec_info[num], 2);
> +	num++;
> +#endif
> +#ifdef CONFIG_TSEC3
> +	SET_STD_TSEC_INFO(tsec_info[num], 3);
> +	if (is_serdes_configured(SGMII_TSEC3)) {
> +		puts("eTSEC3 is in sgmii mode.");
> +		tsec_info[num].flags |= TSEC_SGMII;
> +	}
> +	num++;
> +#endif
> +	if (!num) {
> +		printf("No TSECs initialized\n");
> +		return 0;
> +	}
> +
> +	mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
> +	mdio_info.name = DEFAULT_MII_NAME;
> +	fsl_pq_mdio_init(bis, &mdio_info);
> +
> +	tsec_eth_init(bis, tsec_info, num);
> +
> +	return pci_eth_init(bis);
> +}
> +#endif
> +
> +#if defined(CONFIG_OF_BOARD_SETUP)
> +void fdt_fixup_add_2nd_usb(void *blob, int agent)
> +{

What are you trying to do here?

> +	const char *soc_compat = "fsl,p2020-immr";
> +	const char *lbc_compat = "fsl,p2020-elbc";
> +	const u32 *addrcell, *sizecell, *ph;
> +	int off, lbcoff, len, err;
> +	u32 *regbuf = NULL;
> +	u32 *irqbuf = NULL;
> +
> +	off = fdt_node_offset_by_compatible(blob, -1, soc_compat);
> +	if (off < 0) {
> +		printf("WARNING: could not find compatible node %s: %s.\n",
> +			soc_compat, fdt_strerror(off));
> +		return;
> +	}
> +
> +	lbcoff = fdt_node_offset_by_compatible(blob, -1, lbc_compat);
> +	if (lbcoff < 0) {
> +		printf("WARNING: could not find compatible node %s: %s.\n",
> +			lbc_compat, fdt_strerror(lbcoff));
> +		return;
> +	}
> +
> +	addrcell = fdt_getprop(blob, off, "#address-cells", NULL);
> +	sizecell = fdt_getprop(blob, off, "#size-cells", NULL);
> +
> +	off = fdt_add_subnode(blob, off, "usb@23000");
> +	if (off < 0) {
> +		printf("WARNING: could not add 2nd usb node %s.\n",
> +				fdt_strerror(off));
> +		return;
> +	}
> +
> +	err = fdt_setprop_cell(blob, off, "#address-cells", 1);
> +	if (err < 0)
> +		printf("WARNING: could not set #address-cell property: %s\n",
> +			fdt_strerror(err));
> +
> +	err = fdt_setprop_cell(blob, off, "#size-cells", 0);
> +	if (err < 0)
> +		printf("WARNING: could not set #size-cells property: %s\n",
> +			fdt_strerror(err));
> +
> +	err = fdt_setprop_string(blob, off, "compatible", "fsl-usb2-dr");
> +	if (err < 0)
> +		printf("WARNING: could not set compatible property: %s\n",
> +			fdt_strerror(err));
> +
> +	err = fdt_setprop_string(blob, off, "phy_type", "ulpi");
> +	if (err < 0)
> +		printf("WARNING: could not set phy_type property: %s\n",
> +			fdt_strerror(err));
> +
> +	if (agent) {
> +		err = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
> +		if (err < 0)
> +			printf("WARNING: could not set dr_mode property: %s\n",
> +				fdt_strerror(err));
> +	}
> +
> +	if (addrcell && *addrcell == 2) {
> +		regbuf[0] = 0;
> +		regbuf[1] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> +		len = 2;
> +	} else {
> +		regbuf[0] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> +		len = 1;
> +	}
> +
> +	if (sizecell && *sizecell == 2) {
> +		regbuf[len] = 0;
> +		regbuf[len + 1] = 0x1000;
> +		len = 2;
> +	} else {
> +		regbuf[len] = 0x1000;
> +		len++;
> +	}
> +
> +	err = fdt_setprop(blob, off, "reg", regbuf, len * sizeof(u32));
> +	if (err < 0)
> +		printf("WARNING: could not set <%s> %s\n",
> +					"reg", fdt_strerror(err));
> +
> +	irqbuf[0] = 0x2e;
> +	irqbuf[1] = 0x2;
> +
> +	err = fdt_setprop(blob, off, "interrupts", irqbuf, 2 * sizeof(u32));
> +	if (err < 0)
> +		printf("WARNING: could not set %s %s\n",
> +				"interrupts", fdt_strerror(err));
> +
> +	ph = fdt_getprop(blob, lbcoff, "interrupt-parent", 0);
> +	if (!ph) {
> +		printf("WARNING: could not read interrupt-parent property\n");
> +		return;
> +	}
> +
> +	err = fdt_setprop(blob, off, "interrupt-parent", ph, sizeof(u32));
> +	if (err < 0)
> +		printf("WARNING: could not set %s %s\n",
> +				"interrupt-parent", fdt_strerror(err));
> +}
> +
> +void ft_board_setup(void *blob, bd_t *bd)
> +{
> +	phys_addr_t base;
> +	phys_size_t size;
> +	int agent;
> +
> +	ft_cpu_setup(blob, bd);
> +
> +	base = getenv_bootm_low();
> +	size = getenv_bootm_size();
> +
> +#if defined(CONFIG_PCI)
> +	ft_pci_board_setup(blob);
> +#endif
> +
> +	fdt_fixup_memory(blob, (u64)base, (u64)size);
> +
> +	if (!hwconfig("usb2"))
> +		return;
> +
> +	agent = hwconfig_subarg_cmp("usb2", "dr_mode", "peripheral");
> +
> +	/*
> +	 * Add the 2nd usb node and enable it. eLBC will
> +	 * now be disabled since it is MUXed with USB2
> +	 */
> +
> +	fdt_fixup_add_2nd_usb(blob, agent);
> +}
> +#endif
> diff --git a/board/freescale/p2020come/tlb.c b/board/freescale/p2020come/tlb.c
> new file mode 100644
> index 0000000..e1dd056
> --- /dev/null
> +++ b/board/freescale/p2020come/tlb.c
> @@ -0,0 +1,100 @@
> +/*
> + * Copyright 2011 Freescale Semiconductor, Inc.
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <asm/mmu.h>
> +

For any regions that do NOT have code, we should remove MAS3_SX bit:

> +struct fsl_e_tlb_entry tlb_table[] = {
> +	/* TLB 0 - for temp stack in cache */
> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR,
> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS,
> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> +			0, 0, BOOKE_PAGESZ_4K, 0),
> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024 ,
> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> +			0, 0, BOOKE_PAGESZ_4K, 0),
> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024 ,
> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> +			0, 0, BOOKE_PAGESZ_4K, 0),
> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024 ,
> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> +			0, 0, BOOKE_PAGESZ_4K, 0),
> +
> +	/* TLB 1 */
> +	/* *I*** - Covers boot page */
> +	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 0, BOOKE_PAGESZ_4K, 1),
> +
> +	/* *I*G* - CCSRBAR */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 1, BOOKE_PAGESZ_1M, 1),
> +
> +#if defined(CONFIG_PCI)
> +	/* *I*G* - PCI3 - PCI2 0x8000,0000 - 0xbfff,ffff, size = 1G */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 2, BOOKE_PAGESZ_1G, 1),
> +
> +	/* *I*G* - PCI1 0xC000,0000 - 0xcfff,ffff, size = 256M */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_VIRT,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 3, BOOKE_PAGESZ_256M, 1),
> +
> +
> +	/* *I*G* - PCI1  0xD000,0000 - 0xDFFF,FFFF, size = 256M */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
> +			CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 4, BOOKE_PAGESZ_256M, 1),
> +
> +	/*
> +	 * *I*G* - PCI I/O
> +	 *
> +	 * PCI3 => 0xFFC10000
> +	 * PCI2 => 0xFFC2,0000
> +	 * PCI1 => 0xFFC3,0000
> +	 */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 5, BOOKE_PAGESZ_256K, 1),
> +#endif /* #if defined(CONFIG_PCI) */
> +
> +#if defined(CONFIG_SYS_RAMBOOT)
> +	/* *I*G - DDR3  2G     Part 1: 0 - 0x3fff,ffff , size = 1G */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 6, BOOKE_PAGESZ_1G, 1),
> +
> +	/*        DDR3  2G     Part 2: 0x4000,0000 - 0x7fff,ffff , size = 1G */
> +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
> +			CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> +			0, 7, BOOKE_PAGESZ_1G, 1),
> +#endif
> +};
> +
> +int num_tlb_entries = ARRAY_SIZE(tlb_table);
Ira Snyder Nov. 11, 2011, 4:53 p.m. UTC | #2
On Fri, Nov 11, 2011 at 07:22:14AM -0600, Kumar Gala wrote:
> 
> On Nov 10, 2011, at 3:11 PM, Ira W. Snyder wrote:
> 
> > This adds support for the Freescale COM Express P2020 board. This board
> > is similar to the P1_P2_RDB, but has some extra (as well as missing)
> > peripherals.
> > 
> > Unlike all other mpc85xx boards, it uses a watchdog timeout to reset.
> > Using the HRESET_REQ register does not work.
> > 
> > This board has no NOR flash, and can only be booted via SD or SPI. This
> > procedure is documented in Freescale Document Number AN3659 "Booting
> > from On-Chip RAM (eSDHC or eSPI)." Some alternative documentation is
> > provided in Freescale Document Number P2020RM "P2020 QorIQ Integrated
> > Processor Reference Manual" (section 4.5).
> > 
> > Signed-off-by: Ira W. Snyder <iws@ovro.caltech.edu>
> > ---
> > 
> 
> 
> > diff --git a/board/freescale/p2020come/ddr.c b/board/freescale/p2020come/ddr.c
> > new file mode 100644
> > index 0000000..dd2a4dd
> > --- /dev/null
> > +++ b/board/freescale/p2020come/ddr.c
> > @@ -0,0 +1,245 @@
> > +/*
> > + * Copyright 2009, 2011 Freescale Semiconductor, Inc.
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#include <common.h>
> > +#include <asm/mmu.h>
> > +#include <asm/immap_85xx.h>
> > +#include <asm/processor.h>
> > +#include <asm/fsl_ddr_sdram.h>
> > +#include <asm/io.h>
> > +#include <asm/fsl_law.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#define CONFIG_SYS_DDR_CS0_BNDS		0x0000003F
> > +#define CONFIG_SYS_DDR_CS0_CONFIG	0x80014202
> > +#define CONFIG_SYS_DDR_CS0_CONFIG_2	0x00000000
> > +#define CONFIG_SYS_DDR_INIT_ADDR	0x00000000
> > +#define CONFIG_SYS_DDR_INIT_EXT_ADDR	0x00000000
> > +#define CONFIG_SYS_DDR_MODE_CONTROL	0x00000000
> > +#define CONFIG_SYS_DDR_ZQ_CONTROL	0x00000000
> > +#define CONFIG_SYS_DDR_WRLVL_CONTROL	0x00000000
> > +#define CONFIG_SYS_DDR_SR_CNTR		0x00000000
> > +#define CONFIG_SYS_DDR_RCW_1		0x00000000
> > +#define CONFIG_SYS_DDR_RCW_2		0x00000000
> > +#define CONFIG_SYS_DDR_CONTROL		0x43000000	/* Type = DDR2*/
> > +#define CONFIG_SYS_DDR_CONTROL_2	0x24401000
> > +#define CONFIG_SYS_DDR_TIMING_4		0x00000000
> > +#define CONFIG_SYS_DDR_TIMING_5		0x00000000
> > +
> > +#define CONFIG_SYS_DDR_TIMING_3_400	0x00010000
> > +#define CONFIG_SYS_DDR_TIMING_0_400	0x00260802
> > +#define CONFIG_SYS_DDR_TIMING_1_400	0x39355322
> > +#define CONFIG_SYS_DDR_TIMING_2_400	0x1f9048ca
> > +#define CONFIG_SYS_DDR_CLK_CTRL_400	0x02800000
> > +#define CONFIG_SYS_DDR_MODE_1_400	0x00480432
> > +#define CONFIG_SYS_DDR_MODE_2_400	0x00000000
> > +#define CONFIG_SYS_DDR_INTERVAL_400	0x06180100
> > +
> > +#define CONFIG_SYS_DDR_TIMING_3_533	0x00020000
> > +#define CONFIG_SYS_DDR_TIMING_0_533	0x00260802
> > +#define CONFIG_SYS_DDR_TIMING_1_533	0x4c47c432
> > +#define CONFIG_SYS_DDR_TIMING_2_533	0x0f9848ce
> > +#define CONFIG_SYS_DDR_CLK_CTRL_533	0x02800000
> > +#define CONFIG_SYS_DDR_MODE_1_533	0x00040642
> > +#define CONFIG_SYS_DDR_MODE_2_533	0x00000000
> > +#define CONFIG_SYS_DDR_INTERVAL_533	0x08200100
> > +
> > +#define CONFIG_SYS_DDR_TIMING_3_667	0x00030000
> > +#define CONFIG_SYS_DDR_TIMING_0_667	0x55770802
> > +#define CONFIG_SYS_DDR_TIMING_1_667	0x5f599543
> > +#define CONFIG_SYS_DDR_TIMING_2_667	0x0fa074d1
> > +#define CONFIG_SYS_DDR_CLK_CTRL_667	0x03000000
> > +#define CONFIG_SYS_DDR_MODE_1_667	0x00040852
> > +#define CONFIG_SYS_DDR_MODE_2_667	0x00000000
> > +#define CONFIG_SYS_DDR_INTERVAL_667	0x0a280100
> > +
> > +#define CONFIG_SYS_DDR_TIMING_3_800	0x00040000
> > +#define CONFIG_SYS_DDR_TIMING_0_800	0x00770802
> > +#define CONFIG_SYS_DDR_TIMING_1_800	0x6f6b6543
> > +#define CONFIG_SYS_DDR_TIMING_2_800	0x0fa074d1
> > +#define CONFIG_SYS_DDR_CLK_CTRL_800	0x02800000
> > +#define CONFIG_SYS_DDR_MODE_1_800	0x00040852
> > +#define CONFIG_SYS_DDR_MODE_2_800	0x00000000
> > +#define CONFIG_SYS_DDR_INTERVAL_800	0x0c300100
> > +
> > +fsl_ddr_cfg_regs_t ddr_cfg_regs_400 = {
> > +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> > +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> > +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> > +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_400,
> > +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_400,
> > +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_400,
> > +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_400,
> > +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> > +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> > +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_400,
> > +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_400,
> > +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> > +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_400,
> > +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> > +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_400,
> > +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> > +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> > +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> > +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> > +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> > +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> > +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> > +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> > +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> > +};
> > +
> > +fsl_ddr_cfg_regs_t ddr_cfg_regs_533 = {
> > +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> > +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> > +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> > +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_533,
> > +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_533,
> > +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_533,
> > +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_533,
> > +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> > +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> > +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_533,
> > +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_533,
> > +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> > +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_533,
> > +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> > +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_533,
> > +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> > +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> > +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> > +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> > +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> > +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> > +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> > +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> > +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> > +};
> > +
> > +fsl_ddr_cfg_regs_t ddr_cfg_regs_667 = {
> > +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> > +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> > +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> > +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_667,
> > +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_667,
> > +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_667,
> > +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_667,
> > +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> > +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> > +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_667,
> > +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_667,
> > +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> > +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_667,
> > +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> > +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_667,
> > +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> > +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> > +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> > +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> > +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> > +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> > +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> > +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> > +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> > +};
> > +
> > +fsl_ddr_cfg_regs_t ddr_cfg_regs_800 = {
> > +	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
> > +	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
> > +	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
> > +	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_800,
> > +	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_800,
> > +	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_800,
> > +	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_800,
> > +	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
> > +	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
> > +	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_800,
> > +	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_800,
> > +	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
> > +	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_800,
> > +	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
> > +	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_800,
> > +	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
> > +	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
> > +	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
> > +	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
> > +	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
> > +	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
> > +	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
> > +	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
> > +	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
> > +};
> > +
> > +/*
> > + * Fixed sdram init -- doesn't use serial presence detect.
> > + */
> > +
> > +phys_size_t fixed_sdram(void)
> > +{
> > +	char buf[32];
> > +	fsl_ddr_cfg_regs_t ddr_cfg_regs;
> > +	size_t ddr_size;
> > +	struct cpu_type *cpu;
> > +	ulong ddr_freq, ddr_freq_mhz;
> > +
> > +	cpu = gd->cpu;
> > +	/* P1020 and it's derivatives support max 32bit DDR width */
> > +	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
> > +		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
> > +		ddr_size = (CONFIG_SYS_SDRAM_SIZE * 1024 * 1024 / 2);
> 
> These checks don't make sense if you are a P2020 SoC
> 

This entire file is identical to board/freescale/p1_p2_rdb/ddr.c. In
fact, since this board only boots via the On-Chip ROM, the whole file is
useless: fixed_sdram() should just return the RAM size. We're running
from RAM when this function executes.

Is it ok with you if I replace the entire file with the following?

phys_size_t fixed_sdram(void)
{
	return CONFIG_SYS_SDRAM_SIZE << 20;
}

> > +	} else {
> > +		ddr_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
> > +	}
> > +#if defined(CONFIG_SYS_RAMBOOT)
> > +	return ddr_size;
> > +#endif
> > +	ddr_freq = get_ddr_freq(0);
> > +	ddr_freq_mhz = ddr_freq / 1000000;
> > +
> > +	printf("Configuring DDR for %s MT/s data rate\n",
> > +				strmhz(buf, ddr_freq));
> > +
> > +	if (ddr_freq_mhz <= 400)
> > +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_400, sizeof(ddr_cfg_regs));
> > +	else if (ddr_freq_mhz <= 533)
> > +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_533, sizeof(ddr_cfg_regs));
> > +	else if (ddr_freq_mhz <= 667)
> > +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_667, sizeof(ddr_cfg_regs));
> > +	else if (ddr_freq_mhz <= 800)
> > +		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_800, sizeof(ddr_cfg_regs));
> > +	else
> > +		panic("Unsupported DDR data rate %s MT/s data rate\n",
> > +					strmhz(buf, ddr_freq));
> 
> Does the board really support different DDR freq or is this copy / paste?
> 

The memory is an SODIMM, but the RAM is configured before U-Boot runs by
the Freescale On-Chip ROM. See above comment.

> > +
> > +	/* P1020 and it's derivatives support max 32bit DDR width */
> > +	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
> > +		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
> > +		ddr_cfg_regs.ddr_sdram_cfg |= SDRAM_CFG_32_BE;
> > +		ddr_cfg_regs.cs[0].bnds = 0x0000001F;
> > +	}
> 
> Same comment as above
> 
> > +
> > +	fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0);
> > +
> > +	set_ddr_laws(0, ddr_size, LAW_TRGT_IF_DDR_1);
> > +	return ddr_size;
> > +}
> > diff --git a/board/freescale/p2020come/law.c b/board/freescale/p2020come/law.c
> > new file mode 100644
> > index 0000000..56508db
> > --- /dev/null
> > +++ b/board/freescale/p2020come/law.c
> > @@ -0,0 +1,36 @@
> > +/*
> > + * Copyright 2009 Freescale Semiconductor, Inc.
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#include <common.h>
> > +#include <asm/fsl_law.h>
> > +#include <asm/mmu.h>
> > +
> > +struct law_entry law_table[] = {
> > +	SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
> > +	SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_1),
> > +	SET_LAW(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_2),
> > +	SET_LAW(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_2),
> > +	SET_LAW(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_3),
> > +	SET_LAW(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_3),
> 
> We normally set these up dynamically.
> 

This is a modified version of the code from
board/freescale/p1_p2_rdb/law.c. Can you suggest an in tree example of
the way you'd like the code to look? I copied what I assume is a good
example...

> > +};
> > +
> > +int num_law_entries = ARRAY_SIZE(law_table);
> > diff --git a/board/freescale/p2020come/p2020come.c b/board/freescale/p2020come/p2020come.c
> > new file mode 100644
> > index 0000000..2e334cf
> > --- /dev/null
> > +++ b/board/freescale/p2020come/p2020come.c
> > @@ -0,0 +1,401 @@
> > +/*
> > + * Copyright 2009 Freescale Semiconductor, Inc.
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#include <common.h>
> > +#include <hwconfig.h>
> > +#include <command.h>
> > +#include <asm/processor.h>
> > +#include <asm/mmu.h>
> > +#include <asm/cache.h>
> > +#include <asm/immap_85xx.h>
> > +#include <asm/fsl_serdes.h>
> > +#include <asm/io.h>
> > +#include <miiphy.h>
> > +#include <libfdt.h>
> > +#include <fdt_support.h>
> > +#include <fsl_mdio.h>
> > +#include <tsec.h>
> > +#include <vsc7385.h>
> > +#include <netdev.h>
> > +#include <mmc.h>
> > +#include <malloc.h>
> > +#include <i2c.h>
> > +
> > +#if defined(CONFIG_PCI)
> > +#include <asm/fsl_pci.h>
> > +#include <pci.h>
> > +#endif
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#if defined(CONFIG_PCI)
> > +void pci_init_board(void)
> > +{
> > +	fsl_pcie_init_board(0);
> > +}
> > +
> > +void ft_pci_board_setup(void *blob)
> > +{
> > +	FT_FSL_PCI_SETUP;
> > +}
> > +#endif
> > +
> > +/*
> > + * GPIO
> > + * 0 - 3: CarryBoard Input;
> > + * 4 - 7: CarryBoard Output;
> > + * 8 : Mux as SDHC_CD (card detection)
> > + * 9 : Mux as SDHC_WP
> > + * 10 : Clear Watchdog timer
> > + * 11 : LED Input
> > + * 12 : Output to 1
> > + * 13 : Open Drain
> > + * 14 : LED Output
> > + * 15 : Switch Input
> > + */
> > +#define GPIO_DIR		0x0f3a0000
> > +#define GPIO_ODR		0x00000000
> > +
> > +#define BOARD_PERI_RST_SET	(VSC7385_RST_SET | SLIC_RST_SET | \
> > +				 SGMII_PHY_RST_SET | PCIE_RST_SET | \
> > +				 RGMII_PHY_RST_SET)
> > +
> > +#define SYSCLK_MASK	0x00200000
> > +#define BOARDREV_MASK	0x10100000
> > +#define BOARDREV_B	0x10100000
> > +#define BOARDREV_C	0x00100000
> > +#define BOARDREV_D	0x00000000
> > +
> > +#define SYSCLK_66	66666666
> > +#define SYSCLK_50	50000000
> > +#define SYSCLK_100	100000000
> > +
> > +unsigned long get_board_sys_clk(ulong dummy)
> > +{
> > +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> > +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
> > +
> > +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
> > +	switch (ddr_ratio) {
> > +	case 0x0C:
> > +		return SYSCLK_66;
> > +	case 0x0A:
> > +	case 0x08:
> > +		return SYSCLK_100;
> > +	default:
> > +		puts("ERROR: unknown DDR ratio\n");
> > +		return SYSCLK_100;
> > +	}
> > +}
> > +
> > +unsigned long get_board_ddr_clk(ulong dummy)
> > +{
> > +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> > +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
> > +
> > +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
> > +	switch (ddr_ratio) {
> > +	case 0x0C:
> > +	case 0x0A:
> > +		return SYSCLK_66;
> > +	case 0x08:
> > +		return SYSCLK_100;
> > +	default:
> > +		puts("ERROR: unknown DDR ratio\n");
> > +		return SYSCLK_100;
> > +	}
> > +}
> > +
> > +#ifdef CONFIG_MMC
> > +int board_early_init_f(void)
> > +{
> > +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> > +
> > +	setbits_be32(&gur->pmuxcr,
> > +			(MPC85xx_PMUXCR_SDHC_CD |
> > +			 MPC85xx_PMUXCR_SDHC_WP));
> > +
> > +	/* All the device are enable except for SRIO12 */
> > +	setbits_be32(&gur->devdisr, 0x80000);
> 
> Add a #define instead of magic 0x80000
> 
> > +	return 0;
> > +}
> > +#endif
> > +
> > +int checkboard(void)
> > +{
> > +	ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR + 0xC00);
> > +
> > +	/*
> > +	 * GPIO
> > +	 * 0 - 3: CarryBoard Input;
> > +	 * 4 - 7: CarryBoard Output;
> > +	 * 8 : Mux as SDHC_CD (card detection)
> > +	 * 9 : Mux as SDHC_WP
> > +	 * 10 : Clear Watchdog timer
> > +	 * 11 : LED Input
> > +	 * 12 : Output to 1
> > +	 * 13 : Open Drain
> > +	 * 14 : LED Output
> > +	 * 15 : Switch Input
> > +	 *
> > +	 * Set GPIOs 11, 12, 14 to 1.
> > +	 */
> > +	out_be32(&pgpio->gpdir, GPIO_DIR);
> > +	out_be32(&pgpio->gpodr, GPIO_ODR);
> > +	out_be32(&pgpio->gpdat, 0x001A0000);
> 
> look at using mpc85xx_gpio.h
> 

Ok. This was copied from the BSP code. I'll change it to use the
mpc85xx_gpio code.

While we're here, perhaps you can get the schematic for this board and
see what the GPIO's are actually connected to. I can't get the
schematic, so these comments are copied from the BSP code.

The ones labeled "LED" (11 and 14) don't appear to change any LEDs that
I can see on the board.

> > +
> > +	puts("Board: Freescale COM Express P2020\n");
> > +	return 0;
> > +}
> > +
> > +#define M41ST85W_ERROR(fmt, args...) printf("ERROR: M41ST85W: " fmt, ##args)
> > +
> > +static void m41st85w_clear_bit(u8 reg, u8 mask, const char *name)
> > +{
> > +	u8 data;
> > +
> > +	if (i2c_read(0x68, reg, 1, &data, 1)) {
> > +		M41ST85W_ERROR("unable to read %s bit\n", name);
> > +		return;
> > +	}
> > +
> > +	if (data & mask) {
> > +		data &= ~mask;
> > +		if (i2c_write(0x68, reg, 1, &data, 1)) {
> > +			M41ST85W_ERROR("unable to clear %s bit\n", name);
> > +			return;
> > +		}
> > +	}
> > +}
> > +
> > +/*
> > + * The P2020COME board has a STMicro M41ST85W RTC/watchdog
> > + * at i2c bus 1 address 0x68.
> > + */
> > +static void start_rtc(void)
> > +{
> > +	unsigned int bus = i2c_get_bus_num();
> > +
> > +	if (i2c_set_bus_num(1)) {
> > +		M41ST85W_ERROR("unable to set i2c bus\n");
> > +		goto out;
> > +	}
> > +
> > +	/* ensure ST (stop) and HT (halt update) bits are cleared */
> > +	m41st85w_clear_bit(0x1, 0x80, "ST");
> > +	m41st85w_clear_bit(0xc, 0x40, "HT");
> > +
> > +out:
> > +	/* reset the i2c bus */
> > +	i2c_set_bus_num(bus);
> > +}
> > +
> > +int board_early_init_r(void)
> > +{
> > +	start_rtc();
> > +	return 0;
> > +}
> > +
> > +void board_reset(void)
> > +{
> > +	u8 data = (1 << 2) | 0x82;
> 
> some #defines instead of magic #s
> 
> > +
> > +	/* set the hardware watchdog timeout to 1 second, then hang */
> > +	i2c_set_bus_num(1);
> > +	i2c_write(0x68, 9, 1, &data, 1);
> > +
> > +	while (1)
> > +		/* hang */;
> > +}
> > +
> > +#ifdef CONFIG_TSEC_ENET
> > +int board_eth_init(bd_t *bis)
> > +{
> > +	struct fsl_pq_mdio_info mdio_info;
> > +	struct tsec_info_struct tsec_info[4];
> > +	int num = 0;
> > +
> > +#ifdef CONFIG_TSEC1
> > +	SET_STD_TSEC_INFO(tsec_info[num], 1);
> > +	num++;
> > +#endif
> > +#ifdef CONFIG_TSEC2
> > +	SET_STD_TSEC_INFO(tsec_info[num], 2);
> > +	num++;
> > +#endif
> > +#ifdef CONFIG_TSEC3
> > +	SET_STD_TSEC_INFO(tsec_info[num], 3);
> > +	if (is_serdes_configured(SGMII_TSEC3)) {
> > +		puts("eTSEC3 is in sgmii mode.");
> > +		tsec_info[num].flags |= TSEC_SGMII;
> > +	}
> > +	num++;
> > +#endif
> > +	if (!num) {
> > +		printf("No TSECs initialized\n");
> > +		return 0;
> > +	}
> > +
> > +	mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
> > +	mdio_info.name = DEFAULT_MII_NAME;
> > +	fsl_pq_mdio_init(bis, &mdio_info);
> > +
> > +	tsec_eth_init(bis, tsec_info, num);
> > +
> > +	return pci_eth_init(bis);
> > +}
> > +#endif
> > +
> > +#if defined(CONFIG_OF_BOARD_SETUP)
> > +void fdt_fixup_add_2nd_usb(void *blob, int agent)
> > +{
> 
> What are you trying to do here?
> 

This was copied from the BSP code, I have no idea what the purpose is. I
just checked: the board works fine with this removed. I'll remove it.

> > +	const char *soc_compat = "fsl,p2020-immr";
> > +	const char *lbc_compat = "fsl,p2020-elbc";
> > +	const u32 *addrcell, *sizecell, *ph;
> > +	int off, lbcoff, len, err;
> > +	u32 *regbuf = NULL;
> > +	u32 *irqbuf = NULL;
> > +
> > +	off = fdt_node_offset_by_compatible(blob, -1, soc_compat);
> > +	if (off < 0) {
> > +		printf("WARNING: could not find compatible node %s: %s.\n",
> > +			soc_compat, fdt_strerror(off));
> > +		return;
> > +	}
> > +
> > +	lbcoff = fdt_node_offset_by_compatible(blob, -1, lbc_compat);
> > +	if (lbcoff < 0) {
> > +		printf("WARNING: could not find compatible node %s: %s.\n",
> > +			lbc_compat, fdt_strerror(lbcoff));
> > +		return;
> > +	}
> > +
> > +	addrcell = fdt_getprop(blob, off, "#address-cells", NULL);
> > +	sizecell = fdt_getprop(blob, off, "#size-cells", NULL);
> > +
> > +	off = fdt_add_subnode(blob, off, "usb@23000");
> > +	if (off < 0) {
> > +		printf("WARNING: could not add 2nd usb node %s.\n",
> > +				fdt_strerror(off));
> > +		return;
> > +	}
> > +
> > +	err = fdt_setprop_cell(blob, off, "#address-cells", 1);
> > +	if (err < 0)
> > +		printf("WARNING: could not set #address-cell property: %s\n",
> > +			fdt_strerror(err));
> > +
> > +	err = fdt_setprop_cell(blob, off, "#size-cells", 0);
> > +	if (err < 0)
> > +		printf("WARNING: could not set #size-cells property: %s\n",
> > +			fdt_strerror(err));
> > +
> > +	err = fdt_setprop_string(blob, off, "compatible", "fsl-usb2-dr");
> > +	if (err < 0)
> > +		printf("WARNING: could not set compatible property: %s\n",
> > +			fdt_strerror(err));
> > +
> > +	err = fdt_setprop_string(blob, off, "phy_type", "ulpi");
> > +	if (err < 0)
> > +		printf("WARNING: could not set phy_type property: %s\n",
> > +			fdt_strerror(err));
> > +
> > +	if (agent) {
> > +		err = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
> > +		if (err < 0)
> > +			printf("WARNING: could not set dr_mode property: %s\n",
> > +				fdt_strerror(err));
> > +	}
> > +
> > +	if (addrcell && *addrcell == 2) {
> > +		regbuf[0] = 0;
> > +		regbuf[1] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> > +		len = 2;
> > +	} else {
> > +		regbuf[0] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
> > +		len = 1;
> > +	}
> > +
> > +	if (sizecell && *sizecell == 2) {
> > +		regbuf[len] = 0;
> > +		regbuf[len + 1] = 0x1000;
> > +		len = 2;
> > +	} else {
> > +		regbuf[len] = 0x1000;
> > +		len++;
> > +	}
> > +
> > +	err = fdt_setprop(blob, off, "reg", regbuf, len * sizeof(u32));
> > +	if (err < 0)
> > +		printf("WARNING: could not set <%s> %s\n",
> > +					"reg", fdt_strerror(err));
> > +
> > +	irqbuf[0] = 0x2e;
> > +	irqbuf[1] = 0x2;
> > +
> > +	err = fdt_setprop(blob, off, "interrupts", irqbuf, 2 * sizeof(u32));
> > +	if (err < 0)
> > +		printf("WARNING: could not set %s %s\n",
> > +				"interrupts", fdt_strerror(err));
> > +
> > +	ph = fdt_getprop(blob, lbcoff, "interrupt-parent", 0);
> > +	if (!ph) {
> > +		printf("WARNING: could not read interrupt-parent property\n");
> > +		return;
> > +	}
> > +
> > +	err = fdt_setprop(blob, off, "interrupt-parent", ph, sizeof(u32));
> > +	if (err < 0)
> > +		printf("WARNING: could not set %s %s\n",
> > +				"interrupt-parent", fdt_strerror(err));
> > +}
> > +
> > +void ft_board_setup(void *blob, bd_t *bd)
> > +{
> > +	phys_addr_t base;
> > +	phys_size_t size;
> > +	int agent;
> > +
> > +	ft_cpu_setup(blob, bd);
> > +
> > +	base = getenv_bootm_low();
> > +	size = getenv_bootm_size();
> > +
> > +#if defined(CONFIG_PCI)
> > +	ft_pci_board_setup(blob);
> > +#endif
> > +
> > +	fdt_fixup_memory(blob, (u64)base, (u64)size);
> > +
> > +	if (!hwconfig("usb2"))
> > +		return;
> > +
> > +	agent = hwconfig_subarg_cmp("usb2", "dr_mode", "peripheral");
> > +
> > +	/*
> > +	 * Add the 2nd usb node and enable it. eLBC will
> > +	 * now be disabled since it is MUXed with USB2
> > +	 */
> > +
> > +	fdt_fixup_add_2nd_usb(blob, agent);
> > +}
> > +#endif
> > diff --git a/board/freescale/p2020come/tlb.c b/board/freescale/p2020come/tlb.c
> > new file mode 100644
> > index 0000000..e1dd056
> > --- /dev/null
> > +++ b/board/freescale/p2020come/tlb.c
> > @@ -0,0 +1,100 @@
> > +/*
> > + * Copyright 2011 Freescale Semiconductor, Inc.
> > + *
> > + * See file CREDITS for list of people who contributed to this
> > + * project.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License as
> > + * published by the Free Software Foundation; either version 2 of
> > + * the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> > + * MA 02111-1307 USA
> > + */
> > +
> > +#include <common.h>
> > +#include <asm/mmu.h>
> > +
> 
> For any regions that do NOT have code, we should remove MAS3_SX bit:
> 

I assume you mean the CCSR and PCI regions. Maybe the
CONFIG_SYS_INIT_RAM_ADDR regions too, I don't know what they're used
for.

Thanks for the comments. I look forward to your feedback on the couple
of questions I have.

Ira

> > +struct fsl_e_tlb_entry tlb_table[] = {
> > +	/* TLB 0 - for temp stack in cache */
> > +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR,
> > +			CONFIG_SYS_INIT_RAM_ADDR_PHYS,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> > +			0, 0, BOOKE_PAGESZ_4K, 0),
> > +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024 ,
> > +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> > +			0, 0, BOOKE_PAGESZ_4K, 0),
> > +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024 ,
> > +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> > +			0, 0, BOOKE_PAGESZ_4K, 0),
> > +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024 ,
> > +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
> > +			0, 0, BOOKE_PAGESZ_4K, 0),
> > +
> > +	/* TLB 1 */
> > +	/* *I*** - Covers boot page */
> > +	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 0, BOOKE_PAGESZ_4K, 1),
> > +
> > +	/* *I*G* - CCSRBAR */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 1, BOOKE_PAGESZ_1M, 1),
> > +
> > +#if defined(CONFIG_PCI)
> > +	/* *I*G* - PCI3 - PCI2 0x8000,0000 - 0xbfff,ffff, size = 1G */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 2, BOOKE_PAGESZ_1G, 1),
> > +
> > +	/* *I*G* - PCI1 0xC000,0000 - 0xcfff,ffff, size = 256M */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_VIRT,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 3, BOOKE_PAGESZ_256M, 1),
> > +
> > +
> > +	/* *I*G* - PCI1  0xD000,0000 - 0xDFFF,FFFF, size = 256M */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
> > +			CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 4, BOOKE_PAGESZ_256M, 1),
> > +
> > +	/*
> > +	 * *I*G* - PCI I/O
> > +	 *
> > +	 * PCI3 => 0xFFC10000
> > +	 * PCI2 => 0xFFC2,0000
> > +	 * PCI1 => 0xFFC3,0000
> > +	 */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 5, BOOKE_PAGESZ_256K, 1),
> > +#endif /* #if defined(CONFIG_PCI) */
> > +
> > +#if defined(CONFIG_SYS_RAMBOOT)
> > +	/* *I*G - DDR3  2G     Part 1: 0 - 0x3fff,ffff , size = 1G */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 6, BOOKE_PAGESZ_1G, 1),
> > +
> > +	/*        DDR3  2G     Part 2: 0x4000,0000 - 0x7fff,ffff , size = 1G */
> > +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
> > +			CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
> > +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
> > +			0, 7, BOOKE_PAGESZ_1G, 1),
> > +#endif
> > +};
> > +
> > +int num_tlb_entries = ARRAY_SIZE(tlb_table);
> 
>
McClintock Matthew-B29882 Nov. 11, 2011, 4:58 p.m. UTC | #3
On Fri, Nov 11, 2011 at 10:53 AM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
>> Does the board really support different DDR freq or is this copy / paste?
>>
>
> The memory is an SODIMM, but the RAM is configured before U-Boot runs by
> the Freescale On-Chip ROM. See above comment.

If this is a P2020 you could use the on chip rom to copy u-boot to
L2SRAM and configure DDR via SPD - if you ever plan to change the
SODIMMs this could be very useful.

-M
Ira Snyder Nov. 11, 2011, 5:12 p.m. UTC | #4
On Fri, Nov 11, 2011 at 04:58:17PM +0000, McClintock Matthew-B29882 wrote:
> On Fri, Nov 11, 2011 at 10:53 AM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> >> Does the board really support different DDR freq or is this copy / paste?
> >>
> >
> > The memory is an SODIMM, but the RAM is configured before U-Boot runs by
> > the Freescale On-Chip ROM. See above comment.
> 
> If this is a P2020 you could use the on chip rom to copy u-boot to
> L2SRAM and configure DDR via SPD - if you ever plan to change the
> SODIMMs this could be very useful.
> 

Yep, this is a P2020.

I'll check the Freescale documentation. Hopefully it provides an example
of how to configure the On-Chip ROM to use L2SRAM instead of DDR.

I'll try and find a U-Boot port that configures DDR via SPD. I'm sure
there are plenty, however any hints are welcome. :)

Thanks for the input,
Ira
McClintock Matthew-B29882 Nov. 11, 2011, 8:36 p.m. UTC | #5
On Fri, Nov 11, 2011 at 11:12 AM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> Yep, this is a P2020.
>
> I'll check the Freescale documentation. Hopefully it provides an example
> of how to configure the On-Chip ROM to use L2SRAM instead of DDR.
>
> I'll try and find a U-Boot port that configures DDR via SPD. I'm sure
> there are plenty, however any hints are welcome. :)

For an example the P2020DS works like this... I've attached the
boot-format dat file as well.

-M
Ira Snyder Nov. 11, 2011, 9:03 p.m. UTC | #6
On Fri, Nov 11, 2011 at 08:36:47PM +0000, McClintock Matthew-B29882 wrote:
> On Fri, Nov 11, 2011 at 11:12 AM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > Yep, this is a P2020.
> >
> > I'll check the Freescale documentation. Hopefully it provides an example
> > of how to configure the On-Chip ROM to use L2SRAM instead of DDR.
> >
> > I'll try and find a U-Boot port that configures DDR via SPD. I'm sure
> > there are plenty, however any hints are welcome. :)
> 
> For an example the P2020DS works like this... I've attached the
> boot-format dat file as well.
> 

Thanks. That config_sram.dat is exactly what I came up with.

I have my board booting via L2SRAM, but the DDR doesn't get configured
correctly yet. I'm trying to figure out how the DDR SPD stuff works in
U-Boot. I've never used it before. I'm following the P2020DS code as an
example, but I haven't yet figured out how the code in
board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
structure especially).

Ira
McClintock Matthew-B29882 Nov. 11, 2011, 9:07 p.m. UTC | #7
On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> Thanks. That config_sram.dat is exactly what I came up with.
>
> I have my board booting via L2SRAM, but the DDR doesn't get configured
> correctly yet. I'm trying to figure out how the DDR SPD stuff works in
> U-Boot. I've never used it before. I'm following the P2020DS code as an
> example, but I haven't yet figured out how the code in
> board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
> structure especially).

If you board has i2c to the ddr modules it should be able to use the
timing info from there. I think CONFIG_DDR_SPD is the config option
you are looking for. I know the P2020DS does SPD from L2SRAM.

-M
Ira Snyder Nov. 11, 2011, 10:18 p.m. UTC | #8
On Fri, Nov 11, 2011 at 09:07:23PM +0000, McClintock Matthew-B29882 wrote:
> On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > Thanks. That config_sram.dat is exactly what I came up with.
> >
> > I have my board booting via L2SRAM, but the DDR doesn't get configured
> > correctly yet. I'm trying to figure out how the DDR SPD stuff works in
> > U-Boot. I've never used it before. I'm following the P2020DS code as an
> > example, but I haven't yet figured out how the code in
> > board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
> > structure especially).
> 
> If you board has i2c to the ddr modules it should be able to use the
> timing info from there. I think CONFIG_DDR_SPD is the config option
> you are looking for. I know the P2020DS does SPD from L2SRAM.
> 

The only thing that looks like an SPD chip is at i2c bus 1, address
0x53. I setup my board configuration with:

#define CONFIG_FSL_DDR3
#define CONFIG_FSL_DDR_INTERACTIVE
#define CONFIG_CHIP_SELECTS_PER_CTRL	2
#define CONFIG_SYS_DDR_SBE		0x00010000

#define CONFIG_DDR_SPD
#define CONFIG_SYS_SPD_BUS_NUM		1
#define SPD_EEPROM_ADDRESS		0x53

Some of the settings the SPD code computes are correct, and some are
completely wrong. I can't figure out how to make this work.

Here is the raw SPD dumped from a working U-Boot:

0000: 92 10 0b 08 02 11 00 09 0b 52 01 08 0c 00 3e 00    .........R....>.
0010: 69 78 69 30 69 11 20 89 70 03 3c 3c 00 f0 83 05    ixi0i. .p.<<....
0020: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 1f 00    ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0070: 00 00 00 00 00 01 94 01 10 25 03 ae 48 48 e3 e3    .........%..HH..
0080: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32    SG572568EMR069S2
0090: 53 46 00 00 80 ce 53 4d 41 52 54 4d 6f 64 75 6c    SF....SMARTModul
00a0: 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    arTechnologies..
00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

And here is the output of an interactive FSL DDR run:

U-Boot 2011.09-00929-g3b5f71c-dirty (Nov 11 2011 - 13:31:13)

CPU0:  P2020E, Version: 2.0, (0x80ea0020)
Core:  E500, Version: 5.0, (0x80211050)
Clock Configuration:
       CPU0:1200 MHz, CPU1:1200 MHz, 
       CCB:600  MHz,
       DDR:333.333 MHz (666.667 MT/s data rate) (Asynchronous), LBC:37.500 MHz
L1:    D-cache 32 kB enabled
       I-cache 32 kB enabled
Board: Freescale COM Express P2020
I2C:   ready
SPI:   ready
DRAM:  FSL DDR>
FSL DDR>
FSL DDR>compute
unknown module_type 0x08
Detected UDIMM SG572568EMR069S2SF
The choosen cas latency 16 is too large
FSL DDR>print c0 d0
SPD info:  Controller=0 DIMM=0
0      : 92 info_size_crc  bytes written into serial memory, CRC coverage
1      : 10 spd_rev        SPD Revision
2      : 0b mem_type       Key Byte / DRAM Device Type
3      : 08 module_type    Key Byte / Module Type
4      : 02 density_banks  SDRAM Density and Banks
5      : 11 addressing     SDRAM Addressing
6      : 00 module_vdd     Module Nominal Voltage, VDD
7      : 09 organization   Module Organization
8      : 0b bus_width      Module Memory Bus Width
9      : 52 ftb_div        Fine Timebase (FTB) Dividend / Divisor
10     : 01 mtb_dividend   Medium Timebase (MTB) Dividend
11     : 08 mtb_divisor    Medium Timebase (MTB) Divisor
12     : 0c tCK_min        SDRAM Minimum Cycle Time
13     : 00 res_13         Reserved
14     : 3e caslat_lsb     CAS Latencies Supported, LSB
15     : 00 caslat_msb     CAS Latencies Supported, MSB
16     : 69 tAA_min        Min CAS Latency Time
17     : 78 tWR_min        Min Write REcovery Time
18     : 69 tRCD_min       Min RAS# to CAS# Delay Time
19     : 30 tRRD_min       Min Row Active to Row Active Delay Time
20     : 69 tRP_min        Min Row Precharge Delay Time
21     : 11 tRAS_tRC_ext   Upper Nibbles for tRAS and tRC
22     : 20 tRAS_min_lsb   Min Active to Precharge Delay Time, LSB
23     : 89 tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB
24     : 70 tRFC_min_lsb   Min Refresh Recovery Delay Time LSB
25     : 03 tRFC_min_msb   Min Refresh Recovery Delay Time MSB
26     : 3c tWTR_min       Min Internal Write to Read Command Delay Time
27     : 3c tRTP_min Min Internal Read to Precharge Command Delay Time
28     : 00 tFAW_msb       Upper Nibble for tFAW
29     : f0 tFAW_min       Min Four Activate Window Delay Time
30     : 83 opt_features   SDRAM Optional Features
31     : 05 therm_ref_opt  SDRAM Thermal and Refresh Opts
32     : 80 therm_sensor  SDRAM Thermal Sensor
33     : 00 device_type  SDRAM Device Type
34 - 59: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
60 -116: 0f111f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117    : 01 Module MfgID Code LSB - JEP-106
118    : 94 Module MfgID Code MSB - JEP-106
119    : 01 Mfg Location
120-121: 10 25 Mfg Date
122-125: 03 ae 48 48    Module Serial Number
126-127: e3 e3   SPD CRC
128-145: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32 53 46    Mfg's Module Part Number
146-147: 00 00 Module Revision code
148    : 80 DRAM MfgID Code LSB - JEP-106
149    : ce DRAM MfgID Code MSB - JEP-106
150-175: 53 4d 41 52 54 4d 6f 64 75 6c 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    Mfg's Specific Data
176-255: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   Mfg's Specific Data



DIMM parameters:  Controller=0 DIMM=0
DIMM organization parameters:
module part name = SG572568EMR069S2SF
rank_density = 1073741824 bytes (1024 megabytes)
capacity = 2147483648 bytes (2048 megabytes)
burst_lengths_bitmask = 00
base_addresss = 0 (00000000 00000000)
n_ranks = 2
data_width = 72
primary_sdram_width = 64
ec_sdram_width = 8
registered_dimm = 0
n_row_addr = 0
n_col_addr = 0
edc_config = 0
n_banks_per_sdram_device = 0
tCKmin_X_ps = 0
tCKmin_X_minus_1_ps = 0
tCKmin_X_minus_2_ps = 0
tCKmax_ps = 0
caslat_X = 0
tAA_ps = 0
caslat_X_minus_1 = 0
caslat_X_minus_2 = 0
caslat_lowest_derated = 0
tRCD_ps = 0
tRP_ps = 0
tRAS_ps = 0
tWR_ps = 0
tWTR_ps = 0
tRFC_ps = 0
tRRD_ps = 0
tRC_ps = 0
refresh_rate_ps = 0
tIS_ps = 0
tIH_ps = 0
tDS_ps = 0
tDH_ps = 0
tRTP_ps = 0
tDQSQ_max_ps = 0
tQHS_ps = 0



"lowest common" DIMM parameters:  Controller=0
tCKmin_X_ps = 0 (4294967295 MHz)
tCKmax_ps = 0 (4294967295 MHz)
all_DIMMs_burst_lengths_bitmask = 00
tCKmax_max_ps = 0
tRCD_ps = 0
tRP_ps = 0
tRAS_ps = 0
tWR_ps = 0
tWTR_ps = 0
tRFC_ps = 0
tRRD_ps = 0
tRC_ps = 0
refresh_rate_ps = 0
tIS_ps = 0
tDS_ps = 0
tDH_ps = 0
tRTP_ps = 0
tDQSQ_max_ps = 0
tQHS_ps = 0
lowest_common_SPD_caslat = 0
highest_common_derated_caslat = 0
additive_latency = 0
ndimms_present = 1
all_DIMMs_registered = 0
all_DIMMs_unbuffered = 1
all_DIMMs_ECC_capable = 0
total_mem = 2147483648 (2048 megabytes)
base_address = 0 (0 megabytes)


User Config Options: Controller=0
cs0_odt_rd_cfg = 0
cs0_odt_wr_cfg = 1
cs1_odt_rd_cfg = 0
cs1_odt_wr_cfg = 1
cs0_odt_rtt_norm = 3
cs0_odt_rtt_wr = 0
cs1_odt_rtt_norm = 0
cs1_odt_rtt_wr = 0
memctl_interleaving = 0
memctl_interleaving_mode = 0
ba_intlv_ctl = 0x00000040
ECC_mode = 0
ECC_init_using_memctl = 1
DQS_config = 1
self_refresh_in_sleep = 1
dynamic_power = 0
data_bus_width = 0
burst_length = 6
cas_latency_override = 0
cas_latency_override_value = 3
use_derated_caslat = 0
additive_latency_override = 0
additive_latency_override_value = 3
clk_adjust = 6
cpo_override = 31
write_data_delay = 4
half_strength_driver_enable = 0
twoT_en = 0
threeT_en = 0
registered_dimm_en = 0
ap_en = 1
bstopre = 256
wrlvl_override = 1
wrlvl_sample = 10
wrlvl_start = 8
rcw_override = 0
rcw_1 = 0
rcw_2 = 0
tCKE_clock_pulse_width_ps = 9000
tFAW_window_four_activates_ps = 0
trwt_override = 0
trwt = 0


Address Assignment: Controller=0 DIMM=0
Don't have this functionality yet


Computed Register Values: Controller=0
cs0_bnds = 0x0000007F
cs0_config = 0x80014400
cs0_config_2 = 0x00000000
cs1_bnds = 0x00000000
cs1_config = 0x80014400
cs1_config_2 = 0x00000000
timing_cfg_3 = 0x000F0000
timing_cfg_0 = 0x40110104
timing_cfg_1 = 0x000F8246
timing_cfg_2 = 0x0FA8D0C0
ddr_sdram_cfg = 0xC7004000
ddr_sdram_cfg_2 = 0x24401040
ddr_sdram_mode = 0x00401021
ddr_sdram_mode_2 = 0x00000000
ddr_sdram_mode_3 = 0x00000000
ddr_sdram_mode_4 = 0x00000000
ddr_sdram_mode_5 = 0x00000000
ddr_sdram_mode_6 = 0x00000000
ddr_sdram_mode_7 = 0x00000000
ddr_sdram_mode_8 = 0x00000000
ddr_sdram_interval = 0x00000100
ddr_data_init = 0xDEADBEEF
ddr_sdram_clk_cntl = 0x03000000
ddr_init_addr = 0x00000000
ddr_init_ext_addr = 0x00000000
timing_cfg_4 = 0x00220001
timing_cfg_5 = 0x1C401400
ddr_zq_cntl = 0x89080600
ddr_wrlvl_cntl = 0x8675A608
ddr_sr_cntr = 0x00000000
ddr_sdram_rcw_1 = 0x00000000
ddr_sdram_rcw_2 = 0x00000000
ddr_cdr1 = 0x00000000
ddr_cdr2 = 0x00000000
err_disable = 0x00000000
err_int_en = 0x00000000
debug_01 = 0x00000000
debug_02 = 0x00000000
debug_03 = 0x00000000
debug_04 = 0x00000000
debug_05 = 0x00000000
debug_06 = 0x00000000
debug_07 = 0x00000000
debug_08 = 0x00000000
debug_09 = 0x00000000
debug_10 = 0x00000000
debug_11 = 0x00000000
debug_12 = 0x00000000
debug_13 = 0x00000000
debug_14 = 0x00000000
debug_15 = 0x00000000
debug_16 = 0x00000000
debug_17 = 0x00000000
debug_18 = 0x00000000
debug_19 = 0x00000000
debug_20 = 0x00000000
debug_21 = 0x00000000
debug_22 = 0x00000000
debug_23 = 0x00000000
debug_24 = 0x00000000
debug_25 = 0x00000000
debug_26 = 0x00000000
debug_27 = 0x00000000
debug_28 = 0x00000000
debug_29 = 0x00000000
debug_30 = 0x00000000
debug_31 = 0x00000000
debug_32 = 0x00000000
McClintock Matthew-B29882 Nov. 11, 2011, 10:54 p.m. UTC | #9
Adding York who might be able to help more...

-M

On Fri, Nov 11, 2011 at 4:18 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> On Fri, Nov 11, 2011 at 09:07:23PM +0000, McClintock Matthew-B29882 wrote:
>> On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
>> > Thanks. That config_sram.dat is exactly what I came up with.
>> >
>> > I have my board booting via L2SRAM, but the DDR doesn't get configured
>> > correctly yet. I'm trying to figure out how the DDR SPD stuff works in
>> > U-Boot. I've never used it before. I'm following the P2020DS code as an
>> > example, but I haven't yet figured out how the code in
>> > board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
>> > structure especially).
>>
>> If you board has i2c to the ddr modules it should be able to use the
>> timing info from there. I think CONFIG_DDR_SPD is the config option
>> you are looking for. I know the P2020DS does SPD from L2SRAM.
>>
>
> The only thing that looks like an SPD chip is at i2c bus 1, address
> 0x53. I setup my board configuration with:
>
> #define CONFIG_FSL_DDR3
> #define CONFIG_FSL_DDR_INTERACTIVE
> #define CONFIG_CHIP_SELECTS_PER_CTRL    2
> #define CONFIG_SYS_DDR_SBE              0x00010000
>
> #define CONFIG_DDR_SPD
> #define CONFIG_SYS_SPD_BUS_NUM          1
> #define SPD_EEPROM_ADDRESS              0x53
>
> Some of the settings the SPD code computes are correct, and some are
> completely wrong. I can't figure out how to make this work.
>
> Here is the raw SPD dumped from a working U-Boot:
>
> 0000: 92 10 0b 08 02 11 00 09 0b 52 01 08 0c 00 3e 00    .........R....>.
> 0010: 69 78 69 30 69 11 20 89 70 03 3c 3c 00 f0 83 05    ixi0i. .p.<<....
> 0020: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 0030: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 1f 00    ................
> 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 0070: 00 00 00 00 00 01 94 01 10 25 03 ae 48 48 e3 e3    .........%..HH..
> 0080: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32    SG572568EMR069S2
> 0090: 53 46 00 00 80 ce 53 4d 41 52 54 4d 6f 64 75 6c    SF....SMARTModul
> 00a0: 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    arTechnologies..
> 00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> 00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
>
> And here is the output of an interactive FSL DDR run:
>
> U-Boot 2011.09-00929-g3b5f71c-dirty (Nov 11 2011 - 13:31:13)
>
> CPU0:  P2020E, Version: 2.0, (0x80ea0020)
> Core:  E500, Version: 5.0, (0x80211050)
> Clock Configuration:
>       CPU0:1200 MHz, CPU1:1200 MHz,
>       CCB:600  MHz,
>       DDR:333.333 MHz (666.667 MT/s data rate) (Asynchronous), LBC:37.500 MHz
> L1:    D-cache 32 kB enabled
>       I-cache 32 kB enabled
> Board: Freescale COM Express P2020
> I2C:   ready
> SPI:   ready
> DRAM:  FSL DDR>
> FSL DDR>
> FSL DDR>compute
> unknown module_type 0x08
> Detected UDIMM SG572568EMR069S2SF
> The choosen cas latency 16 is too large
> FSL DDR>print c0 d0
> SPD info:  Controller=0 DIMM=0
> 0      : 92 info_size_crc  bytes written into serial memory, CRC coverage
> 1      : 10 spd_rev        SPD Revision
> 2      : 0b mem_type       Key Byte / DRAM Device Type
> 3      : 08 module_type    Key Byte / Module Type
> 4      : 02 density_banks  SDRAM Density and Banks
> 5      : 11 addressing     SDRAM Addressing
> 6      : 00 module_vdd     Module Nominal Voltage, VDD
> 7      : 09 organization   Module Organization
> 8      : 0b bus_width      Module Memory Bus Width
> 9      : 52 ftb_div        Fine Timebase (FTB) Dividend / Divisor
> 10     : 01 mtb_dividend   Medium Timebase (MTB) Dividend
> 11     : 08 mtb_divisor    Medium Timebase (MTB) Divisor
> 12     : 0c tCK_min        SDRAM Minimum Cycle Time
> 13     : 00 res_13         Reserved
> 14     : 3e caslat_lsb     CAS Latencies Supported, LSB
> 15     : 00 caslat_msb     CAS Latencies Supported, MSB
> 16     : 69 tAA_min        Min CAS Latency Time
> 17     : 78 tWR_min        Min Write REcovery Time
> 18     : 69 tRCD_min       Min RAS# to CAS# Delay Time
> 19     : 30 tRRD_min       Min Row Active to Row Active Delay Time
> 20     : 69 tRP_min        Min Row Precharge Delay Time
> 21     : 11 tRAS_tRC_ext   Upper Nibbles for tRAS and tRC
> 22     : 20 tRAS_min_lsb   Min Active to Precharge Delay Time, LSB
> 23     : 89 tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB
> 24     : 70 tRFC_min_lsb   Min Refresh Recovery Delay Time LSB
> 25     : 03 tRFC_min_msb   Min Refresh Recovery Delay Time MSB
> 26     : 3c tWTR_min       Min Internal Write to Read Command Delay Time
> 27     : 3c tRTP_min Min Internal Read to Precharge Command Delay Time
> 28     : 00 tFAW_msb       Upper Nibble for tFAW
> 29     : f0 tFAW_min       Min Four Activate Window Delay Time
> 30     : 83 opt_features   SDRAM Optional Features
> 31     : 05 therm_ref_opt  SDRAM Thermal and Refresh Opts
> 32     : 80 therm_sensor  SDRAM Thermal Sensor
> 33     : 00 device_type  SDRAM Device Type
> 34 - 59: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 60 -116: 0f111f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117    : 01 Module MfgID Code LSB - JEP-106
> 118    : 94 Module MfgID Code MSB - JEP-106
> 119    : 01 Mfg Location
> 120-121: 10 25 Mfg Date
> 122-125: 03 ae 48 48    Module Serial Number
> 126-127: e3 e3   SPD CRC
> 128-145: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32 53 46    Mfg's Module Part Number
> 146-147: 00 00 Module Revision code
> 148    : 80 DRAM MfgID Code LSB - JEP-106
> 149    : ce DRAM MfgID Code MSB - JEP-106
> 150-175: 53 4d 41 52 54 4d 6f 64 75 6c 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    Mfg's Specific Data
> 176-255: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   Mfg's Specific Data
>
>
>
> DIMM parameters:  Controller=0 DIMM=0
> DIMM organization parameters:
> module part name = SG572568EMR069S2SF
> rank_density = 1073741824 bytes (1024 megabytes)
> capacity = 2147483648 bytes (2048 megabytes)
> burst_lengths_bitmask = 00
> base_addresss = 0 (00000000 00000000)
> n_ranks = 2
> data_width = 72
> primary_sdram_width = 64
> ec_sdram_width = 8
> registered_dimm = 0
> n_row_addr = 0
> n_col_addr = 0
> edc_config = 0
> n_banks_per_sdram_device = 0
> tCKmin_X_ps = 0
> tCKmin_X_minus_1_ps = 0
> tCKmin_X_minus_2_ps = 0
> tCKmax_ps = 0
> caslat_X = 0
> tAA_ps = 0
> caslat_X_minus_1 = 0
> caslat_X_minus_2 = 0
> caslat_lowest_derated = 0
> tRCD_ps = 0
> tRP_ps = 0
> tRAS_ps = 0
> tWR_ps = 0
> tWTR_ps = 0
> tRFC_ps = 0
> tRRD_ps = 0
> tRC_ps = 0
> refresh_rate_ps = 0
> tIS_ps = 0
> tIH_ps = 0
> tDS_ps = 0
> tDH_ps = 0
> tRTP_ps = 0
> tDQSQ_max_ps = 0
> tQHS_ps = 0
>
>
>
> "lowest common" DIMM parameters:  Controller=0
> tCKmin_X_ps = 0 (4294967295 MHz)
> tCKmax_ps = 0 (4294967295 MHz)
> all_DIMMs_burst_lengths_bitmask = 00
> tCKmax_max_ps = 0
> tRCD_ps = 0
> tRP_ps = 0
> tRAS_ps = 0
> tWR_ps = 0
> tWTR_ps = 0
> tRFC_ps = 0
> tRRD_ps = 0
> tRC_ps = 0
> refresh_rate_ps = 0
> tIS_ps = 0
> tDS_ps = 0
> tDH_ps = 0
> tRTP_ps = 0
> tDQSQ_max_ps = 0
> tQHS_ps = 0
> lowest_common_SPD_caslat = 0
> highest_common_derated_caslat = 0
> additive_latency = 0
> ndimms_present = 1
> all_DIMMs_registered = 0
> all_DIMMs_unbuffered = 1
> all_DIMMs_ECC_capable = 0
> total_mem = 2147483648 (2048 megabytes)
> base_address = 0 (0 megabytes)
>
>
> User Config Options: Controller=0
> cs0_odt_rd_cfg = 0
> cs0_odt_wr_cfg = 1
> cs1_odt_rd_cfg = 0
> cs1_odt_wr_cfg = 1
> cs0_odt_rtt_norm = 3
> cs0_odt_rtt_wr = 0
> cs1_odt_rtt_norm = 0
> cs1_odt_rtt_wr = 0
> memctl_interleaving = 0
> memctl_interleaving_mode = 0
> ba_intlv_ctl = 0x00000040
> ECC_mode = 0
> ECC_init_using_memctl = 1
> DQS_config = 1
> self_refresh_in_sleep = 1
> dynamic_power = 0
> data_bus_width = 0
> burst_length = 6
> cas_latency_override = 0
> cas_latency_override_value = 3
> use_derated_caslat = 0
> additive_latency_override = 0
> additive_latency_override_value = 3
> clk_adjust = 6
> cpo_override = 31
> write_data_delay = 4
> half_strength_driver_enable = 0
> twoT_en = 0
> threeT_en = 0
> registered_dimm_en = 0
> ap_en = 1
> bstopre = 256
> wrlvl_override = 1
> wrlvl_sample = 10
> wrlvl_start = 8
> rcw_override = 0
> rcw_1 = 0
> rcw_2 = 0
> tCKE_clock_pulse_width_ps = 9000
> tFAW_window_four_activates_ps = 0
> trwt_override = 0
> trwt = 0
>
>
> Address Assignment: Controller=0 DIMM=0
> Don't have this functionality yet
>
>
> Computed Register Values: Controller=0
> cs0_bnds = 0x0000007F
> cs0_config = 0x80014400
> cs0_config_2 = 0x00000000
> cs1_bnds = 0x00000000
> cs1_config = 0x80014400
> cs1_config_2 = 0x00000000
> timing_cfg_3 = 0x000F0000
> timing_cfg_0 = 0x40110104
> timing_cfg_1 = 0x000F8246
> timing_cfg_2 = 0x0FA8D0C0
> ddr_sdram_cfg = 0xC7004000
> ddr_sdram_cfg_2 = 0x24401040
> ddr_sdram_mode = 0x00401021
> ddr_sdram_mode_2 = 0x00000000
> ddr_sdram_mode_3 = 0x00000000
> ddr_sdram_mode_4 = 0x00000000
> ddr_sdram_mode_5 = 0x00000000
> ddr_sdram_mode_6 = 0x00000000
> ddr_sdram_mode_7 = 0x00000000
> ddr_sdram_mode_8 = 0x00000000
> ddr_sdram_interval = 0x00000100
> ddr_data_init = 0xDEADBEEF
> ddr_sdram_clk_cntl = 0x03000000
> ddr_init_addr = 0x00000000
> ddr_init_ext_addr = 0x00000000
> timing_cfg_4 = 0x00220001
> timing_cfg_5 = 0x1C401400
> ddr_zq_cntl = 0x89080600
> ddr_wrlvl_cntl = 0x8675A608
> ddr_sr_cntr = 0x00000000
> ddr_sdram_rcw_1 = 0x00000000
> ddr_sdram_rcw_2 = 0x00000000
> ddr_cdr1 = 0x00000000
> ddr_cdr2 = 0x00000000
> err_disable = 0x00000000
> err_int_en = 0x00000000
> debug_01 = 0x00000000
> debug_02 = 0x00000000
> debug_03 = 0x00000000
> debug_04 = 0x00000000
> debug_05 = 0x00000000
> debug_06 = 0x00000000
> debug_07 = 0x00000000
> debug_08 = 0x00000000
> debug_09 = 0x00000000
> debug_10 = 0x00000000
> debug_11 = 0x00000000
> debug_12 = 0x00000000
> debug_13 = 0x00000000
> debug_14 = 0x00000000
> debug_15 = 0x00000000
> debug_16 = 0x00000000
> debug_17 = 0x00000000
> debug_18 = 0x00000000
> debug_19 = 0x00000000
> debug_20 = 0x00000000
> debug_21 = 0x00000000
> debug_22 = 0x00000000
> debug_23 = 0x00000000
> debug_24 = 0x00000000
> debug_25 = 0x00000000
> debug_26 = 0x00000000
> debug_27 = 0x00000000
> debug_28 = 0x00000000
> debug_29 = 0x00000000
> debug_30 = 0x00000000
> debug_31 = 0x00000000
> debug_32 = 0x00000000
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
York Sun Nov. 11, 2011, 11:02 p.m. UTC | #10
Looking good so far, what's the question? You can always override the
register values and try it since you got the interactive debug up.

York



On Fri, 2011-11-11 at 14:54 -0800, McClintock Matthew-B29882 wrote:
> Adding York who might be able to help more...
> 
> -M
> 
> On Fri, Nov 11, 2011 at 4:18 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > On Fri, Nov 11, 2011 at 09:07:23PM +0000, McClintock Matthew-B29882 wrote:
> >> On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> >> > Thanks. That config_sram.dat is exactly what I came up with.
> >> >
> >> > I have my board booting via L2SRAM, but the DDR doesn't get configured
> >> > correctly yet. I'm trying to figure out how the DDR SPD stuff works in
> >> > U-Boot. I've never used it before. I'm following the P2020DS code as an
> >> > example, but I haven't yet figured out how the code in
> >> > board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
> >> > structure especially).
> >>
> >> If you board has i2c to the ddr modules it should be able to use the
> >> timing info from there. I think CONFIG_DDR_SPD is the config option
> >> you are looking for. I know the P2020DS does SPD from L2SRAM.
> >>
> >
> > The only thing that looks like an SPD chip is at i2c bus 1, address
> > 0x53. I setup my board configuration with:
> >
> > #define CONFIG_FSL_DDR3
> > #define CONFIG_FSL_DDR_INTERACTIVE
> > #define CONFIG_CHIP_SELECTS_PER_CTRL    2
> > #define CONFIG_SYS_DDR_SBE              0x00010000
> >
> > #define CONFIG_DDR_SPD
> > #define CONFIG_SYS_SPD_BUS_NUM          1
> > #define SPD_EEPROM_ADDRESS              0x53
> >
> > Some of the settings the SPD code computes are correct, and some are
> > completely wrong. I can't figure out how to make this work.
> >
> > Here is the raw SPD dumped from a working U-Boot:
> >
> > 0000: 92 10 0b 08 02 11 00 09 0b 52 01 08 0c 00 3e 00    .........R....>.
> > 0010: 69 78 69 30 69 11 20 89 70 03 3c 3c 00 f0 83 05    ixi0i. .p.<<....
> > 0020: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 0030: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 1f 00    ................
> > 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 0070: 00 00 00 00 00 01 94 01 10 25 03 ae 48 48 e3 e3    .........%..HH..
> > 0080: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32    SG572568EMR069S2
> > 0090: 53 46 00 00 80 ce 53 4d 41 52 54 4d 6f 64 75 6c    SF....SMARTModul
> > 00a0: 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    arTechnologies..
> > 00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > 00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> >
> > And here is the output of an interactive FSL DDR run:
> >
> > U-Boot 2011.09-00929-g3b5f71c-dirty (Nov 11 2011 - 13:31:13)
> >
> > CPU0:  P2020E, Version: 2.0, (0x80ea0020)
> > Core:  E500, Version: 5.0, (0x80211050)
> > Clock Configuration:
> >       CPU0:1200 MHz, CPU1:1200 MHz,
> >       CCB:600  MHz,
> >       DDR:333.333 MHz (666.667 MT/s data rate) (Asynchronous), LBC:37.500 MHz
> > L1:    D-cache 32 kB enabled
> >       I-cache 32 kB enabled
> > Board: Freescale COM Express P2020
> > I2C:   ready
> > SPI:   ready
> > DRAM:  FSL DDR>
> > FSL DDR>
> > FSL DDR>compute
> > unknown module_type 0x08
> > Detected UDIMM SG572568EMR069S2SF
> > The choosen cas latency 16 is too large
> > FSL DDR>print c0 d0
> > SPD info:  Controller=0 DIMM=0
> > 0      : 92 info_size_crc  bytes written into serial memory, CRC coverage
> > 1      : 10 spd_rev        SPD Revision
> > 2      : 0b mem_type       Key Byte / DRAM Device Type
> > 3      : 08 module_type    Key Byte / Module Type
> > 4      : 02 density_banks  SDRAM Density and Banks
> > 5      : 11 addressing     SDRAM Addressing
> > 6      : 00 module_vdd     Module Nominal Voltage, VDD
> > 7      : 09 organization   Module Organization
> > 8      : 0b bus_width      Module Memory Bus Width
> > 9      : 52 ftb_div        Fine Timebase (FTB) Dividend / Divisor
> > 10     : 01 mtb_dividend   Medium Timebase (MTB) Dividend
> > 11     : 08 mtb_divisor    Medium Timebase (MTB) Divisor
> > 12     : 0c tCK_min        SDRAM Minimum Cycle Time
> > 13     : 00 res_13         Reserved
> > 14     : 3e caslat_lsb     CAS Latencies Supported, LSB
> > 15     : 00 caslat_msb     CAS Latencies Supported, MSB
> > 16     : 69 tAA_min        Min CAS Latency Time
> > 17     : 78 tWR_min        Min Write REcovery Time
> > 18     : 69 tRCD_min       Min RAS# to CAS# Delay Time
> > 19     : 30 tRRD_min       Min Row Active to Row Active Delay Time
> > 20     : 69 tRP_min        Min Row Precharge Delay Time
> > 21     : 11 tRAS_tRC_ext   Upper Nibbles for tRAS and tRC
> > 22     : 20 tRAS_min_lsb   Min Active to Precharge Delay Time, LSB
> > 23     : 89 tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB
> > 24     : 70 tRFC_min_lsb   Min Refresh Recovery Delay Time LSB
> > 25     : 03 tRFC_min_msb   Min Refresh Recovery Delay Time MSB
> > 26     : 3c tWTR_min       Min Internal Write to Read Command Delay Time
> > 27     : 3c tRTP_min Min Internal Read to Precharge Command Delay Time
> > 28     : 00 tFAW_msb       Upper Nibble for tFAW
> > 29     : f0 tFAW_min       Min Four Activate Window Delay Time
> > 30     : 83 opt_features   SDRAM Optional Features
> > 31     : 05 therm_ref_opt  SDRAM Thermal and Refresh Opts
> > 32     : 80 therm_sensor  SDRAM Thermal Sensor
> > 33     : 00 device_type  SDRAM Device Type
> > 34 - 59: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> > 60 -116: 0f111f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117    : 01 Module MfgID Code LSB - JEP-106
> > 118    : 94 Module MfgID Code MSB - JEP-106
> > 119    : 01 Mfg Location
> > 120-121: 10 25 Mfg Date
> > 122-125: 03 ae 48 48    Module Serial Number
> > 126-127: e3 e3   SPD CRC
> > 128-145: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32 53 46    Mfg's Module Part Number
> > 146-147: 00 00 Module Revision code
> > 148    : 80 DRAM MfgID Code LSB - JEP-106
> > 149    : ce DRAM MfgID Code MSB - JEP-106
> > 150-175: 53 4d 41 52 54 4d 6f 64 75 6c 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    Mfg's Specific Data
> > 176-255: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   Mfg's Specific Data
> >
> >
> >
> > DIMM parameters:  Controller=0 DIMM=0
> > DIMM organization parameters:
> > module part name = SG572568EMR069S2SF
> > rank_density = 1073741824 bytes (1024 megabytes)
> > capacity = 2147483648 bytes (2048 megabytes)
> > burst_lengths_bitmask = 00
> > base_addresss = 0 (00000000 00000000)
> > n_ranks = 2
> > data_width = 72
> > primary_sdram_width = 64
> > ec_sdram_width = 8
> > registered_dimm = 0
> > n_row_addr = 0
> > n_col_addr = 0
> > edc_config = 0
> > n_banks_per_sdram_device = 0
> > tCKmin_X_ps = 0
> > tCKmin_X_minus_1_ps = 0
> > tCKmin_X_minus_2_ps = 0
> > tCKmax_ps = 0
> > caslat_X = 0
> > tAA_ps = 0
> > caslat_X_minus_1 = 0
> > caslat_X_minus_2 = 0
> > caslat_lowest_derated = 0
> > tRCD_ps = 0
> > tRP_ps = 0
> > tRAS_ps = 0
> > tWR_ps = 0
> > tWTR_ps = 0
> > tRFC_ps = 0
> > tRRD_ps = 0
> > tRC_ps = 0
> > refresh_rate_ps = 0
> > tIS_ps = 0
> > tIH_ps = 0
> > tDS_ps = 0
> > tDH_ps = 0
> > tRTP_ps = 0
> > tDQSQ_max_ps = 0
> > tQHS_ps = 0
> >
> >
> >
> > "lowest common" DIMM parameters:  Controller=0
> > tCKmin_X_ps = 0 (4294967295 MHz)
> > tCKmax_ps = 0 (4294967295 MHz)
> > all_DIMMs_burst_lengths_bitmask = 00
> > tCKmax_max_ps = 0
> > tRCD_ps = 0
> > tRP_ps = 0
> > tRAS_ps = 0
> > tWR_ps = 0
> > tWTR_ps = 0
> > tRFC_ps = 0
> > tRRD_ps = 0
> > tRC_ps = 0
> > refresh_rate_ps = 0
> > tIS_ps = 0
> > tDS_ps = 0
> > tDH_ps = 0
> > tRTP_ps = 0
> > tDQSQ_max_ps = 0
> > tQHS_ps = 0
> > lowest_common_SPD_caslat = 0
> > highest_common_derated_caslat = 0
> > additive_latency = 0
> > ndimms_present = 1
> > all_DIMMs_registered = 0
> > all_DIMMs_unbuffered = 1
> > all_DIMMs_ECC_capable = 0
> > total_mem = 2147483648 (2048 megabytes)
> > base_address = 0 (0 megabytes)
> >
> >
> > User Config Options: Controller=0
> > cs0_odt_rd_cfg = 0
> > cs0_odt_wr_cfg = 1
> > cs1_odt_rd_cfg = 0
> > cs1_odt_wr_cfg = 1
> > cs0_odt_rtt_norm = 3
> > cs0_odt_rtt_wr = 0
> > cs1_odt_rtt_norm = 0
> > cs1_odt_rtt_wr = 0
> > memctl_interleaving = 0
> > memctl_interleaving_mode = 0
> > ba_intlv_ctl = 0x00000040
> > ECC_mode = 0
> > ECC_init_using_memctl = 1
> > DQS_config = 1
> > self_refresh_in_sleep = 1
> > dynamic_power = 0
> > data_bus_width = 0
> > burst_length = 6
> > cas_latency_override = 0
> > cas_latency_override_value = 3
> > use_derated_caslat = 0
> > additive_latency_override = 0
> > additive_latency_override_value = 3
> > clk_adjust = 6
> > cpo_override = 31
> > write_data_delay = 4
> > half_strength_driver_enable = 0
> > twoT_en = 0
> > threeT_en = 0
> > registered_dimm_en = 0
> > ap_en = 1
> > bstopre = 256
> > wrlvl_override = 1
> > wrlvl_sample = 10
> > wrlvl_start = 8
> > rcw_override = 0
> > rcw_1 = 0
> > rcw_2 = 0
> > tCKE_clock_pulse_width_ps = 9000
> > tFAW_window_four_activates_ps = 0
> > trwt_override = 0
> > trwt = 0
> >
> >
> > Address Assignment: Controller=0 DIMM=0
> > Don't have this functionality yet
> >
> >
> > Computed Register Values: Controller=0
> > cs0_bnds = 0x0000007F
> > cs0_config = 0x80014400
> > cs0_config_2 = 0x00000000
> > cs1_bnds = 0x00000000
> > cs1_config = 0x80014400
> > cs1_config_2 = 0x00000000
> > timing_cfg_3 = 0x000F0000
> > timing_cfg_0 = 0x40110104
> > timing_cfg_1 = 0x000F8246
> > timing_cfg_2 = 0x0FA8D0C0
> > ddr_sdram_cfg = 0xC7004000
> > ddr_sdram_cfg_2 = 0x24401040
> > ddr_sdram_mode = 0x00401021
> > ddr_sdram_mode_2 = 0x00000000
> > ddr_sdram_mode_3 = 0x00000000
> > ddr_sdram_mode_4 = 0x00000000
> > ddr_sdram_mode_5 = 0x00000000
> > ddr_sdram_mode_6 = 0x00000000
> > ddr_sdram_mode_7 = 0x00000000
> > ddr_sdram_mode_8 = 0x00000000
> > ddr_sdram_interval = 0x00000100
> > ddr_data_init = 0xDEADBEEF
> > ddr_sdram_clk_cntl = 0x03000000
> > ddr_init_addr = 0x00000000
> > ddr_init_ext_addr = 0x00000000
> > timing_cfg_4 = 0x00220001
> > timing_cfg_5 = 0x1C401400
> > ddr_zq_cntl = 0x89080600
> > ddr_wrlvl_cntl = 0x8675A608
> > ddr_sr_cntr = 0x00000000
> > ddr_sdram_rcw_1 = 0x00000000
> > ddr_sdram_rcw_2 = 0x00000000
> > ddr_cdr1 = 0x00000000
> > ddr_cdr2 = 0x00000000
> > err_disable = 0x00000000
> > err_int_en = 0x00000000
> > debug_01 = 0x00000000
> > debug_02 = 0x00000000
> > debug_03 = 0x00000000
> > debug_04 = 0x00000000
> > debug_05 = 0x00000000
> > debug_06 = 0x00000000
> > debug_07 = 0x00000000
> > debug_08 = 0x00000000
> > debug_09 = 0x00000000
> > debug_10 = 0x00000000
> > debug_11 = 0x00000000
> > debug_12 = 0x00000000
> > debug_13 = 0x00000000
> > debug_14 = 0x00000000
> > debug_15 = 0x00000000
> > debug_16 = 0x00000000
> > debug_17 = 0x00000000
> > debug_18 = 0x00000000
> > debug_19 = 0x00000000
> > debug_20 = 0x00000000
> > debug_21 = 0x00000000
> > debug_22 = 0x00000000
> > debug_23 = 0x00000000
> > debug_24 = 0x00000000
> > debug_25 = 0x00000000
> > debug_26 = 0x00000000
> > debug_27 = 0x00000000
> > debug_28 = 0x00000000
> > debug_29 = 0x00000000
> > debug_30 = 0x00000000
> > debug_31 = 0x00000000
> > debug_32 = 0x00000000
> >
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > http://lists.denx.de/mailman/listinfo/u-boot
> >
Ira Snyder Nov. 11, 2011, 11:10 p.m. UTC | #11
On Fri, Nov 11, 2011 at 03:02:46PM -0800, York Sun wrote:
> Looking good so far, what's the question? You can always override the
> register values and try it since you got the interactive debug up.
> 

Well, it doesn't work out of the box.

I'm very worried about the following messages:
> unknown module_type 0x08
> Detected UDIMM SG572568EMR069S2SF
> The choosen cas latency 16 is too large

I copied the settings from the configuration for the On-Chip ROM's RAM
setup. I issued the following in the interactive DDR setup:

FSL-DDR> compute
FSL-DDR> edit c0 d0 regs ddr_sdram_cfg e7000008
... lots more ...
FSL-DDR> go

That didn't work. Maybe I did something wrong? I'll try again.

Ira

> York
> 
> 
> 
> On Fri, 2011-11-11 at 14:54 -0800, McClintock Matthew-B29882 wrote:
> > Adding York who might be able to help more...
> > 
> > -M
> > 
> > On Fri, Nov 11, 2011 at 4:18 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > > On Fri, Nov 11, 2011 at 09:07:23PM +0000, McClintock Matthew-B29882 wrote:
> > >> On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > >> > Thanks. That config_sram.dat is exactly what I came up with.
> > >> >
> > >> > I have my board booting via L2SRAM, but the DDR doesn't get configured
> > >> > correctly yet. I'm trying to figure out how the DDR SPD stuff works in
> > >> > U-Boot. I've never used it before. I'm following the P2020DS code as an
> > >> > example, but I haven't yet figured out how the code in
> > >> > board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
> > >> > structure especially).
> > >>
> > >> If you board has i2c to the ddr modules it should be able to use the
> > >> timing info from there. I think CONFIG_DDR_SPD is the config option
> > >> you are looking for. I know the P2020DS does SPD from L2SRAM.
> > >>
> > >
> > > The only thing that looks like an SPD chip is at i2c bus 1, address
> > > 0x53. I setup my board configuration with:
> > >
> > > #define CONFIG_FSL_DDR3
> > > #define CONFIG_FSL_DDR_INTERACTIVE
> > > #define CONFIG_CHIP_SELECTS_PER_CTRL    2
> > > #define CONFIG_SYS_DDR_SBE              0x00010000
> > >
> > > #define CONFIG_DDR_SPD
> > > #define CONFIG_SYS_SPD_BUS_NUM          1
> > > #define SPD_EEPROM_ADDRESS              0x53
> > >
> > > Some of the settings the SPD code computes are correct, and some are
> > > completely wrong. I can't figure out how to make this work.
> > >
> > > Here is the raw SPD dumped from a working U-Boot:
> > >
> > > 0000: 92 10 0b 08 02 11 00 09 0b 52 01 08 0c 00 3e 00    .........R....>.
> > > 0010: 69 78 69 30 69 11 20 89 70 03 3c 3c 00 f0 83 05    ixi0i. .p.<<....
> > > 0020: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 0030: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 1f 00    ................
> > > 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 0070: 00 00 00 00 00 01 94 01 10 25 03 ae 48 48 e3 e3    .........%..HH..
> > > 0080: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32    SG572568EMR069S2
> > > 0090: 53 46 00 00 80 ce 53 4d 41 52 54 4d 6f 64 75 6c    SF....SMARTModul
> > > 00a0: 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    arTechnologies..
> > > 00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > 00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > >
> > > And here is the output of an interactive FSL DDR run:
> > >
> > > U-Boot 2011.09-00929-g3b5f71c-dirty (Nov 11 2011 - 13:31:13)
> > >
> > > CPU0:  P2020E, Version: 2.0, (0x80ea0020)
> > > Core:  E500, Version: 5.0, (0x80211050)
> > > Clock Configuration:
> > >       CPU0:1200 MHz, CPU1:1200 MHz,
> > >       CCB:600  MHz,
> > >       DDR:333.333 MHz (666.667 MT/s data rate) (Asynchronous), LBC:37.500 MHz
> > > L1:    D-cache 32 kB enabled
> > >       I-cache 32 kB enabled
> > > Board: Freescale COM Express P2020
> > > I2C:   ready
> > > SPI:   ready
> > > DRAM:  FSL DDR>
> > > FSL DDR>
> > > FSL DDR>compute
> > > unknown module_type 0x08
> > > Detected UDIMM SG572568EMR069S2SF
> > > The choosen cas latency 16 is too large
> > > FSL DDR>print c0 d0
> > > SPD info:  Controller=0 DIMM=0
> > > 0      : 92 info_size_crc  bytes written into serial memory, CRC coverage
> > > 1      : 10 spd_rev        SPD Revision
> > > 2      : 0b mem_type       Key Byte / DRAM Device Type
> > > 3      : 08 module_type    Key Byte / Module Type
> > > 4      : 02 density_banks  SDRAM Density and Banks
> > > 5      : 11 addressing     SDRAM Addressing
> > > 6      : 00 module_vdd     Module Nominal Voltage, VDD
> > > 7      : 09 organization   Module Organization
> > > 8      : 0b bus_width      Module Memory Bus Width
> > > 9      : 52 ftb_div        Fine Timebase (FTB) Dividend / Divisor
> > > 10     : 01 mtb_dividend   Medium Timebase (MTB) Dividend
> > > 11     : 08 mtb_divisor    Medium Timebase (MTB) Divisor
> > > 12     : 0c tCK_min        SDRAM Minimum Cycle Time
> > > 13     : 00 res_13         Reserved
> > > 14     : 3e caslat_lsb     CAS Latencies Supported, LSB
> > > 15     : 00 caslat_msb     CAS Latencies Supported, MSB
> > > 16     : 69 tAA_min        Min CAS Latency Time
> > > 17     : 78 tWR_min        Min Write REcovery Time
> > > 18     : 69 tRCD_min       Min RAS# to CAS# Delay Time
> > > 19     : 30 tRRD_min       Min Row Active to Row Active Delay Time
> > > 20     : 69 tRP_min        Min Row Precharge Delay Time
> > > 21     : 11 tRAS_tRC_ext   Upper Nibbles for tRAS and tRC
> > > 22     : 20 tRAS_min_lsb   Min Active to Precharge Delay Time, LSB
> > > 23     : 89 tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB
> > > 24     : 70 tRFC_min_lsb   Min Refresh Recovery Delay Time LSB
> > > 25     : 03 tRFC_min_msb   Min Refresh Recovery Delay Time MSB
> > > 26     : 3c tWTR_min       Min Internal Write to Read Command Delay Time
> > > 27     : 3c tRTP_min Min Internal Read to Precharge Command Delay Time
> > > 28     : 00 tFAW_msb       Upper Nibble for tFAW
> > > 29     : f0 tFAW_min       Min Four Activate Window Delay Time
> > > 30     : 83 opt_features   SDRAM Optional Features
> > > 31     : 05 therm_ref_opt  SDRAM Thermal and Refresh Opts
> > > 32     : 80 therm_sensor  SDRAM Thermal Sensor
> > > 33     : 00 device_type  SDRAM Device Type
> > > 34 - 59: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> > > 60 -116: 0f111f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117    : 01 Module MfgID Code LSB - JEP-106
> > > 118    : 94 Module MfgID Code MSB - JEP-106
> > > 119    : 01 Mfg Location
> > > 120-121: 10 25 Mfg Date
> > > 122-125: 03 ae 48 48    Module Serial Number
> > > 126-127: e3 e3   SPD CRC
> > > 128-145: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32 53 46    Mfg's Module Part Number
> > > 146-147: 00 00 Module Revision code
> > > 148    : 80 DRAM MfgID Code LSB - JEP-106
> > > 149    : ce DRAM MfgID Code MSB - JEP-106
> > > 150-175: 53 4d 41 52 54 4d 6f 64 75 6c 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    Mfg's Specific Data
> > > 176-255: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   Mfg's Specific Data
> > >
> > >
> > >
> > > DIMM parameters:  Controller=0 DIMM=0
> > > DIMM organization parameters:
> > > module part name = SG572568EMR069S2SF
> > > rank_density = 1073741824 bytes (1024 megabytes)
> > > capacity = 2147483648 bytes (2048 megabytes)
> > > burst_lengths_bitmask = 00
> > > base_addresss = 0 (00000000 00000000)
> > > n_ranks = 2
> > > data_width = 72
> > > primary_sdram_width = 64
> > > ec_sdram_width = 8
> > > registered_dimm = 0
> > > n_row_addr = 0
> > > n_col_addr = 0
> > > edc_config = 0
> > > n_banks_per_sdram_device = 0
> > > tCKmin_X_ps = 0
> > > tCKmin_X_minus_1_ps = 0
> > > tCKmin_X_minus_2_ps = 0
> > > tCKmax_ps = 0
> > > caslat_X = 0
> > > tAA_ps = 0
> > > caslat_X_minus_1 = 0
> > > caslat_X_minus_2 = 0
> > > caslat_lowest_derated = 0
> > > tRCD_ps = 0
> > > tRP_ps = 0
> > > tRAS_ps = 0
> > > tWR_ps = 0
> > > tWTR_ps = 0
> > > tRFC_ps = 0
> > > tRRD_ps = 0
> > > tRC_ps = 0
> > > refresh_rate_ps = 0
> > > tIS_ps = 0
> > > tIH_ps = 0
> > > tDS_ps = 0
> > > tDH_ps = 0
> > > tRTP_ps = 0
> > > tDQSQ_max_ps = 0
> > > tQHS_ps = 0
> > >
> > >
> > >
> > > "lowest common" DIMM parameters:  Controller=0
> > > tCKmin_X_ps = 0 (4294967295 MHz)
> > > tCKmax_ps = 0 (4294967295 MHz)
> > > all_DIMMs_burst_lengths_bitmask = 00
> > > tCKmax_max_ps = 0
> > > tRCD_ps = 0
> > > tRP_ps = 0
> > > tRAS_ps = 0
> > > tWR_ps = 0
> > > tWTR_ps = 0
> > > tRFC_ps = 0
> > > tRRD_ps = 0
> > > tRC_ps = 0
> > > refresh_rate_ps = 0
> > > tIS_ps = 0
> > > tDS_ps = 0
> > > tDH_ps = 0
> > > tRTP_ps = 0
> > > tDQSQ_max_ps = 0
> > > tQHS_ps = 0
> > > lowest_common_SPD_caslat = 0
> > > highest_common_derated_caslat = 0
> > > additive_latency = 0
> > > ndimms_present = 1
> > > all_DIMMs_registered = 0
> > > all_DIMMs_unbuffered = 1
> > > all_DIMMs_ECC_capable = 0
> > > total_mem = 2147483648 (2048 megabytes)
> > > base_address = 0 (0 megabytes)
> > >
> > >
> > > User Config Options: Controller=0
> > > cs0_odt_rd_cfg = 0
> > > cs0_odt_wr_cfg = 1
> > > cs1_odt_rd_cfg = 0
> > > cs1_odt_wr_cfg = 1
> > > cs0_odt_rtt_norm = 3
> > > cs0_odt_rtt_wr = 0
> > > cs1_odt_rtt_norm = 0
> > > cs1_odt_rtt_wr = 0
> > > memctl_interleaving = 0
> > > memctl_interleaving_mode = 0
> > > ba_intlv_ctl = 0x00000040
> > > ECC_mode = 0
> > > ECC_init_using_memctl = 1
> > > DQS_config = 1
> > > self_refresh_in_sleep = 1
> > > dynamic_power = 0
> > > data_bus_width = 0
> > > burst_length = 6
> > > cas_latency_override = 0
> > > cas_latency_override_value = 3
> > > use_derated_caslat = 0
> > > additive_latency_override = 0
> > > additive_latency_override_value = 3
> > > clk_adjust = 6
> > > cpo_override = 31
> > > write_data_delay = 4
> > > half_strength_driver_enable = 0
> > > twoT_en = 0
> > > threeT_en = 0
> > > registered_dimm_en = 0
> > > ap_en = 1
> > > bstopre = 256
> > > wrlvl_override = 1
> > > wrlvl_sample = 10
> > > wrlvl_start = 8
> > > rcw_override = 0
> > > rcw_1 = 0
> > > rcw_2 = 0
> > > tCKE_clock_pulse_width_ps = 9000
> > > tFAW_window_four_activates_ps = 0
> > > trwt_override = 0
> > > trwt = 0
> > >
> > >
> > > Address Assignment: Controller=0 DIMM=0
> > > Don't have this functionality yet
> > >
> > >
> > > Computed Register Values: Controller=0
> > > cs0_bnds = 0x0000007F
> > > cs0_config = 0x80014400
> > > cs0_config_2 = 0x00000000
> > > cs1_bnds = 0x00000000
> > > cs1_config = 0x80014400
> > > cs1_config_2 = 0x00000000
> > > timing_cfg_3 = 0x000F0000
> > > timing_cfg_0 = 0x40110104
> > > timing_cfg_1 = 0x000F8246
> > > timing_cfg_2 = 0x0FA8D0C0
> > > ddr_sdram_cfg = 0xC7004000
> > > ddr_sdram_cfg_2 = 0x24401040
> > > ddr_sdram_mode = 0x00401021
> > > ddr_sdram_mode_2 = 0x00000000
> > > ddr_sdram_mode_3 = 0x00000000
> > > ddr_sdram_mode_4 = 0x00000000
> > > ddr_sdram_mode_5 = 0x00000000
> > > ddr_sdram_mode_6 = 0x00000000
> > > ddr_sdram_mode_7 = 0x00000000
> > > ddr_sdram_mode_8 = 0x00000000
> > > ddr_sdram_interval = 0x00000100
> > > ddr_data_init = 0xDEADBEEF
> > > ddr_sdram_clk_cntl = 0x03000000
> > > ddr_init_addr = 0x00000000
> > > ddr_init_ext_addr = 0x00000000
> > > timing_cfg_4 = 0x00220001
> > > timing_cfg_5 = 0x1C401400
> > > ddr_zq_cntl = 0x89080600
> > > ddr_wrlvl_cntl = 0x8675A608
> > > ddr_sr_cntr = 0x00000000
> > > ddr_sdram_rcw_1 = 0x00000000
> > > ddr_sdram_rcw_2 = 0x00000000
> > > ddr_cdr1 = 0x00000000
> > > ddr_cdr2 = 0x00000000
> > > err_disable = 0x00000000
> > > err_int_en = 0x00000000
> > > debug_01 = 0x00000000
> > > debug_02 = 0x00000000
> > > debug_03 = 0x00000000
> > > debug_04 = 0x00000000
> > > debug_05 = 0x00000000
> > > debug_06 = 0x00000000
> > > debug_07 = 0x00000000
> > > debug_08 = 0x00000000
> > > debug_09 = 0x00000000
> > > debug_10 = 0x00000000
> > > debug_11 = 0x00000000
> > > debug_12 = 0x00000000
> > > debug_13 = 0x00000000
> > > debug_14 = 0x00000000
> > > debug_15 = 0x00000000
> > > debug_16 = 0x00000000
> > > debug_17 = 0x00000000
> > > debug_18 = 0x00000000
> > > debug_19 = 0x00000000
> > > debug_20 = 0x00000000
> > > debug_21 = 0x00000000
> > > debug_22 = 0x00000000
> > > debug_23 = 0x00000000
> > > debug_24 = 0x00000000
> > > debug_25 = 0x00000000
> > > debug_26 = 0x00000000
> > > debug_27 = 0x00000000
> > > debug_28 = 0x00000000
> > > debug_29 = 0x00000000
> > > debug_30 = 0x00000000
> > > debug_31 = 0x00000000
> > > debug_32 = 0x00000000
> > >
> > > _______________________________________________
> > > U-Boot mailing list
> > > U-Boot@lists.denx.de
> > > http://lists.denx.de/mailman/listinfo/u-boot
> > >
> 
> 
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Ira Snyder Nov. 11, 2011, 11:33 p.m. UTC | #12
On Fri, Nov 11, 2011 at 03:10:43PM -0800, Ira W. Snyder wrote:
> On Fri, Nov 11, 2011 at 03:02:46PM -0800, York Sun wrote:
> > Looking good so far, what's the question? You can always override the
> > register values and try it since you got the interactive debug up.
> > 
> 
> Well, it doesn't work out of the box.
> 
> I'm very worried about the following messages:
> > unknown module_type 0x08
> > Detected UDIMM SG572568EMR069S2SF
> > The choosen cas latency 16 is too large
> 
> I copied the settings from the configuration for the On-Chip ROM's RAM
> setup. I issued the following in the interactive DDR setup:
> 
> FSL-DDR> compute
> FSL-DDR> edit c0 d0 regs ddr_sdram_cfg e7000008
> ... lots more ...
> FSL-DDR> go
> 
> That didn't work. Maybe I did something wrong? I'll try again.

I tried again. It turns out "edit" values have to be prefixed by "0x"
for hex values (unlike the rest of U-Boot).

The commands I used. You can double check that they match the
config_sram_blackadder2020.dat posted earlier in this thread.

edit c0 d0 regs ddr_sdram_cfg		0x67000008
edit c0 d0 regs cs0_bnds		0x0000003f
edit c0 d0 regs cs1_bnds		0x0040007f
edit c0 d0 regs cs0_config		0x80014202
edit c0 d0 regs cs1_config		0x80014202
edit c0 d0 regs timing_cfg_0		0x00330804
edit c0 d0 regs timing_cfg_1		0x6f6b4644
edit c0 d0 regs timing_cfg_2		0x0fa890d0
edit c0 d0 regs timing_cfg_3		0x00020000
edit c0 d0 regs ddr_sdram_cfg_2		0x24400010
edit c0 d0 regs ddr_sdram_mode		0x00401422
edit c0 d0 regs ddr_sdram_interval	0x61800100
edit c0 d0 regs ddr_data_init		0xdeadbeef
edit c0 d0 regs ddr_sdram_clk_cntl	0x02800000
edit c0 d0 regs timing_cfg_4		0x00220001
edit c0 d0 regs timing_cfg_5		0x03402400
edit c0 d0 regs ddr_zq_cntl		0x89080600
edit c0 d0 regs ddr_wrlvl_cntl		0x8655a608
edit c0 d0 regs err_int_en		0x0000000d
edit c0 d0 regs ddr_cdr1		0x000c0000
edit c0 d0 regs ddr_cdr2		0x00000000
edit c0 d0 regs ddr_sdram_cfg		0xe7000008
go

I get this message:
2 GiB (DDR2, 64-bit, CL=0.5, ECC off)

Basically completely wrong. It should be DDR3, CL=6, ECC on. That's what
happened before I tried to use the SPD.

I could use some pointers on how to debug this.

Ira

> > On Fri, 2011-11-11 at 14:54 -0800, McClintock Matthew-B29882 wrote:
> > > Adding York who might be able to help more...
> > > 
> > > -M
> > > 
> > > On Fri, Nov 11, 2011 at 4:18 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > > > On Fri, Nov 11, 2011 at 09:07:23PM +0000, McClintock Matthew-B29882 wrote:
> > > >> On Fri, Nov 11, 2011 at 3:03 PM, Ira W. Snyder <iws@ovro.caltech.edu> wrote:
> > > >> > Thanks. That config_sram.dat is exactly what I came up with.
> > > >> >
> > > >> > I have my board booting via L2SRAM, but the DDR doesn't get configured
> > > >> > correctly yet. I'm trying to figure out how the DDR SPD stuff works in
> > > >> > U-Boot. I've never used it before. I'm following the P2020DS code as an
> > > >> > example, but I haven't yet figured out how the code in
> > > >> > board/freescale/p2020ds/ddr.c was derived (the board_specific_parameters
> > > >> > structure especially).
> > > >>
> > > >> If you board has i2c to the ddr modules it should be able to use the
> > > >> timing info from there. I think CONFIG_DDR_SPD is the config option
> > > >> you are looking for. I know the P2020DS does SPD from L2SRAM.
> > > >>
> > > >
> > > > The only thing that looks like an SPD chip is at i2c bus 1, address
> > > > 0x53. I setup my board configuration with:
> > > >
> > > > #define CONFIG_FSL_DDR3
> > > > #define CONFIG_FSL_DDR_INTERACTIVE
> > > > #define CONFIG_CHIP_SELECTS_PER_CTRL    2
> > > > #define CONFIG_SYS_DDR_SBE              0x00010000
> > > >
> > > > #define CONFIG_DDR_SPD
> > > > #define CONFIG_SYS_SPD_BUS_NUM          1
> > > > #define SPD_EEPROM_ADDRESS              0x53
> > > >
> > > > Some of the settings the SPD code computes are correct, and some are
> > > > completely wrong. I can't figure out how to make this work.
> > > >
> > > > Here is the raw SPD dumped from a working U-Boot:
> > > >
> > > > 0000: 92 10 0b 08 02 11 00 09 0b 52 01 08 0c 00 3e 00    .........R....>.
> > > > 0010: 69 78 69 30 69 11 20 89 70 03 3c 3c 00 f0 83 05    ixi0i. .p.<<....
> > > > 0020: 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 0030: 00 00 00 00 00 00 00 00 00 00 00 00 0f 11 1f 00    ................
> > > > 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 0070: 00 00 00 00 00 01 94 01 10 25 03 ae 48 48 e3 e3    .........%..HH..
> > > > 0080: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32    SG572568EMR069S2
> > > > 0090: 53 46 00 00 80 ce 53 4d 41 52 54 4d 6f 64 75 6c    SF....SMARTModul
> > > > 00a0: 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    arTechnologies..
> > > > 00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > > 00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
> > > >
> > > > And here is the output of an interactive FSL DDR run:
> > > >
> > > > U-Boot 2011.09-00929-g3b5f71c-dirty (Nov 11 2011 - 13:31:13)
> > > >
> > > > CPU0:  P2020E, Version: 2.0, (0x80ea0020)
> > > > Core:  E500, Version: 5.0, (0x80211050)
> > > > Clock Configuration:
> > > >       CPU0:1200 MHz, CPU1:1200 MHz,
> > > >       CCB:600  MHz,
> > > >       DDR:333.333 MHz (666.667 MT/s data rate) (Asynchronous), LBC:37.500 MHz
> > > > L1:    D-cache 32 kB enabled
> > > >       I-cache 32 kB enabled
> > > > Board: Freescale COM Express P2020
> > > > I2C:   ready
> > > > SPI:   ready
> > > > DRAM:  FSL DDR>
> > > > FSL DDR>
> > > > FSL DDR>compute
> > > > unknown module_type 0x08
> > > > Detected UDIMM SG572568EMR069S2SF
> > > > The choosen cas latency 16 is too large
> > > > FSL DDR>print c0 d0
> > > > SPD info:  Controller=0 DIMM=0
> > > > 0      : 92 info_size_crc  bytes written into serial memory, CRC coverage
> > > > 1      : 10 spd_rev        SPD Revision
> > > > 2      : 0b mem_type       Key Byte / DRAM Device Type
> > > > 3      : 08 module_type    Key Byte / Module Type
> > > > 4      : 02 density_banks  SDRAM Density and Banks
> > > > 5      : 11 addressing     SDRAM Addressing
> > > > 6      : 00 module_vdd     Module Nominal Voltage, VDD
> > > > 7      : 09 organization   Module Organization
> > > > 8      : 0b bus_width      Module Memory Bus Width
> > > > 9      : 52 ftb_div        Fine Timebase (FTB) Dividend / Divisor
> > > > 10     : 01 mtb_dividend   Medium Timebase (MTB) Dividend
> > > > 11     : 08 mtb_divisor    Medium Timebase (MTB) Divisor
> > > > 12     : 0c tCK_min        SDRAM Minimum Cycle Time
> > > > 13     : 00 res_13         Reserved
> > > > 14     : 3e caslat_lsb     CAS Latencies Supported, LSB
> > > > 15     : 00 caslat_msb     CAS Latencies Supported, MSB
> > > > 16     : 69 tAA_min        Min CAS Latency Time
> > > > 17     : 78 tWR_min        Min Write REcovery Time
> > > > 18     : 69 tRCD_min       Min RAS# to CAS# Delay Time
> > > > 19     : 30 tRRD_min       Min Row Active to Row Active Delay Time
> > > > 20     : 69 tRP_min        Min Row Precharge Delay Time
> > > > 21     : 11 tRAS_tRC_ext   Upper Nibbles for tRAS and tRC
> > > > 22     : 20 tRAS_min_lsb   Min Active to Precharge Delay Time, LSB
> > > > 23     : 89 tRC_min_lsb    Min Active to Active/Refresh Delay Time, LSB
> > > > 24     : 70 tRFC_min_lsb   Min Refresh Recovery Delay Time LSB
> > > > 25     : 03 tRFC_min_msb   Min Refresh Recovery Delay Time MSB
> > > > 26     : 3c tWTR_min       Min Internal Write to Read Command Delay Time
> > > > 27     : 3c tRTP_min Min Internal Read to Precharge Command Delay Time
> > > > 28     : 00 tFAW_msb       Upper Nibble for tFAW
> > > > 29     : f0 tFAW_min       Min Four Activate Window Delay Time
> > > > 30     : 83 opt_features   SDRAM Optional Features
> > > > 31     : 05 therm_ref_opt  SDRAM Thermal and Refresh Opts
> > > > 32     : 80 therm_sensor  SDRAM Thermal Sensor
> > > > 33     : 00 device_type  SDRAM Device Type
> > > > 34 - 59: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> > > > 60 -116: 0f111f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000117    : 01 Module MfgID Code LSB - JEP-106
> > > > 118    : 94 Module MfgID Code MSB - JEP-106
> > > > 119    : 01 Mfg Location
> > > > 120-121: 10 25 Mfg Date
> > > > 122-125: 03 ae 48 48    Module Serial Number
> > > > 126-127: e3 e3   SPD CRC
> > > > 128-145: 53 47 35 37 32 35 36 38 45 4d 52 30 36 39 53 32 53 46    Mfg's Module Part Number
> > > > 146-147: 00 00 Module Revision code
> > > > 148    : 80 DRAM MfgID Code LSB - JEP-106
> > > > 149    : ce DRAM MfgID Code MSB - JEP-106
> > > > 150-175: 53 4d 41 52 54 4d 6f 64 75 6c 61 72 54 65 63 68 6e 6f 6c 6f 67 69 65 73 00 00    Mfg's Specific Data
> > > > 176-255: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000   Mfg's Specific Data
> > > >
> > > >
> > > >
> > > > DIMM parameters:  Controller=0 DIMM=0
> > > > DIMM organization parameters:
> > > > module part name = SG572568EMR069S2SF
> > > > rank_density = 1073741824 bytes (1024 megabytes)
> > > > capacity = 2147483648 bytes (2048 megabytes)
> > > > burst_lengths_bitmask = 00
> > > > base_addresss = 0 (00000000 00000000)
> > > > n_ranks = 2
> > > > data_width = 72
> > > > primary_sdram_width = 64
> > > > ec_sdram_width = 8
> > > > registered_dimm = 0
> > > > n_row_addr = 0
> > > > n_col_addr = 0
> > > > edc_config = 0
> > > > n_banks_per_sdram_device = 0
> > > > tCKmin_X_ps = 0
> > > > tCKmin_X_minus_1_ps = 0
> > > > tCKmin_X_minus_2_ps = 0
> > > > tCKmax_ps = 0
> > > > caslat_X = 0
> > > > tAA_ps = 0
> > > > caslat_X_minus_1 = 0
> > > > caslat_X_minus_2 = 0
> > > > caslat_lowest_derated = 0
> > > > tRCD_ps = 0
> > > > tRP_ps = 0
> > > > tRAS_ps = 0
> > > > tWR_ps = 0
> > > > tWTR_ps = 0
> > > > tRFC_ps = 0
> > > > tRRD_ps = 0
> > > > tRC_ps = 0
> > > > refresh_rate_ps = 0
> > > > tIS_ps = 0
> > > > tIH_ps = 0
> > > > tDS_ps = 0
> > > > tDH_ps = 0
> > > > tRTP_ps = 0
> > > > tDQSQ_max_ps = 0
> > > > tQHS_ps = 0
> > > >
> > > >
> > > >
> > > > "lowest common" DIMM parameters:  Controller=0
> > > > tCKmin_X_ps = 0 (4294967295 MHz)
> > > > tCKmax_ps = 0 (4294967295 MHz)
> > > > all_DIMMs_burst_lengths_bitmask = 00
> > > > tCKmax_max_ps = 0
> > > > tRCD_ps = 0
> > > > tRP_ps = 0
> > > > tRAS_ps = 0
> > > > tWR_ps = 0
> > > > tWTR_ps = 0
> > > > tRFC_ps = 0
> > > > tRRD_ps = 0
> > > > tRC_ps = 0
> > > > refresh_rate_ps = 0
> > > > tIS_ps = 0
> > > > tDS_ps = 0
> > > > tDH_ps = 0
> > > > tRTP_ps = 0
> > > > tDQSQ_max_ps = 0
> > > > tQHS_ps = 0
> > > > lowest_common_SPD_caslat = 0
> > > > highest_common_derated_caslat = 0
> > > > additive_latency = 0
> > > > ndimms_present = 1
> > > > all_DIMMs_registered = 0
> > > > all_DIMMs_unbuffered = 1
> > > > all_DIMMs_ECC_capable = 0
> > > > total_mem = 2147483648 (2048 megabytes)
> > > > base_address = 0 (0 megabytes)
> > > >
> > > >
> > > > User Config Options: Controller=0
> > > > cs0_odt_rd_cfg = 0
> > > > cs0_odt_wr_cfg = 1
> > > > cs1_odt_rd_cfg = 0
> > > > cs1_odt_wr_cfg = 1
> > > > cs0_odt_rtt_norm = 3
> > > > cs0_odt_rtt_wr = 0
> > > > cs1_odt_rtt_norm = 0
> > > > cs1_odt_rtt_wr = 0
> > > > memctl_interleaving = 0
> > > > memctl_interleaving_mode = 0
> > > > ba_intlv_ctl = 0x00000040
> > > > ECC_mode = 0
> > > > ECC_init_using_memctl = 1
> > > > DQS_config = 1
> > > > self_refresh_in_sleep = 1
> > > > dynamic_power = 0
> > > > data_bus_width = 0
> > > > burst_length = 6
> > > > cas_latency_override = 0
> > > > cas_latency_override_value = 3
> > > > use_derated_caslat = 0
> > > > additive_latency_override = 0
> > > > additive_latency_override_value = 3
> > > > clk_adjust = 6
> > > > cpo_override = 31
> > > > write_data_delay = 4
> > > > half_strength_driver_enable = 0
> > > > twoT_en = 0
> > > > threeT_en = 0
> > > > registered_dimm_en = 0
> > > > ap_en = 1
> > > > bstopre = 256
> > > > wrlvl_override = 1
> > > > wrlvl_sample = 10
> > > > wrlvl_start = 8
> > > > rcw_override = 0
> > > > rcw_1 = 0
> > > > rcw_2 = 0
> > > > tCKE_clock_pulse_width_ps = 9000
> > > > tFAW_window_four_activates_ps = 0
> > > > trwt_override = 0
> > > > trwt = 0
> > > >
> > > >
> > > > Address Assignment: Controller=0 DIMM=0
> > > > Don't have this functionality yet
> > > >
> > > >
> > > > Computed Register Values: Controller=0
> > > > cs0_bnds = 0x0000007F
> > > > cs0_config = 0x80014400
> > > > cs0_config_2 = 0x00000000
> > > > cs1_bnds = 0x00000000
> > > > cs1_config = 0x80014400
> > > > cs1_config_2 = 0x00000000
> > > > timing_cfg_3 = 0x000F0000
> > > > timing_cfg_0 = 0x40110104
> > > > timing_cfg_1 = 0x000F8246
> > > > timing_cfg_2 = 0x0FA8D0C0
> > > > ddr_sdram_cfg = 0xC7004000
> > > > ddr_sdram_cfg_2 = 0x24401040
> > > > ddr_sdram_mode = 0x00401021
> > > > ddr_sdram_mode_2 = 0x00000000
> > > > ddr_sdram_mode_3 = 0x00000000
> > > > ddr_sdram_mode_4 = 0x00000000
> > > > ddr_sdram_mode_5 = 0x00000000
> > > > ddr_sdram_mode_6 = 0x00000000
> > > > ddr_sdram_mode_7 = 0x00000000
> > > > ddr_sdram_mode_8 = 0x00000000
> > > > ddr_sdram_interval = 0x00000100
> > > > ddr_data_init = 0xDEADBEEF
> > > > ddr_sdram_clk_cntl = 0x03000000
> > > > ddr_init_addr = 0x00000000
> > > > ddr_init_ext_addr = 0x00000000
> > > > timing_cfg_4 = 0x00220001
> > > > timing_cfg_5 = 0x1C401400
> > > > ddr_zq_cntl = 0x89080600
> > > > ddr_wrlvl_cntl = 0x8675A608
> > > > ddr_sr_cntr = 0x00000000
> > > > ddr_sdram_rcw_1 = 0x00000000
> > > > ddr_sdram_rcw_2 = 0x00000000
> > > > ddr_cdr1 = 0x00000000
> > > > ddr_cdr2 = 0x00000000
> > > > err_disable = 0x00000000
> > > > err_int_en = 0x00000000
> > > > debug_01 = 0x00000000
> > > > debug_02 = 0x00000000
> > > > debug_03 = 0x00000000
> > > > debug_04 = 0x00000000
> > > > debug_05 = 0x00000000
> > > > debug_06 = 0x00000000
> > > > debug_07 = 0x00000000
> > > > debug_08 = 0x00000000
> > > > debug_09 = 0x00000000
> > > > debug_10 = 0x00000000
> > > > debug_11 = 0x00000000
> > > > debug_12 = 0x00000000
> > > > debug_13 = 0x00000000
> > > > debug_14 = 0x00000000
> > > > debug_15 = 0x00000000
> > > > debug_16 = 0x00000000
> > > > debug_17 = 0x00000000
> > > > debug_18 = 0x00000000
> > > > debug_19 = 0x00000000
> > > > debug_20 = 0x00000000
> > > > debug_21 = 0x00000000
> > > > debug_22 = 0x00000000
> > > > debug_23 = 0x00000000
> > > > debug_24 = 0x00000000
> > > > debug_25 = 0x00000000
> > > > debug_26 = 0x00000000
> > > > debug_27 = 0x00000000
> > > > debug_28 = 0x00000000
> > > > debug_29 = 0x00000000
> > > > debug_30 = 0x00000000
> > > > debug_31 = 0x00000000
> > > > debug_32 = 0x00000000
> > > >
> > > > _______________________________________________
> > > > U-Boot mailing list
> > > > U-Boot@lists.denx.de
> > > > http://lists.denx.de/mailman/listinfo/u-boot
> > > >
> > 
> > 
> > 
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > http://lists.denx.de/mailman/listinfo/u-boot
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Kumar Gala Nov. 12, 2011, 6:16 p.m. UTC | #13
>>> 
>>> +phys_size_t fixed_sdram(void)
>>> +{
>>> +	char buf[32];
>>> +	fsl_ddr_cfg_regs_t ddr_cfg_regs;
>>> +	size_t ddr_size;
>>> +	struct cpu_type *cpu;
>>> +	ulong ddr_freq, ddr_freq_mhz;
>>> +
>>> +	cpu = gd->cpu;
>>> +	/* P1020 and it's derivatives support max 32bit DDR width */
>>> +	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
>>> +		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
>>> +		ddr_size = (CONFIG_SYS_SDRAM_SIZE * 1024 * 1024 / 2);
>> 
>> These checks don't make sense if you are a P2020 SoC
>> 
> 
> This entire file is identical to board/freescale/p1_p2_rdb/ddr.c. In
> fact, since this board only boots via the On-Chip ROM, the whole file is
> useless: fixed_sdram() should just return the RAM size. We're running
> from RAM when this function executes.
> 
> Is it ok with you if I replace the entire file with the following?
> 
> phys_size_t fixed_sdram(void)
> {
> 	return CONFIG_SYS_SDRAM_SIZE << 20;
> }

If the board has SO-DIMMs than I'd expect SPD support.  Sounds like you're working on this w/Matt & York.


>>> diff --git a/board/freescale/p2020come/law.c b/board/freescale/p2020come/law.c
>>> new file mode 100644
>>> index 0000000..56508db
>>> --- /dev/null
>>> +++ b/board/freescale/p2020come/law.c
>>> @@ -0,0 +1,36 @@
>>> +/*
>>> + * Copyright 2009 Freescale Semiconductor, Inc.
>>> + *
>>> + * See file CREDITS for list of people who contributed to this
>>> + * project.
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> + * modify it under the terms of the GNU General Public License as
>>> + * published by the Free Software Foundation; either version 2 of
>>> + * the License, or (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
>>> + * GNU General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program; if not, write to the Free Software
>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>> + * MA 02111-1307 USA
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <asm/fsl_law.h>
>>> +#include <asm/mmu.h>
>>> +
>>> +struct law_entry law_table[] = {
>>> +	SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
>>> +	SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_1),
>>> +	SET_LAW(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_2),
>>> +	SET_LAW(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_2),
>>> +	SET_LAW(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_3),
>>> +	SET_LAW(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_3),
>> 
>> We normally set these up dynamically.
>> 
> 
> This is a modified version of the code from
> board/freescale/p1_p2_rdb/law.c. Can you suggest an in tree example of
> the way you'd like the code to look? I copied what I assume is a good
> example…

If you look at current board/freescale/p1_p2_rdb/law.c it doesn't have PCI LAWs anymore.  I think for your example you just need an empty data structure:

	struct law_entry law_table[] = {
	};

this should hopefully make num_law_entries = 0;


> 
>>> +};
>>> +
>>> +int num_law_entries = ARRAY_SIZE(law_table);
>>> diff --git a/board/freescale/p2020come/p2020come.c b/board/freescale/p2020come/p2020come.c
>>> new file mode 100644
>>> index 0000000..2e334cf
>>> --- /dev/null
>>> +++ b/board/freescale/p2020come/p2020come.c
>>> @@ -0,0 +1,401 @@
>>> +/*
>>> + * Copyright 2009 Freescale Semiconductor, Inc.
>>> + *
>>> + * See file CREDITS for list of people who contributed to this
>>> + * project.
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> + * modify it under the terms of the GNU General Public License as
>>> + * published by the Free Software Foundation; either version 2 of
>>> + * the License, or (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
>>> + * GNU General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program; if not, write to the Free Software
>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>> + * MA 02111-1307 USA
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <hwconfig.h>
>>> +#include <command.h>
>>> +#include <asm/processor.h>
>>> +#include <asm/mmu.h>
>>> +#include <asm/cache.h>
>>> +#include <asm/immap_85xx.h>
>>> +#include <asm/fsl_serdes.h>
>>> +#include <asm/io.h>
>>> +#include <miiphy.h>
>>> +#include <libfdt.h>
>>> +#include <fdt_support.h>
>>> +#include <fsl_mdio.h>
>>> +#include <tsec.h>
>>> +#include <vsc7385.h>
>>> +#include <netdev.h>
>>> +#include <mmc.h>
>>> +#include <malloc.h>
>>> +#include <i2c.h>
>>> +
>>> +#if defined(CONFIG_PCI)
>>> +#include <asm/fsl_pci.h>
>>> +#include <pci.h>
>>> +#endif
>>> +
>>> +DECLARE_GLOBAL_DATA_PTR;
>>> +
>>> +#if defined(CONFIG_PCI)
>>> +void pci_init_board(void)
>>> +{
>>> +	fsl_pcie_init_board(0);
>>> +}
>>> +
>>> +void ft_pci_board_setup(void *blob)
>>> +{
>>> +	FT_FSL_PCI_SETUP;
>>> +}
>>> +#endif
>>> +
>>> +/*
>>> + * GPIO
>>> + * 0 - 3: CarryBoard Input;
>>> + * 4 - 7: CarryBoard Output;
>>> + * 8 : Mux as SDHC_CD (card detection)
>>> + * 9 : Mux as SDHC_WP
>>> + * 10 : Clear Watchdog timer
>>> + * 11 : LED Input
>>> + * 12 : Output to 1
>>> + * 13 : Open Drain
>>> + * 14 : LED Output
>>> + * 15 : Switch Input
>>> + */
>>> +#define GPIO_DIR		0x0f3a0000
>>> +#define GPIO_ODR		0x00000000
>>> +
>>> +#define BOARD_PERI_RST_SET	(VSC7385_RST_SET | SLIC_RST_SET | \
>>> +				 SGMII_PHY_RST_SET | PCIE_RST_SET | \
>>> +				 RGMII_PHY_RST_SET)
>>> +
>>> +#define SYSCLK_MASK	0x00200000
>>> +#define BOARDREV_MASK	0x10100000
>>> +#define BOARDREV_B	0x10100000
>>> +#define BOARDREV_C	0x00100000
>>> +#define BOARDREV_D	0x00000000
>>> +
>>> +#define SYSCLK_66	66666666
>>> +#define SYSCLK_50	50000000
>>> +#define SYSCLK_100	100000000
>>> +
>>> +unsigned long get_board_sys_clk(ulong dummy)
>>> +{
>>> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
>>> +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
>>> +
>>> +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
>>> +	switch (ddr_ratio) {
>>> +	case 0x0C:
>>> +		return SYSCLK_66;
>>> +	case 0x0A:
>>> +	case 0x08:
>>> +		return SYSCLK_100;
>>> +	default:
>>> +		puts("ERROR: unknown DDR ratio\n");
>>> +		return SYSCLK_100;
>>> +	}
>>> +}
>>> +
>>> +unsigned long get_board_ddr_clk(ulong dummy)
>>> +{
>>> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
>>> +	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
>>> +
>>> +	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
>>> +	switch (ddr_ratio) {
>>> +	case 0x0C:
>>> +	case 0x0A:
>>> +		return SYSCLK_66;
>>> +	case 0x08:
>>> +		return SYSCLK_100;
>>> +	default:
>>> +		puts("ERROR: unknown DDR ratio\n");
>>> +		return SYSCLK_100;
>>> +	}
>>> +}
>>> +
>>> +#ifdef CONFIG_MMC
>>> +int board_early_init_f(void)
>>> +{
>>> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
>>> +
>>> +	setbits_be32(&gur->pmuxcr,
>>> +			(MPC85xx_PMUXCR_SDHC_CD |
>>> +			 MPC85xx_PMUXCR_SDHC_WP));
>>> +
>>> +	/* All the device are enable except for SRIO12 */
>>> +	setbits_be32(&gur->devdisr, 0x80000);
>> 
>> Add a #define instead of magic 0x80000
>> 
>>> +	return 0;
>>> +}
>>> +#endif
>>> +
>>> +int checkboard(void)
>>> +{
>>> +	ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR + 0xC00);
>>> +
>>> +	/*
>>> +	 * GPIO
>>> +	 * 0 - 3: CarryBoard Input;
>>> +	 * 4 - 7: CarryBoard Output;
>>> +	 * 8 : Mux as SDHC_CD (card detection)
>>> +	 * 9 : Mux as SDHC_WP
>>> +	 * 10 : Clear Watchdog timer
>>> +	 * 11 : LED Input
>>> +	 * 12 : Output to 1
>>> +	 * 13 : Open Drain
>>> +	 * 14 : LED Output
>>> +	 * 15 : Switch Input
>>> +	 *
>>> +	 * Set GPIOs 11, 12, 14 to 1.
>>> +	 */
>>> +	out_be32(&pgpio->gpdir, GPIO_DIR);
>>> +	out_be32(&pgpio->gpodr, GPIO_ODR);
>>> +	out_be32(&pgpio->gpdat, 0x001A0000);
>> 
>> look at using mpc85xx_gpio.h
>> 
> 
> Ok. This was copied from the BSP code. I'll change it to use the
> mpc85xx_gpio code.
> 
> While we're here, perhaps you can get the schematic for this board and
> see what the GPIO's are actually connected to. I can't get the
> schematic, so these comments are copied from the BSP code.

Is the schematic not provided?  Let me see if I can find someone familiar with this board.

> 
> The ones labeled "LED" (11 and 14) don't appear to change any LEDs that
> I can see on the board.
> 
>>> +
>>> +	puts("Board: Freescale COM Express P2020\n");
>>> +	return 0;
>>> +}
>>> +
>>> +#define M41ST85W_ERROR(fmt, args...) printf("ERROR: M41ST85W: " fmt, ##args)
>>> +
>>> +static void m41st85w_clear_bit(u8 reg, u8 mask, const char *name)
>>> +{
>>> +	u8 data;
>>> +
>>> +	if (i2c_read(0x68, reg, 1, &data, 1)) {
>>> +		M41ST85W_ERROR("unable to read %s bit\n", name);
>>> +		return;
>>> +	}
>>> +
>>> +	if (data & mask) {
>>> +		data &= ~mask;
>>> +		if (i2c_write(0x68, reg, 1, &data, 1)) {
>>> +			M41ST85W_ERROR("unable to clear %s bit\n", name);
>>> +			return;
>>> +		}
>>> +	}
>>> +}
>>> +
>>> +/*
>>> + * The P2020COME board has a STMicro M41ST85W RTC/watchdog
>>> + * at i2c bus 1 address 0x68.
>>> + */
>>> +static void start_rtc(void)
>>> +{
>>> +	unsigned int bus = i2c_get_bus_num();
>>> +
>>> +	if (i2c_set_bus_num(1)) {
>>> +		M41ST85W_ERROR("unable to set i2c bus\n");
>>> +		goto out;
>>> +	}
>>> +
>>> +	/* ensure ST (stop) and HT (halt update) bits are cleared */
>>> +	m41st85w_clear_bit(0x1, 0x80, "ST");
>>> +	m41st85w_clear_bit(0xc, 0x40, "HT");
>>> +
>>> +out:
>>> +	/* reset the i2c bus */
>>> +	i2c_set_bus_num(bus);
>>> +}
>>> +
>>> +int board_early_init_r(void)
>>> +{
>>> +	start_rtc();
>>> +	return 0;
>>> +}
>>> +
>>> +void board_reset(void)
>>> +{
>>> +	u8 data = (1 << 2) | 0x82;
>> 
>> some #defines instead of magic #s
>> 
>>> +
>>> +	/* set the hardware watchdog timeout to 1 second, then hang */
>>> +	i2c_set_bus_num(1);
>>> +	i2c_write(0x68, 9, 1, &data, 1);
>>> +
>>> +	while (1)
>>> +		/* hang */;
>>> +}
>>> +
>>> +#ifdef CONFIG_TSEC_ENET
>>> +int board_eth_init(bd_t *bis)
>>> +{
>>> +	struct fsl_pq_mdio_info mdio_info;
>>> +	struct tsec_info_struct tsec_info[4];
>>> +	int num = 0;
>>> +
>>> +#ifdef CONFIG_TSEC1
>>> +	SET_STD_TSEC_INFO(tsec_info[num], 1);
>>> +	num++;
>>> +#endif
>>> +#ifdef CONFIG_TSEC2
>>> +	SET_STD_TSEC_INFO(tsec_info[num], 2);
>>> +	num++;
>>> +#endif
>>> +#ifdef CONFIG_TSEC3
>>> +	SET_STD_TSEC_INFO(tsec_info[num], 3);
>>> +	if (is_serdes_configured(SGMII_TSEC3)) {
>>> +		puts("eTSEC3 is in sgmii mode.");
>>> +		tsec_info[num].flags |= TSEC_SGMII;
>>> +	}
>>> +	num++;
>>> +#endif
>>> +	if (!num) {
>>> +		printf("No TSECs initialized\n");
>>> +		return 0;
>>> +	}
>>> +
>>> +	mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
>>> +	mdio_info.name = DEFAULT_MII_NAME;
>>> +	fsl_pq_mdio_init(bis, &mdio_info);
>>> +
>>> +	tsec_eth_init(bis, tsec_info, num);
>>> +
>>> +	return pci_eth_init(bis);
>>> +}
>>> +#endif
>>> +
>>> +#if defined(CONFIG_OF_BOARD_SETUP)
>>> +void fdt_fixup_add_2nd_usb(void *blob, int agent)
>>> +{
>> 
>> What are you trying to do here?
>> 
> 
> This was copied from the BSP code, I have no idea what the purpose is. I
> just checked: the board works fine with this removed. I'll remove it.
> 
>>> +	const char *soc_compat = "fsl,p2020-immr";
>>> +	const char *lbc_compat = "fsl,p2020-elbc";
>>> +	const u32 *addrcell, *sizecell, *ph;
>>> +	int off, lbcoff, len, err;
>>> +	u32 *regbuf = NULL;
>>> +	u32 *irqbuf = NULL;
>>> +
>>> +	off = fdt_node_offset_by_compatible(blob, -1, soc_compat);
>>> +	if (off < 0) {
>>> +		printf("WARNING: could not find compatible node %s: %s.\n",
>>> +			soc_compat, fdt_strerror(off));
>>> +		return;
>>> +	}
>>> +
>>> +	lbcoff = fdt_node_offset_by_compatible(blob, -1, lbc_compat);
>>> +	if (lbcoff < 0) {
>>> +		printf("WARNING: could not find compatible node %s: %s.\n",
>>> +			lbc_compat, fdt_strerror(lbcoff));
>>> +		return;
>>> +	}
>>> +
>>> +	addrcell = fdt_getprop(blob, off, "#address-cells", NULL);
>>> +	sizecell = fdt_getprop(blob, off, "#size-cells", NULL);
>>> +
>>> +	off = fdt_add_subnode(blob, off, "usb@23000");
>>> +	if (off < 0) {
>>> +		printf("WARNING: could not add 2nd usb node %s.\n",
>>> +				fdt_strerror(off));
>>> +		return;
>>> +	}
>>> +
>>> +	err = fdt_setprop_cell(blob, off, "#address-cells", 1);
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set #address-cell property: %s\n",
>>> +			fdt_strerror(err));
>>> +
>>> +	err = fdt_setprop_cell(blob, off, "#size-cells", 0);
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set #size-cells property: %s\n",
>>> +			fdt_strerror(err));
>>> +
>>> +	err = fdt_setprop_string(blob, off, "compatible", "fsl-usb2-dr");
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set compatible property: %s\n",
>>> +			fdt_strerror(err));
>>> +
>>> +	err = fdt_setprop_string(blob, off, "phy_type", "ulpi");
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set phy_type property: %s\n",
>>> +			fdt_strerror(err));
>>> +
>>> +	if (agent) {
>>> +		err = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
>>> +		if (err < 0)
>>> +			printf("WARNING: could not set dr_mode property: %s\n",
>>> +				fdt_strerror(err));
>>> +	}
>>> +
>>> +	if (addrcell && *addrcell == 2) {
>>> +		regbuf[0] = 0;
>>> +		regbuf[1] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
>>> +		len = 2;
>>> +	} else {
>>> +		regbuf[0] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
>>> +		len = 1;
>>> +	}
>>> +
>>> +	if (sizecell && *sizecell == 2) {
>>> +		regbuf[len] = 0;
>>> +		regbuf[len + 1] = 0x1000;
>>> +		len = 2;
>>> +	} else {
>>> +		regbuf[len] = 0x1000;
>>> +		len++;
>>> +	}
>>> +
>>> +	err = fdt_setprop(blob, off, "reg", regbuf, len * sizeof(u32));
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set <%s> %s\n",
>>> +					"reg", fdt_strerror(err));
>>> +
>>> +	irqbuf[0] = 0x2e;
>>> +	irqbuf[1] = 0x2;
>>> +
>>> +	err = fdt_setprop(blob, off, "interrupts", irqbuf, 2 * sizeof(u32));
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set %s %s\n",
>>> +				"interrupts", fdt_strerror(err));
>>> +
>>> +	ph = fdt_getprop(blob, lbcoff, "interrupt-parent", 0);
>>> +	if (!ph) {
>>> +		printf("WARNING: could not read interrupt-parent property\n");
>>> +		return;
>>> +	}
>>> +
>>> +	err = fdt_setprop(blob, off, "interrupt-parent", ph, sizeof(u32));
>>> +	if (err < 0)
>>> +		printf("WARNING: could not set %s %s\n",
>>> +				"interrupt-parent", fdt_strerror(err));
>>> +}
>>> +
>>> +void ft_board_setup(void *blob, bd_t *bd)
>>> +{
>>> +	phys_addr_t base;
>>> +	phys_size_t size;
>>> +	int agent;
>>> +
>>> +	ft_cpu_setup(blob, bd);
>>> +
>>> +	base = getenv_bootm_low();
>>> +	size = getenv_bootm_size();
>>> +
>>> +#if defined(CONFIG_PCI)
>>> +	ft_pci_board_setup(blob);
>>> +#endif
>>> +
>>> +	fdt_fixup_memory(blob, (u64)base, (u64)size);
>>> +
>>> +	if (!hwconfig("usb2"))
>>> +		return;
>>> +
>>> +	agent = hwconfig_subarg_cmp("usb2", "dr_mode", "peripheral");
>>> +
>>> +	/*
>>> +	 * Add the 2nd usb node and enable it. eLBC will
>>> +	 * now be disabled since it is MUXed with USB2
>>> +	 */
>>> +
>>> +	fdt_fixup_add_2nd_usb(blob, agent);
>>> +}
>>> +#endif
>>> diff --git a/board/freescale/p2020come/tlb.c b/board/freescale/p2020come/tlb.c
>>> new file mode 100644
>>> index 0000000..e1dd056
>>> --- /dev/null
>>> +++ b/board/freescale/p2020come/tlb.c
>>> @@ -0,0 +1,100 @@
>>> +/*
>>> + * Copyright 2011 Freescale Semiconductor, Inc.
>>> + *
>>> + * See file CREDITS for list of people who contributed to this
>>> + * project.
>>> + *
>>> + * This program is free software; you can redistribute it and/or
>>> + * modify it under the terms of the GNU General Public License as
>>> + * published by the Free Software Foundation; either version 2 of
>>> + * the License, or (at your option) any later version.
>>> + *
>>> + * This program is distributed in the hope that it will be useful,
>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
>>> + * GNU General Public License for more details.
>>> + *
>>> + * You should have received a copy of the GNU General Public License
>>> + * along with this program; if not, write to the Free Software
>>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
>>> + * MA 02111-1307 USA
>>> + */
>>> +
>>> +#include <common.h>
>>> +#include <asm/mmu.h>
>>> +
>> 
>> For any regions that do NOT have code, we should remove MAS3_SX bit:
>> 
> 
> I assume you mean the CCSR and PCI regions. Maybe the
> CONFIG_SYS_INIT_RAM_ADDR regions too, I don't know what they're used
> for.

take a look at board/freescale/common/p_corenet/tlb.c

> 
> Thanks for the comments. I look forward to your feedback on the couple
> of questions I have.
> 
> Ira
> 
>>> +struct fsl_e_tlb_entry tlb_table[] = {
>>> +	/* TLB 0 - for temp stack in cache */
>>> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR,
>>> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
>>> +			0, 0, BOOKE_PAGESZ_4K, 0),
>>> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024 ,
>>> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
>>> +			0, 0, BOOKE_PAGESZ_4K, 0),
>>> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024 ,
>>> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
>>> +			0, 0, BOOKE_PAGESZ_4K, 0),
>>> +	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024 ,
>>> +			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, 0,
>>> +			0, 0, BOOKE_PAGESZ_4K, 0),
>>> +
>>> +	/* TLB 1 */
>>> +	/* *I*** - Covers boot page */
>>> +	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 0, BOOKE_PAGESZ_4K, 1),
>>> +
>>> +	/* *I*G* - CCSRBAR */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 1, BOOKE_PAGESZ_1M, 1),
>>> +
>>> +#if defined(CONFIG_PCI)
>>> +	/* *I*G* - PCI3 - PCI2 0x8000,0000 - 0xbfff,ffff, size = 1G */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 2, BOOKE_PAGESZ_1G, 1),
>>> +
>>> +	/* *I*G* - PCI1 0xC000,0000 - 0xcfff,ffff, size = 256M */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_VIRT,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 3, BOOKE_PAGESZ_256M, 1),
>>> +
>>> +
>>> +	/* *I*G* - PCI1  0xD000,0000 - 0xDFFF,FFFF, size = 256M */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
>>> +			CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 4, BOOKE_PAGESZ_256M, 1),
>>> +
>>> +	/*
>>> +	 * *I*G* - PCI I/O
>>> +	 *
>>> +	 * PCI3 => 0xFFC10000
>>> +	 * PCI2 => 0xFFC2,0000
>>> +	 * PCI1 => 0xFFC3,0000
>>> +	 */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 5, BOOKE_PAGESZ_256K, 1),
>>> +#endif /* #if defined(CONFIG_PCI) */
>>> +
>>> +#if defined(CONFIG_SYS_RAMBOOT)
>>> +	/* *I*G - DDR3  2G     Part 1: 0 - 0x3fff,ffff , size = 1G */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 6, BOOKE_PAGESZ_1G, 1),
>>> +
>>> +	/*        DDR3  2G     Part 2: 0x4000,0000 - 0x7fff,ffff , size = 1G */
>>> +	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
>>> +			CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
>>> +			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
>>> +			0, 7, BOOKE_PAGESZ_1G, 1),
>>> +#endif
>>> +};
>>> +
>>> +int num_tlb_entries = ARRAY_SIZE(tlb_table);
>> 
>> 
>>>
Ira Snyder Nov. 19, 2011, 1:31 a.m. UTC | #14
On Sat, Nov 12, 2011 at 12:16:05PM -0600, Kumar Gala wrote:
> > 
> > This entire file is identical to board/freescale/p1_p2_rdb/ddr.c. In
> > fact, since this board only boots via the On-Chip ROM, the whole file is
> > useless: fixed_sdram() should just return the RAM size. We're running
> > from RAM when this function executes.
> > 
> > Is it ok with you if I replace the entire file with the following?
> > 
> > phys_size_t fixed_sdram(void)
> > {
> > 	return CONFIG_SYS_SDRAM_SIZE << 20;
> > }
> 
> If the board has SO-DIMMs than I'd expect SPD support.  Sounds like you're working on this w/Matt & York.
> 

I don't need fixed_sdram() anymore. I figured out how to get L2 SRAM
boot working this week. Also, I finally tracked down a bug in the
Freescale DDR SPD code, exposed due to invalid data in the SPD. Darn
hardware manufacturers!

> >>> diff --git a/board/freescale/p2020come/law.c b/board/freescale/p2020come/law.c
> >>> new file mode 100644
> >>> index 0000000..56508db
> >>> --- /dev/null
> >>> +++ b/board/freescale/p2020come/law.c
> >>> @@ -0,0 +1,36 @@
> >>> +/*
> >>> + * Copyright 2009 Freescale Semiconductor, Inc.
> >>> + *
> >>> + * See file CREDITS for list of people who contributed to this
> >>> + * project.
> >>> + *
> >>> + * This program is free software; you can redistribute it and/or
> >>> + * modify it under the terms of the GNU General Public License as
> >>> + * published by the Free Software Foundation; either version 2 of
> >>> + * the License, or (at your option) any later version.
> >>> + *
> >>> + * This program is distributed in the hope that it will be useful,
> >>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
> >>> + * GNU General Public License for more details.
> >>> + *
> >>> + * You should have received a copy of the GNU General Public License
> >>> + * along with this program; if not, write to the Free Software
> >>> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> >>> + * MA 02111-1307 USA
> >>> + */
> >>> +
> >>> +#include <common.h>
> >>> +#include <asm/fsl_law.h>
> >>> +#include <asm/mmu.h>
> >>> +
> >>> +struct law_entry law_table[] = {
> >>> +	SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
> >>> +	SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_1),
> >>> +	SET_LAW(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_2),
> >>> +	SET_LAW(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_2),
> >>> +	SET_LAW(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_3),
> >>> +	SET_LAW(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_3),
> >> 
> >> We normally set these up dynamically.
> >> 
> > 
> > This is a modified version of the code from
> > board/freescale/p1_p2_rdb/law.c. Can you suggest an in tree example of
> > the way you'd like the code to look? I copied what I assume is a good
> > example…
> 
> If you look at current board/freescale/p1_p2_rdb/law.c it doesn't have PCI LAWs anymore.  I think for your example you just need an empty data structure:
> 
> 	struct law_entry law_table[] = {
> 	};
> 
> this should hopefully make num_law_entries = 0;
> 
> 
> > 
> >>> +};
> >>> +
> >>> +int num_law_entries = ARRAY_SIZE(law_table);

Unfortunately, having a law_table with no entries causes a bug. A nasty
bug which was hard to track down.

When law_table is empty, and when num_law_entries = 0, both variables
exist in BSS only.

Both the law_table and num_law_entries are used in init_laws(), called
from cpu_init_early_f(). This happens before BSS is initialized. Also
before DDR is initialized.

And now you see the bug. The U-Boot hangs due to an invalid memory
access. This is before the console is initialized, making it hard to
track down.

How do you suggest I work around this? A single redundant entry in the
law_table works (the system boots).

Thanks,
Ira
Kumar Gala Nov. 19, 2011, 4:13 p.m. UTC | #15
>> If you look at current board/freescale/p1_p2_rdb/law.c it doesn't have PCI LAWs anymore.  I think for your example you just need an empty data structure:
>> 
>> 	struct law_entry law_table[] = {
>> 	};
>> 
>> this should hopefully make num_law_entries = 0;
>> 
>> 
>>> 
>>>>> +};
>>>>> +
>>>>> +int num_law_entries = ARRAY_SIZE(law_table);
> 
> Unfortunately, having a law_table with no entries causes a bug. A nasty
> bug which was hard to track down.
> 
> When law_table is empty, and when num_law_entries = 0, both variables
> exist in BSS only.
> 
> Both the law_table and num_law_entries are used in init_laws(), called
> from cpu_init_early_f(). This happens before BSS is initialized. Also
> before DDR is initialized.
> 
> And now you see the bug. The U-Boot hangs due to an invalid memory
> access. This is before the console is initialized, making it hard to
> track down.

Yeah, that's nasty.  need to think on this a bit to see if I can come up with any good answer.

> How do you suggest I work around this? A single redundant entry in the
> law_table works (the system boots).

For now I'd go with that and add a comment in law.c about it.

- k
diff mbox

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 030fe4a..b689a88 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -454,6 +454,10 @@  Jon Smirl <jonsmirl@gmail.com>
 
 	pcm030		MPC5200
 
+Ira W. Snyder <iws@ovro.caltech.edu>
+
+	P2020COME	P2020
+
 Timur Tabi <timur@freescale.com>
 
 	MPC8349E-mITX	MPC8349
diff --git a/arch/powerpc/include/asm/immap_85xx.h b/arch/powerpc/include/asm/immap_85xx.h
index 99fe97d..9b08cb8 100644
--- a/arch/powerpc/include/asm/immap_85xx.h
+++ b/arch/powerpc/include/asm/immap_85xx.h
@@ -2420,6 +2420,7 @@  struct ccsr_rman {
 #define CONFIG_SYS_MPC85xx_L2_OFFSET		0x20000
 #define CONFIG_SYS_MPC85xx_DMA_OFFSET		0x21000
 #define CONFIG_SYS_MPC85xx_USB_OFFSET		0x22000
+#define CONFIG_SYS_MPC85xx_USB2_OFFSET		0x23000
 #ifdef CONFIG_TSECV2
 #define CONFIG_SYS_TSEC1_OFFSET			0xB0000
 #else
diff --git a/board/freescale/p2020come/Makefile b/board/freescale/p2020come/Makefile
new file mode 100644
index 0000000..ba87904
--- /dev/null
+++ b/board/freescale/p2020come/Makefile
@@ -0,0 +1,46 @@ 
+#
+# Copyright 2009 Freescale Semiconductor, Inc.
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB			= $(obj)lib$(BOARD).o
+
+COBJS-y			+= $(BOARD).o
+COBJS-y			+= ddr.o
+COBJS-y			+= law.o
+COBJS-y			+= tlb.o
+
+SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS-y))
+SOBJS	:= $(addprefix $(obj),$(SOBJS))
+
+$(LIB): $(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/freescale/p2020come/ddr.c b/board/freescale/p2020come/ddr.c
new file mode 100644
index 0000000..dd2a4dd
--- /dev/null
+++ b/board/freescale/p2020come/ddr.c
@@ -0,0 +1,245 @@ 
+/*
+ * Copyright 2009, 2011 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/mmu.h>
+#include <asm/immap_85xx.h>
+#include <asm/processor.h>
+#include <asm/fsl_ddr_sdram.h>
+#include <asm/io.h>
+#include <asm/fsl_law.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define CONFIG_SYS_DDR_CS0_BNDS		0x0000003F
+#define CONFIG_SYS_DDR_CS0_CONFIG	0x80014202
+#define CONFIG_SYS_DDR_CS0_CONFIG_2	0x00000000
+#define CONFIG_SYS_DDR_INIT_ADDR	0x00000000
+#define CONFIG_SYS_DDR_INIT_EXT_ADDR	0x00000000
+#define CONFIG_SYS_DDR_MODE_CONTROL	0x00000000
+#define CONFIG_SYS_DDR_ZQ_CONTROL	0x00000000
+#define CONFIG_SYS_DDR_WRLVL_CONTROL	0x00000000
+#define CONFIG_SYS_DDR_SR_CNTR		0x00000000
+#define CONFIG_SYS_DDR_RCW_1		0x00000000
+#define CONFIG_SYS_DDR_RCW_2		0x00000000
+#define CONFIG_SYS_DDR_CONTROL		0x43000000	/* Type = DDR2*/
+#define CONFIG_SYS_DDR_CONTROL_2	0x24401000
+#define CONFIG_SYS_DDR_TIMING_4		0x00000000
+#define CONFIG_SYS_DDR_TIMING_5		0x00000000
+
+#define CONFIG_SYS_DDR_TIMING_3_400	0x00010000
+#define CONFIG_SYS_DDR_TIMING_0_400	0x00260802
+#define CONFIG_SYS_DDR_TIMING_1_400	0x39355322
+#define CONFIG_SYS_DDR_TIMING_2_400	0x1f9048ca
+#define CONFIG_SYS_DDR_CLK_CTRL_400	0x02800000
+#define CONFIG_SYS_DDR_MODE_1_400	0x00480432
+#define CONFIG_SYS_DDR_MODE_2_400	0x00000000
+#define CONFIG_SYS_DDR_INTERVAL_400	0x06180100
+
+#define CONFIG_SYS_DDR_TIMING_3_533	0x00020000
+#define CONFIG_SYS_DDR_TIMING_0_533	0x00260802
+#define CONFIG_SYS_DDR_TIMING_1_533	0x4c47c432
+#define CONFIG_SYS_DDR_TIMING_2_533	0x0f9848ce
+#define CONFIG_SYS_DDR_CLK_CTRL_533	0x02800000
+#define CONFIG_SYS_DDR_MODE_1_533	0x00040642
+#define CONFIG_SYS_DDR_MODE_2_533	0x00000000
+#define CONFIG_SYS_DDR_INTERVAL_533	0x08200100
+
+#define CONFIG_SYS_DDR_TIMING_3_667	0x00030000
+#define CONFIG_SYS_DDR_TIMING_0_667	0x55770802
+#define CONFIG_SYS_DDR_TIMING_1_667	0x5f599543
+#define CONFIG_SYS_DDR_TIMING_2_667	0x0fa074d1
+#define CONFIG_SYS_DDR_CLK_CTRL_667	0x03000000
+#define CONFIG_SYS_DDR_MODE_1_667	0x00040852
+#define CONFIG_SYS_DDR_MODE_2_667	0x00000000
+#define CONFIG_SYS_DDR_INTERVAL_667	0x0a280100
+
+#define CONFIG_SYS_DDR_TIMING_3_800	0x00040000
+#define CONFIG_SYS_DDR_TIMING_0_800	0x00770802
+#define CONFIG_SYS_DDR_TIMING_1_800	0x6f6b6543
+#define CONFIG_SYS_DDR_TIMING_2_800	0x0fa074d1
+#define CONFIG_SYS_DDR_CLK_CTRL_800	0x02800000
+#define CONFIG_SYS_DDR_MODE_1_800	0x00040852
+#define CONFIG_SYS_DDR_MODE_2_800	0x00000000
+#define CONFIG_SYS_DDR_INTERVAL_800	0x0c300100
+
+fsl_ddr_cfg_regs_t ddr_cfg_regs_400 = {
+	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
+	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
+	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
+	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_400,
+	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_400,
+	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_400,
+	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_400,
+	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
+	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
+	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_400,
+	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_400,
+	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
+	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_400,
+	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
+	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_400,
+	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
+	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
+	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
+	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
+	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
+	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
+	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
+	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
+	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
+};
+
+fsl_ddr_cfg_regs_t ddr_cfg_regs_533 = {
+	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
+	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
+	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
+	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_533,
+	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_533,
+	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_533,
+	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_533,
+	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
+	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
+	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_533,
+	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_533,
+	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
+	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_533,
+	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
+	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_533,
+	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
+	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
+	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
+	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
+	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
+	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
+	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
+	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
+	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
+};
+
+fsl_ddr_cfg_regs_t ddr_cfg_regs_667 = {
+	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
+	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
+	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
+	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_667,
+	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_667,
+	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_667,
+	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_667,
+	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
+	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
+	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_667,
+	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_667,
+	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
+	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_667,
+	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
+	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_667,
+	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
+	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
+	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
+	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
+	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
+	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
+	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
+	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
+	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
+};
+
+fsl_ddr_cfg_regs_t ddr_cfg_regs_800 = {
+	.cs[0].bnds = CONFIG_SYS_DDR_CS0_BNDS,
+	.cs[0].config = CONFIG_SYS_DDR_CS0_CONFIG,
+	.cs[0].config_2 = CONFIG_SYS_DDR_CS0_CONFIG_2,
+	.timing_cfg_3 = CONFIG_SYS_DDR_TIMING_3_800,
+	.timing_cfg_0 = CONFIG_SYS_DDR_TIMING_0_800,
+	.timing_cfg_1 = CONFIG_SYS_DDR_TIMING_1_800,
+	.timing_cfg_2 = CONFIG_SYS_DDR_TIMING_2_800,
+	.ddr_sdram_cfg = CONFIG_SYS_DDR_CONTROL,
+	.ddr_sdram_cfg_2 = CONFIG_SYS_DDR_CONTROL_2,
+	.ddr_sdram_mode = CONFIG_SYS_DDR_MODE_1_800,
+	.ddr_sdram_mode_2 = CONFIG_SYS_DDR_MODE_2_800,
+	.ddr_sdram_md_cntl = CONFIG_SYS_DDR_MODE_CONTROL,
+	.ddr_sdram_interval = CONFIG_SYS_DDR_INTERVAL_800,
+	.ddr_data_init = CONFIG_MEM_INIT_VALUE,
+	.ddr_sdram_clk_cntl = CONFIG_SYS_DDR_CLK_CTRL_800,
+	.ddr_init_addr = CONFIG_SYS_DDR_INIT_ADDR,
+	.ddr_init_ext_addr = CONFIG_SYS_DDR_INIT_EXT_ADDR,
+	.timing_cfg_4 = CONFIG_SYS_DDR_TIMING_4,
+	.timing_cfg_5 = CONFIG_SYS_DDR_TIMING_5,
+	.ddr_zq_cntl = CONFIG_SYS_DDR_ZQ_CONTROL,
+	.ddr_wrlvl_cntl = CONFIG_SYS_DDR_WRLVL_CONTROL,
+	.ddr_sr_cntr = CONFIG_SYS_DDR_SR_CNTR,
+	.ddr_sdram_rcw_1 = CONFIG_SYS_DDR_RCW_1,
+	.ddr_sdram_rcw_2 = CONFIG_SYS_DDR_RCW_2
+};
+
+/*
+ * Fixed sdram init -- doesn't use serial presence detect.
+ */
+
+phys_size_t fixed_sdram(void)
+{
+	char buf[32];
+	fsl_ddr_cfg_regs_t ddr_cfg_regs;
+	size_t ddr_size;
+	struct cpu_type *cpu;
+	ulong ddr_freq, ddr_freq_mhz;
+
+	cpu = gd->cpu;
+	/* P1020 and it's derivatives support max 32bit DDR width */
+	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
+		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
+		ddr_size = (CONFIG_SYS_SDRAM_SIZE * 1024 * 1024 / 2);
+	} else {
+		ddr_size = CONFIG_SYS_SDRAM_SIZE * 1024 * 1024;
+	}
+#if defined(CONFIG_SYS_RAMBOOT)
+	return ddr_size;
+#endif
+	ddr_freq = get_ddr_freq(0);
+	ddr_freq_mhz = ddr_freq / 1000000;
+
+	printf("Configuring DDR for %s MT/s data rate\n",
+				strmhz(buf, ddr_freq));
+
+	if (ddr_freq_mhz <= 400)
+		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_400, sizeof(ddr_cfg_regs));
+	else if (ddr_freq_mhz <= 533)
+		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_533, sizeof(ddr_cfg_regs));
+	else if (ddr_freq_mhz <= 667)
+		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_667, sizeof(ddr_cfg_regs));
+	else if (ddr_freq_mhz <= 800)
+		memcpy(&ddr_cfg_regs, &ddr_cfg_regs_800, sizeof(ddr_cfg_regs));
+	else
+		panic("Unsupported DDR data rate %s MT/s data rate\n",
+					strmhz(buf, ddr_freq));
+
+	/* P1020 and it's derivatives support max 32bit DDR width */
+	if (cpu->soc_ver == SVR_P1020 || cpu->soc_ver == SVR_P1020_E ||
+		cpu->soc_ver == SVR_P1011 || cpu->soc_ver == SVR_P1011_E) {
+		ddr_cfg_regs.ddr_sdram_cfg |= SDRAM_CFG_32_BE;
+		ddr_cfg_regs.cs[0].bnds = 0x0000001F;
+	}
+
+	fsl_ddr_set_memctl_regs(&ddr_cfg_regs, 0);
+
+	set_ddr_laws(0, ddr_size, LAW_TRGT_IF_DDR_1);
+	return ddr_size;
+}
diff --git a/board/freescale/p2020come/law.c b/board/freescale/p2020come/law.c
new file mode 100644
index 0000000..56508db
--- /dev/null
+++ b/board/freescale/p2020come/law.c
@@ -0,0 +1,36 @@ 
+/*
+ * Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/fsl_law.h>
+#include <asm/mmu.h>
+
+struct law_entry law_table[] = {
+	SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
+	SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_1),
+	SET_LAW(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_2),
+	SET_LAW(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_2),
+	SET_LAW(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_3),
+	SET_LAW(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K, LAW_TRGT_IF_PCIE_3),
+};
+
+int num_law_entries = ARRAY_SIZE(law_table);
diff --git a/board/freescale/p2020come/p2020come.c b/board/freescale/p2020come/p2020come.c
new file mode 100644
index 0000000..2e334cf
--- /dev/null
+++ b/board/freescale/p2020come/p2020come.c
@@ -0,0 +1,401 @@ 
+/*
+ * Copyright 2009 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <hwconfig.h>
+#include <command.h>
+#include <asm/processor.h>
+#include <asm/mmu.h>
+#include <asm/cache.h>
+#include <asm/immap_85xx.h>
+#include <asm/fsl_serdes.h>
+#include <asm/io.h>
+#include <miiphy.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#include <fsl_mdio.h>
+#include <tsec.h>
+#include <vsc7385.h>
+#include <netdev.h>
+#include <mmc.h>
+#include <malloc.h>
+#include <i2c.h>
+
+#if defined(CONFIG_PCI)
+#include <asm/fsl_pci.h>
+#include <pci.h>
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_PCI)
+void pci_init_board(void)
+{
+	fsl_pcie_init_board(0);
+}
+
+void ft_pci_board_setup(void *blob)
+{
+	FT_FSL_PCI_SETUP;
+}
+#endif
+
+/*
+ * GPIO
+ * 0 - 3: CarryBoard Input;
+ * 4 - 7: CarryBoard Output;
+ * 8 : Mux as SDHC_CD (card detection)
+ * 9 : Mux as SDHC_WP
+ * 10 : Clear Watchdog timer
+ * 11 : LED Input
+ * 12 : Output to 1
+ * 13 : Open Drain
+ * 14 : LED Output
+ * 15 : Switch Input
+ */
+#define GPIO_DIR		0x0f3a0000
+#define GPIO_ODR		0x00000000
+
+#define BOARD_PERI_RST_SET	(VSC7385_RST_SET | SLIC_RST_SET | \
+				 SGMII_PHY_RST_SET | PCIE_RST_SET | \
+				 RGMII_PHY_RST_SET)
+
+#define SYSCLK_MASK	0x00200000
+#define BOARDREV_MASK	0x10100000
+#define BOARDREV_B	0x10100000
+#define BOARDREV_C	0x00100000
+#define BOARDREV_D	0x00000000
+
+#define SYSCLK_66	66666666
+#define SYSCLK_50	50000000
+#define SYSCLK_100	100000000
+
+unsigned long get_board_sys_clk(ulong dummy)
+{
+	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
+
+	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
+	switch (ddr_ratio) {
+	case 0x0C:
+		return SYSCLK_66;
+	case 0x0A:
+	case 0x08:
+		return SYSCLK_100;
+	default:
+		puts("ERROR: unknown DDR ratio\n");
+		return SYSCLK_100;
+	}
+}
+
+unsigned long get_board_ddr_clk(ulong dummy)
+{
+	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+	u32 ddr_ratio = in_be32(&gur->porpllsr) & MPC85xx_PORPLLSR_DDR_RATIO;
+
+	ddr_ratio >>= MPC85xx_PORPLLSR_DDR_RATIO_SHIFT;
+	switch (ddr_ratio) {
+	case 0x0C:
+	case 0x0A:
+		return SYSCLK_66;
+	case 0x08:
+		return SYSCLK_100;
+	default:
+		puts("ERROR: unknown DDR ratio\n");
+		return SYSCLK_100;
+	}
+}
+
+#ifdef CONFIG_MMC
+int board_early_init_f(void)
+{
+	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+
+	setbits_be32(&gur->pmuxcr,
+			(MPC85xx_PMUXCR_SDHC_CD |
+			 MPC85xx_PMUXCR_SDHC_WP));
+
+	/* All the device are enable except for SRIO12 */
+	setbits_be32(&gur->devdisr, 0x80000);
+	return 0;
+}
+#endif
+
+int checkboard(void)
+{
+	ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR + 0xC00);
+
+	/*
+	 * GPIO
+	 * 0 - 3: CarryBoard Input;
+	 * 4 - 7: CarryBoard Output;
+	 * 8 : Mux as SDHC_CD (card detection)
+	 * 9 : Mux as SDHC_WP
+	 * 10 : Clear Watchdog timer
+	 * 11 : LED Input
+	 * 12 : Output to 1
+	 * 13 : Open Drain
+	 * 14 : LED Output
+	 * 15 : Switch Input
+	 *
+	 * Set GPIOs 11, 12, 14 to 1.
+	 */
+	out_be32(&pgpio->gpdir, GPIO_DIR);
+	out_be32(&pgpio->gpodr, GPIO_ODR);
+	out_be32(&pgpio->gpdat, 0x001A0000);
+
+	puts("Board: Freescale COM Express P2020\n");
+	return 0;
+}
+
+#define M41ST85W_ERROR(fmt, args...) printf("ERROR: M41ST85W: " fmt, ##args)
+
+static void m41st85w_clear_bit(u8 reg, u8 mask, const char *name)
+{
+	u8 data;
+
+	if (i2c_read(0x68, reg, 1, &data, 1)) {
+		M41ST85W_ERROR("unable to read %s bit\n", name);
+		return;
+	}
+
+	if (data & mask) {
+		data &= ~mask;
+		if (i2c_write(0x68, reg, 1, &data, 1)) {
+			M41ST85W_ERROR("unable to clear %s bit\n", name);
+			return;
+		}
+	}
+}
+
+/*
+ * The P2020COME board has a STMicro M41ST85W RTC/watchdog
+ * at i2c bus 1 address 0x68.
+ */
+static void start_rtc(void)
+{
+	unsigned int bus = i2c_get_bus_num();
+
+	if (i2c_set_bus_num(1)) {
+		M41ST85W_ERROR("unable to set i2c bus\n");
+		goto out;
+	}
+
+	/* ensure ST (stop) and HT (halt update) bits are cleared */
+	m41st85w_clear_bit(0x1, 0x80, "ST");
+	m41st85w_clear_bit(0xc, 0x40, "HT");
+
+out:
+	/* reset the i2c bus */
+	i2c_set_bus_num(bus);
+}
+
+int board_early_init_r(void)
+{
+	start_rtc();
+	return 0;
+}
+
+void board_reset(void)
+{
+	u8 data = (1 << 2) | 0x82;
+
+	/* set the hardware watchdog timeout to 1 second, then hang */
+	i2c_set_bus_num(1);
+	i2c_write(0x68, 9, 1, &data, 1);
+
+	while (1)
+		/* hang */;
+}
+
+#ifdef CONFIG_TSEC_ENET
+int board_eth_init(bd_t *bis)
+{
+	struct fsl_pq_mdio_info mdio_info;
+	struct tsec_info_struct tsec_info[4];
+	int num = 0;
+
+#ifdef CONFIG_TSEC1
+	SET_STD_TSEC_INFO(tsec_info[num], 1);
+	num++;
+#endif
+#ifdef CONFIG_TSEC2
+	SET_STD_TSEC_INFO(tsec_info[num], 2);
+	num++;
+#endif
+#ifdef CONFIG_TSEC3
+	SET_STD_TSEC_INFO(tsec_info[num], 3);
+	if (is_serdes_configured(SGMII_TSEC3)) {
+		puts("eTSEC3 is in sgmii mode.");
+		tsec_info[num].flags |= TSEC_SGMII;
+	}
+	num++;
+#endif
+	if (!num) {
+		printf("No TSECs initialized\n");
+		return 0;
+	}
+
+	mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
+	mdio_info.name = DEFAULT_MII_NAME;
+	fsl_pq_mdio_init(bis, &mdio_info);
+
+	tsec_eth_init(bis, tsec_info, num);
+
+	return pci_eth_init(bis);
+}
+#endif
+
+#if defined(CONFIG_OF_BOARD_SETUP)
+void fdt_fixup_add_2nd_usb(void *blob, int agent)
+{
+	const char *soc_compat = "fsl,p2020-immr";
+	const char *lbc_compat = "fsl,p2020-elbc";
+	const u32 *addrcell, *sizecell, *ph;
+	int off, lbcoff, len, err;
+	u32 *regbuf = NULL;
+	u32 *irqbuf = NULL;
+
+	off = fdt_node_offset_by_compatible(blob, -1, soc_compat);
+	if (off < 0) {
+		printf("WARNING: could not find compatible node %s: %s.\n",
+			soc_compat, fdt_strerror(off));
+		return;
+	}
+
+	lbcoff = fdt_node_offset_by_compatible(blob, -1, lbc_compat);
+	if (lbcoff < 0) {
+		printf("WARNING: could not find compatible node %s: %s.\n",
+			lbc_compat, fdt_strerror(lbcoff));
+		return;
+	}
+
+	addrcell = fdt_getprop(blob, off, "#address-cells", NULL);
+	sizecell = fdt_getprop(blob, off, "#size-cells", NULL);
+
+	off = fdt_add_subnode(blob, off, "usb@23000");
+	if (off < 0) {
+		printf("WARNING: could not add 2nd usb node %s.\n",
+				fdt_strerror(off));
+		return;
+	}
+
+	err = fdt_setprop_cell(blob, off, "#address-cells", 1);
+	if (err < 0)
+		printf("WARNING: could not set #address-cell property: %s\n",
+			fdt_strerror(err));
+
+	err = fdt_setprop_cell(blob, off, "#size-cells", 0);
+	if (err < 0)
+		printf("WARNING: could not set #size-cells property: %s\n",
+			fdt_strerror(err));
+
+	err = fdt_setprop_string(blob, off, "compatible", "fsl-usb2-dr");
+	if (err < 0)
+		printf("WARNING: could not set compatible property: %s\n",
+			fdt_strerror(err));
+
+	err = fdt_setprop_string(blob, off, "phy_type", "ulpi");
+	if (err < 0)
+		printf("WARNING: could not set phy_type property: %s\n",
+			fdt_strerror(err));
+
+	if (agent) {
+		err = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
+		if (err < 0)
+			printf("WARNING: could not set dr_mode property: %s\n",
+				fdt_strerror(err));
+	}
+
+	if (addrcell && *addrcell == 2) {
+		regbuf[0] = 0;
+		regbuf[1] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
+		len = 2;
+	} else {
+		regbuf[0] = CONFIG_SYS_MPC85xx_USB2_OFFSET;
+		len = 1;
+	}
+
+	if (sizecell && *sizecell == 2) {
+		regbuf[len] = 0;
+		regbuf[len + 1] = 0x1000;
+		len = 2;
+	} else {
+		regbuf[len] = 0x1000;
+		len++;
+	}
+
+	err = fdt_setprop(blob, off, "reg", regbuf, len * sizeof(u32));
+	if (err < 0)
+		printf("WARNING: could not set <%s> %s\n",
+					"reg", fdt_strerror(err));
+
+	irqbuf[0] = 0x2e;
+	irqbuf[1] = 0x2;
+
+	err = fdt_setprop(blob, off, "interrupts", irqbuf, 2 * sizeof(u32));
+	if (err < 0)
+		printf("WARNING: could not set %s %s\n",
+				"interrupts", fdt_strerror(err));
+
+	ph = fdt_getprop(blob, lbcoff, "interrupt-parent", 0);
+	if (!ph) {
+		printf("WARNING: could not read interrupt-parent property\n");
+		return;
+	}
+
+	err = fdt_setprop(blob, off, "interrupt-parent", ph, sizeof(u32));
+	if (err < 0)
+		printf("WARNING: could not set %s %s\n",
+				"interrupt-parent", fdt_strerror(err));
+}
+
+void ft_board_setup(void *blob, bd_t *bd)
+{
+	phys_addr_t base;
+	phys_size_t size;
+	int agent;
+
+	ft_cpu_setup(blob, bd);
+
+	base = getenv_bootm_low();
+	size = getenv_bootm_size();
+
+#if defined(CONFIG_PCI)
+	ft_pci_board_setup(blob);
+#endif
+
+	fdt_fixup_memory(blob, (u64)base, (u64)size);
+
+	if (!hwconfig("usb2"))
+		return;
+
+	agent = hwconfig_subarg_cmp("usb2", "dr_mode", "peripheral");
+
+	/*
+	 * Add the 2nd usb node and enable it. eLBC will
+	 * now be disabled since it is MUXed with USB2
+	 */
+
+	fdt_fixup_add_2nd_usb(blob, agent);
+}
+#endif
diff --git a/board/freescale/p2020come/tlb.c b/board/freescale/p2020come/tlb.c
new file mode 100644
index 0000000..e1dd056
--- /dev/null
+++ b/board/freescale/p2020come/tlb.c
@@ -0,0 +1,100 @@ 
+/*
+ * Copyright 2011 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/mmu.h>
+
+struct fsl_e_tlb_entry tlb_table[] = {
+	/* TLB 0 - for temp stack in cache */
+	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR,
+			CONFIG_SYS_INIT_RAM_ADDR_PHYS,
+			MAS3_SX|MAS3_SW|MAS3_SR, 0,
+			0, 0, BOOKE_PAGESZ_4K, 0),
+	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024 ,
+			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
+			MAS3_SX|MAS3_SW|MAS3_SR, 0,
+			0, 0, BOOKE_PAGESZ_4K, 0),
+	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024 ,
+			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
+			MAS3_SX|MAS3_SW|MAS3_SR, 0,
+			0, 0, BOOKE_PAGESZ_4K, 0),
+	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024 ,
+			CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
+			MAS3_SX|MAS3_SW|MAS3_SR, 0,
+			0, 0, BOOKE_PAGESZ_4K, 0),
+
+	/* TLB 1 */
+	/* *I*** - Covers boot page */
+	SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 0, BOOKE_PAGESZ_4K, 1),
+
+	/* *I*G* - CCSRBAR */
+	SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 1, BOOKE_PAGESZ_1M, 1),
+
+#if defined(CONFIG_PCI)
+	/* *I*G* - PCI3 - PCI2 0x8000,0000 - 0xbfff,ffff, size = 1G */
+	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_MEM_VIRT, CONFIG_SYS_PCIE3_MEM_PHYS,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 2, BOOKE_PAGESZ_1G, 1),
+
+	/* *I*G* - PCI1 0xC000,0000 - 0xcfff,ffff, size = 256M */
+	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_VIRT,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 3, BOOKE_PAGESZ_256M, 1),
+
+
+	/* *I*G* - PCI1  0xD000,0000 - 0xDFFF,FFFF, size = 256M */
+	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
+			CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 4, BOOKE_PAGESZ_256M, 1),
+
+	/*
+	 * *I*G* - PCI I/O
+	 *
+	 * PCI3 => 0xFFC10000
+	 * PCI2 => 0xFFC2,0000
+	 * PCI1 => 0xFFC3,0000
+	 */
+	SET_TLB_ENTRY(1, CONFIG_SYS_PCIE3_IO_VIRT, CONFIG_SYS_PCIE3_IO_PHYS,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 5, BOOKE_PAGESZ_256K, 1),
+#endif /* #if defined(CONFIG_PCI) */
+
+#if defined(CONFIG_SYS_RAMBOOT)
+	/* *I*G - DDR3  2G     Part 1: 0 - 0x3fff,ffff , size = 1G */
+	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 6, BOOKE_PAGESZ_1G, 1),
+
+	/*        DDR3  2G     Part 2: 0x4000,0000 - 0x7fff,ffff , size = 1G */
+	SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
+			CONFIG_SYS_DDR_SDRAM_BASE + 0x40000000,
+			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
+			0, 7, BOOKE_PAGESZ_1G, 1),
+#endif
+};
+
+int num_tlb_entries = ARRAY_SIZE(tlb_table);
diff --git a/boards.cfg b/boards.cfg
index 8b7a03b..4e1f663 100644
--- a/boards.cfg
+++ b/boards.cfg
@@ -714,6 +714,8 @@  P2020RDB-PC_36BIT            powerpc     mpc85xx     p1_p2_rdb_pc        freesca
 P2020RDB-PC_36BIT_NAND       powerpc     mpc85xx     p1_p2_rdb_pc        freescale      -           p1_p2_rdb_pc:P2020RDB,36BIT,NAND
 P2020RDB-PC_36BIT_SDCARD     powerpc     mpc85xx     p1_p2_rdb_pc        freescale      -           p1_p2_rdb_pc:P2020RDB,36BIT,SDCARD
 P2020RDB-PC_36BIT_SPIFLASH   powerpc     mpc85xx     p1_p2_rdb_pc        freescale      -           p1_p2_rdb_pc:P2020RDB,36BIT,SPIFLASH
+P2020COME_SDCARD             powerpc     mpc85xx     p2020come           freescale      -           P2020COME:SDCARD
+P2020COME_SPIFLASH           powerpc     mpc85xx     p2020come           freescale      -           P2020COME:SPIFLASH
 P2041RDB                     powerpc     mpc85xx     p2041rdb            freescale
 P2041RDB_SDCARD              powerpc     mpc85xx     p2041rdb            freescale      -           P2041RDB:RAMBOOT_PBL,SDCARD,SYS_TEXT_BASE=0xFFF80000
 P2041RDB_SECURE_BOOT         powerpc     mpc85xx     p2041rdb            freescale      -           P2041RDB:SECURE_BOOT
diff --git a/include/configs/P2020COME.h b/include/configs/P2020COME.h
new file mode 100644
index 0000000..c2a807c
--- /dev/null
+++ b/include/configs/P2020COME.h
@@ -0,0 +1,569 @@ 
+/*
+ * Copyright 2009-2010 Freescale Semiconductor, Inc.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/* The P2020COME board is only booted via RAM */
+#define CONFIG_SYS_RAMBOOT
+#define CONFIG_SYS_EXTRA_ENV_RELOC
+
+#define CONFIG_SYS_TEXT_BASE		0x11000000
+#define CONFIG_RESET_VECTOR_ADDRESS	0x1107fffc
+
+#ifdef CONFIG_SDCARD
+#define CONFIG_RAMBOOT_SDCARD		1
+#endif
+
+#ifdef CONFIG_SPIFLASH
+#define CONFIG_RAMBOOT_SPIFLASH		1
+#endif
+
+#ifndef CONFIG_SYS_MONITOR_BASE
+#define CONFIG_SYS_MONITOR_BASE	CONFIG_SYS_TEXT_BASE	/* start of monitor */
+#endif
+
+/* High Level Configuration Options */
+#define CONFIG_BOOKE		1	/* BOOKE */
+#define CONFIG_E500		1	/* BOOKE e500 family */
+#define CONFIG_MPC85xx		1	/* MPC8540/60/55/41/48/P1020/P2020,etc*/
+#define CONFIG_P2020		1
+#define CONFIG_P2020COME	1
+#define CONFIG_FSL_ELBC		1	/* Enable eLBC Support */
+#define CONFIG_MP
+
+#define CONFIG_PCI		1	/* Enable PCI/PCIE */
+#if defined(CONFIG_PCI)
+#define CONFIG_PCIE1		1	/* PCIE controller 1 (slot 1) */
+#define CONFIG_PCIE2		1	/* PCIE controller 2 (slot 2) */
+#define CONFIG_PCIE3		1	/* PCIE controller 3 (slot 3) */
+
+#define CONFIG_FSL_PCI_INIT	1	/* Use common FSL init code */
+#define CONFIG_FSL_PCIE_RESET	1	/* need PCIe reset errata */
+#define CONFIG_SYS_PCI_64BIT	1	/* enable 64-bit PCI resources */
+#endif /* #if defined(CONFIG_PCI) */
+#define CONFIG_FSL_LAW		1	/* Use common FSL init code */
+#define CONFIG_TSEC_ENET		/* tsec ethernet support */
+#define CONFIG_ENV_OVERWRITE
+
+#if defined(CONFIG_PCI)
+#define CONFIG_E1000		1	/* E1000 pci Ethernet card */
+#endif
+
+#ifndef __ASSEMBLY__
+extern unsigned long get_board_sys_clk(unsigned long dummy);
+#endif
+
+/*
+ * For P2020COME DDRCLK and SYSCLK are from the same oscillator
+ * For DA phase the SYSCLK is 66MHz
+ * For EA phase the SYSCLK is 100MHz
+ */
+#define CONFIG_DDR_CLK_FREQ	get_board_ddr_clk(0)
+#define CONFIG_SYS_CLK_FREQ	get_board_sys_clk(0)
+
+#define CONFIG_HWCONFIG
+
+/*
+ * These can be toggled for performance analysis, otherwise use default.
+ */
+#define CONFIG_L2_CACHE			/* toggle L2 cache */
+#define CONFIG_BTB			/* toggle branch prediction */
+
+#define CONFIG_ADDR_STREAMING		/* toggle addr streaming */
+
+#define CONFIG_ENABLE_36BIT_PHYS	1
+
+#ifdef CONFIG_PHYS_64BIT
+#define CONFIG_ADDR_MAP			1
+#define CONFIG_SYS_NUM_ADDR_MAP		16	/* number of TLB1 entries */
+#endif
+
+#define CONFIG_SYS_MEMTEST_START	0x00000000	/* memtest works on */
+#define CONFIG_SYS_MEMTEST_END		0x1fffffff
+#define CONFIG_PANIC_HANG	/* do not reset board on panic */
+
+
+
+
+
+
+
+ /*
+  * Config the L2 Cache as L2 SRAM
+  */
+#define CONFIG_SYS_INIT_L2_ADDR		0xf8f80000
+#ifdef CONFIG_PHYS_64BIT
+#define CONFIG_SYS_INIT_L2_ADDR_PHYS	0xff8f80000ull
+#else
+#define CONFIG_SYS_INIT_L2_ADDR_PHYS	CONFIG_SYS_INIT_L2_ADDR
+#endif
+#define CONFIG_SYS_L2_SIZE		(512 << 10)
+#define CONFIG_SYS_INIT_L2_END		(CONFIG_SYS_INIT_L2_ADDR \
+					+ CONFIG_SYS_L2_SIZE)
+
+#define CONFIG_SYS_CCSRBAR		0xffe00000
+#define CONFIG_SYS_CCSRBAR_PHYS_LOW	CONFIG_SYS_CCSRBAR
+
+/* DDR Setup */
+#define CONFIG_FSL_DDR2
+#undef CONFIG_FSL_DDR_INTERACTIVE
+#undef CONFIG_SPD_EEPROM		/* Use SPD EEPROM for DDR setup */
+
+#define CONFIG_MEM_INIT_VALUE		0xdeadbeef
+
+#define CONFIG_SYS_SDRAM_SIZE		2048ULL	/* DDR size on P2020COME */
+#define CONFIG_SYS_DDR_SDRAM_BASE	0x00000000
+#define CONFIG_SYS_SDRAM_BASE		CONFIG_SYS_DDR_SDRAM_BASE
+
+#define CONFIG_NUM_DDR_CONTROLLERS	1
+#define CONFIG_DIMM_SLOTS_PER_CTLR	1
+#define CONFIG_CHIP_SELECTS_PER_CTRL	1
+
+#define CONFIG_SYS_DDR_ERR_INT_EN	0x0000000d
+#define CONFIG_SYS_DDR_ERR_DIS		0x00000000
+#define CONFIG_SYS_DDR_SBE		0x00FF0000
+
+/*
+ * Memory map
+ *
+ * 0x0000_0000	0x7fff_ffff	DDR3			2G Cacheable
+ * 0x8000_0000	0x9fff_ffff	PCI Express 3 Mem	1G non-cacheable
+ * 0xa000_0000	0xbfff_ffff	PCI Express 2 Mem	1G non-cacheable
+ * 0xc000_0000	0xdfff_ffff	PCI Express 1 Mem	1G non-cacheable
+ * 0xffc1_0000	0xffc1_ffff	PCI Express 3 IO	64K non-cacheable
+ * 0xffc2_0000	0xffc2_ffff	PCI Express 2 IO	64K non-cacheable
+ * 0xffc3_0000	0xffc3_ffff	PCI Express 1 IO	64K non-cacheable
+ *
+ * 0xffd0_0000	0xffd0_3fff	L1 for stack		16K Cacheable TLB0
+ * 0xffe0_0000	0xffef_ffff	CCSR			1M non-cacheable
+ */
+
+/*
+ * Local Bus Definitions
+ */
+
+/* There is no NOR Flash on P2020COME */
+#define CONFIG_SYS_NO_FLASH
+
+#define CONFIG_BOARD_EARLY_INIT_R	/* call board_early_init_r function */
+#define CONFIG_HWCONFIG
+
+#define CONFIG_SYS_INIT_RAM_LOCK	1
+#define CONFIG_SYS_INIT_RAM_ADDR	0xffd00000	/* stack in RAM */
+#ifdef CONFIG_PHYS_64BIT
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH	0xf
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW	CONFIG_SYS_INIT_RAM_ADDR
+/* the assembler doesn't like typecast */
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS \
+	((CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH * 1ull << 32) | \
+	  CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW)
+#else
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS	CONFIG_SYS_INIT_RAM_ADDR
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH 0
+#define CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW CONFIG_SYS_INIT_RAM_ADDR_PHYS
+#endif
+#define CONFIG_SYS_INIT_RAM_SIZE	0x00004000
+
+#define CONFIG_SYS_GBL_DATA_OFFSET	(CONFIG_SYS_INIT_RAM_SIZE \
+						- GENERATED_GBL_DATA_SIZE)
+#define CONFIG_SYS_INIT_SP_OFFSET	CONFIG_SYS_GBL_DATA_OFFSET
+
+#define CONFIG_SYS_MONITOR_LEN		(256 * 1024)
+#define CONFIG_SYS_MALLOC_LEN		(1024 * 1024)
+
+/* Serial Port - controlled on board with jumper J8
+ * open - index 2
+ * shorted - index 1
+ */
+#define CONFIG_CONS_INDEX		1
+#define CONFIG_SYS_NS16550
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE	1
+#define CONFIG_SYS_NS16550_CLK		get_bus_freq(0)
+
+#define CONFIG_SERIAL_MULTI	1 /* Enable both serial ports */
+#define CONFIG_SYS_CONSOLE_IS_IN_ENV	/* determine from environment */
+
+#define CONFIG_SYS_BAUDRATE_TABLE   \
+	{300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 115200}
+
+#define CONFIG_SYS_NS16550_COM1	(CONFIG_SYS_CCSRBAR+0x4500)
+#define CONFIG_SYS_NS16550_COM2	(CONFIG_SYS_CCSRBAR+0x4600)
+
+/* Use the HUSH parser */
+#define CONFIG_SYS_HUSH_PARSER
+#ifdef CONFIG_SYS_HUSH_PARSER
+#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
+#endif
+
+/*
+ * Pass open firmware flat tree
+ */
+#define CONFIG_OF_LIBFDT		1
+#define CONFIG_OF_BOARD_SETUP		1
+#define CONFIG_OF_STDOUT_VIA_ALIAS	1
+
+/* new uImage format support */
+#define CONFIG_FIT			1
+#define CONFIG_FIT_VERBOSE		1
+
+/* I2C */
+#define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
+#define CONFIG_HARD_I2C		/* I2C with hardware support */
+#undef  CONFIG_SOFT_I2C		/* I2C bit-banged */
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_I2C_CMD_TREE
+#define CONFIG_SYS_I2C_SPEED		400000  /* I2C speed and slave address*/
+#define CONFIG_SYS_I2C_SLAVE		0x7F
+#define CONFIG_SYS_I2C_NOPROBES		{ {0, 0x29} }
+#define CONFIG_SYS_I2C_OFFSET		0x3000
+#define CONFIG_SYS_I2C2_OFFSET		0x3100
+
+/*
+ * I2C2 EEPROM
+ */
+#define CONFIG_ID_EEPROM
+#ifdef CONFIG_ID_EEPROM
+#define CONFIG_SYS_I2C_EEPROM_NXID
+#endif
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
+#define CONFIG_SYS_I2C_EEPROM_ADDR2	0x18
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1
+#define CONFIG_SYS_EEPROM_BUS_NUM	0
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	10 /* and takes up to 10 msec */
+
+/*
+ * eSPI - Enhanced SPI
+ */
+#define CONFIG_FSL_ESPI
+#define CONFIG_SPI_FLASH
+#define CONFIG_SPI_FLASH_STMICRO
+#define CONFIG_CMD_SF
+#define CONFIG_SF_DEFAULT_SPEED		10000000
+#define CONFIG_SF_DEFAULT_MODE		SPI_MODE_0
+
+/*
+ * General PCI
+ * Memory space is mapped 1-1, but I/O space must start from 0.
+ */
+#if defined(CONFIG_PCI)
+
+/* controller 3, Slot 3, tgtid 3, Base address 8000 */
+#define CONFIG_SYS_PCIE3_MEM_VIRT	0x80000000
+#define CONFIG_SYS_PCIE3_MEM_BUS	0x80000000
+#define CONFIG_SYS_PCIE3_MEM_PHYS	0x80000000
+#define CONFIG_SYS_PCIE3_MEM_SIZE	0x20000000  /* 512M */
+#define CONFIG_SYS_PCIE3_IO_VIRT	0xffc10000
+#define CONFIG_SYS_PCIE3_IO_BUS		0x00000000
+#define CONFIG_SYS_PCIE3_IO_PHYS	0xffc10000
+#define CONFIG_SYS_PCIE3_IO_SIZE	0x00010000  /* 64k */
+
+/* controller 2, Slot 2, tgtid 2, Base address 9000 */
+#define CONFIG_SYS_PCIE2_MEM_VIRT	0xa0000000
+#define CONFIG_SYS_PCIE2_MEM_BUS	0xa0000000
+#define CONFIG_SYS_PCIE2_MEM_PHYS	0xa0000000
+#define CONFIG_SYS_PCIE2_MEM_SIZE	0x20000000  /* 512M */
+#define CONFIG_SYS_PCIE2_IO_VIRT	0xffc20000
+#define CONFIG_SYS_PCIE2_IO_BUS		0x00000000
+#define CONFIG_SYS_PCIE2_IO_PHYS	0xffc20000
+#define CONFIG_SYS_PCIE2_IO_SIZE	0x00010000  /* 64k */
+
+/* controller 1, Slot 1, tgtid 1, Base address a000 */
+#define CONFIG_SYS_PCIE1_MEM_VIRT	0xc0000000
+#define CONFIG_SYS_PCIE1_MEM_BUS	0xc0000000
+#define CONFIG_SYS_PCIE1_MEM_PHYS	0xc0000000
+#define CONFIG_SYS_PCIE1_MEM_SIZE	0x20000000  /* 512M */
+#define CONFIG_SYS_PCIE1_IO_VIRT	0xffc30000
+#define CONFIG_SYS_PCIE1_IO_BUS		0x00000000
+#define CONFIG_SYS_PCIE1_IO_PHYS	0xffc30000
+#define CONFIG_SYS_PCIE1_IO_SIZE	0x00010000  /* 64k */
+
+#define CONFIG_PCI_PNP			/* do pci plug-and-play */
+
+#undef CONFIG_EEPRO100
+#undef CONFIG_TULIP
+#undef CONFIG_RTL8139
+
+#ifdef CONFIG_RTL8139
+/* This macro is used by RTL8139 but not defined in PPC architecture */
+#define KSEG1ADDR(x)		(x)
+#define _IO_BASE		0x00000000
+#endif
+
+
+#define CONFIG_PCI_SCAN_SHOW		/* show pci devices on startup */
+#define CONFIG_DOS_PARTITION
+
+#endif	/* CONFIG_PCI */
+
+#if defined(CONFIG_TSEC_ENET)
+#define CONFIG_MII		1	/* MII PHY management */
+#define CONFIG_MII_DEFAULT_TSEC	1	/* Allow unregistered phys */
+#define CONFIG_TSEC1		1
+#define CONFIG_TSEC1_NAME	"eTSEC1"
+#define CONFIG_TSEC2		1
+#define CONFIG_TSEC2_NAME	"eTSEC2"
+#define CONFIG_TSEC3		1
+#define CONFIG_TSEC3_NAME	"eTSEC3"
+
+#define TSEC1_PHY_ADDR		0
+#define TSEC2_PHY_ADDR		2
+#define TSEC3_PHY_ADDR		1
+
+#undef CONFIG_VSC7385_ENET
+
+#define TSEC1_FLAGS		(TSEC_GIGABIT | TSEC_REDUCED)
+#define TSEC2_FLAGS		(TSEC_GIGABIT | TSEC_REDUCED)
+#define TSEC3_FLAGS		(TSEC_GIGABIT | TSEC_REDUCED)
+
+#define TSEC1_PHYIDX		0
+#define TSEC2_PHYIDX		0
+#define TSEC3_PHYIDX		0
+
+#define CONFIG_ETHPRIME		"eTSEC1"
+
+#define CONFIG_PHY_GIGE		1	/* Include GbE speed/duplex detection */
+
+#endif	/* CONFIG_TSEC_ENET */
+
+/*
+ * Environment
+ */
+#if defined(CONFIG_RAMBOOT_SDCARD)
+	#define CONFIG_ENV_IS_IN_MMC	1
+	#define CONFIG_ENV_SIZE		0x2000
+	#define CONFIG_SYS_MMC_ENV_DEV	0
+#elif defined(CONFIG_RAMBOOT_SPIFLASH)
+	#define CONFIG_ENV_IS_IN_SPI_FLASH
+	#define CONFIG_ENV_SPI_BUS	0
+	#define CONFIG_ENV_SPI_CS	0
+	#define CONFIG_ENV_SPI_MAX_HZ	10000000
+	#define CONFIG_ENV_SPI_MODE	0
+	#define CONFIG_ENV_OFFSET	0x100000	/* 1MB */
+	#define CONFIG_ENV_SECT_SIZE	0x10000
+	#define CONFIG_ENV_SIZE		0x2000
+#endif
+
+#define CONFIG_LOADS_ECHO		1
+#define CONFIG_SYS_LOADS_BAUD_CHANGE	1
+
+/*
+ * Command line configuration.
+ */
+#include <config_cmd_default.h>
+
+#define CONFIG_CMD_ELF
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_IRQ
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_SETEXPR
+#define CONFIG_CMD_REGINFO
+
+#if defined(CONFIG_PCI)
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PCI
+#endif
+
+#undef CONFIG_WATCHDOG			/* watchdog disabled */
+
+#define CONFIG_MMC	1
+
+#ifdef CONFIG_MMC
+#define CONFIG_BOARD_EARLY_INIT_F	1	/* Call board_pre_init */
+#define CONFIG_CMD_MMC
+#define CONFIG_DOS_PARTITION
+#define CONFIG_FSL_ESDHC
+#define CONFIG_GENERIC_MMC
+#define CONFIG_SYS_FSL_ESDHC_ADDR	CONFIG_SYS_MPC85xx_ESDHC_ADDR
+#define CONFIG_SYS_FSL_ESDHC_BROKEN_TIMEOUT
+#endif /* CONFIG_MMC */
+
+#define CONFIG_USB_EHCI
+
+#ifdef CONFIG_USB_EHCI
+#define CONFIG_CMD_USB
+#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
+#define CONFIG_USB_EHCI_FSL
+#define CONFIG_USB_STORAGE
+#define CONFIG_HAS_FSL_DR_USB
+#endif
+
+#if defined(CONFIG_MMC) || defined(CONFIG_USB_EHCI)
+#define CONFIG_CMD_EXT2
+#define CONFIG_CMD_FAT
+#define CONFIG_DOS_PARTITION
+#endif
+
+/* Misc Extra Settings */
+#define CONFIG_SYS_64BIT_VSPRINTF	1
+#define CONFIG_SYS_64BIT_STRTOUL	1
+#define CONFIG_CMD_DHCP			1
+
+#define CONFIG_CMD_DATE			1
+#define CONFIG_RTC_M41T62		1
+#define CONFIG_SYS_RTC_BUS_NUM		1
+#define CONFIG_SYS_I2C_RTC_ADDR		0x68
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP			/* undef to save memory */
+#define CONFIG_CMDLINE_EDITING			/* Command-line editing */
+#define CONFIG_AUTO_COMPLETE	1		/* add autocompletion support */
+#define CONFIG_SYS_LOAD_ADDR	0x2000000	/* default load address */
+#define CONFIG_SYS_PROMPT	"=> "		/* Monitor Command Prompt */
+#if defined(CONFIG_CMD_KGDB)
+#define CONFIG_SYS_CBSIZE	1024		/* Console I/O Buffer Size */
+#else
+#define CONFIG_SYS_CBSIZE	256		/* Console I/O Buffer Size */
+#endif
+#define CONFIG_SYS_PBSIZE	(CONFIG_SYS_CBSIZE+sizeof(CONFIG_SYS_PROMPT)+16)
+						/* Print Buffer Size */
+#define CONFIG_SYS_MAXARGS	16		/* max number of command args */
+#define CONFIG_SYS_BARGSIZE	CONFIG_SYS_CBSIZE/* Boot Argument Buffer Size */
+#define CONFIG_SYS_HZ		1000		/* decrementer freq: 1ms tick */
+
+/*
+ * For booting Linux, the board info and command line data
+ * have to be in the first 64 MB of memory, since this is
+ * the maximum mapped by the Linux kernel during initialization.
+ */
+#define CONFIG_SYS_BOOTMAPSZ	(64 << 20)
+#define CONFIG_SYS_BOOTM_LEN	(64 << 20)
+
+#if defined(CONFIG_CMD_KGDB)
+#define CONFIG_KGDB_BAUDRATE	230400	/* speed to run kgdb serial port */
+#define CONFIG_KGDB_SER_INDEX	2	/* which serial port to use */
+#endif
+
+/*
+ * Environment Configuration
+ */
+
+/* The mac addresses for all ethernet interface */
+#if defined(CONFIG_TSEC_ENET)
+#define CONFIG_HAS_ETH0
+#define CONFIG_HAS_ETH1
+#define CONFIG_HAS_ETH2
+#define CONFIG_HAS_ETH3
+#endif
+
+#define CONFIG_HOSTNAME		unknown
+#define CONFIG_ROOTPATH		"/opt/nfsroot"
+#define CONFIG_BOOTFILE		"uImage"
+#define CONFIG_UBOOTPATH	u-boot.bin
+
+/* default location for tftp and bootm */
+#define CONFIG_LOADADDR		1000000
+
+#define CONFIG_BOOTDELAY	10	/* -1 disables auto-boot */
+#undef  CONFIG_BOOTARGS			/* the boot command will set bootargs */
+
+#define CONFIG_BAUDRATE		115200
+
+#define CONFIG_EXTRA_ENV_SETTINGS					\
+	"bootcmd=run sdboot\0"						\
+	"sdboot=setenv bootargs root=/dev/mmcblk0p2 rw "		\
+		"rootdelay=$rootdelaysecond console=$consoledev,$baudrate "\
+		"$othbootargs; mmcinfo; "				\
+		"ext2load mmc 0:2 $loadaddr /boot/$bootfile; "		\
+		"ext2load mmc 0:2 $fdtaddr /boot/$fdtfile; "		\
+		"bootm $loadaddr - $fdtaddr\0"				\
+	"sdfatboot=setenv bootargs root=/dev/ram rw "			\
+		"rootdelay=$rootdelaysecond console=$consoledev,$baudrate "\
+		"$othbootargs; mmcinfo; "				\
+		"fatload mmc 0:1 $loadaddr $bootfile; "			\
+		"fatload mmc 0:1 $fdtaddr $fdtfile; "			\
+		"fatload mmc 0:1 $ramdiskaddr $ramdiskfile; "		\
+		"bootm $loadaddr $ramdiskaddr $fdtaddr\0"		\
+	"usbboot=setenv bootargs root=/dev/sda1 rw "			\
+		"rootdelay=$rootdelaysecond console=$consoledev,$baudrate "\
+		"$othbootargs; "					\
+		"usb start; "						\
+		"ext2load usb 0:1 $loadaddr /boot/$bootfile; "		\
+		"ext2load usb 0:1 $fdtaddr /boot/$fdtfile; "		\
+		"bootm $loadaddr - $fdtaddr\0"				\
+	"usbfatboot=setenv bootargs root=/dev/ram rw "			\
+		"console=$consoledev,$baudrate $othbootargs; "		\
+		"usb start; "						\
+		"fatload usb 0:2 $loadaddr $bootfile; "			\
+		"fatload usb 0:2 $fdtaddr $fdtfile; "			\
+		"fatload usb 0:2 $ramdiskaddr $ramdiskfile; "		\
+		"bootm $loadaddr $ramdiskaddr $fdtaddr\0"		\
+	"usbext2boot=setenv bootargs root=/dev/ram rw "			\
+		"console=$consoledev,$baudrate $othbootargs; "		\
+		"usb start; "						\
+		"ext2load usb 0:4 $loadaddr $bootfile; "		\
+		"ext2load usb 0:4 $fdtaddr $fdtfile; "			\
+		"ext2load usb 0:4 $ramdiskaddr $ramdiskfile; "		\
+		"bootm $loadaddr $ramdiskaddr $fdtaddr\0"		\
+	"upgradespi=sf probe 0; "					\
+		"setenv startaddr 0; "					\
+		"setenv erasesize a0000; "				\
+		"tftp 1000000 $tftppath/$uboot_spi; "			\
+		"sf erase $startaddr $erasesize; "			\
+		"sf write 1000000 $startaddr $filesize; "		\
+		"sf erase 100000 120000\0"				\
+	"clearspienv=sf probe 0;sf erase 100000 20000\0"		\
+	"othbootargs=ramdisk_size=700000 cache-sram-size=0x10000\0"	\
+	"netdev=eth0\0"							\
+	"rootdelaysecond=15\0"						\
+	"uboot_nor=u-boot-nor.bin\0"					\
+	"uboot_spi=u-boot-p2020.spi\0"					\
+	"uboot_sd=u-boot-p2020.bin\0"					\
+	"consoledev=ttyS0\0"						\
+	"ramdiskaddr=2000000\0"						\
+	"ramdiskfile=rootfs-dev.ext2.img\0"				\
+	"fdtaddr=c00000\0"						\
+	"fdtfile=uImage-2.6.32-p2020.dtb\0"				\
+	"tftppath=p2020\0"
+
+#define CONFIG_HDBOOT							\
+	"setenv bootargs root=/dev/$bdev rw rootdelay=30 "		\
+	"console=$consoledev,$baudrate $othbootargs;"			\
+	"usb start;"							\
+	"ext2load usb 0:1 $loadaddr /boot/$bootfile;"			\
+	"ext2load usb 0:1 $fdtaddr /boot/$fdtfile;"			\
+	"bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_NFSBOOTCOMMAND						\
+	"setenv bootargs root=/dev/nfs rw "				\
+	"nfsroot=$serverip:$rootpath "					\
+	"ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off "\
+	"console=$consoledev,$baudrate $othbootargs;"			\
+	"tftp $loadaddr $tftppath/$bootfile;"				\
+	"tftp $fdtaddr $tftppath/$fdtfile;"				\
+	"bootm $loadaddr - $fdtaddr"
+
+#define CONFIG_RAMBOOTCOMMAND						\
+	"setenv bootargs root=/dev/ram rw "				\
+	"console=$consoledev,$baudrate $othbootargs;"			\
+	"tftp $ramdiskaddr $tftppath/$ramdiskfile;"			\
+	"tftp $loadaddr $tftppath/$bootfile;"				\
+	"tftp $fdtaddr $tftppath/$fdtfile;"				\
+	"bootm $loadaddr $ramdiskaddr $fdtaddr"
+
+#define CONFIG_BOOTCOMMAND		CONFIG_HDBOOT
+
+#endif  /* __CONFIG_H */