6da32fe5ef
virtio-fs qualifies as a bootable device minimally under OVMF, but currently the necessary "bootindex" property is missing. Add the property. Expose the property only in the PCI device, for now. There is no boot support for virtiofs on s390x (ccw) for the time being [1] [2], so leave the CCW device unchanged. Add the property to the base device still, because adding the alias to the CCW device later will be easier this way [3]. [1] https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg01745.html [2] https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg01870.html [3] https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg01751.html Example OpenFirmware device path for the "vhost-user-fs-pci" device in the "bootorder" fw_cfg file: /pci@i0cf8/pci-bridge@1,6/pci1af4,105a@0/filesystem@0 Cc: "Dr. David Alan Gilbert" <dgilbert@redhat.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Ján Tomko <jtomko@redhat.com> Cc: Stefan Hajnoczi <stefanha@redhat.com> Cc: virtio-fs@redhat.com Signed-off-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20210112131603.12686-1-lersek@redhat.com> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
89 lines
2.7 KiB
C
89 lines
2.7 KiB
C
/*
|
|
* Vhost-user filesystem virtio device PCI glue
|
|
*
|
|
* Copyright 2018-2019 Red Hat, Inc.
|
|
*
|
|
* Authors:
|
|
* Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or
|
|
* (at your option) any later version. See the COPYING file in the
|
|
* top-level directory.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "hw/qdev-properties.h"
|
|
#include "hw/virtio/vhost-user-fs.h"
|
|
#include "virtio-pci.h"
|
|
#include "qom/object.h"
|
|
|
|
struct VHostUserFSPCI {
|
|
VirtIOPCIProxy parent_obj;
|
|
VHostUserFS vdev;
|
|
};
|
|
|
|
typedef struct VHostUserFSPCI VHostUserFSPCI;
|
|
|
|
#define TYPE_VHOST_USER_FS_PCI "vhost-user-fs-pci-base"
|
|
|
|
DECLARE_INSTANCE_CHECKER(VHostUserFSPCI, VHOST_USER_FS_PCI,
|
|
TYPE_VHOST_USER_FS_PCI)
|
|
|
|
static Property vhost_user_fs_pci_properties[] = {
|
|
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
|
|
DEV_NVECTORS_UNSPECIFIED),
|
|
DEFINE_PROP_END_OF_LIST(),
|
|
};
|
|
|
|
static void vhost_user_fs_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
|
|
{
|
|
VHostUserFSPCI *dev = VHOST_USER_FS_PCI(vpci_dev);
|
|
DeviceState *vdev = DEVICE(&dev->vdev);
|
|
|
|
if (vpci_dev->nvectors == DEV_NVECTORS_UNSPECIFIED) {
|
|
/* Also reserve config change and hiprio queue vectors */
|
|
vpci_dev->nvectors = dev->vdev.conf.num_request_queues + 2;
|
|
}
|
|
|
|
qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
|
|
}
|
|
|
|
static void vhost_user_fs_pci_class_init(ObjectClass *klass, void *data)
|
|
{
|
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
|
|
PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
|
|
k->realize = vhost_user_fs_pci_realize;
|
|
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
|
|
device_class_set_props(dc, vhost_user_fs_pci_properties);
|
|
pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
|
|
pcidev_k->device_id = 0; /* Set by virtio-pci based on virtio id */
|
|
pcidev_k->revision = 0x00;
|
|
pcidev_k->class_id = PCI_CLASS_STORAGE_OTHER;
|
|
}
|
|
|
|
static void vhost_user_fs_pci_instance_init(Object *obj)
|
|
{
|
|
VHostUserFSPCI *dev = VHOST_USER_FS_PCI(obj);
|
|
|
|
virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
|
|
TYPE_VHOST_USER_FS);
|
|
object_property_add_alias(obj, "bootindex", OBJECT(&dev->vdev),
|
|
"bootindex");
|
|
}
|
|
|
|
static const VirtioPCIDeviceTypeInfo vhost_user_fs_pci_info = {
|
|
.base_name = TYPE_VHOST_USER_FS_PCI,
|
|
.non_transitional_name = "vhost-user-fs-pci",
|
|
.instance_size = sizeof(VHostUserFSPCI),
|
|
.instance_init = vhost_user_fs_pci_instance_init,
|
|
.class_init = vhost_user_fs_pci_class_init,
|
|
};
|
|
|
|
static void vhost_user_fs_pci_register(void)
|
|
{
|
|
virtio_pci_types_register(&vhost_user_fs_pci_info);
|
|
}
|
|
|
|
type_init(vhost_user_fs_pci_register);
|