From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40396) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z9r4g-0001df-IU for qemu-devel@nongnu.org; Tue, 30 Jun 2015 04:39:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z9r4b-0000hL-Ci for qemu-devel@nongnu.org; Tue, 30 Jun 2015 04:39:26 -0400 Received: from mx1.redhat.com ([209.132.183.28]:36229) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z9r4b-0000gd-4r for qemu-devel@nongnu.org; Tue, 30 Jun 2015 04:39:21 -0400 From: Gerd Hoffmann Date: Tue, 30 Jun 2015 10:39:02 +0200 Message-Id: <1435653553-7728-12-git-send-email-kraxel@redhat.com> In-Reply-To: <1435653553-7728-1-git-send-email-kraxel@redhat.com> References: <1435653553-7728-1-git-send-email-kraxel@redhat.com> Subject: [Qemu-devel] [PATCH v2 11/22] virtio: make features 64bit, support version 1.0 features List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: seabios@seabios.org Cc: Gerd Hoffmann , qemu-devel@nongnu.org, "Michael S. Tsirkin" Signed-off-by: Gerd Hoffmann --- src/hw/virtio-blk.c | 2 +- src/hw/virtio-pci.c | 33 +++++++++++++++++++++++++++++++++ src/hw/virtio-pci.h | 12 +++--------- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/hw/virtio-blk.c b/src/hw/virtio-blk.c index 4f39aa2..9e56d42 100644 --- a/src/hw/virtio-blk.c +++ b/src/hw/virtio-blk.c @@ -123,7 +123,7 @@ init_virtio_blk(struct pci_device *pci) struct virtio_blk_config cfg; vp_get(vdrive->vp, 0, &cfg, sizeof(cfg)); - u32 f = vp_get_features(vdrive->vp); + u64 f = vp_get_features(vdrive->vp); vdrive->drive.blksize = (f & (1 << VIRTIO_BLK_F_BLK_SIZE)) ? cfg.blk_size : DISK_SECTOR_SIZE; diff --git a/src/hw/virtio-pci.c b/src/hw/virtio-pci.c index 3badb15..80b6fcc 100644 --- a/src/hw/virtio-pci.c +++ b/src/hw/virtio-pci.c @@ -24,6 +24,39 @@ #include "virtio-pci.h" #include "virtio-ring.h" +u64 vp_get_features(struct vp_device *vp) +{ + u32 f0, f1; + + if (vp->use_modern) { + vp_write(&vp->common, virtio_pci_common_cfg, device_feature_select, 0); + f0 = vp_read(&vp->common, virtio_pci_common_cfg, device_feature); + vp_write(&vp->common, virtio_pci_common_cfg, device_feature_select, 1); + f1 = vp_read(&vp->common, virtio_pci_common_cfg, device_feature); + } else { + f0 = vp_read(&vp->legacy, virtio_pci_legacy, host_features); + f1 = 0; + } + return ((u64)f1 << 32) | f0; +} + +void vp_set_features(struct vp_device *vp, u64 features) +{ + u32 f0, f1; + + f0 = features; + f1 = features >> 32; + + if (vp->use_modern) { + vp_write(&vp->common, virtio_pci_common_cfg, guest_feature_select, 0); + vp_write(&vp->common, virtio_pci_common_cfg, guest_feature, f0); + vp_write(&vp->common, virtio_pci_common_cfg, guest_feature_select, 1); + vp_write(&vp->common, virtio_pci_common_cfg, guest_feature, f1); + } else { + vp_write(&vp->legacy, virtio_pci_legacy, guest_features, f0); + } +} + int vp_find_vq(struct vp_device *vp, int queue_index, struct vring_virtqueue **p_vq) { diff --git a/src/hw/virtio-pci.h b/src/hw/virtio-pci.h index a092e86..abb603f 100644 --- a/src/hw/virtio-pci.h +++ b/src/hw/virtio-pci.h @@ -125,6 +125,7 @@ struct vp_cap { struct vp_device { unsigned int ioaddr; struct vp_cap common, notify, isr, device, legacy; + u8 use_modern; }; static inline u64 _vp_read(struct vp_cap *cap, u32 offset, u8 size) @@ -213,15 +214,8 @@ static inline void _vp_write(struct vp_cap *cap, u32 offset, u8 size, u64 var) _vp_write(_cap, offsetof(_struct, _field), \ sizeof(((_struct *)0)->_field), _var) -static inline u32 vp_get_features(struct vp_device *vp) -{ - return inl(GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_HOST_FEATURES); -} - -static inline void vp_set_features(struct vp_device *vp, u32 features) -{ - outl(features, GET_LOWFLAT(vp->ioaddr) + VIRTIO_PCI_GUEST_FEATURES); -} +u64 vp_get_features(struct vp_device *vp); +void vp_set_features(struct vp_device *vp, u64 features); static inline void vp_get(struct vp_device *vp, unsigned offset, void *buf, unsigned len) -- 1.8.3.1