1 |
/* |
2 |
* Copyright (C) 2003-2007 Anders Gavare. All rights reserved. |
3 |
* |
4 |
* Redistribution and use in source and binary forms, with or without |
5 |
* modification, are permitted provided that the following conditions are met: |
6 |
* |
7 |
* 1. Redistributions of source code must retain the above copyright |
8 |
* notice, this list of conditions and the following disclaimer. |
9 |
* 2. Redistributions in binary form must reproduce the above copyright |
10 |
* notice, this list of conditions and the following disclaimer in the |
11 |
* documentation and/or other materials provided with the distribution. |
12 |
* 3. The name of the author may not be used to endorse or promote products |
13 |
* derived from this software without specific prior written permission. |
14 |
* |
15 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND |
16 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
17 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE |
19 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
20 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
21 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
22 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
23 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
24 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
25 |
* SUCH DAMAGE. |
26 |
* |
27 |
* |
28 |
* $Id: machine_arc.c,v 1.20 2007/06/15 18:08:10 debug Exp $ |
29 |
* |
30 |
* COMMENT: ARC (Advanced RISC Computing) machines |
31 |
*/ |
32 |
|
33 |
#include <stdio.h> |
34 |
#include <stdlib.h> |
35 |
#include <string.h> |
36 |
|
37 |
#include "arcbios.h" |
38 |
#include "cpu.h" |
39 |
#include "device.h" |
40 |
#include "devices.h" |
41 |
#include "machine.h" |
42 |
#include "memory.h" |
43 |
#include "misc.h" |
44 |
|
45 |
#define MACHINE_NAME_MAXBUF 100 |
46 |
|
47 |
|
48 |
MACHINE_SETUP(arc) |
49 |
{ |
50 |
void *jazz_data; |
51 |
struct memory *mem = machine->memory; |
52 |
char tmpstr[1000]; |
53 |
char tmpstr2[1000]; |
54 |
int i, j; |
55 |
char *eaddr_string = "eaddr=10:20:30:40:50:60"; /* bogus */ |
56 |
unsigned char macaddr[6]; |
57 |
|
58 |
CHECK_ALLOCATION(machine->machine_name = malloc(MACHINE_NAME_MAXBUF)); |
59 |
|
60 |
cpu->byte_order = EMUL_LITTLE_ENDIAN; |
61 |
snprintf(machine->machine_name, MACHINE_NAME_MAXBUF, "ARC"); |
62 |
|
63 |
switch (machine->machine_subtype) { |
64 |
|
65 |
case MACHINE_ARC_JAZZ_PICA: |
66 |
case MACHINE_ARC_JAZZ_MAGNUM: |
67 |
/* |
68 |
* "PICA-61" |
69 |
* |
70 |
* According to NetBSD 1.6.2: |
71 |
* |
72 |
* jazzio0 at mainbus0 |
73 |
* timer0 at jazzio0 addr 0xe0000228 |
74 |
* mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible |
75 |
* lpt at jazzio0 addr 0xe0008000 intr 0 not configured |
76 |
* fdc at jazzio0 addr 0xe0003000 intr 1 not configured |
77 |
* MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured |
78 |
* ALI_S3 at jazzio0 addr 0xe0800000 intr 3 not configured |
79 |
* sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet |
80 |
* sn0: Ethernet address 69:6a:6b:6c:00:00 |
81 |
* asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0 |
82 |
* pckbd at jazzio0 addr 0xe0005000 intr 6 not configured |
83 |
* pms at jazzio0 addr 0xe0005000 intr 7 not configured |
84 |
* com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, |
85 |
* working fifo |
86 |
* com at jazzio0 addr 0xe0007000 intr 9 not configured |
87 |
* jazzisabr0 at mainbus0 |
88 |
* isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base |
89 |
* 0xe3000000 |
90 |
* |
91 |
* "Microsoft-Jazz", "MIPS Magnum" |
92 |
* |
93 |
* timer0 at jazzio0 addr 0xe0000228 |
94 |
* mcclock0 at jazzio0 addr 0xe0004000: mc146818 or compatible |
95 |
* lpt at jazzio0 addr 0xe0008000 intr 0 not configured |
96 |
* fdc at jazzio0 addr 0xe0003000 intr 1 not configured |
97 |
* MAGNUM at jazzio0 addr 0xe000c000 intr 2 not configured |
98 |
* VXL at jazzio0 addr 0xe0800000 intr 3 not configured |
99 |
* sn0 at jazzio0 addr 0xe0001000 intr 4: SONIC Ethernet |
100 |
* sn0: Ethernet address 69:6a:6b:6c:00:00 |
101 |
* asc0 at jazzio0 addr 0xe0002000 intr 5: NCR53C94, target 0 |
102 |
* scsibus0 at asc0: 8 targets, 8 luns per target |
103 |
* pckbd at jazzio0 addr 0xe0005000 intr 6 not configured |
104 |
* pms at jazzio0 addr 0xe0005000 intr 7 not configured |
105 |
* com0 at jazzio0 addr 0xe0006000 intr 8: ns16550a, |
106 |
* working fifo |
107 |
* com at jazzio0 addr 0xe0007000 intr 9 not configured |
108 |
* jazzisabr0 at mainbus0 |
109 |
* isa0 at jazzisabr0 isa_io_base 0xe2000000 isa_mem_base |
110 |
* 0xe3000000 |
111 |
*/ |
112 |
|
113 |
switch (machine->machine_subtype) { |
114 |
case MACHINE_ARC_JAZZ_PICA: |
115 |
strlcat(machine->machine_name, |
116 |
" (Microsoft Jazz, Acer PICA-61)", |
117 |
MACHINE_NAME_MAXBUF); |
118 |
break; |
119 |
case MACHINE_ARC_JAZZ_MAGNUM: |
120 |
strlcat(machine->machine_name, |
121 |
" (Microsoft Jazz, MIPS Magnum)", |
122 |
MACHINE_NAME_MAXBUF); |
123 |
break; |
124 |
default: |
125 |
fatal("error in machine.c. jazz\n"); |
126 |
exit(1); |
127 |
} |
128 |
|
129 |
jazz_data = device_add(machine, "jazz addr=0x80000000"); |
130 |
|
131 |
/* Keyboard IRQ is jazz.6, mouse is jazz.7 */ |
132 |
snprintf(tmpstr, sizeof(tmpstr), |
133 |
"%s.cpu[%i].jazz.6", machine->path, |
134 |
machine->bootstrap_cpu); |
135 |
snprintf(tmpstr2, sizeof(tmpstr2), |
136 |
"%s.cpu[%i].jazz.7", machine->path, |
137 |
machine->bootstrap_cpu); |
138 |
i = dev_pckbc_init(machine, mem, 0x80005000ULL, |
139 |
PCKBC_JAZZ, tmpstr, tmpstr2, |
140 |
machine->x11_md.in_use, 0); |
141 |
|
142 |
/* Serial controllers at JAZZ irq 8 and 9: */ |
143 |
snprintf(tmpstr, sizeof(tmpstr), |
144 |
"ns16550 irq=%s.cpu[%i].jazz.8 addr=0x80006000" |
145 |
" in_use=%i name2=tty0", machine->path, |
146 |
machine->bootstrap_cpu, machine->x11_md.in_use? 0 : 1); |
147 |
j = (size_t)device_add(machine, tmpstr); |
148 |
snprintf(tmpstr, sizeof(tmpstr), |
149 |
"ns16550 irq=%s.cpu[%i].jazz.9 addr=0x80007000" |
150 |
" in_use=0 name2=tty1", machine->path, |
151 |
machine->bootstrap_cpu); |
152 |
device_add(machine, tmpstr); |
153 |
|
154 |
if (machine->x11_md.in_use) |
155 |
machine->main_console_handle = i; |
156 |
else |
157 |
machine->main_console_handle = j; |
158 |
|
159 |
switch (machine->machine_subtype) { |
160 |
case MACHINE_ARC_JAZZ_PICA: |
161 |
if (machine->x11_md.in_use) { |
162 |
dev_vga_init(machine, mem, 0x400a0000ULL, |
163 |
0x600003c0ULL, machine->machine_name); |
164 |
arcbios_console_init(machine, |
165 |
0x400b8000ULL, 0x600003c0ULL); |
166 |
} |
167 |
break; |
168 |
case MACHINE_ARC_JAZZ_MAGNUM: |
169 |
/* PROM mirror? */ |
170 |
dev_ram_init(machine, 0xfff00000, 0x100000, |
171 |
DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES, |
172 |
0x1fc00000); |
173 |
|
174 |
/* VXL. TODO */ |
175 |
/* control at 0x60100000? */ |
176 |
dev_fb_init(machine, mem, 0x60200000ULL, |
177 |
VFB_GENERIC, 1024,768, 1024,768, 8, "VXL"); |
178 |
break; |
179 |
} |
180 |
|
181 |
/* SN at JAZZ irq 4 */ |
182 |
snprintf(tmpstr, sizeof(tmpstr), |
183 |
"sn addr=0x80001000 irq=%s.cpu[%i].jazz.4", |
184 |
machine->path, machine->bootstrap_cpu); |
185 |
device_add(machine, tmpstr); |
186 |
|
187 |
/* ASC at JAZZ irq 5 */ |
188 |
snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].jazz.5", |
189 |
machine->path, machine->bootstrap_cpu); |
190 |
dev_asc_init(machine, mem, 0x80002000ULL, tmpstr, NULL, |
191 |
DEV_ASC_PICA, dev_jazz_dma_controller, jazz_data); |
192 |
|
193 |
/* FDC at JAZZ irq 1 */ |
194 |
snprintf(tmpstr, sizeof(tmpstr), |
195 |
"fdc addr=0x80003000 irq=%s.cpu[%i].jazz.1", |
196 |
machine->path, machine->bootstrap_cpu); |
197 |
device_add(machine, tmpstr); |
198 |
|
199 |
/* MC146818 at MIPS irq 2: */ |
200 |
snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].2", |
201 |
machine->path, machine->bootstrap_cpu); |
202 |
dev_mc146818_init(machine, mem, |
203 |
0x80004000ULL, tmpstr, MC146818_ARC_JAZZ, 1); |
204 |
|
205 |
#if 0 |
206 |
Not yet. |
207 |
/* WDC at ISA irq 14 */ |
208 |
device_add(machine, "wdc addr=0x900001f0, irq=38"); |
209 |
#endif |
210 |
|
211 |
break; |
212 |
|
213 |
default:fatal("Unimplemented ARC machine type %i\n", |
214 |
machine->machine_subtype); |
215 |
exit(1); |
216 |
} |
217 |
|
218 |
/* |
219 |
* NOTE: ARCBIOS shouldn't be used before this point. (The only |
220 |
* exception is that arcbios_console_init() may be called.) |
221 |
*/ |
222 |
|
223 |
if (!machine->prom_emulation) |
224 |
return; |
225 |
|
226 |
arcbios_init(machine, 0, 0, eaddr_string, macaddr); |
227 |
} |
228 |
|
229 |
|
230 |
MACHINE_DEFAULT_CPU(arc) |
231 |
{ |
232 |
switch (machine->machine_subtype) { |
233 |
|
234 |
case MACHINE_ARC_JAZZ_PICA: |
235 |
CHECK_ALLOCATION(machine->cpu_name = strdup("R4000")); |
236 |
break; |
237 |
|
238 |
default: |
239 |
CHECK_ALLOCATION(machine->cpu_name = strdup("R4400")); |
240 |
} |
241 |
} |
242 |
|
243 |
|
244 |
MACHINE_DEFAULT_RAM(arc) |
245 |
{ |
246 |
machine->physical_ram_in_mb = 64; |
247 |
} |
248 |
|
249 |
|
250 |
MACHINE_REGISTER(arc) |
251 |
{ |
252 |
MR_DEFAULT(arc, "ARC", ARCH_MIPS, MACHINE_ARC); |
253 |
|
254 |
me->set_default_ram = machine_default_ram_arc; |
255 |
|
256 |
machine_entry_add_alias(me, "arc"); |
257 |
|
258 |
machine_entry_add_subtype(me, "Acer PICA-61", MACHINE_ARC_JAZZ_PICA, |
259 |
"pica-61", "acer pica", "pica", NULL); |
260 |
|
261 |
machine_entry_add_subtype(me, "Jazz Magnum", MACHINE_ARC_JAZZ_MAGNUM, |
262 |
"magnum", "jazz magnum", NULL); |
263 |
} |
264 |
|