Re: [PATCH v4 7/8] virtio: add 1.0 support
From: Xie, Huawei <hidden>
Date: 2016-01-18 17:07:55
.On 1/15/2016 12:34 PM, Yuanhan Liu wrote:
Modern (v1.0) virtio pci device defines several pci capabilities. Each cap has a configure structure corresponding to it, and the cap.bar and cap.offset fields tell us where to find it.
[snip]
+
+static inline void
+io_write64_twopart(uint64_t val, uint32_t *lo, uint32_t *hi)
+{
+ io_write32((uint32_t)val, lo);
+ io_write32(val >> 32, hi);Firstly your second iowrite32 doesn't do the conversion. The conversion is duplicated.
+} + +static void +modern_read_dev_config(struct virtio_hw *hw, uint64_t offset,
here and there, size_t is more accurate for offset as we get it from offsetof.
+ void *dst, int length)
+{
+ int i;
+ uint8_t *p;
+ uint8_t old_gen, new_gen;
+
+ do {
+ old_gen = io_read8(&hw->common_cfg->config_generation);
+
+ p = dst;
+ for (i = 0; i < length; i++)
+ *p++ = io_read8((uint8_t *)hw->dev_cfg + offset + i);
+
+ new_gen = io_read8(&hw->common_cfg->config_generation);
+ } while (old_gen != new_gen);
+}
+
+static void
+modern_write_dev_config(struct virtio_hw *hw, uint64_t offset,
+ const void *src, int length)
+{
+ int i;
+ const uint8_t *p = src;
+
+ for (i = 0; i < length; i++)
+ io_write8(*p++, (uint8_t *)hw->dev_cfg + offset + i);
+}
+
+static uint64_t
+modern_get_features(struct virtio_hw *hw)
+{
+ uint32_t features_lo, features_hi;
+
+ io_write32(0, &hw->common_cfg->device_feature_select);
+ features_lo = io_read32(&hw->common_cfg->device_feature);
+
+ io_write32(1, &hw->common_cfg->device_feature_select);
+ features_hi = io_read32(&hw->common_cfg->device_feature);
+
+ return ((uint64_t)(features_hi) << 32) | features_lo;
+}
+
+static void
+modern_set_features(struct virtio_hw *hw, uint64_t features)
+{
+ io_write32(0, &hw->common_cfg->guest_feature_select);
+ io_write32(features & ((1ULL << 32) - 1),again, duplicated conversion
+ &hw->common_cfg->guest_feature); + + io_write32(1, &hw->common_cfg->guest_feature_select);
[snip]