~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/board/w7o/init.S

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * SPDX-License-Identifier:     GPL-2.0 IBM-pibs
 
3
 */
 
4
#include <config.h>
 
5
#include <asm/ppc4xx.h>
 
6
 
 
7
#include <ppc_asm.tmpl>
 
8
#include <ppc_defs.h>
 
9
 
 
10
#include <asm/cache.h>
 
11
#include <asm/mmu.h>
 
12
 
 
13
/******************************************************************************
 
14
 * Function:    ext_bus_cntlr_init
 
15
 *
 
16
 * Description: Configures EBC Controller and a few basic chip selects.
 
17
 *
 
18
 *              CS0 is setup to get the Boot Flash out of the addresss range
 
19
 *              so that we may setup a stack.  CS7 is setup so that we can
 
20
 *              access and reset the hardware watchdog.
 
21
 *
 
22
 *              IMPORTANT: For pass1 this code must run from
 
23
 *              cache since you can not reliably change a peripheral banks
 
24
 *              timing register (pbxap) while running code from that bank.
 
25
 *              For ex., since we are running from ROM on bank 0, we can NOT
 
26
 *              execute the code that modifies bank 0 timings from ROM, so
 
27
 *              we run it from cache.
 
28
 *
 
29
 * Notes:       Does NOT use the stack.
 
30
 *****************************************************************************/
 
31
        .section ".text"
 
32
        .align  2
 
33
        .globl  ext_bus_cntlr_init
 
34
        .type   ext_bus_cntlr_init, @function
 
35
ext_bus_cntlr_init:
 
36
        mflr    r0
 
37
        /********************************************************************
 
38
         * Prefetch entire ext_bus_cntrl_init function into the icache.
 
39
         * This is necessary because we are going to change the same CS we
 
40
         * are executing from.  Otherwise a CPU lockup may occur.
 
41
         *******************************************************************/
 
42
        bl      ..getAddr
 
43
..getAddr:
 
44
        mflr    r3                      /* get address of ..getAddr */
 
45
 
 
46
        /* Calculate number of cache lines for this function */
 
47
        addi    r4, 0, (((.Lfe0 - ..getAddr) / CONFIG_SYS_CACHELINE_SIZE) + 2)
 
48
        mtctr   r4
 
49
..ebcloop:
 
50
        icbt    r0, r3                  /* prefetch cache line for addr in r3*/
 
51
        addi    r3, r3, CONFIG_SYS_CACHELINE_SIZE /* move to next cache line */
 
52
        bdnz    ..ebcloop               /* continue for $CTR cache lines */
 
53
 
 
54
        /********************************************************************
 
55
         * Delay to ensure all accesses to ROM are complete before changing
 
56
         * bank 0 timings. 200usec should be enough.
 
57
         * 200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles.
 
58
         *******************************************************************/
 
59
        addis   r3, 0, 0x0
 
60
        ori     r3, r3, 0xA000          /* wait 200us from reset */
 
61
        mtctr   r3
 
62
..spinlp:
 
63
        bdnz    ..spinlp                /* spin loop */
 
64
 
 
65
        /********************************************************************
 
66
         * Setup External Bus Controller (EBC).
 
67
         *******************************************************************/
 
68
        addi    r3, 0, EBC0_CFG
 
69
        mtdcr   EBC0_CFGADDR, r3
 
70
        addis   r4, 0, 0xb040           /* Device base timeout = 1024 cycles */
 
71
        ori     r4, r4, 0x0             /* Drive CS with external master */
 
72
        mtdcr   EBC0_CFGDATA, r4
 
73
 
 
74
        /********************************************************************
 
75
         * Change PCIINT signal to PerWE
 
76
         *******************************************************************/
 
77
        mfdcr   r4, CPC0_CR1
 
78
        ori     r4, r4, 0x4000
 
79
        mtdcr   CPC0_CR1, r4
 
80
 
 
81
        /********************************************************************
 
82
         * Memory Bank 0 (Flash Bank 0) initialization
 
83
         *******************************************************************/
 
84
        addi    r3, 0, PB1AP
 
85
        mtdcr   EBC0_CFGADDR, r3
 
86
        addis   r4, 0, CONFIG_SYS_W7O_EBC_PB0AP@h
 
87
        ori     r4, r4, CONFIG_SYS_W7O_EBC_PB0AP@l
 
88
        mtdcr   EBC0_CFGDATA, r4
 
89
 
 
90
        addi    r3, 0, PB0CR
 
91
        mtdcr   EBC0_CFGADDR, r3
 
92
        addis   r4, 0, CONFIG_SYS_W7O_EBC_PB0CR@h
 
93
        ori     r4, r4, CONFIG_SYS_W7O_EBC_PB0CR@l
 
94
        mtdcr   EBC0_CFGDATA, r4
 
95
 
 
96
        /********************************************************************
 
97
         * Memory Bank 7 LEDs - NEEDED BECAUSE OF HW WATCHDOG AND LEDs.
 
98
         *******************************************************************/
 
99
        addi    r3, 0, PB7AP
 
100
        mtdcr   EBC0_CFGADDR, r3
 
101
        addis   r4, 0, CONFIG_SYS_W7O_EBC_PB7AP@h
 
102
        ori     r4, r4, CONFIG_SYS_W7O_EBC_PB7AP@l
 
103
        mtdcr   EBC0_CFGDATA, r4
 
104
 
 
105
        addi    r3, 0, PB7CR
 
106
        mtdcr   EBC0_CFGADDR, r3
 
107
        addis   r4, 0, CONFIG_SYS_W7O_EBC_PB7CR@h
 
108
        ori     r4, r4, CONFIG_SYS_W7O_EBC_PB7CR@l
 
109
        mtdcr   EBC0_CFGDATA, r4
 
110
 
 
111
        /* We are all done */
 
112
        mtlr    r0                      /* Restore link register */
 
113
        blr                             /* Return to calling function */
 
114
.Lfe0:  .size   ext_bus_cntlr_init,.Lfe0-ext_bus_cntlr_init
 
115
/* end ext_bus_cntlr_init() */
 
116
 
 
117
/******************************************************************************
 
118
 * Function:    sdram_init
 
119
 *
 
120
 * Description: Configures SDRAM memory banks.
 
121
 *
 
122
 *              Serial Presence Detect, "SPD," reads the SDRAM EEPROM
 
123
 *              via the IIC bus and then configures the SDRAM memory
 
124
 *              banks appropriately. If Auto Memory Configuration is
 
125
 *              is not used, it is assumed that a 4MB 11x8x2, non-ECC,
 
126
 *              SDRAM is soldered down.
 
127
 *
 
128
 * Notes:       Expects that the stack is already setup.
 
129
 *****************************************************************************/
 
130
        .section ".text"
 
131
        .align  2
 
132
        .globl  sdram_init
 
133
        .type   sdram_init, @function
 
134
sdram_init:
 
135
        /* save the return info on stack */
 
136
        mflr    r0                      /* Get link register */
 
137
        stwu    r1, -8(r1)              /* Save back chain and move SP */
 
138
        stw     r0, +12(r1)             /* Save link register */
 
139
 
 
140
        /*
 
141
         * First call spd_sdram to try to init SDRAM according to the
 
142
         * contents of the SPD EEPROM.  If the SPD EEPROM is blank or
 
143
         * erronious, spd_sdram returns 0 in R3.
 
144
         */
 
145
        li      r3,0
 
146
        bl      spd_sdram
 
147
        addic.  r3, r3, 0               /* Check for error, save dram size */
 
148
        bne     ..sdri_done             /* If it worked, we're done... */
 
149
 
 
150
        /********************************************************************
 
151
         * If SPD detection fails, we'll default to 4MB, 11x8x2, as this
 
152
         * is the SMALLEST SDRAM size the 405 supports.  We can do this
 
153
         * because W7O boards have soldered on RAM, and there will always
 
154
         * be some amount present.  If we were using DIMMs, we should hang
 
155
         * the board instead, since it doesn't have any RAM to continue
 
156
         * running with.
 
157
         *******************************************************************/
 
158
 
 
159
        /*
 
160
         * Disable memory controller to allow
 
161
         * values to be changed.
 
162
         */
 
163
        addi    r3, 0, SDRAM0_CFG
 
164
        mtdcr   SDRAM0_CFGADDR, r3
 
165
        addis   r4, 0, 0x0
 
166
        ori     r4, r4, 0x0
 
167
        mtdcr   SDRAM0_CFGDATA, r4
 
168
 
 
169
        /*
 
170
         * Set MB0CF for ext bank 0. (0-4MB) Address Mode 5 since 11x8x2
 
171
         * All other banks are disabled.
 
172
         */
 
173
        addi    r3, 0, SDRAM0_B0CR
 
174
        mtdcr   SDRAM0_CFGADDR, r3
 
175
        addis   r4, 0, 0x0000           /* BA=0x0, SZ=4MB */
 
176
        ori     r4, r4, 0x8001          /* Mode is 5, 11x8x2or4, BE=Enabled */
 
177
        mtdcr   SDRAM0_CFGDATA, r4
 
178
 
 
179
        /* Clear MB1CR,MB2CR,MB3CR to turn other banks off */
 
180
        addi    r4, 0, 0                /* Zero the data reg */
 
181
 
 
182
        addi    r3, r3, 4               /* Point to MB1CF reg */
 
183
        mtdcr   SDRAM0_CFGADDR, r3              /* Set the address */
 
184
        mtdcr   SDRAM0_CFGDATA, r4              /* Zero the reg */
 
185
 
 
186
        addi    r3, r3, 4               /* Point to MB2CF reg */
 
187
        mtdcr   SDRAM0_CFGADDR, r3              /* Set the address */
 
188
        mtdcr   SDRAM0_CFGDATA, r4              /* Zero the reg */
 
189
 
 
190
        addi    r3, r3, 4               /* Point to MB3CF reg */
 
191
        mtdcr   SDRAM0_CFGADDR, r3              /* Set the address */
 
192
        mtdcr   SDRAM0_CFGDATA, r4              /* Zero the reg */
 
193
 
 
194
        /********************************************************************
 
195
         * Set the SDRAM Timing reg, SDTR1 and the refresh timer reg, RTR.
 
196
         * To set the appropriate timings, we assume sdram is
 
197
         * 100MHz (pc100 compliant).
 
198
         *******************************************************************/
 
199
 
 
200
        /*
 
201
         * Set up SDTR1
 
202
         */
 
203
        addi    r3, 0, SDRAM0_TR
 
204
        mtdcr   SDRAM0_CFGADDR, r3
 
205
        addis   r4, 0, 0x0086           /* SDTR1 value for 100Mhz */
 
206
        ori     r4, r4, 0x400D
 
207
        mtdcr   SDRAM0_CFGDATA, r4
 
208
 
 
209
        /*
 
210
         * Set RTR
 
211
         */
 
212
        addi    r3, 0, SDRAM0_RTR
 
213
        mtdcr   SDRAM0_CFGADDR, r3
 
214
        addis   r4, 0, 0x05F0           /* RTR refresh val = 15.625ms@100Mhz */
 
215
        mtdcr   SDRAM0_CFGDATA, r4
 
216
 
 
217
        /********************************************************************
 
218
         * Delay to ensure 200usec have elapsed since reset. Assume worst
 
219
         * case that the core is running 200Mhz:
 
220
         *        200,000,000 (cycles/sec) X .000200 (sec) = 0x9C40 cycles
 
221
         *******************************************************************/
 
222
        addis   r3, 0, 0x0000
 
223
        ori     r3, r3, 0xA000          /* Wait 200us from reset */
 
224
        mtctr   r3
 
225
..spinlp2:
 
226
        bdnz    ..spinlp2               /* spin loop */
 
227
 
 
228
        /********************************************************************
 
229
         * Set memory controller options reg, MCOPT1.
 
230
         *******************************************************************/
 
231
        addi    r3, 0, SDRAM0_CFG
 
232
        mtdcr   SDRAM0_CFGADDR, r3
 
233
        addis   r4, 0, 0x80E0           /* DC_EN=1,SRE=0,PME=0,MEMCHK=0 */
 
234
        ori     r4, r4, 0x0000          /* REGEN=0,DRW=00,BRPF=01,ECCDD=1 */
 
235
        mtdcr   SDRAM0_CFGDATA, r4              /* EMDULR=1 */
 
236
 
 
237
..sdri_done:
 
238
        /* restore and return */
 
239
        lwz     r0, +12(r1)             /* Get saved link register */
 
240
        addi    r1, r1, +8              /* Remove frame from stack */
 
241
        mtlr    r0                      /* Restore link register */
 
242
        blr                             /* Return to calling function */
 
243
.Lfe1:  .size   sdram_init,.Lfe1-sdram_init
 
244
/* end sdram_init() */