[OpenBIOS] [PATCH v3] Updated some device tree properties to match names used by Apple for compatibility with MorphOS
BALATON Zoltan
balaton at eik.bme.hu
Mon May 5 11:30:53 CEST 2014
On Sun, 4 May 2014, Mark Cave-Ayland wrote:
> On 21/04/14 21:58, BALATON Zoltan wrote:
>> 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 at 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);
>
> This looks reasonable to me. Alex, are you able to apply or Ack as
> appropriate?
One thing I know about that changing via-cuda to via-pmu breaks the ADB
keyboard for the Finnix Linux image I've tried although it still works in
OpenBIOS. (This might be a bug in the Linux driver, I did not investigate
further.) The proper fix to use a usb keyboard to match real hardware
breaks OpenBIOS though.
Regards,
BALATON Zoltan
More information about the OpenBIOS
mailing list