📄 ohw.diff
字号:
- OF_prop_string_new(OF_env, ata, "model", "ata-4");-#endif- OF_prop_int_new(OF_env, ata, "#address-cells", 1);- OF_prop_int_new(OF_env, ata, "#size-cells", 0);- regs[0].address = 0x0001F000;- regs[0].size = 0x00001000;-#if 0 // HACK: Don't set up DMA registers- regs[1].address = 0x00008A00;- regs[1].size = 0x00001000;- OF_property_new(OF_env, ata, "reg",- regs, 2 * sizeof(OF_regprop_t));-#else- OF_property_new(OF_env, ata, "reg",- regs, sizeof(OF_regprop_t));-#endif- OF_prop_int_new(OF_env, ata, "interrupt-parent", pic_phandle);- regs[0].address = 0x00000013;- regs[0].size = 0x00000001;- regs[1].address = 0x0000000B;- regs[1].size = 0x00000000;- OF_property_new(OF_env, ata, "interrupts",- regs, 2 * sizeof(OF_regprop_t));- ide_pci_pmac_register(base_address + 0x1f000, 0x00000000, ata);-- }- {- OF_node_t *ata;- OF_regprop_t regs[2];- ata = OF_node_new(OF_env, mio, "ata-4", 0x20000);- if (ata == NULL) {- ERROR("Cannot create 'ata-4'\n");- goto out;- }- OF_prop_string_new(OF_env, ata, "device_type", "ata");-#if 1- OF_prop_string_new(OF_env, ata, "compatible", "keylargo-ata");- OF_prop_string_new(OF_env, ata, "model", "ata-4");-#else- OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");- OF_prop_string_new(OF_env, ata, "model", "ata-4");-#endif- OF_prop_int_new(OF_env, ata, "#address-cells", 1);- OF_prop_int_new(OF_env, ata, "#size-cells", 0);- regs[0].address = 0x00020000;- regs[0].size = 0x00001000;-#if 0 // HACK: Don't set up DMA registers- regs[1].address = 0x00008A00;- regs[1].size = 0x00001000;- OF_property_new(OF_env, ata, "reg",- regs, 2 * sizeof(OF_regprop_t));-#else- OF_property_new(OF_env, ata, "reg",- regs, sizeof(OF_regprop_t));-#endif- OF_prop_int_new(OF_env, ata, "interrupt-parent", pic_phandle);- regs[0].address = 0x00000014;- regs[0].size = 0x00000001;- regs[1].address = 0x0000000B;- regs[1].size = 0x00000000;- OF_property_new(OF_env, ata, "interrupts",- regs, 2 * sizeof(OF_regprop_t));- ide_pci_pmac_register(0x00000000, base_address + 0x20000, ata);-+ /* Keylargo IDE controller: need some work (DMA problem ?) */+ if (arch == ARCH_MAC99) {+ keylargo_ata(mio, base_address, 0x1f000, 0x13, 0xb, pic_phandle);+ keylargo_ata(mio, base_address, 0x20000, 0x14, 0xb, pic_phandle); }+#if 0 /* Timer */ { OF_node_t *tmr;@@ -2746,10 +2871,11 @@ regs, sizeof(OF_regprop_t)); OF_node_put(OF_env, tmr); }+#endif /* VIA-PMU */ { /* Controls adb, RTC and power-mgt (forget it !) */- OF_node_t *via, *adb, *rtc;+ OF_node_t *via, *adb; 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 +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);+ if (arch == ARCH_HEATHROW) {+ OF_prop_int_new(OF_env, via, "interrupts", 0x12);+ } else { regs[0].address = 0x00000019; regs[0].size = 0x00000001; OF_property_new(OF_env, via, "interrupts", regs, sizeof(OF_regprop_t));+ }+ /* force usage of OF bus speeds */+ OF_prop_int_new(OF_env, via, "BusSpeedCorrect", 1); #if 0 OF_prop_int_new(OF_env, via, "pmu-version", 0x00D0740C); #endif-#if 1+ {+ OF_node_t *kbd, *mouse; /* ADB pseudo-device */ adb = OF_node_new(OF_env, via, "adb", OF_ADDRESS_NONE); if (adb == NULL) {@@ -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);- /* XXX: add "keyboard@2" and "mouse@3" */- OF_node_put(OF_env, adb);-#endif++ kbd = OF_node_new(OF_env, adb, "keyboard", 2);+ if (kbd == NULL) {+ ERROR("Cannot create 'kbd'\n");+ goto out;+ }+ OF_prop_string_new(OF_env, kbd, "device_type", "keyboard");+ OF_prop_int_new(OF_env, kbd, "reg", 2);++ mouse = OF_node_new(OF_env, adb, "mouse", 3);+ if (mouse == NULL) {+ ERROR("Cannot create 'mouse'\n");+ goto out;+ }+ OF_prop_string_new(OF_env, mouse, "device_type", "mouse");+ OF_prop_int_new(OF_env, mouse, "reg", 3);+ OF_prop_int_new(OF_env, mouse, "#buttons", 3);+ }+ {+ OF_node_t *rtc; rtc = OF_node_new(OF_env, via, "rtc", OF_ADDRESS_NONE); if (rtc == NULL) {@@ -2813,14 +2963,68 @@ OF_prop_string_new(OF_env, rtc, "compatible", "rtc"); #endif OF_node_put(OF_env, rtc);- OF_node_put(OF_env, via); }+ // OF_node_put(OF_env, via);+ }+ {+ OF_node_t *pmgt;+ pmgt = OF_node_new(OF_env, mio, "power-mgt", OF_ADDRESS_NONE);+ OF_prop_string_new(OF_env, pmgt, "device_type", "power-mgt");+ OF_prop_string_new(OF_env, pmgt, "compatible", "cuda");+ 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); OF_node_put(OF_env, chs); OF_node_put(OF_env, als); } +void OF_finalize_pci_ide (void *dev, + uint32_t io_base0, uint32_t io_base1,+ uint32_t io_base2, uint32_t io_base3)+{+ OF_env_t *OF_env = OF_env_main;+ OF_node_t *pci_ata = dev;+ OF_node_t *ata, *atas[2];+ int i;++ OF_prop_int_new(OF_env, pci_ata, "#address-cells", 1);+ OF_prop_int_new(OF_env, pci_ata, "#size-cells", 0);++ /* XXX: Darwin handles only one device */+ for(i = 0; i < 1; i++) {+ ata = OF_node_new(OF_env, pci_ata, "ata-4", i);+ if (ata == NULL) {+ ERROR("Cannot create 'ata-4'\n");+ return;+ }+ OF_prop_string_new(OF_env, ata, "device_type", "ata");+ OF_prop_string_new(OF_env, ata, "compatible", "cmd646-ata");+ OF_prop_string_new(OF_env, ata, "model", "ata-4");+ OF_prop_int_new(OF_env, ata, "#address-cells", 1);+ OF_prop_int_new(OF_env, ata, "#size-cells", 0);+ OF_prop_int_new(OF_env, ata, "reg", i);+ atas[i] = ata;+ }+ ide_pci_pc_register(io_base0, io_base1, io_base2, io_base3,+ atas[0], atas[1]);+}+ /*****************************************************************************/ /* Fake package */ static void OF_method_fake (OF_env_t *OF_env)@@ -2862,11 +3066,11 @@ /* As we get a 1:1 mapping, do nothing */ ihandle = popd(OF_env); args = (void *)popd(OF_env);- address = popd(OF_env);- virt = popd(OF_env);- size = popd(OF_env); popd(OF_env);- OF_DPRINTF("Translate address %0x %0x %0x %0x\n", ihandle, address,+ size = popd(OF_env);+ virt = popd(OF_env);+ address = popd(OF_env);+ OF_DPRINTF("Map %0x %0x %0x %0x\n", ihandle, address, virt, size); pushd(OF_env, 0); }@@ -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);- OF_prop_int_new(OF_env, dsk, "reg", 0);+ OF_prop_int_new(OF_env, dsk, "reg", devnum); 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 +3636,8 @@ } void OF_vga_register (const unsigned char *name, unused uint32_t address,- int width, int height, int depth)+ int width, int height, int depth,+ unsigned long vga_bios_addr, unsigned long vga_bios_size) { OF_env_t *OF_env; unsigned char tmp[OF_NAMELEN_MAX];@@ -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 */++ if (vga_bios_size >= 8) {+ const uint8_t *p;+ int size;+ /* check the QEMU VGA BIOS header */+ p = (const uint8_t *)vga_bios_addr;+ if (p[0] == 'N' && p[1] == 'D' && p[2] == 'R' && p[3] == 'V') {+ size = *(uint32_t *)(p + 4);+ OF_property_new(OF_env, disp, "driver,AAPL,MacOS,PowerPC", + p + 8, size);+ }+ } out: OF_node_put(OF_env, disp); }@@ -4451,7 +4668,10 @@ break; case 0x233441d3: /* MacOS X 10.2 and OpenDarwin 1.41 */ /* Create "memory-map" pseudo device */- popd(OF_env);+ {+ OF_node_t *map;+ uint32_t phandle;+ /* Find "/packages" */ chs = OF_pack_find_by_name(OF_env, OF_node_root, "/chosen"); if (chs == NULL) {@@ -4459,10 +4679,6 @@ ERROR("Cannot get '/chosen'\n"); break; }- {-#if 1- OF_node_t *map;- uint32_t phandle; map = OF_node_new(OF_env, chs, "memory-map", OF_ADDRESS_NONE); if (map == NULL) { pushd(OF_env, -1);@@ -4473,11 +4689,8 @@ OF_node_put(OF_env, map); OF_node_put(OF_env, chs); pushd(OF_env, phandle);- }-#else- pushd(OF_env, 0);-#endif pushd(OF_env, 0);+ } break; case 0x32a2d18e: /* MacOS X 10.2 and OpenDarwin 6.02 */ /* Return screen ihandle */@@ -4540,9 +4753,10 @@ case 0x4ad41f2d: /* Yaboot: wait 10 ms: sure ! */ break;+ default: /* ERROR */- printf("Script:\n%s\n", FString);+ printf("Script: len=%d\n%s\n", (int)strlen(FString), FString); 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-07 23:27:37.000000000 +0200@@ -99,8 +99,8 @@ uint16_t min_grant; uint16_t max_latency; uint8_t irq_line;- uint32_t regions[6];- uint32_t sizes[6];+ uint32_t regions[7]; /* the region 6 is the PCI ROM */+ uint32_t sizes[7]; pci_device_t *next; }; @@ -158,6 +158,7 @@ /* IRQ numbers assigned to PCI IRQs */ static uint8_t prep_pci_irqs[4] = { 9, 11, 9, 11 };+static uint8_t heathrow_pci_irqs[4] = { 0x15, 0x16, 0x17, 0x18 }; static uint8_t pmac_pci_irqs[4] = { 8, 9, 10, 11 }; /* PREP PCI host */@@ -399,6 +400,79 @@ &uninorth_config_readl, &uninorth_config_writel, }; +/* Grackle PCI host */++static uint32_t grackle_cfg_address (pci_bridge_t *bridge,+ uint8_t bus, uint8_t devfn,+ uint8_t offset)+{+ uint32_t addr;+ addr = 0x80000000 | (bus << 16) | (devfn << 8) | (offset & 0xfc);+ stswap32((uint32_t *)bridge->cfg_addr, addr);+ return bridge->cfg_data + (offset & 3);+}++static uint8_t grackle_config_readb (pci_bridge_t *bridge,+ uint8_t bus, uint8_t devfn,+ uint8_t offset)+{+ uint32_t addr;+ addr = grackle_cfg_address(bridge, bus, devfn, offset);+ return *((uint8_t *)addr);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -