summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/mpc55xxevb/startup/early-init.c
blob: 3b213f228aec2ffa9a417c590826019c625b6b7f (plain) (tree)




































                                                                      
                                                         






















































































































                                                                          
/**
 * @file
 *
 * @ingroup mpc55xx
 *
 * @brief BSP early initialization code.
 */

/*
 * Copyright (c) 2008-2011 embedded brains GmbH.  All rights reserved.
 *
 *  embedded brains GmbH
 *  Obere Lagerstr. 30
 *  82178 Puchheim
 *  Germany
 *  <rtems@embedded-brains.de>
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.com/license/LICENSE.
 *
 * $Id$
 */

#include <bsp/mpc55xx-config.h>
#include <bsp/linker-symbols.h>
#include <bsp/start.h>
#include <bsp.h>

#include <mpc55xx/mpc55xx.h>

#include <string.h>

#ifdef MPC55XX_BOOTFLAGS
extern uint32_t mpc55xx_bootflag_0 [];
#endif

static void BSP_START_TEXT_SECTION mpc55xx_siu_init(void)
{
  size_t i = 0;

#if defined(MPC55XX_BOARD_GWLCFM)
  SIU.GPDO[122].B.PDO=1; /* make sure USB reset is kept high */
  SIU.GPDO[121].B.PDO=1; /* make sure Ethernet reset is kept high */
  SIU.GPDO[113].B.PDO=1; /* make sure MOST Companion reset is kept high */
#endif

  for (i = 0; i < mpc55xx_siu_pcr_config_count [0]; ++i) {
     const mpc55xx_siu_pcr_config_entry *e = &mpc55xx_siu_pcr_config [i];
     int j = e->index;
     int n = j + e->count;
     uint32_t pcr = e->pcr.R;

     while (j < n) {
       SIU.PCR [j].R = pcr;
       ++j;
     }
  }
}

static void BSP_START_TEXT_SECTION mpc55xx_ebi_chip_select_init(void)
{
  size_t i = 0;

  for (i = 0; i < mpc55xx_ebi_cs_config_count [0]; ++i) {
     EBI.CS [i] = mpc55xx_ebi_cs_config [i];
  }

  for (i = 0; i < mpc55xx_ebi_cal_cs_config_count [0]; ++i) {
     EBI.CAL_CS [i] = mpc55xx_ebi_cal_cs_config [i];
  }
}

static void BSP_START_TEXT_SECTION mpc55xx_ebi_init(void)
{
#if defined(MPC55XX_BOARD_GWLCFM)
	/*
	 * init EBI for Muxed AD bus
	 */
	EBI.MCR.B.DBM = 1;
	EBI.MCR.B.AD_MUX = 1; /* use multiplexed bus */
	EBI.MCR.B.D16_31 = 1; /* use lower AD bus    */

	SIU.ECCR.B.EBDF = 3;  /* use CLK/4 as bus clock */
#elif defined(MPC55XX_BOARD_MPC5674FEVB)
  struct EBI_tag ebi = {
    .MCR = {
      .B = {
        .ACGE = 0,
        .MDIS = 0,
        .D16_31 = 0,
        .AD_MUX = 0,
        .DBM = 0
      }
    }
  };

  EBI.MCR.R = ebi.MCR.R;
#endif
}

static void BSP_START_TEXT_SECTION mpc55xx_mmu_init(void)
{
#ifdef MPC55XX_BOOTFLAGS
  /* If the low bit of bootflag 0 is clear don't change the MMU.  */
  bool do_mmu_init = (mpc55xx_bootflag_0 [0] & 1) != 0;
#else
  bool do_mmu_init = true;
#endif

  if (do_mmu_init) {
    size_t i = 0;

    for (i = 0; i < mpc55xx_mmu_config_count [0]; ++i) {
      const struct MMU_tag *tag = &mpc55xx_mmu_config [i];
      PPC_SET_SPECIAL_PURPOSE_REGISTER( FSL_EIS_MAS0, tag->MAS0.R);
      PPC_SET_SPECIAL_PURPOSE_REGISTER( FSL_EIS_MAS1, tag->MAS1.R);
      PPC_SET_SPECIAL_PURPOSE_REGISTER( FSL_EIS_MAS2, tag->MAS2.R);
      PPC_SET_SPECIAL_PURPOSE_REGISTER( FSL_EIS_MAS3, tag->MAS3.R);
      __asm__ volatile ("tlbwe");
    }
  }
}

static void BSP_START_TEXT_SECTION mpc55xx_load_section(
  void *dst,
  const void *src,
  size_t n
)
{
  if (dst != src) {
    memcpy(dst, src, n);
  }
}

void BSP_START_TEXT_SECTION mpc55xx_early_init(void)
{
  mpc55xx_load_section(
    &bsp_section_fast_text_begin [0],
    &bsp_section_fast_text_load_begin [0],
    (size_t) bsp_section_fast_text_size
  );
  mpc55xx_load_section(
    &bsp_section_fast_data_begin [0],
    &bsp_section_fast_data_load_begin [0],
    (size_t) bsp_section_fast_data_size
  );
  mpc55xx_load_section(
    &bsp_section_data_begin [0],
    &bsp_section_data_load_begin [0],
    (size_t) bsp_section_data_size
  );
  mpc55xx_siu_init();
  mpc55xx_ebi_chip_select_init();
  mpc55xx_ebi_init();
  mpc55xx_mmu_init();
}