blob: b42cc3e9e43a6ad13bb692b8955a9550dc27e00b [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Stefano Babica521a772010-01-20 18:19:32 +01002/*
3 * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
4 *
5 * (C) Copyright 2009 Freescale Semiconductor, Inc.
Stefano Babica521a772010-01-20 18:19:32 +01006 */
7
8#include <config.h>
9#include <asm/arch/imx-regs.h>
Stefano Babic2a1f1ac2011-09-05 04:32:28 +000010#include <generated/asm-offsets.h>
Aneesh Vfd8798b2012-03-08 07:20:18 +000011#include <linux/linkage.h>
Stefano Babica521a772010-01-20 18:19:32 +010012
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +000013.section ".text.init", "x"
14
Fabio Estevam52ba9322012-05-07 10:56:00 +000015.macro init_arm_erratum
16 /* ARM erratum ID #468414 */
17 mrc 15, 0, r1, c1, c0, 1
18 orr r1, r1, #(1 << 5) /* enable L1NEON bit */
19 mcr 15, 0, r1, c1, c0, 1
20.endm
21
Stefano Babica521a772010-01-20 18:19:32 +010022/*
23 * L2CC Cache setup/invalidation/disable
24 */
25.macro init_l2cc
26 /* explicitly disable L2 cache */
27 mrc 15, 0, r0, c1, c0, 1
28 bic r0, r0, #0x2
29 mcr 15, 0, r0, c1, c0, 1
30
31 /* reconfigure L2 cache aux control reg */
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +000032 ldr r0, =0xC0 | /* tag RAM */ \
Wolfgang Denkec7fbf52013-10-04 17:43:24 +020033 0x4 | /* data RAM */ \
34 1 << 24 | /* disable write allocate delay */ \
35 1 << 23 | /* disable write allocate combine */ \
36 1 << 22 /* disable write allocate */
Stefano Babica521a772010-01-20 18:19:32 +010037
David Janderdd6f7872011-07-14 03:58:57 +000038#if defined(CONFIG_MX51)
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +000039 ldr r3, [r4, #ROM_SI_REV]
David Janderdd6f7872011-07-14 03:58:57 +000040 cmp r3, #0x10
Stefano Babica521a772010-01-20 18:19:32 +010041
42 /* disable write combine for TO 2 and lower revs */
Benoît Thébaudeau118e0bc2012-08-14 05:18:43 +000043 orrls r0, r0, #1 << 25
David Janderdd6f7872011-07-14 03:58:57 +000044#endif
Stefano Babica521a772010-01-20 18:19:32 +010045
46 mcr 15, 1, r0, c9, c0, 2
Fabio Estevam2ad8b462013-09-30 13:16:52 -030047
48 /* enable L2 cache */
49 mrc 15, 0, r0, c1, c0, 1
50 orr r0, r0, #2
51 mcr 15, 0, r0, c1, c0, 1
52
Stefano Babica521a772010-01-20 18:19:32 +010053.endm /* init_l2cc */
54
55/* AIPS setup - Only setup MPROTx registers.
56 * The PACR default values are good.*/
57.macro init_aips
58 /*
59 * Set all MPROTx to be non-bufferable, trusted for R/W,
60 * not forced to user-mode.
61 */
62 ldr r0, =AIPS1_BASE_ADDR
63 ldr r1, =0x77777777
64 str r1, [r0, #0x0]
65 str r1, [r0, #0x4]
66 ldr r0, =AIPS2_BASE_ADDR
67 str r1, [r0, #0x0]
68 str r1, [r0, #0x4]
69 /*
70 * Clear the on and off peripheral modules Supervisor Protect bit
71 * for SDMA to access them. Did not change the AIPS control registers
72 * (offset 0x20) access type
73 */
74.endm /* init_aips */
75
76/* M4IF setup */
77.macro init_m4if
Liu Hui-R64343baa2d782011-01-03 22:27:35 +000078#ifdef CONFIG_MX51
Stefano Babica521a772010-01-20 18:19:32 +010079 /* VPU and IPU given higher priority (0x4)
80 * IPU accesses with ID=0x1 given highest priority (=0xA)
81 */
82 ldr r0, =M4IF_BASE_ADDR
83
84 ldr r1, =0x00000203
85 str r1, [r0, #0x40]
86
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +000087 str r4, [r0, #0x44]
Stefano Babica521a772010-01-20 18:19:32 +010088
89 ldr r1, =0x00120125
90 str r1, [r0, #0x9C]
91
92 ldr r1, =0x001901A3
93 str r1, [r0, #0x48]
94
Liu Hui-R64343baa2d782011-01-03 22:27:35 +000095#endif
Stefano Babica521a772010-01-20 18:19:32 +010096.endm /* init_m4if */
97
98.macro setup_pll pll, freq
Liu Hui-R64343baa2d782011-01-03 22:27:35 +000099 ldr r0, =\pll
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000100 adr r2, W_DP_\freq
101 bl setup_pll_func
102.endm
103
104#define W_DP_OP 0
105#define W_DP_MFD 4
106#define W_DP_MFN 8
107
108setup_pll_func:
Stefano Babica521a772010-01-20 18:19:32 +0100109 ldr r1, =0x00001232
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000110 str r1, [r0, #PLL_DP_CTL] /* Set DPLL ON (set UPEN bit): BRMO=1 */
Stefano Babica521a772010-01-20 18:19:32 +0100111 mov r1, #0x2
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000112 str r1, [r0, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */
Stefano Babica521a772010-01-20 18:19:32 +0100113
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000114 ldr r1, [r2, #W_DP_OP]
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000115 str r1, [r0, #PLL_DP_OP]
116 str r1, [r0, #PLL_DP_HFS_OP]
Stefano Babica521a772010-01-20 18:19:32 +0100117
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000118 ldr r1, [r2, #W_DP_MFD]
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000119 str r1, [r0, #PLL_DP_MFD]
120 str r1, [r0, #PLL_DP_HFS_MFD]
Stefano Babica521a772010-01-20 18:19:32 +0100121
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000122 ldr r1, [r2, #W_DP_MFN]
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000123 str r1, [r0, #PLL_DP_MFN]
124 str r1, [r0, #PLL_DP_HFS_MFN]
Stefano Babica521a772010-01-20 18:19:32 +0100125
126 ldr r1, =0x00001232
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000127 str r1, [r0, #PLL_DP_CTL]
1281: ldr r1, [r0, #PLL_DP_CTL]
Stefano Babica521a772010-01-20 18:19:32 +0100129 ands r1, r1, #0x1
130 beq 1b
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000131
132 /* r10 saved upper lr */
133 mov pc, lr
Stefano Babica521a772010-01-20 18:19:32 +0100134
David Jander088b3382011-07-13 21:11:53 +0000135.macro setup_pll_errata pll, freq
136 ldr r2, =\pll
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000137 str r4, [r2, #PLL_DP_CONFIG] /* Disable auto-restart AREN bit */
David Jander088b3382011-07-13 21:11:53 +0000138 ldr r1, =0x00001236
139 str r1, [r2, #PLL_DP_CTL] /* Restart PLL with PLM=1 */
1401: ldr r1, [r2, #PLL_DP_CTL] /* Wait for lock */
141 ands r1, r1, #0x1
142 beq 1b
143
144 ldr r5, \freq
145 str r5, [r2, #PLL_DP_MFN] /* Modify MFN value */
146 str r5, [r2, #PLL_DP_HFS_MFN]
147
148 mov r1, #0x1
149 str r1, [r2, #PLL_DP_CONFIG] /* Reload MFN value */
150
1512: ldr r1, [r2, #PLL_DP_CONFIG]
152 tst r1, #1
153 bne 2b
154
155 ldr r1, =100 /* Wait at least 4 us */
1563: subs r1, r1, #1
157 bge 3b
158
159 mov r1, #0x2
160 str r1, [r2, #PLL_DP_CONFIG] /* Enable auto-restart AREN bit */
161.endm
162
Stefano Babica521a772010-01-20 18:19:32 +0100163.macro init_clock
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000164#if defined (CONFIG_MX51)
Stefano Babica521a772010-01-20 18:19:32 +0100165 ldr r0, =CCM_BASE_ADDR
166
167 /* Gate of clocks to the peripherals first */
168 ldr r1, =0x3FFFFFFF
169 str r1, [r0, #CLKCTL_CCGR0]
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000170 str r4, [r0, #CLKCTL_CCGR1]
171 str r4, [r0, #CLKCTL_CCGR2]
172 str r4, [r0, #CLKCTL_CCGR3]
Stefano Babica521a772010-01-20 18:19:32 +0100173
174 ldr r1, =0x00030000
175 str r1, [r0, #CLKCTL_CCGR4]
176 ldr r1, =0x00FFF030
177 str r1, [r0, #CLKCTL_CCGR5]
178 ldr r1, =0x00000300
179 str r1, [r0, #CLKCTL_CCGR6]
180
181 /* Disable IPU and HSC dividers */
182 mov r1, #0x60000
183 str r1, [r0, #CLKCTL_CCDR]
184
185 /* Make sure to switch the DDR away from PLL 1 */
186 ldr r1, =0x19239145
187 str r1, [r0, #CLKCTL_CBCDR]
188 /* make sure divider effective */
1891: ldr r1, [r0, #CLKCTL_CDHIPR]
190 cmp r1, #0x0
191 bne 1b
192
193 /* Switch ARM to step clock */
194 mov r1, #0x4
195 str r1, [r0, #CLKCTL_CCSR]
Stefano Babica521a772010-01-20 18:19:32 +0100196
David Jander088b3382011-07-13 21:11:53 +0000197#if defined(CONFIG_MX51_PLL_ERRATA)
198 setup_pll PLL1_BASE_ADDR, 864
199 setup_pll_errata PLL1_BASE_ADDR, W_DP_MFN_800_DIT
200#else
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000201 setup_pll PLL1_BASE_ADDR, 800
David Jander088b3382011-07-13 21:11:53 +0000202#endif
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000203
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000204 setup_pll PLL3_BASE_ADDR, 665
Stefano Babica521a772010-01-20 18:19:32 +0100205
206 /* Switch peripheral to PLL 3 */
207 ldr r0, =CCM_BASE_ADDR
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000208 ldr r1, =0x000010C0 | CONFIG_SYS_DDR_CLKSEL
Stefano Babica521a772010-01-20 18:19:32 +0100209 str r1, [r0, #CLKCTL_CBCMR]
210 ldr r1, =0x13239145
211 str r1, [r0, #CLKCTL_CBCDR]
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000212 setup_pll PLL2_BASE_ADDR, 665
Stefano Babica521a772010-01-20 18:19:32 +0100213
214 /* Switch peripheral to PLL2 */
215 ldr r0, =CCM_BASE_ADDR
216 ldr r1, =0x19239145
217 str r1, [r0, #CLKCTL_CBCDR]
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000218 ldr r1, =0x000020C0 | CONFIG_SYS_DDR_CLKSEL
Stefano Babica521a772010-01-20 18:19:32 +0100219 str r1, [r0, #CLKCTL_CBCMR]
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000220
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000221 setup_pll PLL3_BASE_ADDR, 216
Stefano Babica521a772010-01-20 18:19:32 +0100222
223 /* Set the platform clock dividers */
224 ldr r0, =ARM_BASE_ADDR
225 ldr r1, =0x00000725
226 str r1, [r0, #0x14]
227
228 ldr r0, =CCM_BASE_ADDR
229
230 /* Run 3.0 at Full speed, for other TO's wait till we increase VDDGP */
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000231 ldr r3, [r4, #ROM_SI_REV]
Stefano Babica521a772010-01-20 18:19:32 +0100232 cmp r3, #0x10
233 movls r1, #0x1
234 movhi r1, #0
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000235
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000236 str r1, [r0, #CLKCTL_CACRR]
Benoît Thébaudeau118e0bc2012-08-14 05:18:43 +0000237
Stefano Babica521a772010-01-20 18:19:32 +0100238 /* Switch ARM back to PLL 1 */
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000239 str r4, [r0, #CLKCTL_CCSR]
Stefano Babica521a772010-01-20 18:19:32 +0100240
241 /* setup the rest */
242 /* Use lp_apm (24MHz) source for perclk */
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000243 ldr r1, =0x000020C2 | CONFIG_SYS_DDR_CLKSEL
Stefano Babica521a772010-01-20 18:19:32 +0100244 str r1, [r0, #CLKCTL_CBCMR]
245 /* ddr clock from PLL 1, all perclk dividers are 1 since using 24MHz */
Stefano Babic0c3d8ee2010-03-28 13:43:26 +0200246 ldr r1, =CONFIG_SYS_CLKTL_CBCDR
Stefano Babica521a772010-01-20 18:19:32 +0100247 str r1, [r0, #CLKCTL_CBCDR]
248
249 /* Restore the default values in the Gate registers */
250 ldr r1, =0xFFFFFFFF
251 str r1, [r0, #CLKCTL_CCGR0]
252 str r1, [r0, #CLKCTL_CCGR1]
253 str r1, [r0, #CLKCTL_CCGR2]
254 str r1, [r0, #CLKCTL_CCGR3]
255 str r1, [r0, #CLKCTL_CCGR4]
256 str r1, [r0, #CLKCTL_CCGR5]
257 str r1, [r0, #CLKCTL_CCGR6]
258
259 /* Use PLL 2 for UART's, get 66.5MHz from it */
260 ldr r1, =0xA5A2A020
261 str r1, [r0, #CLKCTL_CSCMR1]
262 ldr r1, =0x00C30321
263 str r1, [r0, #CLKCTL_CSCDR1]
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000264 /* make sure divider effective */
2651: ldr r1, [r0, #CLKCTL_CDHIPR]
266 cmp r1, #0x0
267 bne 1b
268
269 str r4, [r0, #CLKCTL_CCDR]
270
271 /* for cko - for ARM div by 8 */
272 mov r1, #0x000A0000
273 add r1, r1, #0x00000F0
274 str r1, [r0, #CLKCTL_CCOSR]
275#else /* CONFIG_MX53 */
276 ldr r0, =CCM_BASE_ADDR
277
278 /* Gate of clocks to the peripherals first */
279 ldr r1, =0x3FFFFFFF
280 str r1, [r0, #CLKCTL_CCGR0]
281 str r4, [r0, #CLKCTL_CCGR1]
282 str r4, [r0, #CLKCTL_CCGR2]
283 str r4, [r0, #CLKCTL_CCGR3]
284 str r4, [r0, #CLKCTL_CCGR7]
285 ldr r1, =0x00030000
286 str r1, [r0, #CLKCTL_CCGR4]
287 ldr r1, =0x00FFF030
288 str r1, [r0, #CLKCTL_CCGR5]
289 ldr r1, =0x0F00030F
290 str r1, [r0, #CLKCTL_CCGR6]
291
292 /* Switch ARM to step clock */
293 mov r1, #0x4
294 str r1, [r0, #CLKCTL_CCSR]
295
296 setup_pll PLL1_BASE_ADDR, 800
297
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200298 setup_pll PLL3_BASE_ADDR, 400
Fabio Estevam954f1b22012-10-15 05:37:16 +0000299
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200300 /* Switch peripheral to PLL3 */
301 ldr r0, =CCM_BASE_ADDR
302 ldr r1, =0x00015154
303 str r1, [r0, #CLKCTL_CBCMR]
304 ldr r1, =0x02898945
305 str r1, [r0, #CLKCTL_CBCDR]
306 /* make sure change is effective */
Fabio Estevam954f1b22012-10-15 05:37:16 +00003071: ldr r1, [r0, #CLKCTL_CDHIPR]
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200308 cmp r1, #0x0
309 bne 1b
Fabio Estevam954f1b22012-10-15 05:37:16 +0000310
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200311 setup_pll PLL2_BASE_ADDR, 400
Fabio Estevam954f1b22012-10-15 05:37:16 +0000312
313 /* Switch peripheral to PLL2 */
314 ldr r0, =CCM_BASE_ADDR
Benoît Thébaudeau4a530532013-04-11 09:35:38 +0000315 ldr r1, =0x00888945
Fabio Estevam954f1b22012-10-15 05:37:16 +0000316 str r1, [r0, #CLKCTL_CBCDR]
317
318 ldr r1, =0x00016154
319 str r1, [r0, #CLKCTL_CBCMR]
320
321 /*change uart clk parent to pll2*/
322 ldr r1, [r0, #CLKCTL_CSCMR1]
323 and r1, r1, #0xfcffffff
324 orr r1, r1, #0x01000000
325 str r1, [r0, #CLKCTL_CSCMR1]
326
327 /* make sure change is effective */
3281: ldr r1, [r0, #CLKCTL_CDHIPR]
329 cmp r1, #0x0
330 bne 1b
331
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200332 setup_pll PLL3_BASE_ADDR, 216
Fabio Estevam954f1b22012-10-15 05:37:16 +0000333
334 setup_pll PLL4_BASE_ADDR, 455
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000335
336 /* Set the platform clock dividers */
337 ldr r0, =ARM_BASE_ADDR
Fabio Estevam954f1b22012-10-15 05:37:16 +0000338 ldr r1, =0x00000124
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000339 str r1, [r0, #0x14]
340
341 ldr r0, =CCM_BASE_ADDR
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000342 mov r1, #0
343 str r1, [r0, #CLKCTL_CACRR]
344
Fabio Estevam954f1b22012-10-15 05:37:16 +0000345 /* Switch ARM back to PLL 1. */
346 mov r1, #0x0
347 str r1, [r0, #CLKCTL_CCSR]
348
349 /* make uart div=6 */
350 ldr r1, [r0, #CLKCTL_CSCDR1]
351 and r1, r1, #0xffffffc0
352 orr r1, r1, #0x0a
353 str r1, [r0, #CLKCTL_CSCDR1]
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000354
355 /* Restore the default values in the Gate registers */
356 ldr r1, =0xFFFFFFFF
357 str r1, [r0, #CLKCTL_CCGR0]
358 str r1, [r0, #CLKCTL_CCGR1]
359 str r1, [r0, #CLKCTL_CCGR2]
360 str r1, [r0, #CLKCTL_CCGR3]
361 str r1, [r0, #CLKCTL_CCGR4]
362 str r1, [r0, #CLKCTL_CCGR5]
363 str r1, [r0, #CLKCTL_CCGR6]
364 str r1, [r0, #CLKCTL_CCGR7]
365
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200366 mov r1, #0x00000
367 str r1, [r0, #CLKCTL_CCDR]
Stefano Babica521a772010-01-20 18:19:32 +0100368
Wolfgang Denkec7fbf52013-10-04 17:43:24 +0200369 /* for cko - for ARM div by 8 */
370 mov r1, #0x000A0000
371 add r1, r1, #0x00000F0
372 str r1, [r0, #CLKCTL_CCOSR]
Stefano Babica521a772010-01-20 18:19:32 +0100373
Fabio Estevam3ad50f82012-10-15 05:37:15 +0000374#endif /* CONFIG_MX53 */
Stefano Babica521a772010-01-20 18:19:32 +0100375.endm
376
Aneesh Vfd8798b2012-03-08 07:20:18 +0000377ENTRY(lowlevel_init)
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000378 mov r10, lr
379 mov r4, #0 /* Fix R4 to 0 */
380
Benoît Thébaudeauaa2bcc22012-11-05 10:07:04 +0000381#if defined(CONFIG_SYS_MAIN_PWR_ON)
Stefano Babica521a772010-01-20 18:19:32 +0100382 ldr r0, =GPIO1_BASE_ADDR
383 ldr r1, [r0, #0x0]
Benoît Thébaudeau118e0bc2012-08-14 05:18:43 +0000384 orr r1, r1, #1 << 23
Stefano Babica521a772010-01-20 18:19:32 +0100385 str r1, [r0, #0x0]
386 ldr r1, [r0, #0x4]
Benoît Thébaudeau118e0bc2012-08-14 05:18:43 +0000387 orr r1, r1, #1 << 23
Stefano Babica521a772010-01-20 18:19:32 +0100388 str r1, [r0, #0x4]
Liu Hui-R64343baa2d782011-01-03 22:27:35 +0000389#endif
Stefano Babica521a772010-01-20 18:19:32 +0100390
Fabio Estevam52ba9322012-05-07 10:56:00 +0000391 init_arm_erratum
392
Stefano Babica521a772010-01-20 18:19:32 +0100393 init_l2cc
394
395 init_aips
396
397 init_m4if
398
399 init_clock
400
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000401 mov pc, r10
Aneesh Vfd8798b2012-03-08 07:20:18 +0000402ENDPROC(lowlevel_init)
Stefano Babica521a772010-01-20 18:19:32 +0100403
404/* Board level setting value */
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000405#if defined(CONFIG_MX51_PLL_ERRATA)
406W_DP_864: .word DP_OP_864
407 .word DP_MFD_864
408 .word DP_MFN_864
Benoît Thébaudeau118e0bc2012-08-14 05:18:43 +0000409W_DP_MFN_800_DIT: .word DP_MFN_800_DIT
Benoît Thébaudeau9d1f2822012-08-14 05:19:12 +0000410#else
411W_DP_800: .word DP_OP_800
412 .word DP_MFD_800
413 .word DP_MFN_800
414#endif
415#if defined(CONFIG_MX51)
416W_DP_665: .word DP_OP_665
417 .word DP_MFD_665
418 .word DP_MFN_665
419#endif
420W_DP_216: .word DP_OP_216
421 .word DP_MFD_216
422 .word DP_MFN_216
Fabio Estevam954f1b22012-10-15 05:37:16 +0000423W_DP_400: .word DP_OP_400
424 .word DP_MFD_400
425 .word DP_MFN_400
426W_DP_455: .word DP_OP_455
427 .word DP_MFD_455
428 .word DP_MFN_455