From 98352369101d2f3097e7f75d291b0a438c4dbbe4 Mon Sep 17 00:00:00 2001 From: bellard Date: Thu, 7 Jul 2005 22:38:00 +0000 Subject: [PATCH] specific mac-io PCI device_id for paddington/heathrow - fixed atapi requests - reset IDE drives in quiesce - added heathrow nvram OF description git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1512 c046a42c-6fe2-441c-8c8c-71466251a162 --- pc-bios/ohw.diff | 330 ++++++++++++++++++++++++++++++++------------ pc-bios/ppc_rom.bin | Bin 524288 -> 524288 bytes 2 files changed, 244 insertions(+), 86 deletions(-) diff --git a/pc-bios/ohw.diff b/pc-bios/ohw.diff index 86fb1c2e17..4fb542274d 100644 --- a/pc-bios/ohw.diff +++ b/pc-bios/ohw.diff @@ -1,6 +1,6 @@ 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 --- OpenHackWare-release-0.4.org/src/bios.h 2005-04-06 23:20:22.000000000 +0200 -+++ OpenHackWare-release-0.4/src/bios.h 2005-07-03 16:17:41.000000000 +0200 ++++ OpenHackWare-release-0.4/src/bios.h 2005-07-07 01:10:20.000000000 +0200 @@ -64,6 +64,7 @@ ARCH_CHRP, ARCH_MAC99, @@ -9,7 +9,15 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- }; /* Hardware definition(s) */ -@@ -183,12 +184,12 @@ +@@ -174,6 +175,7 @@ + int bd_ioctl (bloc_device_t *bd, int func, void *args); + uint32_t bd_seclen (bloc_device_t *bd); + void bd_close (bloc_device_t *bd); ++void bd_reset_all(void); + uint32_t bd_seclen (bloc_device_t *bd); + uint32_t bd_maxbloc (bloc_device_t *bd); + void bd_sect2CHS (bloc_device_t *bd, uint32_t secnum, +@@ -183,12 +185,12 @@ part_t *bd_probe (int boot_device); bloc_device_t *bd_get (int device); void bd_put (bloc_device_t *bd); @@ -24,7 +32,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- void ide_pci_pmac_register (uint32_t io_base0, uint32_t io_base1, void *OF_private); -@@ -399,17 +400,23 @@ +@@ -399,17 +401,23 @@ uint16_t min_grant, uint16_t max_latency); void OF_finalize_pci_host (void *dev, int first_bus, int nb_busses); void OF_finalize_pci_device (void *dev, uint8_t bus, uint8_t devfn, @@ -53,7 +61,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- const unsigned char *name, int devnum, 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 --- OpenHackWare-release-0.4.org/src/bloc.c 2005-04-06 23:21:00.000000000 +0200 -+++ OpenHackWare-release-0.4/src/bloc.c 2005-07-03 16:17:41.000000000 +0200 ++++ OpenHackWare-release-0.4/src/bloc.c 2005-07-08 00:28:26.000000000 +0200 @@ -55,6 +55,7 @@ /* Partitions */ part_t *parts, *bparts; @@ -62,7 +70,33 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* Chain */ bloc_device_t *next; }; -@@ -223,10 +224,12 @@ +@@ -66,6 +67,7 @@ + + static int ide_initialize (bloc_device_t *bd, int device); + static int ide_read_sector (bloc_device_t *bd, void *buffer, int secnum); ++static int ide_reset (bloc_device_t *bd); + + static int mem_initialize (bloc_device_t *bd, int device); + static int mem_read_sector (bloc_device_t *bd, void *buffer, int secnum); +@@ -212,6 +214,17 @@ + { + } + ++void bd_reset_all(void) ++{ ++ bloc_device_t *bd; ++ for (bd = bd_list; bd != NULL; bd = bd->next) { ++ if (bd->init == &ide_initialize) { ++ /* reset IDE drive because Darwin wants all IDE devices to be reset */ ++ ide_reset(bd); ++ } ++ } ++} ++ + uint32_t bd_seclen (bloc_device_t *bd) + { + return bd->seclen; +@@ -223,10 +236,12 @@ } /* XXX: to be suppressed */ @@ -76,7 +110,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- } } -@@ -240,6 +243,13 @@ +@@ -240,6 +255,13 @@ return &bd->bparts; } @@ -90,7 +124,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- part_t *bd_probe (int boot_device) { char devices[] = { /*'a', 'b',*/ 'c', 'd', 'e', 'f', 'm', '\0', }; -@@ -272,9 +282,7 @@ +@@ -272,9 +294,7 @@ tmp = part_probe(bd, force_raw); if (boot_device == bd->device) { boot_part = tmp; @@ -101,7 +135,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- } } -@@ -717,34 +725,29 @@ +@@ -717,34 +737,29 @@ /* IDE PCI access for pc */ static uint8_t ide_pci_port_read (bloc_device_t *bd, int port) { @@ -143,7 +177,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- } static ide_ops_t ide_pci_pc_ops = { -@@ -761,7 +764,7 @@ +@@ -761,7 +776,7 @@ void ide_pci_pc_register (uint32_t io_base0, uint32_t io_base1, uint32_t io_base2, uint32_t io_base3, @@ -152,7 +186,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- { if (ide_pci_ops == NULL) { ide_pci_ops = malloc(sizeof(ide_ops_t)); -@@ -770,19 +773,19 @@ +@@ -770,19 +785,19 @@ memcpy(ide_pci_ops, &ide_pci_pc_ops, sizeof(ide_ops_t)); } if ((io_base0 != 0 || io_base1 != 0) && @@ -178,6 +212,78 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- #endif } } +@@ -935,6 +950,8 @@ + } + + static void atapi_pad_req (void *buffer, int len); ++static void atapi_make_req (bloc_device_t *bd, uint32_t *buffer, ++ int maxlen); + static int atapi_read_sector (bloc_device_t *bd, void *buffer, int secnum); + + static int ide_initialize (bloc_device_t *bd, int device) +@@ -1035,9 +1052,7 @@ + DPRINTF("INQUIRY\n"); + len = spc_inquiry_req(&atapi_buffer, 36); + atapi_pad_req(&atapi_buffer, len); +- ide_port_write(bd, 0x07, 0xA0); +- for (i = 0; i < 3; i++) +- ide_data_writel(bd, ldswap32(&atapi_buffer[i])); ++ atapi_make_req(bd, atapi_buffer, 36); + status = ide_port_read(bd, 0x07); + if (status != 0x48) { + ERROR("ATAPI INQUIRY : status %0x != 0x48\n", status); +@@ -1053,9 +1068,7 @@ + DPRINTF("READ_CAPACITY\n"); + len = mmc_read_capacity_req(&atapi_buffer); + atapi_pad_req(&atapi_buffer, len); +- ide_port_write(bd, 0x07, 0xA0); +- for (i = 0; i < 3; i++) +- ide_data_writel(bd, ldswap32(&atapi_buffer[i])); ++ atapi_make_req(bd, atapi_buffer, 8); + status = ide_port_read(bd, 0x07); + if (status != 0x48) { + ERROR("ATAPI READ_CAPACITY : status %0x != 0x48\n", status); +@@ -1105,6 +1118,22 @@ + memset(p + len, 0, 12 - len); + } + ++static void atapi_make_req (bloc_device_t *bd, uint32_t *buffer, ++ int maxlen) ++{ ++ int i; ++ /* select drive */ ++ if (bd->drv == 0) ++ ide_port_write(bd, 0x06, 0x40); ++ else ++ ide_port_write(bd, 0x06, 0x50); ++ ide_port_write(bd, 0x04, maxlen & 0xff); ++ ide_port_write(bd, 0x05, (maxlen >> 8) & 0xff); ++ ide_port_write(bd, 0x07, 0xA0); ++ for (i = 0; i < 3; i++) ++ ide_data_writel(bd, ldswap32(&buffer[i])); ++} ++ + static int atapi_read_sector (bloc_device_t *bd, void *buffer, int secnum) + { + uint32_t atapi_buffer[4]; +@@ -1112,16 +1141,9 @@ + uint32_t status, value; + int i, len; + +- /* select drive */ +- if (bd->drv == 0) +- ide_port_write(bd, 0x06, 0x40); +- else +- ide_port_write(bd, 0x06, 0x50); + len = mmc_read12_req(atapi_buffer, secnum, 1); + atapi_pad_req(&atapi_buffer, len); +- ide_port_write(bd, 0x07, 0xA0); +- for (i = 0; i < 3; i++) +- ide_data_writel(bd, ldswap32(&atapi_buffer[i])); ++ atapi_make_req(bd, atapi_buffer, bd->seclen); + status = ide_port_read(bd, 0x07); + if (status != 0x48) { + ERROR("ATAPI READ12 : status %0x != 0x48\n", status); 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 --- OpenHackWare-release-0.4.org/src/libpart/apple.c 2005-03-31 09:23:33.000000000 +0200 +++ OpenHackWare-release-0.4/src/libpart/apple.c 2005-07-03 16:17:41.000000000 +0200 @@ -527,7 +633,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- byte = NVRAM_get_byte(nvram, 0x34); 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 --- OpenHackWare-release-0.4.org/src/of.c 2005-04-06 23:17:26.000000000 +0200 -+++ OpenHackWare-release-0.4/src/of.c 2005-07-03 17:46:25.000000000 +0200 ++++ OpenHackWare-release-0.4/src/of.c 2005-07-07 23:30:08.000000000 +0200 @@ -489,7 +489,7 @@ ERROR("%s can't alloc new node '%s' name\n", __func__, name); return NULL; @@ -537,7 +643,41 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- if (new->prop_address == NULL) { free(new->prop_name->value); free(new->prop_name); -@@ -1421,15 +1421,12 @@ +@@ -1017,6 +1017,33 @@ + string, strlen(string) + 1); + } + ++/* convert '\1' char to '\0' */ ++static OF_prop_t *OF_prop_string_new1 (OF_env_t *env, OF_node_t *node, ++ const unsigned char *name, ++ const unsigned char *string) ++{ ++ int len, i; ++ OF_prop_t *ret; ++ unsigned char *str; ++ ++ if (strchr(string, '\1') == NULL) { ++ return OF_prop_string_new(env, node, name, string); ++ } else { ++ len = strlen(string) + 1; ++ str = malloc(len); ++ if (!str) ++ return NULL; ++ memcpy(str, string, len); ++ for(i = 0; i < len; i++) ++ if (str[i] == '\1') ++ str[i] = '\0'; ++ ret = OF_property_new(env, node, name, ++ str, len); ++ free(str); ++ return ret; ++ } ++} ++ + __attribute__ (( section (".OpenFirmware") )) + static OF_prop_t *OF_prop_int_new (OF_env_t *env, OF_node_t *node, + const unsigned char *name, uint32_t value) +@@ -1421,15 +1448,12 @@ __attribute__ (( section (".OpenFirmware") )) int OF_init (void) { @@ -553,7 +693,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- #endif OF_env_t *OF_env; OF_node_t *als, *opt, *chs, *pks; -@@ -1455,15 +1452,21 @@ +@@ -1455,15 +1479,21 @@ return -1; } OF_prop_string_new(OF_env, OF_node_root, "device_type", "bootrom"); @@ -581,7 +721,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- #if 0 OF_prop_string_new(OF_env, OF_node_root, "copyright", copyright); #else -@@ -1561,14 +1564,15 @@ +@@ -1561,14 +1591,15 @@ range.size = 0x00800000; OF_property_new(OF_env, rom, "ranges", &range, sizeof(OF_range_t)); OF_prop_int_new(OF_env, rom, "#address-cells", 1); @@ -599,7 +739,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_property_new(OF_env, brom, "reg", ®s, sizeof(OF_regprop_t)); OF_prop_string_new(OF_env, brom, "write-characteristic", "flash"); OF_prop_string_new(OF_env, brom, "BootROM-build-date", -@@ -1577,7 +1581,7 @@ +@@ -1577,7 +1608,7 @@ OF_prop_string_new(OF_env, brom, "copyright", copyright); OF_prop_string_new(OF_env, brom, "model", BIOS_str); OF_prop_int_new(OF_env, brom, "result", 0); @@ -608,7 +748,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- { /* Hack taken 'as-is' from PearPC */ unsigned char info[] = { -@@ -1596,7 +1600,9 @@ +@@ -1596,7 +1627,9 @@ OF_node_put(OF_env, brom); OF_node_put(OF_env, rom); } @@ -618,7 +758,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* "/nvram@fff04000" node */ { OF_regprop_t regs; -@@ -1617,6 +1623,7 @@ +@@ -1617,6 +1650,7 @@ OF_prop_int_new(OF_env, chs, "nvram", OF_pack_handle(OF_env, nvr)); OF_node_put(OF_env, nvr); } @@ -626,7 +766,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* "/pseudo-hid" : hid emulation as Apple does */ { OF_node_t *hid; -@@ -1663,7 +1670,27 @@ +@@ -1663,7 +1697,27 @@ } OF_node_put(OF_env, hid); } @@ -654,7 +794,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- #if 1 /* This is mandatory for claim to work * but I don't know where it should really be (in cpu ?) -@@ -1693,7 +1720,9 @@ +@@ -1693,7 +1747,9 @@ /* "/options/boot-args" node */ { @@ -665,7 +805,18 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* Ask MacOS X to print debug messages */ // OF_prop_string_new(OF_env, chs, "machargs", args); // OF_prop_string_new(OF_env, opt, "boot-command", args); -@@ -2021,9 +2050,9 @@ +@@ -2013,17 +2069,17 @@ + OF_prop_int_new(OF_env, node, "min-grant", min_grant); + OF_prop_int_new(OF_env, node, "max-latency", max_latency); + if (dev->type != NULL) +- OF_prop_string_new(OF_env, node, "device_type", dev->type); ++ OF_prop_string_new1(OF_env, node, "device_type", dev->type); + if (dev->compat != NULL) +- OF_prop_string_new(OF_env, node, "compatible", dev->compat); ++ OF_prop_string_new1(OF_env, node, "compatible", dev->compat); + if (dev->model != NULL) +- OF_prop_string_new(OF_env, node, "model", dev->model); ++ OF_prop_string_new1(OF_env, node, "model", dev->model); if (dev->acells != 0) OF_prop_int_new(OF_env, node, "#address-cells", dev->acells); if (dev->scells != 0) @@ -677,7 +828,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- dprintf("Done %p %p\n", parent, node); return node; -@@ -2040,8 +2069,9 @@ +@@ -2040,8 +2096,9 @@ OF_env_t *OF_env; pci_range_t ranges[3]; OF_regprop_t regs[1]; @@ -688,7 +839,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_env = OF_env_main; dprintf("register PCI host '%s' '%s' '%s' '%s'\n", -@@ -2052,6 +2082,17 @@ +@@ -2052,6 +2109,17 @@ ERROR("Cannot create pci host\n"); return NULL; } @@ -706,7 +857,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- regs[0].address = cfg_base; regs[0].size = cfg_len; OF_property_new(OF_env, pci_host, "reg", regs, sizeof(OF_regprop_t)); -@@ -2136,6 +2177,11 @@ +@@ -2136,6 +2204,11 @@ return pci_dev; } @@ -718,7 +869,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- void OF_finalize_pci_host (void *dev, int first_bus, int nb_busses) { OF_env_t *OF_env; -@@ -2145,10 +2191,12 @@ +@@ -2145,10 +2218,12 @@ regs[0].address = first_bus; regs[0].size = nb_busses; OF_property_new(OF_env, dev, "bus-range", regs, sizeof(OF_regprop_t)); @@ -732,7 +883,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- { OF_env_t *OF_env; pci_reg_prop_t pregs[6], rregs[6]; -@@ -2156,6 +2204,7 @@ +@@ -2156,6 +2231,7 @@ int i, j, k; OF_env = OF_env_main; @@ -740,7 +891,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- if (regions[0] != 0x00000000) OF_prop_int_set(OF_env, dev, "address", regions[0] & ~0x0000000F); for (i = 0, j = 0, k = 0; i < 6; i++) { -@@ -2222,7 +2271,22 @@ +@@ -2222,7 +2298,22 @@ } else { OF_property_new(OF_env, dev, "assigned-addresses", NULL, 0); } @@ -764,7 +915,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- { OF_prop_t *prop_name = ((OF_node_t *)dev)->prop_name; -@@ -2390,6 +2454,54 @@ +@@ -2390,6 +2481,54 @@ return 0; } @@ -819,7 +970,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- void OF_finalize_pci_macio (void *dev, uint32_t base_address, uint32_t size, void *private_data) { -@@ -2398,6 +2510,8 @@ +@@ -2398,6 +2537,8 @@ pci_reg_prop_t pregs[2]; OF_node_t *mio, *chs, *als; uint16_t pic_phandle; @@ -828,7 +979,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_DPRINTF("mac-io: %p\n", dev); OF_env = OF_env_main; -@@ -2416,10 +2530,14 @@ +@@ -2416,10 +2557,14 @@ mio = dev; mio->private_data = private_data; pregs[0].addr.hi = 0x00000000; @@ -844,28 +995,10 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_property_new(OF_env, mio, "ranges", &pregs, sizeof(pci_reg_prop_t)); #if 0 -@@ -2431,8 +2549,49 @@ +@@ -2431,8 +2576,32 @@ OF_property_new(OF_env, mio, "assigned-addresses", &pregs, sizeof(pci_reg_prop_t)); #endif -- /* OpenPIC */ -+ -+ switch(arch) { -+ default: -+ case ARCH_MAC99: -+ OF_prop_int_new(OF_env, mio, "#interrupt-cells", 2); -+ OF_prop_string_new(OF_env, mio, "model", "AAPL,Keylargo"); -+ OF_prop_string_new(OF_env, mio, "compatible", "Keylargo"); -+ break; -+ case ARCH_HEATHROW: -+ OF_prop_int_new(OF_env, mio, "#interrupt-cells", 1); -+ OF_prop_string_new(OF_env, mio, "model", "AAPL,343S1211"); - { -+ const char str[] = "paddington\0heathrow"; -+ OF_property_new(OF_env, mio, "compatible", str, sizeof(str)); -+ } -+ break; -+ } + + if (arch == ARCH_HEATHROW) { + /* Heathrow PIC */ @@ -891,11 +1024,12 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- + OF_node_put(OF_env, mpic); + rec_len = 6; + } else { -+ /* OpenPIC */ + /* OpenPIC */ +- { OF_regprop_t regs[4]; OF_node_t *mpic; mpic = OF_node_new(OF_env, mio, "interrupt-controller", 0x40000); -@@ -2455,8 +2614,37 @@ +@@ -2455,8 +2624,37 @@ pic_phandle = OF_pack_handle(OF_env, mpic); OF_prop_int_new(OF_env, chs, "interrupt-controller", pic_phandle); OF_node_put(OF_env, mpic); @@ -934,7 +1068,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* escc is usefull to get MacOS X debug messages */ { OF_regprop_t regs[8]; -@@ -2645,85 +2833,12 @@ +@@ -2645,85 +2843,12 @@ OF_node_put(OF_env, scc); } #endif @@ -1025,7 +1159,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* Timer */ { OF_node_t *tmr; -@@ -2746,10 +2861,11 @@ +@@ -2746,10 +2871,11 @@ regs, sizeof(OF_regprop_t)); OF_node_put(OF_env, tmr); } @@ -1038,7 +1172,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_regprop_t regs[1]; #if 0 // THIS IS A HACK AND IS COMPLETELY ABSURD ! // (but needed has Qemu doesn't emulate via-pmu). -@@ -2773,14 +2889,21 @@ +@@ -2773,14 +2899,21 @@ regs[0].size = 0x00002000; OF_property_new(OF_env, via, "reg", regs, sizeof(OF_regprop_t)); OF_prop_int_new(OF_env, via, "interrupt-parent", pic_phandle); @@ -1061,7 +1195,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* ADB pseudo-device */ adb = OF_node_new(OF_env, via, "adb", OF_ADDRESS_NONE); if (adb == NULL) { -@@ -2797,9 +2920,26 @@ +@@ -2797,9 +2930,26 @@ OF_prop_int_new(OF_env, adb, "#size-cells", 0); OF_pack_get_path(OF_env, tmp, 512, adb); OF_prop_string_new(OF_env, als, "adb", tmp); @@ -1091,7 +1225,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- rtc = OF_node_new(OF_env, via, "rtc", OF_ADDRESS_NONE); if (rtc == NULL) { -@@ -2813,14 +2953,55 @@ +@@ -2813,14 +2963,68 @@ OF_prop_string_new(OF_env, rtc, "compatible", "rtc"); #endif OF_node_put(OF_env, rtc); @@ -1107,6 +1241,19 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- + OF_prop_string_new(OF_env, pmgt, "mgt-kind", "min-consumption-pwm-led"); + OF_node_put(OF_env, pmgt); + } ++ ++ if (arch == ARCH_HEATHROW) { ++ /* NVRAM */ ++ OF_node_t *nvr; ++ OF_regprop_t regs; ++ nvr = OF_node_new(OF_env, mio, "nvram", 0x60000); ++ OF_prop_string_new(OF_env, nvr, "device_type", "nvram"); ++ regs.address = 0x60000; ++ regs.size = 0x00020000; ++ OF_property_new(OF_env, nvr, "reg", ®s, sizeof(regs)); ++ OF_prop_int_new(OF_env, nvr, "#bytes", 0x2000); ++ OF_node_put(OF_env, nvr); ++ } + out: // OF_node_put(OF_env, mio); @@ -1148,7 +1295,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /*****************************************************************************/ /* Fake package */ static void OF_method_fake (OF_env_t *OF_env) -@@ -2862,11 +3043,11 @@ +@@ -2862,11 +3066,11 @@ /* As we get a 1:1 mapping, do nothing */ ihandle = popd(OF_env); args = (void *)popd(OF_env); @@ -1160,11 +1307,11 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- + size = popd(OF_env); + virt = popd(OF_env); + address = popd(OF_env); -+ dprintf("map %0x %0x %0x %0x\n", ihandle, address, ++ OF_DPRINTF("Map %0x %0x %0x %0x\n", ihandle, address, virt, size); pushd(OF_env, 0); } -@@ -3270,7 +3451,7 @@ +@@ -3270,7 +3474,7 @@ OF_prop_string_new(OF_env, dsk, "device_type", "block"); OF_prop_string_new(OF_env, dsk, "category", type); OF_prop_int_new(OF_env, dsk, "device_id", devnum); @@ -1173,7 +1320,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- OF_method_new(OF_env, dsk, "open", &OF_blockdev_open); OF_method_new(OF_env, dsk, "seek", &OF_blockdev_seek); OF_method_new(OF_env, dsk, "read", &OF_blockdev_read); -@@ -3432,7 +3613,8 @@ +@@ -3432,7 +3636,8 @@ } void OF_vga_register (const unsigned char *name, unused uint32_t address, @@ -1183,7 +1330,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- { OF_env_t *OF_env; unsigned char tmp[OF_NAMELEN_MAX]; -@@ -3504,6 +3686,18 @@ +@@ -3504,6 +3709,18 @@ OF_prop_string_new(OF_env, als, "display", tmp); OF_node_put(OF_env, als); /* XXX: may also need read-rectangle */ @@ -1202,7 +1349,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- out: OF_node_put(OF_env, disp); } -@@ -4451,7 +4645,10 @@ +@@ -4451,7 +4668,10 @@ break; case 0x233441d3: /* MacOS X 10.2 and OpenDarwin 1.41 */ /* Create "memory-map" pseudo device */ @@ -1214,7 +1361,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* Find "/packages" */ chs = OF_pack_find_by_name(OF_env, OF_node_root, "/chosen"); if (chs == NULL) { -@@ -4459,10 +4656,6 @@ +@@ -4459,10 +4679,6 @@ ERROR("Cannot get '/chosen'\n"); break; } @@ -1225,7 +1372,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- map = OF_node_new(OF_env, chs, "memory-map", OF_ADDRESS_NONE); if (map == NULL) { pushd(OF_env, -1); -@@ -4473,11 +4666,8 @@ +@@ -4473,11 +4689,8 @@ OF_node_put(OF_env, map); OF_node_put(OF_env, chs); pushd(OF_env, phandle); @@ -1238,7 +1385,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- break; case 0x32a2d18e: /* MacOS X 10.2 and OpenDarwin 6.02 */ /* Return screen ihandle */ -@@ -4540,9 +4730,10 @@ +@@ -4540,9 +4753,10 @@ case 0x4ad41f2d: /* Yaboot: wait 10 ms: sure ! */ break; @@ -1250,9 +1397,17 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- printf("Call %0x NOT IMPLEMENTED !\n", crc); bug(); break; +@@ -4581,6 +4795,7 @@ + { + OF_CHECK_NBARGS(OF_env, 0); + /* Should free all OF resources */ ++ bd_reset_all(); + #if defined (DEBUG_BIOS) + { + uint16_t loglevel = 0x02 | 0x10 | 0x80; 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 --- OpenHackWare-release-0.4.org/src/pci.c 2005-03-31 09:23:33.000000000 +0200 -+++ OpenHackWare-release-0.4/src/pci.c 2005-07-03 15:52:16.000000000 +0200 ++++ OpenHackWare-release-0.4/src/pci.c 2005-07-07 23:27:37.000000000 +0200 @@ -99,8 +99,8 @@ uint16_t min_grant; uint16_t max_latency; @@ -1490,20 +1645,23 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- }, { 0x1057, 0x4801, NULL, -@@ -1446,8 +1531,10 @@ - /* Apple Mac-io controller */ +@@ -1443,7 +1528,14 @@ + } + + static const pci_dev_t misc_pci[] = { +- /* Apple Mac-io controller */ ++ /* Paddington Mac I/O */ ++ { ++ 0x106B, 0x0017, ++ "mac-io", "mac-io", "AAPL,343S1211", "paddington\1heathrow", ++ 1, 1, 1, ++ &macio_config_cb, NULL, ++ }, ++ /* KeyLargo Mac I/O */ { 0x106B, 0x0022, -- "mac-io", "mac-io", "AAPL,Keylargo", "Keylargo", -- 1, 1, 2, -+ /* model, compatible and #interrupt-cells fields are filled in -+ of.c */ -+ "mac-io", "mac-io", NULL, NULL, -+ 1, 1, 0, - &macio_config_cb, NULL, - }, - { -@@ -1599,7 +1686,7 @@ + "mac-io", "mac-io", "AAPL,Keylargo", "Keylargo", +@@ -1599,7 +1691,7 @@ uint8_t min_grant, uint8_t max_latency, int irq_line) { @@ -1512,7 +1670,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- int i; device->min_grant = min_grant; -@@ -1611,22 +1698,28 @@ +@@ -1611,22 +1703,28 @@ printf("MAP PCI device %d:%d to IRQ %d\n", device->bus, device->devfn, irq_line); } @@ -1545,7 +1703,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- } } } -@@ -1900,7 +1993,7 @@ +@@ -1900,7 +1998,7 @@ goto out; } ret = (pci_u_t *)newd; @@ -1554,7 +1712,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* register PCI device in OF tree */ if (bridge->dev.common.type == PCI_FAKE_BRIDGE) { newd->common.OF_private = -@@ -1927,6 +2020,9 @@ +@@ -1927,6 +2025,9 @@ /* Handle 64 bits memory mapping */ continue; } @@ -1564,7 +1722,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- addr = 0x10 + (i * sizeof(uint32_t)); /* Get region size * Note: we assume it's always a power of 2 -@@ -1935,7 +2031,7 @@ +@@ -1935,7 +2036,7 @@ smask = pci_config_readl(bridge, bus, devfn, addr); if (smask == 0x00000000 || smask == 0xFFFFFFFF) continue; @@ -1573,7 +1731,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* I/O space */ base = io_base; /* Align to a minimum of 256 bytes (arbitrary) */ -@@ -1947,6 +2043,8 @@ +@@ -1947,6 +2048,8 @@ /* Align to a minimum of 64 kB (arbitrary) */ min_align = 1 << 16; amask = 0x0000000F; @@ -1582,7 +1740,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- } omask = smask & amask; smask &= ~amask; -@@ -1980,7 +2078,10 @@ +@@ -1980,7 +2083,10 @@ if (irq_pin > 0) { /* assign the IRQ */ irq_pin = ((devfn >> 3) + irq_pin - 1) & 3; @@ -1594,7 +1752,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- int elcr_port, val; irq_line = prep_pci_irqs[irq_pin]; /* set the IRQ to level-sensitive */ -@@ -1988,14 +2089,22 @@ +@@ -1988,14 +2094,22 @@ val = inb(elcr_port); val |= 1 << (irq_line & 7); outb(elcr_port, val); @@ -1619,7 +1777,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- /* Call special inits if needed */ if (dev->config_cb != NULL) (*dev->config_cb)(newd); -@@ -2049,6 +2158,32 @@ +@@ -2049,6 +2163,32 @@ case ARCH_CHRP: /* TODO */ break; @@ -1652,7 +1810,7 @@ diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' -- case ARCH_MAC99: dev = pci_find_device(0x06, 0x00, 0xFF, checkv, checkp); if (dev == NULL) -@@ -2167,6 +2302,30 @@ +@@ -2167,6 +2307,30 @@ case ARCH_CHRP: /* TODO */ break; diff --git a/pc-bios/ppc_rom.bin b/pc-bios/ppc_rom.bin index 8ba25bc3709fa3c3256f2c4111941c5a6fa77b4a..f7cd8a82e926031297c3a5f5eb33d1fc55ca2550 100644 GIT binary patch delta 27150 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