From: Ben Herrenschmidt <b...@kernel.crashing.org> Also instantiate the USB keyboard and mouse when that option is used (you can still use -device to create individual devices without all the defaults)
Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> --- hw/spapr.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/hw/spapr.c b/hw/spapr.c index 740881b..bf38823 100644 --- a/hw/spapr.c +++ b/hw/spapr.c @@ -46,6 +46,7 @@ #include "kvm_ppc.h" #include "pci.h" #include "usb.h" +#include "pc.h" #include "exec-memory.h" @@ -83,6 +84,7 @@ #define PHANDLE_XICP 0x00001111 sPAPREnvironment *spapr; +static bool spapr_has_graphics; qemu_irq spapr_allocate_irq(uint32_t hint, uint32_t *irq_num, enum xics_irq_type type) @@ -258,6 +260,9 @@ static void *spapr_create_fdt_skel(const char *cpu_model, _FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop)))); } _FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device))); + _FDT((fdt_property_cell(fdt, "qemu,graphic-width", graphic_width))); + _FDT((fdt_property_cell(fdt, "qemu,graphic-height", graphic_height))); + _FDT((fdt_property_cell(fdt, "qemu,graphic-depth", graphic_depth))); _FDT((fdt_end_node(fdt))); @@ -504,7 +509,9 @@ static void spapr_finalize_fdt(sPAPREnvironment *spapr, } } - spapr_populate_chosen_stdout(fdt, spapr->vio_bus); + if (!spapr_has_graphics) { + spapr_populate_chosen_stdout(fdt, spapr->vio_bus); + } _FDT((fdt_pack(fdt))); @@ -557,6 +564,37 @@ static void spapr_cpu_reset(void *opaque) cpu_reset(CPU(cpu)); } +static bool spapr_vga_init(sPAPREnvironment *spapr) +{ + PCIBus *pci_bus = QLIST_FIRST(&spapr->phbs)->host_state.bus; + + if (!pci_bus && (vga_interface_type != VGA_NONE)) { + fprintf(stderr, "Can't instantiate VGA interface without a PCI bus\n"); + exit(1); + } + + /* Default is nothing */ +#if 0 /* Enable this once we merge a SLOF which works with Cirrus */ + if (cirrus_vga_enabled) { + pci_cirrus_vga_init(pci_bus); + } else +#endif + if (vmsvga_enabled) { + fprintf(stderr, "Warning: vmware_vga not available," + " using standard VGA instead\n"); + pci_vga_init(pci_bus); +#ifdef CONFIG_SPICE + } else if (qxl_enabled) { + pci_create_simple(pci_bus, -1, "qxl-vga"); +#endif + } else if (std_vga_enabled) { + pci_vga_init(pci_bus); + } else { + return false; + } + return true; +} + /* pSeries LPAR / sPAPR hardware init */ static void ppc_spapr_init(ram_addr_t ram_size, const char *boot_device, @@ -711,10 +749,20 @@ static void ppc_spapr_init(ram_addr_t ram_size, spapr_vscsi_create(spapr->vio_bus); } + /* Graphics */ + if (spapr_vga_init(spapr)) { + spapr_has_graphics = true; + usb_enabled = 1; + } + /* USB */ if (usb_enabled) { pci_create_simple(QLIST_FIRST(&spapr->phbs)->host_state.bus, -1, "pci-ohci"); + if (spapr_has_graphics) { + usbdevice_create("keyboard"); + usbdevice_create("mouse"); + } } if (rma_size < (MIN_RMA_SLOF << 20)) { -- 1.7.10.4