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 86fb1c2e178..4fb542274df 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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 TL6SpKH21WPP-@;B9KrrC+Srg> delta 26888 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