[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 08/16] libqos: implement VIRTIO 1.0 FEATURES_OK step
From: |
Stefan Hajnoczi |
Subject: |
[PATCH v3 08/16] libqos: implement VIRTIO 1.0 FEATURES_OK step |
Date: |
Sat, 19 Oct 2019 07:38:02 +0100 |
Device initialization has an extra step in VIRTIO 1.0. The FEATURES_OK
status bit is set to indicate that feature negotiation has completed.
The driver then reads the status register again to check that the device
agrees with the final features.
Implement this step as part of qvirtio_set_features() instead of
introducing a separate function. This way all existing code works
without modifications.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
tests/libqos/virtio.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/tests/libqos/virtio.c b/tests/libqos/virtio.c
index 2593996c98..57fa79373b 100644
--- a/tests/libqos/virtio.c
+++ b/tests/libqos/virtio.c
@@ -52,6 +52,19 @@ void qvirtio_set_features(QVirtioDevice *d, uint64_t
features)
{
d->features = features;
d->bus->set_features(d, features);
+
+ /*
+ * This could be a separate function for drivers that want to access
+ * configuration space before setting FEATURES_OK, but no existing users
+ * need that and it's less code for callers if this is done implicitly.
+ */
+ if (features & (1ull << VIRTIO_F_VERSION_1)) {
+ uint8_t status = d->bus->get_status(d) |
+ VIRTIO_CONFIG_S_FEATURES_OK;
+
+ d->bus->set_status(d, status);
+ g_assert_cmphex(d->bus->get_status(d), ==, status);
+ }
}
QVirtQueue *qvirtqueue_setup(QVirtioDevice *d,
@@ -88,9 +101,10 @@ void qvirtio_set_driver(QVirtioDevice *d)
void qvirtio_set_driver_ok(QVirtioDevice *d)
{
- d->bus->set_status(d, d->bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER_OK);
- g_assert_cmphex(d->bus->get_status(d), ==, VIRTIO_CONFIG_S_DRIVER_OK |
- VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_ACKNOWLEDGE);
+ uint8_t status = d->bus->get_status(d) | VIRTIO_CONFIG_S_DRIVER_OK;
+
+ d->bus->set_status(d, status);
+ g_assert_cmphex(d->bus->get_status(d), ==, status);
}
void qvirtio_wait_queue_isr(QTestState *qts, QVirtioDevice *d,
--
2.21.0
- Re: [PATCH v3 04/16] virtio-scsi-test: add missing feature negotiation, (continued)
[PATCH v3 08/16] libqos: implement VIRTIO 1.0 FEATURES_OK step,
Stefan Hajnoczi <=
[PATCH v3 09/16] libqos: access VIRTIO 1.0 vring in little-endian, Stefan Hajnoczi, 2019/10/19
[PATCH v3 10/16] libqos: add iteration support to qpci_find_capability(), Stefan Hajnoczi, 2019/10/19
[PATCH v3 11/16] libqos: pass full QVirtQueue to set_queue_address(), Stefan Hajnoczi, 2019/10/19