sim: bfin: fix brace style
[external/binutils.git] / sim / bfin / machs.c
1 /* Simulator for Analog Devices Blackfin processors.
2
3    Copyright (C) 2005-2011 Free Software Foundation, Inc.
4    Contributed by Analog Devices, Inc.
5
6    This file is part of simulators.
7
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.
12
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.
17
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/>.  */
20
21 #include "config.h"
22
23 #include "sim-main.h"
24 #include "gdb/sim-bfin.h"
25 #include "bfd.h"
26
27 #include "sim-hw.h"
28 #include "devices.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"
55
56 static const MACH bfin_mach;
57
58 struct bfin_memory_layout {
59   address_word addr, len;
60   unsigned mask;        /* see mapmask in sim_core_attach() */
61 };
62 struct bfin_dev_layout {
63   address_word base, len;
64   unsigned int dmac;
65   const char *dev;
66 };
67 struct bfin_dmac_layout {
68   address_word base;
69   unsigned int dma_count;
70 };
71 struct bfin_model_data {
72   bu32 chipid;
73   int model_num;
74   const struct bfin_memory_layout *mem;
75   size_t mem_count;
76   const struct bfin_dev_layout *dev;
77   size_t dev_count;
78   const struct bfin_dmac_layout *dmac;
79   size_t dmac_count;
80 };
81
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)
85
86 /* [1] Common sim code can't model exec-only memory.
87    http://sourceware.org/ml/gdb/2010-02/msg00047.html */
88
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[] = {};
93
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[] =
98 {
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] */
111 };
112 #define bf504_mem bf50x_mem
113 #define bf506_mem bf50x_mem
114 static const struct bfin_dev_layout bf50x_dev[] =
115 {
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"),
132 };
133 #define bf504_dev bf50x_dev
134 #define bf506_dev bf50x_dev
135 static const struct bfin_dmac_layout bf50x_dmac[] =
136 {
137   { BFIN_MMR_DMAC0_BASE, 12, },
138 };
139 #define bf504_dmac bf50x_dmac
140 #define bf506_dmac bf50x_dmac
141
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[] =
148 {
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] */
164 };
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[] =
170 {
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"),
190 };
191 #define bf514_dev bf512_dev
192 static const struct bfin_dev_layout bf516_dev[] =
193 {
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"),
215 };
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
221
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[] =
229 {
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] */
245 };
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[] =
253 {
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"),
273 };
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[] =
278 {
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"),
300 };
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
308
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[] =
313 {
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] */
321 };
322 static const struct bfin_memory_layout bf532_mem[] =
323 {
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] */
333 };
334 static const struct bfin_memory_layout bf533_mem[] =
335 {
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] */
348 };
349 static const struct bfin_dev_layout bf533_dev[] =
350 {
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"),
361 };
362 #define bf531_dev bf533_dev
363 #define bf532_dev bf533_dev
364 static const struct bfin_dmac_layout bf533_dmac[] =
365 {
366   { BFIN_MMR_DMAC0_BASE, 8, },
367 };
368 #define bf531_dmac bf533_dmac
369 #define bf532_dmac bf533_dmac
370
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[] =
375 {
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] */
390 };
391 static const struct bfin_memory_layout bf536_mem[] =
392 {
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] */
405 };
406 static const struct bfin_memory_layout bf537_mem[] =
407 {
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] */
422 };
423 static const struct bfin_dev_layout bf534_dev[] =
424 {
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"),
442 };
443 static const struct bfin_dev_layout bf537_dev[] =
444 {
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"),
464 };
465 #define bf536_dev bf537_dev
466 #define bf534_dmac bf50x_dmac
467 #define bf536_dmac bf50x_dmac
468 #define bf537_dmac bf50x_dmac
469
470 #define bf538_chipid 0x27c4
471 #define bf539_chipid bf538_chipid
472 static const struct bfin_memory_layout bf538_mem[] =
473 {
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] */
488 };
489 #define bf539_mem bf538_mem
490 static const struct bfin_dev_layout bf538_dev[] =
491 {
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),
508 };
509 #define bf539_dev bf538_dev
510 static const struct bfin_dmac_layout bf538_dmac[] =
511 {
512   { BFIN_MMR_DMAC0_BASE,  8, },
513   { BFIN_MMR_DMAC1_BASE, 12, },
514 };
515 #define bf539_dmac bf538_dmac
516
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[] =
524 {
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] */
541 };
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[] =
548 {
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"),
572 };
573 static const struct bfin_dev_layout bf544_dev[] =
574 {
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"),
603 };
604 static const struct bfin_dev_layout bf547_dev[] =
605 {
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"),
634 };
635 #define bf548_dev bf547_dev
636 #define bf549_dev bf547_dev
637 static const struct bfin_dmac_layout bf54x_dmac[] =
638 {
639   { BFIN_MMR_DMAC0_BASE, 12, },
640   { BFIN_MMR_DMAC1_BASE, 12, },
641 };
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
647
648 /* This is only Core A of course ...  */
649 #define bf561_chipid 0x27bb
650 static const struct bfin_memory_layout bf561_mem[] =
651 {
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] */
664 };
665 static const struct bfin_dev_layout bf561_dev[] =
666 {
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"),
687 };
688 static const struct bfin_dmac_layout bf561_dmac[] =
689 {
690   { BFIN_MMR_DMAC0_BASE, 12, },
691   { BFIN_MMR_DMAC1_BASE, 12, },
692   /* XXX: IMDMA: { 0xFFC01800, 4, }, */
693 };
694
695 #define bf592_chipid 0x20cb
696 static const struct bfin_memory_layout bf592_mem[] =
697 {
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] */
705 };
706 static const struct bfin_dev_layout bf592_dev[] =
707 {
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"),
717 };
718 static const struct bfin_dmac_layout bf592_dmac[] =
719 {
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, },
723 };
724
725 static const struct bfin_model_data bfin_model_data[] =
726 {
727 #define P(n) \
728   [MODEL_BF##n] = { \
729     bf##n##_chipid, n, \
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), \
733   },
734 #include "proc_list.def"
735 #undef P
736 };
737
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[] =
741 {
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),
749 };
750
751 #define dv_bfin_hw_parse(sd, dv, DV) \
752   do { \
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); \
757   } while (0)
758
759 static void
760 bfin_model_hw_tree_init (SIM_DESC sd, SIM_CPU *cpu)
761 {
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;
767
768   /* Map the core devices.  */
769   for (i = 0; i < ARRAY_SIZE (bfin_core_dev); ++i)
770     {
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);
773     }
774   sim_hw_parse (sd, "/core/bfin_ctimer > ivtmr ivtmr /core/bfin_cec");
775
776   if (mnum == MODEL_BF000)
777     goto done;
778
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);
784
785   dv_bfin_hw_parse (sd, pll, PLL);
786   sim_hw_parse (sd, "/core/bfin_pll > pll pll /core/bfin_sic");
787
788   dma_chan = 0;
789   for (i = 0; i < mdata->dmac_count; ++i)
790     {
791       const struct bfin_dmac_layout *dmac = &mdata->dmac[i];
792
793       sim_hw_parse (sd, "/core/bfin_dmac@%u/type %i", i, mdata->model_num);
794
795       /* Hook up the non-mdma channels.  */
796       for (j = 0; j < dmac->dma_count; ++j)
797         {
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,
800                         BFIN_MMR_DMA_SIZE);
801
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);
806
807           ++dma_chan;
808         }
809
810       /* Hook up the mdma channels -- assume every DMAC has 4.  */
811       for (j = 0; j < 4; ++j)
812         {
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,
816                         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));
819         }
820     }
821
822   for (i = 0; i < mdata->dev_count; ++i)
823     {
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, '/'))
828         continue;
829       if (!strncmp (dev->dev, "bfin_uart", 9)
830           || !strncmp (dev->dev, "bfin_emac", 9)
831           || !strncmp (dev->dev, "bfin_sport", 10))
832         {
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);
837         }
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))
842         {
843           const char *sint = dev->dev + 5;
844           sim_hw_parse (sd, "/core/%s > stat %s /core/bfin_sic", dev->dev, sint);
845         }
846       else if (!strncmp (dev->dev, "bfin_rtc", 8))
847         {
848           const char *sint = dev->dev + 5;
849           sim_hw_parse (sd, "/core/%s > %s %s /core/bfin_sic", dev->dev, sint, sint);
850         }
851       else if (!strncmp (dev->dev, "bfin_wdog", 9))
852         {
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);
856         }
857     }
858
859  done:
860   /* Add any additional user board content.  */
861   if (board->hw_file)
862     sim_do_commandf (sd, "hw-file %s", board->hw_file);
863
864   /* Trigger all the new devices' finish func.  */
865   hw_tree_finish (dv_get_device (cpu, "/"));
866 }
867
868 #include "bfroms/all.h"
869
870 struct bfrom {
871   bu32 addr, len, alias_len;
872   int sirev;
873   const char *buf;
874 };
875
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[] =
882 {
883   BFROM (50x, 0, 0x1000000),
884   BFROM_STUB,
885 };
886 static const struct bfrom bf51x_roms[] =
887 {
888   BFROM (51x, 2, 0x1000000),
889   BFROM (51x, 1, 0x1000000),
890   BFROM (51x, 0, 0x1000000),
891   BFROM_STUB,
892 };
893 static const struct bfrom bf526_roms[] =
894 {
895   BFROM (526, 1, 0x1000000),
896   BFROM (526, 0, 0x1000000),
897   BFROM_STUB,
898 };
899 static const struct bfrom bf527_roms[] =
900 {
901   BFROM (527, 2, 0x1000000),
902   BFROM (527, 1, 0x1000000),
903   BFROM (527, 0, 0x1000000),
904   BFROM_STUB,
905 };
906 static const struct bfrom bf533_roms[] =
907 {
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),
914   BFROM_STUB,
915 };
916 static const struct bfrom bf537_roms[] =
917 {
918   BFROM (537, 3, 0x100000),
919   BFROM (537, 2, 0x100000),
920   BFROM (537, 1, 0x100000),
921   BFROM (537, 0, 0x100000),
922   BFROM_STUB,
923 };
924 static const struct bfrom bf538_roms[] =
925 {
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),
932   BFROM_STUB,
933 };
934 static const struct bfrom bf54x_roms[] =
935 {
936   BFROM (54x, 2, 0),
937   BFROM (54x, 1, 0),
938   BFROM (54x, 0, 0),
939   BFROMA (0xffa14000, 54x_l1, 2, 0),
940   BFROMA (0xffa14000, 54x_l1, 1, 0),
941   BFROMA (0xffa14000, 54x_l1, 0, 0),
942   BFROM_STUB,
943 };
944 static const struct bfrom bf561_roms[] =
945 {
946   /* XXX: No idea what the actual wrap limit is here.  */
947   BFROM (561, 5, 0),
948   BFROM_STUB,
949 };
950 static const struct bfrom bf59x_roms[] =
951 {
952   BFROM (59x, 1, 0x1000000),
953   BFROM (59x, 0, 0x1000000),
954   BFROMA (0xffa10000, 59x_l1, 1, 0),
955   BFROM_STUB,
956 };
957
958 static void
959 bfin_model_map_bfrom (SIM_DESC sd, SIM_CPU *cpu)
960 {
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;
965   unsigned int sirev;
966
967   if (mnum >= 500 && mnum <= 509)
968     bfrom = bf50x_roms;
969   else if (mnum >= 510 && mnum <= 519)
970     bfrom = bf51x_roms;
971   else if (mnum >= 520 && mnum <= 529)
972     bfrom = (mnum & 1) ? bf527_roms : bf526_roms;
973   else if (mnum >= 531 && mnum <= 533)
974     bfrom = bf533_roms;
975   else if (mnum == 535)
976     /* Stub.  */;
977   else if (mnum >= 534 && mnum <= 537)
978     bfrom = bf537_roms;
979   else if (mnum >= 538 && mnum <= 539)
980     bfrom = bf538_roms;
981   else if (mnum >= 540 && mnum <= 549)
982     bfrom = bf54x_roms;
983   else if (mnum == 561)
984     bfrom = bf561_roms;
985   else if (mnum >= 590 && mnum <= 599)
986     bfrom = bf59x_roms;
987   else
988     return;
989
990   if (board->sirev_valid)
991     sirev = board->sirev;
992   else
993     sirev = bfrom->sirev;
994   while (bfrom->buf)
995     {
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);
1001       ++bfrom;
1002     }
1003 }
1004
1005 void
1006 bfin_model_cpu_init (SIM_DESC sd, SIM_CPU *cpu)
1007 {
1008   const MODEL *model = CPU_MODEL (cpu);
1009   const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1010   int mnum = MODEL_NUM (model);
1011   size_t idx;
1012
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);
1017
1018   if (STATE_ENVIRONMENT (CPU_STATE (cpu)) != OPERATING_ENVIRONMENT)
1019     return;
1020
1021   if (mnum == MODEL_BF000)
1022     goto core_only;
1023
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)
1027     {
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);
1031     }
1032
1033   /* Map the on-chip ROMs.  */
1034   bfin_model_map_bfrom (sd, cpu);
1035
1036  core_only:
1037   /* Finally, build up the tree for this cpu model.  */
1038   bfin_model_hw_tree_init (sd, cpu);
1039 }
1040
1041 bu32
1042 bfin_model_get_chipid (SIM_DESC sd)
1043 {
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);
1047   return
1048          (board->sirev << 28) |
1049          (mdata->chipid << 12) |
1050          (((0xE5 << 1) | 1) & 0xFF);
1051 }
1052
1053 bu32
1054 bfin_model_get_dspid (SIM_DESC sd)
1055 {
1056   const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1057   return
1058          (0xE5 << 24) |
1059          (0x04 << 16) |
1060          (board->sirev);
1061 }
1062
1063 static void
1064 bfin_model_init (SIM_CPU *cpu)
1065 {
1066   CPU_MODEL_DATA (cpu) = (void *) &bfin_model_data[MODEL_NUM (CPU_MODEL (cpu))];
1067 }
1068
1069 static bu32
1070 bfin_extract_unsigned_integer (unsigned char *addr, int len)
1071 {
1072   bu32 retval;
1073   unsigned char * p;
1074   unsigned char * startaddr = (unsigned char *)addr;
1075   unsigned char * endaddr = startaddr + len;
1076
1077   retval = 0;
1078
1079   for (p = endaddr; p > startaddr;)
1080     retval = (retval << 8) | *--p;
1081
1082   return retval;
1083 }
1084
1085 static void
1086 bfin_store_unsigned_integer (unsigned char *addr, int len, bu32 val)
1087 {
1088   unsigned char *p;
1089   unsigned char *startaddr = addr;
1090   unsigned char *endaddr = startaddr + len;
1091
1092   for (p = startaddr; p < endaddr;)
1093     {
1094       *p++ = val & 0xff;
1095       val >>= 8;
1096     }
1097 }
1098
1099 static bu32 *
1100 bfin_get_reg (SIM_CPU *cpu, int rn)
1101 {
1102   switch (rn)
1103     {
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 &LTREG (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 &LTREG (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;
1158   }
1159 }
1160
1161 static int
1162 bfin_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1163 {
1164   bu32 value, *reg;
1165
1166   reg = bfin_get_reg (cpu, rn);
1167   if (reg)
1168     value = *reg;
1169   else if (rn == SIM_BFIN_ASTAT_REGNUM)
1170     value = ASTAT;
1171   else if (rn == SIM_BFIN_CC_REGNUM)
1172     value = CCREG;
1173   else
1174     return 0; // will be an error in gdb
1175
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))
1180     {
1181       if (rn == SIM_BFIN_SP_REGNUM)
1182         value = KSPREG;
1183       else if (rn == SIM_BFIN_USP_REGNUM)
1184         value = SPREG;
1185     }
1186
1187   bfin_store_unsigned_integer (buf, 4, value);
1188
1189   return -1; // disables size checking in gdb
1190 }
1191
1192 static int
1193 bfin_reg_store (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1194 {
1195   bu32 value, *reg;
1196
1197   value = bfin_extract_unsigned_integer (buf, 4);
1198   reg = bfin_get_reg (cpu, rn);
1199
1200   if (reg)
1201     /* XXX: Need register trace ?  */
1202     *reg = value;
1203   else if (rn == SIM_BFIN_ASTAT_REGNUM)
1204     SET_ASTAT (value);
1205   else if (rn == SIM_BFIN_CC_REGNUM)
1206     SET_CCREG (value);
1207   else
1208     return 0; // will be an error in gdb
1209
1210   return -1; // disables size checking in gdb
1211 }
1212
1213 static sim_cia
1214 bfin_pc_get (SIM_CPU *cpu)
1215 {
1216   return PCREG;
1217 }
1218
1219 static void
1220 bfin_pc_set (SIM_CPU *cpu, sim_cia newpc)
1221 {
1222   SET_PCREG (newpc);
1223 }
1224
1225 static const char *
1226 bfin_insn_name (SIM_CPU *cpu, int i)
1227 {
1228   static const char * const insn_name[] = {
1229 #define I(insn) #insn,
1230 #include "insn_list.def"
1231 #undef I
1232   };
1233   return insn_name[i];
1234 }
1235
1236 static void
1237 bfin_init_cpu (SIM_CPU *cpu)
1238 {
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;
1245 }
1246
1247 static void
1248 bfin_prepare_run (SIM_CPU *cpu)
1249 {
1250 }
1251
1252 static const MODEL bfin_models[] =
1253 {
1254 #define P(n) { "bf"#n, & bfin_mach, MODEL_BF##n, NULL, bfin_model_init },
1255 #include "proc_list.def"
1256 #undef P
1257   { 0, NULL, 0, NULL, NULL, }
1258 };
1259
1260 static const MACH_IMP_PROPERTIES bfin_imp_properties =
1261 {
1262   sizeof (SIM_CPU),
1263   0,
1264 };
1265
1266 static const MACH bfin_mach =
1267 {
1268   "bfin", "bfin", MACH_BFIN,
1269   32, 32, & bfin_models[0], & bfin_imp_properties,
1270   bfin_init_cpu,
1271   bfin_prepare_run
1272 };
1273
1274 const MACH *sim_machs[] =
1275 {
1276   & bfin_mach,
1277   NULL
1278 };
1279 \f
1280 /* Device option parsing.  */
1281
1282 static DECLARE_OPTION_HANDLER (bfin_mach_option_handler);
1283
1284 enum {
1285   OPTION_MACH_SIREV = OPTION_START,
1286   OPTION_MACH_HW_BOARD_FILE,
1287 };
1288
1289 const OPTION bfin_mach_options[] =
1290 {
1291   { {"sirev", required_argument, NULL, OPTION_MACH_SIREV },
1292       '\0', "NUMBER", "Set CPU silicon revision",
1293       bfin_mach_option_handler, NULL },
1294
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 },
1298
1299   { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
1300 };
1301
1302 static SIM_RC
1303 bfin_mach_option_handler (SIM_DESC sd, sim_cpu *current_cpu, int opt,
1304                           char *arg, int is_command)
1305 {
1306   struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1307
1308   switch (opt)
1309     {
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))
1314         arg += 2;
1315       board->sirev = atoi (arg);
1316       if (board->sirev > 0xf)
1317         {
1318           sim_io_eprintf (sd, "sirev '%s' needs to fit into 4 bits\n", arg);
1319           return SIM_RC_FAIL;
1320         }
1321       return SIM_RC_OK;
1322
1323     case OPTION_MACH_HW_BOARD_FILE:
1324       board->hw_file = xstrdup (arg);
1325       return SIM_RC_OK;
1326
1327     default:
1328       sim_io_eprintf (sd, "Unknown Blackfin option %d\n", opt);
1329       return SIM_RC_FAIL;
1330     }
1331 }