vga: improve VGA logic

Improve VGA selection logic, push check for device availabilty to vl.c.
Create the devices at board level unconditionally.

Remove now unused pci_try_create*() functions.

Make PCI VGA devices optional.

Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
Blue Swirl 2011-09-27 19:15:42 +00:00
parent 0ae4699694
commit a369da5f31
12 changed files with 55 additions and 64 deletions

View File

@ -121,11 +121,9 @@ void alpha_pci_vga_setup(PCIBus *pci_bus)
pci_cirrus_vga_init(pci_bus); pci_cirrus_vga_init(pci_bus);
return; return;
case VGA_VMWARE: case VGA_VMWARE:
if (pci_vmsvga_init(pci_bus)) { pci_vmsvga_init(pci_bus);
return; return;
} }
break;
}
/* If VGA is enabled at all, and one of the above didn't work, then /* If VGA is enabled at all, and one of the above didn't work, then
fallback to Standard VGA. */ fallback to Standard VGA. */
if (vga_interface_type != VGA_NONE) { if (vga_interface_type != VGA_NONE) {

View File

@ -22,7 +22,6 @@ typedef struct QEMUMachine {
unsigned int no_serial:1, unsigned int no_serial:1,
no_parallel:1, no_parallel:1,
use_virtcon:1, use_virtcon:1,
no_vga:1,
no_floppy:1, no_floppy:1,
no_cdrom:1, no_cdrom:1,
no_sdcard:1; no_sdcard:1;

View File

@ -996,11 +996,7 @@ void mips_malta_init (ram_addr_t ram_size,
if (cirrus_vga_enabled) { if (cirrus_vga_enabled) {
pci_cirrus_vga_init(pci_bus); pci_cirrus_vga_init(pci_bus);
} else if (vmsvga_enabled) { } else if (vmsvga_enabled) {
if (!pci_vmsvga_init(pci_bus)) { pci_vmsvga_init(pci_bus);
fprintf(stderr, "Warning: vmware_vga not available,"
" using standard VGA instead\n");
pci_vga_init(pci_bus);
}
} else if (std_vga_enabled) { } else if (std_vga_enabled) {
pci_vga_init(pci_bus); pci_vga_init(pci_bus);
} }

View File

@ -1085,11 +1085,6 @@ DeviceState *pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
} else if (vmsvga_enabled) { } else if (vmsvga_enabled) {
if (pci_bus) { if (pci_bus) {
dev = pci_vmsvga_init(pci_bus); dev = pci_vmsvga_init(pci_bus);
if (!dev) {
fprintf(stderr, "Warning: vmware_vga not available,"
" using standard VGA instead\n");
dev = pci_vga_init(pci_bus);
}
} else { } else {
fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__); fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__);
} }

View File

@ -1572,21 +1572,6 @@ PCIDevice *pci_create_multifunction(PCIBus *bus, int devfn, bool multifunction,
return DO_UPCAST(PCIDevice, qdev, dev); return DO_UPCAST(PCIDevice, qdev, dev);
} }
PCIDevice *pci_try_create_multifunction(PCIBus *bus, int devfn,
bool multifunction,
const char *name)
{
DeviceState *dev;
dev = qdev_try_create(&bus->qbus, name);
if (!dev) {
return NULL;
}
qdev_prop_set_uint32(dev, "addr", devfn);
qdev_prop_set_bit(dev, "multifunction", multifunction);
return DO_UPCAST(PCIDevice, qdev, dev);
}
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn, PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
bool multifunction, bool multifunction,
const char *name) const char *name)
@ -1606,11 +1591,6 @@ PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name)
return pci_create_simple_multifunction(bus, devfn, false, name); return pci_create_simple_multifunction(bus, devfn, false, name);
} }
PCIDevice *pci_try_create(PCIBus *bus, int devfn, const char *name)
{
return pci_try_create_multifunction(bus, devfn, false, name);
}
static int pci_find_space(PCIDevice *pdev, uint8_t size) static int pci_find_space(PCIDevice *pdev, uint8_t size)
{ {
int config_size = pci_config_size(pdev); int config_size = pci_config_size(pdev);

View File

@ -469,12 +469,8 @@ PCIDevice *pci_create_multifunction(PCIBus *bus, int devfn, bool multifunction,
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn, PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
bool multifunction, bool multifunction,
const char *name); const char *name);
PCIDevice *pci_try_create_multifunction(PCIBus *bus, int devfn,
bool multifunction,
const char *name);
PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name); PCIDevice *pci_create(PCIBus *bus, int devfn, const char *name);
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name); PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
PCIDevice *pci_try_create(PCIBus *bus, int devfn, const char *name);
static inline int pci_is_express(const PCIDevice *d) static inline int pci_is_express(const PCIDevice *d)
{ {

View File

@ -80,6 +80,10 @@ static DeviceInfo *qdev_find_info(BusInfo *bus_info, const char *name)
return NULL; return NULL;
} }
bool qdev_exists(const char *name)
{
return !!qdev_find_info(NULL, name);
}
static void qdev_property_add_legacy(DeviceState *dev, Property *prop, static void qdev_property_add_legacy(DeviceState *dev, Property *prop,
Error **errp); Error **errp);

View File

@ -179,6 +179,7 @@ typedef struct GlobalProperty {
DeviceState *qdev_create(BusState *bus, const char *name); DeviceState *qdev_create(BusState *bus, const char *name);
DeviceState *qdev_try_create(BusState *bus, const char *name); DeviceState *qdev_try_create(BusState *bus, const char *name);
bool qdev_exists(const char *name);
int qdev_device_help(QemuOpts *opts); int qdev_device_help(QemuOpts *opts);
DeviceState *qdev_device_add(QemuOpts *opts); DeviceState *qdev_device_add(QemuOpts *opts);
int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT; int qdev_init(DeviceState *dev) QEMU_WARN_UNUSED_RESULT;

View File

@ -317,7 +317,6 @@ static QEMUMachine s390_machine = {
.no_serial = 1, .no_serial = 1,
.no_parallel = 1, .no_parallel = 1,
.use_virtcon = 1, .use_virtcon = 1,
.no_vga = 1,
.max_cpus = 255, .max_cpus = 255,
.is_default = 1, .is_default = 1,
}; };

View File

@ -740,7 +740,6 @@ static QEMUMachine spapr_machine = {
.desc = "pSeries Logical Partition (PAPR compliant)", .desc = "pSeries Logical Partition (PAPR compliant)",
.init = ppc_spapr_init, .init = ppc_spapr_init,
.max_cpus = MAX_CPUS, .max_cpus = MAX_CPUS,
.no_vga = 1,
.no_parallel = 1, .no_parallel = 1,
.use_scsi = 1, .use_scsi = 1,
}; };

View File

@ -8,12 +8,8 @@ static inline DeviceState *pci_vmsvga_init(PCIBus *bus)
{ {
PCIDevice *dev; PCIDevice *dev;
dev = pci_try_create(bus, -1, "vmware-svga"); dev = pci_create_simple(bus, -1, "vmware-svga");
if (!dev || qdev_init(&dev->qdev) < 0) {
return NULL;
} else {
return &dev->qdev; return &dev->qdev;
}
} }
#endif #endif

56
vl.c
View File

@ -271,7 +271,6 @@ static int default_serial = 1;
static int default_parallel = 1; static int default_parallel = 1;
static int default_virtcon = 1; static int default_virtcon = 1;
static int default_monitor = 1; static int default_monitor = 1;
static int default_vga = 1;
static int default_floppy = 1; static int default_floppy = 1;
static int default_cdrom = 1; static int default_cdrom = 1;
static int default_sdcard = 1; static int default_sdcard = 1;
@ -290,11 +289,6 @@ static struct {
{ .driver = "virtio-serial-pci", .flag = &default_virtcon }, { .driver = "virtio-serial-pci", .flag = &default_virtcon },
{ .driver = "virtio-serial-s390", .flag = &default_virtcon }, { .driver = "virtio-serial-s390", .flag = &default_virtcon },
{ .driver = "virtio-serial", .flag = &default_virtcon }, { .driver = "virtio-serial", .flag = &default_virtcon },
{ .driver = "VGA", .flag = &default_vga },
{ .driver = "cirrus-vga", .flag = &default_vga },
{ .driver = "vmware-svga", .flag = &default_vga },
{ .driver = "isa-vga", .flag = &default_vga },
{ .driver = "qxl-vga", .flag = &default_vga },
}; };
static void res_free(void) static void res_free(void)
@ -1525,18 +1519,48 @@ static const QEMUOption qemu_options[] = {
#include "qemu-options-wrapper.h" #include "qemu-options-wrapper.h"
{ NULL }, { NULL },
}; };
static bool vga_available(void)
{
return qdev_exists("VGA") || qdev_exists("isa-vga");
}
static bool cirrus_vga_available(void)
{
return qdev_exists("cirrus-vga") || qdev_exists("isa-cirrus-vga");
}
static bool vmware_vga_available(void)
{
return qdev_exists("vmware-svga");
}
static void select_vgahw (const char *p) static void select_vgahw (const char *p)
{ {
const char *opts; const char *opts;
default_vga = 0;
vga_interface_type = VGA_NONE; vga_interface_type = VGA_NONE;
if (strstart(p, "std", &opts)) { if (strstart(p, "std", &opts)) {
if (vga_available()) {
vga_interface_type = VGA_STD; vga_interface_type = VGA_STD;
} else {
fprintf(stderr, "Error: standard VGA not available\n");
exit(0);
}
} else if (strstart(p, "cirrus", &opts)) { } else if (strstart(p, "cirrus", &opts)) {
if (cirrus_vga_available()) {
vga_interface_type = VGA_CIRRUS; vga_interface_type = VGA_CIRRUS;
} else {
fprintf(stderr, "Error: Cirrus VGA not available\n");
exit(0);
}
} else if (strstart(p, "vmware", &opts)) { } else if (strstart(p, "vmware", &opts)) {
if (vmware_vga_available()) {
vga_interface_type = VGA_VMWARE; vga_interface_type = VGA_VMWARE;
} else {
fprintf(stderr, "Error: VMWare SVGA not available\n");
exit(0);
}
} else if (strstart(p, "xenfb", &opts)) { } else if (strstart(p, "xenfb", &opts)) {
vga_interface_type = VGA_XENFB; vga_interface_type = VGA_XENFB;
} else if (strstart(p, "qxl", &opts)) { } else if (strstart(p, "qxl", &opts)) {
@ -2155,6 +2179,7 @@ int main(int argc, char **argv, char **envp)
const char *loadvm = NULL; const char *loadvm = NULL;
QEMUMachine *machine; QEMUMachine *machine;
const char *cpu_model; const char *cpu_model;
const char *vga_model = NULL;
const char *pid_file = NULL; const char *pid_file = NULL;
const char *incoming = NULL; const char *incoming = NULL;
#ifdef CONFIG_VNC #ifdef CONFIG_VNC
@ -2581,7 +2606,7 @@ int main(int argc, char **argv, char **envp)
rtc_utc = 0; rtc_utc = 0;
break; break;
case QEMU_OPTION_vga: case QEMU_OPTION_vga:
select_vgahw (optarg); vga_model = optarg;
break; break;
case QEMU_OPTION_g: case QEMU_OPTION_g:
{ {
@ -2978,7 +3003,6 @@ int main(int argc, char **argv, char **envp)
default_parallel = 0; default_parallel = 0;
default_virtcon = 0; default_virtcon = 0;
default_monitor = 0; default_monitor = 0;
default_vga = 0;
default_net = 0; default_net = 0;
default_floppy = 0; default_floppy = 0;
default_cdrom = 0; default_cdrom = 0;
@ -3140,9 +3164,6 @@ int main(int argc, char **argv, char **envp)
if (!machine->use_virtcon) { if (!machine->use_virtcon) {
default_virtcon = 0; default_virtcon = 0;
} }
if (machine->no_vga) {
default_vga = 0;
}
if (machine->no_floppy) { if (machine->no_floppy) {
default_floppy = 0; default_floppy = 0;
} }
@ -3178,8 +3199,6 @@ int main(int argc, char **argv, char **envp)
if (default_virtcon) if (default_virtcon)
add_device_config(DEV_VIRTCON, "vc:80Cx24C"); add_device_config(DEV_VIRTCON, "vc:80Cx24C");
} }
if (default_vga)
vga_interface_type = VGA_CIRRUS;
socket_init(); socket_init();
@ -3330,6 +3349,15 @@ int main(int argc, char **argv, char **envp)
module_call_init(MODULE_INIT_DEVICE); module_call_init(MODULE_INIT_DEVICE);
/* must be after qdev registration but before machine init */
if (vga_model) {
select_vgahw(vga_model);
} else if (cirrus_vga_available()) {
select_vgahw("cirrus");
} else {
select_vgahw("none");
}
if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL, 0) != 0) if (qemu_opts_foreach(qemu_find_opts("device"), device_help_func, NULL, 0) != 0)
exit(0); exit(0);