diff options
| author | Mingkai Hu <Mingkai.Hu@freescale.com> | 2013-07-04 17:33:43 +0800 | 
|---|---|---|
| committer | York Sun <yorksun@freescale.com> | 2013-08-09 12:41:42 -0700 | 
| commit | a8d9758d0162f2eb8589be9d60b833241f043c6d (patch) | |
| tree | db43b08523ff4336f28edd0db2a74c26dc7fc9c1 /board/freescale/c29xpcie/c29xpcie.c | |
| parent | 3b75e98273532ed0135846345e367ac4992b1a51 (diff) | |
| download | olio-uboot-2014.01-a8d9758d0162f2eb8589be9d60b833241f043c6d.tar.xz olio-uboot-2014.01-a8d9758d0162f2eb8589be9d60b833241f043c6d.zip | |
powerpc/c29xpcie: add support for C29XPCIE board
C29XPCIE board is a series of Freescale PCIe add-in cards to perform
as public key crypto accelerator or secure key management module. It
includes C293PCIE board, C293PCIE board and C291PCIE board.
 - 512KB platform SRAM in addition to 512K L2 Cache/SRAM
 - 512MB soldered DDR3 32bit memory
 - CPLD System Logic
 - 64MB x16 NOR flash and 4GB x8 NAND flash
 - 16MB SPI flash
Signed-off-by: Mingkai Hu <Mingkai.Hu@freescale.com>
Singed-off-by: Po Liu <Po.Liu@freescale.com>
[yorksun: Fixup include/configs/C29XPCIE.h]
Signed-off-by: York Sun <yorksun@freescale.com>
Diffstat (limited to 'board/freescale/c29xpcie/c29xpcie.c')
| -rw-r--r-- | board/freescale/c29xpcie/c29xpcie.c | 151 | 
1 files changed, 151 insertions, 0 deletions
| diff --git a/board/freescale/c29xpcie/c29xpcie.c b/board/freescale/c29xpcie/c29xpcie.c new file mode 100644 index 000000000..acc59d2a0 --- /dev/null +++ b/board/freescale/c29xpcie/c29xpcie.c @@ -0,0 +1,151 @@ +/* + * Copyright 2013 Freescale Semiconductor, Inc. + * + * 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. + */ + +#include <common.h> +#include <asm/processor.h> +#include <asm/mmu.h> +#include <asm/cache.h> +#include <asm/immap_85xx.h> +#include <asm/io.h> +#include <miiphy.h> +#include <libfdt.h> +#include <fdt_support.h> +#include <fsl_mdio.h> +#include <tsec.h> +#include <mmc.h> +#include <netdev.h> +#include <pci.h> +#include <asm/fsl_ifc.h> +#include <asm/fsl_pci.h> + +#include "cpld.h" + +DECLARE_GLOBAL_DATA_PTR; + +int checkboard(void) +{ +	struct cpu_type *cpu = gd->arch.cpu; +	struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE); + +	printf("Board: %sPCIe, ", cpu->name); +	printf("CPLD Ver: 0x%02x\n", in_8(&cpld_data->cpldver)); + +	return 0; +} + +int board_early_init_f(void) +{ +	struct fsl_ifc *ifc = (void *)CONFIG_SYS_IFC_ADDR; + +	/* Clock configuration to access CPLD using IFC(GPCM) */ +	setbits_be32(&ifc->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT); + +	return 0; +} + +int board_early_init_r(void) +{ +	const unsigned long flashbase = CONFIG_SYS_FLASH_BASE; +	const u8 flash_esel = find_tlb_idx((void *)flashbase, 1); + +	/* +	 * Remap Boot flash region to caching-inhibited +	 * so that flash can be erased properly. +	 */ + +	/* Flush d-cache and invalidate i-cache of any FLASH data */ +	flush_dcache(); +	invalidate_icache(); + +	/* invalidate existing TLB entry for flash */ +	disable_tlb(flash_esel); + +	set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS, +			MAS3_SW|MAS3_SR, MAS2_I|MAS2_G, +			0, flash_esel, BOOKE_PAGESZ_64M, 1); + +	return 0; +} + +#ifdef CONFIG_PCI +void pci_init_board(void) +{ +	fsl_pcie_init_board(0); +} +#endif /* ifdef CONFIG_PCI */ + +#ifdef CONFIG_TSEC_ENET +int board_eth_init(bd_t *bis) +{ +	struct fsl_pq_mdio_info mdio_info; +	struct tsec_info_struct tsec_info[2]; +	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 +	if (!num) { +		printf("No TSECs initialized\n"); +		return 0; +	} + +	/* Register 1G MDIO bus */ +	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_del_sec(void *blob, int offset) +{ +	int nodeoff = 0; + +	while ((nodeoff = fdt_node_offset_by_compat_reg(blob, "fsl,sec-v6.0", +			CONFIG_SYS_CCSRBAR_PHYS + CONFIG_SYS_FSL_SEC_OFFSET +			+ offset * 0x20000)) >= 0) { +		fdt_del_node(blob, nodeoff); +		offset++; +	} +} + +void ft_board_setup(void *blob, bd_t *bd) +{ +	phys_addr_t base; +	phys_size_t size; +	struct cpu_type *cpu; + +	cpu = gd->arch.cpu; + +	ft_cpu_setup(blob, bd); + +	base = getenv_bootm_low(); +	size = getenv_bootm_size(); + +#if defined(CONFIG_PCI) +	FT_FSL_PCI_SETUP; +#endif + +	fdt_fixup_memory(blob, (u64)base, (u64)size); +	if (cpu->soc_ver == SVR_C291) +		fdt_del_sec(blob, 1); +	else if (cpu->soc_ver == SVR_C292) +		fdt_del_sec(blob, 2); +} +#endif |