1/* Simulator for Analog Devices Blackfin processors.
2
3   Copyright (C) 2005-2020 Free Software Foundation, Inc.
4   Contributed by Analog Devices, Inc. and Mike Frysinger.
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_dmac.h"
31
32static const SIM_MACH bfin_mach;
33
34struct bfin_memory_layout {
35  address_word addr, len;
36  unsigned mask;	/* see mapmask in sim_core_attach() */
37};
38struct bfin_dev_layout {
39  address_word base, len;
40  unsigned int dmac;
41  const char *dev;
42};
43struct bfin_dmac_layout {
44  address_word base;
45  unsigned int dma_count;
46};
47struct bfin_port_layout {
48  /* Which device this routes to (name/port).  */
49  const char *dst, *dst_port;
50  /* Which device this routes from (name/port).  */
51  const char *src, *src_port;
52};
53struct bfin_model_data {
54  bu32 chipid;
55  int model_num;
56  const struct bfin_memory_layout *mem;
57  size_t mem_count;
58  const struct bfin_dev_layout *dev;
59  size_t dev_count;
60  const struct bfin_dmac_layout *dmac;
61  size_t dmac_count;
62  const struct bfin_port_layout *port;
63  size_t port_count;
64};
65
66#define LAYOUT(_addr, _len, _mask) { .addr = _addr, .len = _len, .mask = access_##_mask, }
67#define _DEVICE(_base, _len, _dev, _dmac) { .base = _base, .len = _len, .dev = _dev, .dmac = _dmac, }
68#define DEVICE(_base, _len, _dev) _DEVICE(_base, _len, _dev, 0)
69#define PORT(_dst, _dst_port, _src, _src_port) \
70  { \
71    .dst = _dst, \
72    .dst_port = _dst_port, \
73    .src = _src, \
74    .src_port = _src_port, \
75  }
76#define SIC(_s, _ip, _d, _op) PORT("bfin_sic", "int"#_ip"@"#_s, _d, _op)
77
78/* [1] Common sim code can't model exec-only memory.
79   http://sourceware.org/ml/gdb/2010-02/msg00047.html */
80
81#define bf000_chipid 0
82static const struct bfin_memory_layout bf000_mem[] = {};
83static const struct bfin_dev_layout bf000_dev[] = {};
84static const struct bfin_dmac_layout bf000_dmac[] = {};
85static const struct bfin_port_layout bf000_port[] = {};
86
87#define bf50x_chipid 0x2800
88#define bf504_chipid bf50x_chipid
89#define bf506_chipid bf50x_chipid
90static const struct bfin_memory_layout bf50x_mem[] =
91{
92  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
93  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
94  LAYOUT (0xFFC03200, 0x50, read_write),	/* PORT_MUX stub */
95  LAYOUT (0xFFC03800, 0x100, read_write),	/* RSI stub */
96  LAYOUT (0xFFC0328C, 0xC, read_write),		/* Flash stub */
97  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
98  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
99  LAYOUT (0xFFA00000, 0x4000, read_write_exec),	/* Inst A [1] */
100  LAYOUT (0xFFA04000, 0x4000, read_write_exec),	/* Inst Cache [1] */
101};
102#define bf504_mem bf50x_mem
103#define bf506_mem bf50x_mem
104static const struct bfin_dev_layout bf50x_dev[] =
105{
106  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
107  DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE,     "bfin_uart2@0"),
108  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
109  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
110  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
111  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
112  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
113  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
114  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
115  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
116  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
117  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
118  DEVICE (0xFFC00A00, BF50X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
119  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
120  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
121  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
122  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
123  DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE,     "bfin_uart2@1"),
124  DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
125};
126#define bf504_dev bf50x_dev
127#define bf506_dev bf50x_dev
128static const struct bfin_dmac_layout bf50x_dmac[] =
129{
130  { BFIN_MMR_DMAC0_BASE, 12, },
131};
132#define bf504_dmac bf50x_dmac
133#define bf506_dmac bf50x_dmac
134static const struct bfin_port_layout bf50x_port[] =
135{
136  SIC (0,  0, "bfin_pll",          "pll"),
137/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
138  SIC (0,  2, "bfin_ppi@0",        "stat"),
139  SIC (0,  3, "bfin_sport@0",      "stat"),
140  SIC (0,  4, "bfin_sport@1",      "stat"),
141  SIC (0,  5, "bfin_uart2@0",      "stat"),
142  SIC (0,  6, "bfin_uart2@1",      "stat"),
143  SIC (0,  7, "bfin_spi@0",        "stat"),
144  SIC (0,  8, "bfin_spi@1",        "stat"),
145  SIC (0,  9, "bfin_can@0",        "stat"),
146  SIC (0, 10, "bfin_rsi@0",        "int0"),
147/*SIC (0, 11, reserved),*/
148  SIC (0, 12, "bfin_counter@0",    "stat"),
149  SIC (0, 13, "bfin_counter@1",    "stat"),
150  SIC (0, 14, "bfin_dma@0",        "di"),
151  SIC (0, 15, "bfin_dma@1",        "di"),
152  SIC (0, 16, "bfin_dma@2",        "di"),
153  SIC (0, 17, "bfin_dma@3",        "di"),
154  SIC (0, 18, "bfin_dma@4",        "di"),
155  SIC (0, 19, "bfin_dma@5",        "di"),
156  SIC (0, 20, "bfin_dma@6",        "di"),
157  SIC (0, 21, "bfin_dma@7",        "di"),
158  SIC (0, 22, "bfin_dma@8",        "di"),
159  SIC (0, 23, "bfin_dma@9",        "di"),
160  SIC (0, 24, "bfin_dma@10",       "di"),
161  SIC (0, 25, "bfin_dma@11",       "di"),
162  SIC (0, 26, "bfin_can@0",        "rx"),
163  SIC (0, 27, "bfin_can@0",        "tx"),
164  SIC (0, 28, "bfin_twi@0",        "stat"),
165  SIC (0, 29, "bfin_gpio@5",       "mask_a"),
166  SIC (0, 30, "bfin_gpio@5",       "mask_b"),
167/*SIC (0, 31, reserved),*/
168  SIC (1,  0, "bfin_gptimer@0",    "stat"),
169  SIC (1,  1, "bfin_gptimer@1",    "stat"),
170  SIC (1,  2, "bfin_gptimer@2",    "stat"),
171  SIC (1,  3, "bfin_gptimer@3",    "stat"),
172  SIC (1,  4, "bfin_gptimer@4",    "stat"),
173  SIC (1,  5, "bfin_gptimer@5",    "stat"),
174  SIC (1,  6, "bfin_gptimer@6",    "stat"),
175  SIC (1,  7, "bfin_gptimer@7",    "stat"),
176  SIC (1,  8, "bfin_gpio@6",       "mask_a"),
177  SIC (1,  9, "bfin_gpio@6",       "mask_b"),
178  SIC (1, 10, "bfin_dma@256",      "di"),	/* mdma0 */
179  SIC (1, 10, "bfin_dma@257",      "di"),	/* mdma0 */
180  SIC (1, 11, "bfin_dma@258",      "di"),	/* mdma1 */
181  SIC (1, 11, "bfin_dma@259",      "di"),	/* mdma1 */
182  SIC (1, 12, "bfin_wdog@0",       "gpi"),
183  SIC (1, 13, "bfin_gpio@7",       "mask_a"),
184  SIC (1, 14, "bfin_gpio@7",       "mask_b"),
185  SIC (1, 15, "bfin_acm@0",        "stat"),
186  SIC (1, 16, "bfin_acm@1",        "int"),
187/*SIC (1, 17, reserved),*/
188/*SIC (1, 18, reserved),*/
189  SIC (1, 19, "bfin_pwm@0",        "trip"),
190  SIC (1, 20, "bfin_pwm@0",        "sync"),
191  SIC (1, 21, "bfin_pwm@1",        "trip"),
192  SIC (1, 22, "bfin_pwm@1",        "sync"),
193  SIC (1, 23, "bfin_rsi@0",        "int1"),
194};
195#define bf504_port bf50x_port
196#define bf506_port bf50x_port
197
198#define bf51x_chipid 0x27e8
199#define bf512_chipid bf51x_chipid
200#define bf514_chipid bf51x_chipid
201#define bf516_chipid bf51x_chipid
202#define bf518_chipid bf51x_chipid
203static const struct bfin_memory_layout bf51x_mem[] =
204{
205  LAYOUT (0xFFC00680, 0xC, read_write),		/* TIMER stub */
206  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
207  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
208  LAYOUT (0xFFC03200, 0x50, read_write),	/* PORT_MUX stub */
209  LAYOUT (0xFFC03800, 0xD0, read_write),	/* RSI stub */
210  LAYOUT (0xFFC03FE0, 0x20, read_write),	/* RSI peripheral stub */
211  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
212  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
213  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
214  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
215  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
216  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
217};
218#define bf512_mem bf51x_mem
219#define bf514_mem bf51x_mem
220#define bf516_mem bf51x_mem
221#define bf518_mem bf51x_mem
222static const struct bfin_dev_layout bf512_dev[] =
223{
224  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
225  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
226  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
227  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
228  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
229  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
230  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
231  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
232  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
233  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
234  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
235  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
236  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
237  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
238  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
239  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
240  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
241  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
242  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
243  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
244  DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
245  DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
246};
247#define bf514_dev bf512_dev
248static const struct bfin_dev_layout bf516_dev[] =
249{
250  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
251  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
252  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
253  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
254  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
255  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
256  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
257  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
258  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
259  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
260  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
261  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
262  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
263  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
264  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
265  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
266  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
267  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
268  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
269  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
270  DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE,      "bfin_emac"),
271  DEVICE (0, 0x20, "bfin_emac/eth_phy"),
272  DEVICE (0xFFC03400, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
273  DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
274};
275#define bf518_dev bf516_dev
276#define bf512_dmac bf50x_dmac
277#define bf514_dmac bf50x_dmac
278#define bf516_dmac bf50x_dmac
279#define bf518_dmac bf50x_dmac
280static const struct bfin_port_layout bf51x_port[] =
281{
282  SIC (0,  0, "bfin_pll",          "pll"),
283/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
284  SIC (0,  2, "bfin_dmar@0",       "block"),
285  SIC (0,  3, "bfin_dmar@1",       "block"),
286  SIC (0,  4, "bfin_dmar@0",       "overflow"),
287  SIC (0,  5, "bfin_dmar@1",       "overflow"),
288  SIC (0,  6, "bfin_ppi@0",        "stat"),
289  SIC (0,  7, "bfin_emac",         "stat"),
290  SIC (0,  8, "bfin_sport@0",      "stat"),
291  SIC (0,  9, "bfin_sport@1",      "stat"),
292  SIC (0, 10, "bfin_ptp",          "stat"),
293/*SIC (0, 11, reserved),*/
294  SIC (0, 12, "bfin_uart@0",       "stat"),
295  SIC (0, 13, "bfin_uart@1",       "stat"),
296  SIC (0, 14, "bfin_rtc",          "rtc"),
297  SIC (0, 15, "bfin_dma@0",        "di"),
298  SIC (0, 16, "bfin_dma@3",        "di"),
299  SIC (0, 17, "bfin_dma@4",        "di"),
300  SIC (0, 18, "bfin_dma@5",        "di"),
301  SIC (0, 19, "bfin_dma@6",        "di"),
302  SIC (0, 20, "bfin_twi@0",        "stat"),
303  SIC (0, 21, "bfin_dma@7",        "di"),
304  SIC (0, 22, "bfin_dma@8",        "di"),
305  SIC (0, 23, "bfin_dma@9",        "di"),
306  SIC (0, 24, "bfin_dma@10",       "di"),
307  SIC (0, 25, "bfin_dma@11",       "di"),
308  SIC (0, 26, "bfin_otp",          "stat"),
309  SIC (0, 27, "bfin_counter@0",    "stat"),
310  SIC (0, 28, "bfin_dma@1",        "di"),
311  SIC (0, 29, "bfin_gpio@7",       "mask_a"),
312  SIC (0, 30, "bfin_dma@2",        "di"),
313  SIC (0, 31, "bfin_gpio@7",       "mask_b"),
314  SIC (1,  0, "bfin_gptimer@0",    "stat"),
315  SIC (1,  1, "bfin_gptimer@1",    "stat"),
316  SIC (1,  2, "bfin_gptimer@2",    "stat"),
317  SIC (1,  3, "bfin_gptimer@3",    "stat"),
318  SIC (1,  4, "bfin_gptimer@4",    "stat"),
319  SIC (1,  5, "bfin_gptimer@5",    "stat"),
320  SIC (1,  6, "bfin_gptimer@6",    "stat"),
321  SIC (1,  7, "bfin_gptimer@7",    "stat"),
322  SIC (1,  8, "bfin_gpio@6",       "mask_a"),
323  SIC (1,  9, "bfin_gpio@6",       "mask_b"),
324  SIC (1, 10, "bfin_dma@256",      "di"),	/* mdma0 */
325  SIC (1, 10, "bfin_dma@257",      "di"),	/* mdma0 */
326  SIC (1, 11, "bfin_dma@258",      "di"),	/* mdma1 */
327  SIC (1, 11, "bfin_dma@259",      "di"),	/* mdma1 */
328  SIC (1, 12, "bfin_wdog@0",       "gpi"),
329  SIC (1, 13, "bfin_gpio@5",       "mask_a"),
330  SIC (1, 14, "bfin_gpio@5",       "mask_b"),
331  SIC (1, 15, "bfin_spi@0",        "stat"),
332  SIC (1, 16, "bfin_spi@1",        "stat"),
333/*SIC (1, 17, reserved),*/
334/*SIC (1, 18, reserved),*/
335  SIC (1, 19, "bfin_rsi@0",        "int0"),
336  SIC (1, 20, "bfin_rsi@0",        "int1"),
337  SIC (1, 21, "bfin_pwm@0",        "trip"),
338  SIC (1, 22, "bfin_pwm@0",        "sync"),
339  SIC (1, 23, "bfin_ptp",          "stat"),
340};
341#define bf512_port bf51x_port
342#define bf514_port bf51x_port
343#define bf516_port bf51x_port
344#define bf518_port bf51x_port
345
346#define bf522_chipid 0x27e4
347#define bf523_chipid 0x27e0
348#define bf524_chipid bf522_chipid
349#define bf525_chipid bf523_chipid
350#define bf526_chipid bf522_chipid
351#define bf527_chipid bf523_chipid
352static const struct bfin_memory_layout bf52x_mem[] =
353{
354  LAYOUT (0xFFC00680, 0xC, read_write),		/* TIMER stub */
355  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
356  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
357  LAYOUT (0xFFC03200, 0x50, read_write),	/* PORT_MUX stub */
358  LAYOUT (0xFFC03800, 0x500, read_write),	/* MUSB stub */
359  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
360  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
361  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
362  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
363  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
364  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
365  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
366};
367#define bf522_mem bf52x_mem
368#define bf523_mem bf52x_mem
369#define bf524_mem bf52x_mem
370#define bf525_mem bf52x_mem
371#define bf526_mem bf52x_mem
372#define bf527_mem bf52x_mem
373static const struct bfin_dev_layout bf522_dev[] =
374{
375  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
376  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
377  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
378  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
379  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
380  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
381  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
382  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
383  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
384  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
385  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
386  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
387  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
388  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
389  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
390  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
391  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
392  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
393  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
394  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
395  DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
396  DEVICE (0xFFC03700, BFIN_MMR_NFC_SIZE,       "bfin_nfc"),
397};
398#define bf523_dev bf522_dev
399#define bf524_dev bf522_dev
400#define bf525_dev bf522_dev
401static const struct bfin_dev_layout bf526_dev[] =
402{
403  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
404  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
405  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
406  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
407  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
408  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
409  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
410  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
411  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
412  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
413  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
414  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
415  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
416  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
417  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
418  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
419  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
420  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
421  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
422  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
423  DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE,      "bfin_emac"),
424  DEVICE (0, 0x20, "bfin_emac/eth_phy"),
425  DEVICE (0xFFC03600, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
426  DEVICE (0xFFC03700, BFIN_MMR_NFC_SIZE,       "bfin_nfc"),
427};
428#define bf527_dev bf526_dev
429#define bf522_dmac bf50x_dmac
430#define bf523_dmac bf50x_dmac
431#define bf524_dmac bf50x_dmac
432#define bf525_dmac bf50x_dmac
433#define bf526_dmac bf50x_dmac
434#define bf527_dmac bf50x_dmac
435static const struct bfin_port_layout bf52x_port[] =
436{
437  SIC (0,  0, "bfin_pll",          "pll"),
438/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
439  SIC (0,  2, "bfin_dmar@0",       "block"),
440  SIC (0,  3, "bfin_dmar@1",       "block"),
441  SIC (0,  4, "bfin_dmar@0",       "overflow"),
442  SIC (0,  5, "bfin_dmar@1",       "overflow"),
443  SIC (0,  6, "bfin_ppi@0",        "stat"),
444  SIC (0,  7, "bfin_emac",         "stat"),
445  SIC (0,  8, "bfin_sport@0",      "stat"),
446  SIC (0,  9, "bfin_sport@1",      "stat"),
447/*SIC (0, 10, reserved),*/
448/*SIC (0, 11, reserved),*/
449  SIC (0, 12, "bfin_uart@0",       "stat"),
450  SIC (0, 13, "bfin_uart@1",       "stat"),
451  SIC (0, 14, "bfin_rtc",          "rtc"),
452  SIC (0, 15, "bfin_dma@0",        "di"),
453  SIC (0, 16, "bfin_dma@3",        "di"),
454  SIC (0, 17, "bfin_dma@4",        "di"),
455  SIC (0, 18, "bfin_dma@5",        "di"),
456  SIC (0, 19, "bfin_dma@6",        "di"),
457  SIC (0, 20, "bfin_twi@0",        "stat"),
458  SIC (0, 21, "bfin_dma@7",        "di"),
459  SIC (0, 22, "bfin_dma@8",        "di"),
460  SIC (0, 23, "bfin_dma@9",        "di"),
461  SIC (0, 24, "bfin_dma@10",       "di"),
462  SIC (0, 25, "bfin_dma@11",       "di"),
463  SIC (0, 26, "bfin_otp",          "stat"),
464  SIC (0, 27, "bfin_counter@0",    "stat"),
465  SIC (0, 28, "bfin_dma@1",        "di"),
466  SIC (0, 29, "bfin_gpio@7",       "mask_a"),
467  SIC (0, 30, "bfin_dma@2",        "di"),
468  SIC (0, 31, "bfin_gpio@7",       "mask_b"),
469  SIC (1,  0, "bfin_gptimer@0",    "stat"),
470  SIC (1,  1, "bfin_gptimer@1",    "stat"),
471  SIC (1,  2, "bfin_gptimer@2",    "stat"),
472  SIC (1,  3, "bfin_gptimer@3",    "stat"),
473  SIC (1,  4, "bfin_gptimer@4",    "stat"),
474  SIC (1,  5, "bfin_gptimer@5",    "stat"),
475  SIC (1,  6, "bfin_gptimer@6",    "stat"),
476  SIC (1,  7, "bfin_gptimer@7",    "stat"),
477  SIC (1,  8, "bfin_gpio@6",       "mask_a"),
478  SIC (1,  9, "bfin_gpio@6",       "mask_b"),
479  SIC (1, 10, "bfin_dma@256",      "di"),	/* mdma0 */
480  SIC (1, 10, "bfin_dma@257",      "di"),	/* mdma0 */
481  SIC (1, 11, "bfin_dma@258",      "di"),	/* mdma1 */
482  SIC (1, 11, "bfin_dma@259",      "di"),	/* mdma1 */
483  SIC (1, 12, "bfin_wdog@0",       "gpi"),
484  SIC (1, 13, "bfin_gpio@5",       "mask_a"),
485  SIC (1, 14, "bfin_gpio@5",       "mask_b"),
486  SIC (1, 15, "bfin_spi@0",        "stat"),
487  SIC (1, 16, "bfin_nfc",          "stat"),
488  SIC (1, 17, "bfin_hostdp",       "stat"),
489  SIC (1, 18, "bfin_hostdp",       "done"),
490  SIC (1, 20, "bfin_usb",          "int0"),
491  SIC (1, 21, "bfin_usb",          "int1"),
492  SIC (1, 22, "bfin_usb",          "int2"),
493};
494#define bf522_port bf51x_port
495#define bf523_port bf51x_port
496#define bf524_port bf51x_port
497#define bf525_port bf51x_port
498#define bf526_port bf51x_port
499#define bf527_port bf51x_port
500
501#define bf531_chipid 0x27a5
502#define bf532_chipid bf531_chipid
503#define bf533_chipid bf531_chipid
504static const struct bfin_memory_layout bf531_mem[] =
505{
506  LAYOUT (0xFFC00640, 0xC, read_write),		/* TIMER stub */
507  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
508  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
509  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
510  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
511  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
512};
513static const struct bfin_memory_layout bf532_mem[] =
514{
515  LAYOUT (0xFFC00640, 0xC, read_write),		/* TIMER stub */
516  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
517  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
518  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
519  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
520  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
521  LAYOUT (0xFFA0C000, 0x4000, read_write_exec),	/* Inst C [1] */
522  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
523};
524static const struct bfin_memory_layout bf533_mem[] =
525{
526  LAYOUT (0xFFC00640, 0xC, read_write),		/* TIMER stub */
527  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
528  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
529  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
530  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
531  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
532  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
533  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
534  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
535  LAYOUT (0xFFA0C000, 0x4000, read_write_exec),	/* Inst C [1] */
536  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
537};
538static const struct bfin_dev_layout bf533_dev[] =
539{
540  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
541  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
542  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
543  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
544  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
545  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
546  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
547  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
548  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
549  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
550  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
551};
552#define bf531_dev bf533_dev
553#define bf532_dev bf533_dev
554static const struct bfin_dmac_layout bf533_dmac[] =
555{
556  { BFIN_MMR_DMAC0_BASE, 8, },
557};
558#define bf531_dmac bf533_dmac
559#define bf532_dmac bf533_dmac
560static const struct bfin_port_layout bf533_port[] =
561{
562  SIC (0,  0, "bfin_pll",          "pll"),
563/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
564  SIC (0,  2, "bfin_ppi@0",        "stat"),
565  SIC (0,  3, "bfin_sport@0",      "stat"),
566  SIC (0,  4, "bfin_sport@1",      "stat"),
567  SIC (0,  5, "bfin_spi@0",        "stat"),
568  SIC (0,  6, "bfin_uart@0",       "stat"),
569  SIC (0,  7, "bfin_rtc",          "rtc"),
570  SIC (0,  8, "bfin_dma@0",        "di"),
571  SIC (0,  9, "bfin_dma@1",        "di"),
572  SIC (0, 10, "bfin_dma@2",        "di"),
573  SIC (0, 11, "bfin_dma@3",        "di"),
574  SIC (0, 12, "bfin_dma@4",        "di"),
575  SIC (0, 13, "bfin_dma@5",        "di"),
576  SIC (0, 14, "bfin_dma@6",        "di"),
577  SIC (0, 15, "bfin_dma@7",        "di"),
578  SIC (0, 16, "bfin_gptimer@0",    "stat"),
579  SIC (0, 17, "bfin_gptimer@1",    "stat"),
580  SIC (0, 18, "bfin_gptimer@2",    "stat"),
581  SIC (0, 19, "bfin_gpio@5",       "mask_a"),
582  SIC (0, 20, "bfin_gpio@5",       "mask_b"),
583  SIC (0, 21, "bfin_dma@256",      "di"),	/* mdma0 */
584  SIC (0, 21, "bfin_dma@257",      "di"),	/* mdma0 */
585  SIC (0, 22, "bfin_dma@258",      "di"),	/* mdma */
586  SIC (0, 22, "bfin_dma@259",      "di"),	/* mdma1 */
587  SIC (0, 23, "bfin_wdog@0",       "gpi"),
588};
589#define bf531_port bf533_port
590#define bf532_port bf533_port
591
592#define bf534_chipid 0x27c6
593#define bf536_chipid 0x27c8
594#define bf537_chipid bf536_chipid
595static const struct bfin_memory_layout bf534_mem[] =
596{
597  LAYOUT (0xFFC00680, 0xC, read_write),		/* TIMER stub */
598  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
599  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
600  LAYOUT (0xFFC03200, 0x10, read_write),	/* PORT_MUX stub */
601  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
602  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
603  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
604  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
605  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
606  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
607  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
608};
609static const struct bfin_memory_layout bf536_mem[] =
610{
611  LAYOUT (0xFFC00680, 0xC, read_write),		/* TIMER stub */
612  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
613  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
614  LAYOUT (0xFFC03200, 0x10, read_write),	/* PORT_MUX stub */
615  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
616  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
617  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
618  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
619  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
620};
621static const struct bfin_memory_layout bf537_mem[] =
622{
623  LAYOUT (0xFFC00680, 0xC, read_write),		/* TIMER stub */
624  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
625  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
626  LAYOUT (0xFFC03200, 0x10, read_write),	/* PORT_MUX stub */
627  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
628  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
629  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
630  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
631  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
632  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
633  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
634};
635static const struct bfin_dev_layout bf534_dev[] =
636{
637  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
638  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
639  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
640  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
641  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
642  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
643  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
644  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
645  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
646  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
647  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
648  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
649  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
650  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
651  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
652  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
653  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
654  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
655  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
656  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
657  DEVICE (0, 0, "glue-or@1"),
658  DEVICE (0, 0, "glue-or@1/interrupt-ranges 0 5"),
659  DEVICE (0, 0, "glue-or@2"),
660  DEVICE (0, 0, "glue-or@2/interrupt-ranges 0 8"),
661  DEVICE (0, 0, "glue-or@17"),
662  DEVICE (0, 0, "glue-or@17/interrupt-ranges 0 2"),
663  DEVICE (0, 0, "glue-or@18"),
664  DEVICE (0, 0, "glue-or@18/interrupt-ranges 0 2"),
665  DEVICE (0, 0, "glue-or@27"),
666  DEVICE (0, 0, "glue-or@27/interrupt-ranges 0 2"),
667  DEVICE (0, 0, "glue-or@31"),
668  DEVICE (0, 0, "glue-or@31/interrupt-ranges 0 2"),
669};
670static const struct bfin_dev_layout bf537_dev[] =
671{
672  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
673  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
674  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
675  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
676  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
677  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
678  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
679  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
680  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
681  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
682  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
683  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
684  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
685  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
686  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
687  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
688  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
689  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
690  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
691  DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1"),
692  DEVICE (0xFFC03000, BFIN_MMR_EMAC_SIZE,      "bfin_emac"),
693  DEVICE (0, 0x20, "bfin_emac/eth_phy"),
694  DEVICE (0, 0, "glue-or@1"),
695  DEVICE (0, 0, "glue-or@1/interrupt-ranges 0 5"),
696  DEVICE (0, 0, "glue-or@2"),
697  DEVICE (0, 0, "glue-or@2/interrupt-ranges 0 8"),
698  DEVICE (0, 0, "glue-or@17"),
699  DEVICE (0, 0, "glue-or@17/interrupt-ranges 0 2"),
700  DEVICE (0, 0, "glue-or@18"),
701  DEVICE (0, 0, "glue-or@18/interrupt-ranges 0 2"),
702  DEVICE (0, 0, "glue-or@27"),
703  DEVICE (0, 0, "glue-or@27/interrupt-ranges 0 2"),
704  DEVICE (0, 0, "glue-or@31"),
705  DEVICE (0, 0, "glue-or@31/interrupt-ranges 0 2"),
706};
707#define bf536_dev bf537_dev
708#define bf534_dmac bf50x_dmac
709#define bf536_dmac bf50x_dmac
710#define bf537_dmac bf50x_dmac
711static const struct bfin_port_layout bf537_port[] =
712{
713  SIC (0,  0, "bfin_pll",          "pll"),
714  SIC (0,  1, "glue-or@1",         "int"),
715/*PORT ("glue-or@1", "int", "bfin_dmac@0",   "stat"),*/
716  PORT ("glue-or@1", "int", "bfin_dmar@0",   "block"),
717  PORT ("glue-or@1", "int", "bfin_dmar@1",   "block"),
718  PORT ("glue-or@1", "int", "bfin_dmar@0",   "overflow"),
719  PORT ("glue-or@1", "int", "bfin_dmar@1",   "overflow"),
720  SIC (0,  2, "glue-or@2",         "int"),
721  PORT ("glue-or@2", "int", "bfin_can@0",    "stat"),
722  PORT ("glue-or@2", "int", "bfin_emac",     "stat"),
723  PORT ("glue-or@2", "int", "bfin_sport@0",  "stat"),
724  PORT ("glue-or@2", "int", "bfin_sport@1",  "stat"),
725  PORT ("glue-or@2", "int", "bfin_ppi@0",    "stat"),
726  PORT ("glue-or@2", "int", "bfin_spi@0",    "stat"),
727  PORT ("glue-or@2", "int", "bfin_uart@0",   "stat"),
728  PORT ("glue-or@2", "int", "bfin_uart@1",   "stat"),
729  SIC (0,  3, "bfin_rtc",          "rtc"),
730  SIC (0,  4, "bfin_dma@0",        "di"),
731  SIC (0,  5, "bfin_dma@3",        "di"),
732  SIC (0,  6, "bfin_dma@4",        "di"),
733  SIC (0,  7, "bfin_dma@5",        "di"),
734  SIC (0,  8, "bfin_dma@6",        "di"),
735  SIC (0,  9, "bfin_twi@0",        "stat"),
736  SIC (0, 10, "bfin_dma@7",        "di"),
737  SIC (0, 11, "bfin_dma@8",        "di"),
738  SIC (0, 12, "bfin_dma@9",        "di"),
739  SIC (0, 13, "bfin_dma@10",       "di"),
740  SIC (0, 14, "bfin_dma@11",       "di"),
741  SIC (0, 15, "bfin_can@0",        "rx"),
742  SIC (0, 16, "bfin_can@0",        "tx"),
743  SIC (0, 17, "glue-or@17",        "int"),
744  PORT ("glue-or@17", "int", "bfin_dma@1",   "di"),
745  PORT ("glue-or@17", "int", "bfin_gpio@7",  "mask_a"),
746  SIC (0, 18, "glue-or@18",        "int"),
747  PORT ("glue-or@18", "int", "bfin_dma@2",   "di"),
748  PORT ("glue-or@18", "int", "bfin_gpio@7",  "mask_b"),
749  SIC (0, 19, "bfin_gptimer@0",    "stat"),
750  SIC (0, 20, "bfin_gptimer@1",    "stat"),
751  SIC (0, 21, "bfin_gptimer@2",    "stat"),
752  SIC (0, 22, "bfin_gptimer@3",    "stat"),
753  SIC (0, 23, "bfin_gptimer@4",    "stat"),
754  SIC (0, 24, "bfin_gptimer@5",    "stat"),
755  SIC (0, 25, "bfin_gptimer@6",    "stat"),
756  SIC (0, 26, "bfin_gptimer@7",    "stat"),
757  SIC (0, 27, "glue-or@27",        "int"),
758  PORT ("glue-or@27", "int", "bfin_gpio@5",   "mask_a"),
759  PORT ("glue-or@27", "int", "bfin_gpio@6",   "mask_a"),
760  SIC (0, 28, "bfin_gpio@6",       "mask_b"),
761  SIC (0, 29, "bfin_dma@256",      "di"),	/* mdma0 */
762  SIC (0, 29, "bfin_dma@257",      "di"),	/* mdma0 */
763  SIC (0, 30, "bfin_dma@258",      "di"),	/* mdma1 */
764  SIC (0, 30, "bfin_dma@259",      "di"),	/* mdma1 */
765  SIC (0, 31, "glue-or@31",        "int"),
766  PORT ("glue-or@31", "int", "bfin_wdog@0",   "gpi"),
767  PORT ("glue-or@31", "int", "bfin_gpio@5",   "mask_b"),
768};
769#define bf534_port bf537_port
770#define bf536_port bf537_port
771
772#define bf538_chipid 0x27c4
773#define bf539_chipid bf538_chipid
774static const struct bfin_memory_layout bf538_mem[] =
775{
776  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
777  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
778  LAYOUT (0xFFC01500, 0x70, read_write),	/* PORTC/D/E stub */
779  LAYOUT (0xFFC02500, 0x60, read_write),	/* SPORT2 stub */
780  LAYOUT (0xFFC02600, 0x60, read_write),	/* SPORT3 stub */
781  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
782  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
783  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
784  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
785  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
786  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
787  LAYOUT (0xFFA0C000, 0x4000, read_write_exec),	/* Inst C [1] */
788  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
789};
790#define bf539_mem bf538_mem
791static const struct bfin_dev_layout bf538_dev[] =
792{
793  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
794  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
795  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
796  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
797  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
798  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
799  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
800  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
801  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
802  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
803  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
804  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
805 _DEVICE (0xFFC02000, BFIN_MMR_UART_SIZE,      "bfin_uart@1", 1),
806 _DEVICE (0xFFC02100, BFIN_MMR_UART_SIZE,      "bfin_uart@2", 1),
807  DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE,       "bfin_twi@1"),
808 _DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE,       "bfin_spi@1", 1),
809 _DEVICE (0xFFC02400, BFIN_MMR_SPI_SIZE,       "bfin_spi@2", 1),
810};
811#define bf539_dev bf538_dev
812static const struct bfin_dmac_layout bf538_dmac[] =
813{
814  { BFIN_MMR_DMAC0_BASE,  8, },
815  { BFIN_MMR_DMAC1_BASE, 12, },
816};
817#define bf539_dmac bf538_dmac
818static const struct bfin_port_layout bf538_port[] =
819{
820  SIC (0,  0, "bfin_pll",          "pll"),
821  SIC (0,  1, "bfin_dmac@0",       "stat"),
822  SIC (0,  2, "bfin_ppi@0",        "stat"),
823  SIC (0,  3, "bfin_sport@0",      "stat"),
824  SIC (0,  4, "bfin_sport@1",      "stat"),
825  SIC (0,  5, "bfin_spi@0",        "stat"),
826  SIC (0,  6, "bfin_uart@0",       "stat"),
827  SIC (0,  7, "bfin_rtc",          "rtc"),
828  SIC (0,  8, "bfin_dma@0",        "di"),
829  SIC (0,  9, "bfin_dma@1",        "di"),
830  SIC (0, 10, "bfin_dma@2",        "di"),
831  SIC (0, 11, "bfin_dma@3",        "di"),
832  SIC (0, 12, "bfin_dma@4",        "di"),
833  SIC (0, 13, "bfin_dma@5",        "di"),
834  SIC (0, 14, "bfin_dma@6",        "di"),
835  SIC (0, 15, "bfin_dma@7",        "di"),
836  SIC (0, 16, "bfin_gptimer@0",    "stat"),
837  SIC (0, 17, "bfin_gptimer@1",    "stat"),
838  SIC (0, 18, "bfin_gptimer@2",    "stat"),
839  SIC (0, 19, "bfin_gpio@5",       "mask_a"),
840  SIC (0, 20, "bfin_gpio@5",       "mask_b"),
841  SIC (0, 21, "bfin_dma@256",      "di"),	/* mdma0 */
842  SIC (0, 21, "bfin_dma@257",      "di"),	/* mdma0 */
843  SIC (0, 22, "bfin_dma@258",      "di"),	/* mdma1 */
844  SIC (0, 22, "bfin_dma@259",      "di"),	/* mdma1 */
845  SIC (0, 23, "bfin_wdog@0",       "gpi"),
846  SIC (0, 24, "bfin_dmac@1",       "stat"),
847  SIC (0, 25, "bfin_sport@2",      "stat"),
848  SIC (0, 26, "bfin_sport@3",      "stat"),
849/*SIC (0, 27, reserved),*/
850  SIC (0, 28, "bfin_spi@1",        "stat"),
851  SIC (0, 29, "bfin_spi@2",        "stat"),
852  SIC (0, 30, "bfin_uart@1",       "stat"),
853  SIC (0, 31, "bfin_uart@2",       "stat"),
854  SIC (1,  0, "bfin_can@0",        "stat"),
855  SIC (1,  1, "bfin_dma@8",        "di"),
856  SIC (1,  2, "bfin_dma@9",        "di"),
857  SIC (1,  3, "bfin_dma@10",       "di"),
858  SIC (1,  4, "bfin_dma@11",       "di"),
859  SIC (1,  5, "bfin_dma@12",       "di"),
860  SIC (1,  6, "bfin_dma@13",       "di"),
861  SIC (1,  7, "bfin_dma@14",       "di"),
862  SIC (1,  8, "bfin_dma@15",       "di"),
863  SIC (1,  9, "bfin_dma@16",       "di"),
864  SIC (1, 10, "bfin_dma@17",       "di"),
865  SIC (1, 11, "bfin_dma@18",       "di"),
866  SIC (1, 12, "bfin_dma@19",       "di"),
867  SIC (1, 13, "bfin_twi@0",        "stat"),
868  SIC (1, 14, "bfin_twi@1",        "stat"),
869  SIC (1, 15, "bfin_can@0",        "rx"),
870  SIC (1, 16, "bfin_can@0",        "tx"),
871  SIC (1, 17, "bfin_dma@260",      "di"),	/* mdma2 */
872  SIC (1, 17, "bfin_dma@261",      "di"),	/* mdma2 */
873  SIC (1, 18, "bfin_dma@262",      "di"),	/* mdma3 */
874  SIC (1, 18, "bfin_dma@263",      "di"),	/* mdma3 */
875};
876#define bf539_port bf538_port
877
878#define bf54x_chipid 0x27de
879#define bf542_chipid bf54x_chipid
880#define bf544_chipid bf54x_chipid
881#define bf547_chipid bf54x_chipid
882#define bf548_chipid bf54x_chipid
883#define bf549_chipid bf54x_chipid
884static const struct bfin_memory_layout bf54x_mem[] =
885{
886  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub XXX: not on BF542/4 */
887  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
888  LAYOUT (0xFFC02500, 0x60, read_write),	/* SPORT2 stub */
889  LAYOUT (0xFFC02600, 0x60, read_write),	/* SPORT3 stub */
890  LAYOUT (0xFFC03800, 0x70, read_write),	/* ATAPI stub */
891  LAYOUT (0xFFC03900, 0x100, read_write),	/* RSI stub */
892  LAYOUT (0xFFC03C00, 0x500, read_write),	/* MUSB stub */
893  LAYOUT (0xFEB00000, 0x20000, read_write_exec),	/* L2 */
894  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
895  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
896  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
897  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
898  LAYOUT (0xFFA00000, 0x8000, read_write_exec),	/* Inst A [1] */
899  LAYOUT (0xFFA08000, 0x4000, read_write_exec),	/* Inst B [1] */
900  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
901};
902#define bf542_mem bf54x_mem
903#define bf544_mem bf54x_mem
904#define bf547_mem bf54x_mem
905#define bf548_mem bf54x_mem
906#define bf549_mem bf54x_mem
907static const struct bfin_dev_layout bf542_dev[] =
908{
909  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
910  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
911  DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE,     "bfin_uart2@0"),
912  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
913  DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
914  DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
915  DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
916 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@1", 1),
917  DEVICE (0xFFC01400, BFIN_MMR_PINT_SIZE,      "bfin_pint@0"),
918  DEVICE (0xFFC01430, BFIN_MMR_PINT_SIZE,      "bfin_pint@1"),
919 _DEVICE (0xFFC01460, BFIN_MMR_PINT_SIZE,      "bfin_pint@2", 2),
920 _DEVICE (0xFFC01490, BFIN_MMR_PINT_SIZE,      "bfin_pint@3", 2),
921  DEVICE (0xFFC014C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@0"),
922  DEVICE (0xFFC014E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@1"),
923  DEVICE (0xFFC01500, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@2"),
924  DEVICE (0xFFC01520, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@3"),
925  DEVICE (0xFFC01540, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@4"),
926  DEVICE (0xFFC01560, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@5"),
927  DEVICE (0xFFC01580, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@6"),
928  DEVICE (0xFFC015A0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@7"),
929  DEVICE (0xFFC015C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@8"),
930  DEVICE (0xFFC015E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@9"),
931  DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
932  DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
933  DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
934  DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
935  DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
936  DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
937  DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
938  DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
939  DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE,     "bfin_uart2@1"),
940 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@2", 1),
941  DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
942 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@2", 1),
943 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@3", 1),
944  DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE,       "bfin_nfc"),
945  DEVICE (0xFFC04300, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
946};
947static const struct bfin_dev_layout bf544_dev[] =
948{
949  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
950  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
951  DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE,     "bfin_uart2@0"),
952  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
953  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@8"),
954  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@9"),
955  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@10"),
956  DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
957  DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
958  DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
959 _DEVICE (0xFFC01000, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@0", 1),
960 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@1", 1),
961  DEVICE (0xFFC01400, BFIN_MMR_PINT_SIZE,      "bfin_pint@0"),
962  DEVICE (0xFFC01430, BFIN_MMR_PINT_SIZE,      "bfin_pint@1"),
963 _DEVICE (0xFFC01460, BFIN_MMR_PINT_SIZE,      "bfin_pint@2", 2),
964 _DEVICE (0xFFC01490, BFIN_MMR_PINT_SIZE,      "bfin_pint@3", 2),
965  DEVICE (0xFFC014C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@0"),
966  DEVICE (0xFFC014E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@1"),
967  DEVICE (0xFFC01500, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@2"),
968  DEVICE (0xFFC01520, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@3"),
969  DEVICE (0xFFC01540, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@4"),
970  DEVICE (0xFFC01560, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@5"),
971  DEVICE (0xFFC01580, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@6"),
972  DEVICE (0xFFC015A0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@7"),
973  DEVICE (0xFFC015C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@8"),
974  DEVICE (0xFFC015E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@9"),
975  DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
976  DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
977  DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
978  DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
979  DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
980  DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
981  DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
982  DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
983  DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE,     "bfin_uart2@1"),
984 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@2", 1),
985  DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE,       "bfin_twi@1"),
986  DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
987 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@2", 1),
988 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@3", 1),
989  DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE,       "bfin_nfc"),
990  DEVICE (0xFFC04300, BFIN_MMR_OTP_SIZE,       "bfin_otp"),
991};
992static const struct bfin_dev_layout bf547_dev[] =
993{
994  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
995  DEVICE (0xFFC00300, BFIN_MMR_RTC_SIZE,       "bfin_rtc"),
996  DEVICE (0xFFC00400, BFIN_MMR_UART2_SIZE,     "bfin_uart2@0"),
997  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
998  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@8"),
999  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@9"),
1000  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@10"),
1001  DEVICE (0xFFC00700, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
1002  DEVICE (0xFFC00A00, BF54X_MMR_EBIU_AMC_SIZE, "bfin_ebiu_amc"),
1003  DEVICE (0xFFC00A20, BFIN_MMR_EBIU_DDRC_SIZE, "bfin_ebiu_ddrc"),
1004 _DEVICE (0xFFC01000, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@0", 1),
1005 _DEVICE (0xFFC01300, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@1", 1),
1006  DEVICE (0xFFC01400, BFIN_MMR_PINT_SIZE,      "bfin_pint@0"),
1007  DEVICE (0xFFC01430, BFIN_MMR_PINT_SIZE,      "bfin_pint@1"),
1008 _DEVICE (0xFFC01460, BFIN_MMR_PINT_SIZE,      "bfin_pint@2", 2),
1009 _DEVICE (0xFFC01490, BFIN_MMR_PINT_SIZE,      "bfin_pint@3", 2),
1010  DEVICE (0xFFC014C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@0"),
1011  DEVICE (0xFFC014E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@1"),
1012  DEVICE (0xFFC01500, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@2"),
1013  DEVICE (0xFFC01520, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@3"),
1014  DEVICE (0xFFC01540, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@4"),
1015  DEVICE (0xFFC01560, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@5"),
1016  DEVICE (0xFFC01580, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@6"),
1017  DEVICE (0xFFC015A0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@7"),
1018  DEVICE (0xFFC015C0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@8"),
1019  DEVICE (0xFFC015E0, BFIN_MMR_GPIO2_SIZE,     "bfin_gpio2@9"),
1020  DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
1021  DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
1022  DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
1023  DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
1024  DEVICE (0xFFC01640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
1025  DEVICE (0xFFC01650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
1026  DEVICE (0xFFC01660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
1027  DEVICE (0xFFC01670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
1028  DEVICE (0xFFC02000, BFIN_MMR_UART2_SIZE,     "bfin_uart2@1"),
1029 _DEVICE (0xFFC02100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@2", 1),
1030  DEVICE (0xFFC02200, BFIN_MMR_TWI_SIZE,       "bfin_twi@1"),
1031  DEVICE (0xFFC02300, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
1032 _DEVICE (0xFFC02400, BFIN_MMR_SPI_SIZE,       "bfin_spi@2", 1),
1033 _DEVICE (0xFFC02900, BFIN_MMR_EPPI_SIZE,      "bfin_eppi@2", 1),
1034 _DEVICE (0xFFC03100, BFIN_MMR_UART2_SIZE,     "bfin_uart2@3", 1),
1035  DEVICE (0xFFC03B00, BFIN_MMR_NFC_SIZE,       "bfin_nfc"),
1036};
1037#define bf548_dev bf547_dev
1038#define bf549_dev bf547_dev
1039static const struct bfin_dmac_layout bf54x_dmac[] =
1040{
1041  { BFIN_MMR_DMAC0_BASE, 12, },
1042  { BFIN_MMR_DMAC1_BASE, 12, },
1043};
1044#define bf542_dmac bf54x_dmac
1045#define bf544_dmac bf54x_dmac
1046#define bf547_dmac bf54x_dmac
1047#define bf548_dmac bf54x_dmac
1048#define bf549_dmac bf54x_dmac
1049#define PINT_PIQS(p, b, g) \
1050  PORT (p, "piq0@"#b,  g, "p0"), \
1051  PORT (p, "piq1@"#b,  g, "p1"), \
1052  PORT (p, "piq2@"#b,  g, "p2"), \
1053  PORT (p, "piq3@"#b,  g, "p3"), \
1054  PORT (p, "piq4@"#b,  g, "p4"), \
1055  PORT (p, "piq5@"#b,  g, "p5"), \
1056  PORT (p, "piq6@"#b,  g, "p6"), \
1057  PORT (p, "piq7@"#b,  g, "p7"), \
1058  PORT (p, "piq8@"#b,  g, "p8"), \
1059  PORT (p, "piq9@"#b,  g, "p9"), \
1060  PORT (p, "piq10@"#b, g, "p10"), \
1061  PORT (p, "piq11@"#b, g, "p11"), \
1062  PORT (p, "piq12@"#b, g, "p12"), \
1063  PORT (p, "piq13@"#b, g, "p13"), \
1064  PORT (p, "piq14@"#b, g, "p14"), \
1065  PORT (p, "piq15@"#b, g, "p15")
1066static const struct bfin_port_layout bf54x_port[] =
1067{
1068  SIC (0,  0, "bfin_pll",          "pll"),
1069  SIC (0,  1, "bfin_dmac@0",       "stat"),
1070  SIC (0,  2, "bfin_eppi@0",       "stat"),
1071  SIC (0,  3, "bfin_sport@0",      "stat"),
1072  SIC (0,  4, "bfin_sport@1",      "stat"),
1073  SIC (0,  5, "bfin_spi@0",        "stat"),
1074  SIC (0,  6, "bfin_uart2@0",      "stat"),
1075  SIC (0,  7, "bfin_rtc",          "rtc"),
1076  SIC (0,  8, "bfin_dma@12",       "di"),
1077  SIC (0,  9, "bfin_dma@0",        "di"),
1078  SIC (0, 10, "bfin_dma@1",        "di"),
1079  SIC (0, 11, "bfin_dma@2",        "di"),
1080  SIC (0, 12, "bfin_dma@3",        "di"),
1081  SIC (0, 13, "bfin_dma@4",        "di"),
1082  SIC (0, 14, "bfin_dma@6",        "di"),
1083  SIC (0, 15, "bfin_dma@7",        "di"),
1084  SIC (0, 16, "bfin_gptimer@8",    "stat"),
1085  SIC (0, 17, "bfin_gptimer@9",    "stat"),
1086  SIC (0, 18, "bfin_gptimer@10",   "stat"),
1087  SIC (0, 19, "bfin_pint@0",       "stat"),
1088  PINT_PIQS ("bfin_pint@0", 0, "bfin_gpio2@0"),
1089  PINT_PIQS ("bfin_pint@0", 1, "bfin_gpio2@1"),
1090  SIC (0, 20, "bfin_pint@1",       "stat"),
1091  PINT_PIQS ("bfin_pint@1", 0, "bfin_gpio2@0"),
1092  PINT_PIQS ("bfin_pint@1", 1, "bfin_gpio2@1"),
1093  SIC (0, 21, "bfin_dma@256",      "di"),	/* mdma0 */
1094  SIC (0, 21, "bfin_dma@257",      "di"),	/* mdma0 */
1095  SIC (0, 22, "bfin_dma@258",      "di"),	/* mdma1 */
1096  SIC (0, 22, "bfin_dma@259",      "di"),	/* mdma1 */
1097  SIC (0, 23, "bfin_wdog@0",       "gpi"),
1098  SIC (0, 24, "bfin_dmac@1",       "stat"),
1099  SIC (0, 25, "bfin_sport@2",      "stat"),
1100  SIC (0, 26, "bfin_sport@3",      "stat"),
1101  SIC (0, 27, "bfin_mxvr",         "data"),
1102  SIC (0, 28, "bfin_spi@1",        "stat"),
1103  SIC (0, 29, "bfin_spi@2",        "stat"),
1104  SIC (0, 30, "bfin_uart2@1",      "stat"),
1105  SIC (0, 31, "bfin_uart2@2",      "stat"),
1106  SIC (1,  0, "bfin_can@0",        "stat"),
1107  SIC (1,  1, "bfin_dma@18",       "di"),
1108  SIC (1,  2, "bfin_dma@19",       "di"),
1109  SIC (1,  3, "bfin_dma@20",       "di"),
1110  SIC (1,  4, "bfin_dma@21",       "di"),
1111  SIC (1,  5, "bfin_dma@13",       "di"),
1112  SIC (1,  6, "bfin_dma@14",       "di"),
1113  SIC (1,  7, "bfin_dma@5",        "di"),
1114  SIC (1,  8, "bfin_dma@23",       "di"),
1115  SIC (1,  9, "bfin_dma@8",        "di"),
1116  SIC (1, 10, "bfin_dma@9",        "di"),
1117  SIC (1, 11, "bfin_dma@10",       "di"),
1118  SIC (1, 12, "bfin_dma@11",       "di"),
1119  SIC (1, 13, "bfin_twi@0",        "stat"),
1120  SIC (1, 14, "bfin_twi@1",        "stat"),
1121  SIC (1, 15, "bfin_can@0",        "rx"),
1122  SIC (1, 16, "bfin_can@0",        "tx"),
1123  SIC (1, 17, "bfin_dma@260",      "di"),	/* mdma2 */
1124  SIC (1, 17, "bfin_dma@261",      "di"),	/* mdma2 */
1125  SIC (1, 18, "bfin_dma@262",      "di"),	/* mdma3 */
1126  SIC (1, 18, "bfin_dma@263",      "di"),	/* mdma3 */
1127  SIC (1, 19, "bfin_mxvr",         "stat"),
1128  SIC (1, 20, "bfin_mxvr",         "message"),
1129  SIC (1, 21, "bfin_mxvr",         "packet"),
1130  SIC (1, 22, "bfin_eppi@1",       "stat"),
1131  SIC (1, 23, "bfin_eppi@2",       "stat"),
1132  SIC (1, 24, "bfin_uart2@3",      "stat"),
1133  SIC (1, 25, "bfin_hostdp",       "stat"),
1134/*SIC (1, 26, reserved),*/
1135  SIC (1, 27, "bfin_pixc",         "stat"),
1136  SIC (1, 28, "bfin_nfc",          "stat"),
1137  SIC (1, 29, "bfin_atapi",        "stat"),
1138  SIC (1, 30, "bfin_can@1",        "stat"),
1139  SIC (1, 31, "bfin_dmar@0",       "block"),
1140  SIC (1, 31, "bfin_dmar@1",       "block"),
1141  SIC (1, 31, "bfin_dmar@0",       "overflow"),
1142  SIC (1, 31, "bfin_dmar@1",       "overflow"),
1143  SIC (2,  0, "bfin_dma@15",       "di"),
1144  SIC (2,  1, "bfin_dma@16",       "di"),
1145  SIC (2,  2, "bfin_dma@17",       "di"),
1146  SIC (2,  3, "bfin_dma@22",       "di"),
1147  SIC (2,  4, "bfin_counter@0",    "stat"),
1148  SIC (2,  5, "bfin_kpad@0",       "stat"),
1149  SIC (2,  6, "bfin_can@1",        "rx"),
1150  SIC (2,  7, "bfin_can@1",        "tx"),
1151  SIC (2,  8, "bfin_sdh",          "mask0"),
1152  SIC (2,  9, "bfin_sdh",          "mask1"),
1153/*SIC (2, 10, reserved),*/
1154  SIC (2, 11, "bfin_usb",          "int0"),
1155  SIC (2, 12, "bfin_usb",          "int1"),
1156  SIC (2, 13, "bfin_usb",          "int2"),
1157  SIC (2, 14, "bfin_usb",          "dma"),
1158  SIC (2, 15, "bfin_otp",          "stat"),
1159/*SIC (2, 16, reserved),*/
1160/*SIC (2, 17, reserved),*/
1161/*SIC (2, 18, reserved),*/
1162/*SIC (2, 19, reserved),*/
1163/*SIC (2, 20, reserved),*/
1164/*SIC (2, 21, reserved),*/
1165  SIC (2, 22, "bfin_gptimer@0",    "stat"),
1166  SIC (2, 23, "bfin_gptimer@1",    "stat"),
1167  SIC (2, 24, "bfin_gptimer@2",    "stat"),
1168  SIC (2, 25, "bfin_gptimer@3",    "stat"),
1169  SIC (2, 26, "bfin_gptimer@4",    "stat"),
1170  SIC (2, 27, "bfin_gptimer@5",    "stat"),
1171  SIC (2, 28, "bfin_gptimer@6",    "stat"),
1172  SIC (2, 29, "bfin_gptimer@7",    "stat"),
1173  SIC (2, 30, "bfin_pint@2",       "stat"),
1174  PINT_PIQS ("bfin_pint@2", 0, "bfin_gpio2@2"),
1175  PINT_PIQS ("bfin_pint@2", 1, "bfin_gpio2@3"),
1176  PINT_PIQS ("bfin_pint@2", 2, "bfin_gpio2@4"),
1177  PINT_PIQS ("bfin_pint@2", 3, "bfin_gpio2@5"),
1178  PINT_PIQS ("bfin_pint@2", 4, "bfin_gpio2@6"),
1179  PINT_PIQS ("bfin_pint@2", 5, "bfin_gpio2@7"),
1180  PINT_PIQS ("bfin_pint@2", 6, "bfin_gpio2@8"),
1181  PINT_PIQS ("bfin_pint@2", 7, "bfin_gpio2@9"),
1182  SIC (2, 31, "bfin_pint@3",       "stat"),
1183  PINT_PIQS ("bfin_pint@3", 0, "bfin_gpio2@2"),
1184  PINT_PIQS ("bfin_pint@3", 1, "bfin_gpio2@3"),
1185  PINT_PIQS ("bfin_pint@3", 2, "bfin_gpio2@4"),
1186  PINT_PIQS ("bfin_pint@3", 3, "bfin_gpio2@5"),
1187  PINT_PIQS ("bfin_pint@3", 4, "bfin_gpio2@6"),
1188  PINT_PIQS ("bfin_pint@3", 5, "bfin_gpio2@7"),
1189  PINT_PIQS ("bfin_pint@3", 6, "bfin_gpio2@8"),
1190  PINT_PIQS ("bfin_pint@3", 7, "bfin_gpio2@9"),
1191};
1192#define bf542_port bf54x_port
1193#define bf544_port bf54x_port
1194#define bf547_port bf54x_port
1195#define bf548_port bf54x_port
1196#define bf549_port bf54x_port
1197
1198/* This is only Core A of course ...  */
1199#define bf561_chipid 0x27bb
1200static const struct bfin_memory_layout bf561_mem[] =
1201{
1202  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
1203  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
1204  LAYOUT (0xFEB00000, 0x20000, read_write_exec),	/* L2 */
1205  LAYOUT (0xFF800000, 0x4000, read_write),	/* Data A */
1206  LAYOUT (0xFF804000, 0x4000, read_write),	/* Data A Cache */
1207  LAYOUT (0xFF900000, 0x4000, read_write),	/* Data B */
1208  LAYOUT (0xFF904000, 0x4000, read_write),	/* Data B Cache */
1209  LAYOUT (0xFFA00000, 0x4000, read_write_exec),	/* Inst A [1] */
1210  LAYOUT (0xFFA10000, 0x4000, read_write_exec),	/* Inst Cache [1] */
1211};
1212static const struct bfin_dev_layout bf561_dev[] =
1213{
1214  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
1215  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
1216  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
1217  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
1218  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
1219  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
1220  DEVICE (0xFFC00630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@3"),
1221  DEVICE (0xFFC00640, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@4"),
1222  DEVICE (0xFFC00650, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@5"),
1223  DEVICE (0xFFC00660, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@6"),
1224  DEVICE (0xFFC00670, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@7"),
1225  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
1226  DEVICE (0xFFC00A00, BFIN_MMR_EBIU_AMC_SIZE,  "bfin_ebiu_amc"),
1227  DEVICE (0xFFC00A10, BFIN_MMR_EBIU_SDC_SIZE,  "bfin_ebiu_sdc"),
1228 _DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0", 1),
1229  DEVICE (0xFFC01200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@1"),
1230 _DEVICE (0xFFC01300, BFIN_MMR_PPI_SIZE,       "bfin_ppi@1", 1),
1231  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
1232  DEVICE (0xFFC01600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@8"),
1233  DEVICE (0xFFC01610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@9"),
1234  DEVICE (0xFFC01620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@10"),
1235  DEVICE (0xFFC01630, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@11"),
1236  DEVICE (0xFFC01700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@7"),
1237};
1238static const struct bfin_dmac_layout bf561_dmac[] =
1239{
1240  { BFIN_MMR_DMAC0_BASE, 12, },
1241  { BFIN_MMR_DMAC1_BASE, 12, },
1242  /* XXX: IMDMA: { 0xFFC01800, 4, }, */
1243};
1244static const struct bfin_port_layout bf561_port[] =
1245{
1246  /* SIC0 */
1247  SIC (0,  0, "bfin_pll",          "pll"),
1248/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
1249/*SIC (0,  2, "bfin_dmac@1",       "stat"),*/
1250/*SIC (0,  3, "bfin_imdmac",       "stat"),*/
1251  SIC (0,  4, "bfin_ppi@0",        "stat"),
1252  SIC (0,  5, "bfin_ppi@1",        "stat"),
1253  SIC (0,  6, "bfin_sport@0",      "stat"),
1254  SIC (0,  7, "bfin_sport@1",      "stat"),
1255  SIC (0,  8, "bfin_spi@0",        "stat"),
1256  SIC (0,  9, "bfin_uart@0",       "stat"),
1257/*SIC (0, 10, reserved),*/
1258  SIC (0, 11, "bfin_dma@12",       "di"),
1259  SIC (0, 12, "bfin_dma@13",       "di"),
1260  SIC (0, 13, "bfin_dma@14",       "di"),
1261  SIC (0, 14, "bfin_dma@15",       "di"),
1262  SIC (0, 15, "bfin_dma@16",       "di"),
1263  SIC (0, 16, "bfin_dma@17",       "di"),
1264  SIC (0, 17, "bfin_dma@18",       "di"),
1265  SIC (0, 18, "bfin_dma@19",       "di"),
1266  SIC (0, 19, "bfin_dma@20",       "di"),
1267  SIC (0, 20, "bfin_dma@21",       "di"),
1268  SIC (0, 21, "bfin_dma@22",       "di"),
1269  SIC (0, 22, "bfin_dma@23",       "di"),
1270  SIC (0, 23, "bfin_dma@0",        "di"),
1271  SIC (0, 24, "bfin_dma@1",        "di"),
1272  SIC (0, 25, "bfin_dma@2",        "di"),
1273  SIC (0, 26, "bfin_dma@3",        "di"),
1274  SIC (0, 27, "bfin_dma@4",        "di"),
1275  SIC (0, 28, "bfin_dma@5",        "di"),
1276  SIC (0, 29, "bfin_dma@6",        "di"),
1277  SIC (0, 30, "bfin_dma@7",        "di"),
1278  SIC (0, 31, "bfin_dma@8",        "di"),
1279  SIC (1,  0, "bfin_dma@9",        "di"),
1280  SIC (1,  1, "bfin_dma@10",       "di"),
1281  SIC (1,  2, "bfin_dma@11",       "di"),
1282  SIC (1,  3, "bfin_gptimer@0",    "stat"),
1283  SIC (1,  4, "bfin_gptimer@1",    "stat"),
1284  SIC (1,  5, "bfin_gptimer@2",    "stat"),
1285  SIC (1,  6, "bfin_gptimer@3",    "stat"),
1286  SIC (1,  7, "bfin_gptimer@4",    "stat"),
1287  SIC (1,  8, "bfin_gptimer@5",    "stat"),
1288  SIC (1,  9, "bfin_gptimer@6",    "stat"),
1289  SIC (1, 10, "bfin_gptimer@7",    "stat"),
1290  SIC (1, 11, "bfin_gptimer@8",    "stat"),
1291  SIC (1, 12, "bfin_gptimer@9",    "stat"),
1292  SIC (1, 13, "bfin_gptimer@10",   "stat"),
1293  SIC (1, 14, "bfin_gptimer@11",   "stat"),
1294  SIC (1, 15, "bfin_gpio@5",       "mask_a"),
1295  SIC (1, 16, "bfin_gpio@5",       "mask_b"),
1296  SIC (1, 17, "bfin_gpio@6",       "mask_a"),
1297  SIC (1, 18, "bfin_gpio@6",       "mask_b"),
1298  SIC (1, 19, "bfin_gpio@7",       "mask_a"),
1299  SIC (1, 20, "bfin_gpio@7",       "mask_b"),
1300  SIC (1, 21, "bfin_dma@256",      "di"),	/* mdma0 */
1301  SIC (1, 21, "bfin_dma@257",      "di"),	/* mdma0 */
1302  SIC (1, 22, "bfin_dma@258",      "di"),	/* mdma1 */
1303  SIC (1, 22, "bfin_dma@259",      "di"),	/* mdma1 */
1304  SIC (1, 23, "bfin_dma@260",      "di"),	/* mdma2 */
1305  SIC (1, 23, "bfin_dma@261",      "di"),	/* mdma2 */
1306  SIC (1, 24, "bfin_dma@262",      "di"),	/* mdma3 */
1307  SIC (1, 24, "bfin_dma@263",      "di"),	/* mdma3 */
1308  SIC (1, 25, "bfin_imdma@0",      "di"),
1309  SIC (1, 26, "bfin_imdma@1",      "di"),
1310  SIC (1, 27, "bfin_wdog@0",       "gpi"),
1311  SIC (1, 27, "bfin_wdog@1",       "gpi"),
1312/*SIC (1, 28, reserved),*/
1313/*SIC (1, 29, reserved),*/
1314  SIC (1, 30, "bfin_sic",          "sup_irq@0"),
1315  SIC (1, 31, "bfin_sic",          "sup_irq@1"),
1316};
1317
1318#define bf592_chipid 0x20cb
1319static const struct bfin_memory_layout bf592_mem[] =
1320{
1321  LAYOUT (0xFFC00800, 0x60, read_write),	/* SPORT0 stub */
1322  LAYOUT (0xFFC00900, 0x60, read_write),	/* SPORT1 stub */
1323  LAYOUT (0xFF800000, 0x8000, read_write),	/* Data A */
1324  LAYOUT (0xFFA00000, 0x4000, read_write_exec),	/* Inst A [1] */
1325  LAYOUT (0xFFA04000, 0x4000, read_write_exec),	/* Inst B [1] */
1326};
1327static const struct bfin_dev_layout bf592_dev[] =
1328{
1329  DEVICE (0xFFC00200, BFIN_MMR_WDOG_SIZE,      "bfin_wdog@0"),
1330  DEVICE (0xFFC00400, BFIN_MMR_UART_SIZE,      "bfin_uart@0"),
1331  DEVICE (0xFFC00500, BFIN_MMR_SPI_SIZE,       "bfin_spi@0"),
1332  DEVICE (0xFFC00600, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@0"),
1333  DEVICE (0xFFC00610, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@1"),
1334  DEVICE (0xFFC00620, BFIN_MMR_GPTIMER_SIZE,   "bfin_gptimer@2"),
1335  DEVICE (0xFFC00700, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@5"),
1336  DEVICE (0xFFC01000, BFIN_MMR_PPI_SIZE,       "bfin_ppi@0"),
1337  DEVICE (0xFFC01300, BFIN_MMR_SPI_SIZE,       "bfin_spi@1"),
1338  DEVICE (0xFFC01400, BFIN_MMR_TWI_SIZE,       "bfin_twi@0"),
1339  DEVICE (0xFFC01500, BFIN_MMR_GPIO_SIZE,      "bfin_gpio@6"),
1340};
1341static const struct bfin_dmac_layout bf592_dmac[] =
1342{
1343  /* XXX: there are only 9 channels, but mdma code below assumes that they
1344          start right after the dma channels ... */
1345  { BFIN_MMR_DMAC0_BASE, 12, },
1346};
1347static const struct bfin_port_layout bf592_port[] =
1348{
1349  SIC (0,  0, "bfin_pll",          "pll"),
1350/*SIC (0,  1, "bfin_dmac@0",       "stat"),*/
1351  SIC (0,  2, "bfin_ppi@0",        "stat"),
1352  SIC (0,  3, "bfin_sport@0",      "stat"),
1353  SIC (0,  4, "bfin_sport@1",      "stat"),
1354  SIC (0,  5, "bfin_spi@0",        "stat"),
1355  SIC (0,  6, "bfin_spi@1",        "stat"),
1356  SIC (0,  7, "bfin_uart@0",       "stat"),
1357  SIC (0,  8, "bfin_dma@0",        "di"),
1358  SIC (0,  9, "bfin_dma@1",        "di"),
1359  SIC (0, 10, "bfin_dma@2",        "di"),
1360  SIC (0, 11, "bfin_dma@3",        "di"),
1361  SIC (0, 12, "bfin_dma@4",        "di"),
1362  SIC (0, 13, "bfin_dma@5",        "di"),
1363  SIC (0, 14, "bfin_dma@6",        "di"),
1364  SIC (0, 15, "bfin_dma@7",        "di"),
1365  SIC (0, 16, "bfin_dma@8",        "di"),
1366  SIC (0, 17, "bfin_gpio@5",       "mask_a"),
1367  SIC (0, 18, "bfin_gpio@5",       "mask_b"),
1368  SIC (0, 19, "bfin_gptimer@0",    "stat"),
1369  SIC (0, 20, "bfin_gptimer@1",    "stat"),
1370  SIC (0, 21, "bfin_gptimer@2",    "stat"),
1371  SIC (0, 22, "bfin_gpio@6",       "mask_a"),
1372  SIC (0, 23, "bfin_gpio@6",       "mask_b"),
1373  SIC (0, 24, "bfin_twi@0",        "stat"),
1374/* XXX: 25 - 28 are supposed to be reserved; see comment in machs.c:bf592_dmac[]  */
1375  SIC (0, 25, "bfin_dma@9",        "di"),
1376  SIC (0, 26, "bfin_dma@10",       "di"),
1377  SIC (0, 27, "bfin_dma@11",       "di"),
1378  SIC (0, 28, "bfin_dma@12",       "di"),
1379/*SIC (0, 25, reserved),*/
1380/*SIC (0, 26, reserved),*/
1381/*SIC (0, 27, reserved),*/
1382/*SIC (0, 28, reserved),*/
1383  SIC (0, 29, "bfin_dma@256",      "di"),	/* mdma0 */
1384  SIC (0, 29, "bfin_dma@257",      "di"),	/* mdma0 */
1385  SIC (0, 30, "bfin_dma@258",      "di"),	/* mdma1 */
1386  SIC (0, 30, "bfin_dma@259",      "di"),	/* mdma1 */
1387  SIC (0, 31, "bfin_wdog",         "gpi"),
1388};
1389
1390static const struct bfin_model_data bfin_model_data[] =
1391{
1392#define P(n) \
1393  [MODEL_BF##n] = { \
1394    bf##n##_chipid, n, \
1395    bf##n##_mem , ARRAY_SIZE (bf##n##_mem ), \
1396    bf##n##_dev , ARRAY_SIZE (bf##n##_dev ), \
1397    bf##n##_dmac, ARRAY_SIZE (bf##n##_dmac), \
1398    bf##n##_port, ARRAY_SIZE (bf##n##_port), \
1399  },
1400#include "proc_list.def"
1401#undef P
1402};
1403
1404#define CORE_DEVICE(dev, DEV) \
1405  DEVICE (BFIN_COREMMR_##DEV##_BASE, BFIN_COREMMR_##DEV##_SIZE, "bfin_"#dev)
1406static const struct bfin_dev_layout bfin_core_dev[] =
1407{
1408  CORE_DEVICE (cec, CEC),
1409  CORE_DEVICE (ctimer, CTIMER),
1410  CORE_DEVICE (evt, EVT),
1411  CORE_DEVICE (jtag, JTAG),
1412  CORE_DEVICE (mmu, MMU),
1413  CORE_DEVICE (pfmon, PFMON),
1414  CORE_DEVICE (trace, TRACE),
1415  CORE_DEVICE (wp, WP),
1416};
1417
1418static void
1419dv_bfin_hw_port_parse (SIM_DESC sd, const struct bfin_model_data *mdata,
1420		       const char *dev)
1421{
1422  size_t i;
1423  const char *sdev;
1424
1425  sdev = strchr (dev, '/');
1426  if (sdev)
1427    ++sdev;
1428  else
1429    sdev = dev;
1430
1431  for (i = 0; i < mdata->port_count; ++i)
1432    {
1433      const struct bfin_port_layout *port = &mdata->port[i];
1434
1435      /* There might be more than one mapping.  */
1436      if (!strcmp (sdev, port->src))
1437	sim_hw_parse (sd, "/core/%s > %s %s /core/%s", dev,
1438		      port->src_port, port->dst_port, port->dst);
1439    }
1440}
1441
1442#define dv_bfin_hw_parse(sd, dv, DV) \
1443  do { \
1444    bu32 base = BFIN_MMR_##DV##_BASE; \
1445    bu32 size = BFIN_MMR_##DV##_SIZE; \
1446    sim_hw_parse (sd, "/core/bfin_"#dv"/reg %#x %i", base, size); \
1447    sim_hw_parse (sd, "/core/bfin_"#dv"/type %i",  mdata->model_num); \
1448    dv_bfin_hw_port_parse (sd, mdata, "bfin_"#dv); \
1449  } while (0)
1450
1451static void
1452bfin_model_hw_tree_init (SIM_DESC sd, SIM_CPU *cpu)
1453{
1454  const SIM_MODEL *model = CPU_MODEL (cpu);
1455  const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1456  const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1457  int mnum = MODEL_NUM (model);
1458  unsigned i, j, dma_chan;
1459
1460  /* Map the core devices.  */
1461  for (i = 0; i < ARRAY_SIZE (bfin_core_dev); ++i)
1462    {
1463      const struct bfin_dev_layout *dev = &bfin_core_dev[i];
1464      sim_hw_parse (sd, "/core/%s/reg %#x %i", dev->dev, dev->base, dev->len);
1465    }
1466  sim_hw_parse (sd, "/core/bfin_ctimer > ivtmr ivtmr /core/bfin_cec");
1467
1468  if (mnum == MODEL_BF000)
1469    goto done;
1470
1471  /* Map the system devices.  */
1472  dv_bfin_hw_parse (sd, sic, SIC);
1473  for (i = 7; i < 16; ++i)
1474    sim_hw_parse (sd, "/core/bfin_sic > ivg%i ivg%i /core/bfin_cec", i, i);
1475
1476  dv_bfin_hw_parse (sd, pll, PLL);
1477
1478  dma_chan = 0;
1479  for (i = 0; i < mdata->dmac_count; ++i)
1480    {
1481      const struct bfin_dmac_layout *dmac = &mdata->dmac[i];
1482
1483      sim_hw_parse (sd, "/core/bfin_dmac@%u/type %i", i, mdata->model_num);
1484
1485      /* Hook up the non-mdma channels.  */
1486      for (j = 0; j < dmac->dma_count; ++j)
1487	{
1488	  char dev[64];
1489
1490	  sprintf (dev, "bfin_dmac@%u/bfin_dma@%u", i, dma_chan);
1491	  sim_hw_parse (sd, "/core/%s/reg %#x %i", dev,
1492			dmac->base + j * BFIN_MMR_DMA_SIZE, BFIN_MMR_DMA_SIZE);
1493	  dv_bfin_hw_port_parse (sd, mdata, dev);
1494
1495	  ++dma_chan;
1496	}
1497
1498      /* Hook up the mdma channels -- assume every DMAC has 4.  */
1499      for (j = 0; j < 4; ++j)
1500	{
1501	  char dev[64];
1502
1503	  sprintf (dev, "bfin_dmac@%u/bfin_dma@%u", i, j + BFIN_DMAC_MDMA_BASE);
1504	  sim_hw_parse (sd, "/core/%s/reg %#x %i", dev,
1505			dmac->base + (j + dmac->dma_count) * BFIN_MMR_DMA_SIZE,
1506			BFIN_MMR_DMA_SIZE);
1507	  dv_bfin_hw_port_parse (sd, mdata, dev);
1508	}
1509    }
1510
1511  for (i = 0; i < mdata->dev_count; ++i)
1512    {
1513      const struct bfin_dev_layout *dev = &mdata->dev[i];
1514
1515      if (dev->len)
1516	{
1517	  sim_hw_parse (sd, "/core/%s/reg %#x %i", dev->dev, dev->base, dev->len);
1518	  sim_hw_parse (sd, "/core/%s/type %i", dev->dev, mdata->model_num);
1519	}
1520      else
1521	{
1522	  sim_hw_parse (sd, "/core/%s", dev->dev);
1523	}
1524
1525      dv_bfin_hw_port_parse (sd, mdata, dev->dev);
1526      if (strchr (dev->dev, '/'))
1527	continue;
1528
1529      if (!strncmp (dev->dev, "bfin_uart", 9)
1530	  || !strncmp (dev->dev, "bfin_emac", 9)
1531	  || !strncmp (dev->dev, "bfin_sport", 10))
1532	{
1533	  const char *sint = dev->dev + 5;
1534	  sim_hw_parse (sd, "/core/%s > tx   %s_tx   /core/bfin_dmac@%u", dev->dev, sint, dev->dmac);
1535	  sim_hw_parse (sd, "/core/%s > rx   %s_rx   /core/bfin_dmac@%u", dev->dev, sint, dev->dmac);
1536	}
1537      else if (!strncmp (dev->dev, "bfin_wdog", 9))
1538	{
1539	  sim_hw_parse (sd, "/core/%s > reset rst  /core/bfin_cec", dev->dev);
1540	  sim_hw_parse (sd, "/core/%s > nmi   nmi  /core/bfin_cec", dev->dev);
1541	}
1542    }
1543
1544 done:
1545  /* Add any additional user board content.  */
1546  if (board->hw_file)
1547    sim_do_commandf (sd, "hw-file %s", board->hw_file);
1548
1549  /* Trigger all the new devices' finish func.  */
1550  hw_tree_finish (dv_get_device (cpu, "/"));
1551}
1552
1553#include "bfroms/all.h"
1554
1555struct bfrom {
1556  bu32 addr, len, alias_len;
1557  int sirev;
1558  const char *buf;
1559};
1560
1561#define BFROMA(addr, rom, sirev, alias_len) \
1562  { addr, sizeof (bfrom_bf##rom##_0_##sirev), alias_len, \
1563    sirev, bfrom_bf##rom##_0_##sirev, }
1564#define BFROM(rom, sirev, alias_len) BFROMA (0xef000000, rom, sirev, alias_len)
1565#define BFROM_STUB { 0, 0, 0, 0, NULL, }
1566static const struct bfrom bf50x_roms[] =
1567{
1568  BFROM (50x, 0, 0x1000000),
1569  BFROM_STUB,
1570};
1571static const struct bfrom bf51x_roms[] =
1572{
1573  BFROM (51x, 2, 0x1000000),
1574  BFROM (51x, 1, 0x1000000),
1575  BFROM (51x, 0, 0x1000000),
1576  BFROM_STUB,
1577};
1578static const struct bfrom bf526_roms[] =
1579{
1580  BFROM (526, 2, 0x1000000),
1581  BFROM (526, 1, 0x1000000),
1582  BFROM (526, 0, 0x1000000),
1583  BFROM_STUB,
1584};
1585static const struct bfrom bf527_roms[] =
1586{
1587  BFROM (527, 2, 0x1000000),
1588  BFROM (527, 1, 0x1000000),
1589  BFROM (527, 0, 0x1000000),
1590  BFROM_STUB,
1591};
1592static const struct bfrom bf533_roms[] =
1593{
1594  BFROM (533, 6, 0x1000000),
1595  BFROM (533, 5, 0x1000000),
1596  BFROM (533, 4, 0x1000000),
1597  BFROM (533, 3, 0x1000000),
1598  BFROM (533, 2, 0x1000000),
1599  BFROM (533, 1, 0x1000000),
1600  BFROM_STUB,
1601};
1602static const struct bfrom bf537_roms[] =
1603{
1604  BFROM (537, 3, 0x100000),
1605  BFROM (537, 2, 0x100000),
1606  BFROM (537, 1, 0x100000),
1607  BFROM (537, 0, 0x100000),
1608  BFROM_STUB,
1609};
1610static const struct bfrom bf538_roms[] =
1611{
1612  BFROM (538, 5, 0x1000000),
1613  BFROM (538, 4, 0x1000000),
1614  BFROM (538, 3, 0x1000000),
1615  BFROM (538, 2, 0x1000000),
1616  BFROM (538, 1, 0x1000000),
1617  BFROM (538, 0, 0x1000000),
1618  BFROM_STUB,
1619};
1620static const struct bfrom bf54x_roms[] =
1621{
1622  BFROM (54x, 4, 0x1000),
1623  BFROM (54x, 2, 0x1000),
1624  BFROM (54x, 1, 0x1000),
1625  BFROM (54x, 0, 0x1000),
1626  BFROMA (0xffa14000, 54x_l1, 4, 0x10000),
1627  BFROMA (0xffa14000, 54x_l1, 2, 0x10000),
1628  BFROMA (0xffa14000, 54x_l1, 1, 0x10000),
1629  BFROMA (0xffa14000, 54x_l1, 0, 0x10000),
1630  BFROM_STUB,
1631};
1632static const struct bfrom bf561_roms[] =
1633{
1634  /* XXX: No idea what the actual wrap limit is here.  */
1635  BFROM (561, 5, 0x1000),
1636  BFROM_STUB,
1637};
1638static const struct bfrom bf59x_roms[] =
1639{
1640  BFROM (59x, 1, 0x1000000),
1641  BFROM (59x, 0, 0x1000000),
1642  BFROMA (0xffa10000, 59x_l1, 1, 0x10000),
1643  BFROM_STUB,
1644};
1645
1646static void
1647bfin_model_map_bfrom (SIM_DESC sd, SIM_CPU *cpu)
1648{
1649  const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1650  const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1651  int mnum = mdata->model_num;
1652  const struct bfrom *bfrom;
1653  unsigned int sirev;
1654
1655  if (mnum >= 500 && mnum <= 509)
1656    bfrom = bf50x_roms;
1657  else if (mnum >= 510 && mnum <= 519)
1658    bfrom = bf51x_roms;
1659  else if (mnum >= 520 && mnum <= 529)
1660    bfrom = (mnum & 1) ? bf527_roms : bf526_roms;
1661  else if (mnum >= 531 && mnum <= 533)
1662    bfrom = bf533_roms;
1663  else if (mnum == 535)
1664    return; /* Stub.  */
1665  else if (mnum >= 534 && mnum <= 537)
1666    bfrom = bf537_roms;
1667  else if (mnum >= 538 && mnum <= 539)
1668    bfrom = bf538_roms;
1669  else if (mnum >= 540 && mnum <= 549)
1670    bfrom = bf54x_roms;
1671  else if (mnum == 561)
1672    bfrom = bf561_roms;
1673  else if (mnum >= 590 && mnum <= 599)
1674    bfrom = bf59x_roms;
1675  else
1676    return;
1677
1678  if (board->sirev_valid)
1679    sirev = board->sirev;
1680  else
1681    sirev = bfrom->sirev;
1682  while (bfrom->buf)
1683    {
1684      /* Map all the ranges for this model/sirev.  */
1685      if (bfrom->sirev == sirev)
1686        sim_core_attach (sd, NULL, 0, access_read_exec, 0, bfrom->addr,
1687			 bfrom->alias_len ? : bfrom->len, bfrom->len, NULL,
1688			 (char *)bfrom->buf);
1689      ++bfrom;
1690    }
1691}
1692
1693void
1694bfin_model_cpu_init (SIM_DESC sd, SIM_CPU *cpu)
1695{
1696  const SIM_MODEL *model = CPU_MODEL (cpu);
1697  const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1698  int mnum = MODEL_NUM (model);
1699  size_t idx;
1700
1701  /* These memory maps are supposed to be cpu-specific, but the common sim
1702     code does not yet allow that (2nd arg is "cpu" rather than "NULL".  */
1703  sim_core_attach (sd, NULL, 0, access_read_write, 0, BFIN_L1_SRAM_SCRATCH,
1704		   BFIN_L1_SRAM_SCRATCH_SIZE, 0, NULL, NULL);
1705
1706  if (STATE_ENVIRONMENT (CPU_STATE (cpu)) != OPERATING_ENVIRONMENT)
1707    return;
1708
1709  if (mnum == MODEL_BF000)
1710    goto core_only;
1711
1712  /* Map in the on-chip memories (SRAMs).  */
1713  mdata = &bfin_model_data[MODEL_NUM (model)];
1714  for (idx = 0; idx < mdata->mem_count; ++idx)
1715    {
1716      const struct bfin_memory_layout *mem = &mdata->mem[idx];
1717      sim_core_attach (sd, NULL, 0, mem->mask, 0, mem->addr,
1718		       mem->len, 0, NULL, NULL);
1719    }
1720
1721  /* Map the on-chip ROMs.  */
1722  bfin_model_map_bfrom (sd, cpu);
1723
1724 core_only:
1725  /* Finally, build up the tree for this cpu model.  */
1726  bfin_model_hw_tree_init (sd, cpu);
1727}
1728
1729bu32
1730bfin_model_get_chipid (SIM_DESC sd)
1731{
1732  SIM_CPU *cpu = STATE_CPU (sd, 0);
1733  const struct bfin_model_data *mdata = CPU_MODEL_DATA (cpu);
1734  const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1735  return
1736	 (board->sirev << 28) |
1737	 (mdata->chipid << 12) |
1738	 (((0xE5 << 1) | 1) & 0xFF);
1739}
1740
1741bu32
1742bfin_model_get_dspid (SIM_DESC sd)
1743{
1744  const struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1745  return
1746	 (0xE5 << 24) |
1747	 (0x04 << 16) |
1748	 (board->sirev);
1749}
1750
1751static void
1752bfin_model_init (SIM_CPU *cpu)
1753{
1754  CPU_MODEL_DATA (cpu) = (void *) &bfin_model_data[MODEL_NUM (CPU_MODEL (cpu))];
1755}
1756
1757static bu32
1758bfin_extract_unsigned_integer (unsigned char *addr, int len)
1759{
1760  bu32 retval;
1761  unsigned char * p;
1762  unsigned char * startaddr = (unsigned char *)addr;
1763  unsigned char * endaddr = startaddr + len;
1764
1765  retval = 0;
1766
1767  for (p = endaddr; p > startaddr;)
1768    retval = (retval << 8) | *--p;
1769
1770  return retval;
1771}
1772
1773static void
1774bfin_store_unsigned_integer (unsigned char *addr, int len, bu32 val)
1775{
1776  unsigned char *p;
1777  unsigned char *startaddr = addr;
1778  unsigned char *endaddr = startaddr + len;
1779
1780  for (p = startaddr; p < endaddr;)
1781    {
1782      *p++ = val & 0xff;
1783      val >>= 8;
1784    }
1785}
1786
1787static bu32 *
1788bfin_get_reg (SIM_CPU *cpu, int rn)
1789{
1790  switch (rn)
1791    {
1792    case SIM_BFIN_R0_REGNUM: return &DREG (0);
1793    case SIM_BFIN_R1_REGNUM: return &DREG (1);
1794    case SIM_BFIN_R2_REGNUM: return &DREG (2);
1795    case SIM_BFIN_R3_REGNUM: return &DREG (3);
1796    case SIM_BFIN_R4_REGNUM: return &DREG (4);
1797    case SIM_BFIN_R5_REGNUM: return &DREG (5);
1798    case SIM_BFIN_R6_REGNUM: return &DREG (6);
1799    case SIM_BFIN_R7_REGNUM: return &DREG (7);
1800    case SIM_BFIN_P0_REGNUM: return &PREG (0);
1801    case SIM_BFIN_P1_REGNUM: return &PREG (1);
1802    case SIM_BFIN_P2_REGNUM: return &PREG (2);
1803    case SIM_BFIN_P3_REGNUM: return &PREG (3);
1804    case SIM_BFIN_P4_REGNUM: return &PREG (4);
1805    case SIM_BFIN_P5_REGNUM: return &PREG (5);
1806    case SIM_BFIN_SP_REGNUM: return &SPREG;
1807    case SIM_BFIN_FP_REGNUM: return &FPREG;
1808    case SIM_BFIN_I0_REGNUM: return &IREG (0);
1809    case SIM_BFIN_I1_REGNUM: return &IREG (1);
1810    case SIM_BFIN_I2_REGNUM: return &IREG (2);
1811    case SIM_BFIN_I3_REGNUM: return &IREG (3);
1812    case SIM_BFIN_M0_REGNUM: return &MREG (0);
1813    case SIM_BFIN_M1_REGNUM: return &MREG (1);
1814    case SIM_BFIN_M2_REGNUM: return &MREG (2);
1815    case SIM_BFIN_M3_REGNUM: return &MREG (3);
1816    case SIM_BFIN_B0_REGNUM: return &BREG (0);
1817    case SIM_BFIN_B1_REGNUM: return &BREG (1);
1818    case SIM_BFIN_B2_REGNUM: return &BREG (2);
1819    case SIM_BFIN_B3_REGNUM: return &BREG (3);
1820    case SIM_BFIN_L0_REGNUM: return &LREG (0);
1821    case SIM_BFIN_L1_REGNUM: return &LREG (1);
1822    case SIM_BFIN_L2_REGNUM: return &LREG (2);
1823    case SIM_BFIN_L3_REGNUM: return &LREG (3);
1824    case SIM_BFIN_RETS_REGNUM: return &RETSREG;
1825    case SIM_BFIN_A0_DOT_X_REGNUM: return &AXREG (0);
1826    case SIM_BFIN_A0_DOT_W_REGNUM: return &AWREG (0);
1827    case SIM_BFIN_A1_DOT_X_REGNUM: return &AXREG (1);
1828    case SIM_BFIN_A1_DOT_W_REGNUM: return &AWREG (1);
1829    case SIM_BFIN_LC0_REGNUM: return &LCREG (0);
1830    case SIM_BFIN_LT0_REGNUM: return &LTREG (0);
1831    case SIM_BFIN_LB0_REGNUM: return &LBREG (0);
1832    case SIM_BFIN_LC1_REGNUM: return &LCREG (1);
1833    case SIM_BFIN_LT1_REGNUM: return &LTREG (1);
1834    case SIM_BFIN_LB1_REGNUM: return &LBREG (1);
1835    case SIM_BFIN_CYCLES_REGNUM: return &CYCLESREG;
1836    case SIM_BFIN_CYCLES2_REGNUM: return &CYCLES2REG;
1837    case SIM_BFIN_USP_REGNUM: return &USPREG;
1838    case SIM_BFIN_SEQSTAT_REGNUM: return &SEQSTATREG;
1839    case SIM_BFIN_SYSCFG_REGNUM: return &SYSCFGREG;
1840    case SIM_BFIN_RETI_REGNUM: return &RETIREG;
1841    case SIM_BFIN_RETX_REGNUM: return &RETXREG;
1842    case SIM_BFIN_RETN_REGNUM: return &RETNREG;
1843    case SIM_BFIN_RETE_REGNUM: return &RETEREG;
1844    case SIM_BFIN_PC_REGNUM: return &PCREG;
1845    default: return NULL;
1846  }
1847}
1848
1849static int
1850bfin_reg_fetch (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1851{
1852  bu32 value, *reg;
1853
1854  reg = bfin_get_reg (cpu, rn);
1855  if (reg)
1856    value = *reg;
1857  else if (rn == SIM_BFIN_ASTAT_REGNUM)
1858    value = ASTAT;
1859  else if (rn == SIM_BFIN_CC_REGNUM)
1860    value = CCREG;
1861  else
1862    return -1;
1863
1864  /* Handle our KSP/USP shadowing in SP.  While in supervisor mode, we
1865     have the normal SP/USP behavior.  User mode is tricky though.  */
1866  if (STATE_ENVIRONMENT (CPU_STATE (cpu)) == OPERATING_ENVIRONMENT
1867      && cec_is_user_mode (cpu))
1868    {
1869      if (rn == SIM_BFIN_SP_REGNUM)
1870	value = KSPREG;
1871      else if (rn == SIM_BFIN_USP_REGNUM)
1872	value = SPREG;
1873    }
1874
1875  bfin_store_unsigned_integer (buf, 4, value);
1876
1877  return 4;
1878}
1879
1880static int
1881bfin_reg_store (SIM_CPU *cpu, int rn, unsigned char *buf, int len)
1882{
1883  bu32 value, *reg;
1884
1885  value = bfin_extract_unsigned_integer (buf, 4);
1886  reg = bfin_get_reg (cpu, rn);
1887
1888  if (reg)
1889    /* XXX: Need register trace ?  */
1890    *reg = value;
1891  else if (rn == SIM_BFIN_ASTAT_REGNUM)
1892    SET_ASTAT (value);
1893  else if (rn == SIM_BFIN_CC_REGNUM)
1894    SET_CCREG (value);
1895  else
1896    return -1;
1897
1898  return 4;
1899}
1900
1901static sim_cia
1902bfin_pc_get (SIM_CPU *cpu)
1903{
1904  return PCREG;
1905}
1906
1907static void
1908bfin_pc_set (SIM_CPU *cpu, sim_cia newpc)
1909{
1910  SET_PCREG (newpc);
1911}
1912
1913static const char *
1914bfin_insn_name (SIM_CPU *cpu, int i)
1915{
1916  static const char * const insn_name[] = {
1917#define I(insn) #insn,
1918#include "insn_list.def"
1919#undef I
1920  };
1921  return insn_name[i];
1922}
1923
1924static void
1925bfin_init_cpu (SIM_CPU *cpu)
1926{
1927  CPU_REG_FETCH (cpu) = bfin_reg_fetch;
1928  CPU_REG_STORE (cpu) = bfin_reg_store;
1929  CPU_PC_FETCH (cpu) = bfin_pc_get;
1930  CPU_PC_STORE (cpu) = bfin_pc_set;
1931  CPU_MAX_INSNS (cpu) = BFIN_INSN_MAX;
1932  CPU_INSN_NAME (cpu) = bfin_insn_name;
1933}
1934
1935static void
1936bfin_prepare_run (SIM_CPU *cpu)
1937{
1938}
1939
1940static const SIM_MODEL bfin_models[] =
1941{
1942#define P(n) { "bf"#n, & bfin_mach, MODEL_BF##n, NULL, bfin_model_init },
1943#include "proc_list.def"
1944#undef P
1945  { 0, NULL, 0, NULL, NULL, }
1946};
1947
1948static const SIM_MACH_IMP_PROPERTIES bfin_imp_properties =
1949{
1950  sizeof (SIM_CPU),
1951  0,
1952};
1953
1954static const SIM_MACH bfin_mach =
1955{
1956  "bfin", "bfin", MACH_BFIN,
1957  32, 32, & bfin_models[0], & bfin_imp_properties,
1958  bfin_init_cpu,
1959  bfin_prepare_run
1960};
1961
1962const SIM_MACH *sim_machs[] =
1963{
1964  & bfin_mach,
1965  NULL
1966};
1967
1968/* Device option parsing.  */
1969
1970static DECLARE_OPTION_HANDLER (bfin_mach_option_handler);
1971
1972enum {
1973  OPTION_MACH_SIREV = OPTION_START,
1974  OPTION_MACH_HW_BOARD_FILE,
1975};
1976
1977const OPTION bfin_mach_options[] =
1978{
1979  { {"sirev", required_argument, NULL, OPTION_MACH_SIREV },
1980      '\0', "NUMBER", "Set CPU silicon revision",
1981      bfin_mach_option_handler, NULL },
1982
1983  { {"hw-board-file", required_argument, NULL, OPTION_MACH_HW_BOARD_FILE },
1984      '\0', "FILE", "Add the supplemental devices listed in the file",
1985      bfin_mach_option_handler, NULL },
1986
1987  { {NULL, no_argument, NULL, 0}, '\0', NULL, NULL, NULL, NULL }
1988};
1989
1990static SIM_RC
1991bfin_mach_option_handler (SIM_DESC sd, sim_cpu *current_cpu, int opt,
1992			  char *arg, int is_command)
1993{
1994  struct bfin_board_data *board = STATE_BOARD_DATA (sd);
1995
1996  switch (opt)
1997    {
1998    case OPTION_MACH_SIREV:
1999      board->sirev_valid = 1;
2000      /* Accept (and throw away) a leading "0." in the version.  */
2001      if (!strncmp (arg, "0.", 2))
2002	arg += 2;
2003      board->sirev = atoi (arg);
2004      if (board->sirev > 0xf)
2005	{
2006	  sim_io_eprintf (sd, "sirev '%s' needs to fit into 4 bits\n", arg);
2007	  return SIM_RC_FAIL;
2008	}
2009      return SIM_RC_OK;
2010
2011    case OPTION_MACH_HW_BOARD_FILE:
2012      board->hw_file = xstrdup (arg);
2013      return SIM_RC_OK;
2014
2015    default:
2016      sim_io_eprintf (sd, "Unknown Blackfin option %d\n", opt);
2017      return SIM_RC_FAIL;
2018    }
2019}
2020