1 |
/* |
2 |
* Copyright (C) 2005-2006 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_macppc.c,v 1.5 2006/06/24 10:19:19 debug Exp $ |
29 |
* |
30 |
* NOTE: Currently, these are skeletons for generic PowerMac G3, G4, and G5 |
31 |
* systems. They do not model real PowerMacs, but should be enough to |
32 |
* begin experimenting with NetBSD/macppc and OpenBSD/macppc. |
33 |
*/ |
34 |
|
35 |
#include <stdio.h> |
36 |
#include <string.h> |
37 |
|
38 |
#include "cpu.h" |
39 |
#include "device.h" |
40 |
#include "devices.h" |
41 |
#include "machine.h" |
42 |
#include "machine_interrupts.h" |
43 |
#include "memory.h" |
44 |
#include "misc.h" |
45 |
#include "of.h" |
46 |
|
47 |
|
48 |
MACHINE_SETUP(macppc) |
49 |
{ |
50 |
struct pci_data *pci_data; |
51 |
struct vfb_data *fb; |
52 |
uint64_t b, a; |
53 |
int i; |
54 |
|
55 |
/* |
56 |
* NetBSD/macppc (http://www.netbsd.org/Ports/macppc/) |
57 |
* OpenBSD/macppc (http://www.openbsd.org/macppc.html) |
58 |
*/ |
59 |
machine->machine_name = "Macintosh (PPC)"; |
60 |
if (machine->emulated_hz == 0) |
61 |
machine->emulated_hz = 40000000; |
62 |
|
63 |
machine->md_int.gc_data = dev_gc_init(machine, machine->memory, |
64 |
0xf3000000, 64); |
65 |
machine->md_interrupt = gc_interrupt; |
66 |
|
67 |
pci_data = dev_uninorth_init(machine, machine->memory, 0xe2000000, |
68 |
64 /* isa irq base */, 0 /* pci irq: TODO */); |
69 |
|
70 |
bus_pci_add(machine, pci_data, machine->memory, 0, 12, 0, "dec21143"); |
71 |
bus_pci_add(machine, pci_data, machine->memory, 0, 15, 0, "gc_obio"); |
72 |
|
73 |
if (machine->use_x11) |
74 |
bus_pci_add(machine, pci_data, machine->memory, 0, 16, 0, |
75 |
"ati_radeon_9200_2"); |
76 |
|
77 |
machine->main_console_handle = (size_t)device_add(machine, |
78 |
"z8530 addr=0xf3013000 irq=23 dma_irq=8 addr_mult=0x10"); |
79 |
|
80 |
fb = dev_fb_init(machine, machine->memory, 0xf1000000, |
81 |
VFB_GENERIC | VFB_REVERSE_START, 1024,768, 1024,768, 8, "ofb"); |
82 |
|
83 |
device_add(machine, "hammerhead addr=0xf2800000"); |
84 |
|
85 |
device_add(machine, "adb addr=0xf3016000 irq=1"); |
86 |
|
87 |
if (!machine->prom_emulation) |
88 |
return; |
89 |
|
90 |
|
91 |
b = 8 * 1048576; a = b - 0x800; |
92 |
|
93 |
of_emul_init(machine, fb, 0xf1000000, 1024, 768); |
94 |
of_emul_init_uninorth(machine); |
95 |
|
96 |
if (machine->use_x11) |
97 |
of_emul_init_adb(machine); |
98 |
else |
99 |
of_emul_init_zs(machine); |
100 |
|
101 |
/* |
102 |
* r3 = pointer to boot_args (for the Mach kernel). |
103 |
* See http://darwinsource.opendarwin.org/10.3/ |
104 |
* BootX-59/bootx.tproj/include.subproj/boot_args.h |
105 |
* for more info. |
106 |
*/ |
107 |
cpu->cd.ppc.gpr[3] = a; |
108 |
store_16bit_word(cpu, a + 0x0000, 1); /* revision */ |
109 |
store_16bit_word(cpu, a + 0x0002, 2); /* version */ |
110 |
store_buf(cpu, a + 0x0004, machine->boot_string_argument, 256); |
111 |
/* 26 dram banks; "long base; long size" */ |
112 |
store_32bit_word(cpu, a + 0x0104, 0); /* base */ |
113 |
store_32bit_word(cpu, a + 0x0108, machine->physical_ram_in_mb |
114 |
* 256); /* size (in pages) */ |
115 |
for (i=8; i<26*8; i+= 4) |
116 |
store_32bit_word(cpu, a + 0x0104 + i, 0); |
117 |
a += (0x104 + 26 * 8); |
118 |
/* Video info: */ |
119 |
store_32bit_word(cpu, a+0, 0xf1000000); /* video base */ |
120 |
store_32bit_word(cpu, a+4, 0); /* display code (?) */ |
121 |
store_32bit_word(cpu, a+8, 1024); /* bytes per pixel row */ |
122 |
store_32bit_word(cpu, a+12, 1024); /* width */ |
123 |
store_32bit_word(cpu, a+16, 768); /* height */ |
124 |
store_32bit_word(cpu, a+20, 8); /* pixel depth */ |
125 |
a += 24; |
126 |
store_32bit_word(cpu, a+0, 127); /* gestalt number (TODO) */ |
127 |
store_32bit_word(cpu, a+4, 0); /* device tree pointer (TODO)*/ |
128 |
store_32bit_word(cpu, a+8, 0); /* device tree length */ |
129 |
store_32bit_word(cpu, a+12, b); /* last address of kernel data area */ |
130 |
|
131 |
/* r4 = "MOSX" (0x4D4F5358) */ |
132 |
cpu->cd.ppc.gpr[4] = 0x4D4F5358; |
133 |
|
134 |
/* |
135 |
* r5 = OpenFirmware entry point. NOTE: See |
136 |
* cpu_ppc.c for the rest of this semi-ugly hack. |
137 |
*/ |
138 |
dev_ram_init(machine, cpu->cd.ppc.of_emul_addr, |
139 |
0x1000, DEV_RAM_RAM, 0x0); |
140 |
store_32bit_word(cpu, cpu->cd.ppc.of_emul_addr, |
141 |
0x44ee0002); |
142 |
cpu->cd.ppc.gpr[5] = cpu->cd.ppc.of_emul_addr; |
143 |
|
144 |
#if 0 |
145 |
/* r6 = args */ |
146 |
cpu->cd.ppc.gpr[1] -= 516; |
147 |
cpu->cd.ppc.gpr[6] = cpu->cd.ppc.gpr[1] + 4; |
148 |
store_string(cpu, cpu->cd.ppc.gpr[6], |
149 |
machine->boot_string_argument); |
150 |
/* should be something like '/controller/disk/bsd' */ |
151 |
|
152 |
/* r7 = length? TODO */ |
153 |
cpu->cd.ppc.gpr[7] = 5; |
154 |
#endif |
155 |
} |
156 |
|
157 |
|
158 |
MACHINE_DEFAULT_CPU(macppc) |
159 |
{ |
160 |
switch (machine->machine_subtype) { |
161 |
case MACHINE_MACPPC_G3: |
162 |
machine->cpu_name = strdup("PPC750"); |
163 |
break; |
164 |
case MACHINE_MACPPC_G4: |
165 |
machine->cpu_name = strdup("MPC7400"); |
166 |
break; |
167 |
case MACHINE_MACPPC_G5: |
168 |
machine->cpu_name = strdup("PPC970"); |
169 |
break; |
170 |
} |
171 |
} |
172 |
|
173 |
|
174 |
MACHINE_DEFAULT_RAM(macppc) |
175 |
{ |
176 |
machine->physical_ram_in_mb = 64; |
177 |
} |
178 |
|
179 |
|
180 |
MACHINE_REGISTER(macppc) |
181 |
{ |
182 |
MR_DEFAULT(macppc, "Macintosh", ARCH_PPC, MACHINE_MACPPC); |
183 |
|
184 |
machine_entry_add_alias(me, "macppc"); |
185 |
|
186 |
machine_entry_add_subtype(me, "MacPPC G3", MACHINE_MACPPC_G3, |
187 |
"g3", NULL); |
188 |
|
189 |
machine_entry_add_subtype(me, "MacPPC G4", MACHINE_MACPPC_G4, |
190 |
"g4", NULL); |
191 |
|
192 |
machine_entry_add_subtype(me, "MacPPC G5", MACHINE_MACPPC_G5, |
193 |
"g5", NULL); |
194 |
|
195 |
me->set_default_ram = machine_default_ram_macppc; |
196 |
} |
197 |
|