Skip to content

Commit

Permalink
powerpc, 8xx: Add support for MCR3000 board from CSSI
Browse files Browse the repository at this point in the history
CS Systemes d'Information (CSSI) manufactures two boards, named MCR3000
and CMPC885 which are respectively based on MPC866 and MPC885 processors.

This patch adds support for the first board.

Signed-off-by: Christophe Leroy <[email protected]>
  • Loading branch information
chleroy authored and trini committed Jul 8, 2017
1 parent dd7ff47 commit 53193a4
Show file tree
Hide file tree
Showing 11 changed files with 604 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ matrix:
- BUILDMAN="corenet_ds b4860qds sbc8548 bsc91*"
- env:
- BUILDMAN="mpc86xx"
- env:
- BUILDMAN="mpc8xx"
- env:
- BUILDMAN="siemens"
- env:
Expand Down
5 changes: 5 additions & 0 deletions arch/powerpc/cpu/mpc8xx/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ choice
prompt "Target select"
optional

config TARGET_MCR3000
bool "Support MCR3000 board from CSSI"

endchoice

choice
Expand Down Expand Up @@ -167,4 +170,6 @@ config SYS_OR7_PRELIM
config SYS_IMMR
hex "Value for IMMR"

source "board/cssi/MCR3000/Kconfig"

endmenu
6 changes: 6 additions & 0 deletions board/cssi/MAINTAINERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
BOARDS from CS Systemes d'Information
M: Christophe Leroy <[email protected]>
S: Maintained
F: board/cssi/
F: include/configs/MCR3000.h
F: configs/MCR3000_defconfig
15 changes: 15 additions & 0 deletions board/cssi/MCR3000/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
if TARGET_MCR3000

config SYS_BOARD
default "MCR3000"

config SYS_VENDOR
default "cssi"

config SYS_CONFIG_NAME
default "MCR3000"

config SYS_TEXT_BASE
default 0x04000000

endif
144 changes: 144 additions & 0 deletions board/cssi/MCR3000/MCR3000.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/*
* Copyright (C) 2010-2017 CS Systemes d'Information
* Florent Trinh Thai <[email protected]>
* Christophe Leroy <[email protected]>
*
* Board specific routines for the MCR3000 board
*
* SPDX-License-Identifier: GPL-2.0+
*/

#include <common.h>
#include <hwconfig.h>
#include <mpc8xx.h>
#include <fdt_support.h>
#include <asm/io.h>

DECLARE_GLOBAL_DATA_PTR;

static const uint cs1_dram_table_66[] = {
/* DRAM - single read. (offset 0 in upm RAM) */
0x0F3DFC04, 0x0FEFBC04, 0x00BE7804, 0x0FFDF400,
0x1FFFFC05, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,

/* DRAM - burst read. (offset 8 in upm RAM) */
0x0F3DFC04, 0x0FEFBC04, 0x00BF7C04, 0x00FFFC00,
0x00FFFC00, 0x00FEF800, 0x0FFDF400, 0x1FFFFC05,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,

/* DRAM - single write. (offset 18 in upm RAM) */
0x0F3DFC04, 0x0FEFB800, 0x00BF7404, 0x0FFEF804,
0x0FFDF404, 0x1FFFFC05, 0xFFFFFFFF, 0xFFFFFFFF,

/* DRAM - burst write. (offset 20 in upm RAM) */
0x0F3DFC04, 0x0FEFB800, 0x00BF7400, 0x00FFFC00,
0x00FFFC00, 0x00FFFC04, 0x0FFEF804, 0x0FFDF404,
0x1FFFFC05, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,

/* refresh (offset 30 in upm RAM) */
0x0FFDF404, 0x0FFEBC04, 0x0FFD7C84, 0x0FFFFC04,
0x0FFFFC04, 0x0FFFFC04, 0x1FFFFC85, 0xFFFFFFFF,

/* init */
0x0FEEB874, 0x0FBD7474, 0x1FFFFC45, 0xFFFFFFFF,

/* exception. (offset 3c in upm RAM) */
0xFFFFFC05, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
};

int ft_board_setup(void *blob, bd_t *bd)
{
const char *sync = "receive";

ft_cpu_setup(blob, bd);

/* BRG */
do_fixup_by_path_u32(blob, "/soc/cpm", "brg-frequency",
bd->bi_busfreq, 1);

/* MAC addr */
fdt_fixup_ethernet(blob);

/* Bus Frequency for CPM */
do_fixup_by_path_u32(blob, "/soc", "bus-frequency", bd->bi_busfreq, 1);

/* E1 interface - Set data rate */
do_fixup_by_path_u32(blob, "/localbus/e1-wan", "data-rate", 2, 1);

/* E1 interface - Set channel phase to 0 */
do_fixup_by_path_u32(blob, "/localbus/e1-wan", "channel-phase", 0, 1);

/* E1 interface - rising edge sync pulse transmit */
do_fixup_by_path(blob, "/localbus/e1-wan", "rising-edge-sync-pulse",
sync, strlen(sync), 1);

return 0;
}

int checkboard(void)
{
serial_puts("BOARD: MCR3000 CSSI\n");

return 0;
}

int dram_init(void)
{
immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
memctl8xx_t __iomem *memctl = &immap->im_memctl;

printf("UPMA init for SDRAM (CAS latency 2), ");
printf("init address 0x%08x, size ", (int)dram_init);
/* Configure UPMA for cs1 */
upmconfig(UPMA, (uint *)cs1_dram_table_66,
sizeof(cs1_dram_table_66) / sizeof(uint));
udelay(10);
out_be16(&memctl->memc_mptpr, 0x0200);
out_be32(&memctl->memc_mamr, 0x14904000);
udelay(10);
out_be32(&memctl->memc_or1, CONFIG_SYS_OR1_PRELIM);
out_be32(&memctl->memc_br1, CONFIG_SYS_BR1_PRELIM);
udelay(10);
out_be32(&memctl->memc_mcr, 0x80002830);
out_be32(&memctl->memc_mar, 0x00000088);
out_be32(&memctl->memc_mcr, 0x80002038);
udelay(200);

gd->ram_size = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE,
SDRAM_MAX_SIZE);

return 0;
}

int misc_init_r(void)
{
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;
iop8xx_t __iomem *iop = &immr->im_ioport;

/* Set port C13 as GPIO (BTN_ACQ_AL) */
clrbits_be16(&iop->iop_pcpar, 0x4);
clrbits_be16(&iop->iop_pcdir, 0x4);

/* if BTN_ACQ_AL is pressed then bootdelay is changed to 60 second */
if ((in_be16(&iop->iop_pcdat) & 0x0004) == 0)
setenv("bootdelay", "60");

return 0;
}

int board_early_init_f(void)
{
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;

/*
* Erase FPGA(s) for reboot
*/
clrbits_be32(&immr->im_cpm.cp_pbdat, 0x00020000); /* PROGFPGA down */
setbits_be32(&immr->im_cpm.cp_pbdir, 0x00020000); /* PROGFPGA output */
udelay(1); /* Wait more than 300ns */
setbits_be32(&immr->im_cpm.cp_pbdat, 0x00020000); /* PROGFPGA up */

return 0;
}
10 changes: 10 additions & 0 deletions board/cssi/MCR3000/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#
# Copyright (C) 2010-2017 CS Systemes d'Information
# Christophe Leroy <[email protected]>
#
# SPDX-License-Identifier: GPL-2.0+
#
#

obj-y += MCR3000.o
obj-$(CONFIG_CMD_NAND) += nand.o
65 changes: 65 additions & 0 deletions board/cssi/MCR3000/nand.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (C) 2010-2017 CS Systemes d'Information
* Florent Trinh Thai <[email protected]>
* Christophe Leroy <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

#include <config.h>
#include <common.h>
#include <nand.h>
#include <asm/io.h>

#define BIT_CLE ((unsigned short)0x0800)
#define BIT_ALE ((unsigned short)0x0400)
#define BIT_NCE ((unsigned short)0x1000)

static void nand_hwcontrol(struct mtd_info *mtdinfo, int cmd, unsigned int ctrl)
{
struct nand_chip *this = mtdinfo->priv;
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;
unsigned short pddat = 0;

/* The hardware control change */
if (ctrl & NAND_CTRL_CHANGE) {
pddat = in_be16(&immr->im_ioport.iop_pddat);

/* Clearing ALE and CLE */
pddat &= ~(BIT_CLE | BIT_ALE);

/* Driving NCE pin */
if (ctrl & NAND_NCE)
pddat &= ~BIT_NCE;
else
pddat |= BIT_NCE;

/* Driving CLE and ALE pin */
if (ctrl & NAND_CLE)
pddat |= BIT_CLE;
if (ctrl & NAND_ALE)
pddat |= BIT_ALE;

out_be16(&immr->im_ioport.iop_pddat, pddat);
}

/* Writing the command */
if (cmd != NAND_CMD_NONE)
out_8(this->IO_ADDR_W, cmd);
}

int board_nand_init(struct nand_chip *nand)
{
immap_t __iomem *immr = (immap_t __iomem *)CONFIG_SYS_IMMR;

/* Set GPIO Port */
setbits_be16(&immr->im_ioport.iop_pddir, 0x1c00);
clrbits_be16(&immr->im_ioport.iop_pdpar, 0x1c00);
clrsetbits_be16(&immr->im_ioport.iop_pddat, 0x0c00, 0x1000);

nand->chip_delay = 60;
nand->ecc.mode = NAND_ECC_SOFT;
nand->cmd_ctrl = nand_hwcontrol;

return 0;
}
91 changes: 91 additions & 0 deletions board/cssi/MCR3000/u-boot.lds
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* Copyright (C) 2010-2017 CS Systemes d'Information
* Christophe Leroy <[email protected]>
*
* (C) Copyright 2001-2003
* Wolfgang Denk, DENX Software Engineering, [email protected].
*
* Modified by Yuli Barcohen <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/

OUTPUT_ARCH(powerpc)
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.text :
{
arch/powerpc/cpu/mpc8xx/start.o (.text)
arch/powerpc/cpu/mpc8xx/start.o (.text*)
arch/powerpc/cpu/mpc8xx/traps.o (.text*)
arch/powerpc/cpu/mpc8xx/built-in.o (.text*)
arch/powerpc/lib/built-in.o (.text*)
board/cssi/MCR3000/built-in.o (.text*)
disk/built-in.o (.text*)
drivers/net/built-in.o (.text*)

*(.text)
}
_etext = .;
PROVIDE (etext = .);
.rodata :
{
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
}

/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
_erotext = .;
PROVIDE (erotext = .);
.reloc :
{
_GOT2_TABLE_ = .;
KEEP(*(.got2))
KEEP(*(.got))
_FIXUP_TABLE_ = .;
KEEP(*(.fixup))
}
__got2_entries = ((_GLOBAL_OFFSET_TABLE_ - _GOT2_TABLE_) >> 2) - 1;
__fixup_entries = (. - _FIXUP_TABLE_) >> 2;

.data :
{
*(.data*)
*(.sdata*)
}
_edata = .;
PROVIDE (edata = .);

. = .;

. = ALIGN(4);
.u_boot_list : {
KEEP(*(SORT(.u_boot_list*)));
}

. = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;

. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(4096);
__init_end = .;

__bss_start = .;
.bss (NOLOAD) :
{
*(.bss*)
*(.sbss*)
*(COMMON)
. = ALIGN(4);
}
__bss_end = . ;
PROVIDE (end = .);
}
ENTRY(_start)
Loading

0 comments on commit 53193a4

Please sign in to comment.