diff --git a/hw/ppce500_mpc8544ds.c b/hw/ppce500_mpc8544ds.c index c7c16c1267d08efb547a6a6580751c98964103f5..c68e9949b8bd3919c4ef383480f48d9b531d1976 100644 --- a/hw/ppce500_mpc8544ds.c +++ b/hw/ppce500_mpc8544ds.c @@ -81,6 +81,8 @@ static int mpc8544_load_device_tree(CPUPPCState *env, char compatible[] = "MPC8544DS\0MPC85xxDS"; char model[] = "MPC8544DS"; char soc[128]; + char ser0[128]; + char ser1[128]; filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, BINARY_DEVICE_TREE_FILE); if (!filename) { @@ -182,6 +184,7 @@ static int mpc8544_load_device_tree(CPUPPCState *env, } } + qemu_devtree_add_subnode(fdt, "/aliases"); /* XXX These should go into their respective devices' code */ snprintf(soc, sizeof(soc), "/soc8544@%x", MPC8544_CCSRBAR_BASE); qemu_devtree_add_subnode(fdt, soc); @@ -196,6 +199,38 @@ static int mpc8544_load_device_tree(CPUPPCState *env, /* XXX should contain a reasonable value */ qemu_devtree_setprop_cell(fdt, soc, "bus-frequency", 0); + /* + * We have to generate ser1 first, because Linux takes the first + * device it finds in the dt as serial output device. And we generate + * devices in reverse order to the dt. + */ + snprintf(ser1, sizeof(ser1), "%s/serial@%x", soc, + MPC8544_SERIAL1_REGS_BASE - MPC8544_CCSRBAR_BASE); + qemu_devtree_add_subnode(fdt, ser1); + qemu_devtree_setprop_string(fdt, ser1, "device_type", "serial"); + qemu_devtree_setprop_string(fdt, ser1, "compatible", "ns16550"); + qemu_devtree_setprop_cells(fdt, ser1, "reg", MPC8544_SERIAL1_REGS_BASE - + MPC8544_CCSRBAR_BASE, 0x100); + qemu_devtree_setprop_cell(fdt, ser1, "cell-index", 1); + qemu_devtree_setprop_cell(fdt, ser1, "clock-frequency", 0); + qemu_devtree_setprop_cells(fdt, ser1, "interrupts", 42, 2); + qemu_devtree_setprop_phandle(fdt, ser1, "interrupt-parent", mpic); + qemu_devtree_setprop_string(fdt, "/aliases", "serial1", ser1); + + snprintf(ser0, sizeof(ser0), "%s/serial@%x", soc, + MPC8544_SERIAL0_REGS_BASE - MPC8544_CCSRBAR_BASE); + qemu_devtree_add_subnode(fdt, ser0); + qemu_devtree_setprop_string(fdt, ser0, "device_type", "serial"); + qemu_devtree_setprop_string(fdt, ser0, "compatible", "ns16550"); + qemu_devtree_setprop_cells(fdt, ser0, "reg", MPC8544_SERIAL0_REGS_BASE - + MPC8544_CCSRBAR_BASE, 0x100); + qemu_devtree_setprop_cell(fdt, ser0, "cell-index", 0); + qemu_devtree_setprop_cell(fdt, ser0, "clock-frequency", 0); + qemu_devtree_setprop_cells(fdt, ser0, "interrupts", 42, 2); + qemu_devtree_setprop_phandle(fdt, ser0, "interrupt-parent", mpic); + qemu_devtree_setprop_string(fdt, "/aliases", "serial0", ser0); + qemu_devtree_setprop_string(fdt, "/chosen", "linux,stdout-path", ser0); + ret = rom_add_blob_fixed(BINARY_DEVICE_TREE_FILE, fdt, fdt_size, addr); if (ret < 0) { goto out; diff --git a/pc-bios/mpc8544ds.dts b/pc-bios/mpc8544ds.dts index 01b53baa680404a35a99cb4a8ee8d44f7953b361..e536ab1e3fb8a9eb17a76aefcc7258e9ad6e49e4 100644 --- a/pc-bios/mpc8544ds.dts +++ b/pc-bios/mpc8544ds.dts @@ -12,32 +12,10 @@ /dts-v1/; / { aliases { - serial0 = &serial0; - serial1 = &serial1; pci0 = &pci0; }; soc8544@e0000000 { - serial0: serial@4500 { - cell-index = <0>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x4500 0x100>; - clock-frequency = <0>; - interrupts = <42 2>; - interrupt-parent = <&mpic>; - }; - - serial1: serial@4600 { - cell-index = <1>; - device_type = "serial"; - compatible = "ns16550"; - reg = <0x4600 0x100>; - clock-frequency = <0>; - interrupts = <42 2>; - interrupt-parent = <&mpic>; - }; - mpic: pic@40000 { interrupt-controller; #address-cells = <0>; @@ -85,8 +63,4 @@ #address-cells = <3>; reg = <0xe0008000 0x1000>; }; - - chosen { - linux,stdout-path = "/soc8544@e0000000/serial@4500"; - }; };