From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-2.mimecast.com ([207.211.31.81]:25353 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726461AbfKRKoq (ORCPT ); Mon, 18 Nov 2019 05:44:46 -0500 Received: by mail-qt1-f200.google.com with SMTP id 2so11959145qtg.8 for ; Mon, 18 Nov 2019 02:44:40 -0800 (PST) Date: Mon, 18 Nov 2019 05:44:25 -0500 From: "Michael S. Tsirkin" Subject: Re: [PATCH V12 5/6] virtio: introduce a mdev based transport Message-ID: <20191118054339-mutt-send-email-mst@kernel.org> References: <20191118061703.8669-1-jasowang@redhat.com> <20191118061703.8669-6-jasowang@redhat.com> MIME-Version: 1.0 In-Reply-To: <20191118061703.8669-6-jasowang@redhat.com> Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Sender: linux-s390-owner@vger.kernel.org List-ID: To: Jason Wang Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-gvt-dev@lists.freedesktop.org, kwankhede@nvidia.com, alex.williamson@redhat.com, tiwei.bie@intel.com, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, cohuck@redhat.com, maxime.coquelin@redhat.com, cunming.liang@intel.com, zhihong.wang@intel.com, rob.miller@broadcom.com, xiao.w.wang@intel.com, haotian.wang@sifive.com, zhenyuw@linux.intel.com, zhi.a.wang@intel.com, jani.nikula@linux.intel.com, joonas.lahtinen@linux.intel.com, rodrigo.vivi@intel.com, airlied@linux.ie, daniel@ffwll.ch, farman@linux.ibm.com, pasic@linux.ibm.com, sebott@linux.ibm.com, oberpar@linux.ibm.com, heiko.carstens@de.ibm.com, gor@linux.ibm.com, borntraeger@de.ibm.com, akrowiak@linux.ibm.com, freude@linux.ibm.com, lingshan.zhu@intel.com, eperezma@redhat.com, lulu@redhat.com, parav@mellanox.com, christophe.de.dinechin@gmail.com, kevin.tian@intel.com, stefanha@redhat.com, rdunlap@infradead.org, hch@infradead.org, gregkh@linuxfoundation.org, jgg@mellanox.com On Mon, Nov 18, 2019 at 02:17:02PM +0800, Jason Wang wrote: > This patch introduces a new mdev transport for virtio. This is used to > use kernel virtio driver to drive the mediated device that is capable > of populating virtqueue directly. >=20 > A new virtio-mdev driver will be registered to the mdev bus, when a > new virtio-mdev device is probed, it will register the device with > mdev based config ops. This means it is a software transport between > mdev driver and mdev device. The transport was implemented through > bus_ops of mdev parent. >=20 > Signed-off-by: Jason Wang > --- > drivers/virtio/Kconfig | 13 ++ > drivers/virtio/Makefile | 1 + > drivers/virtio/virtio_mdev.c | 409 +++++++++++++++++++++++++++++++++++ > include/linux/mdev_virtio.h | 5 + > 4 files changed, 428 insertions(+) > create mode 100644 drivers/virtio/virtio_mdev.c >=20 > diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig > index 078615cf2afc..6a89b3de97d3 100644 > --- a/drivers/virtio/Kconfig > +++ b/drivers/virtio/Kconfig > @@ -43,6 +43,19 @@ config VIRTIO_PCI_LEGACY > =20 > =09 If unsure, say Y. > =20 > +config VIRTIO_MDEV > +=09tristate "MDEV driver for virtio devices" > +=09depends on MDEV_VIRTIO > +=09default n > +=09help > +=09 This driver provides support for virtio based paravirtual > +=09 device driver over MDEV bus. For this to be useful, you need > +=09 an appropriate virtio mdev device implementation that > +=09 operates on a physical device to allow the datapath of virtio > +=09 to be offloaded to hardware. > + > +=09 If unsure, say M. > + > config VIRTIO_PMEM > =09tristate "Support for virtio pmem driver" > =09depends on VIRTIO > diff --git a/drivers/virtio/Makefile b/drivers/virtio/Makefile > index 3a2b5c5dcf46..f2997b6c812f 100644 > --- a/drivers/virtio/Makefile > +++ b/drivers/virtio/Makefile > @@ -6,3 +6,4 @@ virtio_pci-y :=3D virtio_pci_modern.o virtio_pci_common.o > virtio_pci-$(CONFIG_VIRTIO_PCI_LEGACY) +=3D virtio_pci_legacy.o > obj-$(CONFIG_VIRTIO_BALLOON) +=3D virtio_balloon.o > obj-$(CONFIG_VIRTIO_INPUT) +=3D virtio_input.o > +obj-$(CONFIG_VIRTIO_MDEV) +=3D virtio_mdev.o > diff --git a/drivers/virtio/virtio_mdev.c b/drivers/virtio/virtio_mdev.c > new file mode 100644 > index 000000000000..7fdb42f055df > --- /dev/null > +++ b/drivers/virtio/virtio_mdev.c > @@ -0,0 +1,409 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * VIRTIO based driver for Mediated device > + * > + * Copyright (c) 2019, Red Hat. All rights reserved. > + * Author: Jason Wang > + * > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DRIVER_VERSION "0.1" > +#define DRIVER_AUTHOR "Red Hat Corporation" > +#define DRIVER_DESC "VIRTIO based driver for Mediated device" > + > +#define to_virtio_mdev_device(dev) \ > +=09container_of(dev, struct virtio_mdev_device, vdev) > + > +struct virtio_mdev_device { > +=09struct virtio_device vdev; > +=09struct mdev_device *mdev; > +=09u64 features; > + > +=09/* The lock to protect virtqueue list */ > +=09spinlock_t lock; > +=09/* List of virtio_mdev_vq_info */ > +=09struct list_head virtqueues; > +}; > + > +struct virtio_mdev_vq_info { > +=09/* the actual virtqueue */ > +=09struct virtqueue *vq; > + > +=09/* the list node for the virtqueues list */ > +=09struct list_head node; > +}; > + > +static struct mdev_device *vm_get_mdev(struct virtio_device *vdev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09return mdev; > +} > + > +static void virtio_mdev_get(struct virtio_device *vdev, unsigned offset, > +=09=09=09 void *buf, unsigned len) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->get_config(mdev, offset, buf, len); > +} > + > +static void virtio_mdev_set(struct virtio_device *vdev, unsigned offset, > +=09=09=09 const void *buf, unsigned len) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->set_config(mdev, offset, buf, len); > +} > + > +static u32 virtio_mdev_generation(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > + > +=09if (ops->get_generation) > +=09=09return ops->get_generation(mdev); > + > +=09return 0; > +} > + > +static u8 virtio_mdev_get_status(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->get_status(mdev); > +} > + > +static void virtio_mdev_set_status(struct virtio_device *vdev, u8 status= ) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->set_status(mdev, status); > +} > + > +static void virtio_mdev_reset(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->set_status(mdev, 0); > +} > + > +static bool virtio_mdev_notify(struct virtqueue *vq) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vq->vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->kick_vq(mdev, vq->index); > + > +=09return true; > +} > + > +static irqreturn_t virtio_mdev_config_cb(void *private) > +{ > +=09struct virtio_mdev_device *vm_dev =3D private; > + > +=09virtio_config_changed(&vm_dev->vdev); > + > +=09return IRQ_HANDLED; > +} > + > +static irqreturn_t virtio_mdev_virtqueue_cb(void *private) > +{ > +=09struct virtio_mdev_vq_info *info =3D private; > + > +=09return vring_interrupt(0, info->vq); > +} > + > +static struct virtqueue * > +virtio_mdev_setup_vq(struct virtio_device *vdev, unsigned int index, > +=09=09 void (*callback)(struct virtqueue *vq), > +=09=09 const char *name, bool ctx) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_vq_info *info; > +=09struct virtio_mdev_callback cb; > +=09struct virtqueue *vq; > +=09u64 desc_addr, driver_addr, device_addr; > +=09unsigned long flags; > +=09u32 align, num; > +=09int err; > + > +=09if (!name) > +=09=09return NULL; > + > +=09/* Queue shouldn't already be set up. */ > +=09if (ops->get_vq_ready(mdev, index)) > +=09=09return ERR_PTR(-ENOENT); > + > +=09/* Allocate and fill out our active queue description */ > +=09info =3D kmalloc(sizeof(*info), GFP_KERNEL); > +=09if (!info) > +=09=09return ERR_PTR(-ENOMEM); > + > +=09num =3D ops->get_vq_num_max(mdev); > +=09if (num =3D=3D 0) { > +=09=09err =3D -ENOENT; > +=09=09goto error_new_virtqueue; > +=09} > + > +=09/* Create the vring */ > +=09align =3D ops->get_vq_align(mdev); > +=09vq =3D vring_create_virtqueue(index, num, align, vdev, > +=09=09=09=09 true, true, ctx, > +=09=09=09=09 virtio_mdev_notify, callback, name); > +=09if (!vq) { > +=09=09err =3D -ENOMEM; > +=09=09goto error_new_virtqueue; > +=09} > + > +=09/* Setup virtqueue callback */ > +=09cb.callback =3D virtio_mdev_virtqueue_cb; > +=09cb.private =3D info; > +=09ops->set_vq_cb(mdev, index, &cb); > +=09ops->set_vq_num(mdev, index, virtqueue_get_vring_size(vq)); > + > +=09desc_addr =3D virtqueue_get_desc_addr(vq); > +=09driver_addr =3D virtqueue_get_avail_addr(vq); > +=09device_addr =3D virtqueue_get_used_addr(vq); > + > +=09if (ops->set_vq_address(mdev, index, > +=09=09=09=09desc_addr, driver_addr, > +=09=09=09=09device_addr)) { > +=09=09err =3D -EINVAL; > +=09=09goto err_vq; > +=09} > + > +=09ops->set_vq_ready(mdev, index, 1); > + > +=09vq->priv =3D info; > +=09info->vq =3D vq; > + > +=09spin_lock_irqsave(&vm_dev->lock, flags); > +=09list_add(&info->node, &vm_dev->virtqueues); > +=09spin_unlock_irqrestore(&vm_dev->lock, flags); > + > +=09return vq; > + > +err_vq: > +=09vring_del_virtqueue(vq); > +error_new_virtqueue: > +=09ops->set_vq_ready(mdev, index, 0); > +=09WARN_ON(ops->get_vq_ready(mdev, index)); > +=09kfree(info); > +=09return ERR_PTR(err); > +} > + > +static void virtio_mdev_del_vq(struct virtqueue *vq) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vq->vdev)= ; > +=09struct mdev_device *mdev =3D vm_dev->mdev; > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_vq_info *info =3D vq->priv; > +=09unsigned int index =3D vq->index; > +=09unsigned long flags; > + > +=09spin_lock_irqsave(&vm_dev->lock, flags); > +=09list_del(&info->node); > +=09spin_unlock_irqrestore(&vm_dev->lock, flags); > + > +=09/* Select and deactivate the queue */ > +=09ops->set_vq_ready(mdev, index, 0); > +=09WARN_ON(ops->get_vq_ready(mdev, index)); > + > +=09vring_del_virtqueue(vq); > + > +=09kfree(info); > +} > + > +static void virtio_mdev_del_vqs(struct virtio_device *vdev) > +{ > +=09struct virtqueue *vq, *n; > + > +=09list_for_each_entry_safe(vq, n, &vdev->vqs, list) > +=09=09virtio_mdev_del_vq(vq); > +} > + > +static int virtio_mdev_find_vqs(struct virtio_device *vdev, unsigned nvq= s, > +=09=09=09=09struct virtqueue *vqs[], > +=09=09=09=09vq_callback_t *callbacks[], > +=09=09=09=09const char * const names[], > +=09=09=09=09const bool *ctx, > +=09=09=09=09struct irq_affinity *desc) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_callback cb; > +=09int i, err, queue_idx =3D 0; > + > +=09for (i =3D 0; i < nvqs; ++i) { > +=09=09if (!names[i]) { > +=09=09=09vqs[i] =3D NULL; > +=09=09=09continue; > +=09=09} > + > +=09=09vqs[i] =3D virtio_mdev_setup_vq(vdev, queue_idx++, > +=09=09=09=09=09 callbacks[i], names[i], ctx ? > +=09=09=09=09=09 ctx[i] : false); > +=09=09if (IS_ERR(vqs[i])) { > +=09=09=09err =3D PTR_ERR(vqs[i]); > +=09=09=09goto err_setup_vq; > +=09=09} > +=09} > + > +=09cb.callback =3D virtio_mdev_config_cb; > +=09cb.private =3D vm_dev; > +=09ops->set_config_cb(mdev, &cb); > + > +=09return 0; > + > +err_setup_vq: > +=09virtio_mdev_del_vqs(vdev); > +=09return err; > +} > + > +static u64 virtio_mdev_get_features(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->get_features(mdev); > +} > + > +static int virtio_mdev_finalize_features(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09/* Give virtio_ring a chance to accept features. */ > +=09vring_transport_features(vdev); > + > +=09return ops->set_features(mdev, vdev->features); > +} > + > +static const char *virtio_mdev_bus_name(struct virtio_device *vdev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09return dev_name(mdev_dev(mdev)); > +} > + > +static const struct virtio_config_ops virtio_mdev_config_ops =3D { > +=09.get=09=09=3D virtio_mdev_get, > +=09.set=09=09=3D virtio_mdev_set, > +=09.generation=09=3D virtio_mdev_generation, > +=09.get_status=09=3D virtio_mdev_get_status, > +=09.set_status=09=3D virtio_mdev_set_status, > +=09.reset=09=09=3D virtio_mdev_reset, > +=09.find_vqs=09=3D virtio_mdev_find_vqs, > +=09.del_vqs=09=3D virtio_mdev_del_vqs, > +=09.get_features=09=3D virtio_mdev_get_features, > +=09.finalize_features =3D virtio_mdev_finalize_features, > +=09.bus_name=09=3D virtio_mdev_bus_name, > +}; > + > +static void virtio_mdev_release_dev(struct device *_d) > +{ > +=09struct virtio_device *vdev =3D > +=09 container_of(_d, struct virtio_device, dev); > +=09struct virtio_mdev_device *vm_dev =3D > +=09 container_of(vdev, struct virtio_mdev_device, vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09devm_kfree(mdev_dev(mdev), vm_dev); > +} > + > +static int virtio_mdev_probe(struct device *dev) > +{ > +=09struct mdev_device *mdev =3D mdev_virtio_from_dev(dev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_device *vm_dev; > +=09int rc; > + > +=09vm_dev =3D devm_kzalloc(dev, sizeof(*vm_dev), GFP_KERNEL); > +=09if (!vm_dev) > +=09=09return -ENOMEM; > + > +=09vm_dev->vdev.dev.parent =3D dev; > +=09vm_dev->vdev.dev.release =3D virtio_mdev_release_dev; > +=09vm_dev->vdev.config =3D &virtio_mdev_config_ops; > +=09vm_dev->mdev =3D mdev; > +=09INIT_LIST_HEAD(&vm_dev->virtqueues); > +=09spin_lock_init(&vm_dev->lock); > + > +=09vm_dev->vdev.id.device =3D ops->get_device_id(mdev); > +=09if (vm_dev->vdev.id.device =3D=3D 0) > +=09=09return -ENODEV; > + > +=09vm_dev->vdev.id.vendor =3D ops->get_vendor_id(mdev); > +=09rc =3D register_virtio_device(&vm_dev->vdev); > +=09if (rc) > +=09=09put_device(dev); > +=09else > +=09=09dev_set_drvdata(dev, vm_dev); > + > +=09return rc; > +} > + > +static void virtio_mdev_remove(struct device *dev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D dev_get_drvdata(dev); > + > +=09unregister_virtio_device(&vm_dev->vdev); > +} > + > +static const struct mdev_virtio_class_id virtio_id_table[] =3D { > +=09{ MDEV_VIRTIO_CLASS_ID_VIRTIO }, > +=09{ 0 }, > +}; > + Do we still need the class ID? It's a virtio mdev bus, do we need a virtio class as well? > +MODULE_DEVICE_TABLE(mdev_virtio, virtio_id_table); > + > +static struct mdev_virtio_driver virtio_mdev_driver =3D { > +=09.drv =3D { > +=09=09.name=09=3D "virtio_mdev", > +=09=09.probe=09=3D virtio_mdev_probe, > +=09=09.remove =3D virtio_mdev_remove, > +=09}, > +=09.id_table =3D virtio_id_table, > +}; > + > +static int __init virtio_mdev_init(void) > +{ > +=09return mdev_register_driver(&virtio_mdev_driver.drv, THIS_MODULE, > +=09=09=09=09 &mdev_virtio_bus_type); > +} > + > +static void __exit virtio_mdev_exit(void) > +{ > +=09mdev_unregister_driver(&virtio_mdev_driver.drv); > +} > + > +module_init(virtio_mdev_init) > +module_exit(virtio_mdev_exit) > + > +MODULE_VERSION(DRIVER_VERSION); > +MODULE_LICENSE("GPL v2"); > +MODULE_AUTHOR(DRIVER_AUTHOR); > +MODULE_DESCRIPTION(DRIVER_DESC); > diff --git a/include/linux/mdev_virtio.h b/include/linux/mdev_virtio.h > index ef2dbb6c383a..5f75f3cf59e1 100644 > --- a/include/linux/mdev_virtio.h > +++ b/include/linux/mdev_virtio.h > @@ -25,6 +25,11 @@ struct virtio_mdev_callback { > =09void *private; > }; > =20 > +enum { > +=09MDEV_VIRTIO_CLASS_ID_VIRTIO =3D 1, > +=09/* New entries must be added here */ > +}; > + > /** > * struct mdev_virtio_device_ops - Structure to be registered for each > * mdev device to register the device for virtio/vhost drivers. > --=20 > 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Michael S. Tsirkin" Subject: Re: [PATCH V12 5/6] virtio: introduce a mdev based transport Date: Mon, 18 Nov 2019 05:44:25 -0500 Message-ID: <20191118054339-mutt-send-email-mst@kernel.org> References: <20191118061703.8669-1-jasowang@redhat.com> <20191118061703.8669-6-jasowang@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <20191118061703.8669-6-jasowang@redhat.com> Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org To: Jason Wang Cc: kvm@vger.kernel.org, linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, intel-gvt-dev@lists.freedesktop.org, kwankhede@nvidia.com, alex.williamson@redhat.com, tiwei.bie@intel.com, virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, cohuck@redhat.com, maxime.coquelin@redhat.com, cunming.liang@intel.com, zhihong.wang@intel.com, rob.miller@broadcom.com, xiao.w.wang@intel.com, haotian.wang@sifive.com, zhenyuw@linux.intel.com, zhi.a.wang@intel.com, jani.nikula@linux.intel.com, joonas.lahtinen@linux.intel.com, rodrigo.vivi@intel.com, airlied@linux.ie, daniel@ffwll.ch, farman@linux.ibm.com, pasic@linux.ibm.com, sebott@linux.ibm.com, oberpar@linux.ibm.com, heiko.carstens@de.ibm.com, gor@linux.ib List-Id: dri-devel@lists.freedesktop.org On Mon, Nov 18, 2019 at 02:17:02PM +0800, Jason Wang wrote: > This patch introduces a new mdev transport for virtio. This is used to > use kernel virtio driver to drive the mediated device that is capable > of populating virtqueue directly. >=20 > A new virtio-mdev driver will be registered to the mdev bus, when a > new virtio-mdev device is probed, it will register the device with > mdev based config ops. This means it is a software transport between > mdev driver and mdev device. The transport was implemented through > bus_ops of mdev parent. >=20 > Signed-off-by: Jason Wang > --- > drivers/virtio/Kconfig | 13 ++ > drivers/virtio/Makefile | 1 + > drivers/virtio/virtio_mdev.c | 409 +++++++++++++++++++++++++++++++++++ > include/linux/mdev_virtio.h | 5 + > 4 files changed, 428 insertions(+) > create mode 100644 drivers/virtio/virtio_mdev.c >=20 > diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig > index 078615cf2afc..6a89b3de97d3 100644 > --- a/drivers/virtio/Kconfig > +++ b/drivers/virtio/Kconfig > @@ -43,6 +43,19 @@ config VIRTIO_PCI_LEGACY > =20 > =09 If unsure, say Y. > =20 > +config VIRTIO_MDEV > +=09tristate "MDEV driver for virtio devices" > +=09depends on MDEV_VIRTIO > +=09default n > +=09help > +=09 This driver provides support for virtio based paravirtual > +=09 device driver over MDEV bus. For this to be useful, you need > +=09 an appropriate virtio mdev device implementation that > +=09 operates on a physical device to allow the datapath of virtio > +=09 to be offloaded to hardware. > + > +=09 If unsure, say M. > + > config VIRTIO_PMEM > =09tristate "Support for virtio pmem driver" > =09depends on VIRTIO > diff --git a/drivers/virtio/Makefile b/drivers/virtio/Makefile > index 3a2b5c5dcf46..f2997b6c812f 100644 > --- a/drivers/virtio/Makefile > +++ b/drivers/virtio/Makefile > @@ -6,3 +6,4 @@ virtio_pci-y :=3D virtio_pci_modern.o virtio_pci_common.o > virtio_pci-$(CONFIG_VIRTIO_PCI_LEGACY) +=3D virtio_pci_legacy.o > obj-$(CONFIG_VIRTIO_BALLOON) +=3D virtio_balloon.o > obj-$(CONFIG_VIRTIO_INPUT) +=3D virtio_input.o > +obj-$(CONFIG_VIRTIO_MDEV) +=3D virtio_mdev.o > diff --git a/drivers/virtio/virtio_mdev.c b/drivers/virtio/virtio_mdev.c > new file mode 100644 > index 000000000000..7fdb42f055df > --- /dev/null > +++ b/drivers/virtio/virtio_mdev.c > @@ -0,0 +1,409 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * VIRTIO based driver for Mediated device > + * > + * Copyright (c) 2019, Red Hat. All rights reserved. > + * Author: Jason Wang > + * > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DRIVER_VERSION "0.1" > +#define DRIVER_AUTHOR "Red Hat Corporation" > +#define DRIVER_DESC "VIRTIO based driver for Mediated device" > + > +#define to_virtio_mdev_device(dev) \ > +=09container_of(dev, struct virtio_mdev_device, vdev) > + > +struct virtio_mdev_device { > +=09struct virtio_device vdev; > +=09struct mdev_device *mdev; > +=09u64 features; > + > +=09/* The lock to protect virtqueue list */ > +=09spinlock_t lock; > +=09/* List of virtio_mdev_vq_info */ > +=09struct list_head virtqueues; > +}; > + > +struct virtio_mdev_vq_info { > +=09/* the actual virtqueue */ > +=09struct virtqueue *vq; > + > +=09/* the list node for the virtqueues list */ > +=09struct list_head node; > +}; > + > +static struct mdev_device *vm_get_mdev(struct virtio_device *vdev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09return mdev; > +} > + > +static void virtio_mdev_get(struct virtio_device *vdev, unsigned offset, > +=09=09=09 void *buf, unsigned len) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->get_config(mdev, offset, buf, len); > +} > + > +static void virtio_mdev_set(struct virtio_device *vdev, unsigned offset, > +=09=09=09 const void *buf, unsigned len) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->set_config(mdev, offset, buf, len); > +} > + > +static u32 virtio_mdev_generation(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > + > +=09if (ops->get_generation) > +=09=09return ops->get_generation(mdev); > + > +=09return 0; > +} > + > +static u8 virtio_mdev_get_status(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->get_status(mdev); > +} > + > +static void virtio_mdev_set_status(struct virtio_device *vdev, u8 status= ) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->set_status(mdev, status); > +} > + > +static void virtio_mdev_reset(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->set_status(mdev, 0); > +} > + > +static bool virtio_mdev_notify(struct virtqueue *vq) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vq->vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09ops->kick_vq(mdev, vq->index); > + > +=09return true; > +} > + > +static irqreturn_t virtio_mdev_config_cb(void *private) > +{ > +=09struct virtio_mdev_device *vm_dev =3D private; > + > +=09virtio_config_changed(&vm_dev->vdev); > + > +=09return IRQ_HANDLED; > +} > + > +static irqreturn_t virtio_mdev_virtqueue_cb(void *private) > +{ > +=09struct virtio_mdev_vq_info *info =3D private; > + > +=09return vring_interrupt(0, info->vq); > +} > + > +static struct virtqueue * > +virtio_mdev_setup_vq(struct virtio_device *vdev, unsigned int index, > +=09=09 void (*callback)(struct virtqueue *vq), > +=09=09 const char *name, bool ctx) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_vq_info *info; > +=09struct virtio_mdev_callback cb; > +=09struct virtqueue *vq; > +=09u64 desc_addr, driver_addr, device_addr; > +=09unsigned long flags; > +=09u32 align, num; > +=09int err; > + > +=09if (!name) > +=09=09return NULL; > + > +=09/* Queue shouldn't already be set up. */ > +=09if (ops->get_vq_ready(mdev, index)) > +=09=09return ERR_PTR(-ENOENT); > + > +=09/* Allocate and fill out our active queue description */ > +=09info =3D kmalloc(sizeof(*info), GFP_KERNEL); > +=09if (!info) > +=09=09return ERR_PTR(-ENOMEM); > + > +=09num =3D ops->get_vq_num_max(mdev); > +=09if (num =3D=3D 0) { > +=09=09err =3D -ENOENT; > +=09=09goto error_new_virtqueue; > +=09} > + > +=09/* Create the vring */ > +=09align =3D ops->get_vq_align(mdev); > +=09vq =3D vring_create_virtqueue(index, num, align, vdev, > +=09=09=09=09 true, true, ctx, > +=09=09=09=09 virtio_mdev_notify, callback, name); > +=09if (!vq) { > +=09=09err =3D -ENOMEM; > +=09=09goto error_new_virtqueue; > +=09} > + > +=09/* Setup virtqueue callback */ > +=09cb.callback =3D virtio_mdev_virtqueue_cb; > +=09cb.private =3D info; > +=09ops->set_vq_cb(mdev, index, &cb); > +=09ops->set_vq_num(mdev, index, virtqueue_get_vring_size(vq)); > + > +=09desc_addr =3D virtqueue_get_desc_addr(vq); > +=09driver_addr =3D virtqueue_get_avail_addr(vq); > +=09device_addr =3D virtqueue_get_used_addr(vq); > + > +=09if (ops->set_vq_address(mdev, index, > +=09=09=09=09desc_addr, driver_addr, > +=09=09=09=09device_addr)) { > +=09=09err =3D -EINVAL; > +=09=09goto err_vq; > +=09} > + > +=09ops->set_vq_ready(mdev, index, 1); > + > +=09vq->priv =3D info; > +=09info->vq =3D vq; > + > +=09spin_lock_irqsave(&vm_dev->lock, flags); > +=09list_add(&info->node, &vm_dev->virtqueues); > +=09spin_unlock_irqrestore(&vm_dev->lock, flags); > + > +=09return vq; > + > +err_vq: > +=09vring_del_virtqueue(vq); > +error_new_virtqueue: > +=09ops->set_vq_ready(mdev, index, 0); > +=09WARN_ON(ops->get_vq_ready(mdev, index)); > +=09kfree(info); > +=09return ERR_PTR(err); > +} > + > +static void virtio_mdev_del_vq(struct virtqueue *vq) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vq->vdev)= ; > +=09struct mdev_device *mdev =3D vm_dev->mdev; > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_vq_info *info =3D vq->priv; > +=09unsigned int index =3D vq->index; > +=09unsigned long flags; > + > +=09spin_lock_irqsave(&vm_dev->lock, flags); > +=09list_del(&info->node); > +=09spin_unlock_irqrestore(&vm_dev->lock, flags); > + > +=09/* Select and deactivate the queue */ > +=09ops->set_vq_ready(mdev, index, 0); > +=09WARN_ON(ops->get_vq_ready(mdev, index)); > + > +=09vring_del_virtqueue(vq); > + > +=09kfree(info); > +} > + > +static void virtio_mdev_del_vqs(struct virtio_device *vdev) > +{ > +=09struct virtqueue *vq, *n; > + > +=09list_for_each_entry_safe(vq, n, &vdev->vqs, list) > +=09=09virtio_mdev_del_vq(vq); > +} > + > +static int virtio_mdev_find_vqs(struct virtio_device *vdev, unsigned nvq= s, > +=09=09=09=09struct virtqueue *vqs[], > +=09=09=09=09vq_callback_t *callbacks[], > +=09=09=09=09const char * const names[], > +=09=09=09=09const bool *ctx, > +=09=09=09=09struct irq_affinity *desc) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_callback cb; > +=09int i, err, queue_idx =3D 0; > + > +=09for (i =3D 0; i < nvqs; ++i) { > +=09=09if (!names[i]) { > +=09=09=09vqs[i] =3D NULL; > +=09=09=09continue; > +=09=09} > + > +=09=09vqs[i] =3D virtio_mdev_setup_vq(vdev, queue_idx++, > +=09=09=09=09=09 callbacks[i], names[i], ctx ? > +=09=09=09=09=09 ctx[i] : false); > +=09=09if (IS_ERR(vqs[i])) { > +=09=09=09err =3D PTR_ERR(vqs[i]); > +=09=09=09goto err_setup_vq; > +=09=09} > +=09} > + > +=09cb.callback =3D virtio_mdev_config_cb; > +=09cb.private =3D vm_dev; > +=09ops->set_config_cb(mdev, &cb); > + > +=09return 0; > + > +err_setup_vq: > +=09virtio_mdev_del_vqs(vdev); > +=09return err; > +} > + > +static u64 virtio_mdev_get_features(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09return ops->get_features(mdev); > +} > + > +static int virtio_mdev_finalize_features(struct virtio_device *vdev) > +{ > +=09struct mdev_device *mdev =3D vm_get_mdev(vdev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > + > +=09/* Give virtio_ring a chance to accept features. */ > +=09vring_transport_features(vdev); > + > +=09return ops->set_features(mdev, vdev->features); > +} > + > +static const char *virtio_mdev_bus_name(struct virtio_device *vdev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D to_virtio_mdev_device(vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09return dev_name(mdev_dev(mdev)); > +} > + > +static const struct virtio_config_ops virtio_mdev_config_ops =3D { > +=09.get=09=09=3D virtio_mdev_get, > +=09.set=09=09=3D virtio_mdev_set, > +=09.generation=09=3D virtio_mdev_generation, > +=09.get_status=09=3D virtio_mdev_get_status, > +=09.set_status=09=3D virtio_mdev_set_status, > +=09.reset=09=09=3D virtio_mdev_reset, > +=09.find_vqs=09=3D virtio_mdev_find_vqs, > +=09.del_vqs=09=3D virtio_mdev_del_vqs, > +=09.get_features=09=3D virtio_mdev_get_features, > +=09.finalize_features =3D virtio_mdev_finalize_features, > +=09.bus_name=09=3D virtio_mdev_bus_name, > +}; > + > +static void virtio_mdev_release_dev(struct device *_d) > +{ > +=09struct virtio_device *vdev =3D > +=09 container_of(_d, struct virtio_device, dev); > +=09struct virtio_mdev_device *vm_dev =3D > +=09 container_of(vdev, struct virtio_mdev_device, vdev); > +=09struct mdev_device *mdev =3D vm_dev->mdev; > + > +=09devm_kfree(mdev_dev(mdev), vm_dev); > +} > + > +static int virtio_mdev_probe(struct device *dev) > +{ > +=09struct mdev_device *mdev =3D mdev_virtio_from_dev(dev); > +=09const struct mdev_virtio_ops *ops =3D mdev_virtio_get_ops(mdev); > +=09struct virtio_mdev_device *vm_dev; > +=09int rc; > + > +=09vm_dev =3D devm_kzalloc(dev, sizeof(*vm_dev), GFP_KERNEL); > +=09if (!vm_dev) > +=09=09return -ENOMEM; > + > +=09vm_dev->vdev.dev.parent =3D dev; > +=09vm_dev->vdev.dev.release =3D virtio_mdev_release_dev; > +=09vm_dev->vdev.config =3D &virtio_mdev_config_ops; > +=09vm_dev->mdev =3D mdev; > +=09INIT_LIST_HEAD(&vm_dev->virtqueues); > +=09spin_lock_init(&vm_dev->lock); > + > +=09vm_dev->vdev.id.device =3D ops->get_device_id(mdev); > +=09if (vm_dev->vdev.id.device =3D=3D 0) > +=09=09return -ENODEV; > + > +=09vm_dev->vdev.id.vendor =3D ops->get_vendor_id(mdev); > +=09rc =3D register_virtio_device(&vm_dev->vdev); > +=09if (rc) > +=09=09put_device(dev); > +=09else > +=09=09dev_set_drvdata(dev, vm_dev); > + > +=09return rc; > +} > + > +static void virtio_mdev_remove(struct device *dev) > +{ > +=09struct virtio_mdev_device *vm_dev =3D dev_get_drvdata(dev); > + > +=09unregister_virtio_device(&vm_dev->vdev); > +} > + > +static const struct mdev_virtio_class_id virtio_id_table[] =3D { > +=09{ MDEV_VIRTIO_CLASS_ID_VIRTIO }, > +=09{ 0 }, > +}; > + Do we still need the class ID? It's a virtio mdev bus, do we need a virtio class as well? > +MODULE_DEVICE_TABLE(mdev_virtio, virtio_id_table); > + > +static struct mdev_virtio_driver virtio_mdev_driver =3D { > +=09.drv =3D { > +=09=09.name=09=3D "virtio_mdev", > +=09=09.probe=09=3D virtio_mdev_probe, > +=09=09.remove =3D virtio_mdev_remove, > +=09}, > +=09.id_table =3D virtio_id_table, > +}; > + > +static int __init virtio_mdev_init(void) > +{ > +=09return mdev_register_driver(&virtio_mdev_driver.drv, THIS_MODULE, > +=09=09=09=09 &mdev_virtio_bus_type); > +} > + > +static void __exit virtio_mdev_exit(void) > +{ > +=09mdev_unregister_driver(&virtio_mdev_driver.drv); > +} > + > +module_init(virtio_mdev_init) > +module_exit(virtio_mdev_exit) > + > +MODULE_VERSION(DRIVER_VERSION); > +MODULE_LICENSE("GPL v2"); > +MODULE_AUTHOR(DRIVER_AUTHOR); > +MODULE_DESCRIPTION(DRIVER_DESC); > diff --git a/include/linux/mdev_virtio.h b/include/linux/mdev_virtio.h > index ef2dbb6c383a..5f75f3cf59e1 100644 > --- a/include/linux/mdev_virtio.h > +++ b/include/linux/mdev_virtio.h > @@ -25,6 +25,11 @@ struct virtio_mdev_callback { > =09void *private; > }; > =20 > +enum { > +=09MDEV_VIRTIO_CLASS_ID_VIRTIO =3D 1, > +=09/* New entries must be added here */ > +}; > + > /** > * struct mdev_virtio_device_ops - Structure to be registered for each > * mdev device to register the device for virtio/vhost drivers. > --=20 > 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FBC1C43215 for ; Mon, 18 Nov 2019 10:44:45 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 81A992084D for ; Mon, 18 Nov 2019 10:44:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 81A992084D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8C6196E442; Mon, 18 Nov 2019 10:44:44 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id F27CA6E442 for ; Mon, 18 Nov 2019 10:44:42 +0000 (UTC) Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-398-QruMvlp9NeSv4Gd2iAqXwA-1; Mon, 18 Nov 2019 05:44:41 -0500 Received: by mail-qk1-f197.google.com with SMTP id 6so11261140qkc.4 for ; Mon, 18 Nov 2019 02:44:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=CxprIgJpUU3jeQV00/9UkqkMAmaR0THasL1suxqMVK8=; b=EI2be0Yl3Dc9Au9g9Ozqgop3XwHgQqbAZ5T2wxafQyfLNhIEO1EU4T74UtXkYf2Zru StKtq+Uqcx2CYhXzHq9wOfR8D2UkPWo7U7gu9BuCiWWVtzseDOOCJbjjYXR/KuVQvLm4 6okM/KqZZ02my+TdQ6BBVQLKLDR+IDPe8s3Z36NnCpK7w2PE5Q2IIA0gki/A5g9Piny0 sJW1ANirAD7VydHGCbV/vKrKmGCP2JWv+r1J7ijiINS1zTKZ0McYiFk/TPEeGlTo/hKj dIxaKwqZMvZcnQJzDmDfk1shwOIlOYe0bNlj3wbIpWe4LVPENCihHkoDNt3XefQqdddr oI7Q== X-Gm-Message-State: APjAAAWDR2P5lH1tLDcjwyjIysxTbTxnBDpjsbZJkI9MgJ09wcZjtXBi eYl8BAFZeo6ZvvByag6TXj2Yktt8lGxrHim38AvRe9U5UWGvTBpRljlefJFK4HeaSgfq6GVoC+9 JV9enMnVn8VGUjy3vPy5TQEAozxUa X-Received: by 2002:a0c:802f:: with SMTP id 44mr3314581qva.116.1574073879714; Mon, 18 Nov 2019 02:44:39 -0800 (PST) X-Google-Smtp-Source: APXvYqzR171/RwNU/G+Jin4zQP77S8Rxmutj1BRTygyk3DLP3YBhHrtlrH0hO8EFJL/8dj4mQFGbiA== X-Received: by 2002:a0c:802f:: with SMTP id 44mr3314522qva.116.1574073879233; Mon, 18 Nov 2019 02:44:39 -0800 (PST) Received: from redhat.com (bzq-79-176-6-42.red.bezeqint.net. [79.176.6.42]) by smtp.gmail.com with ESMTPSA id x39sm10429813qth.92.2019.11.18.02.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 02:44:38 -0800 (PST) Date: Mon, 18 Nov 2019 05:44:25 -0500 From: "Michael S. Tsirkin" To: Jason Wang Subject: Re: [PATCH V12 5/6] virtio: introduce a mdev based transport Message-ID: <20191118054339-mutt-send-email-mst@kernel.org> References: <20191118061703.8669-1-jasowang@redhat.com> <20191118061703.8669-6-jasowang@redhat.com> MIME-Version: 1.0 In-Reply-To: <20191118061703.8669-6-jasowang@redhat.com> X-MC-Unique: QruMvlp9NeSv4Gd2iAqXwA-1 X-Mimecast-Spam-Score: 0 Content-Disposition: inline X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1574073881; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JnVZIEJ4yoxZxjAnvF8WPtLqyuvkPdbvQZxdbW+Uljo=; b=SK6D/lk7QTg5NWi9j7dd5XKaRW+Q8JXim+2Y+59LXYHy8V5TK6j7XciV/+NWoT8NVRhG/y s5ju3skj3a7eBf/Ms7PvbTtwenzaxADdN+4jY20pyv4nlMb+S3j8jtQEIL+PdnIb+VPu23 E+iXAeb8fSg8AEAzZCRUD6VUxrZ7fr0= X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rdunlap@infradead.org, christophe.de.dinechin@gmail.com, kvm@vger.kernel.org, hch@infradead.org, airlied@linux.ie, heiko.carstens@de.ibm.com, kevin.tian@intel.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, kwankhede@nvidia.com, jgg@mellanox.com, rob.miller@broadcom.com, linux-s390@vger.kernel.org, sebott@linux.ibm.com, lulu@redhat.com, eperezma@redhat.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, haotian.wang@sifive.com, cunming.liang@intel.com, zhi.a.wang@intel.com, farman@linux.ibm.com, parav@mellanox.com, gor@linux.ibm.com, intel-gfx@lists.freedesktop.org, alex.williamson@redhat.com, xiao.w.wang@intel.com, freude@linux.ibm.com, stefanha@redhat.com, zhihong.wang@intel.com, rodrigo.vivi@intel.com, intel-gvt-dev@lists.freedesktop.org, akrowiak@linux.ibm.com, oberpar@linux.ibm.com, tiwei.bie@intel.com, netdev@vger.kernel.org, cohuck@redhat.com, linux-kernel@vger.kernel.org, maxime.coquelin@redhat.com, gregkh@linuxfoundation.org, lingshan.zhu@intel.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191118104425.lBH76bVqtmY57Y0nBTW-hcb8kikA6LcV3VSyDDZpqJE@z> T24gTW9uLCBOb3YgMTgsIDIwMTkgYXQgMDI6MTc6MDJQTSArMDgwMCwgSmFzb24gV2FuZyB3cm90 ZToKPiBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWRldiB0cmFuc3BvcnQgZm9yIHZpcnRp by4gVGhpcyBpcyB1c2VkIHRvCj4gdXNlIGtlcm5lbCB2aXJ0aW8gZHJpdmVyIHRvIGRyaXZlIHRo ZSBtZWRpYXRlZCBkZXZpY2UgdGhhdCBpcyBjYXBhYmxlCj4gb2YgcG9wdWxhdGluZyB2aXJ0cXVl dWUgZGlyZWN0bHkuCj4gCj4gQSBuZXcgdmlydGlvLW1kZXYgZHJpdmVyIHdpbGwgYmUgcmVnaXN0 ZXJlZCB0byB0aGUgbWRldiBidXMsIHdoZW4gYQo+IG5ldyB2aXJ0aW8tbWRldiBkZXZpY2UgaXMg cHJvYmVkLCBpdCB3aWxsIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aAo+IG1kZXYgYmFzZWQgY29u ZmlnIG9wcy4gVGhpcyBtZWFucyBpdCBpcyBhIHNvZnR3YXJlIHRyYW5zcG9ydCBiZXR3ZWVuCj4g bWRldiBkcml2ZXIgYW5kIG1kZXYgZGV2aWNlLiBUaGUgdHJhbnNwb3J0IHdhcyBpbXBsZW1lbnRl ZCB0aHJvdWdoCj4gYnVzX29wcyBvZiBtZGV2IHBhcmVudC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBK YXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRoYXQuY29tPgo+IC0tLQo+ICBkcml2ZXJzL3ZpcnRpby9L Y29uZmlnICAgICAgIHwgIDEzICsrCj4gIGRyaXZlcnMvdmlydGlvL01ha2VmaWxlICAgICAgfCAg IDEgKwo+ICBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fbWRldi5jIHwgNDA5ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCj4gIGluY2x1ZGUvbGludXgvbWRldl92aXJ0aW8uaCAgfCAg IDUgKwo+ICA0IGZpbGVzIGNoYW5nZWQsIDQyOCBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fbWRldi5jCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdmlydGlvL0tjb25maWcgYi9kcml2ZXJzL3ZpcnRpby9LY29uZmlnCj4gaW5kZXggMDc4 NjE1Y2YyYWZjLi42YTg5YjNkZTk3ZDMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy92aXJ0aW8vS2Nv bmZpZwo+ICsrKyBiL2RyaXZlcnMvdmlydGlvL0tjb25maWcKPiBAQCAtNDMsNiArNDMsMTkgQEAg Y29uZmlnIFZJUlRJT19QQ0lfTEVHQUNZCj4gIAo+ICAJICBJZiB1bnN1cmUsIHNheSBZLgo+ICAK PiArY29uZmlnIFZJUlRJT19NREVWCj4gKwl0cmlzdGF0ZSAiTURFViBkcml2ZXIgZm9yIHZpcnRp byBkZXZpY2VzIgo+ICsJZGVwZW5kcyBvbiBNREVWX1ZJUlRJTwo+ICsJZGVmYXVsdCBuCj4gKwlo ZWxwCj4gKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHZpcnRpbyBiYXNlZCBw YXJhdmlydHVhbAo+ICsJICBkZXZpY2UgZHJpdmVyIG92ZXIgTURFViBidXMuIEZvciB0aGlzIHRv IGJlIHVzZWZ1bCwgeW91IG5lZWQKPiArCSAgYW4gYXBwcm9wcmlhdGUgdmlydGlvIG1kZXYgZGV2 aWNlIGltcGxlbWVudGF0aW9uIHRoYXQKPiArCSAgb3BlcmF0ZXMgb24gYSBwaHlzaWNhbCBkZXZp Y2UgdG8gYWxsb3cgdGhlIGRhdGFwYXRoIG9mIHZpcnRpbwo+ICsJICB0byBiZSBvZmZsb2FkZWQg dG8gaGFyZHdhcmUuCj4gKwo+ICsJICBJZiB1bnN1cmUsIHNheSBNLgo+ICsKPiAgY29uZmlnIFZJ UlRJT19QTUVNCj4gIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdmlydGlvIHBtZW0gZHJpdmVyIgo+ ICAJZGVwZW5kcyBvbiBWSVJUSU8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vTWFrZWZp bGUgYi9kcml2ZXJzL3ZpcnRpby9NYWtlZmlsZQo+IGluZGV4IDNhMmI1YzVkY2Y0Ni4uZjI5OTdi NmM4MTJmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdmlydGlvL01ha2VmaWxlCj4gKysrIGIvZHJp dmVycy92aXJ0aW8vTWFrZWZpbGUKPiBAQCAtNiwzICs2LDQgQEAgdmlydGlvX3BjaS15IDo9IHZp cnRpb19wY2lfbW9kZXJuLm8gdmlydGlvX3BjaV9jb21tb24ubwo+ICB2aXJ0aW9fcGNpLSQoQ09O RklHX1ZJUlRJT19QQ0lfTEVHQUNZKSArPSB2aXJ0aW9fcGNpX2xlZ2FjeS5vCj4gIG9iai0kKENP TkZJR19WSVJUSU9fQkFMTE9PTikgKz0gdmlydGlvX2JhbGxvb24ubwo+ICBvYmotJChDT05GSUdf VklSVElPX0lOUFVUKSArPSB2aXJ0aW9faW5wdXQubwo+ICtvYmotJChDT05GSUdfVklSVElPX01E RVYpICs9IHZpcnRpb19tZGV2Lm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlv X21kZXYuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tZGV2LmMKPiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uN2ZkYjQyZjA1NWRmCj4gLS0tIC9kZXYvbnVsbAo+ ICsrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tZGV2LmMKPiBAQCAtMCwwICsxLDQwOSBAQAo+ ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIFZJ UlRJTyBiYXNlZCBkcml2ZXIgZm9yIE1lZGlhdGVkIGRldmljZQo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTksIFJlZCBIYXQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAqICAgICBBdXRo b3I6IEphc29uIFdhbmcgPGphc293YW5nQHJlZGhhdC5jb20+Cj4gKyAqCj4gKyAqLwo+ICsKPiAr I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsj aW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgo+ICsjaW5jbHVkZSA8bGludXgvbWRldl92aXJ0aW8uaD4K PiArI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3Zp cnRpb19yaW5nLmg+Cj4gKwo+ICsjZGVmaW5lIERSSVZFUl9WRVJTSU9OICAiMC4xIgo+ICsjZGVm aW5lIERSSVZFUl9BVVRIT1IgICAiUmVkIEhhdCBDb3Jwb3JhdGlvbiIKPiArI2RlZmluZSBEUklW RVJfREVTQyAgICAgIlZJUlRJTyBiYXNlZCBkcml2ZXIgZm9yIE1lZGlhdGVkIGRldmljZSIKPiAr Cj4gKyNkZWZpbmUgdG9fdmlydGlvX21kZXZfZGV2aWNlKGRldikgXAo+ICsJY29udGFpbmVyX29m KGRldiwgc3RydWN0IHZpcnRpb19tZGV2X2RldmljZSwgdmRldikKPiArCj4gK3N0cnVjdCB2aXJ0 aW9fbWRldl9kZXZpY2Ugewo+ICsJc3RydWN0IHZpcnRpb19kZXZpY2UgdmRldjsKPiArCXN0cnVj dCBtZGV2X2RldmljZSAqbWRldjsKPiArCXU2NCBmZWF0dXJlczsKPiArCj4gKwkvKiBUaGUgbG9j ayB0byBwcm90ZWN0IHZpcnRxdWV1ZSBsaXN0ICovCj4gKwlzcGlubG9ja190IGxvY2s7Cj4gKwkv KiBMaXN0IG9mIHZpcnRpb19tZGV2X3ZxX2luZm8gKi8KPiArCXN0cnVjdCBsaXN0X2hlYWQgdmly dHF1ZXVlczsKPiArfTsKPiArCj4gK3N0cnVjdCB2aXJ0aW9fbWRldl92cV9pbmZvIHsKPiArCS8q IHRoZSBhY3R1YWwgdmlydHF1ZXVlICovCj4gKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKPiArCj4g KwkvKiB0aGUgbGlzdCBub2RlIGZvciB0aGUgdmlydHF1ZXVlcyBsaXN0ICovCj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IG1kZXZfZGV2aWNlICp2 bV9nZXRfbWRldihzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKPiArewo+ICsJc3RydWN0IHZp cnRpb19tZGV2X2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21kZXZfZGV2aWNlKHZkZXYpOwo+ ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1fZGV2LT5tZGV2Owo+ICsKPiArCXJldHVy biBtZGV2Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9nZXQoc3RydWN0IHZp cnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKPiArCQkJICAgIHZvaWQgKmJ1Ziwg dW5zaWduZWQgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRf bWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZf dmlydGlvX2dldF9vcHMobWRldik7Cj4gKwo+ICsJb3BzLT5nZXRfY29uZmlnKG1kZXYsIG9mZnNl dCwgYnVmLCBsZW4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9zZXQoc3Ry dWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKPiArCQkJICAgIGNvbnN0 IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1k ZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMg Km9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwo+ICsJb3BzLT5zZXRfY29uZmln KG1kZXYsIG9mZnNldCwgYnVmLCBsZW4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIHZpcnRpb19t ZGV2X2dlbmVyYXRpb24oc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCj4gK3sKPiArCXN0cnVj dCBtZGV2X2RldmljZSAqbWRldiA9IHZtX2dldF9tZGV2KHZkZXYpOwo+ICsJY29uc3Qgc3RydWN0 IG1kZXZfdmlydGlvX29wcyAqb3BzID0gbWRldl92aXJ0aW9fZ2V0X29wcyhtZGV2KTsKPiArCj4g Kwo+ICsJaWYgKG9wcy0+Z2V0X2dlbmVyYXRpb24pCj4gKwkJcmV0dXJuIG9wcy0+Z2V0X2dlbmVy YXRpb24obWRldik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCB2aXJ0 aW9fbWRldl9nZXRfc3RhdHVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0 cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4g Kwo+ICsJcmV0dXJuIG9wcy0+Z2V0X3N0YXR1cyhtZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgdmlydGlvX21kZXZfc2V0X3N0YXR1cyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdTgg c3RhdHVzKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2 ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlv X2dldF9vcHMobWRldik7Cj4gKwo+ICsJcmV0dXJuIG9wcy0+c2V0X3N0YXR1cyhtZGV2LCBzdGF0 dXMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9yZXNldChzdHJ1Y3Qgdmly dGlvX2RldmljZSAqdmRldikKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1f Z2V0X21kZXYodmRldik7Cj4gKwljb25zdCBzdHJ1Y3QgbWRldl92aXJ0aW9fb3BzICpvcHMgPSBt ZGV2X3ZpcnRpb19nZXRfb3BzKG1kZXYpOwo+ICsKPiArCXJldHVybiBvcHMtPnNldF9zdGF0dXMo bWRldiwgMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIHZpcnRpb19tZGV2X25vdGlmeShzdHJ1 Y3QgdmlydHF1ZXVlICp2cSkKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1f Z2V0X21kZXYodnEtPnZkZXYpOwo+ICsJY29uc3Qgc3RydWN0IG1kZXZfdmlydGlvX29wcyAqb3Bz ID0gbWRldl92aXJ0aW9fZ2V0X29wcyhtZGV2KTsKPiArCj4gKwlvcHMtPmtpY2tfdnEobWRldiwg dnEtPmluZGV4KTsKPiArCj4gKwlyZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IHZpcnRpb19tZGV2X2NvbmZpZ19jYih2b2lkICpwcml2YXRlKQo+ICt7Cj4gKwlzdHJ1 Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPSBwcml2YXRlOwo+ICsKPiArCXZpcnRpb19j b25maWdfY2hhbmdlZCgmdm1fZGV2LT52ZGV2KTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7 Cj4gK30KPiArCj4gK3N0YXRpYyBpcnFyZXR1cm5fdCB2aXJ0aW9fbWRldl92aXJ0cXVldWVfY2Io dm9pZCAqcHJpdmF0ZSkKPiArewo+ICsJc3RydWN0IHZpcnRpb19tZGV2X3ZxX2luZm8gKmluZm8g PSBwcml2YXRlOwo+ICsKPiArCXJldHVybiB2cmluZ19pbnRlcnJ1cHQoMCwgaW5mby0+dnEpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHZpcnRxdWV1ZSAqCj4gK3ZpcnRpb19tZGV2X3NldHVw X3ZxKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsCj4gKwkJ ICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2aXJ0cXVldWUgKnZxKSwKPiArCQkgICAgIGNv bnN0IGNoYXIgKm5hbWUsIGJvb2wgY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfZGV2 aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2UodmRldik7Cj4gKwlzdHJ1Y3QgbWRl dl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2 X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwlzdHJ1Y3Qg dmlydGlvX21kZXZfdnFfaW5mbyAqaW5mbzsKPiArCXN0cnVjdCB2aXJ0aW9fbWRldl9jYWxsYmFj ayBjYjsKPiArCXN0cnVjdCB2aXJ0cXVldWUgKnZxOwo+ICsJdTY0IGRlc2NfYWRkciwgZHJpdmVy X2FkZHIsIGRldmljZV9hZGRyOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCXUzMiBhbGln biwgbnVtOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoIW5hbWUpCj4gKwkJcmV0dXJuIE5VTEw7 Cj4gKwo+ICsJLyogUXVldWUgc2hvdWxkbid0IGFscmVhZHkgYmUgc2V0IHVwLiAqLwo+ICsJaWYg KG9wcy0+Z2V0X3ZxX3JlYWR5KG1kZXYsIGluZGV4KSkKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5P RU5UKTsKPiArCj4gKwkvKiBBbGxvY2F0ZSBhbmQgZmlsbCBvdXQgb3VyIGFjdGl2ZSBxdWV1ZSBk ZXNjcmlwdGlvbiAqLwo+ICsJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5F TCk7Cj4gKwlpZiAoIWluZm8pCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gKwo+ICsJ bnVtID0gb3BzLT5nZXRfdnFfbnVtX21heChtZGV2KTsKPiArCWlmIChudW0gPT0gMCkgewo+ICsJ CWVyciA9IC1FTk9FTlQ7Cj4gKwkJZ290byBlcnJvcl9uZXdfdmlydHF1ZXVlOwo+ICsJfQo+ICsK PiArCS8qIENyZWF0ZSB0aGUgdnJpbmcgKi8KPiArCWFsaWduID0gb3BzLT5nZXRfdnFfYWxpZ24o bWRldik7Cj4gKwl2cSA9IHZyaW5nX2NyZWF0ZV92aXJ0cXVldWUoaW5kZXgsIG51bSwgYWxpZ24s IHZkZXYsCj4gKwkJCQkgICAgdHJ1ZSwgdHJ1ZSwgY3R4LAo+ICsJCQkJICAgIHZpcnRpb19tZGV2 X25vdGlmeSwgY2FsbGJhY2ssIG5hbWUpOwo+ICsJaWYgKCF2cSkgewo+ICsJCWVyciA9IC1FTk9N RU07Cj4gKwkJZ290byBlcnJvcl9uZXdfdmlydHF1ZXVlOwo+ICsJfQo+ICsKPiArCS8qIFNldHVw IHZpcnRxdWV1ZSBjYWxsYmFjayAqLwo+ICsJY2IuY2FsbGJhY2sgPSB2aXJ0aW9fbWRldl92aXJ0 cXVldWVfY2I7Cj4gKwljYi5wcml2YXRlID0gaW5mbzsKPiArCW9wcy0+c2V0X3ZxX2NiKG1kZXYs IGluZGV4LCAmY2IpOwo+ICsJb3BzLT5zZXRfdnFfbnVtKG1kZXYsIGluZGV4LCB2aXJ0cXVldWVf Z2V0X3ZyaW5nX3NpemUodnEpKTsKPiArCj4gKwlkZXNjX2FkZHIgPSB2aXJ0cXVldWVfZ2V0X2Rl c2NfYWRkcih2cSk7Cj4gKwlkcml2ZXJfYWRkciA9IHZpcnRxdWV1ZV9nZXRfYXZhaWxfYWRkcih2 cSk7Cj4gKwlkZXZpY2VfYWRkciA9IHZpcnRxdWV1ZV9nZXRfdXNlZF9hZGRyKHZxKTsKPiArCj4g KwlpZiAob3BzLT5zZXRfdnFfYWRkcmVzcyhtZGV2LCBpbmRleCwKPiArCQkJCWRlc2NfYWRkciwg ZHJpdmVyX2FkZHIsCj4gKwkJCQlkZXZpY2VfYWRkcikpIHsKPiArCQllcnIgPSAtRUlOVkFMOwo+ ICsJCWdvdG8gZXJyX3ZxOwo+ICsJfQo+ICsKPiArCW9wcy0+c2V0X3ZxX3JlYWR5KG1kZXYsIGlu ZGV4LCAxKTsKPiArCj4gKwl2cS0+cHJpdiA9IGluZm87Cj4gKwlpbmZvLT52cSA9IHZxOwo+ICsK PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKPiArCWxpc3RfYWRk KCZpbmZvLT5ub2RlLCAmdm1fZGV2LT52aXJ0cXVldWVzKTsKPiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXJldHVybiB2cTsKPiArCj4gK2Vy cl92cToKPiArCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOwo+ICtlcnJvcl9uZXdfdmlydHF1ZXVl Ogo+ICsJb3BzLT5zZXRfdnFfcmVhZHkobWRldiwgaW5kZXgsIDApOwo+ICsJV0FSTl9PTihvcHMt PmdldF92cV9yZWFkeShtZGV2LCBpbmRleCkpOwo+ICsJa2ZyZWUoaW5mbyk7Cj4gKwlyZXR1cm4g RVJSX1BUUihlcnIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9kZWxfdnEo c3RydWN0IHZpcnRxdWV1ZSAqdnEpCj4gK3sKPiArCXN0cnVjdCB2aXJ0aW9fbWRldl9kZXZpY2Ug KnZtX2RldiA9IHRvX3ZpcnRpb19tZGV2X2RldmljZSh2cS0+dmRldik7Cj4gKwlzdHJ1Y3QgbWRl dl9kZXZpY2UgKm1kZXYgPSB2bV9kZXYtPm1kZXY7Cj4gKwljb25zdCBzdHJ1Y3QgbWRldl92aXJ0 aW9fb3BzICpvcHMgPSBtZGV2X3ZpcnRpb19nZXRfb3BzKG1kZXYpOwo+ICsJc3RydWN0IHZpcnRp b19tZGV2X3ZxX2luZm8gKmluZm8gPSB2cS0+cHJpdjsKPiArCXVuc2lnbmVkIGludCBpbmRleCA9 IHZxLT5pbmRleDsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2ly cXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOwo+ICsJbGlzdF9kZWwoJmluZm8tPm5vZGUpOwo+ ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm1fZGV2LT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJ LyogU2VsZWN0IGFuZCBkZWFjdGl2YXRlIHRoZSBxdWV1ZSAqLwo+ICsJb3BzLT5zZXRfdnFfcmVh ZHkobWRldiwgaW5kZXgsIDApOwo+ICsJV0FSTl9PTihvcHMtPmdldF92cV9yZWFkeShtZGV2LCBp bmRleCkpOwo+ICsKPiArCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOwo+ICsKPiArCWtmcmVlKGlu Zm8pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9kZWxfdnFzKHN0cnVjdCB2 aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cSwgKm47Cj4g Kwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZxLCBuLCAmdmRldi0+dnFzLCBsaXN0KQo+ ICsJCXZpcnRpb19tZGV2X2RlbF92cSh2cSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdmlydGlv X21kZXZfZmluZF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG52cXMs Cj4gKwkJCQlzdHJ1Y3QgdmlydHF1ZXVlICp2cXNbXSwKPiArCQkJCXZxX2NhbGxiYWNrX3QgKmNh bGxiYWNrc1tdLAo+ICsJCQkJY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10sCj4gKwkJCQljb25z dCBib29sICpjdHgsCj4gKwkJCQlzdHJ1Y3QgaXJxX2FmZmluaXR5ICpkZXNjKQo+ICt7Cj4gKwlz dHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2Uo dmRldik7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsK PiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9v cHMobWRldik7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfY2FsbGJhY2sgY2I7Cj4gKwlpbnQgaSwg ZXJyLCBxdWV1ZV9pZHggPSAwOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudnFzOyArK2kpIHsK PiArCQlpZiAoIW5hbWVzW2ldKSB7Cj4gKwkJCXZxc1tpXSA9IE5VTEw7Cj4gKwkJCWNvbnRpbnVl Owo+ICsJCX0KPiArCj4gKwkJdnFzW2ldID0gdmlydGlvX21kZXZfc2V0dXBfdnEodmRldiwgcXVl dWVfaWR4KyssCj4gKwkJCQkJICAgICAgY2FsbGJhY2tzW2ldLCBuYW1lc1tpXSwgY3R4ID8KPiAr CQkJCQkgICAgICBjdHhbaV0gOiBmYWxzZSk7Cj4gKwkJaWYgKElTX0VSUih2cXNbaV0pKSB7Cj4g KwkJCWVyciA9IFBUUl9FUlIodnFzW2ldKTsKPiArCQkJZ290byBlcnJfc2V0dXBfdnE7Cj4gKwkJ fQo+ICsJfQo+ICsKPiArCWNiLmNhbGxiYWNrID0gdmlydGlvX21kZXZfY29uZmlnX2NiOwo+ICsJ Y2IucHJpdmF0ZSA9IHZtX2RldjsKPiArCW9wcy0+c2V0X2NvbmZpZ19jYihtZGV2LCAmY2IpOwo+ ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX3NldHVwX3ZxOgo+ICsJdmlydGlvX21kZXZfZGVs X3Zxcyh2ZGV2KTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4gK3N0YXRpYyB1NjQgdmlydGlv X21kZXZfZ2V0X2ZlYXR1cmVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0 cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4g Kwo+ICsJcmV0dXJuIG9wcy0+Z2V0X2ZlYXR1cmVzKG1kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHZpcnRpb19tZGV2X2ZpbmFsaXplX2ZlYXR1cmVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2 ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2 KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dl dF9vcHMobWRldik7Cj4gKwo+ICsJLyogR2l2ZSB2aXJ0aW9fcmluZyBhIGNoYW5jZSB0byBhY2Nl cHQgZmVhdHVyZXMuICovCj4gKwl2cmluZ190cmFuc3BvcnRfZmVhdHVyZXModmRldik7Cj4gKwo+ ICsJcmV0dXJuIG9wcy0+c2V0X2ZlYXR1cmVzKG1kZXYsIHZkZXYtPmZlYXR1cmVzKTsKPiArfQo+ ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKnZpcnRpb19tZGV2X2J1c19uYW1lKHN0cnVjdCB2aXJ0 aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9k ZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2UodmRldik7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2Ug Km1kZXYgPSB2bV9kZXYtPm1kZXY7Cj4gKwo+ICsJcmV0dXJuIGRldl9uYW1lKG1kZXZfZGV2KG1k ZXYpKTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCB2aXJ0aW9fY29uZmlnX29wcyB2 aXJ0aW9fbWRldl9jb25maWdfb3BzID0gewo+ICsJLmdldAkJPSB2aXJ0aW9fbWRldl9nZXQsCj4g Kwkuc2V0CQk9IHZpcnRpb19tZGV2X3NldCwKPiArCS5nZW5lcmF0aW9uCT0gdmlydGlvX21kZXZf Z2VuZXJhdGlvbiwKPiArCS5nZXRfc3RhdHVzCT0gdmlydGlvX21kZXZfZ2V0X3N0YXR1cywKPiAr CS5zZXRfc3RhdHVzCT0gdmlydGlvX21kZXZfc2V0X3N0YXR1cywKPiArCS5yZXNldAkJPSB2aXJ0 aW9fbWRldl9yZXNldCwKPiArCS5maW5kX3Zxcwk9IHZpcnRpb19tZGV2X2ZpbmRfdnFzLAo+ICsJ LmRlbF92cXMJPSB2aXJ0aW9fbWRldl9kZWxfdnFzLAo+ICsJLmdldF9mZWF0dXJlcwk9IHZpcnRp b19tZGV2X2dldF9mZWF0dXJlcywKPiArCS5maW5hbGl6ZV9mZWF0dXJlcyA9IHZpcnRpb19tZGV2 X2ZpbmFsaXplX2ZlYXR1cmVzLAo+ICsJLmJ1c19uYW1lCT0gdmlydGlvX21kZXZfYnVzX25hbWUs Cj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9yZWxlYXNlX2RldihzdHJ1Y3Qg ZGV2aWNlICpfZCkKPiArewo+ICsJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPQo+ICsJICAg ICAgIGNvbnRhaW5lcl9vZihfZCwgc3RydWN0IHZpcnRpb19kZXZpY2UsIGRldik7Cj4gKwlzdHJ1 Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPQo+ICsJICAgICAgIGNvbnRhaW5lcl9vZih2 ZGV2LCBzdHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlLCB2ZGV2KTsKPiArCXN0cnVjdCBtZGV2X2Rl dmljZSAqbWRldiA9IHZtX2Rldi0+bWRldjsKPiArCj4gKwlkZXZtX2tmcmVlKG1kZXZfZGV2KG1k ZXYpLCB2bV9kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHZpcnRpb19tZGV2X3Byb2JlKHN0 cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gbWRl dl92aXJ0aW9fZnJvbV9kZXYoZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMg Km9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZf ZGV2aWNlICp2bV9kZXY7Cj4gKwlpbnQgcmM7Cj4gKwo+ICsJdm1fZGV2ID0gZGV2bV9remFsbG9j KGRldiwgc2l6ZW9mKCp2bV9kZXYpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdm1fZGV2KQo+ICsJ CXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXZtX2Rldi0+dmRldi5kZXYucGFyZW50ID0gZGV2Owo+ ICsJdm1fZGV2LT52ZGV2LmRldi5yZWxlYXNlID0gdmlydGlvX21kZXZfcmVsZWFzZV9kZXY7Cj4g Kwl2bV9kZXYtPnZkZXYuY29uZmlnID0gJnZpcnRpb19tZGV2X2NvbmZpZ19vcHM7Cj4gKwl2bV9k ZXYtPm1kZXYgPSBtZGV2Owo+ICsJSU5JVF9MSVNUX0hFQUQoJnZtX2Rldi0+dmlydHF1ZXVlcyk7 Cj4gKwlzcGluX2xvY2tfaW5pdCgmdm1fZGV2LT5sb2NrKTsKPiArCj4gKwl2bV9kZXYtPnZkZXYu aWQuZGV2aWNlID0gb3BzLT5nZXRfZGV2aWNlX2lkKG1kZXYpOwo+ICsJaWYgKHZtX2Rldi0+dmRl di5pZC5kZXZpY2UgPT0gMCkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwl2bV9kZXYtPnZk ZXYuaWQudmVuZG9yID0gb3BzLT5nZXRfdmVuZG9yX2lkKG1kZXYpOwo+ICsJcmMgPSByZWdpc3Rl cl92aXJ0aW9fZGV2aWNlKCZ2bV9kZXYtPnZkZXYpOwo+ICsJaWYgKHJjKQo+ICsJCXB1dF9kZXZp Y2UoZGV2KTsKPiArCWVsc2UKPiArCQlkZXZfc2V0X2RydmRhdGEoZGV2LCB2bV9kZXYpOwo+ICsK PiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX21kZXZfcmVtb3Zl KHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHZpcnRpb19tZGV2X2RldmljZSAq dm1fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwo+ICsJdW5yZWdpc3Rlcl92aXJ0aW9f ZGV2aWNlKCZ2bV9kZXYtPnZkZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG1k ZXZfdmlydGlvX2NsYXNzX2lkIHZpcnRpb19pZF90YWJsZVtdID0gewo+ICsJeyBNREVWX1ZJUlRJ T19DTEFTU19JRF9WSVJUSU8gfSwKPiArCXsgMCB9LAo+ICt9Owo+ICsKCkRvIHdlIHN0aWxsIG5l ZWQgdGhlIGNsYXNzIElEPyBJdCdzIGEgdmlydGlvIG1kZXYgYnVzLApkbyB3ZSBuZWVkIGEgdmly dGlvIGNsYXNzIGFzIHdlbGw/Cgo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG1kZXZfdmlydGlvLCB2 aXJ0aW9faWRfdGFibGUpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBtZGV2X3ZpcnRpb19kcml2ZXIg dmlydGlvX21kZXZfZHJpdmVyID0gewo+ICsJLmRydiA9IHsKPiArCQkubmFtZQk9ICJ2aXJ0aW9f bWRldiIsCj4gKwkJLnByb2JlCT0gdmlydGlvX21kZXZfcHJvYmUsCj4gKwkJLnJlbW92ZSA9IHZp cnRpb19tZGV2X3JlbW92ZSwKPiArCX0sCj4gKwkuaWRfdGFibGUgPSB2aXJ0aW9faWRfdGFibGUs Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCB2aXJ0aW9fbWRldl9pbml0KHZvaWQpCj4g K3sKPiArCXJldHVybiBtZGV2X3JlZ2lzdGVyX2RyaXZlcigmdmlydGlvX21kZXZfZHJpdmVyLmRy diwgVEhJU19NT0RVTEUsCj4gKwkJCQkgICAgJm1kZXZfdmlydGlvX2J1c190eXBlKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19tZGV2X2V4aXQodm9pZCkKPiArewo+ICsJ bWRldl91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGlvX21kZXZfZHJpdmVyLmRydik7Cj4gK30KPiAr Cj4gK21vZHVsZV9pbml0KHZpcnRpb19tZGV2X2luaXQpCj4gK21vZHVsZV9leGl0KHZpcnRpb19t ZGV2X2V4aXQpCj4gKwo+ICtNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7Cj4gK01PRFVM RV9MSUNFTlNFKCJHUEwgdjIiKTsKPiArTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKPiAr TU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s aW51eC9tZGV2X3ZpcnRpby5oIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZpcnRpby5oCj4gaW5kZXgg ZWYyZGJiNmMzODNhLi41Zjc1ZjNjZjU5ZTEgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9t ZGV2X3ZpcnRpby5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZpcnRpby5oCj4gQEAgLTI1 LDYgKzI1LDExIEBAIHN0cnVjdCB2aXJ0aW9fbWRldl9jYWxsYmFjayB7Cj4gIAl2b2lkICpwcml2 YXRlOwo+ICB9Owo+ICAKPiArZW51bSB7Cj4gKwlNREVWX1ZJUlRJT19DTEFTU19JRF9WSVJUSU8g PSAxLAo+ICsJLyogTmV3IGVudHJpZXMgbXVzdCBiZSBhZGRlZCBoZXJlICovCj4gK307Cj4gKwo+ ICAvKioKPiAgICogc3RydWN0IG1kZXZfdmlydGlvX2RldmljZV9vcHMgLSBTdHJ1Y3R1cmUgdG8g YmUgcmVnaXN0ZXJlZCBmb3IgZWFjaAo+ICAgKiBtZGV2IGRldmljZSB0byByZWdpc3RlciB0aGUg ZGV2aWNlIGZvciB2aXJ0aW8vdmhvc3QgZHJpdmVycy4KPiAtLSAKPiAyLjE5LjEKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5n IGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.7 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 93835C432C3 for ; Mon, 18 Nov 2019 10:44:46 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 742012067D for ; Mon, 18 Nov 2019 10:44:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 742012067D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E24A36E456; Mon, 18 Nov 2019 10:44:44 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id C43206E436 for ; Mon, 18 Nov 2019 10:44:42 +0000 (UTC) Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-169-qvBNkHMSNbm9xCgwCPoVog-1; Mon, 18 Nov 2019 05:44:40 -0500 Received: by mail-qt1-f199.google.com with SMTP id v23so11962285qth.20 for ; Mon, 18 Nov 2019 02:44:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=CxprIgJpUU3jeQV00/9UkqkMAmaR0THasL1suxqMVK8=; b=FQYidR9D198jKyrf0Enh8xksiJZvcXNIjQYx65IjDAITR7XhbxBAxv2AXfB3bdQBR+ RsklV4JsSSbOmNp2FB7AC1svaT9NhlPz3BlVYFL8REux6jMTyc7oL9aBBHnh5Pnx5nYO P2m3x3bPhQqV4Qhh7/BKIhdfBdhpVy/b1EvZtnJ3Yz17S3iQfHmcBh747wHWQYN4+UgO FaSwu68+yYobqK9LoK1LKlR4vcF9cHd282sWv9U+fVbX6keRfRnLe6lAHPRb/pIiz2Ug R5kpSGM32HAWmssKV2KAOcu3MgwAIKR3Q+LmE4RhVUfibS8nHfAg/8lWjqyIu5SsCs+A 3Rrw== X-Gm-Message-State: APjAAAU3GGAv8UgxRP/ERHjWsduxCZRgt2QzJyVZo3eh+VD8fSIL0fde NhaolckuLCsSjzdmJo+ESTF2H1Dp9mIfrpI9lrKsZp0A5q75VPJ84FH67YEdBsjgkbHNUkiD4dY 0VOSwb2BxgyG9PezF99kwvFY+cirU X-Received: by 2002:a0c:802f:: with SMTP id 44mr3314585qva.116.1574073879717; Mon, 18 Nov 2019 02:44:39 -0800 (PST) X-Google-Smtp-Source: APXvYqzR171/RwNU/G+Jin4zQP77S8Rxmutj1BRTygyk3DLP3YBhHrtlrH0hO8EFJL/8dj4mQFGbiA== X-Received: by 2002:a0c:802f:: with SMTP id 44mr3314522qva.116.1574073879233; Mon, 18 Nov 2019 02:44:39 -0800 (PST) Received: from redhat.com (bzq-79-176-6-42.red.bezeqint.net. [79.176.6.42]) by smtp.gmail.com with ESMTPSA id x39sm10429813qth.92.2019.11.18.02.44.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Nov 2019 02:44:38 -0800 (PST) Date: Mon, 18 Nov 2019 05:44:25 -0500 From: "Michael S. Tsirkin" To: Jason Wang Message-ID: <20191118054339-mutt-send-email-mst@kernel.org> References: <20191118061703.8669-1-jasowang@redhat.com> <20191118061703.8669-6-jasowang@redhat.com> MIME-Version: 1.0 In-Reply-To: <20191118061703.8669-6-jasowang@redhat.com> X-MC-Unique: qvBNkHMSNbm9xCgwCPoVog-1 X-Mimecast-Spam-Score: 0 Content-Disposition: inline X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1574073881; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JnVZIEJ4yoxZxjAnvF8WPtLqyuvkPdbvQZxdbW+Uljo=; b=SK6D/lk7QTg5NWi9j7dd5XKaRW+Q8JXim+2Y+59LXYHy8V5TK6j7XciV/+NWoT8NVRhG/y s5ju3skj3a7eBf/Ms7PvbTtwenzaxADdN+4jY20pyv4nlMb+S3j8jtQEIL+PdnIb+VPu23 E+iXAeb8fSg8AEAzZCRUD6VUxrZ7fr0= Subject: Re: [Intel-gfx] [PATCH V12 5/6] virtio: introduce a mdev based transport X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: rdunlap@infradead.org, christophe.de.dinechin@gmail.com, kvm@vger.kernel.org, hch@infradead.org, airlied@linux.ie, heiko.carstens@de.ibm.com, dri-devel@lists.freedesktop.org, virtualization@lists.linux-foundation.org, kwankhede@nvidia.com, jgg@mellanox.com, rob.miller@broadcom.com, linux-s390@vger.kernel.org, sebott@linux.ibm.com, lulu@redhat.com, eperezma@redhat.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, haotian.wang@sifive.com, cunming.liang@intel.com, farman@linux.ibm.com, parav@mellanox.com, gor@linux.ibm.com, intel-gfx@lists.freedesktop.org, xiao.w.wang@intel.com, freude@linux.ibm.com, stefanha@redhat.com, zhihong.wang@intel.com, intel-gvt-dev@lists.freedesktop.org, akrowiak@linux.ibm.com, oberpar@linux.ibm.com, tiwei.bie@intel.com, netdev@vger.kernel.org, cohuck@redhat.com, linux-kernel@vger.kernel.org, maxime.coquelin@redhat.com, gregkh@linuxfoundation.org, lingshan.zhu@intel.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Message-ID: <20191118104425.PG2TYzeR4UqXFr4d3mi-hdkCQ1Z3L0E7Ybi00GEAERI@z> T24gTW9uLCBOb3YgMTgsIDIwMTkgYXQgMDI6MTc6MDJQTSArMDgwMCwgSmFzb24gV2FuZyB3cm90 ZToKPiBUaGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgbWRldiB0cmFuc3BvcnQgZm9yIHZpcnRp by4gVGhpcyBpcyB1c2VkIHRvCj4gdXNlIGtlcm5lbCB2aXJ0aW8gZHJpdmVyIHRvIGRyaXZlIHRo ZSBtZWRpYXRlZCBkZXZpY2UgdGhhdCBpcyBjYXBhYmxlCj4gb2YgcG9wdWxhdGluZyB2aXJ0cXVl dWUgZGlyZWN0bHkuCj4gCj4gQSBuZXcgdmlydGlvLW1kZXYgZHJpdmVyIHdpbGwgYmUgcmVnaXN0 ZXJlZCB0byB0aGUgbWRldiBidXMsIHdoZW4gYQo+IG5ldyB2aXJ0aW8tbWRldiBkZXZpY2UgaXMg cHJvYmVkLCBpdCB3aWxsIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugd2l0aAo+IG1kZXYgYmFzZWQgY29u ZmlnIG9wcy4gVGhpcyBtZWFucyBpdCBpcyBhIHNvZnR3YXJlIHRyYW5zcG9ydCBiZXR3ZWVuCj4g bWRldiBkcml2ZXIgYW5kIG1kZXYgZGV2aWNlLiBUaGUgdHJhbnNwb3J0IHdhcyBpbXBsZW1lbnRl ZCB0aHJvdWdoCj4gYnVzX29wcyBvZiBtZGV2IHBhcmVudC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBK YXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRoYXQuY29tPgo+IC0tLQo+ICBkcml2ZXJzL3ZpcnRpby9L Y29uZmlnICAgICAgIHwgIDEzICsrCj4gIGRyaXZlcnMvdmlydGlvL01ha2VmaWxlICAgICAgfCAg IDEgKwo+ICBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fbWRldi5jIHwgNDA5ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCj4gIGluY2x1ZGUvbGludXgvbWRldl92aXJ0aW8uaCAgfCAg IDUgKwo+ICA0IGZpbGVzIGNoYW5nZWQsIDQyOCBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fbWRldi5jCj4gCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdmlydGlvL0tjb25maWcgYi9kcml2ZXJzL3ZpcnRpby9LY29uZmlnCj4gaW5kZXggMDc4 NjE1Y2YyYWZjLi42YTg5YjNkZTk3ZDMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy92aXJ0aW8vS2Nv bmZpZwo+ICsrKyBiL2RyaXZlcnMvdmlydGlvL0tjb25maWcKPiBAQCAtNDMsNiArNDMsMTkgQEAg Y29uZmlnIFZJUlRJT19QQ0lfTEVHQUNZCj4gIAo+ICAJICBJZiB1bnN1cmUsIHNheSBZLgo+ICAK PiArY29uZmlnIFZJUlRJT19NREVWCj4gKwl0cmlzdGF0ZSAiTURFViBkcml2ZXIgZm9yIHZpcnRp byBkZXZpY2VzIgo+ICsJZGVwZW5kcyBvbiBNREVWX1ZJUlRJTwo+ICsJZGVmYXVsdCBuCj4gKwlo ZWxwCj4gKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHZpcnRpbyBiYXNlZCBw YXJhdmlydHVhbAo+ICsJICBkZXZpY2UgZHJpdmVyIG92ZXIgTURFViBidXMuIEZvciB0aGlzIHRv IGJlIHVzZWZ1bCwgeW91IG5lZWQKPiArCSAgYW4gYXBwcm9wcmlhdGUgdmlydGlvIG1kZXYgZGV2 aWNlIGltcGxlbWVudGF0aW9uIHRoYXQKPiArCSAgb3BlcmF0ZXMgb24gYSBwaHlzaWNhbCBkZXZp Y2UgdG8gYWxsb3cgdGhlIGRhdGFwYXRoIG9mIHZpcnRpbwo+ICsJICB0byBiZSBvZmZsb2FkZWQg dG8gaGFyZHdhcmUuCj4gKwo+ICsJICBJZiB1bnN1cmUsIHNheSBNLgo+ICsKPiAgY29uZmlnIFZJ UlRJT19QTUVNCj4gIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdmlydGlvIHBtZW0gZHJpdmVyIgo+ ICAJZGVwZW5kcyBvbiBWSVJUSU8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vTWFrZWZp bGUgYi9kcml2ZXJzL3ZpcnRpby9NYWtlZmlsZQo+IGluZGV4IDNhMmI1YzVkY2Y0Ni4uZjI5OTdi NmM4MTJmIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdmlydGlvL01ha2VmaWxlCj4gKysrIGIvZHJp dmVycy92aXJ0aW8vTWFrZWZpbGUKPiBAQCAtNiwzICs2LDQgQEAgdmlydGlvX3BjaS15IDo9IHZp cnRpb19wY2lfbW9kZXJuLm8gdmlydGlvX3BjaV9jb21tb24ubwo+ICB2aXJ0aW9fcGNpLSQoQ09O RklHX1ZJUlRJT19QQ0lfTEVHQUNZKSArPSB2aXJ0aW9fcGNpX2xlZ2FjeS5vCj4gIG9iai0kKENP TkZJR19WSVJUSU9fQkFMTE9PTikgKz0gdmlydGlvX2JhbGxvb24ubwo+ICBvYmotJChDT05GSUdf VklSVElPX0lOUFVUKSArPSB2aXJ0aW9faW5wdXQubwo+ICtvYmotJChDT05GSUdfVklSVElPX01E RVYpICs9IHZpcnRpb19tZGV2Lm8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlv X21kZXYuYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tZGV2LmMKPiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uN2ZkYjQyZjA1NWRmCj4gLS0tIC9kZXYvbnVsbAo+ ICsrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tZGV2LmMKPiBAQCAtMCwwICsxLDQwOSBAQAo+ ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIFZJ UlRJTyBiYXNlZCBkcml2ZXIgZm9yIE1lZGlhdGVkIGRldmljZQo+ICsgKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTksIFJlZCBIYXQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCj4gKyAqICAgICBBdXRo b3I6IEphc29uIFdhbmcgPGphc293YW5nQHJlZGhhdC5jb20+Cj4gKyAqCj4gKyAqLwo+ICsKPiAr I2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsj aW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiAr I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L3ZpcnRpby5oPgo+ICsjaW5jbHVkZSA8bGludXgvbWRldl92aXJ0aW8uaD4K PiArI2luY2x1ZGUgPGxpbnV4L3ZpcnRpb19jb25maWcuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3Zp cnRpb19yaW5nLmg+Cj4gKwo+ICsjZGVmaW5lIERSSVZFUl9WRVJTSU9OICAiMC4xIgo+ICsjZGVm aW5lIERSSVZFUl9BVVRIT1IgICAiUmVkIEhhdCBDb3Jwb3JhdGlvbiIKPiArI2RlZmluZSBEUklW RVJfREVTQyAgICAgIlZJUlRJTyBiYXNlZCBkcml2ZXIgZm9yIE1lZGlhdGVkIGRldmljZSIKPiAr Cj4gKyNkZWZpbmUgdG9fdmlydGlvX21kZXZfZGV2aWNlKGRldikgXAo+ICsJY29udGFpbmVyX29m KGRldiwgc3RydWN0IHZpcnRpb19tZGV2X2RldmljZSwgdmRldikKPiArCj4gK3N0cnVjdCB2aXJ0 aW9fbWRldl9kZXZpY2Ugewo+ICsJc3RydWN0IHZpcnRpb19kZXZpY2UgdmRldjsKPiArCXN0cnVj dCBtZGV2X2RldmljZSAqbWRldjsKPiArCXU2NCBmZWF0dXJlczsKPiArCj4gKwkvKiBUaGUgbG9j ayB0byBwcm90ZWN0IHZpcnRxdWV1ZSBsaXN0ICovCj4gKwlzcGlubG9ja190IGxvY2s7Cj4gKwkv KiBMaXN0IG9mIHZpcnRpb19tZGV2X3ZxX2luZm8gKi8KPiArCXN0cnVjdCBsaXN0X2hlYWQgdmly dHF1ZXVlczsKPiArfTsKPiArCj4gK3N0cnVjdCB2aXJ0aW9fbWRldl92cV9pbmZvIHsKPiArCS8q IHRoZSBhY3R1YWwgdmlydHF1ZXVlICovCj4gKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKPiArCj4g KwkvKiB0aGUgbGlzdCBub2RlIGZvciB0aGUgdmlydHF1ZXVlcyBsaXN0ICovCj4gKwlzdHJ1Y3Qg bGlzdF9oZWFkIG5vZGU7Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IG1kZXZfZGV2aWNlICp2 bV9nZXRfbWRldihzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKPiArewo+ICsJc3RydWN0IHZp cnRpb19tZGV2X2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21kZXZfZGV2aWNlKHZkZXYpOwo+ ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1fZGV2LT5tZGV2Owo+ICsKPiArCXJldHVy biBtZGV2Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9nZXQoc3RydWN0IHZp cnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKPiArCQkJICAgIHZvaWQgKmJ1Ziwg dW5zaWduZWQgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRf bWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZf dmlydGlvX2dldF9vcHMobWRldik7Cj4gKwo+ICsJb3BzLT5nZXRfY29uZmlnKG1kZXYsIG9mZnNl dCwgYnVmLCBsZW4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9zZXQoc3Ry dWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG9mZnNldCwKPiArCQkJICAgIGNvbnN0 IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1k ZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMg Km9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwo+ICsJb3BzLT5zZXRfY29uZmln KG1kZXYsIG9mZnNldCwgYnVmLCBsZW4pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdTMyIHZpcnRpb19t ZGV2X2dlbmVyYXRpb24oc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCj4gK3sKPiArCXN0cnVj dCBtZGV2X2RldmljZSAqbWRldiA9IHZtX2dldF9tZGV2KHZkZXYpOwo+ICsJY29uc3Qgc3RydWN0 IG1kZXZfdmlydGlvX29wcyAqb3BzID0gbWRldl92aXJ0aW9fZ2V0X29wcyhtZGV2KTsKPiArCj4g Kwo+ICsJaWYgKG9wcy0+Z2V0X2dlbmVyYXRpb24pCj4gKwkJcmV0dXJuIG9wcy0+Z2V0X2dlbmVy YXRpb24obWRldik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1OCB2aXJ0 aW9fbWRldl9nZXRfc3RhdHVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0 cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4g Kwo+ICsJcmV0dXJuIG9wcy0+Z2V0X3N0YXR1cyhtZGV2KTsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgdmlydGlvX21kZXZfc2V0X3N0YXR1cyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdTgg c3RhdHVzKQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2 ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlv X2dldF9vcHMobWRldik7Cj4gKwo+ICsJcmV0dXJuIG9wcy0+c2V0X3N0YXR1cyhtZGV2LCBzdGF0 dXMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9yZXNldChzdHJ1Y3Qgdmly dGlvX2RldmljZSAqdmRldikKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1f Z2V0X21kZXYodmRldik7Cj4gKwljb25zdCBzdHJ1Y3QgbWRldl92aXJ0aW9fb3BzICpvcHMgPSBt ZGV2X3ZpcnRpb19nZXRfb3BzKG1kZXYpOwo+ICsKPiArCXJldHVybiBvcHMtPnNldF9zdGF0dXMo bWRldiwgMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIHZpcnRpb19tZGV2X25vdGlmeShzdHJ1 Y3QgdmlydHF1ZXVlICp2cSkKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gdm1f Z2V0X21kZXYodnEtPnZkZXYpOwo+ICsJY29uc3Qgc3RydWN0IG1kZXZfdmlydGlvX29wcyAqb3Bz ID0gbWRldl92aXJ0aW9fZ2V0X29wcyhtZGV2KTsKPiArCj4gKwlvcHMtPmtpY2tfdnEobWRldiwg dnEtPmluZGV4KTsKPiArCj4gKwlyZXR1cm4gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IHZpcnRpb19tZGV2X2NvbmZpZ19jYih2b2lkICpwcml2YXRlKQo+ICt7Cj4gKwlzdHJ1 Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPSBwcml2YXRlOwo+ICsKPiArCXZpcnRpb19j b25maWdfY2hhbmdlZCgmdm1fZGV2LT52ZGV2KTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7 Cj4gK30KPiArCj4gK3N0YXRpYyBpcnFyZXR1cm5fdCB2aXJ0aW9fbWRldl92aXJ0cXVldWVfY2Io dm9pZCAqcHJpdmF0ZSkKPiArewo+ICsJc3RydWN0IHZpcnRpb19tZGV2X3ZxX2luZm8gKmluZm8g PSBwcml2YXRlOwo+ICsKPiArCXJldHVybiB2cmluZ19pbnRlcnJ1cHQoMCwgaW5mby0+dnEpOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHZpcnRxdWV1ZSAqCj4gK3ZpcnRpb19tZGV2X3NldHVw X3ZxKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsCj4gKwkJ ICAgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCB2aXJ0cXVldWUgKnZxKSwKPiArCQkgICAgIGNv bnN0IGNoYXIgKm5hbWUsIGJvb2wgY3R4KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfZGV2 aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2UodmRldik7Cj4gKwlzdHJ1Y3QgbWRl dl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2 X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwlzdHJ1Y3Qg dmlydGlvX21kZXZfdnFfaW5mbyAqaW5mbzsKPiArCXN0cnVjdCB2aXJ0aW9fbWRldl9jYWxsYmFj ayBjYjsKPiArCXN0cnVjdCB2aXJ0cXVldWUgKnZxOwo+ICsJdTY0IGRlc2NfYWRkciwgZHJpdmVy X2FkZHIsIGRldmljZV9hZGRyOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiArCXUzMiBhbGln biwgbnVtOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoIW5hbWUpCj4gKwkJcmV0dXJuIE5VTEw7 Cj4gKwo+ICsJLyogUXVldWUgc2hvdWxkbid0IGFscmVhZHkgYmUgc2V0IHVwLiAqLwo+ICsJaWYg KG9wcy0+Z2V0X3ZxX3JlYWR5KG1kZXYsIGluZGV4KSkKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5P RU5UKTsKPiArCj4gKwkvKiBBbGxvY2F0ZSBhbmQgZmlsbCBvdXQgb3VyIGFjdGl2ZSBxdWV1ZSBk ZXNjcmlwdGlvbiAqLwo+ICsJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5F TCk7Cj4gKwlpZiAoIWluZm8pCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4gKwo+ICsJ bnVtID0gb3BzLT5nZXRfdnFfbnVtX21heChtZGV2KTsKPiArCWlmIChudW0gPT0gMCkgewo+ICsJ CWVyciA9IC1FTk9FTlQ7Cj4gKwkJZ290byBlcnJvcl9uZXdfdmlydHF1ZXVlOwo+ICsJfQo+ICsK PiArCS8qIENyZWF0ZSB0aGUgdnJpbmcgKi8KPiArCWFsaWduID0gb3BzLT5nZXRfdnFfYWxpZ24o bWRldik7Cj4gKwl2cSA9IHZyaW5nX2NyZWF0ZV92aXJ0cXVldWUoaW5kZXgsIG51bSwgYWxpZ24s IHZkZXYsCj4gKwkJCQkgICAgdHJ1ZSwgdHJ1ZSwgY3R4LAo+ICsJCQkJICAgIHZpcnRpb19tZGV2 X25vdGlmeSwgY2FsbGJhY2ssIG5hbWUpOwo+ICsJaWYgKCF2cSkgewo+ICsJCWVyciA9IC1FTk9N RU07Cj4gKwkJZ290byBlcnJvcl9uZXdfdmlydHF1ZXVlOwo+ICsJfQo+ICsKPiArCS8qIFNldHVw IHZpcnRxdWV1ZSBjYWxsYmFjayAqLwo+ICsJY2IuY2FsbGJhY2sgPSB2aXJ0aW9fbWRldl92aXJ0 cXVldWVfY2I7Cj4gKwljYi5wcml2YXRlID0gaW5mbzsKPiArCW9wcy0+c2V0X3ZxX2NiKG1kZXYs IGluZGV4LCAmY2IpOwo+ICsJb3BzLT5zZXRfdnFfbnVtKG1kZXYsIGluZGV4LCB2aXJ0cXVldWVf Z2V0X3ZyaW5nX3NpemUodnEpKTsKPiArCj4gKwlkZXNjX2FkZHIgPSB2aXJ0cXVldWVfZ2V0X2Rl c2NfYWRkcih2cSk7Cj4gKwlkcml2ZXJfYWRkciA9IHZpcnRxdWV1ZV9nZXRfYXZhaWxfYWRkcih2 cSk7Cj4gKwlkZXZpY2VfYWRkciA9IHZpcnRxdWV1ZV9nZXRfdXNlZF9hZGRyKHZxKTsKPiArCj4g KwlpZiAob3BzLT5zZXRfdnFfYWRkcmVzcyhtZGV2LCBpbmRleCwKPiArCQkJCWRlc2NfYWRkciwg ZHJpdmVyX2FkZHIsCj4gKwkJCQlkZXZpY2VfYWRkcikpIHsKPiArCQllcnIgPSAtRUlOVkFMOwo+ ICsJCWdvdG8gZXJyX3ZxOwo+ICsJfQo+ICsKPiArCW9wcy0+c2V0X3ZxX3JlYWR5KG1kZXYsIGlu ZGV4LCAxKTsKPiArCj4gKwl2cS0+cHJpdiA9IGluZm87Cj4gKwlpbmZvLT52cSA9IHZxOwo+ICsK PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ2bV9kZXYtPmxvY2ssIGZsYWdzKTsKPiArCWxpc3RfYWRk KCZpbmZvLT5ub2RlLCAmdm1fZGV2LT52aXJ0cXVldWVzKTsKPiArCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOwo+ICsKPiArCXJldHVybiB2cTsKPiArCj4gK2Vy cl92cToKPiArCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOwo+ICtlcnJvcl9uZXdfdmlydHF1ZXVl Ogo+ICsJb3BzLT5zZXRfdnFfcmVhZHkobWRldiwgaW5kZXgsIDApOwo+ICsJV0FSTl9PTihvcHMt PmdldF92cV9yZWFkeShtZGV2LCBpbmRleCkpOwo+ICsJa2ZyZWUoaW5mbyk7Cj4gKwlyZXR1cm4g RVJSX1BUUihlcnIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9kZWxfdnEo c3RydWN0IHZpcnRxdWV1ZSAqdnEpCj4gK3sKPiArCXN0cnVjdCB2aXJ0aW9fbWRldl9kZXZpY2Ug KnZtX2RldiA9IHRvX3ZpcnRpb19tZGV2X2RldmljZSh2cS0+dmRldik7Cj4gKwlzdHJ1Y3QgbWRl dl9kZXZpY2UgKm1kZXYgPSB2bV9kZXYtPm1kZXY7Cj4gKwljb25zdCBzdHJ1Y3QgbWRldl92aXJ0 aW9fb3BzICpvcHMgPSBtZGV2X3ZpcnRpb19nZXRfb3BzKG1kZXYpOwo+ICsJc3RydWN0IHZpcnRp b19tZGV2X3ZxX2luZm8gKmluZm8gPSB2cS0+cHJpdjsKPiArCXVuc2lnbmVkIGludCBpbmRleCA9 IHZxLT5pbmRleDsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2ly cXNhdmUoJnZtX2Rldi0+bG9jaywgZmxhZ3MpOwo+ICsJbGlzdF9kZWwoJmluZm8tPm5vZGUpOwo+ ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm1fZGV2LT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJ LyogU2VsZWN0IGFuZCBkZWFjdGl2YXRlIHRoZSBxdWV1ZSAqLwo+ICsJb3BzLT5zZXRfdnFfcmVh ZHkobWRldiwgaW5kZXgsIDApOwo+ICsJV0FSTl9PTihvcHMtPmdldF92cV9yZWFkeShtZGV2LCBp bmRleCkpOwo+ICsKPiArCXZyaW5nX2RlbF92aXJ0cXVldWUodnEpOwo+ICsKPiArCWtmcmVlKGlu Zm8pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9kZWxfdnFzKHN0cnVjdCB2 aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cSwgKm47Cj4g Kwo+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZxLCBuLCAmdmRldi0+dnFzLCBsaXN0KQo+ ICsJCXZpcnRpb19tZGV2X2RlbF92cSh2cSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdmlydGlv X21kZXZfZmluZF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIG52cXMs Cj4gKwkJCQlzdHJ1Y3QgdmlydHF1ZXVlICp2cXNbXSwKPiArCQkJCXZxX2NhbGxiYWNrX3QgKmNh bGxiYWNrc1tdLAo+ICsJCQkJY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzW10sCj4gKwkJCQljb25z dCBib29sICpjdHgsCj4gKwkJCQlzdHJ1Y3QgaXJxX2FmZmluaXR5ICpkZXNjKQo+ICt7Cj4gKwlz dHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2Uo dmRldik7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsK PiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9v cHMobWRldik7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfY2FsbGJhY2sgY2I7Cj4gKwlpbnQgaSwg ZXJyLCBxdWV1ZV9pZHggPSAwOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudnFzOyArK2kpIHsK PiArCQlpZiAoIW5hbWVzW2ldKSB7Cj4gKwkJCXZxc1tpXSA9IE5VTEw7Cj4gKwkJCWNvbnRpbnVl Owo+ICsJCX0KPiArCj4gKwkJdnFzW2ldID0gdmlydGlvX21kZXZfc2V0dXBfdnEodmRldiwgcXVl dWVfaWR4KyssCj4gKwkJCQkJICAgICAgY2FsbGJhY2tzW2ldLCBuYW1lc1tpXSwgY3R4ID8KPiAr CQkJCQkgICAgICBjdHhbaV0gOiBmYWxzZSk7Cj4gKwkJaWYgKElTX0VSUih2cXNbaV0pKSB7Cj4g KwkJCWVyciA9IFBUUl9FUlIodnFzW2ldKTsKPiArCQkJZ290byBlcnJfc2V0dXBfdnE7Cj4gKwkJ fQo+ICsJfQo+ICsKPiArCWNiLmNhbGxiYWNrID0gdmlydGlvX21kZXZfY29uZmlnX2NiOwo+ICsJ Y2IucHJpdmF0ZSA9IHZtX2RldjsKPiArCW9wcy0+c2V0X2NvbmZpZ19jYihtZGV2LCAmY2IpOwo+ ICsKPiArCXJldHVybiAwOwo+ICsKPiArZXJyX3NldHVwX3ZxOgo+ICsJdmlydGlvX21kZXZfZGVs X3Zxcyh2ZGV2KTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4gK3N0YXRpYyB1NjQgdmlydGlv X21kZXZfZ2V0X2ZlYXR1cmVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2KTsKPiArCWNvbnN0IHN0 cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4g Kwo+ICsJcmV0dXJuIG9wcy0+Z2V0X2ZlYXR1cmVzKG1kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg aW50IHZpcnRpb19tZGV2X2ZpbmFsaXplX2ZlYXR1cmVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2 ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYgPSB2bV9nZXRfbWRldih2ZGV2 KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMgKm9wcyA9IG1kZXZfdmlydGlvX2dl dF9vcHMobWRldik7Cj4gKwo+ICsJLyogR2l2ZSB2aXJ0aW9fcmluZyBhIGNoYW5jZSB0byBhY2Nl cHQgZmVhdHVyZXMuICovCj4gKwl2cmluZ190cmFuc3BvcnRfZmVhdHVyZXModmRldik7Cj4gKwo+ ICsJcmV0dXJuIG9wcy0+c2V0X2ZlYXR1cmVzKG1kZXYsIHZkZXYtPmZlYXR1cmVzKTsKPiArfQo+ ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKnZpcnRpb19tZGV2X2J1c19uYW1lKHN0cnVjdCB2aXJ0 aW9fZGV2aWNlICp2ZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9k ZXYgPSB0b192aXJ0aW9fbWRldl9kZXZpY2UodmRldik7Cj4gKwlzdHJ1Y3QgbWRldl9kZXZpY2Ug Km1kZXYgPSB2bV9kZXYtPm1kZXY7Cj4gKwo+ICsJcmV0dXJuIGRldl9uYW1lKG1kZXZfZGV2KG1k ZXYpKTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCB2aXJ0aW9fY29uZmlnX29wcyB2 aXJ0aW9fbWRldl9jb25maWdfb3BzID0gewo+ICsJLmdldAkJPSB2aXJ0aW9fbWRldl9nZXQsCj4g Kwkuc2V0CQk9IHZpcnRpb19tZGV2X3NldCwKPiArCS5nZW5lcmF0aW9uCT0gdmlydGlvX21kZXZf Z2VuZXJhdGlvbiwKPiArCS5nZXRfc3RhdHVzCT0gdmlydGlvX21kZXZfZ2V0X3N0YXR1cywKPiAr CS5zZXRfc3RhdHVzCT0gdmlydGlvX21kZXZfc2V0X3N0YXR1cywKPiArCS5yZXNldAkJPSB2aXJ0 aW9fbWRldl9yZXNldCwKPiArCS5maW5kX3Zxcwk9IHZpcnRpb19tZGV2X2ZpbmRfdnFzLAo+ICsJ LmRlbF92cXMJPSB2aXJ0aW9fbWRldl9kZWxfdnFzLAo+ICsJLmdldF9mZWF0dXJlcwk9IHZpcnRp b19tZGV2X2dldF9mZWF0dXJlcywKPiArCS5maW5hbGl6ZV9mZWF0dXJlcyA9IHZpcnRpb19tZGV2 X2ZpbmFsaXplX2ZlYXR1cmVzLAo+ICsJLmJ1c19uYW1lCT0gdmlydGlvX21kZXZfYnVzX25hbWUs Cj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCB2aXJ0aW9fbWRldl9yZWxlYXNlX2RldihzdHJ1Y3Qg ZGV2aWNlICpfZCkKPiArewo+ICsJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPQo+ICsJICAg ICAgIGNvbnRhaW5lcl9vZihfZCwgc3RydWN0IHZpcnRpb19kZXZpY2UsIGRldik7Cj4gKwlzdHJ1 Y3QgdmlydGlvX21kZXZfZGV2aWNlICp2bV9kZXYgPQo+ICsJICAgICAgIGNvbnRhaW5lcl9vZih2 ZGV2LCBzdHJ1Y3QgdmlydGlvX21kZXZfZGV2aWNlLCB2ZGV2KTsKPiArCXN0cnVjdCBtZGV2X2Rl dmljZSAqbWRldiA9IHZtX2Rldi0+bWRldjsKPiArCj4gKwlkZXZtX2tmcmVlKG1kZXZfZGV2KG1k ZXYpLCB2bV9kZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHZpcnRpb19tZGV2X3Byb2JlKHN0 cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gbWRl dl92aXJ0aW9fZnJvbV9kZXYoZGV2KTsKPiArCWNvbnN0IHN0cnVjdCBtZGV2X3ZpcnRpb19vcHMg Km9wcyA9IG1kZXZfdmlydGlvX2dldF9vcHMobWRldik7Cj4gKwlzdHJ1Y3QgdmlydGlvX21kZXZf ZGV2aWNlICp2bV9kZXY7Cj4gKwlpbnQgcmM7Cj4gKwo+ICsJdm1fZGV2ID0gZGV2bV9remFsbG9j KGRldiwgc2l6ZW9mKCp2bV9kZXYpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdm1fZGV2KQo+ICsJ CXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXZtX2Rldi0+dmRldi5kZXYucGFyZW50ID0gZGV2Owo+ ICsJdm1fZGV2LT52ZGV2LmRldi5yZWxlYXNlID0gdmlydGlvX21kZXZfcmVsZWFzZV9kZXY7Cj4g Kwl2bV9kZXYtPnZkZXYuY29uZmlnID0gJnZpcnRpb19tZGV2X2NvbmZpZ19vcHM7Cj4gKwl2bV9k ZXYtPm1kZXYgPSBtZGV2Owo+ICsJSU5JVF9MSVNUX0hFQUQoJnZtX2Rldi0+dmlydHF1ZXVlcyk7 Cj4gKwlzcGluX2xvY2tfaW5pdCgmdm1fZGV2LT5sb2NrKTsKPiArCj4gKwl2bV9kZXYtPnZkZXYu aWQuZGV2aWNlID0gb3BzLT5nZXRfZGV2aWNlX2lkKG1kZXYpOwo+ICsJaWYgKHZtX2Rldi0+dmRl di5pZC5kZXZpY2UgPT0gMCkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwl2bV9kZXYtPnZk ZXYuaWQudmVuZG9yID0gb3BzLT5nZXRfdmVuZG9yX2lkKG1kZXYpOwo+ICsJcmMgPSByZWdpc3Rl cl92aXJ0aW9fZGV2aWNlKCZ2bV9kZXYtPnZkZXYpOwo+ICsJaWYgKHJjKQo+ICsJCXB1dF9kZXZp Y2UoZGV2KTsKPiArCWVsc2UKPiArCQlkZXZfc2V0X2RydmRhdGEoZGV2LCB2bV9kZXYpOwo+ICsK PiArCXJldHVybiByYzsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgdmlydGlvX21kZXZfcmVtb3Zl KHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHZpcnRpb19tZGV2X2RldmljZSAq dm1fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gKwo+ICsJdW5yZWdpc3Rlcl92aXJ0aW9f ZGV2aWNlKCZ2bV9kZXYtPnZkZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG1k ZXZfdmlydGlvX2NsYXNzX2lkIHZpcnRpb19pZF90YWJsZVtdID0gewo+ICsJeyBNREVWX1ZJUlRJ T19DTEFTU19JRF9WSVJUSU8gfSwKPiArCXsgMCB9LAo+ICt9Owo+ICsKCkRvIHdlIHN0aWxsIG5l ZWQgdGhlIGNsYXNzIElEPyBJdCdzIGEgdmlydGlvIG1kZXYgYnVzLApkbyB3ZSBuZWVkIGEgdmly dGlvIGNsYXNzIGFzIHdlbGw/Cgo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKG1kZXZfdmlydGlvLCB2 aXJ0aW9faWRfdGFibGUpOwo+ICsKPiArc3RhdGljIHN0cnVjdCBtZGV2X3ZpcnRpb19kcml2ZXIg dmlydGlvX21kZXZfZHJpdmVyID0gewo+ICsJLmRydiA9IHsKPiArCQkubmFtZQk9ICJ2aXJ0aW9f bWRldiIsCj4gKwkJLnByb2JlCT0gdmlydGlvX21kZXZfcHJvYmUsCj4gKwkJLnJlbW92ZSA9IHZp cnRpb19tZGV2X3JlbW92ZSwKPiArCX0sCj4gKwkuaWRfdGFibGUgPSB2aXJ0aW9faWRfdGFibGUs Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCB2aXJ0aW9fbWRldl9pbml0KHZvaWQpCj4g K3sKPiArCXJldHVybiBtZGV2X3JlZ2lzdGVyX2RyaXZlcigmdmlydGlvX21kZXZfZHJpdmVyLmRy diwgVEhJU19NT0RVTEUsCj4gKwkJCQkgICAgJm1kZXZfdmlydGlvX2J1c190eXBlKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgX19leGl0IHZpcnRpb19tZGV2X2V4aXQodm9pZCkKPiArewo+ICsJ bWRldl91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGlvX21kZXZfZHJpdmVyLmRydik7Cj4gK30KPiAr Cj4gK21vZHVsZV9pbml0KHZpcnRpb19tZGV2X2luaXQpCj4gK21vZHVsZV9leGl0KHZpcnRpb19t ZGV2X2V4aXQpCj4gKwo+ICtNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7Cj4gK01PRFVM RV9MSUNFTlNFKCJHUEwgdjIiKTsKPiArTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKPiAr TU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s aW51eC9tZGV2X3ZpcnRpby5oIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZpcnRpby5oCj4gaW5kZXgg ZWYyZGJiNmMzODNhLi41Zjc1ZjNjZjU5ZTEgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9saW51eC9t ZGV2X3ZpcnRpby5oCj4gKysrIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZpcnRpby5oCj4gQEAgLTI1 LDYgKzI1LDExIEBAIHN0cnVjdCB2aXJ0aW9fbWRldl9jYWxsYmFjayB7Cj4gIAl2b2lkICpwcml2 YXRlOwo+ICB9Owo+ICAKPiArZW51bSB7Cj4gKwlNREVWX1ZJUlRJT19DTEFTU19JRF9WSVJUSU8g PSAxLAo+ICsJLyogTmV3IGVudHJpZXMgbXVzdCBiZSBhZGRlZCBoZXJlICovCj4gK307Cj4gKwo+ ICAvKioKPiAgICogc3RydWN0IG1kZXZfdmlydGlvX2RldmljZV9vcHMgLSBTdHJ1Y3R1cmUgdG8g YmUgcmVnaXN0ZXJlZCBmb3IgZWFjaAo+ICAgKiBtZGV2IGRldmljZSB0byByZWdpc3RlciB0aGUg ZGV2aWNlIGZvciB2aXJ0aW8vdmhvc3QgZHJpdmVycy4KPiAtLSAKPiAyLjE5LjEKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5n IGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==