[U-Boot] [PATCH v4] mpq101: initial support for Mercury Computer Systems MPQ101 board

Kumar Gala galak at kernel.crashing.org
Fri Jan 14 12:51:12 CET 2011


On Jan 14, 2011, at 3:10 AM, Alex Dubov wrote:

> Mpq101 is a RapidIO development board in AMC form factor, featuring MPC8548
> processor, 512MB of hardwired DDR2 RAM, 128MB of hardwired NAND flash
> memory, real time clock and additional serial EEPROM on i2c bus (enabled).
> USB controller is available, but not presently enabled.
> 
> Additional board information is available at:
> http://www.mc.com/products/boards/ensemble_mpq101_rapidio_powerquicc_iii.aspx
> 
> Environment is configured to precede the actual u-boot image so that it's
> located at the beginning of flash erase block (made necessary by the recent
> changes to the embedded environment handling).
> 
> Signed-off-by: Alex Dubov <oakad at yahoo.com>
> ---
> Changes for v4:
>   - Replace config.mk supplied linker flags with custom linker script.
>   - Fix checkpatch errors.
> Changes for v3:
>   - Use io accessor functions for all mmio accesses.
>   - Add configuration options for RTC and EEPROM on I2C buses.
> Changes for v2:
>   - Remove some stale configuration code from board initialization functions.
> 
> MAINTAINERS                     |    3 +
> board/mercury/mpq101/Makefile   |   53 +++++
> board/mercury/mpq101/law.c      |   55 ++++++
> board/mercury/mpq101/mpq101.c   |  140 ++++++++++++++
> board/mercury/mpq101/tlb.c      |   82 ++++++++
> board/mercury/mpq101/u-boot.lds |  132 +++++++++++++
> boards.cfg                      |    1 +
> include/configs/mpq101.h        |  398 +++++++++++++++++++++++++++++++++++++++
> 8 files changed, 864 insertions(+), 0 deletions(-)
> create mode 100644 board/mercury/mpq101/Makefile
> create mode 100644 board/mercury/mpq101/law.c
> create mode 100644 board/mercury/mpq101/mpq101.c
> create mode 100644 board/mercury/mpq101/tlb.c
> create mode 100644 board/mercury/mpq101/u-boot.lds
> create mode 100644 include/configs/mpq101.h
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index d7cd09c..220c39d 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -138,6 +138,9 @@ Jon Diekema <jon.diekema at smiths-aerospace.com>
> 
> 	sbc8260		MPC8260
> 
> +Alex Dubov <oakad at yahoo.com>
> +	mpq101		MPC8548
> +
> Dirk Eibach <eibach at gdsys.de>
> 
> 	devconcenter	PPC460EX
> diff --git a/board/mercury/mpq101/Makefile b/board/mercury/mpq101/Makefile
> new file mode 100644
> index 0000000..58bc1b3
> --- /dev/null
> +++ b/board/mercury/mpq101/Makefile
> @@ -0,0 +1,53 @@
> +#
> +# Copyright 2007 Freescale Semiconductor, Inc.
> +# (C) Copyright 2001-2006
> +# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> +#
> +# 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	+= 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) $(SOBJS)
> +	$(call cmd_link_o_target, $(OBJS))
> +
> +clean:
> +	rm -f $(OBJS) $(SOBJS)
> +
> +distclean:	clean
> +	rm -f $(LIB) core *.bak .depend
> +
> +#########################################################################
> +
> +# defines $(obj).depend target
> +include $(SRCTREE)/rules.mk
> +
> +sinclude $(obj).depend
> +
> +#########################################################################
> diff --git a/board/mercury/mpq101/law.c b/board/mercury/mpq101/law.c
> new file mode 100644
> index 0000000..726b5c2
> --- /dev/null
> +++ b/board/mercury/mpq101/law.c
> @@ -0,0 +1,55 @@
> +/*
> + * Copyright 2008 Freescale Semiconductor, Inc.
> + *
> + * (C) Copyright 2000
> + * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> + *
> + * 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>
> +
> +/*
> + * LAW(Local Access Window) configuration:
> + *
> + * 0x0000_0000     0x1fff_ffff     DDR                     SYS_SDRAM_SIZE
> + * 0xc000_0000     0xdfff_ffff     RapidIO                 512M
> + * 0xe000_0000     0xe000_ffff     CCSR                    1M
> + * 0xf000_0000     0xffff_ffff     LBC options + FLASH     256M
> + *
> + * Notes:
> + *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window.
> + *    If flash is 8M at default position (last 8M), no LAW needed.
> + *
> + * LAW 0 is reserved for boot mapping
> + */
> +
> +struct law_entry law_table[] = {
> +	SET_LAW(CONFIG_SYS_SDRAM_BASE, CONFIG_SYS_SDRAM_SIZE_LOG - 1,
> +		LAW_TRGT_IF_DDR_1),
> +#ifdef CONFIG_SYS_RIO_MEM_PHYS
> +	SET_LAW(CONFIG_SYS_RIO_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_RIO),
> +#endif
> +	SET_LAW(CONFIG_SYS_LBC_OPTION_BASE_PHYS, LAW_SIZE_256M,
> +		LAW_TRGT_IF_LBC)
> +};
> +
> +int num_law_entries = ARRAY_SIZE(law_table);
> diff --git a/board/mercury/mpq101/mpq101.c b/board/mercury/mpq101/mpq101.c
> new file mode 100644
> index 0000000..8d9b518
> --- /dev/null
> +++ b/board/mercury/mpq101/mpq101.c
> @@ -0,0 +1,140 @@
> +/*
> + * (C) Copyright 2011 Alex Dubov <oakad at yahoo.com>
> + *
> + * 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/processor.h>
> +#include <asm/mmu.h>
> +#include <asm/immap_85xx.h>
> +#include <asm/fsl_law.h>
> +#include <asm/io.h>
> +#include <miiphy.h>
> +#include <libfdt.h>
> +#include <fdt_support.h>
> +
> +unsigned long get_clock_freq(void)
> +{
> +	return 33000000;
> +}
> +
> +/*
> + * Initialize Local Bus
> + */
> +void local_bus_init(void)
> +{
> +	fsl_lbc_t *lbc = LBC_BASE_ADDR;
> +
> +	out_be32(&lbc->ltesr, 0xffffffff); /* Clear LBC error interrupts */
> +	out_be32(&lbc->lteir, 0xffffffff); /* Enable LBC error interrupts */
> +}
> +
> +int checkboard(void)
> +{
> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +	ccsr_local_ecm_t *ecm = (void *)(CONFIG_SYS_MPC85xx_ECM_ADDR);
> +
> +	puts("Board: Mercury Computer Systems, Inc. MPQ-101 ");
> +#ifdef CONFIG_PHYS_64BIT
> +	puts("(36-bit addrmap) ");
> +#endif
> +	putc('\n');
> +
> +	/*
> +	 * Initialize local bus.
> +	 */
> +	local_bus_init();
> +
> +	/*
> +	 * Hack TSEC 3 and 4 IO voltages.
> +	 */
> +	out_be32(&gur->tsec34ioovcr, 0xe7e0); /*  1110 0111 1110 0xxx */
> +
> +	out_be32(&ecm->eedr, 0xffffffff); /* clear ecm errors */
> +	out_be32(&ecm->eeer, 0xffffffff); /* enable ecm errors */
> +	return 0;
> +}
> +
> +phys_size_t initdram(int board_type)
> +{
> +	ccsr_ddr_t *ddr = (void *)(CONFIG_SYS_MPC85xx_DDR_ADDR);
> +	phys_size_t dram_size = 0;
> +	const char *p_mode = getenv("perf_mode");
> +
> +	puts("Initializing....");
> +
> +	out_be32(&ddr->cs0_bnds, CONFIG_SYS_DDR_CS0_BNDS);
> +	out_be32(&ddr->cs0_config, CONFIG_SYS_DDR_CS0_CONFIG);
> +
> +	out_be32(&ddr->timing_cfg_3, CONFIG_SYS_DDR_TIMING_3);
> +	out_be32(&ddr->timing_cfg_0, CONFIG_SYS_DDR_TIMING_0);
> +
> +	if (p_mode && !strcmp("performance", p_mode)) {
> +		out_be32(&ddr->timing_cfg_1, CONFIG_SYS_DDR_TIMING_1_PERF);
> +		out_be32(&ddr->timing_cfg_2, CONFIG_SYS_DDR_TIMING_2_PERF);
> +		out_be32(&ddr->sdram_mode, CONFIG_SYS_DDR_MODE_1_PERF);
> +		out_be32(&ddr->sdram_mode_2, CONFIG_SYS_DDR_MODE_2_PERF);
> +		out_be32(&ddr->sdram_interval, CONFIG_SYS_DDR_INTERVAL_PERF);
> +	} else {
> +		out_be32(&ddr->timing_cfg_1, CONFIG_SYS_DDR_TIMING_1);
> +		out_be32(&ddr->timing_cfg_2, CONFIG_SYS_DDR_TIMING_2);
> +		out_be32(&ddr->sdram_mode, CONFIG_SYS_DDR_MODE_1);
> +		out_be32(&ddr->sdram_mode_2, CONFIG_SYS_DDR_MODE_2);
> +		out_be32(&ddr->sdram_interval, CONFIG_SYS_DDR_INTERVAL);
> +	}
> +
> +	out_be32(&ddr->sdram_clk_cntl, CONFIG_SYS_DDR_CLK_CTRL);
> +	out_be32(&ddr->sdram_cfg_2, CONFIG_SYS_DDR_CONTROL2);
> +
> +	asm("sync;isync");
> +	udelay(500);
> +
> +	out_be32(&ddr->sdram_cfg, CONFIG_SYS_DDR_CONTROL);
> +	asm("sync; isync");
> +	udelay(500);
> +
> +	dram_size = setup_ddr_tlbs(1ull << (CONFIG_SYS_SDRAM_SIZE_LOG - 20));
> +
> +	puts("    DDR: ");
> +
> +	return get_ram_size(0, dram_size << 20);
> +}
> +
> +
> +void pci_init_board(void)
> +{
> +	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
> +
> +	/* PCI is disabled */
> +	out_be32(&gur->devdisr, in_be32(&gur->devdisr)
> +				| MPC85xx_DEVDISR_PCI1
> +				| MPC85xx_DEVDISR_PCI2
> +				| MPC85xx_DEVDISR_PCIE);
> +}

> diff --git a/include/configs/mpq101.h b/include/configs/mpq101.h
> new file mode 100644
> index 0000000..33d6b69
> --- /dev/null
> +++ b/include/configs/mpq101.h
> @@ -0,0 +1,398 @@
> +/*
> + * Copyright 2011 Alex Dubov <oakad at yahoo.com>
> + *
> + * 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
> + */
> +
> +/*
> + * Merury Computers MPQ101 board configuration file
> + *
> + */
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#ifdef CONFIG_36BIT
> +# define CONFIG_PHYS_64BIT 1
> +#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 */
> +#define CONFIG_MPC8548    1 /* MPC8548 specific */
> +#define CONFIG_MPQ101     1 /* MPQ101 board specific */
> +
> +#define CONFIG_RIO        1
> +#define CONFIG_TSEC_ENET  1 /* tsec ethernet support */
> +#define CONFIG_INTERRUPTS 1 /* enable pci, srio, ddr interrupts */
> +#define CONFIG_FSL_LAW    1 /* Use common FSL init code */
> +
> +/*
> + * These can be toggled for performance analysis, otherwise use default.
> + */
> +#define CONFIG_L2_CACHE   1 /* toggle L2 cache */
> +#define CONFIG_BTB        1 /* toggle branch predition */
> +
> +#define CONFIG_PANIC_HANG 1
> +
> +/*
> + * Only possible on E500 Version 2 or newer cores.
> + */
> +#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
> +
> +#ifndef __ASSEMBLY__
> +extern unsigned long get_clock_freq(void);
> +#endif
> +
> +#define CONFIG_SYS_CLK_FREQ get_clock_freq() /* sysclk for MPC85xx */
> +
> +/*

You don't really need a function here for get_clock_freq() you can just:

#define CONFIG_SYS_CLK_FREQ 33000000

- k


More information about the U-Boot mailing list