root / pc-bios / ohw.diff @ 6e0d8677
History | View | Annotate | Download (65 kB)
1 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/bios.h OpenHackWare-release-0.4/src/bios.h
|
---|---|---|---|
2 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/bios.h 2005-04-06 23:20:22.000000000 +0200
|
3 | 98352369 | bellard | +++ OpenHackWare-release-0.4/src/bios.h 2005-07-07 01:10:20.000000000 +0200
|
4 | 97067eb5 | bellard | @@ -64,6 +64,7 @@
|
5 | 97067eb5 | bellard | ARCH_CHRP, |
6 | 97067eb5 | bellard | ARCH_MAC99, |
7 | 97067eb5 | bellard | ARCH_POP, |
8 | 97067eb5 | bellard | + ARCH_HEATHROW,
|
9 | 97067eb5 | bellard | }; |
10 | 97067eb5 | bellard | |
11 | 97067eb5 | bellard | /* Hardware definition(s) */
|
12 | 98352369 | bellard | @@ -174,6 +175,7 @@
|
13 | 98352369 | bellard | int bd_ioctl (bloc_device_t *bd, int func, void *args); |
14 | 98352369 | bellard | uint32_t bd_seclen (bloc_device_t *bd); |
15 | 98352369 | bellard | void bd_close (bloc_device_t *bd);
|
16 | 98352369 | bellard | +void bd_reset_all(void);
|
17 | 98352369 | bellard | uint32_t bd_seclen (bloc_device_t *bd); |
18 | 98352369 | bellard | uint32_t bd_maxbloc (bloc_device_t *bd); |
19 | 98352369 | bellard | void bd_sect2CHS (bloc_device_t *bd, uint32_t secnum,
|
20 | 98352369 | bellard | @@ -183,12 +185,12 @@
|
21 | 97067eb5 | bellard | part_t *bd_probe (int boot_device);
|
22 | 97067eb5 | bellard | bloc_device_t *bd_get (int device);
|
23 | 97067eb5 | bellard | void bd_put (bloc_device_t *bd);
|
24 | 97067eb5 | bellard | -void bd_set_boot_part (bloc_device_t *bd, part_t *partition);
|
25 | 97067eb5 | bellard | +void bd_set_boot_part (bloc_device_t *bd, part_t *partition, int partnum);
|
26 | 97067eb5 | bellard | part_t **_bd_parts (bloc_device_t *bd); |
27 | 97067eb5 | bellard | |
28 | 97067eb5 | bellard | void ide_pci_pc_register (uint32_t io_base0, uint32_t io_base1,
|
29 | 97067eb5 | bellard | uint32_t io_base2, uint32_t io_base3, |
30 | 97067eb5 | bellard | - void *OF_private);
|
31 | 97067eb5 | bellard | + void *OF_private0, void *OF_private1);
|
32 | 97067eb5 | bellard | void ide_pci_pmac_register (uint32_t io_base0, uint32_t io_base1,
|
33 | 97067eb5 | bellard | void *OF_private);
|
34 | 97067eb5 | bellard | |
35 | 98352369 | bellard | @@ -399,17 +401,23 @@
|
36 | 97067eb5 | bellard | uint16_t min_grant, uint16_t max_latency); |
37 | 97067eb5 | bellard | void OF_finalize_pci_host (void *dev, int first_bus, int nb_busses); |
38 | 97067eb5 | bellard | void OF_finalize_pci_device (void *dev, uint8_t bus, uint8_t devfn, |
39 | 97067eb5 | bellard | - uint32_t *regions, uint32_t *sizes);
|
40 | 97067eb5 | bellard | + uint32_t *regions, uint32_t *sizes,
|
41 | 97067eb5 | bellard | + int irq_line);
|
42 | 97067eb5 | bellard | void OF_finalize_pci_macio (void *dev, uint32_t base_address, uint32_t size, |
43 | 97067eb5 | bellard | void *private_data);
|
44 | 97067eb5 | bellard | +void OF_finalize_pci_ide (void *dev,
|
45 | 97067eb5 | bellard | + uint32_t io_base0, uint32_t io_base1,
|
46 | 97067eb5 | bellard | + uint32_t io_base2, uint32_t io_base3);
|
47 | 97067eb5 | bellard | int OF_register_bus (const unsigned char *name, uint32_t address, |
48 | 97067eb5 | bellard | const unsigned char *type); |
49 | 97067eb5 | bellard | int OF_register_serial (const unsigned char *bus, const unsigned char *name, |
50 | 97067eb5 | bellard | uint32_t io_base, int irq);
|
51 | 97067eb5 | bellard | int OF_register_stdio (const unsigned char *dev_in, |
52 | 97067eb5 | bellard | const unsigned char *dev_out); |
53 | 97067eb5 | bellard | -void OF_vga_register (const unsigned char *name, uint32_t address,
|
54 | 97067eb5 | bellard | - int width, int height, int depth);
|
55 | 97067eb5 | bellard | +void OF_vga_register (const unsigned char *name, unused uint32_t address,
|
56 | 97067eb5 | bellard | + int width, int height, int depth,
|
57 | 97067eb5 | bellard | + unsigned long vga_bios_addr,
|
58 | 97067eb5 | bellard | + unsigned long vga_bios_size);
|
59 | 97067eb5 | bellard | void *OF_blockdev_register (void *parent, void *private, |
60 | 97067eb5 | bellard | const unsigned char *type, |
61 | 97067eb5 | bellard | const unsigned char *name, int devnum, |
62 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/bloc.c OpenHackWare-release-0.4/src/bloc.c
|
63 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/bloc.c 2005-04-06 23:21:00.000000000 +0200
|
64 | 98352369 | bellard | +++ OpenHackWare-release-0.4/src/bloc.c 2005-07-08 00:28:26.000000000 +0200
|
65 | 97067eb5 | bellard | @@ -55,6 +55,7 @@
|
66 | 97067eb5 | bellard | /* Partitions */
|
67 | 97067eb5 | bellard | part_t *parts, *bparts; |
68 | 97067eb5 | bellard | part_t *boot_part; |
69 | 97067eb5 | bellard | + int bpartnum;
|
70 | 97067eb5 | bellard | /* Chain */
|
71 | 97067eb5 | bellard | bloc_device_t *next; |
72 | 97067eb5 | bellard | }; |
73 | 98352369 | bellard | @@ -66,6 +67,7 @@
|
74 | 98352369 | bellard | |
75 | 98352369 | bellard | static int ide_initialize (bloc_device_t *bd, int device); |
76 | 98352369 | bellard | static int ide_read_sector (bloc_device_t *bd, void *buffer, int secnum); |
77 | 98352369 | bellard | +static int ide_reset (bloc_device_t *bd);
|
78 | 98352369 | bellard | |
79 | 98352369 | bellard | static int mem_initialize (bloc_device_t *bd, int device); |
80 | 98352369 | bellard | static int mem_read_sector (bloc_device_t *bd, void *buffer, int secnum); |
81 | 98352369 | bellard | @@ -212,6 +214,17 @@
|
82 | 98352369 | bellard | { |
83 | 98352369 | bellard | } |
84 | 98352369 | bellard | |
85 | 98352369 | bellard | +void bd_reset_all(void)
|
86 | 98352369 | bellard | +{
|
87 | 98352369 | bellard | + bloc_device_t *bd;
|
88 | 98352369 | bellard | + for (bd = bd_list; bd != NULL; bd = bd->next) {
|
89 | 98352369 | bellard | + if (bd->init == &ide_initialize) {
|
90 | 98352369 | bellard | + /* reset IDE drive because Darwin wants all IDE devices to be reset */
|
91 | 98352369 | bellard | + ide_reset(bd);
|
92 | 98352369 | bellard | + }
|
93 | 98352369 | bellard | + }
|
94 | 98352369 | bellard | +}
|
95 | 98352369 | bellard | +
|
96 | 98352369 | bellard | uint32_t bd_seclen (bloc_device_t *bd) |
97 | 98352369 | bellard | { |
98 | 98352369 | bellard | return bd->seclen;
|
99 | 98352369 | bellard | @@ -223,10 +236,12 @@
|
100 | 97067eb5 | bellard | } |
101 | 97067eb5 | bellard | |
102 | 97067eb5 | bellard | /* XXX: to be suppressed */
|
103 | 97067eb5 | bellard | -void bd_set_boot_part (bloc_device_t *bd, part_t *partition)
|
104 | 97067eb5 | bellard | +void bd_set_boot_part (bloc_device_t *bd, part_t *partition, int partnum)
|
105 | 97067eb5 | bellard | { |
106 | 97067eb5 | bellard | + dprintf("%s: part %p (%p) %d\n", __func__, partition, bd->boot_part, partnum);
|
107 | 97067eb5 | bellard | if (bd->boot_part == NULL) { |
108 | 97067eb5 | bellard | bd->boot_part = partition; |
109 | 97067eb5 | bellard | + bd->bpartnum = partnum;
|
110 | 97067eb5 | bellard | } |
111 | 97067eb5 | bellard | } |
112 | 97067eb5 | bellard | |
113 | 98352369 | bellard | @@ -240,6 +255,13 @@
|
114 | 97067eb5 | bellard | return &bd->bparts;
|
115 | 97067eb5 | bellard | } |
116 | 97067eb5 | bellard | |
117 | 97067eb5 | bellard | +void bd_set_boot_device (bloc_device_t *bd)
|
118 | 97067eb5 | bellard | +{
|
119 | 97067eb5 | bellard | +#if defined (USE_OPENFIRMWARE)
|
120 | 97067eb5 | bellard | + OF_blockdev_set_boot_device(bd->OF_private, bd->bpartnum, "\\\\ofwboot");
|
121 | 97067eb5 | bellard | +#endif
|
122 | 97067eb5 | bellard | +}
|
123 | 97067eb5 | bellard | +
|
124 | 97067eb5 | bellard | part_t *bd_probe (int boot_device)
|
125 | 97067eb5 | bellard | { |
126 | 97067eb5 | bellard | char devices[] = { /*'a', 'b',*/ 'c', 'd', 'e', 'f', 'm', '\0', }; |
127 | 98352369 | bellard | @@ -272,9 +294,7 @@
|
128 | 97067eb5 | bellard | tmp = part_probe(bd, force_raw); |
129 | 97067eb5 | bellard | if (boot_device == bd->device) {
|
130 | 97067eb5 | bellard | boot_part = tmp; |
131 | 97067eb5 | bellard | -#if defined (USE_OPENFIRMWARE)
|
132 | 97067eb5 | bellard | - OF_blockdev_set_boot_device(bd->OF_private, 2, "\\\\ofwboot");
|
133 | 97067eb5 | bellard | -#endif
|
134 | 97067eb5 | bellard | + bd_set_boot_device(bd);
|
135 | 97067eb5 | bellard | } |
136 | 97067eb5 | bellard | } |
137 | 97067eb5 | bellard | |
138 | 98352369 | bellard | @@ -717,34 +737,29 @@
|
139 | 97067eb5 | bellard | /* IDE PCI access for pc */
|
140 | 97067eb5 | bellard | static uint8_t ide_pci_port_read (bloc_device_t *bd, int port) |
141 | 97067eb5 | bellard | { |
142 | 97067eb5 | bellard | - eieio();
|
143 | 97067eb5 | bellard | -
|
144 | 97067eb5 | bellard | - return *(uint8_t *)(bd->io_base + port);
|
145 | 97067eb5 | bellard | + uint8_t value;
|
146 | 97067eb5 | bellard | + value = inb(bd->io_base + port);
|
147 | 97067eb5 | bellard | + return value;
|
148 | 97067eb5 | bellard | } |
149 | 97067eb5 | bellard | |
150 | 97067eb5 | bellard | static void ide_pci_port_write (bloc_device_t *bd, int port, uint8_t value) |
151 | 97067eb5 | bellard | { |
152 | 97067eb5 | bellard | - *(uint8_t *)(bd->io_base + port) = value;
|
153 | 97067eb5 | bellard | - eieio();
|
154 | 97067eb5 | bellard | + outb(bd->io_base + port, value);
|
155 | 97067eb5 | bellard | } |
156 | 97067eb5 | bellard | |
157 | 97067eb5 | bellard | static uint32_t ide_pci_data_readl (bloc_device_t *bd)
|
158 | 97067eb5 | bellard | { |
159 | 97067eb5 | bellard | - eieio();
|
160 | 97067eb5 | bellard | -
|
161 | 97067eb5 | bellard | - return *((uint32_t *)bd->io_base);
|
162 | 97067eb5 | bellard | + return inl(bd->io_base);
|
163 | 97067eb5 | bellard | } |
164 | 97067eb5 | bellard | |
165 | 97067eb5 | bellard | static void ide_pci_data_writel (bloc_device_t *bd, uint32_t val) |
166 | 97067eb5 | bellard | { |
167 | 97067eb5 | bellard | - *(uint32_t *)(bd->io_base) = val;
|
168 | 97067eb5 | bellard | - eieio();
|
169 | 97067eb5 | bellard | + outl(bd->io_base, val);
|
170 | 97067eb5 | bellard | } |
171 | 97067eb5 | bellard | |
172 | 97067eb5 | bellard | static void ide_pci_control_write (bloc_device_t *bd, uint32_t val) |
173 | 97067eb5 | bellard | { |
174 | 97067eb5 | bellard | - *((uint8_t *)bd->tmp) = val;
|
175 | 97067eb5 | bellard | - eieio();
|
176 | 97067eb5 | bellard | + outb(bd->tmp + 2, val);
|
177 | 97067eb5 | bellard | } |
178 | 97067eb5 | bellard | |
179 | 97067eb5 | bellard | static ide_ops_t ide_pci_pc_ops = {
|
180 | 98352369 | bellard | @@ -761,7 +776,7 @@
|
181 | 97067eb5 | bellard | |
182 | 97067eb5 | bellard | void ide_pci_pc_register (uint32_t io_base0, uint32_t io_base1,
|
183 | 97067eb5 | bellard | uint32_t io_base2, uint32_t io_base3, |
184 | 97067eb5 | bellard | - unused void *OF_private)
|
185 | 97067eb5 | bellard | + void *OF_private0, void *OF_private1)
|
186 | 97067eb5 | bellard | { |
187 | 97067eb5 | bellard | if (ide_pci_ops == NULL) { |
188 | 97067eb5 | bellard | ide_pci_ops = malloc(sizeof(ide_ops_t));
|
189 | 98352369 | bellard | @@ -770,19 +785,19 @@
|
190 | 97067eb5 | bellard | memcpy(ide_pci_ops, &ide_pci_pc_ops, sizeof(ide_ops_t));
|
191 | 97067eb5 | bellard | } |
192 | 97067eb5 | bellard | if ((io_base0 != 0 || io_base1 != 0) && |
193 | 97067eb5 | bellard | - ide_pci_ops->base[0] == 0 && ide_pci_ops->base[1] == 0) {
|
194 | 97067eb5 | bellard | + ide_pci_ops->base[0] == 0 && ide_pci_ops->base[2] == 0) {
|
195 | 97067eb5 | bellard | ide_pci_ops->base[0] = io_base0;
|
196 | 97067eb5 | bellard | - ide_pci_ops->base[1] = io_base1;
|
197 | 97067eb5 | bellard | + ide_pci_ops->base[2] = io_base1;
|
198 | 97067eb5 | bellard | #ifdef USE_OPENFIRMWARE
|
199 | 97067eb5 | bellard | - ide_pci_ops->OF_private[0] = OF_private;
|
200 | 97067eb5 | bellard | + ide_pci_ops->OF_private[0] = OF_private0;
|
201 | 97067eb5 | bellard | #endif
|
202 | 97067eb5 | bellard | } |
203 | 97067eb5 | bellard | if ((io_base2 != 0 || io_base3 != 0) && |
204 | 97067eb5 | bellard | - ide_pci_ops->base[2] == 0 && ide_pci_ops->base[3] == 0) {
|
205 | 97067eb5 | bellard | - ide_pci_ops->base[2] = io_base2;
|
206 | 97067eb5 | bellard | + ide_pci_ops->base[1] == 0 && ide_pci_ops->base[3] == 0) {
|
207 | 97067eb5 | bellard | + ide_pci_ops->base[1] = io_base2;
|
208 | 97067eb5 | bellard | ide_pci_ops->base[3] = io_base3;
|
209 | 97067eb5 | bellard | #ifdef USE_OPENFIRMWARE
|
210 | 97067eb5 | bellard | - ide_pci_ops->OF_private[1] = OF_private;
|
211 | 97067eb5 | bellard | + ide_pci_ops->OF_private[1] = OF_private1;
|
212 | 97067eb5 | bellard | #endif
|
213 | 97067eb5 | bellard | } |
214 | 97067eb5 | bellard | } |
215 | 98352369 | bellard | @@ -935,6 +950,8 @@
|
216 | 98352369 | bellard | } |
217 | 98352369 | bellard | |
218 | 98352369 | bellard | static void atapi_pad_req (void *buffer, int len); |
219 | 98352369 | bellard | +static void atapi_make_req (bloc_device_t *bd, uint32_t *buffer,
|
220 | 98352369 | bellard | + int maxlen);
|
221 | 98352369 | bellard | static int atapi_read_sector (bloc_device_t *bd, void *buffer, int secnum); |
222 | 98352369 | bellard | |
223 | 98352369 | bellard | static int ide_initialize (bloc_device_t *bd, int device) |
224 | 98352369 | bellard | @@ -1035,9 +1052,7 @@
|
225 | 98352369 | bellard | DPRINTF("INQUIRY\n");
|
226 | 98352369 | bellard | len = spc_inquiry_req(&atapi_buffer, 36);
|
227 | 98352369 | bellard | atapi_pad_req(&atapi_buffer, len); |
228 | 98352369 | bellard | - ide_port_write(bd, 0x07, 0xA0);
|
229 | 98352369 | bellard | - for (i = 0; i < 3; i++)
|
230 | 98352369 | bellard | - ide_data_writel(bd, ldswap32(&atapi_buffer[i]));
|
231 | 98352369 | bellard | + atapi_make_req(bd, atapi_buffer, 36);
|
232 | 98352369 | bellard | status = ide_port_read(bd, 0x07);
|
233 | 98352369 | bellard | if (status != 0x48) { |
234 | 98352369 | bellard | ERROR("ATAPI INQUIRY : status %0x != 0x48\n", status);
|
235 | 98352369 | bellard | @@ -1053,9 +1068,7 @@
|
236 | 98352369 | bellard | DPRINTF("READ_CAPACITY\n");
|
237 | 98352369 | bellard | len = mmc_read_capacity_req(&atapi_buffer); |
238 | 98352369 | bellard | atapi_pad_req(&atapi_buffer, len); |
239 | 98352369 | bellard | - ide_port_write(bd, 0x07, 0xA0);
|
240 | 98352369 | bellard | - for (i = 0; i < 3; i++)
|
241 | 98352369 | bellard | - ide_data_writel(bd, ldswap32(&atapi_buffer[i]));
|
242 | 98352369 | bellard | + atapi_make_req(bd, atapi_buffer, 8);
|
243 | 98352369 | bellard | status = ide_port_read(bd, 0x07);
|
244 | 98352369 | bellard | if (status != 0x48) { |
245 | 98352369 | bellard | ERROR("ATAPI READ_CAPACITY : status %0x != 0x48\n", status);
|
246 | 98352369 | bellard | @@ -1105,6 +1118,22 @@
|
247 | 98352369 | bellard | memset(p + len, 0, 12 - len); |
248 | 98352369 | bellard | } |
249 | 98352369 | bellard | |
250 | 98352369 | bellard | +static void atapi_make_req (bloc_device_t *bd, uint32_t *buffer,
|
251 | 98352369 | bellard | + int maxlen)
|
252 | 98352369 | bellard | +{
|
253 | 98352369 | bellard | + int i;
|
254 | 98352369 | bellard | + /* select drive */
|
255 | 98352369 | bellard | + if (bd->drv == 0)
|
256 | 98352369 | bellard | + ide_port_write(bd, 0x06, 0x40);
|
257 | 98352369 | bellard | + else
|
258 | 98352369 | bellard | + ide_port_write(bd, 0x06, 0x50);
|
259 | 98352369 | bellard | + ide_port_write(bd, 0x04, maxlen & 0xff);
|
260 | 98352369 | bellard | + ide_port_write(bd, 0x05, (maxlen >> 8) & 0xff);
|
261 | 98352369 | bellard | + ide_port_write(bd, 0x07, 0xA0);
|
262 | 98352369 | bellard | + for (i = 0; i < 3; i++)
|
263 | 98352369 | bellard | + ide_data_writel(bd, ldswap32(&buffer[i]));
|
264 | 98352369 | bellard | +}
|
265 | 98352369 | bellard | +
|
266 | 98352369 | bellard | static int atapi_read_sector (bloc_device_t *bd, void *buffer, int secnum) |
267 | 98352369 | bellard | { |
268 | 98352369 | bellard | uint32_t atapi_buffer[4];
|
269 | 98352369 | bellard | @@ -1112,16 +1141,9 @@
|
270 | 98352369 | bellard | uint32_t status, value; |
271 | 98352369 | bellard | int i, len;
|
272 | 98352369 | bellard | |
273 | 98352369 | bellard | - /* select drive */
|
274 | 98352369 | bellard | - if (bd->drv == 0)
|
275 | 98352369 | bellard | - ide_port_write(bd, 0x06, 0x40);
|
276 | 98352369 | bellard | - else
|
277 | 98352369 | bellard | - ide_port_write(bd, 0x06, 0x50);
|
278 | 98352369 | bellard | len = mmc_read12_req(atapi_buffer, secnum, 1);
|
279 | 98352369 | bellard | atapi_pad_req(&atapi_buffer, len); |
280 | 98352369 | bellard | - ide_port_write(bd, 0x07, 0xA0);
|
281 | 98352369 | bellard | - for (i = 0; i < 3; i++)
|
282 | 98352369 | bellard | - ide_data_writel(bd, ldswap32(&atapi_buffer[i]));
|
283 | 98352369 | bellard | + atapi_make_req(bd, atapi_buffer, bd->seclen);
|
284 | 98352369 | bellard | status = ide_port_read(bd, 0x07);
|
285 | 98352369 | bellard | if (status != 0x48) { |
286 | 98352369 | bellard | ERROR("ATAPI READ12 : status %0x != 0x48\n", status);
|
287 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/libpart/apple.c OpenHackWare-release-0.4/src/libpart/apple.c
|
288 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/libpart/apple.c 2005-03-31 09:23:33.000000000 +0200
|
289 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/libpart/apple.c 2005-07-03 16:17:41.000000000 +0200
|
290 | 97067eb5 | bellard | @@ -199,14 +199,18 @@
|
291 | 97067eb5 | bellard | if (len == 0) { |
292 | 97067eb5 | bellard | /* Place holder. Skip it */
|
293 | 97067eb5 | bellard | DPRINTF("%s placeholder part\t%d\n", __func__, i);
|
294 | 97067eb5 | bellard | + part->flags = PART_TYPE_APPLE | PART_FLAG_DUMMY;
|
295 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
296 | 97067eb5 | bellard | } else if (strncmp("Apple_Void", type, 32) == 0) { |
297 | 97067eb5 | bellard | /* Void partition. Skip it */
|
298 | 97067eb5 | bellard | DPRINTF("%s Void part\t%d [%s]\n", __func__, i, type);
|
299 | 97067eb5 | bellard | + part->flags = PART_TYPE_APPLE | PART_FLAG_DUMMY;
|
300 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
301 | 97067eb5 | bellard | } else if (strncmp("Apple_Free", type, 32) == 0) { |
302 | 97067eb5 | bellard | /* Free space. Skip it */
|
303 | 97067eb5 | bellard | DPRINTF("%s Free part (%d)\n", __func__, i);
|
304 | 97067eb5 | bellard | part->flags = PART_TYPE_APPLE | PART_FLAG_DUMMY; |
305 | 97067eb5 | bellard | - part_register(bd, part, name);
|
306 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
307 | 97067eb5 | bellard | } else if (strncmp("Apple_partition_map", type, 32) == 0 || |
308 | 97067eb5 | bellard | strncmp("Apple_Partition_Map", type, 32) == 0 |
309 | 97067eb5 | bellard | #if 0 // Is this really used or is it just a mistake ?
|
310 | 97067eb5 | bellard | @@ -226,7 +230,7 @@
|
311 | 97067eb5 | bellard | */ |
312 | 97067eb5 | bellard | } |
313 | 97067eb5 | bellard | part->flags = PART_TYPE_APPLE | PART_FLAG_DUMMY; |
314 | 97067eb5 | bellard | - part_register(bd, part, name);
|
315 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
316 | 97067eb5 | bellard | } else if (strncmp("Apple_Driver", type, 32) == 0 || |
317 | 97067eb5 | bellard | strncmp("Apple_Driver43", type, 32) == 0 || |
318 | 97067eb5 | bellard | strncmp("Apple_Driver43_CD", type, 32) == 0 || |
319 | 97067eb5 | bellard | @@ -236,8 +240,12 @@
|
320 | 97067eb5 | bellard | strncmp("Apple_Driver_IOKit", type, 32) == 0) { |
321 | 97067eb5 | bellard | /* Drivers. don't care for now */
|
322 | 97067eb5 | bellard | DPRINTF("%s Drivers part\t%d [%s]\n", __func__, i, type);
|
323 | 97067eb5 | bellard | + part->flags = PART_TYPE_APPLE | PART_FLAG_DRIVER;
|
324 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
325 | 97067eb5 | bellard | } else if (strncmp("Apple_Patches", type, 32) == 0) { |
326 | 97067eb5 | bellard | /* Patches: don't care for now */
|
327 | 97067eb5 | bellard | + part->flags = PART_TYPE_APPLE | PART_FLAG_PATCH;
|
328 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
329 | 97067eb5 | bellard | DPRINTF("%s Patches part\t%d [%s]\n", __func__, i, type);
|
330 | 97067eb5 | bellard | } else if (strncmp("Apple_HFS", type, 32) == 0 || |
331 | 97067eb5 | bellard | strncmp("Apple_MFS", type, 32) == 0 || |
332 | 97067eb5 | bellard | @@ -256,9 +264,8 @@
|
333 | 97067eb5 | bellard | count = partmap->bloc_cnt * HFS_BLOCSIZE; |
334 | 97067eb5 | bellard | if (partmap->boot_size == 0 || partmap->boot_load == 0) { |
335 | 97067eb5 | bellard | printf("Not a bootable partition %d %d (%p %p)\n",
|
336 | 97067eb5 | bellard | - partmap->boot_size, partmap->boot_load,boot_part, part);
|
337 | 97067eb5 | bellard | - if (boot_part == NULL)
|
338 | 97067eb5 | bellard | - boot_part = part;
|
339 | 97067eb5 | bellard | + partmap->boot_size, partmap->boot_load,
|
340 | 97067eb5 | bellard | + boot_part, part);
|
341 | 97067eb5 | bellard | part->flags = PART_TYPE_APPLE | PART_FLAG_FS; |
342 | 97067eb5 | bellard | } else {
|
343 | 97067eb5 | bellard | part->boot_start.bloc = partmap->boot_start; |
344 | 97067eb5 | bellard | @@ -278,8 +285,8 @@
|
345 | 97067eb5 | bellard | boot_part = part; |
346 | 97067eb5 | bellard | part->flags = PART_TYPE_APPLE | PART_FLAG_FS | PART_FLAG_BOOT; |
347 | 97067eb5 | bellard | } |
348 | 97067eb5 | bellard | - printf("Partition: %d %s st %0x size %0x",
|
349 | 97067eb5 | bellard | - i, name, partmap->start_bloc, partmap->bloc_cnt);
|
350 | 97067eb5 | bellard | + printf("Partition: %d '%s' '%s' st %0x size %0x",
|
351 | 97067eb5 | bellard | + i, name, type, partmap->start_bloc, partmap->bloc_cnt);
|
352 | 97067eb5 | bellard | #ifndef DEBUG
|
353 | 97067eb5 | bellard | printf("\n");
|
354 | 97067eb5 | bellard | #endif
|
355 | 97067eb5 | bellard | @@ -290,11 +297,13 @@
|
356 | 97067eb5 | bellard | part->boot_load, part->boot_entry); |
357 | 97067eb5 | bellard | DPRINTF(" load %0x entry %0x %0x\n",
|
358 | 97067eb5 | bellard | partmap->boot_load2, partmap->boot_entry2, HFS_BLOCSIZE); |
359 | 97067eb5 | bellard | - part_register(bd, part, name);
|
360 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
361 | 97067eb5 | bellard | } else {
|
362 | 97067eb5 | bellard | memcpy(tmp, type, 32);
|
363 | 97067eb5 | bellard | tmp[32] = '\0'; |
364 | 97067eb5 | bellard | ERROR("Unknown partition type [%s]\n", tmp);
|
365 | 97067eb5 | bellard | + part->flags = PART_TYPE_APPLE | PART_FLAG_DUMMY;
|
366 | 97067eb5 | bellard | + part_register(bd, part, name, i);
|
367 | 97067eb5 | bellard | } |
368 | 97067eb5 | bellard | } |
369 | 97067eb5 | bellard | error:
|
370 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/libpart/core.c OpenHackWare-release-0.4/src/libpart/core.c
|
371 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/libpart/core.c 2005-03-31 09:23:33.000000000 +0200
|
372 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/libpart/core.c 2005-07-03 16:17:41.000000000 +0200
|
373 | 97067eb5 | bellard | @@ -126,7 +126,7 @@
|
374 | 97067eb5 | bellard | } |
375 | 97067eb5 | bellard | |
376 | 97067eb5 | bellard | int part_register (bloc_device_t *bd, part_t *partition,
|
377 | 97067eb5 | bellard | - const unsigned char *name)
|
378 | 97067eb5 | bellard | + const unsigned char *name, int partnum)
|
379 | 97067eb5 | bellard | { |
380 | 97067eb5 | bellard | part_t **cur; |
381 | 97067eb5 | bellard | |
382 | 97067eb5 | bellard | @@ -134,6 +134,7 @@
|
383 | 97067eb5 | bellard | partition->bd = bd; |
384 | 97067eb5 | bellard | partition->next = NULL;
|
385 | 97067eb5 | bellard | partition->name = strdup(name); |
386 | 97067eb5 | bellard | + partition->partnum = partnum;
|
387 | 97067eb5 | bellard | for (cur = _bd_parts(bd); *cur != NULL; cur = &(*cur)->next) |
388 | 97067eb5 | bellard | continue;
|
389 | 97067eb5 | bellard | *cur = partition; |
390 | 97067eb5 | bellard | @@ -141,29 +142,15 @@
|
391 | 97067eb5 | bellard | return 0; |
392 | 97067eb5 | bellard | } |
393 | 97067eb5 | bellard | |
394 | 97067eb5 | bellard | -static inline int set_boot_part (bloc_device_t *bd, int partnum)
|
395 | 97067eb5 | bellard | -{
|
396 | 97067eb5 | bellard | - part_t *cur;
|
397 | 97067eb5 | bellard | -
|
398 | 97067eb5 | bellard | - cur = part_get(bd, partnum);
|
399 | 97067eb5 | bellard | - if (cur == NULL)
|
400 | 97067eb5 | bellard | - return -1;
|
401 | 97067eb5 | bellard | - bd_set_boot_part(bd, cur);
|
402 | 97067eb5 | bellard | -
|
403 | 97067eb5 | bellard | - return 0;
|
404 | 97067eb5 | bellard | -}
|
405 | 97067eb5 | bellard | -
|
406 | 97067eb5 | bellard | part_t *part_get (bloc_device_t *bd, int partnum)
|
407 | 97067eb5 | bellard | { |
408 | 97067eb5 | bellard | part_t **listp, *cur; |
409 | 97067eb5 | bellard | - int i;
|
410 | 97067eb5 | bellard | |
411 | 97067eb5 | bellard | listp = _bd_parts(bd); |
412 | 97067eb5 | bellard | - cur = *listp;
|
413 | 97067eb5 | bellard | - for (i = 0; i != partnum; i++) {
|
414 | 97067eb5 | bellard | - if (cur == NULL)
|
415 | 97067eb5 | bellard | +
|
416 | 97067eb5 | bellard | + for (cur = *listp; cur != NULL; cur = cur->next) {
|
417 | 97067eb5 | bellard | + if (cur->partnum == partnum)
|
418 | 97067eb5 | bellard | break;
|
419 | 97067eb5 | bellard | - cur = cur->next;
|
420 | 97067eb5 | bellard | } |
421 | 97067eb5 | bellard | |
422 | 97067eb5 | bellard | return cur;
|
423 | 97067eb5 | bellard | @@ -192,17 +179,20 @@
|
424 | 97067eb5 | bellard | part_set_blocsize(bd, part, 512);
|
425 | 97067eb5 | bellard | part->bd = bd; |
426 | 97067eb5 | bellard | part->flags = PART_TYPE_RAW | PART_FLAG_BOOT; |
427 | 97067eb5 | bellard | - part_register(bd, part, "Raw");
|
428 | 97067eb5 | bellard | + part_register(bd, part, "Raw", 0);
|
429 | 97067eb5 | bellard | |
430 | 97067eb5 | bellard | return part;
|
431 | 97067eb5 | bellard | } |
432 | 97067eb5 | bellard | |
433 | 97067eb5 | bellard | +bloc_device_t *part_get_bd (part_t *part)
|
434 | 97067eb5 | bellard | +{
|
435 | 97067eb5 | bellard | + return part->bd;
|
436 | 97067eb5 | bellard | +}
|
437 | 97067eb5 | bellard | +
|
438 | 97067eb5 | bellard | part_t *part_probe (bloc_device_t *bd, int set_raw)
|
439 | 97067eb5 | bellard | { |
440 | 97067eb5 | bellard | - part_t *part0, *boot_part, **cur;
|
441 | 97067eb5 | bellard | + part_t *part0 = NULL, *boot_part, **cur;
|
442 | 97067eb5 | bellard | |
443 | 97067eb5 | bellard | - /* Register the 0 partition: raw partition containing the whole disk */
|
444 | 97067eb5 | bellard | - part0 = part_get_raw(bd);
|
445 | 97067eb5 | bellard | /* Try to find a valid boot partition */
|
446 | 97067eb5 | bellard | boot_part = Apple_probe_partitions(bd); |
447 | 97067eb5 | bellard | if (boot_part == NULL) { |
448 | 97067eb5 | bellard | @@ -210,10 +200,13 @@
|
449 | 97067eb5 | bellard | if (boot_part == NULL && arch == ARCH_PREP) |
450 | 97067eb5 | bellard | boot_part = PREP_find_partition(bd); |
451 | 97067eb5 | bellard | if (boot_part == NULL && set_raw != 0) { |
452 | 97067eb5 | bellard | - boot_part = part0;
|
453 | 97067eb5 | bellard | - set_boot_part(bd, 0);
|
454 | 97067eb5 | bellard | + dprintf("Use bloc device as raw partition\n");
|
455 | 97067eb5 | bellard | } |
456 | 97067eb5 | bellard | } |
457 | 97067eb5 | bellard | + if (_bd_parts(bd) == NULL) {
|
458 | 97067eb5 | bellard | + /* Register the 0 partition: raw partition containing the whole disk */
|
459 | 97067eb5 | bellard | + part0 = part_get_raw(bd);
|
460 | 97067eb5 | bellard | + }
|
461 | 97067eb5 | bellard | /* Probe filesystem on each found partition */
|
462 | 97067eb5 | bellard | for (cur = _bd_parts(bd); *cur != NULL; cur = &(*cur)->next) { |
463 | 97067eb5 | bellard | const unsigned char *map, *type; |
464 | 97067eb5 | bellard | @@ -248,23 +241,28 @@
|
465 | 97067eb5 | bellard | type = "unknown";
|
466 | 97067eb5 | bellard | break;
|
467 | 97067eb5 | bellard | } |
468 | 97067eb5 | bellard | - DPRINTF("Probe filesystem on %s %s partition '%s' %s\n",
|
469 | 97067eb5 | bellard | + dprintf("Probe filesystem on %s %s partition '%s' %s %p\n",
|
470 | 97067eb5 | bellard | type, map, (*cur)->name, |
471 | 97067eb5 | bellard | - ((*cur)->flags) & PART_FLAG_BOOT ? "(bootable)" : "");
|
472 | 97067eb5 | bellard | + ((*cur)->flags) & PART_FLAG_BOOT ? "(bootable)" : "", *cur);
|
473 | 97067eb5 | bellard | if (((*cur)->flags) & PART_FLAG_FS) {
|
474 | 97067eb5 | bellard | if (((*cur)->flags) & PART_FLAG_BOOT)
|
475 | 97067eb5 | bellard | (*cur)->fs = fs_probe(*cur, 1);
|
476 | 97067eb5 | bellard | else
|
477 | 97067eb5 | bellard | (*cur)->fs = fs_probe(*cur, 0);
|
478 | 97067eb5 | bellard | + } else if (((*cur)->flags) & PART_TYPE_RAW) {
|
479 | 97067eb5 | bellard | + (*cur)->fs = fs_probe(*cur, 2);
|
480 | 97067eb5 | bellard | } else {
|
481 | 97067eb5 | bellard | (*cur)->fs = fs_probe(*cur, 2);
|
482 | 97067eb5 | bellard | } |
483 | 97067eb5 | bellard | - if (((*cur)->flags) & PART_FLAG_BOOT) {
|
484 | 97067eb5 | bellard | - bd_set_boot_part(bd, *cur);
|
485 | 97067eb5 | bellard | fs_get_bootfile((*cur)->fs); |
486 | 97067eb5 | bellard | + if (((*cur)->flags) & PART_FLAG_BOOT) {
|
487 | 97067eb5 | bellard | + dprintf("Partition is bootable (%d)\n", (*cur)->partnum);
|
488 | 97067eb5 | bellard | + bd_set_boot_part(bd, *cur, (*cur)->partnum);
|
489 | 97067eb5 | bellard | + if (boot_part == NULL)
|
490 | 97067eb5 | bellard | + boot_part = *cur;
|
491 | 97067eb5 | bellard | } |
492 | 97067eb5 | bellard | } |
493 | 97067eb5 | bellard | - DPRINTF("Boot partition: %p %p %p %p\n", boot_part, boot_part->fs,
|
494 | 97067eb5 | bellard | + dprintf("Boot partition: %p %p %p %p\n", boot_part, boot_part->fs,
|
495 | 97067eb5 | bellard | part_fs(boot_part), part0); |
496 | 97067eb5 | bellard | |
497 | 97067eb5 | bellard | return boot_part;
|
498 | 97067eb5 | bellard | @@ -279,6 +277,7 @@
|
499 | 97067eb5 | bellard | part->boot_size.offset = 0;
|
500 | 97067eb5 | bellard | part->boot_load = 0;
|
501 | 97067eb5 | bellard | part->boot_entry = 0;
|
502 | 97067eb5 | bellard | + part->flags |= PART_FLAG_BOOT;
|
503 | 97067eb5 | bellard | |
504 | 97067eb5 | bellard | return 0; |
505 | 97067eb5 | bellard | } |
506 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/libpart/isofs.c OpenHackWare-release-0.4/src/libpart/isofs.c
|
507 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/libpart/isofs.c 2005-03-31 09:23:33.000000000 +0200
|
508 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/libpart/isofs.c 2005-07-03 16:17:41.000000000 +0200
|
509 | 97067eb5 | bellard | @@ -242,7 +242,7 @@
|
510 | 97067eb5 | bellard | part->boot_start.bloc, part->boot_size.bloc, |
511 | 97067eb5 | bellard | part->boot_load, part->boot_entry); |
512 | 97067eb5 | bellard | part->flags = PART_TYPE_ISO9660 | PART_FLAG_BOOT; |
513 | 97067eb5 | bellard | - part_register(bd, part, name);
|
514 | 97067eb5 | bellard | + part_register(bd, part, name, i + 1);
|
515 | 97067eb5 | bellard | fs_raw_set_bootfile(part, part->boot_start.bloc, |
516 | 97067eb5 | bellard | part->boot_start.offset, |
517 | 97067eb5 | bellard | part->boot_size.bloc, |
518 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/libpart/libpart.h OpenHackWare-release-0.4/src/libpart/libpart.h
|
519 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/libpart/libpart.h 2005-03-31 09:23:33.000000000 +0200
|
520 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/libpart/libpart.h 2005-07-03 16:17:41.000000000 +0200
|
521 | 97067eb5 | bellard | @@ -30,6 +30,7 @@
|
522 | 97067eb5 | bellard | |
523 | 97067eb5 | bellard | struct part_t {
|
524 | 97067eb5 | bellard | bloc_device_t *bd; |
525 | 97067eb5 | bellard | + int partnum;
|
526 | 97067eb5 | bellard | uint32_t start; /* Partition first bloc */
|
527 | 97067eb5 | bellard | uint32_t size; /* Partition size, in blocs */
|
528 | 97067eb5 | bellard | uint32_t spb; |
529 | 97067eb5 | bellard | @@ -54,7 +55,7 @@
|
530 | 97067eb5 | bellard | }; |
531 | 97067eb5 | bellard | |
532 | 97067eb5 | bellard | int part_register (bloc_device_t *bd, part_t *partition,
|
533 | 97067eb5 | bellard | - const unsigned char *name);
|
534 | 97067eb5 | bellard | + const unsigned char *name, int partnum);
|
535 | 97067eb5 | bellard | void part_set_blocsize (bloc_device_t *bd, part_t *part, uint32_t blocsize);
|
536 | 97067eb5 | bellard | void part_private_set (part_t *part, void *private); |
537 | 97067eb5 | bellard | void *part_private_get (part_t *part);
|
538 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/libpart/prep.c OpenHackWare-release-0.4/src/libpart/prep.c
|
539 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/libpart/prep.c 2005-03-31 09:23:33.000000000 +0200
|
540 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/libpart/prep.c 2005-07-03 16:17:41.000000000 +0200
|
541 | 97067eb5 | bellard | @@ -164,7 +164,7 @@
|
542 | 97067eb5 | bellard | part->boot_load = 0;
|
543 | 97067eb5 | bellard | part->boot_entry = boot_offset - part->bloc_size; |
544 | 97067eb5 | bellard | part->flags = PART_TYPE_PREP | PART_FLAG_BOOT; |
545 | 97067eb5 | bellard | - part_register(bd, part, "PREP boot");
|
546 | 97067eb5 | bellard | + part_register(bd, part, "PREP boot", i);
|
547 | 97067eb5 | bellard | fs_raw_set_bootfile(part, part->boot_start.bloc, |
548 | 97067eb5 | bellard | part->boot_start.offset, |
549 | 97067eb5 | bellard | part->boot_size.bloc, |
550 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/main.c OpenHackWare-release-0.4/src/main.c
|
551 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/main.c 2005-03-31 09:23:33.000000000 +0200
|
552 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/main.c 2005-06-07 23:48:39.000000000 +0200
|
553 | 97067eb5 | bellard | @@ -364,20 +364,24 @@
|
554 | 97067eb5 | bellard | void *load_base, *load_entry, *last_alloc, *load_end;
|
555 | 97067eb5 | bellard | uint32_t memsize, boot_image_size, cmdline_size, ramdisk_size; |
556 | 97067eb5 | bellard | uint32_t boot_base, boot_nb; |
557 | 97067eb5 | bellard | - int boot_device;
|
558 | 97067eb5 | bellard | + int boot_device, i;
|
559 | 97067eb5 | bellard | + static const uint32_t isa_base_tab[3] = {
|
560 | 97067eb5 | bellard | + 0x80000000, /* PREP */
|
561 | 97067eb5 | bellard | + 0xFE000000, /* Grackle (Heathrow) */
|
562 | 97067eb5 | bellard | + 0xF2000000, /* UniNorth (Mac99) */
|
563 | 97067eb5 | bellard | + };
|
564 | 97067eb5 | bellard | |
565 | 97067eb5 | bellard | /* Retrieve NVRAM configuration */
|
566 | 97067eb5 | bellard | - nvram_retry:
|
567 | 97067eb5 | bellard | + for(i = 0; i < 3; i++) {
|
568 | 97067eb5 | bellard | + isa_io_base = isa_base_tab[i];
|
569 | 97067eb5 | bellard | nvram = NVRAM_get_config(&memsize, &boot_device, |
570 | 97067eb5 | bellard | &boot_image, &boot_image_size, |
571 | 97067eb5 | bellard | &cmdline, &cmdline_size, |
572 | 97067eb5 | bellard | &ramdisk, &ramdisk_size); |
573 | 97067eb5 | bellard | - if (nvram == NULL) {
|
574 | 97067eb5 | bellard | - /* Retry with another isa_io_base */
|
575 | 97067eb5 | bellard | - if (isa_io_base == 0x80000000) {
|
576 | 97067eb5 | bellard | - isa_io_base = 0xF2000000;
|
577 | 97067eb5 | bellard | - goto nvram_retry;
|
578 | 97067eb5 | bellard | + if (nvram)
|
579 | 97067eb5 | bellard | + break;
|
580 | 97067eb5 | bellard | } |
581 | 97067eb5 | bellard | + if (i == 3) {
|
582 | 97067eb5 | bellard | ERROR("Unable to load configuration from NVRAM. Aborting...\n");
|
583 | 97067eb5 | bellard | return -1; |
584 | 97067eb5 | bellard | } |
585 | 97067eb5 | bellard | @@ -402,7 +406,7 @@
|
586 | 97067eb5 | bellard | cpu_name = CPU_get_name(pvr); |
587 | 97067eb5 | bellard | OF_register_cpu(cpu_name, 0, pvr,
|
588 | 97067eb5 | bellard | 200 * 1000 * 1000, 200 * 1000 * 1000, |
589 | 97067eb5 | bellard | - 100 * 1000 * 1000, 10 * 1000 * 1000,
|
590 | 97067eb5 | bellard | + 100 * 1000 * 1000, 100 * 1000 * 1000,
|
591 | 97067eb5 | bellard | 0x0092);
|
592 | 97067eb5 | bellard | } |
593 | 97067eb5 | bellard | OF_register_memory(memsize, 512 * 1024 /* TOFIX */); |
594 | 97067eb5 | bellard | @@ -433,9 +437,12 @@
|
595 | 97067eb5 | bellard | vga_puts(copyright); |
596 | 97067eb5 | bellard | vga_puts("\n");
|
597 | 97067eb5 | bellard | |
598 | 97067eb5 | bellard | +#if 0
|
599 | 97067eb5 | bellard | /* QEMU is quite incoherent: d is cdrom, not second drive */
|
600 | 97067eb5 | bellard | + /* XXX: should probe CD-ROM position */
|
601 | 97067eb5 | bellard | if (boot_device == 'd') |
602 | 97067eb5 | bellard | boot_device = 'e';
|
603 | 97067eb5 | bellard | +#endif
|
604 | 97067eb5 | bellard | /* Open boot device */
|
605 | 97067eb5 | bellard | boot_part = bd_probe(boot_device); |
606 | 97067eb5 | bellard | if (boot_device == 'm') { |
607 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/nvram.c OpenHackWare-release-0.4/src/nvram.c
|
608 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/nvram.c 2005-03-31 09:23:33.000000000 +0200
|
609 | 97067eb5 | bellard | +++ OpenHackWare-release-0.4/src/nvram.c 2005-06-04 23:44:03.000000000 +0200
|
610 | 97067eb5 | bellard | @@ -334,6 +334,7 @@
|
611 | 97067eb5 | bellard | ret = NVRAM_chrp_format(nvram); |
612 | 97067eb5 | bellard | break;
|
613 | 97067eb5 | bellard | case ARCH_MAC99:
|
614 | 97067eb5 | bellard | + case ARCH_HEATHROW: /* XXX: may be incorrect */
|
615 | 97067eb5 | bellard | ret = NVRAM_mac99_format(nvram); |
616 | 97067eb5 | bellard | break;
|
617 | 97067eb5 | bellard | case ARCH_POP:
|
618 | 97067eb5 | bellard | @@ -409,13 +410,12 @@
|
619 | 97067eb5 | bellard | arch = ARCH_MAC99; |
620 | 97067eb5 | bellard | } else if (strcmp(sign, "POP") == 0) { |
621 | 97067eb5 | bellard | arch = ARCH_POP; |
622 | 97067eb5 | bellard | + } else if (strcmp(sign, "HEATHROW") == 0) {
|
623 | 97067eb5 | bellard | + arch = ARCH_HEATHROW;
|
624 | 97067eb5 | bellard | } else {
|
625 | 97067eb5 | bellard | ERROR("Unknown PPC architecture: '%s'\n", sign);
|
626 | 97067eb5 | bellard | return NULL; |
627 | 97067eb5 | bellard | } |
628 | 97067eb5 | bellard | - /* HACK */
|
629 | 97067eb5 | bellard | - if (arch == ARCH_CHRP)
|
630 | 97067eb5 | bellard | - arch = ARCH_MAC99;
|
631 | 97067eb5 | bellard | lword = NVRAM_get_lword(nvram, 0x30);
|
632 | 97067eb5 | bellard | *RAM_size = lword; |
633 | 97067eb5 | bellard | byte = NVRAM_get_byte(nvram, 0x34);
|
634 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/of.c OpenHackWare-release-0.4/src/of.c
|
635 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/of.c 2005-04-06 23:17:26.000000000 +0200
|
636 | 98352369 | bellard | +++ OpenHackWare-release-0.4/src/of.c 2005-07-07 23:30:08.000000000 +0200
|
637 | 97067eb5 | bellard | @@ -489,7 +489,7 @@
|
638 | 97067eb5 | bellard | ERROR("%s can't alloc new node '%s' name\n", __func__, name);
|
639 | 97067eb5 | bellard | return NULL; |
640 | 97067eb5 | bellard | } |
641 | 97067eb5 | bellard | - new->prop_address = OF_prop_int_new(env, new, "address", address);
|
642 | 97067eb5 | bellard | + new->prop_address = OF_prop_int_new(env, new, "unit-address", address);
|
643 | 97067eb5 | bellard | if (new->prop_address == NULL) { |
644 | 97067eb5 | bellard | free(new->prop_name->value); |
645 | 97067eb5 | bellard | free(new->prop_name); |
646 | 98352369 | bellard | @@ -1017,6 +1017,33 @@
|
647 | 98352369 | bellard | string, strlen(string) + 1);
|
648 | 98352369 | bellard | } |
649 | 98352369 | bellard | |
650 | 98352369 | bellard | +/* convert '\1' char to '\0' */
|
651 | 98352369 | bellard | +static OF_prop_t *OF_prop_string_new1 (OF_env_t *env, OF_node_t *node,
|
652 | 98352369 | bellard | + const unsigned char *name,
|
653 | 98352369 | bellard | + const unsigned char *string)
|
654 | 98352369 | bellard | +{
|
655 | 98352369 | bellard | + int len, i;
|
656 | 98352369 | bellard | + OF_prop_t *ret;
|
657 | 98352369 | bellard | + unsigned char *str;
|
658 | 98352369 | bellard | +
|
659 | 98352369 | bellard | + if (strchr(string, '\1') == NULL) {
|
660 | 98352369 | bellard | + return OF_prop_string_new(env, node, name, string);
|
661 | 98352369 | bellard | + } else {
|
662 | 98352369 | bellard | + len = strlen(string) + 1;
|
663 | 98352369 | bellard | + str = malloc(len);
|
664 | 98352369 | bellard | + if (!str)
|
665 | 98352369 | bellard | + return NULL;
|
666 | 98352369 | bellard | + memcpy(str, string, len);
|
667 | 98352369 | bellard | + for(i = 0; i < len; i++)
|
668 | 98352369 | bellard | + if (str[i] == '\1')
|
669 | 98352369 | bellard | + str[i] = '\0';
|
670 | 98352369 | bellard | + ret = OF_property_new(env, node, name,
|
671 | 98352369 | bellard | + str, len);
|
672 | 98352369 | bellard | + free(str);
|
673 | 98352369 | bellard | + return ret;
|
674 | 98352369 | bellard | + }
|
675 | 98352369 | bellard | +}
|
676 | 98352369 | bellard | +
|
677 | 98352369 | bellard | __attribute__ (( section (".OpenFirmware") ))
|
678 | 98352369 | bellard | static OF_prop_t *OF_prop_int_new (OF_env_t *env, OF_node_t *node,
|
679 | 98352369 | bellard | const unsigned char *name, uint32_t value) |
680 | 98352369 | bellard | @@ -1421,15 +1448,12 @@
|
681 | 97067eb5 | bellard | __attribute__ (( section (".OpenFirmware") ))
|
682 | 97067eb5 | bellard | int OF_init (void) |
683 | 97067eb5 | bellard | { |
684 | 97067eb5 | bellard | - const unsigned char compat_str[] =
|
685 | 97067eb5 | bellard | #if 0
|
686 | 97067eb5 | bellard | "PowerMac3,1\0MacRISC\0Power Macintosh\0";
|
687 | 97067eb5 | bellard | "PowerMac1,2\0MacRISC\0Power Macintosh\0";
|
688 | 97067eb5 | bellard | "AAPL,PowerMac G3\0PowerMac G3\0MacRISC\0Power Macintosh\0";
|
689 | 97067eb5 | bellard | "AAPL,PowerMac3,0\0MacRISC\0Power Macintosh\0";
|
690 | 97067eb5 | bellard | "AAPL,Gossamer\0MacRISC\0Power Macintosh\0";
|
691 | 97067eb5 | bellard | -#else
|
692 | 97067eb5 | bellard | - "AAPL,PowerMac G3\0PowerMac G3\0MacRISC\0Power Macintosh\0";
|
693 | 97067eb5 | bellard | #endif
|
694 | 97067eb5 | bellard | OF_env_t *OF_env; |
695 | 97067eb5 | bellard | OF_node_t *als, *opt, *chs, *pks; |
696 | 98352369 | bellard | @@ -1455,15 +1479,21 @@
|
697 | 97067eb5 | bellard | return -1; |
698 | 97067eb5 | bellard | } |
699 | 97067eb5 | bellard | OF_prop_string_new(OF_env, OF_node_root, "device_type", "bootrom"); |
700 | 97067eb5 | bellard | -#if 0
|
701 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, OF_node_root,
|
702 | 97067eb5 | bellard | - "model", "PPC Open Hack'Ware " BIOS_VERSION);
|
703 | 97067eb5 | bellard | -#else
|
704 | 97067eb5 | bellard | + if (arch == ARCH_HEATHROW) {
|
705 | 97067eb5 | bellard | + const unsigned char compat_str[] =
|
706 | 97067eb5 | bellard | + "PowerMac1,1\0MacRISC\0Power Macintosh";
|
707 | 97067eb5 | bellard | + OF_property_new(OF_env, OF_node_root, "compatible",
|
708 | 97067eb5 | bellard | + compat_str, sizeof(compat_str));
|
709 | 97067eb5 | bellard | OF_prop_string_new(OF_env, OF_node_root, |
710 | 97067eb5 | bellard | - "model", compat_str);
|
711 | 97067eb5 | bellard | -#endif
|
712 | 97067eb5 | bellard | + "model", "Power Macintosh");
|
713 | 97067eb5 | bellard | + } else {
|
714 | 97067eb5 | bellard | + const unsigned char compat_str[] =
|
715 | 97067eb5 | bellard | + "PowerMac3,1\0MacRISC\0Power Macintosh";
|
716 | 97067eb5 | bellard | OF_property_new(OF_env, OF_node_root, "compatible",
|
717 | 97067eb5 | bellard | compat_str, sizeof(compat_str));
|
718 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, OF_node_root,
|
719 | 97067eb5 | bellard | + "model", "PowerMac3,1");
|
720 | 97067eb5 | bellard | + }
|
721 | 97067eb5 | bellard | #if 0
|
722 | 97067eb5 | bellard | OF_prop_string_new(OF_env, OF_node_root, "copyright", copyright);
|
723 | 97067eb5 | bellard | #else
|
724 | 98352369 | bellard | @@ -1561,14 +1591,15 @@
|
725 | 97067eb5 | bellard | range.size = 0x00800000;
|
726 | 97067eb5 | bellard | OF_property_new(OF_env, rom, "ranges", &range, sizeof(OF_range_t)); |
727 | 97067eb5 | bellard | OF_prop_int_new(OF_env, rom, "#address-cells", 1); |
728 | 97067eb5 | bellard | +
|
729 | 97067eb5 | bellard | /* "/rom/boot-rom@fff00000" node */
|
730 | 97067eb5 | bellard | - brom = OF_node_new(OF_env, OF_node_root, "boot-rom", 0xfff00000);
|
731 | 97067eb5 | bellard | + brom = OF_node_new(OF_env, rom, "boot-rom", 0xfff00000);
|
732 | 97067eb5 | bellard | if (brom == NULL) { |
733 | 97067eb5 | bellard | ERROR("Cannot create 'boot-rom'\n");
|
734 | 97067eb5 | bellard | return -1; |
735 | 97067eb5 | bellard | } |
736 | 97067eb5 | bellard | regs.address = 0xFFF00000;
|
737 | 97067eb5 | bellard | - regs.size = 0x00010000;
|
738 | 97067eb5 | bellard | + regs.size = 0x00100000;
|
739 | 97067eb5 | bellard | OF_property_new(OF_env, brom, "reg", ®s, sizeof(OF_regprop_t)); |
740 | 97067eb5 | bellard | OF_prop_string_new(OF_env, brom, "write-characteristic", "flash"); |
741 | 97067eb5 | bellard | OF_prop_string_new(OF_env, brom, "BootROM-build-date",
|
742 | 98352369 | bellard | @@ -1577,7 +1608,7 @@
|
743 | 97067eb5 | bellard | OF_prop_string_new(OF_env, brom, "copyright", copyright);
|
744 | 97067eb5 | bellard | OF_prop_string_new(OF_env, brom, "model", BIOS_str);
|
745 | 97067eb5 | bellard | OF_prop_int_new(OF_env, brom, "result", 0); |
746 | 97067eb5 | bellard | -#if 0
|
747 | 97067eb5 | bellard | +#if 1
|
748 | 97067eb5 | bellard | { |
749 | 97067eb5 | bellard | /* Hack taken 'as-is' from PearPC */
|
750 | 97067eb5 | bellard | unsigned char info[] = { |
751 | 98352369 | bellard | @@ -1596,7 +1627,9 @@
|
752 | 97067eb5 | bellard | OF_node_put(OF_env, brom); |
753 | 97067eb5 | bellard | OF_node_put(OF_env, rom); |
754 | 97067eb5 | bellard | } |
755 | 97067eb5 | bellard | +#if 0
|
756 | 97067eb5 | bellard | /* From here, hardcoded hacks to get a Mac-like machine */
|
757 | 97067eb5 | bellard | + /* XXX: Core99 does not seem to like this NVRAM tree */
|
758 | 97067eb5 | bellard | /* "/nvram@fff04000" node */
|
759 | 97067eb5 | bellard | { |
760 | 97067eb5 | bellard | OF_regprop_t regs; |
761 | 98352369 | bellard | @@ -1617,6 +1650,7 @@
|
762 | 97067eb5 | bellard | OF_prop_int_new(OF_env, chs, "nvram", OF_pack_handle(OF_env, nvr));
|
763 | 97067eb5 | bellard | OF_node_put(OF_env, nvr); |
764 | 97067eb5 | bellard | } |
765 | 97067eb5 | bellard | +#endif
|
766 | 97067eb5 | bellard | /* "/pseudo-hid" : hid emulation as Apple does */
|
767 | 97067eb5 | bellard | { |
768 | 97067eb5 | bellard | OF_node_t *hid; |
769 | 98352369 | bellard | @@ -1663,7 +1697,27 @@
|
770 | 97067eb5 | bellard | } |
771 | 97067eb5 | bellard | OF_node_put(OF_env, hid); |
772 | 97067eb5 | bellard | } |
773 | 97067eb5 | bellard | + if (arch == ARCH_MAC99) {
|
774 | 97067eb5 | bellard | + OF_node_t *unin;
|
775 | 97067eb5 | bellard | + OF_regprop_t regs;
|
776 | 97067eb5 | bellard | |
777 | 97067eb5 | bellard | + unin = OF_node_new(OF_env, OF_node_root,
|
778 | 97067eb5 | bellard | + "uni-n", 0xf8000000);
|
779 | 97067eb5 | bellard | + if (unin == NULL) {
|
780 | 97067eb5 | bellard | + ERROR("Cannot create 'uni-n'\n");
|
781 | 97067eb5 | bellard | + return -1;
|
782 | 97067eb5 | bellard | + }
|
783 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, unin, "device-type", "memory-controller");
|
784 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, unin, "model", "AAPL,UniNorth");
|
785 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, unin, "compatible", "uni-north");
|
786 | 97067eb5 | bellard | + regs.address = 0xf8000000;
|
787 | 97067eb5 | bellard | + regs.size = 0x01000000;
|
788 | 97067eb5 | bellard | + OF_property_new(OF_env, unin, "reg", ®s, sizeof(regs));
|
789 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, unin, "#address-cells", 1);
|
790 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, unin, "#size-cells", 1);
|
791 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, unin, "device-rev", 3);
|
792 | 97067eb5 | bellard | + OF_node_put(OF_env, unin);
|
793 | 97067eb5 | bellard | + }
|
794 | 97067eb5 | bellard | |
795 | 97067eb5 | bellard | #if 1 /* This is mandatory for claim to work |
796 | 97067eb5 | bellard | * but I don't know where it should really be (in cpu ?)
|
797 | 98352369 | bellard | @@ -1693,7 +1747,9 @@
|
798 | 97067eb5 | bellard | |
799 | 97067eb5 | bellard | /* "/options/boot-args" node */
|
800 | 97067eb5 | bellard | { |
801 | 97067eb5 | bellard | - const unsigned char *args = "-v rootdev cdrom";
|
802 | 97067eb5 | bellard | + // const unsigned char *args = "-v rootdev cdrom";
|
803 | 97067eb5 | bellard | + //const unsigned char *args = "-v io=0xffffffff";
|
804 | 97067eb5 | bellard | + const unsigned char *args = "-v";
|
805 | 97067eb5 | bellard | /* Ask MacOS X to print debug messages */
|
806 | 97067eb5 | bellard | // OF_prop_string_new(OF_env, chs, "machargs", args);
|
807 | 97067eb5 | bellard | // OF_prop_string_new(OF_env, opt, "boot-command", args);
|
808 | 98352369 | bellard | @@ -2013,17 +2069,17 @@
|
809 | 98352369 | bellard | OF_prop_int_new(OF_env, node, "min-grant", min_grant);
|
810 | 98352369 | bellard | OF_prop_int_new(OF_env, node, "max-latency", max_latency);
|
811 | 98352369 | bellard | if (dev->type != NULL) |
812 | 98352369 | bellard | - OF_prop_string_new(OF_env, node, "device_type", dev->type);
|
813 | 98352369 | bellard | + OF_prop_string_new1(OF_env, node, "device_type", dev->type);
|
814 | 98352369 | bellard | if (dev->compat != NULL) |
815 | 98352369 | bellard | - OF_prop_string_new(OF_env, node, "compatible", dev->compat);
|
816 | 98352369 | bellard | + OF_prop_string_new1(OF_env, node, "compatible", dev->compat);
|
817 | 98352369 | bellard | if (dev->model != NULL) |
818 | 98352369 | bellard | - OF_prop_string_new(OF_env, node, "model", dev->model);
|
819 | 98352369 | bellard | + OF_prop_string_new1(OF_env, node, "model", dev->model);
|
820 | 97067eb5 | bellard | if (dev->acells != 0) |
821 | 97067eb5 | bellard | OF_prop_int_new(OF_env, node, "#address-cells", dev->acells);
|
822 | 97067eb5 | bellard | if (dev->scells != 0) |
823 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, node, "#interrupt-cells", dev->acells);
|
824 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, node, "#size-cells", dev->scells);
|
825 | 97067eb5 | bellard | if (dev->icells != 0) |
826 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, node, "#size-cells", dev->acells);
|
827 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, node, "#interrupt-cells", dev->icells);
|
828 | 97067eb5 | bellard | dprintf("Done %p %p\n", parent, node);
|
829 | 97067eb5 | bellard | |
830 | 97067eb5 | bellard | return node;
|
831 | 98352369 | bellard | @@ -2040,8 +2096,9 @@
|
832 | 97067eb5 | bellard | OF_env_t *OF_env; |
833 | 97067eb5 | bellard | pci_range_t ranges[3];
|
834 | 97067eb5 | bellard | OF_regprop_t regs[1];
|
835 | 97067eb5 | bellard | - OF_node_t *pci_host;
|
836 | 97067eb5 | bellard | + OF_node_t *pci_host, *als;
|
837 | 97067eb5 | bellard | int nranges;
|
838 | 97067eb5 | bellard | + unsigned char buffer[OF_NAMELEN_MAX];
|
839 | 97067eb5 | bellard | |
840 | 97067eb5 | bellard | OF_env = OF_env_main; |
841 | 97067eb5 | bellard | dprintf("register PCI host '%s' '%s' '%s' '%s'\n",
|
842 | 98352369 | bellard | @@ -2052,6 +2109,17 @@
|
843 | 97067eb5 | bellard | ERROR("Cannot create pci host\n");
|
844 | 97067eb5 | bellard | return NULL; |
845 | 97067eb5 | bellard | } |
846 | 97067eb5 | bellard | +
|
847 | 97067eb5 | bellard | + als = OF_node_get(OF_env, "aliases");
|
848 | 97067eb5 | bellard | + if (als == NULL) {
|
849 | 97067eb5 | bellard | + ERROR("Cannot get 'aliases'\n");
|
850 | 97067eb5 | bellard | + return NULL;
|
851 | 97067eb5 | bellard | + }
|
852 | 97067eb5 | bellard | + sprintf(buffer, "/%s", dev->name);
|
853 | 97067eb5 | bellard | + OF_prop_string_set(OF_env, als, "pci", buffer);
|
854 | 97067eb5 | bellard | + OF_node_put(OF_env, als);
|
855 | 97067eb5 | bellard | +
|
856 | 97067eb5 | bellard | +
|
857 | 97067eb5 | bellard | regs[0].address = cfg_base;
|
858 | 97067eb5 | bellard | regs[0].size = cfg_len;
|
859 | 97067eb5 | bellard | OF_property_new(OF_env, pci_host, "reg", regs, sizeof(OF_regprop_t)); |
860 | 98352369 | bellard | @@ -2136,6 +2204,11 @@
|
861 | 97067eb5 | bellard | return pci_dev;
|
862 | 97067eb5 | bellard | } |
863 | 97067eb5 | bellard | |
864 | 97067eb5 | bellard | +/* XXX: suppress that, used for interrupt map init */
|
865 | 97067eb5 | bellard | +OF_node_t *pci_host_node;
|
866 | 97067eb5 | bellard | +uint32_t pci_host_interrupt_map[7 * 32];
|
867 | 97067eb5 | bellard | +int pci_host_interrupt_map_len = 0;
|
868 | 97067eb5 | bellard | +
|
869 | 97067eb5 | bellard | void OF_finalize_pci_host (void *dev, int first_bus, int nb_busses) |
870 | 97067eb5 | bellard | { |
871 | 97067eb5 | bellard | OF_env_t *OF_env; |
872 | 98352369 | bellard | @@ -2145,10 +2218,12 @@
|
873 | 97067eb5 | bellard | regs[0].address = first_bus;
|
874 | 97067eb5 | bellard | regs[0].size = nb_busses;
|
875 | 97067eb5 | bellard | OF_property_new(OF_env, dev, "bus-range", regs, sizeof(OF_regprop_t)); |
876 | 97067eb5 | bellard | + pci_host_node = dev;
|
877 | 97067eb5 | bellard | } |
878 | 97067eb5 | bellard | |
879 | 97067eb5 | bellard | void OF_finalize_pci_device (void *dev, uint8_t bus, uint8_t devfn, |
880 | 97067eb5 | bellard | - uint32_t *regions, uint32_t *sizes)
|
881 | 97067eb5 | bellard | + uint32_t *regions, uint32_t *sizes,
|
882 | 97067eb5 | bellard | + int irq_line)
|
883 | 97067eb5 | bellard | { |
884 | 97067eb5 | bellard | OF_env_t *OF_env; |
885 | 97067eb5 | bellard | pci_reg_prop_t pregs[6], rregs[6]; |
886 | 98352369 | bellard | @@ -2156,6 +2231,7 @@
|
887 | 97067eb5 | bellard | int i, j, k;
|
888 | 97067eb5 | bellard | |
889 | 97067eb5 | bellard | OF_env = OF_env_main; |
890 | 97067eb5 | bellard | + /* XXX: only useful for VGA card in fact */
|
891 | 97067eb5 | bellard | if (regions[0] != 0x00000000) |
892 | 97067eb5 | bellard | OF_prop_int_set(OF_env, dev, "address", regions[0] & ~0x0000000F); |
893 | 97067eb5 | bellard | for (i = 0, j = 0, k = 0; i < 6; i++) { |
894 | 98352369 | bellard | @@ -2222,7 +2298,22 @@
|
895 | 97067eb5 | bellard | } else {
|
896 | 97067eb5 | bellard | OF_property_new(OF_env, dev, "assigned-addresses", NULL, 0); |
897 | 97067eb5 | bellard | } |
898 | 97067eb5 | bellard | -#if 0
|
899 | 97067eb5 | bellard | + if (irq_line >= 0) {
|
900 | 97067eb5 | bellard | + int i;
|
901 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, dev, "interrupts", 1);
|
902 | 97067eb5 | bellard | + i = pci_host_interrupt_map_len;
|
903 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = (devfn << 8) & 0xf800;
|
904 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = 0;
|
905 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = 0;
|
906 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = 0;
|
907 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = 0; /* pic handle will be patched later */
|
908 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = irq_line;
|
909 | 97067eb5 | bellard | + if (arch != ARCH_HEATHROW) {
|
910 | 97067eb5 | bellard | + pci_host_interrupt_map[i++] = 1;
|
911 | 97067eb5 | bellard | + }
|
912 | 97067eb5 | bellard | + pci_host_interrupt_map_len = i;
|
913 | 97067eb5 | bellard | + }
|
914 | 97067eb5 | bellard | +#if 1
|
915 | 97067eb5 | bellard | { |
916 | 97067eb5 | bellard | OF_prop_t *prop_name = ((OF_node_t *)dev)->prop_name; |
917 | 97067eb5 | bellard | |
918 | 98352369 | bellard | @@ -2390,6 +2481,54 @@
|
919 | 97067eb5 | bellard | return 0; |
920 | 97067eb5 | bellard | } |
921 | 97067eb5 | bellard | |
922 | 97067eb5 | bellard | +static void keylargo_ata(OF_node_t *mio, uint32_t base_address,
|
923 | 97067eb5 | bellard | + uint32_t base, int irq1, int irq2,
|
924 | 97067eb5 | bellard | + uint16_t pic_phandle)
|
925 | 97067eb5 | bellard | +{
|
926 | 97067eb5 | bellard | + OF_env_t *OF_env = OF_env_main;
|
927 | 97067eb5 | bellard | + OF_node_t *ata;
|
928 | 97067eb5 | bellard | + OF_regprop_t regs[2];
|
929 | 97067eb5 | bellard | +
|
930 | 97067eb5 | bellard | + ata = OF_node_new(OF_env, mio, "ata-4", base);
|
931 | 97067eb5 | bellard | + if (ata == NULL) {
|
932 | 97067eb5 | bellard | + ERROR("Cannot create 'ata-4'\n");
|
933 | 97067eb5 | bellard | + return;
|
934 | 97067eb5 | bellard | + }
|
935 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "device_type", "ata");
|
936 | 97067eb5 | bellard | +#if 1
|
937 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "compatible", "key2largo-ata");
|
938 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
939 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "cable-type", "80-conductor");
|
940 | 97067eb5 | bellard | +#else
|
941 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");
|
942 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
943 | 97067eb5 | bellard | +#endif
|
944 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "#address-cells", 1);
|
945 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "#size-cells", 0);
|
946 | 97067eb5 | bellard | + regs[0].address = base;
|
947 | 97067eb5 | bellard | + regs[0].size = 0x00001000;
|
948 | 97067eb5 | bellard | +#if 0 // HACK: Don't set up DMA registers
|
949 | 97067eb5 | bellard | + regs[1].address = 0x00008A00;
|
950 | 97067eb5 | bellard | + regs[1].size = 0x00001000;
|
951 | 97067eb5 | bellard | + OF_property_new(OF_env, ata, "reg",
|
952 | 97067eb5 | bellard | + regs, 2 * sizeof(OF_regprop_t));
|
953 | 97067eb5 | bellard | +#else
|
954 | 97067eb5 | bellard | + OF_property_new(OF_env, ata, "reg",
|
955 | 97067eb5 | bellard | + regs, sizeof(OF_regprop_t));
|
956 | 97067eb5 | bellard | +#endif
|
957 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "interrupt-parent", pic_phandle);
|
958 | 97067eb5 | bellard | + regs[0].address = irq1;
|
959 | 97067eb5 | bellard | + regs[0].size = 0x00000001;
|
960 | 97067eb5 | bellard | + regs[1].address = irq2;
|
961 | 97067eb5 | bellard | + regs[1].size = 0x00000000;
|
962 | 97067eb5 | bellard | + OF_property_new(OF_env, ata, "interrupts",
|
963 | 97067eb5 | bellard | + regs, 2 * sizeof(OF_regprop_t));
|
964 | 97067eb5 | bellard | + if (base == 0x1f000)
|
965 | 97067eb5 | bellard | + ide_pci_pmac_register(base_address + base, 0x00000000, ata);
|
966 | 97067eb5 | bellard | + else
|
967 | 97067eb5 | bellard | + ide_pci_pmac_register(0x00000000, base_address + base, ata);
|
968 | 97067eb5 | bellard | +}
|
969 | 97067eb5 | bellard | +
|
970 | 97067eb5 | bellard | void OF_finalize_pci_macio (void *dev, uint32_t base_address, uint32_t size, |
971 | 97067eb5 | bellard | void *private_data)
|
972 | 97067eb5 | bellard | { |
973 | 98352369 | bellard | @@ -2398,6 +2537,8 @@
|
974 | 97067eb5 | bellard | pci_reg_prop_t pregs[2];
|
975 | 97067eb5 | bellard | OF_node_t *mio, *chs, *als; |
976 | 97067eb5 | bellard | uint16_t pic_phandle; |
977 | 97067eb5 | bellard | + int rec_len;
|
978 | 97067eb5 | bellard | + OF_prop_t *mio_reg;
|
979 | 97067eb5 | bellard | |
980 | 97067eb5 | bellard | OF_DPRINTF("mac-io: %p\n", dev);
|
981 | 97067eb5 | bellard | OF_env = OF_env_main; |
982 | 98352369 | bellard | @@ -2416,10 +2557,14 @@
|
983 | 97067eb5 | bellard | mio = dev; |
984 | 97067eb5 | bellard | mio->private_data = private_data; |
985 | 97067eb5 | bellard | pregs[0].addr.hi = 0x00000000; |
986 | 97067eb5 | bellard | - pregs[0].addr.mid = 0x82013810;
|
987 | 97067eb5 | bellard | + pregs[0].addr.mid = 0x00000000;
|
988 | 97067eb5 | bellard | pregs[0].addr.lo = 0x00000000; |
989 | 97067eb5 | bellard | pregs[0].size_hi = base_address;
|
990 | 97067eb5 | bellard | pregs[0].size_lo = size;
|
991 | 97067eb5 | bellard | + mio_reg = OF_property_get(OF_env, mio, "reg");
|
992 | 97067eb5 | bellard | + if (mio_reg && mio_reg->vlen >= 5 * 4) {
|
993 | 97067eb5 | bellard | + pregs[0].addr.mid = ((pci_reg_prop_t *)mio_reg->value)->addr.hi;
|
994 | 97067eb5 | bellard | + }
|
995 | 97067eb5 | bellard | OF_property_new(OF_env, mio, "ranges",
|
996 | 97067eb5 | bellard | &pregs, sizeof(pci_reg_prop_t));
|
997 | 97067eb5 | bellard | #if 0
|
998 | 98352369 | bellard | @@ -2431,8 +2576,32 @@
|
999 | 97067eb5 | bellard | OF_property_new(OF_env, mio, "assigned-addresses",
|
1000 | 97067eb5 | bellard | &pregs, sizeof(pci_reg_prop_t));
|
1001 | 97067eb5 | bellard | #endif
|
1002 | 97067eb5 | bellard | +
|
1003 | 97067eb5 | bellard | + if (arch == ARCH_HEATHROW) {
|
1004 | 97067eb5 | bellard | + /* Heathrow PIC */
|
1005 | 97067eb5 | bellard | + OF_regprop_t regs;
|
1006 | 97067eb5 | bellard | + OF_node_t *mpic;
|
1007 | 97067eb5 | bellard | + const char compat_str[] = "heathrow\0mac-risc";
|
1008 | 97067eb5 | bellard | +
|
1009 | 97067eb5 | bellard | + mpic = OF_node_new(OF_env, mio, "interrupt-controller", 0x10);
|
1010 | 97067eb5 | bellard | + if (mpic == NULL) {
|
1011 | 97067eb5 | bellard | + ERROR("Cannot create 'mpic'\n");
|
1012 | 97067eb5 | bellard | + goto out;
|
1013 | 97067eb5 | bellard | + }
|
1014 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, mpic, "device_type", "interrupt-controller");
|
1015 | 97067eb5 | bellard | + OF_property_new(OF_env, mpic, "compatible", compat_str, sizeof(compat_str));
|
1016 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, mpic, "#interrupt-cells", 1);
|
1017 | 97067eb5 | bellard | + regs.address = 0x10;
|
1018 | 97067eb5 | bellard | + regs.size = 0x20;
|
1019 | 97067eb5 | bellard | + OF_property_new(OF_env, mpic, "reg",
|
1020 | 97067eb5 | bellard | + ®s, sizeof(regs));
|
1021 | 97067eb5 | bellard | + OF_property_new(OF_env, mpic, "interrupt-controller", NULL, 0);
|
1022 | 97067eb5 | bellard | + pic_phandle = OF_pack_handle(OF_env, mpic);
|
1023 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, chs, "interrupt-controller", pic_phandle);
|
1024 | 97067eb5 | bellard | + OF_node_put(OF_env, mpic);
|
1025 | 97067eb5 | bellard | + rec_len = 6;
|
1026 | 97067eb5 | bellard | + } else {
|
1027 | 98352369 | bellard | /* OpenPIC */
|
1028 | 98352369 | bellard | - {
|
1029 | 97067eb5 | bellard | OF_regprop_t regs[4];
|
1030 | 97067eb5 | bellard | OF_node_t *mpic; |
1031 | 97067eb5 | bellard | mpic = OF_node_new(OF_env, mio, "interrupt-controller", 0x40000); |
1032 | 98352369 | bellard | @@ -2455,8 +2624,37 @@
|
1033 | 97067eb5 | bellard | pic_phandle = OF_pack_handle(OF_env, mpic); |
1034 | 97067eb5 | bellard | OF_prop_int_new(OF_env, chs, "interrupt-controller", pic_phandle);
|
1035 | 97067eb5 | bellard | OF_node_put(OF_env, mpic); |
1036 | 97067eb5 | bellard | + rec_len = 7;
|
1037 | 97067eb5 | bellard | } |
1038 | 97067eb5 | bellard | -#if 1
|
1039 | 97067eb5 | bellard | +
|
1040 | 97067eb5 | bellard | + /* patch pci host table */
|
1041 | 97067eb5 | bellard | + /* XXX: do it after the PCI init */
|
1042 | 97067eb5 | bellard | + {
|
1043 | 97067eb5 | bellard | + int i;
|
1044 | 97067eb5 | bellard | + uint32_t tab[4];
|
1045 | 97067eb5 | bellard | +
|
1046 | 97067eb5 | bellard | + for(i = 0; i < pci_host_interrupt_map_len; i += rec_len)
|
1047 | 97067eb5 | bellard | + pci_host_interrupt_map[i + 4] = pic_phandle;
|
1048 | 97067eb5 | bellard | +#if 0
|
1049 | 97067eb5 | bellard | + dprintf("interrupt-map:\n");
|
1050 | 97067eb5 | bellard | + for(i = 0; i < pci_host_interrupt_map_len; i++) {
|
1051 | 97067eb5 | bellard | + dprintf(" %08x", pci_host_interrupt_map[i]);
|
1052 | 97067eb5 | bellard | + if ((i % rec_len) == (rec_len - 1))
|
1053 | 97067eb5 | bellard | + dprintf("\n");
|
1054 | 97067eb5 | bellard | + }
|
1055 | 97067eb5 | bellard | + dprintf("\n");
|
1056 | 97067eb5 | bellard | +#endif
|
1057 | 97067eb5 | bellard | + OF_property_new(OF_env, pci_host_node, "interrupt-map",
|
1058 | 97067eb5 | bellard | + pci_host_interrupt_map,
|
1059 | 97067eb5 | bellard | + pci_host_interrupt_map_len * sizeof(uint32_t));
|
1060 | 97067eb5 | bellard | + tab[0] = 0xf800;
|
1061 | 97067eb5 | bellard | + tab[1] = 0;
|
1062 | 97067eb5 | bellard | + tab[2] = 0;
|
1063 | 97067eb5 | bellard | + tab[3] = 0;
|
1064 | 97067eb5 | bellard | + OF_property_new(OF_env, pci_host_node, "interrupt-map-mask",
|
1065 | 97067eb5 | bellard | + tab, 4 * sizeof(uint32_t));
|
1066 | 97067eb5 | bellard | + }
|
1067 | 97067eb5 | bellard | +#if 0
|
1068 | 97067eb5 | bellard | /* escc is usefull to get MacOS X debug messages */
|
1069 | 97067eb5 | bellard | { |
1070 | 97067eb5 | bellard | OF_regprop_t regs[8];
|
1071 | 98352369 | bellard | @@ -2645,85 +2843,12 @@
|
1072 | 97067eb5 | bellard | OF_node_put(OF_env, scc); |
1073 | 97067eb5 | bellard | } |
1074 | 97067eb5 | bellard | #endif
|
1075 | 97067eb5 | bellard | - /* IDE controller */
|
1076 | 97067eb5 | bellard | - {
|
1077 | 97067eb5 | bellard | - OF_node_t *ata;
|
1078 | 97067eb5 | bellard | - OF_regprop_t regs[2];
|
1079 | 97067eb5 | bellard | - ata = OF_node_new(OF_env, mio, "ata-4", 0x1f000);
|
1080 | 97067eb5 | bellard | - if (ata == NULL) {
|
1081 | 97067eb5 | bellard | - ERROR("Cannot create 'ata-4'\n");
|
1082 | 97067eb5 | bellard | - goto out;
|
1083 | 97067eb5 | bellard | - }
|
1084 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "device_type", "ata");
|
1085 | 97067eb5 | bellard | -#if 1
|
1086 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "compatible", "keylargo-ata");
|
1087 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
1088 | 97067eb5 | bellard | -#else
|
1089 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");
|
1090 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
1091 | 97067eb5 | bellard | -#endif
|
1092 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "#address-cells", 1);
|
1093 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "#size-cells", 0);
|
1094 | 97067eb5 | bellard | - regs[0].address = 0x0001F000;
|
1095 | 97067eb5 | bellard | - regs[0].size = 0x00001000;
|
1096 | 97067eb5 | bellard | -#if 0 // HACK: Don't set up DMA registers
|
1097 | 97067eb5 | bellard | - regs[1].address = 0x00008A00;
|
1098 | 97067eb5 | bellard | - regs[1].size = 0x00001000;
|
1099 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "reg",
|
1100 | 97067eb5 | bellard | - regs, 2 * sizeof(OF_regprop_t));
|
1101 | 97067eb5 | bellard | -#else
|
1102 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "reg",
|
1103 | 97067eb5 | bellard | - regs, sizeof(OF_regprop_t));
|
1104 | 97067eb5 | bellard | -#endif
|
1105 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "interrupt-parent", pic_phandle);
|
1106 | 97067eb5 | bellard | - regs[0].address = 0x00000013;
|
1107 | 97067eb5 | bellard | - regs[0].size = 0x00000001;
|
1108 | 97067eb5 | bellard | - regs[1].address = 0x0000000B;
|
1109 | 97067eb5 | bellard | - regs[1].size = 0x00000000;
|
1110 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "interrupts",
|
1111 | 97067eb5 | bellard | - regs, 2 * sizeof(OF_regprop_t));
|
1112 | 97067eb5 | bellard | - ide_pci_pmac_register(base_address + 0x1f000, 0x00000000, ata);
|
1113 | 97067eb5 | bellard | -
|
1114 | 97067eb5 | bellard | - }
|
1115 | 97067eb5 | bellard | - {
|
1116 | 97067eb5 | bellard | - OF_node_t *ata;
|
1117 | 97067eb5 | bellard | - OF_regprop_t regs[2];
|
1118 | 97067eb5 | bellard | - ata = OF_node_new(OF_env, mio, "ata-4", 0x20000);
|
1119 | 97067eb5 | bellard | - if (ata == NULL) {
|
1120 | 97067eb5 | bellard | - ERROR("Cannot create 'ata-4'\n");
|
1121 | 97067eb5 | bellard | - goto out;
|
1122 | 97067eb5 | bellard | - }
|
1123 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "device_type", "ata");
|
1124 | 97067eb5 | bellard | -#if 1
|
1125 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "compatible", "keylargo-ata");
|
1126 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
1127 | 97067eb5 | bellard | -#else
|
1128 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");
|
1129 | 97067eb5 | bellard | - OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
1130 | 97067eb5 | bellard | -#endif
|
1131 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "#address-cells", 1);
|
1132 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "#size-cells", 0);
|
1133 | 97067eb5 | bellard | - regs[0].address = 0x00020000;
|
1134 | 97067eb5 | bellard | - regs[0].size = 0x00001000;
|
1135 | 97067eb5 | bellard | -#if 0 // HACK: Don't set up DMA registers
|
1136 | 97067eb5 | bellard | - regs[1].address = 0x00008A00;
|
1137 | 97067eb5 | bellard | - regs[1].size = 0x00001000;
|
1138 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "reg",
|
1139 | 97067eb5 | bellard | - regs, 2 * sizeof(OF_regprop_t));
|
1140 | 97067eb5 | bellard | -#else
|
1141 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "reg",
|
1142 | 97067eb5 | bellard | - regs, sizeof(OF_regprop_t));
|
1143 | 97067eb5 | bellard | -#endif
|
1144 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, ata, "interrupt-parent", pic_phandle);
|
1145 | 97067eb5 | bellard | - regs[0].address = 0x00000014;
|
1146 | 97067eb5 | bellard | - regs[0].size = 0x00000001;
|
1147 | 97067eb5 | bellard | - regs[1].address = 0x0000000B;
|
1148 | 97067eb5 | bellard | - regs[1].size = 0x00000000;
|
1149 | 97067eb5 | bellard | - OF_property_new(OF_env, ata, "interrupts",
|
1150 | 97067eb5 | bellard | - regs, 2 * sizeof(OF_regprop_t));
|
1151 | 97067eb5 | bellard | - ide_pci_pmac_register(0x00000000, base_address + 0x20000, ata);
|
1152 | 97067eb5 | bellard | -
|
1153 | 97067eb5 | bellard | + /* Keylargo IDE controller: need some work (DMA problem ?) */
|
1154 | 97067eb5 | bellard | + if (arch == ARCH_MAC99) {
|
1155 | 97067eb5 | bellard | + keylargo_ata(mio, base_address, 0x1f000, 0x13, 0xb, pic_phandle);
|
1156 | 97067eb5 | bellard | + keylargo_ata(mio, base_address, 0x20000, 0x14, 0xb, pic_phandle);
|
1157 | 97067eb5 | bellard | } |
1158 | 97067eb5 | bellard | +#if 0
|
1159 | 97067eb5 | bellard | /* Timer */
|
1160 | 97067eb5 | bellard | { |
1161 | 97067eb5 | bellard | OF_node_t *tmr; |
1162 | 98352369 | bellard | @@ -2746,10 +2871,11 @@
|
1163 | 97067eb5 | bellard | regs, sizeof(OF_regprop_t));
|
1164 | 97067eb5 | bellard | OF_node_put(OF_env, tmr); |
1165 | 97067eb5 | bellard | } |
1166 | 97067eb5 | bellard | +#endif
|
1167 | 97067eb5 | bellard | /* VIA-PMU */
|
1168 | 97067eb5 | bellard | { |
1169 | 97067eb5 | bellard | /* Controls adb, RTC and power-mgt (forget it !) */
|
1170 | 97067eb5 | bellard | - OF_node_t *via, *adb, *rtc;
|
1171 | 97067eb5 | bellard | + OF_node_t *via, *adb;
|
1172 | 97067eb5 | bellard | OF_regprop_t regs[1];
|
1173 | 97067eb5 | bellard | #if 0 // THIS IS A HACK AND IS COMPLETELY ABSURD !
|
1174 | 97067eb5 | bellard | // (but needed has Qemu doesn't emulate via-pmu).
|
1175 | 98352369 | bellard | @@ -2773,14 +2899,21 @@
|
1176 | 97067eb5 | bellard | regs[0].size = 0x00002000; |
1177 | 97067eb5 | bellard | OF_property_new(OF_env, via, "reg", regs, sizeof(OF_regprop_t)); |
1178 | 97067eb5 | bellard | OF_prop_int_new(OF_env, via, "interrupt-parent", pic_phandle);
|
1179 | 97067eb5 | bellard | + if (arch == ARCH_HEATHROW) {
|
1180 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, via, "interrupts", 0x12);
|
1181 | 97067eb5 | bellard | + } else {
|
1182 | 97067eb5 | bellard | regs[0].address = 0x00000019; |
1183 | 97067eb5 | bellard | regs[0].size = 0x00000001; |
1184 | 97067eb5 | bellard | OF_property_new(OF_env, via, "interrupts",
|
1185 | 97067eb5 | bellard | regs, sizeof(OF_regprop_t));
|
1186 | 97067eb5 | bellard | + }
|
1187 | 97067eb5 | bellard | + /* force usage of OF bus speeds */
|
1188 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, via, "BusSpeedCorrect", 1);
|
1189 | 97067eb5 | bellard | #if 0
|
1190 | 97067eb5 | bellard | OF_prop_int_new(OF_env, via, "pmu-version", 0x00D0740C); |
1191 | 97067eb5 | bellard | #endif
|
1192 | 97067eb5 | bellard | -#if 1
|
1193 | 97067eb5 | bellard | + {
|
1194 | 97067eb5 | bellard | + OF_node_t *kbd, *mouse;
|
1195 | 97067eb5 | bellard | /* ADB pseudo-device */
|
1196 | 97067eb5 | bellard | adb = OF_node_new(OF_env, via, "adb", OF_ADDRESS_NONE);
|
1197 | 97067eb5 | bellard | if (adb == NULL) { |
1198 | 98352369 | bellard | @@ -2797,9 +2930,26 @@
|
1199 | 97067eb5 | bellard | OF_prop_int_new(OF_env, adb, "#size-cells", 0); |
1200 | 97067eb5 | bellard | OF_pack_get_path(OF_env, tmp, 512, adb);
|
1201 | 97067eb5 | bellard | OF_prop_string_new(OF_env, als, "adb", tmp);
|
1202 | 97067eb5 | bellard | - /* XXX: add "keyboard@2" and "mouse@3" */
|
1203 | 97067eb5 | bellard | - OF_node_put(OF_env, adb);
|
1204 | 97067eb5 | bellard | -#endif
|
1205 | 97067eb5 | bellard | +
|
1206 | 97067eb5 | bellard | + kbd = OF_node_new(OF_env, adb, "keyboard", 2);
|
1207 | 97067eb5 | bellard | + if (kbd == NULL) {
|
1208 | 97067eb5 | bellard | + ERROR("Cannot create 'kbd'\n");
|
1209 | 97067eb5 | bellard | + goto out;
|
1210 | 97067eb5 | bellard | + }
|
1211 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, kbd, "device_type", "keyboard");
|
1212 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, kbd, "reg", 2);
|
1213 | 97067eb5 | bellard | +
|
1214 | 97067eb5 | bellard | + mouse = OF_node_new(OF_env, adb, "mouse", 3);
|
1215 | 97067eb5 | bellard | + if (mouse == NULL) {
|
1216 | 97067eb5 | bellard | + ERROR("Cannot create 'mouse'\n");
|
1217 | 97067eb5 | bellard | + goto out;
|
1218 | 97067eb5 | bellard | + }
|
1219 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, mouse, "device_type", "mouse");
|
1220 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, mouse, "reg", 3);
|
1221 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, mouse, "#buttons", 3);
|
1222 | 97067eb5 | bellard | + }
|
1223 | 97067eb5 | bellard | + {
|
1224 | 97067eb5 | bellard | + OF_node_t *rtc;
|
1225 | 97067eb5 | bellard | |
1226 | 97067eb5 | bellard | rtc = OF_node_new(OF_env, via, "rtc", OF_ADDRESS_NONE);
|
1227 | 97067eb5 | bellard | if (rtc == NULL) { |
1228 | 98352369 | bellard | @@ -2813,14 +2963,68 @@
|
1229 | 97067eb5 | bellard | OF_prop_string_new(OF_env, rtc, "compatible", "rtc"); |
1230 | 97067eb5 | bellard | #endif
|
1231 | 97067eb5 | bellard | OF_node_put(OF_env, rtc); |
1232 | 97067eb5 | bellard | - OF_node_put(OF_env, via);
|
1233 | 97067eb5 | bellard | } |
1234 | 97067eb5 | bellard | + // OF_node_put(OF_env, via);
|
1235 | 97067eb5 | bellard | + }
|
1236 | 97067eb5 | bellard | + {
|
1237 | 97067eb5 | bellard | + OF_node_t *pmgt;
|
1238 | 97067eb5 | bellard | + pmgt = OF_node_new(OF_env, mio, "power-mgt", OF_ADDRESS_NONE);
|
1239 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, pmgt, "device_type", "power-mgt");
|
1240 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, pmgt, "compatible", "cuda");
|
1241 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, pmgt, "mgt-kind", "min-consumption-pwm-led");
|
1242 | 97067eb5 | bellard | + OF_node_put(OF_env, pmgt);
|
1243 | 97067eb5 | bellard | + }
|
1244 | 97067eb5 | bellard | +
|
1245 | 98352369 | bellard | + if (arch == ARCH_HEATHROW) {
|
1246 | 98352369 | bellard | + /* NVRAM */
|
1247 | 98352369 | bellard | + OF_node_t *nvr;
|
1248 | 98352369 | bellard | + OF_regprop_t regs;
|
1249 | 98352369 | bellard | + nvr = OF_node_new(OF_env, mio, "nvram", 0x60000);
|
1250 | 98352369 | bellard | + OF_prop_string_new(OF_env, nvr, "device_type", "nvram");
|
1251 | 98352369 | bellard | + regs.address = 0x60000;
|
1252 | 98352369 | bellard | + regs.size = 0x00020000;
|
1253 | 98352369 | bellard | + OF_property_new(OF_env, nvr, "reg", ®s, sizeof(regs));
|
1254 | 98352369 | bellard | + OF_prop_int_new(OF_env, nvr, "#bytes", 0x2000);
|
1255 | 98352369 | bellard | + OF_node_put(OF_env, nvr);
|
1256 | 98352369 | bellard | + }
|
1257 | 98352369 | bellard | +
|
1258 | 97067eb5 | bellard | out:
|
1259 | 97067eb5 | bellard | // OF_node_put(OF_env, mio);
|
1260 | 97067eb5 | bellard | OF_node_put(OF_env, chs); |
1261 | 97067eb5 | bellard | OF_node_put(OF_env, als); |
1262 | 97067eb5 | bellard | } |
1263 | 97067eb5 | bellard | |
1264 | 97067eb5 | bellard | +void OF_finalize_pci_ide (void *dev,
|
1265 | 97067eb5 | bellard | + uint32_t io_base0, uint32_t io_base1,
|
1266 | 97067eb5 | bellard | + uint32_t io_base2, uint32_t io_base3)
|
1267 | 97067eb5 | bellard | +{
|
1268 | 97067eb5 | bellard | + OF_env_t *OF_env = OF_env_main;
|
1269 | 97067eb5 | bellard | + OF_node_t *pci_ata = dev;
|
1270 | 97067eb5 | bellard | + OF_node_t *ata, *atas[2];
|
1271 | 97067eb5 | bellard | + int i;
|
1272 | 97067eb5 | bellard | +
|
1273 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, pci_ata, "#address-cells", 1);
|
1274 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, pci_ata, "#size-cells", 0);
|
1275 | 97067eb5 | bellard | +
|
1276 | 97067eb5 | bellard | + /* XXX: Darwin handles only one device */
|
1277 | 97067eb5 | bellard | + for(i = 0; i < 1; i++) {
|
1278 | 97067eb5 | bellard | + ata = OF_node_new(OF_env, pci_ata, "ata-4", i);
|
1279 | 97067eb5 | bellard | + if (ata == NULL) {
|
1280 | 97067eb5 | bellard | + ERROR("Cannot create 'ata-4'\n");
|
1281 | 97067eb5 | bellard | + return;
|
1282 | 97067eb5 | bellard | + }
|
1283 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "device_type", "ata");
|
1284 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");
|
1285 | 97067eb5 | bellard | + OF_prop_string_new(OF_env, ata, "model", "ata-4");
|
1286 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "#address-cells", 1);
|
1287 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "#size-cells", 0);
|
1288 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, ata, "reg", i);
|
1289 | 97067eb5 | bellard | + atas[i] = ata;
|
1290 | 97067eb5 | bellard | + }
|
1291 | 97067eb5 | bellard | + ide_pci_pc_register(io_base0, io_base1, io_base2, io_base3,
|
1292 | 97067eb5 | bellard | + atas[0], atas[1]);
|
1293 | 97067eb5 | bellard | +}
|
1294 | 97067eb5 | bellard | +
|
1295 | 97067eb5 | bellard | /*****************************************************************************/
|
1296 | 97067eb5 | bellard | /* Fake package */
|
1297 | 97067eb5 | bellard | static void OF_method_fake (OF_env_t *OF_env) |
1298 | 98352369 | bellard | @@ -2862,11 +3066,11 @@
|
1299 | 97067eb5 | bellard | /* As we get a 1:1 mapping, do nothing */
|
1300 | 97067eb5 | bellard | ihandle = popd(OF_env); |
1301 | 97067eb5 | bellard | args = (void *)popd(OF_env);
|
1302 | 97067eb5 | bellard | - address = popd(OF_env);
|
1303 | 97067eb5 | bellard | - virt = popd(OF_env);
|
1304 | 97067eb5 | bellard | - size = popd(OF_env);
|
1305 | 97067eb5 | bellard | popd(OF_env); |
1306 | 97067eb5 | bellard | - OF_DPRINTF("Translate address %0x %0x %0x %0x\n", ihandle, address,
|
1307 | 97067eb5 | bellard | + size = popd(OF_env);
|
1308 | 97067eb5 | bellard | + virt = popd(OF_env);
|
1309 | 97067eb5 | bellard | + address = popd(OF_env);
|
1310 | 98352369 | bellard | + OF_DPRINTF("Map %0x %0x %0x %0x\n", ihandle, address,
|
1311 | 97067eb5 | bellard | virt, size); |
1312 | 97067eb5 | bellard | pushd(OF_env, 0);
|
1313 | 97067eb5 | bellard | } |
1314 | 98352369 | bellard | @@ -3270,7 +3474,7 @@
|
1315 | 97067eb5 | bellard | OF_prop_string_new(OF_env, dsk, "device_type", "block"); |
1316 | 97067eb5 | bellard | OF_prop_string_new(OF_env, dsk, "category", type);
|
1317 | 97067eb5 | bellard | OF_prop_int_new(OF_env, dsk, "device_id", devnum);
|
1318 | 97067eb5 | bellard | - OF_prop_int_new(OF_env, dsk, "reg", 0);
|
1319 | 97067eb5 | bellard | + OF_prop_int_new(OF_env, dsk, "reg", devnum);
|
1320 | 97067eb5 | bellard | OF_method_new(OF_env, dsk, "open", &OF_blockdev_open);
|
1321 | 97067eb5 | bellard | OF_method_new(OF_env, dsk, "seek", &OF_blockdev_seek);
|
1322 | 97067eb5 | bellard | OF_method_new(OF_env, dsk, "read", &OF_blockdev_read);
|
1323 | 98352369 | bellard | @@ -3432,7 +3636,8 @@
|
1324 | 97067eb5 | bellard | } |
1325 | 97067eb5 | bellard | |
1326 | 97067eb5 | bellard | void OF_vga_register (const unsigned char *name, unused uint32_t address, |
1327 | 97067eb5 | bellard | - int width, int height, int depth)
|
1328 | 97067eb5 | bellard | + int width, int height, int depth,
|
1329 | 97067eb5 | bellard | + unsigned long vga_bios_addr, unsigned long vga_bios_size)
|
1330 | 97067eb5 | bellard | { |
1331 | 97067eb5 | bellard | OF_env_t *OF_env; |
1332 | 97067eb5 | bellard | unsigned char tmp[OF_NAMELEN_MAX]; |
1333 | 98352369 | bellard | @@ -3504,6 +3709,18 @@
|
1334 | 97067eb5 | bellard | OF_prop_string_new(OF_env, als, "display", tmp);
|
1335 | 97067eb5 | bellard | OF_node_put(OF_env, als); |
1336 | 97067eb5 | bellard | /* XXX: may also need read-rectangle */
|
1337 | 97067eb5 | bellard | +
|
1338 | 97067eb5 | bellard | + if (vga_bios_size >= 8) {
|
1339 | 97067eb5 | bellard | + const uint8_t *p;
|
1340 | 97067eb5 | bellard | + int size;
|
1341 | 97067eb5 | bellard | + /* check the QEMU VGA BIOS header */
|
1342 | 97067eb5 | bellard | + p = (const uint8_t *)vga_bios_addr;
|
1343 | 97067eb5 | bellard | + if (p[0] == 'N' && p[1] == 'D' && p[2] == 'R' && p[3] == 'V') {
|
1344 | 97067eb5 | bellard | + size = *(uint32_t *)(p + 4);
|
1345 | 97067eb5 | bellard | + OF_property_new(OF_env, disp, "driver,AAPL,MacOS,PowerPC",
|
1346 | 97067eb5 | bellard | + p + 8, size);
|
1347 | 97067eb5 | bellard | + }
|
1348 | 97067eb5 | bellard | + }
|
1349 | 97067eb5 | bellard | out:
|
1350 | 97067eb5 | bellard | OF_node_put(OF_env, disp); |
1351 | 97067eb5 | bellard | } |
1352 | 98352369 | bellard | @@ -4451,7 +4668,10 @@
|
1353 | 97067eb5 | bellard | break;
|
1354 | 97067eb5 | bellard | case 0x233441d3: /* MacOS X 10.2 and OpenDarwin 1.41 */ |
1355 | 97067eb5 | bellard | /* Create "memory-map" pseudo device */
|
1356 | 97067eb5 | bellard | - popd(OF_env);
|
1357 | 97067eb5 | bellard | + {
|
1358 | 97067eb5 | bellard | + OF_node_t *map;
|
1359 | 97067eb5 | bellard | + uint32_t phandle;
|
1360 | 97067eb5 | bellard | +
|
1361 | 97067eb5 | bellard | /* Find "/packages" */
|
1362 | 97067eb5 | bellard | chs = OF_pack_find_by_name(OF_env, OF_node_root, "/chosen");
|
1363 | 97067eb5 | bellard | if (chs == NULL) { |
1364 | 98352369 | bellard | @@ -4459,10 +4679,6 @@
|
1365 | 97067eb5 | bellard | ERROR("Cannot get '/chosen'\n");
|
1366 | 97067eb5 | bellard | break;
|
1367 | 97067eb5 | bellard | } |
1368 | 97067eb5 | bellard | - {
|
1369 | 97067eb5 | bellard | -#if 1
|
1370 | 97067eb5 | bellard | - OF_node_t *map;
|
1371 | 97067eb5 | bellard | - uint32_t phandle;
|
1372 | 97067eb5 | bellard | map = OF_node_new(OF_env, chs, "memory-map", OF_ADDRESS_NONE);
|
1373 | 97067eb5 | bellard | if (map == NULL) { |
1374 | 97067eb5 | bellard | pushd(OF_env, -1);
|
1375 | 98352369 | bellard | @@ -4473,11 +4689,8 @@
|
1376 | 97067eb5 | bellard | OF_node_put(OF_env, map); |
1377 | 97067eb5 | bellard | OF_node_put(OF_env, chs); |
1378 | 97067eb5 | bellard | pushd(OF_env, phandle); |
1379 | 97067eb5 | bellard | - }
|
1380 | 97067eb5 | bellard | -#else
|
1381 | 97067eb5 | bellard | - pushd(OF_env, 0);
|
1382 | 97067eb5 | bellard | -#endif
|
1383 | 97067eb5 | bellard | pushd(OF_env, 0);
|
1384 | 97067eb5 | bellard | + }
|
1385 | 97067eb5 | bellard | break;
|
1386 | 97067eb5 | bellard | case 0x32a2d18e: /* MacOS X 10.2 and OpenDarwin 6.02 */ |
1387 | 97067eb5 | bellard | /* Return screen ihandle */
|
1388 | 98352369 | bellard | @@ -4540,9 +4753,10 @@
|
1389 | 97067eb5 | bellard | case 0x4ad41f2d: |
1390 | 97067eb5 | bellard | /* Yaboot: wait 10 ms: sure ! */
|
1391 | 97067eb5 | bellard | break;
|
1392 | 97067eb5 | bellard | +
|
1393 | 97067eb5 | bellard | default:
|
1394 | 97067eb5 | bellard | /* ERROR */
|
1395 | 97067eb5 | bellard | - printf("Script:\n%s\n", FString);
|
1396 | 97067eb5 | bellard | + printf("Script: len=%d\n%s\n", (int)strlen(FString), FString);
|
1397 | 97067eb5 | bellard | printf("Call %0x NOT IMPLEMENTED !\n", crc);
|
1398 | 97067eb5 | bellard | bug(); |
1399 | 97067eb5 | bellard | break;
|
1400 | 98352369 | bellard | @@ -4581,6 +4795,7 @@
|
1401 | 98352369 | bellard | { |
1402 | 98352369 | bellard | OF_CHECK_NBARGS(OF_env, 0);
|
1403 | 98352369 | bellard | /* Should free all OF resources */
|
1404 | 98352369 | bellard | + bd_reset_all();
|
1405 | 98352369 | bellard | #if defined (DEBUG_BIOS)
|
1406 | 98352369 | bellard | { |
1407 | 98352369 | bellard | uint16_t loglevel = 0x02 | 0x10 | 0x80; |
1408 | 97067eb5 | bellard | diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/pci.c OpenHackWare-release-0.4/src/pci.c
|
1409 | 97067eb5 | bellard | --- OpenHackWare-release-0.4.org/src/pci.c 2005-03-31 09:23:33.000000000 +0200
|
1410 | 98352369 | bellard | +++ OpenHackWare-release-0.4/src/pci.c 2005-07-07 23:27:37.000000000 +0200
|
1411 | 97067eb5 | bellard | @@ -99,8 +99,8 @@
|
1412 | 97067eb5 | bellard | uint16_t min_grant; |
1413 | 97067eb5 | bellard | uint16_t max_latency; |
1414 | 97067eb5 | bellard | uint8_t irq_line; |
1415 | 97067eb5 | bellard | - uint32_t regions[6];
|
1416 | 97067eb5 | bellard | - uint32_t sizes[6];
|
1417 | 97067eb5 | bellard | + uint32_t regions[7]; /* the region 6 is the PCI ROM */
|
1418 | 97067eb5 | bellard | + uint32_t sizes[7];
|
1419 | 97067eb5 | bellard | pci_device_t *next; |
1420 | 97067eb5 | bellard | }; |
1421 | 97067eb5 | bellard | |
1422 | 97067eb5 | bellard | @@ -158,6 +158,7 @@
|
1423 | 97067eb5 | bellard | |
1424 | 97067eb5 | bellard | /* IRQ numbers assigned to PCI IRQs */
|
1425 | 97067eb5 | bellard | static uint8_t prep_pci_irqs[4] = { 9, 11, 9, 11 }; |
1426 | 97067eb5 | bellard | +static uint8_t heathrow_pci_irqs[4] = { 0x15, 0x16, 0x17, 0x18 };
|
1427 | 97067eb5 | bellard | static uint8_t pmac_pci_irqs[4] = { 8, 9, 10, 11 }; |
1428 | 97067eb5 | bellard | |
1429 | 97067eb5 | bellard | /* PREP PCI host */
|
1430 | 97067eb5 | bellard | @@ -399,6 +400,79 @@
|
1431 | 97067eb5 | bellard | &uninorth_config_readl, &uninorth_config_writel, |
1432 | 97067eb5 | bellard | }; |
1433 | 97067eb5 | bellard | |
1434 | 97067eb5 | bellard | +/* Grackle PCI host */
|
1435 | 97067eb5 | bellard | +
|
1436 | 97067eb5 | bellard | +static uint32_t grackle_cfg_address (pci_bridge_t *bridge,
|
1437 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1438 | 97067eb5 | bellard | + uint8_t offset)
|
1439 | 97067eb5 | bellard | +{
|
1440 | 97067eb5 | bellard | + uint32_t addr;
|
1441 | 97067eb5 | bellard | + addr = 0x80000000 | (bus << 16) | (devfn << 8) | (offset & 0xfc);
|
1442 | 97067eb5 | bellard | + stswap32((uint32_t *)bridge->cfg_addr, addr);
|
1443 | 97067eb5 | bellard | + return bridge->cfg_data + (offset & 3);
|
1444 | 97067eb5 | bellard | +}
|
1445 | 97067eb5 | bellard | +
|
1446 | 97067eb5 | bellard | +static uint8_t grackle_config_readb (pci_bridge_t *bridge,
|
1447 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1448 | 97067eb5 | bellard | + uint8_t offset)
|
1449 | 97067eb5 | bellard | +{
|
1450 | 97067eb5 | bellard | + uint32_t addr;
|
1451 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1452 | 97067eb5 | bellard | + return *((uint8_t *)addr);
|
1453 | 97067eb5 | bellard | +}
|
1454 | 97067eb5 | bellard | +
|
1455 | 97067eb5 | bellard | +static void grackle_config_writeb (pci_bridge_t *bridge,
|
1456 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1457 | 97067eb5 | bellard | + uint8_t offset, uint8_t val)
|
1458 | 97067eb5 | bellard | +{
|
1459 | 97067eb5 | bellard | + uint32_t addr;
|
1460 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1461 | 97067eb5 | bellard | + *((uint8_t *)addr) = val;
|
1462 | 97067eb5 | bellard | +}
|
1463 | 97067eb5 | bellard | +
|
1464 | 97067eb5 | bellard | +static uint16_t grackle_config_readw (pci_bridge_t *bridge,
|
1465 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1466 | 97067eb5 | bellard | + uint8_t offset)
|
1467 | 97067eb5 | bellard | +{
|
1468 | 97067eb5 | bellard | + uint32_t addr;
|
1469 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1470 | 97067eb5 | bellard | + return ldswap16((uint16_t *)addr);
|
1471 | 97067eb5 | bellard | +}
|
1472 | 97067eb5 | bellard | +
|
1473 | 97067eb5 | bellard | +static void grackle_config_writew (pci_bridge_t *bridge,
|
1474 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1475 | 97067eb5 | bellard | + uint8_t offset, uint16_t val)
|
1476 | 97067eb5 | bellard | +{
|
1477 | 97067eb5 | bellard | + uint32_t addr;
|
1478 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1479 | 97067eb5 | bellard | + stswap16((uint16_t *)addr, val);
|
1480 | 97067eb5 | bellard | +}
|
1481 | 97067eb5 | bellard | +
|
1482 | 97067eb5 | bellard | +static uint32_t grackle_config_readl (pci_bridge_t *bridge,
|
1483 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1484 | 97067eb5 | bellard | + uint8_t offset)
|
1485 | 97067eb5 | bellard | +{
|
1486 | 97067eb5 | bellard | + uint32_t addr;
|
1487 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1488 | 97067eb5 | bellard | + return ldswap32((uint32_t *)addr);
|
1489 | 97067eb5 | bellard | +}
|
1490 | 97067eb5 | bellard | +
|
1491 | 97067eb5 | bellard | +static void grackle_config_writel (pci_bridge_t *bridge,
|
1492 | 97067eb5 | bellard | + uint8_t bus, uint8_t devfn,
|
1493 | 97067eb5 | bellard | + uint8_t offset, uint32_t val)
|
1494 | 97067eb5 | bellard | +{
|
1495 | 97067eb5 | bellard | + uint32_t addr;
|
1496 | 97067eb5 | bellard | +
|
1497 | 97067eb5 | bellard | + addr = grackle_cfg_address(bridge, bus, devfn, offset);
|
1498 | 97067eb5 | bellard | + stswap32((uint32_t *)addr, val);
|
1499 | 97067eb5 | bellard | +}
|
1500 | 97067eb5 | bellard | +
|
1501 | 97067eb5 | bellard | +static pci_ops_t grackle_pci_ops = {
|
1502 | 97067eb5 | bellard | + &grackle_config_readb, &grackle_config_writeb,
|
1503 | 97067eb5 | bellard | + &grackle_config_readw, &grackle_config_writew,
|
1504 | 97067eb5 | bellard | + &grackle_config_readl, &grackle_config_writel,
|
1505 | 97067eb5 | bellard | +};
|
1506 | 97067eb5 | bellard | +
|
1507 | 97067eb5 | bellard | static inline uint8_t pci_config_readb (pci_bridge_t *bridge, |
1508 | 97067eb5 | bellard | uint8_t bus, uint8_t devfn, |
1509 | 97067eb5 | bellard | uint8_t offset) |
1510 | 97067eb5 | bellard | @@ -466,12 +540,22 @@
|
1511 | 97067eb5 | bellard | }, |
1512 | 97067eb5 | bellard | }; |
1513 | 97067eb5 | bellard | |
1514 | 97067eb5 | bellard | +static int ide_config_cb2 (pci_device_t *device)
|
1515 | 97067eb5 | bellard | +{
|
1516 | 97067eb5 | bellard | + OF_finalize_pci_ide(device->common.OF_private,
|
1517 | 97067eb5 | bellard | + device->regions[0] & ~0x0000000F,
|
1518 | 97067eb5 | bellard | + device->regions[1] & ~0x0000000F,
|
1519 | 97067eb5 | bellard | + device->regions[2] & ~0x0000000F,
|
1520 | 97067eb5 | bellard | + device->regions[3] & ~0x0000000F);
|
1521 | 97067eb5 | bellard | + return 0;
|
1522 | 97067eb5 | bellard | +}
|
1523 | 97067eb5 | bellard | +
|
1524 | 97067eb5 | bellard | static pci_dev_t ide_devices[] = {
|
1525 | 97067eb5 | bellard | { |
1526 | 97067eb5 | bellard | - 0x8086, 0x0100,
|
1527 | 97067eb5 | bellard | - NULL, "Qemu IDE", "Qemu IDE", "ide",
|
1528 | 97067eb5 | bellard | + 0x1095, 0x0646, /* CMD646 IDE controller */
|
1529 | 97067eb5 | bellard | + "pci-ide", "pci-ata", NULL, NULL,
|
1530 | 97067eb5 | bellard | 0, 0, 0, |
1531 | 97067eb5 | bellard | - NULL, NULL,
|
1532 | 97067eb5 | bellard | + ide_config_cb2, NULL,
|
1533 | 97067eb5 | bellard | }, |
1534 | 97067eb5 | bellard | { |
1535 | 97067eb5 | bellard | 0xFFFF, 0xFFFF, |
1536 | 97067eb5 | bellard | @@ -481,7 +565,9 @@
|
1537 | 97067eb5 | bellard | }, |
1538 | 97067eb5 | bellard | }; |
1539 | 97067eb5 | bellard | |
1540 | 97067eb5 | bellard | -static int ide_config_cb (pci_device_t *device)
|
1541 | 97067eb5 | bellard | +#if 0
|
1542 | 97067eb5 | bellard | +/* should base it on PCI ID, not on arch */
|
1543 | 97067eb5 | bellard | +static int ide_config_cb (unused pci_device_t *device)
|
1544 | 97067eb5 | bellard | { |
1545 | 97067eb5 | bellard | printf("Register IDE controller\n");
|
1546 | 97067eb5 | bellard | switch (arch) {
|
1547 | 97067eb5 | bellard | @@ -491,14 +577,8 @@
|
1548 | 97067eb5 | bellard | device->common.OF_private); |
1549 | 97067eb5 | bellard | break;
|
1550 | 97067eb5 | bellard | default:
|
1551 | 97067eb5 | bellard | - ide_pci_pc_register(device->regions[0] & ~0x0000000F,
|
1552 | 97067eb5 | bellard | - device->regions[1] & ~0x0000000F,
|
1553 | 97067eb5 | bellard | - device->regions[2] & ~0x0000000F,
|
1554 | 97067eb5 | bellard | - device->regions[3] & ~0x0000000F,
|
1555 | 97067eb5 | bellard | - device->common.OF_private);
|
1556 | 97067eb5 | bellard | break;
|
1557 | 97067eb5 | bellard | } |
1558 | 97067eb5 | bellard | -
|
1559 | 97067eb5 | bellard | return 0; |
1560 | 97067eb5 | bellard | } |
1561 | 97067eb5 | bellard | |
1562 | 97067eb5 | bellard | @@ -512,16 +592,12 @@
|
1563 | 97067eb5 | bellard | device->common.OF_private); |
1564 | 97067eb5 | bellard | break;
|
1565 | 97067eb5 | bellard | default:
|
1566 | 97067eb5 | bellard | - ide_pci_pc_register(device->regions[0] & ~0x0000000F,
|
1567 | 97067eb5 | bellard | - device->regions[1] & ~0x0000000F,
|
1568 | 97067eb5 | bellard | - device->regions[2] & ~0x0000000F,
|
1569 | 97067eb5 | bellard | - device->regions[3] & ~0x0000000F,
|
1570 | 97067eb5 | bellard | - device->common.OF_private);
|
1571 | 97067eb5 | bellard | break;
|
1572 | 97067eb5 | bellard | } |
1573 | 97067eb5 | bellard | |
1574 | 97067eb5 | bellard | return 0; |
1575 | 97067eb5 | bellard | } |
1576 | 97067eb5 | bellard | +#endif
|
1577 | 97067eb5 | bellard | |
1578 | 97067eb5 | bellard | static pci_subclass_t mass_subclass[] = {
|
1579 | 97067eb5 | bellard | { |
1580 | 97067eb5 | bellard | @@ -530,7 +606,7 @@
|
1581 | 97067eb5 | bellard | }, |
1582 | 97067eb5 | bellard | { |
1583 | 97067eb5 | bellard | 0x01, "IDE controller", "ide", ide_devices, NULL, |
1584 | 97067eb5 | bellard | - &ide_config_cb, NULL,
|
1585 | 97067eb5 | bellard | + NULL, NULL,
|
1586 | 97067eb5 | bellard | }, |
1587 | 97067eb5 | bellard | { |
1588 | 97067eb5 | bellard | 0x02, "Floppy disk controller", NULL, NULL, NULL, |
1589 | 97067eb5 | bellard | @@ -546,7 +622,7 @@
|
1590 | 97067eb5 | bellard | }, |
1591 | 97067eb5 | bellard | { |
1592 | 97067eb5 | bellard | 0x05, "ATA controller", "ata", NULL, NULL, |
1593 | 97067eb5 | bellard | - &ata_config_cb, NULL,
|
1594 | 97067eb5 | bellard | + NULL, NULL,
|
1595 | 97067eb5 | bellard | }, |
1596 | 97067eb5 | bellard | { |
1597 | 97067eb5 | bellard | 0x80, "misc mass-storage controller", NULL, NULL, NULL, |
1598 | 97067eb5 | bellard | @@ -646,7 +722,9 @@
|
1599 | 97067eb5 | bellard | /* VGA 640x480x16 */
|
1600 | 97067eb5 | bellard | OF_vga_register(device->common.device->name, |
1601 | 97067eb5 | bellard | device->regions[0] & ~0x0000000F, |
1602 | 97067eb5 | bellard | - vga_width, vga_height, vga_depth);
|
1603 | 97067eb5 | bellard | + vga_width, vga_height, vga_depth,
|
1604 | 97067eb5 | bellard | + device->regions[6] & ~0x0000000F,
|
1605 | 97067eb5 | bellard | + device->sizes[6]);
|
1606 | 97067eb5 | bellard | } |
1607 | 97067eb5 | bellard | vga_console_register(); |
1608 | 97067eb5 | bellard | |
1609 | 97067eb5 | bellard | @@ -750,6 +828,13 @@
|
1610 | 97067eb5 | bellard | NULL, &PREP_pci_ops,
|
1611 | 97067eb5 | bellard | }; |
1612 | 97067eb5 | bellard | |
1613 | 97067eb5 | bellard | +pci_dev_t grackle_fake_bridge = {
|
1614 | 97067eb5 | bellard | + 0xFFFF, 0xFFFF,
|
1615 | 97067eb5 | bellard | + "pci", "pci-bridge", "DEC,21154", "DEC,21154.pci-bridge",
|
1616 | 97067eb5 | bellard | + -1, -1, -1,
|
1617 | 97067eb5 | bellard | + NULL, &grackle_pci_ops,
|
1618 | 97067eb5 | bellard | +};
|
1619 | 97067eb5 | bellard | +
|
1620 | 97067eb5 | bellard | static pci_dev_t hbrg_devices[] = {
|
1621 | 97067eb5 | bellard | { |
1622 | 97067eb5 | bellard | 0x106B, 0x0020, NULL, |
1623 | 97067eb5 | bellard | @@ -758,8 +843,8 @@
|
1624 | 97067eb5 | bellard | NULL, &uninorth_agp_fake_bridge,
|
1625 | 97067eb5 | bellard | }, |
1626 | 97067eb5 | bellard | { |
1627 | 97067eb5 | bellard | - 0x106B, 0x001F,
|
1628 | 97067eb5 | bellard | - NULL, "pci", "AAPL,UniNorth", "uni-north",
|
1629 | 97067eb5 | bellard | + 0x106B, 0x001F, NULL,
|
1630 | 97067eb5 | bellard | + "pci", "AAPL,UniNorth", "uni-north",
|
1631 | 97067eb5 | bellard | 3, 2, 1, |
1632 | 97067eb5 | bellard | NULL, &uninorth_fake_bridge,
|
1633 | 97067eb5 | bellard | }, |
1634 | 97067eb5 | bellard | @@ -770,10 +855,10 @@
|
1635 | 97067eb5 | bellard | NULL, &uninorth_fake_bridge,
|
1636 | 97067eb5 | bellard | }, |
1637 | 97067eb5 | bellard | { |
1638 | 97067eb5 | bellard | - 0x1011, 0x0026, NULL,
|
1639 | 97067eb5 | bellard | - "pci-bridge", NULL, NULL,
|
1640 | 97067eb5 | bellard | + 0x1057, 0x0002, "pci",
|
1641 | 97067eb5 | bellard | + "pci", "MOT,MPC106", "grackle",
|
1642 | 97067eb5 | bellard | 3, 2, 1, |
1643 | 97067eb5 | bellard | - NULL, &PREP_pci_ops,
|
1644 | 97067eb5 | bellard | + NULL, &grackle_fake_bridge,
|
1645 | 97067eb5 | bellard | }, |
1646 | 97067eb5 | bellard | { |
1647 | 97067eb5 | bellard | 0x1057, 0x4801, NULL, |
1648 | 98352369 | bellard | @@ -1443,7 +1528,14 @@
|
1649 | 98352369 | bellard | } |
1650 | 98352369 | bellard | |
1651 | 98352369 | bellard | static const pci_dev_t misc_pci[] = { |
1652 | 98352369 | bellard | - /* Apple Mac-io controller */
|
1653 | 98352369 | bellard | + /* Paddington Mac I/O */
|
1654 | 98352369 | bellard | + {
|
1655 | 98352369 | bellard | + 0x106B, 0x0017,
|
1656 | 98352369 | bellard | + "mac-io", "mac-io", "AAPL,343S1211", "paddington\1heathrow",
|
1657 | 98352369 | bellard | + 1, 1, 1,
|
1658 | 98352369 | bellard | + &macio_config_cb, NULL,
|
1659 | 98352369 | bellard | + },
|
1660 | 98352369 | bellard | + /* KeyLargo Mac I/O */
|
1661 | 97067eb5 | bellard | { |
1662 | 97067eb5 | bellard | 0x106B, 0x0022, |
1663 | 98352369 | bellard | "mac-io", "mac-io", "AAPL,Keylargo", "Keylargo", |
1664 | 98352369 | bellard | @@ -1599,7 +1691,7 @@
|
1665 | 97067eb5 | bellard | uint8_t min_grant, uint8_t max_latency, |
1666 | 97067eb5 | bellard | int irq_line)
|
1667 | 97067eb5 | bellard | { |
1668 | 97067eb5 | bellard | - uint32_t cmd;
|
1669 | 97067eb5 | bellard | + uint32_t cmd, addr;
|
1670 | 97067eb5 | bellard | int i;
|
1671 | 97067eb5 | bellard | |
1672 | 97067eb5 | bellard | device->min_grant = min_grant; |
1673 | 98352369 | bellard | @@ -1611,22 +1703,28 @@
|
1674 | 97067eb5 | bellard | printf("MAP PCI device %d:%d to IRQ %d\n",
|
1675 | 97067eb5 | bellard | device->bus, device->devfn, irq_line); |
1676 | 97067eb5 | bellard | } |
1677 | 97067eb5 | bellard | - for (i = 0; i < 6; i++) {
|
1678 | 97067eb5 | bellard | + for (i = 0; i < 7; i++) {
|
1679 | 97067eb5 | bellard | if ((device->regions[i] & ~0xF) != 0x00000000 && |
1680 | 97067eb5 | bellard | (device->regions[i] & ~0xF) != 0xFFFFFFF0) { |
1681 | 97067eb5 | bellard | printf("Map PCI device %d:%d %d to %0x %0x (%s)\n",
|
1682 | 97067eb5 | bellard | device->bus, device->devfn, i, |
1683 | 97067eb5 | bellard | device->regions[i], device->sizes[i], |
1684 | 97067eb5 | bellard | - device->regions[i] & 0x00000001 ? "I/O" : "memory");
|
1685 | 97067eb5 | bellard | + (device->regions[i] & 0x00000001) && i != 6 ? "I/O" :
|
1686 | 97067eb5 | bellard | + "memory");
|
1687 | 97067eb5 | bellard | + if (i != 6) {
|
1688 | 97067eb5 | bellard | cmd = pci_config_readl(bridge, device->bus, device->devfn, 0x04);
|
1689 | 97067eb5 | bellard | if (device->regions[i] & 0x00000001) |
1690 | 97067eb5 | bellard | cmd |= 0x00000001;
|
1691 | 97067eb5 | bellard | else
|
1692 | 97067eb5 | bellard | cmd |= 0x00000002;
|
1693 | 97067eb5 | bellard | pci_config_writel(bridge, device->bus, device->devfn, 0x04, cmd);
|
1694 | 97067eb5 | bellard | + }
|
1695 | 97067eb5 | bellard | + if (i == 6)
|
1696 | 97067eb5 | bellard | + addr = 0x30; /* PCI ROM */
|
1697 | 97067eb5 | bellard | + else
|
1698 | 97067eb5 | bellard | + addr = 0x10 + (i * sizeof(uint32_t));
|
1699 | 97067eb5 | bellard | pci_config_writel(bridge, device->bus, device->devfn, |
1700 | 97067eb5 | bellard | - 0x10 + (i * sizeof(uint32_t)),
|
1701 | 97067eb5 | bellard | - device->regions[i]);
|
1702 | 97067eb5 | bellard | + addr, device->regions[i]);
|
1703 | 97067eb5 | bellard | } |
1704 | 97067eb5 | bellard | } |
1705 | 97067eb5 | bellard | } |
1706 | 98352369 | bellard | @@ -1900,7 +1998,7 @@
|
1707 | 97067eb5 | bellard | goto out;
|
1708 | 97067eb5 | bellard | } |
1709 | 97067eb5 | bellard | ret = (pci_u_t *)newd; |
1710 | 97067eb5 | bellard | - max_areas = 6;
|
1711 | 97067eb5 | bellard | + max_areas = 7;
|
1712 | 97067eb5 | bellard | /* register PCI device in OF tree */
|
1713 | 97067eb5 | bellard | if (bridge->dev.common.type == PCI_FAKE_BRIDGE) {
|
1714 | 97067eb5 | bellard | newd->common.OF_private = |
1715 | 98352369 | bellard | @@ -1927,6 +2025,9 @@
|
1716 | 97067eb5 | bellard | /* Handle 64 bits memory mapping */
|
1717 | 97067eb5 | bellard | continue;
|
1718 | 97067eb5 | bellard | } |
1719 | 97067eb5 | bellard | + if (i == 6)
|
1720 | 97067eb5 | bellard | + addr = 0x30; /* PCI ROM */
|
1721 | 97067eb5 | bellard | + else
|
1722 | 97067eb5 | bellard | addr = 0x10 + (i * sizeof(uint32_t)); |
1723 | 97067eb5 | bellard | /* Get region size
|
1724 | 97067eb5 | bellard | * Note: we assume it's always a power of 2 |
1725 | 98352369 | bellard | @@ -1935,7 +2036,7 @@
|
1726 | 97067eb5 | bellard | smask = pci_config_readl(bridge, bus, devfn, addr); |
1727 | 97067eb5 | bellard | if (smask == 0x00000000 || smask == 0xFFFFFFFF) |
1728 | 97067eb5 | bellard | continue;
|
1729 | 97067eb5 | bellard | - if (smask & 0x00000001) {
|
1730 | 97067eb5 | bellard | + if ((smask & 0x00000001) != 0 && i != 6) {
|
1731 | 97067eb5 | bellard | /* I/O space */
|
1732 | 97067eb5 | bellard | base = io_base; |
1733 | 97067eb5 | bellard | /* Align to a minimum of 256 bytes (arbitrary) */
|
1734 | 98352369 | bellard | @@ -1947,6 +2048,8 @@
|
1735 | 97067eb5 | bellard | /* Align to a minimum of 64 kB (arbitrary) */
|
1736 | 97067eb5 | bellard | min_align = 1 << 16; |
1737 | 97067eb5 | bellard | amask = 0x0000000F;
|
1738 | 97067eb5 | bellard | + if (i == 6)
|
1739 | 97067eb5 | bellard | + smask |= 1; /* PCI ROM enable */
|
1740 | 97067eb5 | bellard | } |
1741 | 97067eb5 | bellard | omask = smask & amask; |
1742 | 97067eb5 | bellard | smask &= ~amask; |
1743 | 98352369 | bellard | @@ -1980,7 +2083,10 @@
|
1744 | 97067eb5 | bellard | if (irq_pin > 0) { |
1745 | 97067eb5 | bellard | /* assign the IRQ */
|
1746 | 97067eb5 | bellard | irq_pin = ((devfn >> 3) + irq_pin - 1) & 3; |
1747 | 97067eb5 | bellard | - if (arch == ARCH_PREP) {
|
1748 | 97067eb5 | bellard | + /* XXX: should base it on the PCI bridge type, not the arch */
|
1749 | 97067eb5 | bellard | + switch(arch) {
|
1750 | 97067eb5 | bellard | + case ARCH_PREP:
|
1751 | 97067eb5 | bellard | + {
|
1752 | 97067eb5 | bellard | int elcr_port, val;
|
1753 | 97067eb5 | bellard | irq_line = prep_pci_irqs[irq_pin]; |
1754 | 97067eb5 | bellard | /* set the IRQ to level-sensitive */
|
1755 | 98352369 | bellard | @@ -1988,14 +2094,22 @@
|
1756 | 97067eb5 | bellard | val = inb(elcr_port); |
1757 | 97067eb5 | bellard | val |= 1 << (irq_line & 7); |
1758 | 97067eb5 | bellard | outb(elcr_port, val); |
1759 | 97067eb5 | bellard | - } else {
|
1760 | 97067eb5 | bellard | + }
|
1761 | 97067eb5 | bellard | + break;
|
1762 | 97067eb5 | bellard | + case ARCH_MAC99:
|
1763 | 97067eb5 | bellard | irq_line = pmac_pci_irqs[irq_pin]; |
1764 | 97067eb5 | bellard | + break;
|
1765 | 97067eb5 | bellard | + case ARCH_HEATHROW:
|
1766 | 97067eb5 | bellard | + irq_line = heathrow_pci_irqs[irq_pin];
|
1767 | 97067eb5 | bellard | + break;
|
1768 | 97067eb5 | bellard | + default:
|
1769 | 97067eb5 | bellard | + break;
|
1770 | 97067eb5 | bellard | } |
1771 | 97067eb5 | bellard | } |
1772 | 97067eb5 | bellard | update_device:
|
1773 | 97067eb5 | bellard | pci_update_device(bridge, newd, min_grant, max_latency, irq_line); |
1774 | 97067eb5 | bellard | OF_finalize_pci_device(newd->common.OF_private, bus, devfn, |
1775 | 97067eb5 | bellard | - newd->regions, newd->sizes);
|
1776 | 97067eb5 | bellard | + newd->regions, newd->sizes, irq_line);
|
1777 | 97067eb5 | bellard | /* Call special inits if needed */
|
1778 | 97067eb5 | bellard | if (dev->config_cb != NULL) |
1779 | 97067eb5 | bellard | (*dev->config_cb)(newd); |
1780 | 98352369 | bellard | @@ -2049,6 +2163,32 @@
|
1781 | 97067eb5 | bellard | case ARCH_CHRP:
|
1782 | 97067eb5 | bellard | /* TODO */
|
1783 | 97067eb5 | bellard | break;
|
1784 | 97067eb5 | bellard | + case ARCH_HEATHROW:
|
1785 | 97067eb5 | bellard | + dev = pci_find_device(0x06, 0x00, 0xFF, checkv, checkp);
|
1786 | 97067eb5 | bellard | + if (dev == NULL)
|
1787 | 97067eb5 | bellard | + return -1;
|
1788 | 97067eb5 | bellard | + fake_host = pci_add_host(hostp, dev,
|
1789 | 97067eb5 | bellard | + (0x06 << 24) | (0x00 << 16) | (0xFF << 8));
|
1790 | 97067eb5 | bellard | + if (fake_host == NULL)
|
1791 | 97067eb5 | bellard | + return -1;
|
1792 | 97067eb5 | bellard | + fake_host->dev.common.type = PCI_FAKE_HOST;
|
1793 | 97067eb5 | bellard | + dev = &grackle_fake_bridge;
|
1794 | 97067eb5 | bellard | + if (dev == NULL)
|
1795 | 97067eb5 | bellard | + goto free_fake_host;
|
1796 | 97067eb5 | bellard | + fake_bridge = pci_add_bridge(fake_host, 0, 0, dev,
|
1797 | 97067eb5 | bellard | + (0x06 << 24) | (0x04 << 16) | (0xFF << 8),
|
1798 | 97067eb5 | bellard | + cfg_base, cfg_len,
|
1799 | 97067eb5 | bellard | + cfg_base + 0x7ec00000,
|
1800 | 97067eb5 | bellard | + cfg_base + 0x7ee00000,
|
1801 | 97067eb5 | bellard | + mem_base, mem_len,
|
1802 | 97067eb5 | bellard | + io_base, io_len,
|
1803 | 97067eb5 | bellard | + rbase, rlen,
|
1804 | 97067eb5 | bellard | + 0,
|
1805 | 97067eb5 | bellard | + &grackle_pci_ops);
|
1806 | 97067eb5 | bellard | + if (fake_bridge == NULL)
|
1807 | 97067eb5 | bellard | + goto free_fake_host;
|
1808 | 97067eb5 | bellard | + fake_bridge->dev.common.type = PCI_FAKE_BRIDGE;
|
1809 | 97067eb5 | bellard | + break;
|
1810 | 97067eb5 | bellard | case ARCH_MAC99:
|
1811 | 97067eb5 | bellard | dev = pci_find_device(0x06, 0x00, 0xFF, checkv, checkp); |
1812 | 97067eb5 | bellard | if (dev == NULL) |
1813 | 98352369 | bellard | @@ -2167,6 +2307,30 @@
|
1814 | 97067eb5 | bellard | case ARCH_CHRP:
|
1815 | 97067eb5 | bellard | /* TODO */
|
1816 | 97067eb5 | bellard | break;
|
1817 | 97067eb5 | bellard | + case ARCH_HEATHROW:
|
1818 | 97067eb5 | bellard | + cfg_base = 0x80000000;
|
1819 | 97067eb5 | bellard | + cfg_len = 0x7f000000;
|
1820 | 97067eb5 | bellard | + mem_base = 0x80000000;
|
1821 | 97067eb5 | bellard | + mem_len = 0x01000000;
|
1822 | 97067eb5 | bellard | + io_base = 0xfe000000;
|
1823 | 97067eb5 | bellard | + io_len = 0x00800000;
|
1824 | 97067eb5 | bellard | +#if 1
|
1825 | 97067eb5 | bellard | + rbase = 0xfd000000;
|
1826 | 97067eb5 | bellard | + rlen = 0x01000000;
|
1827 | 97067eb5 | bellard | +#else
|
1828 | 97067eb5 | bellard | + rbase = 0x00000000;
|
1829 | 97067eb5 | bellard | + rlen = 0x01000000;
|
1830 | 97067eb5 | bellard | +#endif
|
1831 | 97067eb5 | bellard | + if (pci_check_host(&pci_main, cfg_base, cfg_len,
|
1832 | 97067eb5 | bellard | + mem_base, mem_len, io_base, io_len, rbase, rlen,
|
1833 | 97067eb5 | bellard | + 0x1057, 0x0002) == 0) {
|
1834 | 97067eb5 | bellard | + isa_io_base = io_base;
|
1835 | 97067eb5 | bellard | + busnum++;
|
1836 | 97067eb5 | bellard | + }
|
1837 | 97067eb5 | bellard | + for (curh = pci_main; curh->next != NULL; curh = curh->next)
|
1838 | 97067eb5 | bellard | + continue;
|
1839 | 97067eb5 | bellard | + pci_check_devices(curh);
|
1840 | 97067eb5 | bellard | + break;
|
1841 | 97067eb5 | bellard | case ARCH_MAC99:
|
1842 | 97067eb5 | bellard | /* We are supposed to have 3 host bridges:
|
1843 | 97067eb5 | bellard | * - the uninorth AGP bridge at 0xF0000000 |