The names of some device tree properties are different on old world and
new world Mac hardware and the name of the root node is always
"device-tree" on Apple's OpenFirmware implementation. MorphOS on Apple
hardware expects these names to find these devices.
Signed-off-by: BALATON Zoltan <balaton(a)eik.bme.hu>
---
v2: improved commit log
v3: fixed a typo in the device type of the pmu node (via-pmu instead of via_pmu)
---
Index: openbios-devel/arch/ppc/qemu/init.c
===================================================================
--- openbios-devel/arch/ppc/qemu/init.c (revision 1286)
+++ openbios-devel/arch/ppc/qemu/init.c (working copy)
@@ -702,6 +732,12 @@
push_str("/");
fword("find-device");
+ /* Apple calls the root node device-tree */
+ if (is_apple()) {
+ push_str("device-tree");
+ fword("device-name");
+ }
+
switch(machine_id) {
case ARCH_HEATHROW: /* OldWorld */
Index: openbios-devel/drivers/cuda.c
===================================================================
--- openbios-devel/drivers/cuda.c (revision 1286)
+++ openbios-devel/drivers/cuda.c (working copy)
@@ -184,32 +184,33 @@
phandle_t ph=get_cur_dev();
int props[2];
- push_str("via-cuda");
+ push_str((is_oldworld() ? "via-cuda" : "via-pmu"));
fword("device-type");
set_int_property(ph, "#address-cells", 1);
set_int_property(ph, "#size-cells", 0);
- set_property(ph, "compatible", "cuda", 5);
-
props[0] = __cpu_to_be32(IO_CUDA_OFFSET);
props[1] = __cpu_to_be32(IO_CUDA_SIZE);
set_property(ph, "reg", (char *)&props, sizeof(props));
- /* on newworld machines the cuda is on interrupt 0x19 */
+ if (is_oldworld()) {
+ set_property(ph, "compatible", "cuda", 5);
+ /* we emulate an oldworld hardware, so we must use
+ * non-standard oldworld property (needed by linux 2.6.18)
+ */
+ set_int_property(ph, "AAPL,interrupts", 0x12);
+ } else {
+ set_property(ph, "compatible", "pmu", 4);
+ /* on newworld machines the cuda is on interrupt 0x19 */
- props[0] = 0x19;
- props[1] = 0;
- NEWWORLD(set_property(ph, "interrupts", (char *)props, sizeof(props)));
- NEWWORLD(set_int_property(ph, "#interrupt-cells", 2));
+ props[0] = 0x19;
+ props[1] = 0;
+ set_property(ph, "interrupts", (char *)&props, sizeof(props));
+ set_int_property(ph, "#interrupt-cells", 2);
+ }
- /* we emulate an oldworld hardware, so we must use
- * non-standard oldworld property (needed by linux 2.6.18)
- */
-
- OLDWORLD(set_int_property(ph, "AAPL,interrupts", 0x12));
-
bind_func("ppc32-reset-all", ppc32_reset_all);
push_str("' ppc32-reset-all to reset-all");
fword("eval");
@@ -380,7 +381,8 @@
ph = find_dev(buf);
set_property(ph, "device_type", "power-mgt", 10);
- set_property(ph, "compatible", "power-mgt", 10);
+ OLDWORLD(set_property(ph, "compatible", "power-mgt", 10));
+ NEWWORLD(set_property(ph, "compatible", "via-pmu-99", 11));
}
cuda_t *cuda_init (const char *path, phys_addr_t base)
@@ -395,11 +397,13 @@
if (cuda == NULL)
return NULL;
- snprintf(buf, sizeof(buf), "%s/via-cuda", path);
+ OLDWORLD(snprintf(buf, sizeof(buf), "%s/via-cuda", path));
+ NEWWORLD(snprintf(buf, sizeof(buf), "%s/via-pmu", path));
REGISTER_NAMED_NODE(ob_cuda, buf);
aliases = find_dev("/aliases");
- set_property(aliases, "via-cuda", buf, strlen(buf) + 1);
+ OLDWORLD(set_property(aliases, "via-cuda", buf, strlen(buf) + 1));
+ NEWWORLD(set_property(aliases, "via-pmu", buf, strlen(buf) + 1));
cuda->base = base;
cuda_writeb(cuda, B, cuda_readb(cuda, B) | TREQ | TIP);