|
|
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.