From nobody Thu Apr 25 09:21:27 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of seabios.org designates 78.46.105.101 as permitted sender) client-ip=78.46.105.101; envelope-from=seabios-bounces@seabios.org; helo=coreboot.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of seabios.org designates 78.46.105.101 as permitted sender) smtp.mailfrom=seabios-bounces@seabios.org; dmarc=fail(p=none dis=none) header.from=linux.alibaba.com Return-Path: Received: from coreboot.org (coreboot.org [78.46.105.101]) by mx.zohomail.com with SMTPS id 1667999875278448.5832483257865; Wed, 9 Nov 2022 05:17:55 -0800 (PST) Received: from authenticated-user (PRIMARY_HOSTNAME [PUBLIC_IP]) by coreboot.org (Postfix) with ESMTPA id E19F42C078; Wed, 9 Nov 2022 13:17:50 +0000 (UTC) Received: from authenticated-user (PRIMARY_HOSTNAME [PUBLIC_IP]) by coreboot.org (Postfix) with ESMTP id D66E02C058 for ; Wed, 9 Nov 2022 13:17:35 +0000 (UTC) Received: from authenticated-user (PRIMARY_HOSTNAME [PUBLIC_IP]) by smtp.aliyun-inc.com; Wed, 09 Nov 2022 21:17:26 +0800 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R141e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018045170;MF=xuanzhuo@linux.alibaba.com;NM=1;PH=DS;RN=7;SR=0;TI=SMTPD_---0VUOC.w._1667999845; From: Xuan Zhuo To: seabios@seabios.org Date: Wed, 9 Nov 2022 21:17:25 +0800 Message-Id: <20221109131725.56650-1-xuanzhuo@linux.alibaba.com> MIME-Version: 1.0 X-Git-Hash: b266366 Message-ID-Hash: 3TGWAIMI44FAI67XGLWE2MJ7OUFBL4RJ X-Message-ID-Hash: 3TGWAIMI44FAI67XGLWE2MJ7OUFBL4RJ X-MailFrom: xuanzhuo@linux.alibaba.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-seabios.seabios.org-0; header-match-seabios.seabios.org-1; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: lersek@redhat.com, jasowang@redhat.com, peter.maydell@linaro.org, kraxel@redhat.com, "Michael S. Tsirkin" X-Mailman-Version: 3.3.6b1 Precedence: list Subject: [SeaBIOS] [PATCH] virtio: finalizing features before using device List-Id: SeaBIOS mailing list Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable Authentication-Results: coreboot.org; auth=pass smtp.auth=mailman@coreboot.org smtp.mailfrom=seabios-bounces@seabios.org X-Spamd-Bar: / X-ZM-MESSAGEID: 1667999877131100001 Content-Type: text/plain; charset="utf-8" Under the standard of Virtio 1.0, the initialization process of the device must first write sub-features back to device before using device, such as finding vqs. There are four places using vp_find_vq(). 1. virtio-blk.pci: put the finalizing features code in front of using de= vice 2. virtio-blk.mmio: put the finalizing features code in front of using de= vice 3. virtio-scsi.pci: is ok 4. virtio-scsi.mmio: add set features before vp_find_vq() Signed-off-by: Xuan Zhuo --- src/hw/virtio-blk.c | 23 ++++++++++++++--------- src/hw/virtio-scsi.c | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/hw/virtio-blk.c b/src/hw/virtio-blk.c index 9b4a05a..52eb08f 100644 --- a/src/hw/virtio-blk.c +++ b/src/hw/virtio-blk.c @@ -151,10 +151,6 @@ init_virtio_blk(void *data) vdrive->drive.cntl_id =3D pci->bdf; =20 vp_init_simple(&vdrive->vp, pci); - if (vp_find_vq(&vdrive->vp, 0, &vdrive->vq) < 0 ) { - dprintf(1, "fail to find vq for virtio-blk %pP\n", pci); - goto fail; - } =20 if (vdrive->vp.use_modern) { struct vp_device *vp =3D &vdrive->vp; @@ -212,7 +208,15 @@ init_virtio_blk(void *data) vp_read(&vp->device, struct virtio_blk_config, heads); vdrive->drive.pchs.sector =3D vp_read(&vp->device, struct virtio_blk_config, sectors); - } else { + } + + + if (vp_find_vq(&vdrive->vp, 0, &vdrive->vq) < 0 ) { + dprintf(1, "fail to find vq for virtio-blk %pP\n", pci); + goto fail; + } + + if (!vdrive->vp.use_modern) { struct virtio_blk_config cfg; vp_get_legacy(&vdrive->vp, 0, &cfg, sizeof(cfg)); =20 @@ -272,10 +276,6 @@ init_virtio_blk_mmio(void *mmio) vdrive->drive.cntl_id =3D (u32)mmio; =20 vp_init_mmio(&vdrive->vp, mmio); - if (vp_find_vq(&vdrive->vp, 0, &vdrive->vq) < 0 ) { - dprintf(1, "fail to find vq for virtio-blk-mmio %p\n", mmio); - goto fail; - } =20 struct vp_device *vp =3D &vdrive->vp; u64 features =3D vp_get_features(vp); @@ -294,6 +294,11 @@ init_virtio_blk_mmio(void *mmio) goto fail; } =20 + if (vp_find_vq(&vdrive->vp, 0, &vdrive->vq) < 0 ) { + dprintf(1, "fail to find vq for virtio-blk-mmio %p\n", mmio); + goto fail; + } + if (features & max_segment_size) vdrive->drive.max_segment_size =3D vp_read(&vp->device, struct virtio_blk_config, size_max); diff --git a/src/hw/virtio-scsi.c b/src/hw/virtio-scsi.c index 369c981..cf131fb 100644 --- a/src/hw/virtio-scsi.c +++ b/src/hw/virtio-scsi.c @@ -239,6 +239,24 @@ init_virtio_scsi_mmio(void *mmio) vp_init_mmio(vp, mmio); u8 status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER; =20 + { + u64 features =3D vp_get_features(vp); + u64 version1 =3D 1ull << VIRTIO_F_VERSION_1; + u64 iommu_platform =3D 1ull << VIRTIO_F_IOMMU_PLATFORM; + if (!(features & version1)) { + dprintf(1, "modern device without virtio_1 feature bit: %pP\n"= , mmio); + goto fail; + } + + vp_set_features(vp, features & (version1 | iommu_platform)); + status |=3D VIRTIO_CONFIG_S_FEATURES_OK; + vp_set_status(vp, status); + if (!(vp_get_status(vp) & VIRTIO_CONFIG_S_FEATURES_OK)) { + dprintf(1, "device didn't accept features: %pP\n", mmio); + goto fail; + } + } + if (vp_find_vq(vp, 2, &vq) < 0 ) { dprintf(1, "fail to find vq for virtio-scsi-mmio %p\n", mmio); goto fail; --=20 2.32.0.3.g01195cf9f _______________________________________________ SeaBIOS mailing list -- seabios@seabios.org To unsubscribe send an email to seabios-leave@seabios.org