blob: 133f7abc31aca4bdaecd9bc330d6cb43abcfcf6e [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Scott Woode4c09502008-06-30 14:13:28 -05002/*
3 * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
Scott Woode4c09502008-06-30 14:13:28 -05004 */
5
6#include <common.h>
7#include <mpc83xx.h>
8
Mario Six9c5df7a2019-01-21 09:17:58 +01009#include "lblaw/lblaw.h"
Mario Sixfe7d6542019-01-21 09:18:03 +010010#include "elbc/elbc.h"
Mario Six9c5df7a2019-01-21 09:17:58 +010011
Scott Woode4c09502008-06-30 14:13:28 -050012DECLARE_GLOBAL_DATA_PTR;
13
14/*
15 * Breathe some life into the CPU...
16 *
17 * Set up the memory map,
18 * initialize a bunch of registers,
19 * initialize the UPM's
20 */
21void cpu_init_f (volatile immap_t * im)
22{
Scott Woode4c09502008-06-30 14:13:28 -050023 /* Pointer is writable since we allocated a register for it */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020024 gd = (gd_t *) (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_GBL_DATA_OFFSET);
Scott Woode4c09502008-06-30 14:13:28 -050025
mario.six@gdsys.ccdbcb2c02017-01-17 08:33:48 +010026 /* global data region was cleared in start.S */
Scott Woode4c09502008-06-30 14:13:28 -050027
28 /* system performance tweaking */
29
Mario Six73df96a2019-01-21 09:18:12 +010030#ifndef CONFIG_ACR_PIPE_DEP_UNSET
Scott Woode4c09502008-06-30 14:13:28 -050031 /* Arbiter pipeline depth */
32 im->arbiter.acr = (im->arbiter.acr & ~ACR_PIPE_DEP) |
Mario Six73df96a2019-01-21 09:18:12 +010033 CONFIG_ACR_PIPE_DEP;
Scott Woode4c09502008-06-30 14:13:28 -050034#endif
35
Mario Six73df96a2019-01-21 09:18:12 +010036#ifndef CONFIG_ACR_RPTCNT_UNSET
Scott Woode4c09502008-06-30 14:13:28 -050037 /* Arbiter repeat count */
38 im->arbiter.acr = (im->arbiter.acr & ~(ACR_RPTCNT)) |
Mario Six73df96a2019-01-21 09:18:12 +010039 CONFIG_ACR_RPTCNT;
Scott Woode4c09502008-06-30 14:13:28 -050040#endif
41
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020042#ifdef CONFIG_SYS_SPCR_OPT
Scott Woode4c09502008-06-30 14:13:28 -050043 /* Optimize transactions between CSB and other devices */
44 im->sysconf.spcr = (im->sysconf.spcr & ~SPCR_OPT) |
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020045 (CONFIG_SYS_SPCR_OPT << SPCR_OPT_SHIFT);
Scott Woode4c09502008-06-30 14:13:28 -050046#endif
47
Robert P. J. Dayd7b4ca22015-12-16 12:25:42 -050048 /* Enable Time Base & Decrementer (so we will have udelay()) */
Scott Woode4c09502008-06-30 14:13:28 -050049 im->sysconf.spcr |= SPCR_TBEN;
50
51 /* DDR control driver register */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020052#ifdef CONFIG_SYS_DDRCDR
53 im->sysconf.ddrcdr = CONFIG_SYS_DDRCDR;
Scott Woode4c09502008-06-30 14:13:28 -050054#endif
55 /* Output buffer impedance register */
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020056#ifdef CONFIG_SYS_OBIR
57 im->sysconf.obir = CONFIG_SYS_OBIR;
Scott Woode4c09502008-06-30 14:13:28 -050058#endif
59
60 /*
61 * Memory Controller:
62 */
63
64 /* Map banks 0 and 1 to the FLASH banks 0 and 1 at preliminary
65 * addresses - these have to be modified later when FLASH size
66 * has been determined
67 */
68
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020069#if defined(CONFIG_SYS_NAND_BR_PRELIM) \
70 && defined(CONFIG_SYS_NAND_OR_PRELIM) \
71 && defined(CONFIG_SYS_NAND_LBLAWBAR_PRELIM) \
72 && defined(CONFIG_SYS_NAND_LBLAWAR_PRELIM)
Becky Brucef51cdaf2010-06-17 11:37:20 -050073 set_lbc_br(0, CONFIG_SYS_NAND_BR_PRELIM);
74 set_lbc_or(0, CONFIG_SYS_NAND_OR_PRELIM);
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020075 im->sysconf.lblaw[0].bar = CONFIG_SYS_NAND_LBLAWBAR_PRELIM;
76 im->sysconf.lblaw[0].ar = CONFIG_SYS_NAND_LBLAWAR_PRELIM;
Scott Woode4c09502008-06-30 14:13:28 -050077#else
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020078#error CONFIG_SYS_NAND_BR_PRELIM, CONFIG_SYS_NAND_OR_PRELIM, CONFIG_SYS_NAND_LBLAWBAR_PRELIM & CONFIG_SYS_NAND_LBLAWAR_PRELIM must be defined
Scott Woode4c09502008-06-30 14:13:28 -050079#endif
80}
81
82/*
83 * Get timebase clock frequency (like cpu_clk in Hz)
84 */
85unsigned long get_tbclk(void)
86{
87 return (gd->bus_clk + 3L) / 4L;
88}
89
90void puts(const char *str)
91{
92 while (*str)
93 putc(*str++);
94}
Mario Six0f06f572019-01-21 09:17:52 +010095
96ulong get_bus_freq(ulong dummy)
97{
98 volatile immap_t *im = (immap_t *) CONFIG_SYS_IMMR;
99 u8 spmf = (im->clk.spmr & SPMR_SPMF) >> SPMR_SPMF_SHIFT;
100
Mario Sixff3bb0c2019-01-21 09:17:53 +0100101 return CONFIG_SYS_CLK_FREQ * spmf;
Mario Six0f06f572019-01-21 09:17:52 +0100102}