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