From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44636) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WE3bl-0007zp-7u for qemu-devel@nongnu.org; Thu, 13 Feb 2014 16:14:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WE3bd-00061D-H3 for qemu-devel@nongnu.org; Thu, 13 Feb 2014 16:14:09 -0500 Received: from mailout2.w2.samsung.com ([211.189.100.12]:37759 helo=usmailout2.samsung.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WE3bd-00060p-E8 for qemu-devel@nongnu.org; Thu, 13 Feb 2014 16:14:01 -0500 Received: from uscpsbgex1.samsung.com (u122.gpu85.samsung.co.kr [203.254.195.122]) by mailout2.w2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N0Y006F4DNA8B70@mailout2.w2.samsung.com> for qemu-devel@nongnu.org; Thu, 13 Feb 2014 16:13:58 -0500 (EST) Message-id: <52FD3593.3040109@samsung.com> Date: Thu, 13 Feb 2014 13:13:55 -0800 From: Mario Smarduch MIME-version: 1.0 References: <52FD328A.40605@samsung.com> In-reply-to: <52FD328A.40605@samsung.com> Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 7bit Subject: [Qemu-devel] [PATCH] virtio: set virtio-net/virtio-mmio host features List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, m.smarduch@samsung.com, patches@linaro.org virtio: set virtio-net/virtio-mmio host features Patch sets 'virtio-net/virtio-mmio' host features to enable network features based on peer capabilities. Currently host features turn of all features by default. Signed-off-by: Mario Smarduch --- hw/virtio/virtio-mmio.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c index 8829eb0..1d940b7 100644 --- a/hw/virtio/virtio-mmio.c +++ b/hw/virtio/virtio-mmio.c @@ -23,6 +23,7 @@ #include "hw/virtio/virtio.h" #include "qemu/host-utils.h" #include "hw/virtio/virtio-bus.h" +#include "hw/virtio/virtio-net.h" /* #define DEBUG_VIRTIO_MMIO */ @@ -92,6 +93,12 @@ typedef struct { static void virtio_mmio_bus_new(VirtioBusState *bus, size_t bus_size, VirtIOMMIOProxy *dev); +/* all possible virtio-net features supported */ +static Property virtio_mmio_net_properties[] = { + DEFINE_VIRTIO_NET_FEATURES(VirtIOMMIOProxy, host_features), + DEFINE_PROP_END_OF_LIST(), +}; + static uint64_t virtio_mmio_read(void *opaque, hwaddr offset, unsigned size) { VirtIOMMIOProxy *proxy = (VirtIOMMIOProxy *)opaque; @@ -347,11 +354,33 @@ static void virtio_mmio_reset(DeviceState *d) /* virtio-mmio device */ +/* Walk virtio-net possible supported features and set host_features, this + * should be done earlier when the object is instantiated but at that point + * you don't know what type of device will be plugged in. + */ +static void virtio_mmio_set_net_features(Property *prop, uint32_t *features) +{ + for (; prop && prop->name; prop++) { + if (prop->defval == true) { + *features |= (1 << prop->bitnr); + } else { + *features &= ~(1 << prop->bitnr); + } + } +} + /* This is called by virtio-bus just after the device is plugged. */ static void virtio_mmio_device_plugged(DeviceState *opaque) { VirtIOMMIOProxy *proxy = VIRTIO_MMIO(opaque); + VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); + Object *obj = OBJECT(vdev); + /* set host features only for virtio-net */ + if (object_dynamic_cast(obj, TYPE_VIRTIO_NET)) { + virtio_mmio_set_net_features(virtio_mmio_net_properties, + &proxy->host_features); + } proxy->host_features |= (0x1 << VIRTIO_F_NOTIFY_ON_EMPTY); proxy->host_features = virtio_bus_get_vdev_features(&proxy->bus, proxy->host_features); -- 1.7.9.5