1 /* Simulator for Analog Devices Blackfin processors.
3 Copyright (C) 2005-2011 Free Software Foundation, Inc.
4 Contributed by Analog Devices, Inc.
6 This file is part of simulators.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
24 #include "gdb/sim-bfin.h"
29 #include "dv-bfin_cec.h"
30 #include "dv-bfin_ctimer.h"
31 #include "dv-bfin_dma.h"
32 #include "dv-bfin_dmac.h"
33 #include "dv-bfin_ebiu_amc.h"
34 #include "dv-bfin_ebiu_ddrc.h"
35 #include "dv-bfin_ebiu_sdc.h"
36 #include "dv-bfin_emac.h"
37 #include "dv-bfin_eppi.h"
38 #include "dv-bfin_evt.h"
39 #include "dv-bfin_gptimer.h"
40 #include "dv-bfin_jtag.h"
41 #include "dv-bfin_mmu.h"
42 #include "dv-bfin_nfc.h"
43 #include "dv-bfin_otp.h"
44 #include "dv-bfin_ppi.h"
45 #include "dv-bfin_pll.h"
46 #include "dv-bfin_rtc.h"
47 #include "dv-bfin_sic.h"
48 #include "dv-bfin_spi.h"
49 #include "dv-bfin_trace.h"
50 #include "dv-bfin_twi.h"
51 #include "dv-bfin_uart.h"
52 #include "dv-bfin_uart2.h"
53 #include "dv-bfin_wdog.h"
54 #include "dv-bfin_wp.h"
56 static const MACH bfin_mach;
58 struct bfin_memory_layout {
59 address_word addr, len;
60 unsigned mask; /* see mapmask in sim_core_attach() */
62 struct bfin_dev_layout {
63 address_word base, len;
67 struct bfin_dmac_layout {
69 unsigned int dma_count;
71 struct bfin_model_data {
74 const struct bfin_memory_layout *mem;
76 const struct bfin_dev_layout *dev;
78 const struct bfin_dmac_layout *dmac;
82 #define LAYOUT(_addr, _len, _mask) { .addr = _addr, .len = _len, .mask = access_##_mask, }
83 #define _DEVICE(_base, _len, _dev, _dmac) { .base = _base, .len = _len, .dev = _dev, .dmac = _dmac, }
84 #define DEVICE(_base, _len, _dev) _DEVICE(_base, _len, _dev, 0)
86 /* [1] Common sim code can't model exec-only memory.
87 http://sourceware.org/ml/gdb/2010-02/msg00047.html */
89 #define bf000_chipid 0
90 static const struct bfin_memory_layout bf000_mem[] = {};
91 static const struct bfin_dev_layout bf000_dev[] = {};
92 static const struct bfin_dmac_layout bf000_dmac[] = {};
94 #define bf50x_chipid 0x2800
95 #define bf504_chipid bf50x_chipid
96 #define bf506_chipid bf50x_chipid
97 static const struct bfin_memory_layout bf50x_mem[] =
99 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
100 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
101 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
102 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
103 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTH stub */
104 LAYOUT (0xFFC03200, 0x50, read_write), /* PORT_MUX stub */
105 LAYOUT (0xFFC03800, 0x100, read_write), /* RSI stub */
106 LAYOUT (0xFFC0328C, 0xC, read_write), /* Flash stub */
107 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
108 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
109 LAYOUT (0xFFA00000, 0x4000, read_write_exec), /* Inst A [1] */
110 LAYOUT (0xFFA04000, 0x4000, read_write_exec), /* Inst Cache [1] */
112 #define bf504_mem bf50x_mem
113 #define bf506_mem bf50x_mem
114 static const struct bfin_dev_layout bf50x_dev[] =
116 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
117 DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE, "bfin_uart2@0"),
118 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
119 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
120 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
121 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
122 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
123 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
124 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
125 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
126 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
127 DEVICE (0xFFC00A00, BF50X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
128 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
129 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
130 DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE, "bfin_uart2@1"),
131 DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
133 #define bf504_dev bf50x_dev
134 #define bf506_dev bf50x_dev
135 static const struct bfin_dmac_layout bf50x_dmac[] =
137 { BFIN_MMR_DMAC0_BASE, 12, },
139 #define bf504_dmac bf50x_dmac
140 #define bf506_dmac bf50x_dmac
142 #define bf51x_chipid 0x27e8
143 #define bf512_chipid bf51x_chipid
144 #define bf514_chipid bf51x_chipid
145 #define bf516_chipid bf51x_chipid
146 #define bf518_chipid bf51x_chipid
147 static const struct bfin_memory_layout bf51x_mem[] =
149 LAYOUT (0xFFC00680, 0xC, read_write), /* TIMER stub */
150 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
151 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
152 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
153 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
154 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTH stub */
155 LAYOUT (0xFFC03200, 0x50, read_write), /* PORT_MUX stub */
156 LAYOUT (0xFFC03800, 0xD0, read_write), /* RSI stub */
157 LAYOUT (0xFFC03FE0, 0x20, read_write), /* RSI peripheral stub */
158 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
159 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
160 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
161 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
162 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
163 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
165 #define bf512_mem bf51x_mem
166 #define bf514_mem bf51x_mem
167 #define bf516_mem bf51x_mem
168 #define bf518_mem bf51x_mem
169 static const struct bfin_dev_layout bf512_dev[] =
171 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
172 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
173 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
174 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
175 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
176 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
177 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
178 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
179 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
180 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
181 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
182 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
183 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
184 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
185 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
186 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
187 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
188 DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
189 DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE, "bfin_otp"),
191 #define bf514_dev bf512_dev
192 static const struct bfin_dev_layout bf516_dev[] =
194 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
195 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
196 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
197 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
198 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
199 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
200 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
201 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
202 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
203 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
204 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
205 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
206 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
207 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
208 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
209 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
210 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
211 DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE, "bfin_emac"),
212 DEVICE (0, 0x20, "bfin_emac/eth_phy"),
213 DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
214 DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE, "bfin_otp"),
216 #define bf518_dev bf516_dev
217 #define bf512_dmac bf50x_dmac
218 #define bf514_dmac bf50x_dmac
219 #define bf516_dmac bf50x_dmac
220 #define bf518_dmac bf50x_dmac
222 #define bf522_chipid 0x27e4
223 #define bf523_chipid 0x27e0
224 #define bf524_chipid bf522_chipid
225 #define bf525_chipid bf523_chipid
226 #define bf526_chipid bf522_chipid
227 #define bf527_chipid bf523_chipid
228 static const struct bfin_memory_layout bf52x_mem[] =
230 LAYOUT (0xFFC00680, 0xC, read_write), /* TIMER stub */
231 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
232 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
233 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
234 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
235 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTH stub */
236 LAYOUT (0xFFC03200, 0x50, read_write), /* PORT_MUX stub */
237 LAYOUT (0xFFC03800, 0x500, read_write), /* MUSB stub */
238 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
239 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
240 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
241 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
242 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
243 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
244 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
246 #define bf522_mem bf52x_mem
247 #define bf523_mem bf52x_mem
248 #define bf524_mem bf52x_mem
249 #define bf525_mem bf52x_mem
250 #define bf526_mem bf52x_mem
251 #define bf527_mem bf52x_mem
252 static const struct bfin_dev_layout bf522_dev[] =
254 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
255 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
256 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
257 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
258 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
259 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
260 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
261 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
262 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
263 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
264 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
265 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
266 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
267 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
268 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
269 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
270 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
271 DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE, "bfin_otp"),
272 DEVICE (0xFFC03700, BFIN_MMR_NFC_SIZE, "bfin_nfc"),
274 #define bf523_dev bf522_dev
275 #define bf524_dev bf522_dev
276 #define bf525_dev bf522_dev
277 static const struct bfin_dev_layout bf526_dev[] =
279 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
280 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
281 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
282 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
283 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
284 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
285 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
286 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
287 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
288 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
289 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
290 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
291 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
292 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
293 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
294 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
295 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
296 DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE, "bfin_emac"),
297 DEVICE (0, 0x20, "bfin_emac/eth_phy"),
298 DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE, "bfin_otp"),
299 DEVICE (0xFFC03700, BFIN_MMR_NFC_SIZE, "bfin_nfc"),
301 #define bf527_dev bf526_dev
302 #define bf522_dmac bf50x_dmac
303 #define bf523_dmac bf50x_dmac
304 #define bf524_dmac bf50x_dmac
305 #define bf525_dmac bf50x_dmac
306 #define bf526_dmac bf50x_dmac
307 #define bf527_dmac bf50x_dmac
309 #define bf531_chipid 0x27a5
310 #define bf532_chipid bf531_chipid
311 #define bf533_chipid bf531_chipid
312 static const struct bfin_memory_layout bf531_mem[] =
314 LAYOUT (0xFFC00640, 0xC, read_write), /* TIMER stub */
315 LAYOUT (0xFFC00700, 0x50, read_write), /* GPIO stub */
316 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
317 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
318 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
319 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
320 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
322 static const struct bfin_memory_layout bf532_mem[] =
324 LAYOUT (0xFFC00640, 0xC, read_write), /* TIMER stub */
325 LAYOUT (0xFFC00700, 0x50, read_write), /* GPIO stub */
326 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
327 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
328 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
329 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
330 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
331 LAYOUT (0xFFA0C000, 0x4000, read_write_exec), /* Inst C [1] */
332 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
334 static const struct bfin_memory_layout bf533_mem[] =
336 LAYOUT (0xFFC00640, 0xC, read_write), /* TIMER stub */
337 LAYOUT (0xFFC00700, 0x50, read_write), /* GPIO stub */
338 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
339 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
340 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
341 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
342 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
343 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
344 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
345 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
346 LAYOUT (0xFFA0C000, 0x4000, read_write_exec), /* Inst C [1] */
347 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
349 static const struct bfin_dev_layout bf533_dev[] =
351 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
352 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
353 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
354 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
355 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
356 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
357 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
358 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
359 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
360 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
362 #define bf531_dev bf533_dev
363 #define bf532_dev bf533_dev
364 static const struct bfin_dmac_layout bf533_dmac[] =
366 { BFIN_MMR_DMAC0_BASE, 8, },
368 #define bf531_dmac bf533_dmac
369 #define bf532_dmac bf533_dmac
371 #define bf534_chipid 0x27c6
372 #define bf536_chipid 0x27c8
373 #define bf537_chipid bf536_chipid
374 static const struct bfin_memory_layout bf534_mem[] =
376 LAYOUT (0xFFC00680, 0xC, read_write), /* TIMER stub */
377 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
378 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
379 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
380 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
381 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTH stub */
382 LAYOUT (0xFFC03200, 0x10, read_write), /* PORT_MUX stub */
383 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
384 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
385 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
386 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
387 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
388 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
389 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
391 static const struct bfin_memory_layout bf536_mem[] =
393 LAYOUT (0xFFC00680, 0xC, read_write), /* TIMER stub */
394 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
395 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
396 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
397 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
398 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTG stub */
399 LAYOUT (0xFFC03200, 0x10, read_write), /* PORT_MUX stub */
400 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
401 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
402 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
403 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
404 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
406 static const struct bfin_memory_layout bf537_mem[] =
408 LAYOUT (0xFFC00680, 0xC, read_write), /* TIMER stub */
409 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
410 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
411 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
412 LAYOUT (0xFFC01500, 0x50, read_write), /* PORTG stub */
413 LAYOUT (0xFFC01700, 0x50, read_write), /* PORTG stub */
414 LAYOUT (0xFFC03200, 0x10, read_write), /* PORT_MUX stub */
415 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
416 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
417 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
418 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
419 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
420 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
421 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
423 static const struct bfin_dev_layout bf534_dev[] =
425 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
426 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
427 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
428 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
429 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
430 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
431 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
432 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
433 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
434 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
435 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
436 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
437 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
438 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
439 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
440 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
441 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
443 static const struct bfin_dev_layout bf537_dev[] =
445 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
446 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
447 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
448 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
449 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
450 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
451 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
452 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
453 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
454 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
455 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
456 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
457 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
458 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
459 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
460 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
461 DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1"),
462 DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE, "bfin_emac"),
463 DEVICE (0, 0x20, "bfin_emac/eth_phy"),
465 #define bf536_dev bf537_dev
466 #define bf534_dmac bf50x_dmac
467 #define bf536_dmac bf50x_dmac
468 #define bf537_dmac bf50x_dmac
470 #define bf538_chipid 0x27c4
471 #define bf539_chipid bf538_chipid
472 static const struct bfin_memory_layout bf538_mem[] =
474 LAYOUT (0xFFC00700, 0x50, read_write), /* PORTF stub */
475 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
476 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
477 LAYOUT (0xFFC01500, 0x70, read_write), /* PORTC/D/E stub */
478 LAYOUT (0xFFC02500, 0x60, read_write), /* SPORT2 stub */
479 LAYOUT (0xFFC02600, 0x60, read_write), /* SPORT3 stub */
480 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
481 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
482 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
483 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
484 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
485 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
486 LAYOUT (0xFFA0C000, 0x4000, read_write_exec), /* Inst C [1] */
487 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
489 #define bf539_mem bf538_mem
490 static const struct bfin_dev_layout bf538_dev[] =
492 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
493 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
494 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
495 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
496 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
497 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
498 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
499 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
500 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
501 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
502 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
503 _DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE, "bfin_uart@1", 1),
504 _DEVICE (0xFFC02100, BFIN_MMR_UART_SIZE, "bfin_uart@2", 1),
505 DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE, "bfin_twi@1"),
506 _DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE, "bfin_spi@1", 1),
507 _DEVICE (0xFFC02400, BFIN_MMR_SPI_SIZE, "bfin_spi@2", 1),
509 #define bf539_dev bf538_dev
510 static const struct bfin_dmac_layout bf538_dmac[] =
512 { BFIN_MMR_DMAC0_BASE, 8, },
513 { BFIN_MMR_DMAC1_BASE, 12, },
515 #define bf539_dmac bf538_dmac
517 #define bf54x_chipid 0x27de
518 #define bf542_chipid bf54x_chipid
519 #define bf544_chipid bf54x_chipid
520 #define bf547_chipid bf54x_chipid
521 #define bf548_chipid bf54x_chipid
522 #define bf549_chipid bf54x_chipid
523 static const struct bfin_memory_layout bf54x_mem[] =
525 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub XXX: not on BF542/4 */
526 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
527 LAYOUT (0xFFC01400, 0x200, read_write), /* PORT/GPIO stub */
528 LAYOUT (0xFFC02500, 0x60, read_write), /* SPORT2 stub */
529 LAYOUT (0xFFC02600, 0x60, read_write), /* SPORT3 stub */
530 LAYOUT (0xFFC03800, 0x70, read_write), /* ATAPI stub */
531 LAYOUT (0xFFC03900, 0x100, read_write), /* RSI stub */
532 LAYOUT (0xFFC03C00, 0x500, read_write), /* MUSB stub */
533 LAYOUT (0xFEB00000, 0x20000, read_write_exec), /* L2 */
534 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
535 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
536 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
537 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
538 LAYOUT (0xFFA00000, 0x8000, read_write_exec), /* Inst A [1] */
539 LAYOUT (0xFFA08000, 0x4000, read_write_exec), /* Inst B [1] */
540 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
542 #define bf542_mem bf54x_mem
543 #define bf544_mem bf54x_mem
544 #define bf547_mem bf54x_mem
545 #define bf548_mem bf54x_mem
546 #define bf549_mem bf54x_mem
547 static const struct bfin_dev_layout bf542_dev[] =
549 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
550 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
551 DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE, "bfin_uart2@0"),
552 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
553 DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
554 DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
555 DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
556 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE, "bfin_eppi@1", 1),
557 DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
558 DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
559 DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
560 DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
561 DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
562 DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
563 DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
564 DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
565 DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE, "bfin_uart2@1"),
566 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE, "bfin_uart2@2", 1),
567 DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
568 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE, "bfin_eppi@2", 1),
569 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE, "bfin_uart2@3", 1),
570 DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE, "bfin_nfc"),
571 DEVICE (0xFFC04300, BFIN_MMR_OTP_SIZE, "bfin_otp"),
573 static const struct bfin_dev_layout bf544_dev[] =
575 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
576 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
577 DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE, "bfin_uart2@0"),
578 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
579 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@8"),
580 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@9"),
581 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@10"),
582 DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
583 DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
584 DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
585 _DEVICE (0xFFC01000, BFIN_MMR_EPPI_SIZE, "bfin_eppi@0", 1),
586 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE, "bfin_eppi@1", 1),
587 DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
588 DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
589 DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
590 DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
591 DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
592 DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
593 DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
594 DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
595 DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE, "bfin_uart2@1"),
596 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE, "bfin_uart2@2", 1),
597 DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE, "bfin_twi@1"),
598 DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
599 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE, "bfin_eppi@2", 1),
600 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE, "bfin_uart2@3", 1),
601 DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE, "bfin_nfc"),
602 DEVICE (0xFFC04300, BFIN_MMR_OTP_SIZE, "bfin_otp"),
604 static const struct bfin_dev_layout bf547_dev[] =
606 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
607 DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE, "bfin_rtc"),
608 DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE, "bfin_uart2@0"),
609 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
610 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@8"),
611 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@9"),
612 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@10"),
613 DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
614 DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
615 DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
616 _DEVICE (0xFFC01000, BFIN_MMR_EPPI_SIZE, "bfin_eppi@0", 1),
617 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE, "bfin_eppi@1", 1),
618 DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
619 DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
620 DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
621 DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
622 DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
623 DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
624 DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
625 DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
626 DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE, "bfin_uart2@1"),
627 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE, "bfin_uart2@2", 1),
628 DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE, "bfin_twi@1"),
629 DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
630 _DEVICE (0xFFC02400, BFIN_MMR_SPI_SIZE, "bfin_spi@2", 1),
631 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE, "bfin_eppi@2", 1),
632 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE, "bfin_uart2@3", 1),
633 DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE, "bfin_nfc"),
635 #define bf548_dev bf547_dev
636 #define bf549_dev bf547_dev
637 static const struct bfin_dmac_layout bf54x_dmac[] =
639 { BFIN_MMR_DMAC0_BASE, 12, },
640 { BFIN_MMR_DMAC1_BASE, 12, },
642 #define bf542_dmac bf54x_dmac
643 #define bf544_dmac bf54x_dmac
644 #define bf547_dmac bf54x_dmac
645 #define bf548_dmac bf54x_dmac
646 #define bf549_dmac bf54x_dmac
648 /* This is only Core A of course ... */
649 #define bf561_chipid 0x27bb
650 static const struct bfin_memory_layout bf561_mem[] =
652 LAYOUT (0xFFC00700, 0x50, read_write), /* GPIO0 stub */
653 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
654 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
655 LAYOUT (0xFFC01500, 0x50, read_write), /* GPIO1 stub */
656 LAYOUT (0xFFC01700, 0x50, read_write), /* GPIO2 stub */
657 LAYOUT (0xFEB00000, 0x20000, read_write_exec), /* L2 */
658 LAYOUT (0xFF800000, 0x4000, read_write), /* Data A */
659 LAYOUT (0xFF804000, 0x4000, read_write), /* Data A Cache */
660 LAYOUT (0xFF900000, 0x4000, read_write), /* Data B */
661 LAYOUT (0xFF904000, 0x4000, read_write), /* Data B Cache */
662 LAYOUT (0xFFA00000, 0x4000, read_write_exec), /* Inst A [1] */
663 LAYOUT (0xFFA10000, 0x4000, read_write_exec), /* Inst Cache [1] */
665 static const struct bfin_dev_layout bf561_dev[] =
667 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
668 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
669 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
670 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
671 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
672 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
673 DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@3"),
674 DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@4"),
675 DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@5"),
676 DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@6"),
677 DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@7"),
678 DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
679 DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE, "bfin_ebiu_sdc"),
680 _DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0", 1),
681 DEVICE (0xFFC01200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@1"),
682 _DEVICE (0xFFC01300, BFIN_MMR_PPI_SIZE, "bfin_ppi@1", 1),
683 DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@8"),
684 DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@9"),
685 DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@10"),
686 DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@11"),
688 static const struct bfin_dmac_layout bf561_dmac[] =
690 { BFIN_MMR_DMAC0_BASE, 12, },
691 { BFIN_MMR_DMAC1_BASE, 12, },
692 /* XXX: IMDMA: { 0xFFC01800, 4, }, */
695 #define bf592_chipid 0x20cb
696 static const struct bfin_memory_layout bf592_mem[] =
698 LAYOUT (0xFFC00700, 0x50, read_write), /* GPIO0 stub */
699 LAYOUT (0xFFC00800, 0x60, read_write), /* SPORT0 stub */
700 LAYOUT (0xFFC00900, 0x60, read_write), /* SPORT1 stub */
701 LAYOUT (0xFFC01500, 0x50, read_write), /* GPIO1 stub */
702 LAYOUT (0xFF800000, 0x8000, read_write), /* Data A */
703 LAYOUT (0xFFA00000, 0x4000, read_write_exec), /* Inst A [1] */
704 LAYOUT (0xFFA04000, 0x4000, read_write_exec), /* Inst B [1] */
706 static const struct bfin_dev_layout bf592_dev[] =
708 DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE, "bfin_wdog@0"),
709 DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE, "bfin_uart@0"),
710 DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE, "bfin_spi@0"),
711 DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@0"),
712 DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@1"),
713 DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE, "bfin_gptimer@2"),
714 DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE, "bfin_ppi@0"),
715 DEVICE (0xFFC01300, BFIN_MMR_SPI_SIZE, "bfin_spi@1"),
716 DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE, "bfin_twi@0"),
718 static const struct bfin_dmac_layout bf592_dmac[] =
720 /* XXX: there are only 9 channels, but mdma code below assumes that they
721 start right after the dma channels ... */
722 { BFIN_MMR_DMAC0_BASE, 12, },
725 static const struct bfin_model_data bfin_model_data[] =
730 bf##n##_mem , ARRAY_SIZE (bf##n##_mem ), \
731 bf##n##_dev , ARRAY_SIZE (bf##n##_dev ), \
732 bf##n##_dmac, ARRAY_SIZE (bf##n##_dmac), \
734 #include "proc_list.def"
738 #define CORE_DEVICE(dev, DEV) \
739 DEVICE (BFIN_COREMMR_##DEV##_BASE, BFIN_COREMMR_##DEV##_SIZE, "bfin_"#dev)
740 static const struct bfin_dev_layout bfin_core_dev[] =
742 CORE_DEVICE (cec, CEC),
743 CORE_DEVICE (ctimer, CTIMER),
744 CORE_DEVICE (evt, EVT),
745 CORE_DEVICE (jtag, JTAG),
746 CORE_DEVICE (mmu, MMU),
747 CORE_DEVICE (trace, TRACE),
748 CORE_DEVICE (wp, WP),
751 #define dv_bfin_hw_parse(sd, dv, DV) \
753 bu32 base = BFIN_MMR_##DV##_BASE; \
754 bu32 size = BFIN_MMR_##DV##_SIZE; \
755 sim_hw_parse (sd, "/core/bfin_"#dv"/reg %#x %i", base, size); \
756 sim_hw_parse (sd, "/core/bfin_"#dv"/type %i", mdata->model_num); \
760 bfin_model_hw_tree_init (SIM_DESC sd, SIM_CPU *cpu)
762 const MODEL *model = CPU_MODEL (cpu);
763 const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
764 const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
765 int mnum = MODEL_NUM (model);
766 unsigned i, j, dma_chan;
768 /* Map the core devices. */
769 for (i = 0; i < ARRAY_SIZE (bfin_core_dev); ++i)
771 const struct bfin_dev_layout *dev = &bfin_core_dev[i];
772 sim_hw_parse (sd, "/core/%s/reg %#x %i", dev->dev, dev->base, dev->len);
774 sim_hw_parse (sd, "/core/bfin_ctimer > ivtmr ivtmr /core/bfin_cec");
776 if (mnum == MODEL_BF000)
779 /* Map the system devices. */
780 dv_bfin_hw_parse (sd, sic, SIC);
781 sim_hw_parse (sd, "/core/bfin_sic/type %i", mdata->model_num);
782 for (i = 7; i < 16; ++i)
783 sim_hw_parse (sd, "/core/bfin_sic > ivg%i ivg%i /core/bfin_cec", i, i);
785 dv_bfin_hw_parse (sd, pll, PLL);
786 sim_hw_parse (sd, "/core/bfin_pll > pll pll /core/bfin_sic");
789 for (i = 0; i < mdata->dmac_count; ++i)
791 const struct bfin_dmac_layout *dmac = &mdata->dmac[i];
793 sim_hw_parse (sd, "/core/bfin_dmac@%u/type %i", i, mdata->model_num);
795 /* Hook up the non-mdma channels. */
796 for (j = 0; j < dmac->dma_count; ++j)
798 sim_hw_parse (sd, "/core/bfin_dmac@%u/bfin_dma@%u/reg %#x %i", i,
799 dma_chan, dmac->base + j * BFIN_MMR_DMA_SIZE,
802 /* Could route these into the bfin_dmac and let that
803 forward it to the SIC, but not much value. */
804 sim_hw_parse (sd, "/core/bfin_dmac@%u/bfin_dma@%u > di dma@%u /core/bfin_sic",
805 i, dma_chan, dma_chan);
810 /* Hook up the mdma channels -- assume every DMAC has 4. */
811 for (j = 0; j < 4; ++j)
813 sim_hw_parse (sd, "/core/bfin_dmac@%u/bfin_dma@%u/reg %#x %i",
814 i, j + BFIN_DMAC_MDMA_BASE,
815 dmac->base + (j + dmac->dma_count) * BFIN_MMR_DMA_SIZE,
817 sim_hw_parse (sd, "/core/bfin_dmac@%u/bfin_dma@%u > di mdma@%u /core/bfin_sic",
818 i, j + BFIN_DMAC_MDMA_BASE, (2 * i) + (j / 2));
822 for (i = 0; i < mdata->dev_count; ++i)
824 const struct bfin_dev_layout *dev = &mdata->dev[i];
825 sim_hw_parse (sd, "/core/%s/reg %#x %i", dev->dev, dev->base, dev->len);
826 sim_hw_parse (sd, "/core/%s/type %i", dev->dev, mdata->model_num);
827 if (strchr (dev->dev, '/'))
829 if (!strncmp (dev->dev, "bfin_uart", 9)
830 || !strncmp (dev->dev, "bfin_emac", 9)
831 || !strncmp (dev->dev, "bfin_sport", 10))
833 const char *sint = dev->dev + 5;
834 sim_hw_parse (sd, "/core/%s > tx %s_tx /core/bfin_dmac@%u", dev->dev, sint, dev->dmac);
835 sim_hw_parse (sd, "/core/%s > rx %s_rx /core/bfin_dmac@%u", dev->dev, sint, dev->dmac);
836 sim_hw_parse (sd, "/core/%s > stat %s_stat /core/bfin_sic", dev->dev, sint);
838 else if (!strncmp (dev->dev, "bfin_gptimer", 12)
839 || !strncmp (dev->dev, "bfin_ppi", 8)
840 || !strncmp (dev->dev, "bfin_spi", 8)
841 || !strncmp (dev->dev, "bfin_twi", 8))
843 const char *sint = dev->dev + 5;
844 sim_hw_parse (sd, "/core/%s > stat %s /core/bfin_sic", dev->dev, sint);
846 else if (!strncmp (dev->dev, "bfin_rtc", 8))
848 const char *sint = dev->dev + 5;
849 sim_hw_parse (sd, "/core/%s > %s %s /core/bfin_sic", dev->dev, sint, sint);
851 else if (!strncmp (dev->dev, "bfin_wdog", 9))
853 sim_hw_parse (sd, "/core/%s > reset rst /core/bfin_cec", dev->dev);
854 sim_hw_parse (sd, "/core/%s > nmi nmi /core/bfin_cec", dev->dev);
855 sim_hw_parse (sd, "/core/%s > gpi wdog /core/bfin_sic", dev->dev);
860 /* Add any additional user board content. */
862 sim_do_commandf (sd, "hw-file %s", board->hw_file);
864 /* Trigger all the new devices' finish func. */
865 hw_tree_finish (dv_get_device (cpu, "/"));
868 #include "bfroms/all.h"
871 bu32 addr, len, alias_len;
876 #define BFROMA(addr, rom, sirev, alias_len) \
877 { addr, sizeof (bfrom_bf##rom##_0_##sirev), alias_len, \
878 sirev, bfrom_bf##rom##_0_##sirev, }
879 #define BFROM(rom, sirev, alias_len) BFROMA (0xef000000, rom, sirev, alias_len)
880 #define BFROM_STUB { 0, 0, 0, 0, NULL, }
881 static const struct bfrom bf50x_roms[] =
883 BFROM (50x, 0, 0x1000000),
886 static const struct bfrom bf51x_roms[] =
888 BFROM (51x, 2, 0x1000000),
889 BFROM (51x, 1, 0x1000000),
890 BFROM (51x, 0, 0x1000000),
893 static const struct bfrom bf526_roms[] =
895 BFROM (526, 1, 0x1000000),
896 BFROM (526, 0, 0x1000000),
899 static const struct bfrom bf527_roms[] =
901 BFROM (527, 2, 0x1000000),
902 BFROM (527, 1, 0x1000000),
903 BFROM (527, 0, 0x1000000),
906 static const struct bfrom bf533_roms[] =
908 BFROM (533, 6, 0x1000000),
909 BFROM (533, 5, 0x1000000),
910 BFROM (533, 4, 0x1000000),
911 BFROM (533, 3, 0x1000000),
912 BFROM (533, 2, 0x1000000),
913 BFROM (533, 1, 0x1000000),
916 static const struct bfrom bf537_roms[] =
918 BFROM (537, 3, 0x100000),
919 BFROM (537, 2, 0x100000),
920 BFROM (537, 1, 0x100000),
921 BFROM (537, 0, 0x100000),
924 static const struct bfrom bf538_roms[] =
926 BFROM (538, 5, 0x1000000),
927 BFROM (538, 4, 0x1000000),
928 BFROM (538, 3, 0x1000000),
929 BFROM (538, 2, 0x1000000),
930 BFROM (538, 1, 0x1000000),
931 BFROM (538, 0, 0x1000000),
934 static const struct bfrom bf54x_roms[] =
939 BFROMA (0xffa14000, 54x_l1, 2, 0),
940 BFROMA (0xffa14000, 54x_l1, 1, 0),
941 BFROMA (0xffa14000, 54x_l1, 0, 0),
944 static const struct bfrom bf561_roms[] =
946 /* XXX: No idea what the actual wrap limit is here. */
950 static const struct bfrom bf59x_roms[] =
952 BFROM (59x, 1, 0x1000000),
953 BFROM (59x, 0, 0x1000000),
954 BFROMA (0xffa10000, 59x_l1, 1, 0),
959 bfin_model_map_bfrom (SIM_DESC sd, SIM_CPU *cpu)
961 const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
962 const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
963 int mnum = mdata->model_num;
964 const struct bfrom *bfrom;
967 if (mnum >= 500 && mnum <= 509)
969 else if (mnum >= 510 && mnum <= 519)
971 else if (mnum >= 520 && mnum <= 529)
972 bfrom = (mnum & 1) ? bf527_roms : bf526_roms;
973 else if (mnum >= 531 && mnum <= 533)
975 else if (mnum == 535)
977 else if (mnum >= 534 && mnum <= 537)
979 else if (mnum >= 538 && mnum <= 539)
981 else if (mnum >= 540 && mnum <= 549)
983 else if (mnum == 561)
985 else if (mnum >= 590 && mnum <= 599)
990 if (board->sirev_valid)
991 sirev = board->sirev;
993 sirev = bfrom->sirev;
996 /* Map all the ranges for this model/sirev. */
997 if (bfrom->sirev == sirev)
998 sim_core_attach (sd, NULL, 0, access_read_exec, 0, bfrom->addr,
999 bfrom->alias_len ? : bfrom->len, bfrom->len, NULL,
1000 (char *)bfrom->buf);
1006 bfin_model_cpu_init (SIM_DESC sd, SIM_CPU *cpu)
1008 const MODEL *model = CPU_MODEL (cpu);
1009 const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1010 int mnum = MODEL_NUM (model);
1013 /* These memory maps are supposed to be cpu-specific, but the common sim
1014 code does not yet allow that (2nd arg is "cpu" rather than "NULL". */
1015 sim_core_attach (sd, NULL, 0, access_read_write, 0, BFIN_L1_SRAM_SCRATCH,
1016 BFIN_L1_SRAM_SCRATCH_SIZE, 0, NULL, NULL);
1018 if (STATE_ENVIRONMENT (CPU_STATE (cpu)) != OPERATING_ENVIRONMENT)
1021 if (mnum == MODEL_BF000)
1024 /* Map in the on-chip memories (SRAMs). */
1025 mdata = &bfin_model_data[MODEL_NUM (model)];
1026 for (idx = 0; idx < mdata->mem_count; ++idx)
1028 const struct bfin_memory_layout *mem = &mdata->mem[idx];
1029 sim_core_attach (sd, NULL, 0, mem->mask, 0, mem->addr,
1030 mem->len, 0, NULL, NULL);
1033 /* Map the on-chip ROMs. */
1034 bfin_model_map_bfrom (sd, cpu);
1037 /* Finally, build up the tree for this cpu model. */
1038 bfin_model_hw_tree_init (sd, cpu);
1042 bfin_model_get_chipid (SIM_DESC sd)
1044 SIM_CPU *cpu = STATE_CPU (sd, 0);
1045 const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1046 const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1048 (board->sirev << 28) |
1049 (mdata->chipid << 12) |
1050 (((0xE5 << 1) | 1) & 0xFF);
1054 bfin_model_get_dspid (SIM_DESC sd)
1056 const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1064 bfin_model_init (SIM_CPU *cpu)
1066 CPU_MODEL_DATA (cpu) = (void *) &bfin_model_data[MODEL_NUM (CPU_MODEL (cpu))];
1070 bfin_extract_unsigned_integer (unsigned char *addr, int len)
1074 unsigned char * startaddr = (unsigned char *)addr;
1075 unsigned char * endaddr = startaddr + len;
1079 for (p = endaddr; p > startaddr;)
1080 retval = (retval << 8) | *--p;
1086 bfin_store_unsigned_integer (unsigned char *addr, int len, bu32 val)
1089 unsigned char *startaddr = addr;
1090 unsigned char *endaddr = startaddr + len;
1092 for (p = startaddr; p < endaddr;)
1100 bfin_get_reg (SIM_CPU *cpu, int rn)
1104 case SIM_BFIN_R0_REGNUM: return &DREG (0);
1105 case SIM_BFIN_R1_REGNUM: return &DREG (1);
1106 case SIM_BFIN_R2_REGNUM: return &DREG (2);
1107 case SIM_BFIN_R3_REGNUM: return &DREG (3);
1108 case SIM_BFIN_R4_REGNUM: return &DREG (4);
1109 case SIM_BFIN_R5_REGNUM: return &DREG (5);
1110 case SIM_BFIN_R6_REGNUM: return &DREG (6);
1111 case SIM_BFIN_R7_REGNUM: return &DREG (7);
1112 case SIM_BFIN_P0_REGNUM: return &PREG (0);
1113 case SIM_BFIN_P1_REGNUM: return &PREG (1);
1114 case SIM_BFIN_P2_REGNUM: return &PREG (2);
1115 case SIM_BFIN_P3_REGNUM: return &PREG (3);
1116 case SIM_BFIN_P4_REGNUM: return &PREG (4);
1117 case SIM_BFIN_P5_REGNUM: return &PREG (5);
1118 case SIM_BFIN_SP_REGNUM: return &SPREG;
1119 case SIM_BFIN_FP_REGNUM: return &FPREG;
1120 case SIM_BFIN_I0_REGNUM: return &IREG (0);
1121 case SIM_BFIN_I1_REGNUM: return &IREG (1);
1122 case SIM_BFIN_I2_REGNUM: return &IREG (2);
1123 case SIM_BFIN_I3_REGNUM: return &IREG (3);
1124 case SIM_BFIN_M0_REGNUM: return &MREG (0);
1125 case SIM_BFIN_M1_REGNUM: return &MREG (1);
1126 case SIM_BFIN_M2_REGNUM: return &MREG (2);
1127 case SIM_BFIN_M3_REGNUM: return &MREG (3);
1128 case SIM_BFIN_B0_REGNUM: return &BREG (0);
1129 case SIM_BFIN_B1_REGNUM: return &BREG (1);
1130 case SIM_BFIN_B2_REGNUM: return &BREG (2);
1131 case SIM_BFIN_B3_REGNUM: return &BREG (3);
1132 case SIM_BFIN_L0_REGNUM: return &LREG (0);
1133 case SIM_BFIN_L1_REGNUM: return &LREG (1);
1134 case SIM_BFIN_L2_REGNUM: return &LREG (2);
1135 case SIM_BFIN_L3_REGNUM: return &LREG (3);
1136 case SIM_BFIN_RETS_REGNUM: return &RETSREG;
1137 case SIM_BFIN_A0_DOT_X_REGNUM: return &AXREG (0);
1138 case SIM_BFIN_A0_DOT_W_REGNUM: return &AWREG (0);
1139 case SIM_BFIN_A1_DOT_X_REGNUM: return &AXREG (1);
1140 case SIM_BFIN_A1_DOT_W_REGNUM: return &AWREG (1);
1141 case SIM_BFIN_LC0_REGNUM: return &LCREG (0);
1142 case SIM_BFIN_LT0_REGNUM: return <REG (0);
1143 case SIM_BFIN_LB0_REGNUM: return &LBREG (0);
1144 case SIM_BFIN_LC1_REGNUM: return &LCREG (1);
1145 case SIM_BFIN_LT1_REGNUM: return <REG (1);
1146 case SIM_BFIN_LB1_REGNUM: return &LBREG (1);
1147 case SIM_BFIN_CYCLES_REGNUM: return &CYCLESREG;
1148 case SIM_BFIN_CYCLES2_REGNUM: return &CYCLES2REG;
1149 case SIM_BFIN_USP_REGNUM: return &USPREG;
1150 case SIM_BFIN_SEQSTAT_REGNUM: return &SEQSTATREG;
1151 case SIM_BFIN_SYSCFG_REGNUM: return &SYSCFGREG;
1152 case SIM_BFIN_RETI_REGNUM: return &RETIREG;
1153 case SIM_BFIN_RETX_REGNUM: return &RETXREG;
1154 case SIM_BFIN_RETN_REGNUM: return &RETNREG;
1155 case SIM_BFIN_RETE_REGNUM: return &RETEREG;
1156 case SIM_BFIN_PC_REGNUM: return &PCREG;
1157 default: return NULL;
1162 bfin_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1166 reg = bfin_get_reg (cpu, rn);
1169 else if (rn == SIM_BFIN_ASTAT_REGNUM)
1171 else if (rn == SIM_BFIN_CC_REGNUM)
1174 return 0; // will be an error in gdb
1176 /* Handle our KSP/USP shadowing in SP. While in supervisor mode, we
1177 have the normal SP/USP behavior. User mode is tricky though. */
1178 if (STATE_ENVIRONMENT (CPU_STATE (cpu)) == OPERATING_ENVIRONMENT
1179 && cec_is_user_mode (cpu))
1181 if (rn == SIM_BFIN_SP_REGNUM)
1183 else if (rn == SIM_BFIN_USP_REGNUM)
1187 bfin_store_unsigned_integer (buf, 4, value);
1189 return -1; // disables size checking in gdb
1193 bfin_reg_store (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1197 value = bfin_extract_unsigned_integer (buf, 4);
1198 reg = bfin_get_reg (cpu, rn);
1201 /* XXX: Need register trace ? */
1203 else if (rn == SIM_BFIN_ASTAT_REGNUM)
1205 else if (rn == SIM_BFIN_CC_REGNUM)
1208 return 0; // will be an error in gdb
1210 return -1; // disables size checking in gdb
1214 bfin_pc_get (SIM_CPU *cpu)
1220 bfin_pc_set (SIM_CPU *cpu, sim_cia newpc)
1226 bfin_insn_name (SIM_CPU *cpu, int i)
1228 static const char * const insn_name[] = {
1229 #define I(insn) #insn,
1230 #include "insn_list.def"
1233 return insn_name[i];
1237 bfin_init_cpu (SIM_CPU *cpu)
1239 CPU_REG_FETCH (cpu) = bfin_reg_fetch;
1240 CPU_REG_STORE (cpu) = bfin_reg_store;
1241 CPU_PC_FETCH (cpu) = bfin_pc_get;
1242 CPU_PC_STORE (cpu) = bfin_pc_set;
1243 CPU_MAX_INSNS (cpu) = BFIN_INSN_MAX;
1244 CPU_INSN_NAME (cpu) = bfin_insn_name;
1248 bfin_prepare_run (SIM_CPU *cpu)
1252 static const MODEL bfin_models[] =
1254 #define P(n) { "bf"#n, & bfin_mach, MODEL_BF##n, NULL, bfin_model_init },
1255 #include "proc_list.def"
1257 { 0, NULL, 0, NULL, NULL, }
1260 static const MACH_IMP_PROPERTIES bfin_imp_properties =
1266 static const MACH bfin_mach =
1268 "bfin", "bfin", MACH_BFIN,
1269 32, 32, & bfin_models[0], & bfin_imp_properties,
1274 const MACH *sim_machs[] =
1280 /* Device option parsing. */
1282 static DECLARE_OPTION_HANDLER (bfin_mach_option_handler);
1285 OPTION_MACH_SIREV = OPTION_START,
1286 OPTION_MACH_HW_BOARD_FILE,
1289 const OPTION bfin_mach_options[] =
1291 { {"sirev", required_argument, NULL, OPTION_MACH_SIREV },
1292 '\0', "NUMBER", "Set CPU silicon revision",
1293 bfin_mach_option_handler, NULL },
1295 { {"hw-board-file", required_argument, NULL, OPTION_MACH_HW_BOARD_FILE },
1296 '\0', "FILE", "Add the supplemental devices listed in the file",
1297 bfin_mach_option_handler, NULL },
1299 { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
1303 bfin_mach_option_handler (SIM_DESC sd, sim_cpu *current_cpu, int opt,
1304 char *arg, int is_command)
1306 struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1310 case OPTION_MACH_SIREV:
1311 board->sirev_valid = 1;
1312 /* Accept (and throw away) a leading "0." in the version. */
1313 if (!strncmp (arg, "0.", 2))
1315 board->sirev = atoi (arg);
1316 if (board->sirev > 0xf)
1318 sim_io_eprintf (sd, "sirev '%s' needs to fit into 4 bits\n", arg);
1323 case OPTION_MACH_HW_BOARD_FILE:
1324 board->hw_file = xstrdup (arg);
1328 sim_io_eprintf (sd, "Unknown Blackfin option %d\n", opt);