/[gxemul]/trunk/src/machines/machine_sgi.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/src/machines/machine_sgi.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 44 - (hide annotations)
Mon Oct 8 16:22:56 2007 UTC (16 years, 6 months ago) by dpavlin
File MIME type: text/plain
File size: 21492 byte(s)
++ trunk/HISTORY	(local)
$Id: HISTORY,v 1.1632 2007/09/11 21:46:35 debug Exp $
20070616	Implementing the MIPS32/64 revision 2 "ror" instruction.
20070617	Adding a struct for each physpage which keeps track of which
		ranges within that page (base offset, length) that are
		continuously translatable. When running with native code
		generation enabled (-b), a range is added after each read-
		ahead loop.
		Experimenting with using the physical program counter sample
		data (implemented 20070608) together with the "translatable
		range" information, to figure out which physical address ranges
		would be worth translating to native code (if the number of
		samples falling within a range is above a certain threshold).
20070618	Adding automagic building of .index comment files for
		src/file/, src/promemul/, src src/useremul/ as well.
		Adding a "has been translated" bit to the ranges, so that only
		not-yet-translated ranges will be sampled.
20070619	Moving src/cpu.c and src/memory_rw.c into src/cpus/,
		src/device.c into src/devices/, and src/machine.c into
		src/machines/.
		Creating a skeleton cc/ld native backend module; beginning on
		the function which will detect cc command line, etc.
20070620	Continuing on the native code generation infrastructure.
20070621	Moving src/x11.c and src/console.c into a new src/console/
		subdir (for everything that is console or framebuffer related).
		Moving src/symbol*.c into a new src/symbol/, which should
		contain anything that is symbol handling related.
20070624	Making the program counter sampling threshold a "settings
		variable" (sampling_threshold), i.e. it can now be changed
		during runtime.
		Switching the RELEASE notes format from plain text to HTML.
		If the TMPDIR environment variable is set, it is used instead
		of "/tmp" for temporary files.
		Continuing on the cc/ld backend: simple .c code is generated,
		the compiler and linker are called, etc.
		Adding detection of host architecture to the configure script
		(again), and adding icache invalidation support (only
		implemented for Alpha hosts so far).
20070625	Simplifying the program counter sampling mechanism.
20070626	Removing the cc/ld native code generation stuff, program
		counter sampling, etc; it would not have worked well in the
		general case.
20070627	Removing everything related to native code generation.
20070629	Removing the (practically unusable) support for multiple
		emulations. (The single emulation allowed now still supports
		multiple simultaneous machines, as before.)
		Beginning on PCCTWO and M88K interrupts.
20070723	Adding a dummy skeleton for emulation of M32R processors.
20070901	Fixing a warning found by "gcc version 4.3.0 20070817
		(experimental)" on amd64.
20070905	Removing some more traces of the old "multiple emulations"
		code.
		Also looking in /usr/local/include and /usr/local/lib for
		X11 libs, when running configure.
20070909	Minor updates to the guest OS install instructions, in
		preparation for the NetBSD 4.0 release.
20070918	More testing of NetBSD 4.0 RC1.

1 dpavlin 22 /*
2 dpavlin 34 * Copyright (C) 2003-2007 Anders Gavare. All rights reserved.
3 dpavlin 22 *
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 dpavlin 44 * $Id: machine_sgi.c,v 1.23 2007/06/16 14:39:18 debug Exp $
29 dpavlin 22 *
30 dpavlin 42 * COMMENT: Silicon Graphics' MIPS-based machines
31 dpavlin 24 *
32 dpavlin 22 * http://obsolete.majix.org/computers/sgi/iptable.shtml contains a
33     * pretty detailed list of IP ("Inhouse Processor") model numbers.
34     *
35     * See also: http://hardware.majix.org/computers/sgi/iptable.shtml
36     */
37    
38     #include <stdio.h>
39     #include <stdlib.h>
40     #include <string.h>
41    
42     #include "arcbios.h"
43     #include "bus_pci.h"
44     #include "cpu.h"
45     #include "device.h"
46     #include "devices.h"
47     #include "diskimage.h"
48     #include "machine.h"
49     #include "memory.h"
50     #include "misc.h"
51     #include "net.h"
52    
53     #include "sgi_arcbios.h"
54     #include "crimereg.h"
55    
56    
57 dpavlin 28 #define ETHERNET_STRING_MAXLEN 40
58     #define MACHINE_NAME_MAXBUF 100
59 dpavlin 22
60    
61     MACHINE_SETUP(sgi)
62     {
63     uint64_t sgi_ram_offset = 0;
64     int arc_wordlen = sizeof(uint32_t);
65     struct memory *mem = machine->memory;
66     char tmpstr[1000];
67     int i, j;
68     char *eaddr_string = "eaddr=10:20:30:40:50:60"; /* bogus */
69     unsigned char macaddr[6];
70    
71     struct pci_data *pci_data = NULL;
72    
73 dpavlin 42 CHECK_ALLOCATION(machine->machine_name = malloc(MACHINE_NAME_MAXBUF));
74 dpavlin 22
75     cpu->byte_order = EMUL_BIG_ENDIAN;
76     snprintf(machine->machine_name, MACHINE_NAME_MAXBUF,
77     "SGI-IP%i", machine->machine_subtype);
78    
79     sgi_ram_offset = 1048576 * machine->memory_offset_in_mb;
80    
81     /* Special cases for IP20,22,24,26 memory offset: */
82     if (machine->machine_subtype == 20 || machine->machine_subtype == 22 ||
83     machine->machine_subtype == 24 || machine->machine_subtype == 26) {
84     dev_ram_init(machine, 0x00000000, 0x10000, DEV_RAM_MIRROR
85     | DEV_RAM_MIGHT_POINT_TO_DEVICES, sgi_ram_offset);
86     dev_ram_init(machine, 0x00050000, sgi_ram_offset-0x50000,
87     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES,
88     sgi_ram_offset + 0x50000);
89     }
90    
91     /* Special cases for IP28,30 memory offset: */
92     if (machine->machine_subtype == 28 || machine->machine_subtype == 30) {
93     /* TODO: length below should maybe not be 128MB? */
94     dev_ram_init(machine, 0x00000000, 128*1048576, DEV_RAM_MIRROR
95     | DEV_RAM_MIGHT_POINT_TO_DEVICES, sgi_ram_offset);
96     }
97    
98     net_generate_unique_mac(machine, macaddr);
99 dpavlin 42 CHECK_ALLOCATION(eaddr_string = malloc(ETHERNET_STRING_MAXLEN));
100 dpavlin 22
101     switch (machine->machine_subtype) {
102    
103     case 10:
104     strlcat(machine->machine_name, " (4D/25)", MACHINE_NAME_MAXBUF);
105     /* TODO */
106     break;
107    
108     case 12:
109     strlcat(machine->machine_name,
110     " (Iris Indigo IP12)", MACHINE_NAME_MAXBUF);
111    
112     /* TODO */
113     /* 33 MHz R3000, according to http://www.irisindigo.com/ */
114     /* "capable of addressing up to 96MB of memory." */
115    
116     break;
117    
118     case 19:
119     strlcat(machine->machine_name,
120     " (Everest IP19)", MACHINE_NAME_MAXBUF);
121     machine->main_console_handle = (size_t)device_add(machine,
122     "z8530 addr=0x1fbd9830 irq=0 addr_mult=4");
123 dpavlin 44 dev_scc_init(machine, mem, 0x10086000, 0,
124     machine->x11_md.in_use, 0, 8); /* serial? irix? */
125 dpavlin 22
126     device_add(machine, "sgi_ip19 addr=0x18000000");
127    
128     /* Irix' <everest_du_init+0x130> reads this device: */
129     device_add(machine, "random addr=0x10006000 len=16");
130    
131     /* Irix' get_mpconf() looks for this: (TODO) */
132     store_32bit_word(cpu, 0xa0000000 + 0x3000,
133     0xbaddeed2);
134    
135     /* Memory size, not 4096 byte pages, but 256 bytes?
136     (16 is size of kernel... approx) */
137     store_32bit_word(cpu, 0xa0000000 + 0x26d0, 30000);
138     /* (machine->physical_ram_in_mb - 16) * (1048576 / 256)); */
139    
140     break;
141    
142     case 20:
143     strlcat(machine->machine_name,
144     " (Indigo)", MACHINE_NAME_MAXBUF);
145    
146     /*
147     * Guesses based on NetBSD 2.0 beta, 20040606.
148     *
149     * int0 at mainbus0 addr 0x1fb801c0: bus 1MHz, CPU 2MHz
150     * imc0 at mainbus0 addr 0x1fa00000: revision 0
151     * gio0 at imc0
152 dpavlin 24 * unknown GIO card (product 0x00 revision 0x00)
153     * at gio0 slot 0 addr 0x1f400000 not configured
154     * unknown GIO card (product 0x00 revision 0x00)
155     * at gio0 slot 1 addr 0x1f600000 not configured
156     * unknown GIO card (product 0x00 revision 0x00)
157     * at gio0 slot 2 addr 0x1f000000 not configured
158 dpavlin 22 * hpc0 at gio0 addr 0x1fb80000: SGI HPC1
159 dpavlin 24 * zsc0 at hpc0 offset 0xd10 (channels 0 and 1,
160     * channel 1 for console)
161 dpavlin 22 * zsc1 at hpc0 offset 0xd00 (2 channels)
162     * sq0 at hpc0 offset 0x100: SGI Seeq 80c03
163     * wdsc0 at hpc0 offset 0x11f
164     * dpclock0 at hpc0 offset 0xe00
165     */
166    
167     /* int0 at mainbus0 addr 0x1fb801c0 */
168 dpavlin 34 fatal("TODO: SGI legacy interrupt system rewrite!\n");
169     abort();
170     // machine->md_int.sgi_ip20_data = dev_sgi_ip20_init(cpu, mem,
171     // DEV_SGI_IP20_BASE);
172 dpavlin 22
173 dpavlin 24 /* imc0 at mainbus0 addr 0x1fa00000: revision 0:
174     TODO (or in dev_sgi_ip20?) */
175 dpavlin 22
176     machine->main_console_handle = (size_t)device_add(machine,
177     "z8530 addr=0x1fbd9830 irq=0 addr_mult=4");
178    
179     /* This is the zsc0 reported by NetBSD: TODO: irqs */
180     machine->main_console_handle = (size_t)device_add(machine,
181     "z8530 addr=0x1fb80d10 irq=0 addr_mult=4");
182     machine->main_console_handle = (size_t)device_add(machine,
183     "z8530 addr=0x1fb80d00 irq=0 addr_mult=4");
184    
185     /* WDSC SCSI controller: */
186 dpavlin 42 /* dev_wdsc_init(machine, mem, 0x1fb8011f, 0, 0); */
187 dpavlin 22
188     /* Return memory read errors so that hpc1
189     and hpc2 are not detected: */
190     device_add(machine, "unreadable addr=0x1fb00000 len=0x10000");
191     device_add(machine, "unreadable addr=0x1f980000 len=0x10000");
192    
193     /* Return nothing for gio slots 0, 1, and 2: */
194 dpavlin 24 device_add(machine, "unreadable addr=0x1f400000 len=0x1000");
195     device_add(machine, "unreadable addr=0x1f600000 len=0x1000");
196     device_add(machine, "unreadable addr=0x1f000000 len=0x1000");
197 dpavlin 22
198     break;
199    
200     case 21:
201     strlcat(machine->machine_name, /* TODO */
202     " (uknown SGI-IP21 ?)", MACHINE_NAME_MAXBUF);
203     /* NOTE: Special case for arc_wordlen: */
204     arc_wordlen = sizeof(uint64_t);
205    
206     device_add(machine, "random addr=0x418000200, len=0x20000");
207    
208     break;
209    
210     case 22:
211     case 24:
212     if (machine->machine_subtype == 22) {
213     strlcat(machine->machine_name,
214     " (Indy, Indigo2, Challenge S; Full-house)",
215     MACHINE_NAME_MAXBUF);
216 dpavlin 34 fatal("TODO: SGI legacy interrupt system rewrite!\n");
217     abort();
218     // machine->md_int.sgi_ip22_data =
219     // dev_sgi_ip22_init(machine, mem, 0x1fbd9000, 0);
220 dpavlin 22 } else {
221     strlcat(machine->machine_name,
222     " (Indy, Indigo2, Challenge S; Guiness)",
223     MACHINE_NAME_MAXBUF);
224 dpavlin 34 fatal("TODO: SGI legacy interrupt system rewrite!\n");
225     abort();
226     // machine->md_int.sgi_ip22_data =
227     // dev_sgi_ip22_init(machine, mem, 0x1fbd9880, 1);
228 dpavlin 22 }
229    
230     /*
231     Why is this here? TODO
232     dev_ram_init(machine, 0x88000000ULL,
233     128 * 1048576, DEV_RAM_MIRROR, 0x08000000);
234     */
235    
236 dpavlin 34 fatal("TODO: Legacy rewrite\n");
237     abort();
238     // machine->md_interrupt = sgi_ip22_interrupt;
239    
240 dpavlin 22 /*
241     * According to NetBSD 1.6.2:
242     *
243     * imc0 at mainbus0 addr 0x1fa00000, Revision 0
244     * gio0 at imc0
245     * hpc0 at gio0 addr 0x1fb80000: SGI HPC3
246     * zsc0 at hpc0 offset 0x59830
247     * zstty0 at zsc0 channel 1 (console i/o)
248     * zstty1 at zsc0 channel 0
249     * sq0 at hpc0 offset 0x54000: SGI Seeq 80c03 (Ethernet)
250     * wdsc0 at hpc0 offset 0x44000: WD33C93 SCSI, rev=0, target 7
251     * scsibus2 at wdsc0: 8 targets, 8 luns per target
252     * dsclock0 at hpc0 offset 0x60000
253     *
254     * According to Linux/IP22:
255     * tty00 at 0xbfbd9830 (irq = 45) is a Zilog8530
256     * tty01 at 0xbfbd9838 (irq = 45) is a Zilog8530
257     *
258     * and according to NetBSD 2.0_BETA (20040606):
259     *
260     * haltwo0 at hpc0 offset 0x58000: HAL2 revision 0.0.0
261     * audio0 at haltwo0: half duplex
262     *
263 dpavlin 24 * IRQ numbers are of the form 8 + x, where x=0..31 for local0
264 dpavlin 22 * interrupts, and 32..63 for local1. + y*65 for "mappable".
265     */
266    
267     /* zsc0 serial console. 8 + 32 + 3 + 64*5 = 43+64*5 = 363 */
268     i = (size_t)device_add(machine,
269     "z8530 addr=0x1fbd9830 irq=363 addr_mult=4");
270    
271     /* Not supported by NetBSD 1.6.2, but by 2.0_BETA: */
272 dpavlin 34 fatal("TODO: legacy rewrite\n");
273     abort();
274     // j = dev_pckbc_init(machine, mem, 0x1fbd9840, PCKBC_8242,
275 dpavlin 42 // 0, 0, machine->x11_md.in_use, 0); /* TODO: irq numbers */
276 dpavlin 38 j = 0;
277 dpavlin 22
278 dpavlin 42 if (machine->x11_md.in_use)
279 dpavlin 22 machine->main_console_handle = j;
280    
281     /* sq0: Ethernet. TODO: This should have irq_nr = 8 + 3 */
282     /* dev_sq_init... */
283    
284     /* wdsc0: SCSI */
285 dpavlin 42 /* dev_wdsc_init(machine, mem, 0x1fbc4000, 0, 8 + 1); */
286 dpavlin 22
287     /* wdsc1: SCSI TODO: irq nr */
288 dpavlin 42 /* dev_wdsc_init(machine, mem, 0x1fbcc000, 1, 8 + 1); */
289 dpavlin 22
290     /* dsclock0: TODO: possibly irq 8 + 33 */
291    
292 dpavlin 24 /* Return memory read errors so that hpc1 and hpc2 are
293     not detected: */
294 dpavlin 22 device_add(machine, "unreadable addr=0x1fb00000, len=0x10000");
295     device_add(machine, "unreadable addr=0x1f980000, len=0x10000");
296    
297     /* Similarly for gio slots 0, 1, and 2: */
298 dpavlin 24 device_add(machine, "unreadable addr=0x1f400000, len=0x1000");
299     device_add(machine, "unreadable addr=0x1f600000, len=0x1000");
300     device_add(machine, "unreadable addr=0x1f000000, len=0x1000");
301 dpavlin 22
302     break;
303    
304     case 25:
305     /* NOTE: Special case for arc_wordlen: */
306     arc_wordlen = sizeof(uint64_t);
307     strlcat(machine->machine_name,
308     " (Everest IP25)", MACHINE_NAME_MAXBUF);
309    
310     /* serial? irix? */
311     dev_scc_init(machine, mem,
312 dpavlin 42 0x400086000ULL, 0, machine->x11_md.in_use, 0, 8);
313 dpavlin 22
314     /* NOTE: ip19! (perhaps not really the same */
315     device_add(machine, "sgi_ip19 addr=0x18000000");
316    
317     /*
318     * Memory size, not 4096 byte pages, but 256
319     * bytes? (16 is size of kernel... approx)
320     */
321     store_32bit_word(cpu, 0xa0000000ULL + 0x26d0,
322     30000); /* (machine->physical_ram_in_mb - 16)
323     * (1048576 / 256)); */
324    
325     break;
326    
327     case 26:
328     /* NOTE: Special case for arc_wordlen: */
329     arc_wordlen = sizeof(uint64_t);
330     strlcat(machine->machine_name, " (uknown SGI-IP26 ?)",
331     MACHINE_NAME_MAXBUF); /* TODO */
332     machine->main_console_handle = (size_t)device_add(machine,
333     "z8530 addr=0x1fbd9830 irq=0 addr_mult=4");
334     break;
335    
336     case 27:
337     strlcat(machine->machine_name, " (Origin 200/2000, Onyx2)",
338     MACHINE_NAME_MAXBUF);
339     arc_wordlen = sizeof(uint64_t);
340     /* 2 cpus per node */
341    
342     machine->main_console_handle = (size_t)device_add(machine,
343     "z8530 addr=0x1fbd9830 irq=0 addr_mult=4");
344     break;
345    
346     case 28:
347     /* NOTE: Special case for arc_wordlen: */
348     arc_wordlen = sizeof(uint64_t);
349     strlcat(machine->machine_name,
350     " (Impact Indigo2 ?)", MACHINE_NAME_MAXBUF);
351    
352     device_add(machine, "random addr=0x1fbe0000, len=1");
353    
354     /* Something at paddr 0x1880fb0000. */
355    
356     break;
357    
358     case 30:
359     /* NOTE: Special case for arc_wordlen: */
360     arc_wordlen = sizeof(uint64_t);
361     strlcat(machine->machine_name, " (Octane)",
362     MACHINE_NAME_MAXBUF);
363    
364 dpavlin 34 fatal("TODO: SGI legacy interrupt system rewrite!\n");
365     abort();
366     // machine->md_int.sgi_ip30_data =
367     // dev_sgi_ip30_init(machine, mem, 0x0ff00000);
368 dpavlin 22
369 dpavlin 34 fatal("TODO: Legacy rewrite\n");
370     abort();
371     // machine->md_interrupt = sgi_ip30_interrupt;
372    
373 dpavlin 22 dev_ram_init(machine, 0xa0000000ULL, 128 * 1048576,
374     DEV_RAM_MIRROR | DEV_RAM_MIGHT_POINT_TO_DEVICES,
375     0x00000000);
376    
377     dev_ram_init(machine, 0x80000000ULL,
378     32 * 1048576, DEV_RAM_RAM, 0x00000000);
379    
380     /*
381     * Something at paddr=1f022004: TODO
382     * Something at paddr=813f0510 - paddr=813f0570 ?
383     * Something at paddr=813f04b8
384     * Something at paddr=f8000003c used by Linux/Octane
385     *
386     * 16550 serial port at paddr=1f620178, addr mul 1
387 dpavlin 24 * (Error messages are printed to this serial port by
388     * the PROM.)
389 dpavlin 22 *
390 dpavlin 24 * There seems to also be a serial port at 1f620170. The
391     * "symmon" program dumps something there, but it doesn't
392     * look like readable text. (TODO)
393 dpavlin 22 */
394    
395     /* TODO: irq! */
396 dpavlin 24 snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr="
397 dpavlin 44 "0x1f620170 name2=tty0 in_use=%i",
398     machine->x11_md.in_use? 0 : 1);
399 dpavlin 24 machine->main_console_handle = (size_t)device_add(machine,
400     tmpstr);
401     snprintf(tmpstr, sizeof(tmpstr), "ns16550 irq=0 addr="
402     "0x1f620178 name2=tty1 in_use=0");
403 dpavlin 22 device_add(machine, tmpstr);
404    
405     /* MardiGras graphics: */
406     device_add(machine, "sgi_mardigras addr=0x1c000000");
407    
408     break;
409    
410     case 32:
411     strlcat(machine->machine_name, " (O2)", MACHINE_NAME_MAXBUF);
412    
413 dpavlin 24 /* TODO: Find out where the phys ram is actually located. */
414     dev_ram_init(machine, 0x07ffff00ULL, 256,
415     DEV_RAM_MIRROR, 0x03ffff00);
416     dev_ram_init(machine, 0x10000000ULL, 256,
417     DEV_RAM_MIRROR, 0x00000000);
418     dev_ram_init(machine, 0x11ffff00ULL, 256,
419     DEV_RAM_MIRROR, 0x01ffff00);
420     dev_ram_init(machine, 0x12000000ULL, 256,
421     DEV_RAM_MIRROR, 0x02000000);
422     dev_ram_init(machine, 0x17ffff00ULL, 256,
423     DEV_RAM_MIRROR, 0x03ffff00);
424     dev_ram_init(machine, 0x20000000ULL, 128 * 1048576,
425     DEV_RAM_MIRROR, 0x00000000);
426     dev_ram_init(machine, 0x40000000ULL, 128 * 1048576,
427     DEV_RAM_MIRROR, 0x10000000);
428 dpavlin 22
429 dpavlin 34 /* Connect CRIME (Interrupt Controller) to MIPS irq 2: */
430     snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].2",
431     machine->path, machine->bootstrap_cpu);
432     dev_crime_init(machine, mem, 0x14000000, tmpstr,
433 dpavlin 44 machine->x11_md.in_use); /* crime0 */
434 dpavlin 24 dev_sgi_mte_init(mem, 0x15000000); /* mte ??? */
435     dev_sgi_gbe_init(machine, mem, 0x16000000); /* gbe? */
436 dpavlin 22
437     /*
438     * A combination of NetBSD and Linux info:
439     *
440     * 17000000 vice (Video Image Compression Engine)
441     * 1f000000 mace
442     * 1f080000 macepci
443     * 1f100000 vin1
444     * 1f180000 vin2
445     * 1f200000 vout
446     * 1f280000 enet (mec0, MAC-110 Ethernet)
447     * 1f300000 perif:
448     * 1f300000 audio
449     * 1f310000 isa
450 dpavlin 24 * 1f318000 (accessed by Irix'
451     * pciio_pio_write64)
452 dpavlin 22 * 1f320000 kbdms
453     * 1f330000 i2c
454     * 1f340000 ust
455     * 1f380000 isa ext
456     * 1f390000 com0 (serial)
457     * 1f398000 com1 (serial)
458     * 1f3a0000 mcclock0
459     */
460    
461 dpavlin 24 /*
462     * IRQ mapping is really ugly. TODO: fix
463     *
464     * com0 at mace0 offset 0x390000 intr 4 intrmask
465     * 0x3f00000: ns16550a, working fifo
466     * com1 at mace0 offset 0x398000 intr 4 intrmask
467     * 0xfc000000: ns16550a, working fifo
468     * pckbc0 at mace0 offset 0x320000 intr 5 intrmask 0x0
469     * mcclock0 at mace0 offset 0x3a0000 intrmask 0x0
470     * macepci0 at mace0 offset 0x80000 intr 7 intrmask 0x0: rev 1
471     *
472     * intr 4 = MACE_PERIPH_SERIAL
473     * intr 5 = MACE_PERIPH_MISC
474     * intr 7 = MACE_PCI_BRIDGE
475     */
476 dpavlin 22
477 dpavlin 24 snprintf(eaddr_string, ETHERNET_STRING_MAXLEN,
478     "eaddr=%02x:%02x:%02x:%02x:%02x:%02x",
479     macaddr[0], macaddr[1], macaddr[2],
480     macaddr[3], macaddr[4], macaddr[5]);
481 dpavlin 34
482     snprintf(tmpstr, sizeof(tmpstr), "%s.cpu[%i].2.crime.0x%x",
483     machine->path, machine->bootstrap_cpu, MACE_ETHERNET);
484 dpavlin 24 dev_sgi_mec_init(machine, mem, 0x1f280000,
485 dpavlin 34 tmpstr, macaddr);
486 dpavlin 22
487 dpavlin 24 dev_sgi_ust_init(mem, 0x1f340000); /* ust? */
488 dpavlin 22
489 dpavlin 34 snprintf(tmpstr, sizeof(tmpstr),
490     "ns16550 irq=%s.cpu[%i].2.crime.0x%x.mace.%i addr="
491 dpavlin 24 "0x1f390000 addr_mult=0x100 in_use=%i name2=tty0",
492 dpavlin 34 machine->path, machine->bootstrap_cpu,
493 dpavlin 42 MACE_PERIPH_SERIAL, 20, machine->x11_md.in_use? 0 : 1);
494 dpavlin 24 j = (size_t)device_add(machine, tmpstr);
495 dpavlin 34 snprintf(tmpstr, sizeof(tmpstr),
496     "ns16550 irq=%s.cpu[%i].2.crime.0x%x.mace.%i addr="
497 dpavlin 24 "0x1f398000 addr_mult=0x100 in_use=%i name2=tty1",
498 dpavlin 34 machine->path, machine->bootstrap_cpu,
499     MACE_PERIPH_SERIAL, 26, 0);
500 dpavlin 24 device_add(machine, tmpstr);
501 dpavlin 22
502 dpavlin 24 machine->main_console_handle = j;
503 dpavlin 22
504 dpavlin 24 /* TODO: Once this works, it should be enabled
505     always, not just when using X! */
506 dpavlin 34 #if 0
507     fatal("TODO: legacy SGI rewrite\n");
508     abort();
509 dpavlin 42 if (machine->x11_md.in_use) {
510 dpavlin 24 i = dev_pckbc_init(machine, mem, 0x1f320000,
511     PCKBC_8242, 0x200 + MACE_PERIPH_MISC,
512 dpavlin 44 0x800 + MACE_PERIPH_MISC, machine->x11_md.in_use,
513     0);
514 dpavlin 24 /* keyb+mouse (mace irq numbers) */
515     machine->main_console_handle = i;
516     }
517 dpavlin 34 #endif
518 dpavlin 22
519 dpavlin 34 snprintf(tmpstr, sizeof(tmpstr),
520     "%s.cpu[%i].2.crime.0x%x.mace.%i",
521     machine->path, machine->bootstrap_cpu,
522     MACE_PERIPH_MISC, 8);
523     dev_mc146818_init(machine, mem, 0x1f3a0000, tmpstr,
524     MC146818_SGI, 0x40); /* mcclock0 */
525 dpavlin 22
526 dpavlin 34 /* TODO: _WHERE_ does the z8530 interrupt? */
527     snprintf(tmpstr, sizeof(tmpstr), "z8530 addr=0x1fbd9830 "
528     "irq=%s.cpu[%i].2 addr_mult=4",
529     machine->path, machine->bootstrap_cpu);
530     machine->main_console_handle = (size_t)
531     device_add(machine, tmpstr);
532    
533 dpavlin 24 /*
534     * PCI devices: (according to NetBSD's GENERIC
535     * config file for sgimips)
536     *
537     * ne* at pci? dev ? function ?
538     * ahc0 at pci0 dev 1 function ?
539     * ahc1 at pci0 dev 2 function ?
540     */
541 dpavlin 22
542 dpavlin 34 snprintf(tmpstr, sizeof(tmpstr),
543     "%s.cpu[%i].2.crime.0x%x", machine->path,
544     machine->bootstrap_cpu, MACE_PCI_BRIDGE);
545 dpavlin 24 pci_data = dev_macepci_init(machine, mem, 0x1f080000,
546 dpavlin 34 tmpstr); /* macepci0 */
547 dpavlin 24 /* bus_pci_add(machine, pci_data, mem, 0, 0, 0,
548     "ne2000"); TODO */
549 dpavlin 22
550     /* TODO: make this nicer */
551     if (diskimage_exist(machine, 0, DISKIMAGE_SCSI) ||
552     diskimage_exist(machine, 1, DISKIMAGE_SCSI) ||
553     diskimage_exist(machine, 2, DISKIMAGE_SCSI) ||
554     diskimage_exist(machine, 3, DISKIMAGE_SCSI) ||
555     diskimage_exist(machine, 4, DISKIMAGE_SCSI) ||
556     diskimage_exist(machine, 5, DISKIMAGE_SCSI) ||
557     diskimage_exist(machine, 6, DISKIMAGE_SCSI) ||
558     diskimage_exist(machine, 7, DISKIMAGE_SCSI))
559     bus_pci_add(machine, pci_data, mem, 0, 1, 0, "ahc");
560    
561     /* TODO: second ahc */
562     /* bus_pci_add(machine, pci_data, mem, 0, 2, 0, "ahc"); */
563    
564 dpavlin 32 /*
565     * An additional PCI IDE controller, for NetBSD/sgimips
566     * experiments: (Not found in a regular O2.)
567     */
568     bus_pci_add(machine, pci_data, mem, 0, 3, 0, "symphony_82c105");
569    
570 dpavlin 22 break;
571    
572     case 35:
573     strlcat(machine->machine_name,
574     " (Origin 3000)", MACHINE_NAME_MAXBUF);
575     /* 4 cpus per node */
576    
577     machine->main_console_handle = (size_t)device_add(machine,
578     "z8530 addr=0x1fbd9830 irq=0 addr_mult=4");
579     break;
580    
581     case 53:
582     strlcat(machine->machine_name, " (Origin 350)",
583     MACHINE_NAME_MAXBUF);
584    
585     /*
586     * According to http://kumba.drachentekh.net/xml/myguide.html
587     * Origin 350, Tezro IP53 R16000
588     */
589     break;
590    
591     default:
592     fatal("unimplemented SGI machine type IP%i\n",
593     machine->machine_subtype);
594     exit(1);
595     }
596    
597     if (!machine->prom_emulation)
598     return;
599    
600     arcbios_init(machine, arc_wordlen == sizeof(uint64_t), sgi_ram_offset,
601     eaddr_string, macaddr);
602     }
603    
604    
605     MACHINE_DEFAULT_CPU(sgi)
606     {
607     if (machine->machine_subtype <= 12)
608     machine->cpu_name = strdup("R3000");
609     if (machine->cpu_name == NULL && machine->machine_subtype == 35)
610     machine->cpu_name = strdup("R12000");
611     if (machine->cpu_name == NULL && (machine->machine_subtype == 25 ||
612     machine->machine_subtype == 27 || machine->machine_subtype == 28 ||
613     machine->machine_subtype == 30 || machine->machine_subtype == 32))
614     machine->cpu_name = strdup("R10000");
615     if (machine->cpu_name == NULL && (machine->machine_subtype == 21 ||
616     machine->machine_subtype == 26))
617     machine->cpu_name = strdup("R8000");
618     if (machine->cpu_name == NULL && machine->machine_subtype == 24)
619     machine->cpu_name = strdup("R5000");
620    
621     /* Other SGIs should probably work with
622     R4000, R4400 or R5000 or similar: */
623     if (machine->cpu_name == NULL)
624     machine->cpu_name = strdup("R4400");
625     }
626    
627    
628     MACHINE_DEFAULT_RAM(sgi)
629     {
630     machine->physical_ram_in_mb = 64;
631     }
632    
633    
634     MACHINE_REGISTER(sgi)
635     {
636 dpavlin 26 MR_DEFAULT(sgi, "SGI", ARCH_MIPS, MACHINE_SGI);
637    
638 dpavlin 22 me->set_default_ram = machine_default_ram_sgi;
639    
640 dpavlin 26 machine_entry_add_alias(me, "silicon graphics");
641     machine_entry_add_alias(me, "sgi");
642 dpavlin 22
643 dpavlin 26 machine_entry_add_subtype(me, "IP12", 12, "ip12", NULL);
644 dpavlin 22
645 dpavlin 26 machine_entry_add_subtype(me, "IP19", 19, "ip19", NULL);
646 dpavlin 22
647 dpavlin 26 machine_entry_add_subtype(me, "IP20", 20, "ip20", NULL);
648 dpavlin 22
649 dpavlin 26 machine_entry_add_subtype(me, "IP22", 22, "ip22", "indy", NULL);
650 dpavlin 22
651 dpavlin 26 machine_entry_add_subtype(me, "IP24", 24, "ip24", NULL);
652 dpavlin 22
653 dpavlin 26 machine_entry_add_subtype(me, "IP27", 27,
654     "ip27", "origin 200", "origin 2000", NULL);
655 dpavlin 22
656 dpavlin 26 machine_entry_add_subtype(me, "IP28", 28, "ip28", NULL);
657 dpavlin 22
658 dpavlin 26 machine_entry_add_subtype(me, "IP30", 30, "ip30", "octane", NULL);
659 dpavlin 22
660 dpavlin 26 machine_entry_add_subtype(me, "IP32", 32, "ip32", "o2", NULL);
661 dpavlin 22
662 dpavlin 26 machine_entry_add_subtype(me, "IP35", 35, "ip35", NULL);
663 dpavlin 22 }
664    

  ViewVC Help
Powered by ViewVC 1.1.26