virtio-serial: Use a struct to pass config information from proxy
Instead of using a single variable to pass to the virtio_serial_init function, use a struct so that expanding the number of variables to be passed on later is easier. Signed-off-by: Amit Shah <amit.shah@redhat.com>
This commit is contained in:
parent
e0efb993b8
commit
6b331efb73
@ -18,6 +18,7 @@
|
||||
#include "virtio.h"
|
||||
#include "virtio-blk.h"
|
||||
#include "virtio-net.h"
|
||||
#include "virtio-serial.h"
|
||||
#include "pci.h"
|
||||
#include "qemu-error.h"
|
||||
#include "msix.h"
|
||||
@ -109,8 +110,7 @@ typedef struct {
|
||||
#ifdef CONFIG_LINUX
|
||||
V9fsConf fsconf;
|
||||
#endif
|
||||
/* Max. number of ports we can have for a the virtio-serial device */
|
||||
uint32_t max_virtserial_ports;
|
||||
virtio_serial_conf serial;
|
||||
virtio_net_conf net;
|
||||
bool ioeventfd_disabled;
|
||||
bool ioeventfd_started;
|
||||
@ -770,12 +770,12 @@ static int virtio_serial_init_pci(PCIDevice *pci_dev)
|
||||
proxy->class_code != PCI_CLASS_OTHERS) /* qemu-kvm */
|
||||
proxy->class_code = PCI_CLASS_COMMUNICATION_OTHER;
|
||||
|
||||
vdev = virtio_serial_init(&pci_dev->qdev, proxy->max_virtserial_ports);
|
||||
vdev = virtio_serial_init(&pci_dev->qdev, &proxy->serial);
|
||||
if (!vdev) {
|
||||
return -1;
|
||||
}
|
||||
vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
|
||||
? proxy->max_virtserial_ports + 1
|
||||
? proxy->serial.max_virtserial_ports + 1
|
||||
: proxy->nvectors;
|
||||
virtio_init_pci(proxy, vdev,
|
||||
PCI_VENDOR_ID_REDHAT_QUMRANET,
|
||||
@ -902,8 +902,8 @@ static PCIDeviceInfo virtio_info[] = {
|
||||
DEV_NVECTORS_UNSPECIFIED),
|
||||
DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
|
||||
DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
|
||||
DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, max_virtserial_ports,
|
||||
31),
|
||||
DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy,
|
||||
serial.max_virtserial_ports, 31),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
},
|
||||
.qdev.reset = virtio_pci_reset,
|
||||
|
@ -811,19 +811,19 @@ void virtio_serial_port_qdev_register(VirtIOSerialPortInfo *info)
|
||||
qdev_register(&info->qdev);
|
||||
}
|
||||
|
||||
VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
|
||||
VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
|
||||
{
|
||||
VirtIOSerial *vser;
|
||||
VirtIODevice *vdev;
|
||||
uint32_t i, max_supported_ports;
|
||||
|
||||
if (!max_nr_ports)
|
||||
if (!conf->max_virtserial_ports)
|
||||
return NULL;
|
||||
|
||||
/* Each port takes 2 queues, and one pair is for the control queue */
|
||||
max_supported_ports = VIRTIO_PCI_QUEUE_MAX / 2 - 1;
|
||||
|
||||
if (max_nr_ports > max_supported_ports) {
|
||||
if (conf->max_virtserial_ports > max_supported_ports) {
|
||||
error_report("maximum ports supported: %u", max_supported_ports);
|
||||
return NULL;
|
||||
}
|
||||
@ -839,9 +839,9 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
|
||||
vser->bus->vser = vser;
|
||||
QTAILQ_INIT(&vser->ports);
|
||||
|
||||
vser->bus->max_nr_ports = max_nr_ports;
|
||||
vser->ivqs = qemu_malloc(max_nr_ports * sizeof(VirtQueue *));
|
||||
vser->ovqs = qemu_malloc(max_nr_ports * sizeof(VirtQueue *));
|
||||
vser->bus->max_nr_ports = conf->max_virtserial_ports;
|
||||
vser->ivqs = qemu_malloc(conf->max_virtserial_ports * sizeof(VirtQueue *));
|
||||
vser->ovqs = qemu_malloc(conf->max_virtserial_ports * sizeof(VirtQueue *));
|
||||
|
||||
/* Add a queue for host to guest transfers for port 0 (backward compat) */
|
||||
vser->ivqs[0] = virtio_add_queue(vdev, 128, handle_input);
|
||||
@ -866,8 +866,8 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
|
||||
vser->ovqs[i] = virtio_add_queue(vdev, 128, handle_output);
|
||||
}
|
||||
|
||||
vser->config.max_nr_ports = max_nr_ports;
|
||||
vser->ports_map = qemu_mallocz(((max_nr_ports + 31) / 32)
|
||||
vser->config.max_nr_ports = conf->max_virtserial_ports;
|
||||
vser->ports_map = qemu_mallocz(((conf->max_virtserial_ports + 31) / 32)
|
||||
* sizeof(vser->ports_map[0]));
|
||||
/*
|
||||
* Reserve location 0 for a console port for backward compat
|
||||
|
@ -45,6 +45,11 @@ struct virtio_console_control {
|
||||
uint16_t value; /* Extra information for the key */
|
||||
};
|
||||
|
||||
struct virtio_serial_conf {
|
||||
/* Max. number of ports we can have for a virtio-serial device */
|
||||
uint32_t max_virtserial_ports;
|
||||
};
|
||||
|
||||
/* Some events for the internal messages (control packets) */
|
||||
#define VIRTIO_CONSOLE_DEVICE_READY 0
|
||||
#define VIRTIO_CONSOLE_PORT_ADD 1
|
||||
|
@ -195,7 +195,8 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, BlockConf *conf);
|
||||
struct virtio_net_conf;
|
||||
VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
|
||||
struct virtio_net_conf *net);
|
||||
VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports);
|
||||
typedef struct virtio_serial_conf virtio_serial_conf;
|
||||
VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *serial);
|
||||
VirtIODevice *virtio_balloon_init(DeviceState *dev);
|
||||
#ifdef CONFIG_LINUX
|
||||
VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf);
|
||||
|
Loading…
Reference in New Issue
Block a user