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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 delta 26888 zcmZo@P-tjS*uZ8dw#sFKHUoog0&7!ZcGCmf2G*v;o{k5bW$aF|2uT}QW=oscDzG+L zIxsL;yp*=s{KJWlk!jn@$s8_ae9|5^3s{>bFJut0SSlT`xyOZ%kx4pa@*LMVJE;{O z3|*=^%nS?@YMP!nHnIHBk!4_ZY+||5kjTK{!7$U*gJJVd4@S>O4+hthHFeSzdU6a5 zj+0oHcresiPPTBfs}G)PufW;_Qf|}0z+wM@wb_F)>ZnZuYlFoC1_qFr2V)IyLn4EO z2V?X}iv;E$9t;Z@Eo!6_Kn@1Etf5nCg~d|o4iCm;UyIq&DHaD9SS%JW{{X4+U`)xi zsFqHtNs+GbU`%uLU@D#I!7w}0CV{o7VXo8yi~3~g9-m`|O&$#UBrU3>bD(Tqu!5OV zODvM5CqTsZ{sfCPGH_TVOHXN7$iNfQl4=K)yW3DJwZMa6`caS>9t_j>HdIP2@nD#~ z6{N=^S^9_v!}OI6i3~g*3_O_)j0`*z>YKjkFfioSJ2o+$u~lGgZpdu<0t!gSCZ-J@ zj53@J^P9fZq)Jyn4LAX{sMI1sfWiC!A76_E2L=y@&9*f)(iIj73?R0lB?ALP!~Lc& zHMP%iLJ!BDwz@&ivlDVYWj28IJ5trp2Lb37Orwpb)E*yuw_-C@}}PZ ze+NLtT%cl#lYe-%GjdLD@UCMzCOXNdi%+&iN1lOU0wY66qo-`k!R6YI&zJ^orut1Tz*@Yhn3olwK=p;yD;B~ru5yv(nGMZs2qwZS%lwZT$T zI>s_vHfAzQfDzNGos%sBjO)Py77YxH-v9qkK`2!7vCP)n;Qjx94Z0XqZ3Y%`Ch!0M z1F(oQd;kA$fe<%XW0`I6WTHKThD8G(0|Q86Vm*V7rKX|7rtH3a27iv;FR#d{e}gOW+|UIrEqhCEk` z1m+js|KBu%#6a>M40(o7vE0cMDkLVGgljS7?wp(uu4I%u)q>&w|Bz%hBOPXj2FE6b zJ30&u42}&9CoB?}zj!d@mKG#1@H;g9{{rQwPTmr(Ea?bw9rM=^1~$781_!4X1D+~Pymt|GobQ4pcG#J>dm`3nwp$ zn8lQRbFxFE9GBb`s8Y$v7oucjYUce|XZ@dn(Ssp-tByPahr`1EOCTQ1uAICeQjAGn zWb%&4ET*illU1V3n6maxj)_uY%9=U3AxfRGaPo>MIWBn*h>5EiLr2s8ZR-B!@C1#VDf<_4E&H4}qwttRI4A8=K1?%RT*k(pX$w~3% zjJ%T@;^kS{JQ&h);jGfh4e?4$sS7~@ylgeeN+Kc2EOs6Ysh*QB#G5nPg2X{uQs=^1 zOD6{;XfdUnoNVw$lK&xt4yclzz{p_IAm8+7@{)ugrlvoWe=`;;KAVKIH8`w zp+TO30~8jHO)NE&1=7OIn0a(qKyG1>0a;Ps`nbX(S)m4E&Ah+f|NmXENMzvf{{Nj9 zlwd(@4+fU0ljo$l$tmpd{{Jt-x{-my`Tzq{{oKdkipd&W!o*unO84?p_~8BjAA>~$ zg9=Ea_y4auL8?FofpmbxJQ$b{S}b5#&}h$K11bqE8W`9cH5piHHNka=BB-i^m>9Qk zQo6mMhhq~1G}S7qc>n*KF?mJ0I-}v_3+dvPvO3HRtd30#(44Or0P)3KNALfCML?E; zEcgEZwG?DI$Ppkh4+f@-ljo$#axZ>e0kJ4{9z`!_pL%JMO ztmEW{3^}zg524`$~m6i|NqEVJ2DV#Fd@DFR~XtdpSjGN_qpaat+Cl2a+8 z=BROn_y6BKP<4<72g9s|Na`vqIh7h}S)D7q|NnXd(iD`N7REIFq6ouJ%Se~>`~)M^IjHaP~4$&CyO zHFK0JbQl;ICO>4*nY@rerDnf&g<}(AL8BdmjYR_ko5cc#0F(#?mDCFu7(rogy?}uU zRLOb&|FjhrAKw4}r-Bm!NdE$c1)$;(rr*G?fkhFNO055ba%Ge&$P$o7s3IO%sxjaD z|Gz`S{~MDZjClLdbe;UCw2jGs z>Et_QYFz(CLG`)^gMaPhf+PhF@BjZ^dNBCMPQFv7&uBW?!9`@ULU}x+=;VfSBRN%# z$&CyGAuSAMpgz^)gA5Y(4Xn)&yL&fIzECda)%2!ePt%8nx~3N%46!R4>KPP5k{QfA z7-AqYL7^s1x}sq(gH1y%0}n`x2ZLPcOzA0i|3^O~aDSQ!4!#8A~TWsY+rp3YqLtZNyZ6cXCbj zbw<|BAvH#fOtlv`chqVz>lw2^eAaTbQIbKSVI~6yD6|`PGO$=A8*4P&WZ-G|$pDSa zmW7iaG=wvzZnkKYV`OT2FgcY(LSR5M}T0jvJnhh#yO${c`=&9o}6@i#mkvLhQR}R#Db?7YuQCoWRK$J>f zP+HDIP-zHh@-u=;PX>zx3?3c~HLjEIGcbS#7eHwM)Qz-QYT8oY{21KO+aS*%HbI_2 zz=PpeCa5}^P|u(NYNUhIgVb0oHSMWSyA4+B!SHMA(?80y!8lshi^zXudO zkX&ZE0^-avS?~Yst!yS(`qw zXfeIw!N6bvk>BzVRo+YlDi5wHZR8tRn=F#e96*Ag4i&`G(v_gh?fw71!Q?j+l$e?s zCJRgy6LVIWs0bRV_vrM*`*d^D@0IpCMur`GpV=%K=>Z}8@z24<= zg$KjWshginG-EWgHb97dys0D1z);t~pytrXR3Y=3K?D>?7E7H?U}`K5f;t%=H%<kCTJwe<^XFG$OVmTQX3jLn;wAJq1*yi7B8D`OrA11jY(?5Zsll_*aBGo^^n z`3Xo7#E{~JlWV3*`MIbd2~~Rk|Mvjo0g&Uto^ZKb0csFhJOB;AytnoK|F;JrZ*2hb z4U)X<1~EAcH~j6BrqICNBg<<=dSw z{q=5_D=e0}_JHI)7(UxhPM9ubi6A*}w8P|&xgG!|3lD}5S1q<$Sb*go|E>T#>6q&U z4~7qWL1ETV&k44O#j%Oa!ajku3FJ4hqTQ}{Yz~0hfKN3+BaS*UAV0Dj*garv0vTp; z%=L@KcFUalmd9WRc`$s)1&Mf2`kX*vCDp2|a7dK!F7qB*g#6bpw z)AQrsAd5mldO)EAmRsrsF0worKG=fle~SeS3Kk8Z+*?>!-}1N~k^>nSSU?FJQt(5{ zvk8nWH4_*?E`OB?G6>?JXD>l62Q|^_Sq@j!ANvgT{riVVYL;3$FtCH_Cs1l=)Rfv# z!{EW-(7>QktLLO%Z!PNEHfrBvMiav$TDXFBg+C0hLn~w!Is2Bo=^t;f>1+&HKtqnlo29gKaGl7w1%S1(x-WNYX=7Pk) za>qV{3kMH|ceT*u&EnX^ECW(w!N4GCsldPpGRI=6vj_7~ZDB#lez!Lz5+HBlxZObc7hB9 zi*2?xusFcL4ASqx@a7?sCCnB}-EyGfCoT55Wq{bAptk^r@PnH*wV*Lnh^tw^hHbaZ zvA73O=)v$t)xLqX2`qlkEdx{(fei3qc*6@4gRmbvTI_Ly6io;I|A&Y@XaxBjp$J{1ZEOl$~V0gU{VZfuS;EW3nfk!71 zQSxYS10&0qrbL!KO^qxEYB-peH7#U0(sYpJMAJi-GtG=F7n&7Wt~5Kc+-Oc@xzpUp z@}PMk%ai7VEHCPtAF{l$P-OYw*8m+$Om>5|@zOg%gYTd=oJFz?bSNUd)cgPc28fs& zbO<~>5j1QH6@&JF(|x`F|BnDi#pB-<;9QY%8`Ss^@?d!F=>7lCAEdB)Dkd*(~m=YqyOK%)?#D6rIaS7_vRS6J|p0bI5=dNQzpiiE~Y1`dlou6G(Z z8F(xXFbGU!WQmyQ$PzO#ktJaQBTLGLhb$Q$4EK(Lq5_gQ8P0$z0gF4XcR*2u2-#P> zAjeu9WQnkNz#vq=r2cgUs1^W4g$KivqaaC;VheCqf)&cIJS`O%6hLwo2U%8FFfa&! z@;o?YFL@2lEfW}7R!mf6S>wU*q!Cm}fE)`d@Ihul&CW!yAG`#~gUe@dJi`mp(>U9@Bcq|Kt6+1Q}@BskQT`f(DCO~PVfJJ!82hN$qqLlQJ?bF`~P2w zDT@COKpI30F18A+ll>R6gW8@E3$5y{z*%#0BZEQBAM1+A2SNSc7c=4cf4h|kI7q=h zdC>^6928m>`&>gn;vNilCW3qoN&}z}0Hp&^DGF||f?5?zURO9aF!Gy`nxIZ18hPLlKmB??GFw5b=c;J0K1Or45kf9t_X_T5Pux0UL6F0o;o4V0iu# zZZNo!0I8=v7@l98T(C%!oTZN%hQ&`>`pOHN*}SakBoMXFNnE%iq~gK`jy zMY3rOB;=A=z5mZKoNTbTcDm*cCOJ(u$0mjXP$LhVGFsecfE%O-7}yY6k{rGN&(57* zu!G6dK9hl`p_75d(wl*$;WYz`r4|EA!zl)qhLw;Gxuqs()WdzrL_1hlB_$BtCa?pw zaQ`ou9I(Vr%6$)}vl0`%|Ig~3Y_QmPa{XSZ$zPX5GP$3b9I!M<%KZb>MM$1V@b&&b zvvPXCb|&M=@0a#7&F$UXuxt{elm`Q-=Lc#DAzUAO*Zco;&gm02G8s*dTd{>{j_qWT zm1#^KB9m)Y)-id=O#ZV{k7?H3$vUg#q&%P#vC$j7|Nn0Rg$TIhPxeTdoU$rR%A*C- zDbc3h|EDBEoWj03n`uSpy)cgM=N3fsO z*9J39KRdZ*t(@5Owch{#cQn*7uz;#ckbk`YFPS@e!&*NkkAz9<{G>eAK#gKTcrtvU z_x}lJCmSsGn7m<~8_3ch>w=^_PC(tuj8GZ2)cb$`MX-CPuRg{oHF@KDQKqS~lTWNK zlk#`~H5n#mV97x%qBA?D~HKbHbpUc z#!UXO$%@G{VY1HVBqoO)lP7GJV)M)ZE8DPHipjHJ@|n$AY|RW7&pi_+|JfYm<~aqD z2ZMaU#vlG%VbNms#)IMXS)?8^cmNXAj&0}^n_{uoa|XC&b@+3I2gB8kApYbjTg;d| zmrOph#fr(wV=~89IVR5)lQp*5$-zp;fT`a9|DTx&j-~(5H3ptrCbw+Olk&U*N>LUE z7}ya>!vC-L|4z-x4F`=U+i!~&>RVgC{581MUhi?aqJgtnX7ZYCa!h@-lh15(lk$86 zO;bn)_}%sX-@yqgAiO7+Zx3ejVws$mD(*k!$8XJ?381xIAO8Wi)GR-HKxj#$r`)lq`YJx0q4Ed`+p0hwe}3u zMDXI7oUltys9C~Nv+@HdIwvZF*6?`QOrEeyimhyq#ZoVi$s2ZwnU%k>Sn3r4>84*O z1*rt59Z<=9Ect-NQm+iCTqIJ=cufAYON+^?V6w(;GbbVYVpLuPU-a~kUz7%Vjz7%jN}{|VJ( z`!_+JfdRCTV505HoXH7?oFu*fK&|6IByVS5@BcNE&mZua%zoHg%7+K40?GAGbG`pp zpPYQ*fZya@hdrcxL@<>&zV-fJEeTeVb;Luhs?j!qwJ|Y!l}l|0)3S-(3>*`*8CV*$ z85lemc|XGBCf_(B$J8b<`NxrUpz+uhN3}rI6)-jF7?`62p(4Q4=9Xh(9894Cljof4 zVhR=5tZ}}GQ4Br+oC0cVK?Z0D|E@m->rc742_VRFVLJEqVhlUH0aV+wsT z`N1VIsn9nb3^uh8t&Al|Mt+$ra9K<$^p6LFjW1N%03jX5Fxlaxork=%$eItLd`l2 zj11r)vQT6Yn2_15GwF`Rxz&T4jWL)wbWb{FgfLp7E{=c$rJ7vF@;rZK60mxQL5Pj)Igm4kbws@ zQV&{rVVTXq*l6FZF*)U)mRYmO#GGae#|8$QhJVc}6MdR3LY_;2W|2RFEN__KtO4r8 zHSB9v0cj6uQ7~(G*=#WR$h|0|X3$ElX3$c*hLg=Y4X>LG8fu$Oy#N1s3JQ=$+h&sn z?q(HGc~Zm4z%bFa*<^CSeWkc&6CEzlC=ml_!Dur`X+vkTg$39D|6m(WH|v0Gs9|QV z01d58-~by5>f>&(bzp67)M~cS;bdTNT=ai|1t&yLV`j6;1g>U_i5bl%lP}ztVrn*- z{N{d;PzQLx--4U}e+V~&+QiIeo5=wWR4CD8|Ut?6FzllN^|K`0NLw zCr|j&1`?L|$^_zWmiZP3rfa@W0@DIN?}6yaAAX53HG53v_`S}o*~9z)led%qHhX|( z%|Y!QkS9Rw37pM7P|tmUc@8uZ-@w`IG5O8!cT66PlkfcTVsqc>{r~@q=?m-`MK(M9 z-NeEaZZQ1|BjYosaEI-8m>9j7nf9)juEEAQk8PjBgog|g(+$`d?Wc3IGlsM6bFgS+ zXqbM1jnR7gVs=J9HyIaFgk(g3Jyj)roCUL@8DpZ#O z2GbRU7|$_9nr#0d#F)j%6zMQMMubs`$>8Yp1`$R%rpSuv3q%;(m?CFP*AQh?l8QWl zWesGbrRMc3(^Etlql|7PfM(Tf6<8ZBHSg+p|NlP&!hU1n{r`Utg#8#49t{xo>mA!a zh%&BXG>d%T!N5?^!N|Z189arpfr(=9U|@*oXk_5iVF4`^f(-FAEM$b}+yq6G_y2$3sXL40s4vrPBpDwuMJr5KkYY4rijJ8cA;p-+6x}lYfE1&c zRCJH`|1Wbvsn@ZIAqQ07fM+3FqNhy%AjLR|N%P?J7HLK$t!RXOprNDWXz)^3@Bgn{ zq4tS@++vX&{bu?FX+|Zn81Q7P_y1R*A%+_exfqw}95Rfzm|_a1KapYFBox!*!N3>+ zD#0LiZ=A#Q6|#);m}1sU_mE>;#1wO7`WrdMFuqs@4+cgDh#9de(*xug_3UCjJQx_k zGu0N!u?3(utoQ$Cg`kyhAa$Vrokemicmav`|7Vd9H~xj0v1a-ndB!ZJ*elaD6d3*V zVnOR}q3d$u!0lo0|4%C+dj2GU!eol#e{h1gXo*`eeTf328dKbw>1Pxe<(T4jOn(EW zk4)!L1o1CS*8$THru%^D7t?bT8Ks!wK5Xw$WQ<}Ii~HgI|HVXTfR}(AYmpq!vi*k= zqZ*@-!pnvl(CoUxLr^Su|5vy<-9Ux$7gM~>bRAVjC8l_v=>e*Yc1-aN(7lii-tLnnxJ71XpNZM z%;|qr8S|LpS4_`QV?4(czhSzKI%5!1{Eq1p)EVoH;-N8o_pOc?IJNS4{}&eo&6ah@ zGBD^cFz7orG3bDs<%yvAy!aQ>9W)q?_~PF{V&iV7_kXdi(;GAxS1~1sOxMw5jAKgh znBJqwD94l#GJTCEqZ^ZS?DQ|1jL(=77EHgR#dwP;;llJC+Kg392{)#j=rAfVB|MlO zp~HBIDe1y=9bLvQIq^VHRpkBupU5OVP)GUy8&Cj(M&~S&6JAWeqRVK+m&oD4zzmJ) zM2+bpdW=>=i9Q|-Og|7QEtz3@f*xZQQ)0^WGkT1Z_!1jD7#LrG%(6&MTrfRHpHYb^ z@xb&6`iz_S5}zPaS`y3j00W3zi2>szrz927dRK_PBo_|`1``k);+`b%(m?P3SD-oa z*8-57MRF2o4LLNmB`ulmVaO=Ql&mm4!;n#pDOqFs1Tf!V`vyZsJ4U8ti|HSX7?nV@ zh%sXmh@N50c#19A#iAv-V0wlLqY;xp?({h(jDBp%Efy`w2c~~8VYC9N(=mnU3ovC& zV@kd-eTONdlTxyU_y4=#)c~N%8>GHwj}|2BE@fb{NKU>oUB-;DjxG5QNN)N9Ge$9x zSv$-ajo4B&Kw{fJm@yVHGNpt}PqAREV&c)<{=kBfi;*oQ!=fc6V)_S5MlZdT5{u-N z21qhEy%*H+_x{hd6B2ch30P33vPe!@VbPLOGCjkJv5zg~42Zq`j}>DWBNxY3h$fD; z(;ciCWhMv2vrMnCVZ6td^2VYiRbYF9E#o03u2czVHj)4@1)c8Tz_^JiRcHDa2gY?w z%&FU#I5PS%GNsx~|Kh}`#FXkXUBa2sjwv-^dW18hoKk9m^?t~b5bys-1wm=UIy1Ea z)F6h$Q)Jp2V)HB;{JQ?3Hv8CRzXi5FE-N1)2iIFW$$09k6XZj3Z#xABbo9!xoj75xGX*%_( zw<|1?(^94{@Mqk{meym@lBP2~CVQzCtLppf5n)mVLSz*4PqG&F+CTZ{w0=C+4iIN|33#BW;1X=7r3rysAlA`JHXmx zu`T@yXe`(J|L0y%uLiQqC}^gnToYI5mUCd_8wfSC7bCTPn6r~m^cHjAa10@EGh8P%9FWu|9<=%7C}}hIpCj4k?UmOz$nHd!#UyF}>%UejtTWn(^)QJ1LC%jC-f^ zq%tNkz2}`?kjfa(xOV!5RK{%HUht&D;@1`4|K4^^_ef)mW6GQ`eMK5$o6uWW-|z>h zboc)E)^@r>I-?X*=9K9%>5Ot|nR7t%{Gilqu`+W)0|$cynBAGVB!q#@OoxF%!Lf-! zMFT`PG6v`{Fo61PO%|P*YvB4iGq=F?z0BOxaDu_2fRmBIv565l46gR%ZE3SIK1b63YsK*fC$$`~Tk!poS=DQhItz zCgVE2=X)&{Ffr68->v}F_ul_raDvN&2G$!LGT<7@)v<}e1LQ96f45dnPsm~nlFF*E zc3@zHm^s_knt?$Gq~H7Bi@(#)WHCw!J?BI<^Lgm>A6blAY*|MvlCx$^*T`m^XO(pa z)IIV3zr+@7Ula2QP%Z!sN?9aly@1LoLgm&V$$goY!zjg+%`sgjhf&HZTLz+Z@mZ)+ z@JtNEm~0)W+(xJzq^Sp5Sd*M>Gra(8PQdgYusJDEwXqPjOpp~~5Vhc*l=uI|j!-#p zB?PsjWBLQIIdi7}0h_Z1V$Pzs5VefpfeonI9Z%#P$T#&yW zK-EG=IT*kdE7Y71P`N~iISk-U3sAWq(+_~m$>ErOCznx5E=L5amKUlPJl+aXo1-#a zB#%*#DaT~GOCIAfp&anCYw!QlK7!n3k(|>oT_&GViz%mNx<@`^l~T?ciWDH`;Juv-DA)}U5E_g=Q`~MVH(2Oo93xsro)+6R^m@ZJnD8-b= zGF_*LaUN5i$n-N{zRmO(MT~xac`4riXD$R4$RK~)KVT5DNY2Yi{(peM`~SZ?P%$x! zI*a7IIn!H;8THt5Gc2a(229^k%ortf z_bzI7xTiT?rG!yWD(?a$d?v1hWUmWL8$g>n5*auqI|Qk0pHRXm#mIDL;q*17j73a$ zbf+tnF*-5j{h6Lp#%RQpZ!>*H8DpGOehwtC^T8`oz5n<9wE*p2_;>d2bb)fv_QL5p z<&0)b_XDS=lryR^3 zTtc-4tSmhl7;88p^mIU*rT z29e1V-brnrR>!!7k;yD$x=#aRn9z~6pq100_ymo{f#w~iZ)spuV-lOP{Z0cT8za-< z-04pm8MTeJ@&5TBDVl!$o8T6*5F^WtNXl8632>Zr%hZaUHMz8(g(Q{Btg2#Q6&3;(4n7x3n@%*>H78Ga*d2 zlCwxQj{u2n-_pt`#K>hnrB<84(xSz@W%`9SMtjDe+XdPgqZrxD&semW@0ecD!RW_i z+OqvX2jekDCi5TDJGvNym@Igv-|1rXW3sTAuG7tUOlzko$VQOqU{|$R6j&r%fEvn3 zwpuh;v{)2Om+4{bV`7~&eN7Le6NvuM!+1??yCWp8{=WbUWbc354MAo#+A%=Wti=wC z7K;_r-}Exdaap`+Sjiv&;%^t}W8B2ZWGONIL_cE?pCzTZi;mf(d17F#WI zy#N0|UL?ih*u?2$y^z5JG0QbzAOHVh3YxL91MPF3D>elrZ*k1>h{Z}fYf;Z|NhZRR%{AL-eQXt3#j!2UVG#H|A!|? z0ayaGN@0(ci1+^=rZ6#^1FYbwpM+y}z7|WZ47~sUkc7*DJaFLue~YD74&MLYs3I+1 zv;lbl9I{KTJf`bRVwB<%n*!wrOb?jEDCGp_$AHX(g#7EBpfv%Y^#G1d>}$Z&^-#xx z)Oi2@UJ74hu*XVd`kG0MQfyW!AiJiYnZzi^W(8i2HT}aRMkyw%l<7Q^8I`o4_CVa3 zF|Jlrpp00#Wk;Ho*#6u5`@mip5eZ@FFem|6jLS?6YbB*$rATWO2;u!L%ui zQuQcKedGQA6)$2{9qS!X8UR^qvDE61#a*i}pviNHRbK-^;vhaq++wLUcpBLI|5r

21!`CsqkBK~5fHg07E7(6;rRI_NI$q}Jo34s;iS|OP@?w!|M?=Q$^?mnGDO2ksRbZ)-v2*C zmVAKBkp>64H8h8O5rk$r8;cf8{pkYJ7^Rr3w@lZW#;E0m9IDoPy#GJH2x?mEfDRI9 zVy*$@8j#^23oZ6opMWI9=W7v(gxSa9j`aypcAvgr8Ym#HOg}Jlf1trZbu`S-+URVmhOoT=Ef%rPgmia^C+x!)IJAmRkR?IF`~e z{mFDjH8$%%7RPKjrVGqqv|R_Py+w;%38?5t6#01{;YB`ZfiZYN z24qR7_y3nSK?&Rek_}m#ERNZMTN2*?-@Wzz{|)L|JMi*9@Bi80O>o}-|AHL_vd|*g z?uH8V_VWKpP@0$r=Vkj2HK#VTgH%xuP4Y?e6|*X;gG-!mJMqwj!e zk?DUxw6(!>nK_J7QuYy$1oieRD5gOfqCV|*1*p`Y9x#VdOv)a-9@hK+TX4w+mS;O$ zVX@S{VtNBuz5}WsoFKvSVEy)Urf&etZ-C0X!pyfgz~Er9)PB$O2Xh$3vh1Oy<6BWA zc?FB5_TZJM-v8hHwb*3O09ru?GCSc|19%~q_y0FfEjHQ5ycykfWj0aHh zofaGH6{aW5Wt3yG|1!N{E~A*51I(OKi}m&;LSZD7tea~D*IUxsV(fY;^lu0dC zIw(wkGnY}W-T}Ps#ryvoMzFmtk1Ohyt*)?G>HsYvUxOE$S=_Y`0rgWYmO6lIJ@5ao z!E5c2#G$3;Yfq3lNa8gR_rEp-i6cr{hbb0I9eV1al8}G{Eun*!I2KDC=6L_VKM|?a z5ddkn*bJ)j9F~BxBSi13o1nl2@of%3mUMdme{Bj5SWtF9pa2b|*NUJ31gQf>9z^eJ zUI|dhfdmnnU;PA!n!!r zi*0s)rkgBaRFeX=EAC%KQl|m311w*%fKe~XVFze71*8uYs^0$}7(%k8!wtlktiu=3 zm@JYS@YyV2bCMlJAg!`gNyte5KWLfYXfplJ0!B5lW(Lr_UClgbj(W%-1I|$v3mMy( z90R5wSjgzdxU4)tQ@+hB zn;E9JEM`<k-=78k9 z|37h^p0JcrjLX6T%2%D<0ODJMlaBZQC#=&KEM*h}wGwtL1(hu#({C(gloNB(fvN{L z{z0*0k?iC!oo5+i8L>c3m`G4Ig=kU*wo58S2VwF zW|(fWlCg@-=?rKQ@boP!8P~BneQ4HhW|*F_ig6hzh8MDk)Xas(a3hNVXe-WimDP-9 zAa}*AW|U%biI`rono*9)sbu<$)r?tEF3?f^$e)l@0~yW+EvcO@vj&oC5?Od^W<$+f z$RYwZGhz*69Ggo6Xr=4)J!=@{*j&Ih==29`7|rBdrdS+Hg_f`PR6+g*EujJ}yR$f! zRxsUUEn`ub%M$PZw||0`FM0oe2#G&XR&RM+VX@R@4QOGM_y5~BK_^3i!rS}*Wk^Z~ z&(*nrH@bWOkAS9h*upi39n=4;g}52IHyl*2Og_k<0ovy@-C`Z%Bqo;|)6cA9RO54j zmZ7)5g0>q>ThFM(W_<$e9gX#j)0kXdOh2%mQIE-0Wcr8ojCy>opn4J-H4ZnX>ug~3 zlJb#(cE%YIo$=60?|*$ur%%|xIEhVciueEj7p7m>#Aqeuqk^e6q}Tgj?@rKasqpES zH!>zm`50g-3f}4cujeU9(Jm<;8%+72r{4d11VPI=r{`=2IVuF)F$HabfG*_q{vTxN z{jWQ9`-RPn`xvEsQlJW$5v~qM^#0e`JGtSY(e_(g83h=nd|MzG0{?`Fo z4s0~tY&+u?KA!^679Wd+3>+58J~h*SY-em^@>wyxVFzOyo7fbKr9LO7^Xz0alk&L& zPW6cl9FX$KHxN8@Fk5WO^q8HDNn$?Gp(!6*@BjayCkHv~n0{p^qZX)O*v0543%&ofoSkg2*l7B!U5q)P1kSOWF-*#r2RdzlyE`O<%Q}@qm=C z0;VF*R_}jJ8{vwiwqMx8Xv8SzDdGJ;un^RNc5Gs>X|#d#)ImkOMY6BSbcKD4%Df-F z|Noz0s{lG|DEYwlfPIWYjMKR`GxG33mQs8FckA{3SHBbN*me6E=P-FnO!qm!sKn$O zGriydqZr8X9S0bLqHV*^ z6{5~%&UB7LAa$^{#7KeRJlFeQ%}J=bDbtUD)nP2u^ZxJj(EDEvFGQWE!t{p2j7ogX z0W}@U6`+FLQnNW=`i8@dPE5@K)4v=B`DM*?i6e}5Oukp9M;u{{WAc47ea8_-ExzV} zhLgzM+dzb^6MajJe~~_i%qd1WCcg{Q zZB8-fG5Ot@zUCC88k0Z6^ed+rmG~f?G0SWQ7K^3+3e#CmGb%B8S4`J9&8WoYonUdS zj$?YjX-4UK7K^3c6ChR9esEI`R2+h;6pLf^M=X|l&w2Pss&jv$&4TH#PBZePUeK0m1@Hg* znKjc(&oF8-d2gA%;0&Xfls|YEnfL#_;Qfe58eOJe0Lw#LntQ>u2a1uN(Ih=Dnu$?jDLFn%T)zsHKXZXmlzE-GeOJ0Kpg_>l`Bg$Z7})3+F%;O+F-hcwZTk)@VJ3(vH$ch?t}?PQDSrSl z749;!F{!YCm;p~2+1OM>SesN-rd?+gV^Yxoi9Wc>sK%z^!P=w}0JgD7C1$$LZALvg zl?;&4tc}w-Kr{%mHmSrgf~`@h0cmx(0Wy0Eh*@xzk)3e~hy}553y2A_kV)kTm+i-}8 zEh$w{)HAR)&In;`umnvqFhJa;>M{Mnbw)io)fAACAk5l0;|z!fVW^r4knv!*tAfK^ z;5s8aBPh5*p)WK2z#T?5Ce;HVMH@gKRJ{OVg49nJyUr*!9jyEhNNmFuMyPT%5itJ- zBRiuCm<5snIk%p*NzDR;LH2{_|40BV);P5QB*faJ<^jTBu_iSSkQfYu#SrR3Sew*B zz+z2mAuu%{8Z6d0H3Gy2sbOtWtB+u9QcGcNQUhB8k^o_-!VZCK1_dy?NeyIZ2h;(~ z3=9mQr)cuPy`98vshu>N*oIig2() zgl#}CbO73Qh;-C=HeA4tE*Fm^5s_iJeI!1fo+TW%`3VjN*(fV2#s{-C-1( z{s81ijV(}xC!h*%Koq_KD`e7S0NEhMq$vVcW~HeC_ip1{w9KOcPIw@B*2Z}~AR2^0 ziG{UE6XgHtpn#Oqi~tFPFl*y{84wM^EZ{KEOaOTt>=Vrb5EC36n&1)z92^4o7}*(T zfSo%1*eustTn56djSJu&f}{~`c-*r# zE`<96;#qBYnqqBSSOd}z!k~oC+N5m&VuLVi28iXOf*LDE05qRQ#Hc*Me#-$Ao zGS()oDbp36GwLyEgTn?~0%^B^f@#46Ms`MUfdvX;CT&D%tGxpx4-Q7{Gax277%za- zKLBwdGCx2}u*`x-jO>g8U@oYD(@_91K?NL>jsb{i@Qjg-Nyi1md~hGc3;{749)p+} zpu`OF18b8GxFAKC*a40qCY?FcFWhGoW763Gu4QzNOuqn1tvWX#;ji-q68<_r!0CLt z*keYa>7Zz2(=}ji()F13m{FV&Y$4c1x;Y@bK|Yq#tzm7_1xFEU~E;wMo ziAr}3NC!A~>VisfA4u-hh1Zs>jY|t)x*@q$_XUiPEXN5>uDXAa<)#iV5`9D!9fF#NPTc4 z0-_ZZG>{5!!VN~Q`hX3rjgyYBHU;cpZ7d96Z3;NR+E`@6+7xhtwXs-$wJG2NYh&>f z)~0|btc@iTSepVqur`*qur>w!U~Mc*VQmUzVQnnm!rBzb!`fJ_!P*ok!P;13!rBz5 z!`fKuz}ggO!`fJXg0;z0g0-;$B<=yBJwsR<8@I6fH@VDVZEPxFZE~5y+Ssha+T^Lg z+SvSpwJ9)ywXq$fA%V5A17tx4Yh&jI)~3J$*2Yc{zk;=~a|dfvU<+&G#0=J^z$vVa zlXNCtl-nNmlJNt--SQOHh7}sD4a;w^HZ0F!ZCJ^`+OQIwL0KDCa6IdH}PnayoRKdd9xM#xVM8z6r0oF#T z3f4yH4Aw^J9M(qZ30tQyU1H?2Si{dLfT=@U@%ZvYizx?_C_p8YNzh8C!|NU|TJO1jjeM=0}H6A{#4Av&C z5{T(qHPa7dGKq)?i2VQ0+60z?WUnTzn(YTNnU=BD>puZ2ZJfG*wMqX2ggs4zwaI{k zwaGw+wQ+g`Ym;gUYmo9!VD~|4VG`VUnpeqU=sQNPvpn{f1-Q-{}WpPp~VZPo0Krc2}uh4 z|0h}U|DWU<2rZ?seMt$^OjbtY>2_62%Xy3y5=#^eO|4AKtcTrYEXfUxfmF>Uut9W<28kPfuS4;fW-d)v)S_hpUsv3|7_m;|7Y_6LR2`Ug)hoWdl&J!J}0KVyB!|9_D${{M>(`TsA<2SS6`2n;d}hX4PI`tko?)QA87 zq8XrU5Fd;|YHadKb8_rJEC~MpFXsz>Tu(>=E#z}+;Et*%=)#->|NrHjAp#TdDRz(4 z!(BqyA!J#AYJTp5|NnA-Ac?tx44r}`fQ6qIf{@SK17YXOKxmM!@++pB%wU=?y5ax7 zTAu&^Y9;>vt5x~`uh!uIzgnB^FJ>@hvqbj%|JT@pz)czmHcY%J0#gho*O2i4A2!_B zvVF~5rss^Z0ssHC!Egf-8!Wbc!+a)VCdY>V|GFFg|Lci?VwwN{x(`6uAi5h|?m!YQ z1H=D+JuUzL_3Zfnujk4Cf4wdL|Mg{TS6Rd~pIfly|G%S4{{K6=-Xa4^?dT0BU zwM=r1TvBsF7{shBHJcKq|5?YR&S?rd(GRpFYx0FFBGVn#GwDeM!p1@oqbdKwmU{mM z9fh!o(Q|t3Rwl9O&(||~O9k$L4yPbSSO0}R^#0q=3mQ%_o?gF!DO{=PN&TKvBGz*l z7`^|=w}OVUYGfrqCteveR5d;E{wFtg`i~7vby9(6pyNVFhK0=a{@Z&JbRb2S7P2{V zj>zV8>}OyA9Tg5SPj=&UmrYE^qyis6M@Zqj@4f#8b9(>nF$GN~cuvpV%;YN-2pd>O zjPw5siuC^5-3n18yM@VDDhRd@8h+4+_rJiE-haEULKK|^D}qgMAO>Xr1^o2>+ocLo zRJ#>q5^Mqk$&Ue^-hVqwA&PXjffR*69gY~J`sY8>`)|ilkRqSy54JJ!Gya|aVH=a1 zR8S6P4EWvk{@cO1JzzT%8>3WE15^Q$vwZh@|80A@yirQb9K`6?r}M{@cO} zS0p`s!)_)azMvNf7kEWZzp$H0PAZrM>TIMm=%woYw>fayE++5k_HB%;lO2BXOm;XZ zKD~Mm6Teij1ZL{-?DYQI1lk?%G5yURCNZ)6BNj`W9)M2ds9B;B09xPS{m++oy2M^4 zdqMCf>&99J1`9?84siC!*vsTr-^>82tQ+Ql=5vB|K=U@BB}L$)dLJ^#OkiZ-@cwt8 z6EUaF3|a>UK7Q0vGyjOiv8MYqCk+BXgRmjT800LL2AhBqF3243e`j<-;vha~0iVUv zUbNq{3&QC6vPHi^LhU}_!Y6Qg6R%e&tcH{ zYAz2zYpuQi9nXc#<}fX2RAvwW$y+Q9t^qlu;UohC$QZn`1s2B&u6Y0d7l=cCjm5Dd3Ge^^3~|WsusBv6bNl3{VIs>l2P9~>bNQette+QR$)9~>bNQe$zf`i1xZKNAzM z2T@3e#j%