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=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 C7B4FC49EAD for ; Tue, 5 Nov 2019 09:36:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8028A214B2 for ; Tue, 5 Nov 2019 09:36:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="WYjUZjCg" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730842AbfKEJgo (ORCPT ); Tue, 5 Nov 2019 04:36:44 -0500 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:41752 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730755AbfKEJgn (ORCPT ); Tue, 5 Nov 2019 04:36:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1572946602; 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=2x8V9gyXYk1AfWIMaSGj1lObBgUHnw7OWnFzCmlB8Cw=; b=WYjUZjCgkJnjJEF23vbKpPB/DiH0rXMIKvSmj0nFxmkuo2YqxPFit7ktfmopajMzNOSnxz ur6EE4DP9hRPvbJSgU4ifeiNDU3yXd1mOfUujrdmn+jK/B0SKEp5ryrCMpQjjZUa+eDjVX +lggoC8AbeeckzK8Mz2ags2Iq1KcTD4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-205-SL5R8xcNNNaSYbYOfPc-pg-1; Tue, 05 Nov 2019 04:36:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 871BE8017DD; Tue, 5 Nov 2019 09:36:34 +0000 (UTC) Received: from jason-ThinkPad-X1-Carbon-6th.redhat.com (ovpn-12-252.pek2.redhat.com [10.72.12.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E6565C28C; Tue, 5 Nov 2019 09:35:23 +0000 (UTC) From: Jason Wang To: 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, mst@redhat.com, tiwei.bie@intel.com Cc: 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, idos@mellanox.com, eperezma@redhat.com, lulu@redhat.com, parav@mellanox.com, christophe.de.dinechin@gmail.com, kevin.tian@intel.com, stefanha@redhat.com, Jason Wang Subject: [PATCH V8 3/6] mdev: introduce device specific ops Date: Tue, 5 Nov 2019 17:32:37 +0800 Message-Id: <20191105093240.5135-4-jasowang@redhat.com> In-Reply-To: <20191105093240.5135-1-jasowang@redhat.com> References: <20191105093240.5135-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: SL5R8xcNNNaSYbYOfPc-pg-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, except for the create and remove, the rest of mdev_parent_ops is designed for vfio-mdev driver only and may not help for kernel mdev driver. With the help of class id, this patch introduces device specific callbacks inside mdev_device structure. This allows different set of callback to be used by vfio-mdev and virtio-mdev. Reviewed-by: Parav Pandit Signed-off-by: Jason Wang --- .../driver-api/vfio-mediated-device.rst | 35 +++++++++---- MAINTAINERS | 1 + drivers/gpu/drm/i915/gvt/kvmgt.c | 18 ++++--- drivers/s390/cio/vfio_ccw_ops.c | 18 ++++--- drivers/s390/crypto/vfio_ap_ops.c | 14 +++-- drivers/vfio/mdev/mdev_core.c | 24 ++++++++- drivers/vfio/mdev/mdev_private.h | 5 ++ drivers/vfio/mdev/vfio_mdev.c | 37 ++++++------- include/linux/mdev.h | 43 ++++----------- include/linux/mdev_vfio_ops.h | 52 +++++++++++++++++++ samples/vfio-mdev/mbochs.c | 20 ++++--- samples/vfio-mdev/mdpy.c | 20 ++++--- samples/vfio-mdev/mtty.c | 18 ++++--- 13 files changed, 206 insertions(+), 99 deletions(-) create mode 100644 include/linux/mdev_vfio_ops.h diff --git a/Documentation/driver-api/vfio-mediated-device.rst b/Documentat= ion/driver-api/vfio-mediated-device.rst index 6709413bee29..e35f1f8f946e 100644 --- a/Documentation/driver-api/vfio-mediated-device.rst +++ b/Documentation/driver-api/vfio-mediated-device.rst @@ -152,15 +152,6 @@ callbacks per mdev parent device, per mdev type, or an= y other categorization. Vendor drivers are expected to be fully asynchronous in this respect or provide their own internal resource protection.) =20 -The callbacks in the mdev_parent_ops structure are as follows: - -* open: open callback of mediated device -* close: close callback of mediated device -* ioctl: ioctl callback of mediated device -* read : read emulation callback -* write: write emulation callback -* mmap: mmap emulation callback - A driver should use the mdev_parent_ops structure in the function call to register itself with the mdev core driver:: =20 @@ -172,10 +163,34 @@ that a driver should use to unregister itself with th= e mdev core driver:: =20 =09extern void mdev_unregister_device(struct device *dev); =20 -It is also required to specify the class_id in create() callback through:: +As multiple types of mediated devices may be supported, class id needs +to be specified in the create callback(). This could be done +explicitly for the device that does not use on mdev bus for its +operation through: =20 =09int mdev_set_class(struct mdev_device *mdev, u16 id); =20 +For the device that uses on the mdev bus for its operation, the class +should provide helper function to set class id and device specific +ops. E.g for vfio-mdev devices, the function to be called is:: + +=09int mdev_set_vfio_ops(struct mdev_device *mdev, + const struct mdev_vfio_device_ops *vfio_ops)= ; + +The class id (set by this function to MDEV_CLASS_ID_VFIO) is used to +match a device with an mdev driver via its id table. The device +specific callbacks (specified in *vfio_ops) are obtainable via +mdev_get_vfio_ops() (for use by the mdev bus driver). A vfio-mdev +device (class id MDEV_CLASS_ID_VFIO) uses the following +device-specific ops: + +* open: open callback of vfio mediated device +* close: close callback of vfio mediated device +* ioctl: ioctl callback of vfio mediated device +* read : read emulation callback +* write: write emulation callback +* mmap: mmap emulation callback + Mediated Device Management Interface Through sysfs =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 diff --git a/MAINTAINERS b/MAINTAINERS index cba1095547fd..f661d13344d6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -17121,6 +17121,7 @@ S:=09Maintained F:=09Documentation/driver-api/vfio-mediated-device.rst F:=09drivers/vfio/mdev/ F:=09include/linux/mdev.h +F:=09include/linux/mdev_vfio_ops.h F:=09samples/vfio-mdev/ =20 VFIO PLATFORM DRIVER diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kv= mgt.c index 6420f0dbd31b..662f3a672372 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -42,6 +42,7 @@ #include #include #include +#include #include =20 #include @@ -643,6 +644,8 @@ static void kvmgt_put_vfio_device(void *vgpu) =09vfio_device_put(((struct intel_vgpu *)vgpu)->vdev.vfio_device); } =20 +static const struct mdev_vfio_device_ops intel_vfio_vgpu_dev_ops; + static int intel_vgpu_create(struct kobject *kobj, struct mdev_device *mde= v) { =09struct intel_vgpu *vgpu =3D NULL; @@ -678,7 +681,7 @@ static int intel_vgpu_create(struct kobject *kobj, stru= ct mdev_device *mdev) =09=09 dev_name(mdev_dev(mdev))); =09ret =3D 0; =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &intel_vfio_vgpu_dev_ops); out: =09return ret; } @@ -1599,20 +1602,21 @@ static const struct attribute_group *intel_vgpu_gro= ups[] =3D { =09NULL, }; =20 -static struct mdev_parent_ops intel_vgpu_ops =3D { -=09.mdev_attr_groups =3D intel_vgpu_groups, -=09.create=09=09=09=3D intel_vgpu_create, -=09.remove=09=09=09=3D intel_vgpu_remove, - +static const struct mdev_vfio_device_ops intel_vfio_vgpu_dev_ops =3D { =09.open=09=09=09=3D intel_vgpu_open, =09.release=09=09=3D intel_vgpu_release, - =09.read=09=09=09=3D intel_vgpu_read, =09.write=09=09=09=3D intel_vgpu_write, =09.mmap=09=09=09=3D intel_vgpu_mmap, =09.ioctl=09=09=09=3D intel_vgpu_ioctl, }; =20 +static struct mdev_parent_ops intel_vgpu_ops =3D { +=09.mdev_attr_groups =3D intel_vgpu_groups, +=09.create=09=09=09=3D intel_vgpu_create, +=09.remove=09=09=09=3D intel_vgpu_remove, +}; + static int kvmgt_host_init(struct device *dev, void *gvt, const void *ops) { =09struct attribute **kvm_type_attrs; diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_op= s.c index cf2c013ae32f..fa473ded71c7 100644 --- a/drivers/s390/cio/vfio_ccw_ops.c +++ b/drivers/s390/cio/vfio_ccw_ops.c @@ -12,6 +12,7 @@ =20 #include #include +#include #include #include =20 @@ -110,6 +111,8 @@ static struct attribute_group *mdev_type_groups[] =3D { =09NULL, }; =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int vfio_ccw_mdev_create(struct kobject *kobj, struct mdev_device *= mdev) { =09struct vfio_ccw_private *private =3D @@ -129,7 +132,7 @@ static int vfio_ccw_mdev_create(struct kobject *kobj, s= truct mdev_device *mdev) =09=09=09 private->sch->schid.ssid, =09=09=09 private->sch->schid.sch_no); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -575,11 +578,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device = *mdev, =09} } =20 -static const struct mdev_parent_ops vfio_ccw_mdev_ops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.supported_type_groups =3D mdev_type_groups, -=09.create=09=09=09=3D vfio_ccw_mdev_create, -=09.remove=09=09=09=3D vfio_ccw_mdev_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D vfio_ccw_mdev_open, =09.release=09=09=3D vfio_ccw_mdev_release, =09.read=09=09=09=3D vfio_ccw_mdev_read, @@ -587,6 +586,13 @@ static const struct mdev_parent_ops vfio_ccw_mdev_ops = =3D { =09.ioctl=09=09=09=3D vfio_ccw_mdev_ioctl, }; =20 +static const struct mdev_parent_ops vfio_ccw_mdev_ops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.supported_type_groups =3D mdev_type_groups, +=09.create=09=09=09=3D vfio_ccw_mdev_create, +=09.remove=09=09=09=3D vfio_ccw_mdev_remove, +}; + int vfio_ccw_mdev_reg(struct subchannel *sch) { =09return mdev_register_device(&sch->dev, &vfio_ccw_mdev_ops); diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_a= p_ops.c index 07c31070afeb..7bdc62393112 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include =20 @@ -321,6 +322,8 @@ static void vfio_ap_matrix_init(struct ap_config_info *= info, =09matrix->adm_max =3D info->apxa ? info->Nd : 15; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int vfio_ap_mdev_create(struct kobject *kobj, struct mdev_device *m= dev) { =09struct ap_matrix_mdev *matrix_mdev; @@ -343,7 +346,7 @@ static int vfio_ap_mdev_create(struct kobject *kobj, st= ruct mdev_device *mdev) =09list_add(&matrix_mdev->node, &matrix_dev->mdev_list); =09mutex_unlock(&matrix_dev->lock); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -1281,15 +1284,18 @@ static ssize_t vfio_ap_mdev_ioctl(struct mdev_devic= e *mdev, =09return ret; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { +=09.open=09=09=09=3D vfio_ap_mdev_open, +=09.release=09=09=3D vfio_ap_mdev_release, +=09.ioctl=09=09=09=3D vfio_ap_mdev_ioctl, +}; + static const struct mdev_parent_ops vfio_ap_matrix_ops =3D { =09.owner=09=09=09=3D THIS_MODULE, =09.supported_type_groups=09=3D vfio_ap_mdev_type_groups, =09.mdev_attr_groups=09=3D vfio_ap_mdev_attr_groups, =09.create=09=09=09=3D vfio_ap_mdev_create, =09.remove=09=09=09=3D vfio_ap_mdev_remove, -=09.open=09=09=09=3D vfio_ap_mdev_open, -=09.release=09=09=3D vfio_ap_mdev_release, -=09.ioctl=09=09=09=3D vfio_ap_mdev_ioctl, }; =20 int vfio_ap_mdev_register(void) diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 7bfa2e46e829..4e70f19ac145 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -47,7 +47,8 @@ EXPORT_SYMBOL(mdev_set_drvdata); =20 /* * Specify the class for the mdev device, this must be called during - * create() callback. + * create() callback explicitly or implicitly through the helpers + * provided by each class. */ void mdev_set_class(struct mdev_device *mdev, u16 id) { @@ -56,6 +57,27 @@ void mdev_set_class(struct mdev_device *mdev, u16 id) } EXPORT_SYMBOL(mdev_set_class); =20 +/* + * Specify the mdev device to be a VFIO mdev device, and set VFIO + * device ops for it. This must be called from the create() callback + * for VFIO mdev device. + */ +void mdev_set_vfio_ops(struct mdev_device *mdev, +=09=09 const struct mdev_vfio_device_ops *vfio_ops) +{ +=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev->vfio_ops =3D vfio_ops; +} +EXPORT_SYMBOL(mdev_set_vfio_ops); + +/* Get the VFIO device ops for the mdev device. */ +const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *m= dev) +{ +=09WARN_ON(mdev->class_id !=3D MDEV_CLASS_ID_VFIO); +=09return mdev->vfio_ops; +} +EXPORT_SYMBOL(mdev_get_vfio_ops); + struct device *mdev_dev(struct mdev_device *mdev) { =09return &mdev->dev; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_priv= ate.h index c65f436c1869..411227373625 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -10,6 +10,8 @@ #ifndef MDEV_PRIVATE_H #define MDEV_PRIVATE_H =20 +#include + int mdev_bus_register(void); void mdev_bus_unregister(void); =20 @@ -34,6 +36,9 @@ struct mdev_device { =09struct device *iommu_device; =09bool active; =09u16 class_id; +=09union { +=09=09const struct mdev_vfio_device_ops *vfio_ops; +=09}; }; =20 #define to_mdev_device(dev)=09container_of(dev, struct mdev_device, dev) diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_mdev.c index a6641cd8b5a3..c01e2194e4b3 100644 --- a/drivers/vfio/mdev/vfio_mdev.c +++ b/drivers/vfio/mdev/vfio_mdev.c @@ -14,6 +14,7 @@ #include #include #include +#include =20 #include "mdev_private.h" =20 @@ -24,16 +25,16 @@ static int vfio_mdev_open(void *device_data) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =09int ret; =20 -=09if (unlikely(!parent->ops->open)) +=09if (unlikely(!ops->open)) =09=09return -EINVAL; =20 =09if (!try_module_get(THIS_MODULE)) =09=09return -ENODEV; =20 -=09ret =3D parent->ops->open(mdev); +=09ret =3D ops->open(mdev); =09if (ret) =09=09module_put(THIS_MODULE); =20 @@ -43,10 +44,10 @@ static int vfio_mdev_open(void *device_data) static void vfio_mdev_release(void *device_data) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (likely(parent->ops->release)) -=09=09parent->ops->release(mdev); +=09if (likely(ops->release)) +=09=09ops->release(mdev); =20 =09module_put(THIS_MODULE); } @@ -55,47 +56,47 @@ static long vfio_mdev_unlocked_ioctl(void *device_data, =09=09=09=09 unsigned int cmd, unsigned long arg) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->ioctl)) +=09if (unlikely(!ops->ioctl)) =09=09return -EINVAL; =20 -=09return parent->ops->ioctl(mdev, cmd, arg); +=09return ops->ioctl(mdev, cmd, arg); } =20 static ssize_t vfio_mdev_read(void *device_data, char __user *buf, =09=09=09 size_t count, loff_t *ppos) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->read)) +=09if (unlikely(!ops->read)) =09=09return -EINVAL; =20 -=09return parent->ops->read(mdev, buf, count, ppos); +=09return ops->read(mdev, buf, count, ppos); } =20 static ssize_t vfio_mdev_write(void *device_data, const char __user *buf, =09=09=09 size_t count, loff_t *ppos) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->write)) +=09if (unlikely(!ops->write)) =09=09return -EINVAL; =20 -=09return parent->ops->write(mdev, buf, count, ppos); +=09return ops->write(mdev, buf, count, ppos); } =20 static int vfio_mdev_mmap(void *device_data, struct vm_area_struct *vma) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->mmap)) +=09if (unlikely(!ops->mmap)) =09=09return -EINVAL; =20 -=09return parent->ops->mmap(mdev, vma); +=09return ops->mmap(mdev, vma); } =20 static const struct vfio_device_ops vfio_mdev_dev_ops =3D { diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 78b69d09eb54..9e37506d1987 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -10,7 +10,13 @@ #ifndef MDEV_H #define MDEV_H =20 +#include +#include +#include +#include + struct mdev_device; +struct mdev_vfio_device_ops; =20 /* * Called by the parent device driver to set the device which represents @@ -48,30 +54,7 @@ struct device *mdev_get_iommu_device(struct device *dev)= ; *=09=09=09@mdev: mdev_device device structure which is being *=09=09=09 destroyed *=09=09=09Returns integer: success (0) or error (< 0) - * @open:=09=09Open mediated device. - *=09=09=09@mdev: mediated device. - *=09=09=09Returns integer: success (0) or error (< 0) - * @release:=09=09release mediated device - *=09=09=09@mdev: mediated device. - * @read:=09=09Read emulation callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@buf: read buffer - *=09=09=09@count: number of bytes to read - *=09=09=09@ppos: address. - *=09=09=09Retuns number on bytes read on success or error. - * @write:=09=09Write emulation callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@buf: write buffer - *=09=09=09@count: number of bytes to be written - *=09=09=09@ppos: address. - *=09=09=09Retuns number on bytes written on success or error. - * @ioctl:=09=09IOCTL callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@cmd: ioctl command - *=09=09=09@arg: arguments to ioctl - * @mmap:=09=09mmap callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@vma: vma structure + * * Parent device that support mediated device should be registered with md= ev * module with mdev_parent_ops structure. **/ @@ -83,15 +66,6 @@ struct mdev_parent_ops { =20 =09int (*create)(struct kobject *kobj, struct mdev_device *mdev); =09int (*remove)(struct mdev_device *mdev); -=09int (*open)(struct mdev_device *mdev); -=09void (*release)(struct mdev_device *mdev); -=09ssize_t (*read)(struct mdev_device *mdev, char __user *buf, -=09=09=09size_t count, loff_t *ppos); -=09ssize_t (*write)(struct mdev_device *mdev, const char __user *buf, -=09=09=09 size_t count, loff_t *ppos); -=09long=09(*ioctl)(struct mdev_device *mdev, unsigned int cmd, -=09=09=09 unsigned long arg); -=09int=09(*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma); }; =20 /* interface for exporting mdev supported type attributes */ @@ -135,6 +109,9 @@ void *mdev_get_drvdata(struct mdev_device *mdev); void mdev_set_drvdata(struct mdev_device *mdev, void *data); const guid_t *mdev_uuid(struct mdev_device *mdev); void mdev_set_class(struct mdev_device *mdev, u16 id); +void mdev_set_vfio_ops(struct mdev_device *mdev, +=09=09 const struct mdev_vfio_device_ops *vfio_ops); +const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *m= dev); =20 extern struct bus_type mdev_bus_type; =20 diff --git a/include/linux/mdev_vfio_ops.h b/include/linux/mdev_vfio_ops.h new file mode 100644 index 000000000000..317518f30621 --- /dev/null +++ b/include/linux/mdev_vfio_ops.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * VFIO Mediated device definition + */ + +#ifndef MDEV_VFIO_OPS_H +#define MDEV_VFIO_OPS_H + +#include + +/** + * struct mdev_vfio_device_ops - Structure to be registered for each + * mdev device to register the device to vfio-mdev module. + * + * @open:=09=09Open mediated device. + *=09=09=09@mdev: mediated device. + *=09=09=09Returns integer: success (0) or error (< 0) + * @release:=09=09release mediated device + *=09=09=09@mdev: mediated device. + * @read:=09=09Read emulation callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@buf: read buffer + *=09=09=09@count: number of bytes to read + *=09=09=09@ppos: address. + *=09=09=09Retuns number on bytes read on success or error. + * @write:=09=09Write emulation callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@buf: write buffer + *=09=09=09@count: number of bytes to be written + *=09=09=09@ppos: address. + *=09=09=09Retuns number on bytes written on success or error. + * @ioctl:=09=09IOCTL callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@cmd: ioctl command + *=09=09=09@arg: arguments to ioctl + * @mmap:=09=09mmap callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@vma: vma structure + */ +struct mdev_vfio_device_ops { +=09int (*open)(struct mdev_device *mdev); +=09void (*release)(struct mdev_device *mdev); +=09ssize_t (*read)(struct mdev_device *mdev, char __user *buf, +=09=09=09size_t count, loff_t *ppos); +=09ssize_t (*write)(struct mdev_device *mdev, const char __user *buf, +=09=09=09 size_t count, loff_t *ppos); +=09long=09(*ioctl)(struct mdev_device *mdev, unsigned int cmd, +=09=09=09 unsigned long arg); +=09int=09(*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma); +}; + +#endif diff --git a/samples/vfio-mdev/mbochs.c b/samples/vfio-mdev/mbochs.c index 115bc5074656..12963767ba37 100644 --- a/samples/vfio-mdev/mbochs.c +++ b/samples/vfio-mdev/mbochs.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -516,6 +517,8 @@ static int mbochs_reset(struct mdev_device *mdev) =09return 0; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int mbochs_create(struct kobject *kobj, struct mdev_device *mdev) { =09const struct mbochs_type *type =3D mbochs_find_type(kobj); @@ -561,7 +564,7 @@ static int mbochs_create(struct kobject *kobj, struct m= dev_device *mdev) =09mbochs_reset(mdev); =20 =09mbochs_used_mbytes +=3D type->mbytes; -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; =20 err_mem: @@ -1419,12 +1422,7 @@ static struct attribute_group *mdev_type_groups[] = =3D { =09NULL, }; =20 -static const struct mdev_parent_ops mdev_fops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.mdev_attr_groups=09=3D mdev_dev_groups, -=09.supported_type_groups=09=3D mdev_type_groups, -=09.create=09=09=09=3D mbochs_create, -=09.remove=09=09=09=3D mbochs_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D mbochs_open, =09.release=09=09=3D mbochs_close, =09.read=09=09=09=3D mbochs_read, @@ -1433,6 +1431,14 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.mmap=09=09=09=3D mbochs_mmap, }; =20 +static const struct mdev_parent_ops mdev_fops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.mdev_attr_groups=09=3D mdev_dev_groups, +=09.supported_type_groups=09=3D mdev_type_groups, +=09.create=09=09=09=3D mbochs_create, +=09.remove=09=09=09=3D mbochs_remove, +}; + static const struct file_operations vd_fops =3D { =09.owner=09=09=3D THIS_MODULE, }; diff --git a/samples/vfio-mdev/mdpy.c b/samples/vfio-mdev/mdpy.c index 665614574d50..50ee6c98b2af 100644 --- a/samples/vfio-mdev/mdpy.c +++ b/samples/vfio-mdev/mdpy.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include "mdpy-defs.h" @@ -226,6 +227,8 @@ static int mdpy_reset(struct mdev_device *mdev) =09return 0; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int mdpy_create(struct kobject *kobj, struct mdev_device *mdev) { =09const struct mdpy_type *type =3D mdpy_find_type(kobj); @@ -269,7 +272,7 @@ static int mdpy_create(struct kobject *kobj, struct mde= v_device *mdev) =09mdpy_reset(mdev); =20 =09mdpy_count++; -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -726,12 +729,7 @@ static struct attribute_group *mdev_type_groups[] =3D = { =09NULL, }; =20 -static const struct mdev_parent_ops mdev_fops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.mdev_attr_groups=09=3D mdev_dev_groups, -=09.supported_type_groups=09=3D mdev_type_groups, -=09.create=09=09=09=3D mdpy_create, -=09.remove=09=09=09=3D mdpy_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D mdpy_open, =09.release=09=09=3D mdpy_close, =09.read=09=09=09=3D mdpy_read, @@ -740,6 +738,14 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.mmap=09=09=09=3D mdpy_mmap, }; =20 +static const struct mdev_parent_ops mdev_fops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.mdev_attr_groups=09=3D mdev_dev_groups, +=09.supported_type_groups=09=3D mdev_type_groups, +=09.create=09=09=09=3D mdpy_create, +=09.remove=09=09=09=3D mdpy_remove, +}; + static const struct file_operations vd_fops =3D { =09.owner=09=09=3D THIS_MODULE, }; diff --git a/samples/vfio-mdev/mtty.c b/samples/vfio-mdev/mtty.c index 90da12ff7fd9..be476e7ad1f8 100644 --- a/samples/vfio-mdev/mtty.c +++ b/samples/vfio-mdev/mtty.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -708,6 +709,8 @@ static ssize_t mdev_access(struct mdev_device *mdev, u8= *buf, size_t count, =09return ret; } =20 +static const struct mdev_vfio_device_ops vfio_dev_ops; + static int mtty_create(struct kobject *kobj, struct mdev_device *mdev) { =09struct mdev_state *mdev_state; @@ -755,7 +758,7 @@ static int mtty_create(struct kobject *kobj, struct mde= v_device *mdev) =09list_add(&mdev_state->next, &mdev_devices_list); =09mutex_unlock(&mdev_list_lock); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &vfio_dev_ops); =09return 0; } =20 @@ -1388,6 +1391,14 @@ static struct attribute_group *mdev_type_groups[] = =3D { =09NULL, }; =20 +static const struct mdev_vfio_device_ops vfio_dev_ops =3D { +=09.open=09=09=3D mtty_open, +=09.release=09=3D mtty_close, +=09.read=09=09=3D mtty_read, +=09.write=09=09=3D mtty_write, +=09.ioctl=09=09=3D mtty_ioctl, +}; + static const struct mdev_parent_ops mdev_fops =3D { =09.owner =3D THIS_MODULE, =09.dev_attr_groups =3D mtty_dev_groups, @@ -1395,11 +1406,6 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.supported_type_groups =3D mdev_type_groups, =09.create =3D mtty_create, =09.remove=09=09=09=3D mtty_remove, -=09.open =3D mtty_open, -=09.release =3D mtty_close, -=09.read =3D mtty_read, -=09.write =3D mtty_write, -=09.ioctl=09=09 =3D mtty_ioctl, }; =20 static void mtty_device_release(struct device *dev) --=20 2.19.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: [PATCH V8 3/6] mdev: introduce device specific ops Date: Tue, 5 Nov 2019 17:32:37 +0800 Message-ID: <20191105093240.5135-4-jasowang@redhat.com> References: <20191105093240.5135-1-jasowang@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <20191105093240.5135-1-jasowang@redhat.com> Sender: linux-kernel-owner@vger.kernel.org To: 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, mst@redhat.com, tiwei.bie@intel.com Cc: 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, idos@mellanox.com, eperezma@redhat.com, lulu@redhat.com, parav@mellanox.com, christophe.de.dinechin@gmail.com, kevin.tian@intel.com, stefanha@redhat.com List-Id: dri-devel@lists.freedesktop.org Currently, except for the create and remove, the rest of mdev_parent_ops is designed for vfio-mdev driver only and may not help for kernel mdev driver. With the help of class id, this patch introduces device specific callbacks inside mdev_device structure. This allows different set of callback to be used by vfio-mdev and virtio-mdev. Reviewed-by: Parav Pandit Signed-off-by: Jason Wang --- .../driver-api/vfio-mediated-device.rst | 35 +++++++++---- MAINTAINERS | 1 + drivers/gpu/drm/i915/gvt/kvmgt.c | 18 ++++--- drivers/s390/cio/vfio_ccw_ops.c | 18 ++++--- drivers/s390/crypto/vfio_ap_ops.c | 14 +++-- drivers/vfio/mdev/mdev_core.c | 24 ++++++++- drivers/vfio/mdev/mdev_private.h | 5 ++ drivers/vfio/mdev/vfio_mdev.c | 37 ++++++------- include/linux/mdev.h | 43 ++++----------- include/linux/mdev_vfio_ops.h | 52 +++++++++++++++++++ samples/vfio-mdev/mbochs.c | 20 ++++--- samples/vfio-mdev/mdpy.c | 20 ++++--- samples/vfio-mdev/mtty.c | 18 ++++--- 13 files changed, 206 insertions(+), 99 deletions(-) create mode 100644 include/linux/mdev_vfio_ops.h diff --git a/Documentation/driver-api/vfio-mediated-device.rst b/Documentat= ion/driver-api/vfio-mediated-device.rst index 6709413bee29..e35f1f8f946e 100644 --- a/Documentation/driver-api/vfio-mediated-device.rst +++ b/Documentation/driver-api/vfio-mediated-device.rst @@ -152,15 +152,6 @@ callbacks per mdev parent device, per mdev type, or an= y other categorization. Vendor drivers are expected to be fully asynchronous in this respect or provide their own internal resource protection.) =20 -The callbacks in the mdev_parent_ops structure are as follows: - -* open: open callback of mediated device -* close: close callback of mediated device -* ioctl: ioctl callback of mediated device -* read : read emulation callback -* write: write emulation callback -* mmap: mmap emulation callback - A driver should use the mdev_parent_ops structure in the function call to register itself with the mdev core driver:: =20 @@ -172,10 +163,34 @@ that a driver should use to unregister itself with th= e mdev core driver:: =20 =09extern void mdev_unregister_device(struct device *dev); =20 -It is also required to specify the class_id in create() callback through:: +As multiple types of mediated devices may be supported, class id needs +to be specified in the create callback(). This could be done +explicitly for the device that does not use on mdev bus for its +operation through: =20 =09int mdev_set_class(struct mdev_device *mdev, u16 id); =20 +For the device that uses on the mdev bus for its operation, the class +should provide helper function to set class id and device specific +ops. E.g for vfio-mdev devices, the function to be called is:: + +=09int mdev_set_vfio_ops(struct mdev_device *mdev, + const struct mdev_vfio_device_ops *vfio_ops)= ; + +The class id (set by this function to MDEV_CLASS_ID_VFIO) is used to +match a device with an mdev driver via its id table. The device +specific callbacks (specified in *vfio_ops) are obtainable via +mdev_get_vfio_ops() (for use by the mdev bus driver). A vfio-mdev +device (class id MDEV_CLASS_ID_VFIO) uses the following +device-specific ops: + +* open: open callback of vfio mediated device +* close: close callback of vfio mediated device +* ioctl: ioctl callback of vfio mediated device +* read : read emulation callback +* write: write emulation callback +* mmap: mmap emulation callback + Mediated Device Management Interface Through sysfs =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 diff --git a/MAINTAINERS b/MAINTAINERS index cba1095547fd..f661d13344d6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -17121,6 +17121,7 @@ S:=09Maintained F:=09Documentation/driver-api/vfio-mediated-device.rst F:=09drivers/vfio/mdev/ F:=09include/linux/mdev.h +F:=09include/linux/mdev_vfio_ops.h F:=09samples/vfio-mdev/ =20 VFIO PLATFORM DRIVER diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kv= mgt.c index 6420f0dbd31b..662f3a672372 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -42,6 +42,7 @@ #include #include #include +#include #include =20 #include @@ -643,6 +644,8 @@ static void kvmgt_put_vfio_device(void *vgpu) =09vfio_device_put(((struct intel_vgpu *)vgpu)->vdev.vfio_device); } =20 +static const struct mdev_vfio_device_ops intel_vfio_vgpu_dev_ops; + static int intel_vgpu_create(struct kobject *kobj, struct mdev_device *mde= v) { =09struct intel_vgpu *vgpu =3D NULL; @@ -678,7 +681,7 @@ static int intel_vgpu_create(struct kobject *kobj, stru= ct mdev_device *mdev) =09=09 dev_name(mdev_dev(mdev))); =09ret =3D 0; =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &intel_vfio_vgpu_dev_ops); out: =09return ret; } @@ -1599,20 +1602,21 @@ static const struct attribute_group *intel_vgpu_gro= ups[] =3D { =09NULL, }; =20 -static struct mdev_parent_ops intel_vgpu_ops =3D { -=09.mdev_attr_groups =3D intel_vgpu_groups, -=09.create=09=09=09=3D intel_vgpu_create, -=09.remove=09=09=09=3D intel_vgpu_remove, - +static const struct mdev_vfio_device_ops intel_vfio_vgpu_dev_ops =3D { =09.open=09=09=09=3D intel_vgpu_open, =09.release=09=09=3D intel_vgpu_release, - =09.read=09=09=09=3D intel_vgpu_read, =09.write=09=09=09=3D intel_vgpu_write, =09.mmap=09=09=09=3D intel_vgpu_mmap, =09.ioctl=09=09=09=3D intel_vgpu_ioctl, }; =20 +static struct mdev_parent_ops intel_vgpu_ops =3D { +=09.mdev_attr_groups =3D intel_vgpu_groups, +=09.create=09=09=09=3D intel_vgpu_create, +=09.remove=09=09=09=3D intel_vgpu_remove, +}; + static int kvmgt_host_init(struct device *dev, void *gvt, const void *ops) { =09struct attribute **kvm_type_attrs; diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_op= s.c index cf2c013ae32f..fa473ded71c7 100644 --- a/drivers/s390/cio/vfio_ccw_ops.c +++ b/drivers/s390/cio/vfio_ccw_ops.c @@ -12,6 +12,7 @@ =20 #include #include +#include #include #include =20 @@ -110,6 +111,8 @@ static struct attribute_group *mdev_type_groups[] =3D { =09NULL, }; =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int vfio_ccw_mdev_create(struct kobject *kobj, struct mdev_device *= mdev) { =09struct vfio_ccw_private *private =3D @@ -129,7 +132,7 @@ static int vfio_ccw_mdev_create(struct kobject *kobj, s= truct mdev_device *mdev) =09=09=09 private->sch->schid.ssid, =09=09=09 private->sch->schid.sch_no); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -575,11 +578,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device = *mdev, =09} } =20 -static const struct mdev_parent_ops vfio_ccw_mdev_ops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.supported_type_groups =3D mdev_type_groups, -=09.create=09=09=09=3D vfio_ccw_mdev_create, -=09.remove=09=09=09=3D vfio_ccw_mdev_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D vfio_ccw_mdev_open, =09.release=09=09=3D vfio_ccw_mdev_release, =09.read=09=09=09=3D vfio_ccw_mdev_read, @@ -587,6 +586,13 @@ static const struct mdev_parent_ops vfio_ccw_mdev_ops = =3D { =09.ioctl=09=09=09=3D vfio_ccw_mdev_ioctl, }; =20 +static const struct mdev_parent_ops vfio_ccw_mdev_ops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.supported_type_groups =3D mdev_type_groups, +=09.create=09=09=09=3D vfio_ccw_mdev_create, +=09.remove=09=09=09=3D vfio_ccw_mdev_remove, +}; + int vfio_ccw_mdev_reg(struct subchannel *sch) { =09return mdev_register_device(&sch->dev, &vfio_ccw_mdev_ops); diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_a= p_ops.c index 07c31070afeb..7bdc62393112 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include =20 @@ -321,6 +322,8 @@ static void vfio_ap_matrix_init(struct ap_config_info *= info, =09matrix->adm_max =3D info->apxa ? info->Nd : 15; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int vfio_ap_mdev_create(struct kobject *kobj, struct mdev_device *m= dev) { =09struct ap_matrix_mdev *matrix_mdev; @@ -343,7 +346,7 @@ static int vfio_ap_mdev_create(struct kobject *kobj, st= ruct mdev_device *mdev) =09list_add(&matrix_mdev->node, &matrix_dev->mdev_list); =09mutex_unlock(&matrix_dev->lock); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -1281,15 +1284,18 @@ static ssize_t vfio_ap_mdev_ioctl(struct mdev_devic= e *mdev, =09return ret; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { +=09.open=09=09=09=3D vfio_ap_mdev_open, +=09.release=09=09=3D vfio_ap_mdev_release, +=09.ioctl=09=09=09=3D vfio_ap_mdev_ioctl, +}; + static const struct mdev_parent_ops vfio_ap_matrix_ops =3D { =09.owner=09=09=09=3D THIS_MODULE, =09.supported_type_groups=09=3D vfio_ap_mdev_type_groups, =09.mdev_attr_groups=09=3D vfio_ap_mdev_attr_groups, =09.create=09=09=09=3D vfio_ap_mdev_create, =09.remove=09=09=09=3D vfio_ap_mdev_remove, -=09.open=09=09=09=3D vfio_ap_mdev_open, -=09.release=09=09=3D vfio_ap_mdev_release, -=09.ioctl=09=09=09=3D vfio_ap_mdev_ioctl, }; =20 int vfio_ap_mdev_register(void) diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index 7bfa2e46e829..4e70f19ac145 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -47,7 +47,8 @@ EXPORT_SYMBOL(mdev_set_drvdata); =20 /* * Specify the class for the mdev device, this must be called during - * create() callback. + * create() callback explicitly or implicitly through the helpers + * provided by each class. */ void mdev_set_class(struct mdev_device *mdev, u16 id) { @@ -56,6 +57,27 @@ void mdev_set_class(struct mdev_device *mdev, u16 id) } EXPORT_SYMBOL(mdev_set_class); =20 +/* + * Specify the mdev device to be a VFIO mdev device, and set VFIO + * device ops for it. This must be called from the create() callback + * for VFIO mdev device. + */ +void mdev_set_vfio_ops(struct mdev_device *mdev, +=09=09 const struct mdev_vfio_device_ops *vfio_ops) +{ +=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev->vfio_ops =3D vfio_ops; +} +EXPORT_SYMBOL(mdev_set_vfio_ops); + +/* Get the VFIO device ops for the mdev device. */ +const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *m= dev) +{ +=09WARN_ON(mdev->class_id !=3D MDEV_CLASS_ID_VFIO); +=09return mdev->vfio_ops; +} +EXPORT_SYMBOL(mdev_get_vfio_ops); + struct device *mdev_dev(struct mdev_device *mdev) { =09return &mdev->dev; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_priv= ate.h index c65f436c1869..411227373625 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -10,6 +10,8 @@ #ifndef MDEV_PRIVATE_H #define MDEV_PRIVATE_H =20 +#include + int mdev_bus_register(void); void mdev_bus_unregister(void); =20 @@ -34,6 +36,9 @@ struct mdev_device { =09struct device *iommu_device; =09bool active; =09u16 class_id; +=09union { +=09=09const struct mdev_vfio_device_ops *vfio_ops; +=09}; }; =20 #define to_mdev_device(dev)=09container_of(dev, struct mdev_device, dev) diff --git a/drivers/vfio/mdev/vfio_mdev.c b/drivers/vfio/mdev/vfio_mdev.c index a6641cd8b5a3..c01e2194e4b3 100644 --- a/drivers/vfio/mdev/vfio_mdev.c +++ b/drivers/vfio/mdev/vfio_mdev.c @@ -14,6 +14,7 @@ #include #include #include +#include =20 #include "mdev_private.h" =20 @@ -24,16 +25,16 @@ static int vfio_mdev_open(void *device_data) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =09int ret; =20 -=09if (unlikely(!parent->ops->open)) +=09if (unlikely(!ops->open)) =09=09return -EINVAL; =20 =09if (!try_module_get(THIS_MODULE)) =09=09return -ENODEV; =20 -=09ret =3D parent->ops->open(mdev); +=09ret =3D ops->open(mdev); =09if (ret) =09=09module_put(THIS_MODULE); =20 @@ -43,10 +44,10 @@ static int vfio_mdev_open(void *device_data) static void vfio_mdev_release(void *device_data) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (likely(parent->ops->release)) -=09=09parent->ops->release(mdev); +=09if (likely(ops->release)) +=09=09ops->release(mdev); =20 =09module_put(THIS_MODULE); } @@ -55,47 +56,47 @@ static long vfio_mdev_unlocked_ioctl(void *device_data, =09=09=09=09 unsigned int cmd, unsigned long arg) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->ioctl)) +=09if (unlikely(!ops->ioctl)) =09=09return -EINVAL; =20 -=09return parent->ops->ioctl(mdev, cmd, arg); +=09return ops->ioctl(mdev, cmd, arg); } =20 static ssize_t vfio_mdev_read(void *device_data, char __user *buf, =09=09=09 size_t count, loff_t *ppos) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->read)) +=09if (unlikely(!ops->read)) =09=09return -EINVAL; =20 -=09return parent->ops->read(mdev, buf, count, ppos); +=09return ops->read(mdev, buf, count, ppos); } =20 static ssize_t vfio_mdev_write(void *device_data, const char __user *buf, =09=09=09 size_t count, loff_t *ppos) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->write)) +=09if (unlikely(!ops->write)) =09=09return -EINVAL; =20 -=09return parent->ops->write(mdev, buf, count, ppos); +=09return ops->write(mdev, buf, count, ppos); } =20 static int vfio_mdev_mmap(void *device_data, struct vm_area_struct *vma) { =09struct mdev_device *mdev =3D device_data; -=09struct mdev_parent *parent =3D mdev->parent; +=09const struct mdev_vfio_device_ops *ops =3D mdev_get_vfio_ops(mdev); =20 -=09if (unlikely(!parent->ops->mmap)) +=09if (unlikely(!ops->mmap)) =09=09return -EINVAL; =20 -=09return parent->ops->mmap(mdev, vma); +=09return ops->mmap(mdev, vma); } =20 static const struct vfio_device_ops vfio_mdev_dev_ops =3D { diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 78b69d09eb54..9e37506d1987 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -10,7 +10,13 @@ #ifndef MDEV_H #define MDEV_H =20 +#include +#include +#include +#include + struct mdev_device; +struct mdev_vfio_device_ops; =20 /* * Called by the parent device driver to set the device which represents @@ -48,30 +54,7 @@ struct device *mdev_get_iommu_device(struct device *dev)= ; *=09=09=09@mdev: mdev_device device structure which is being *=09=09=09 destroyed *=09=09=09Returns integer: success (0) or error (< 0) - * @open:=09=09Open mediated device. - *=09=09=09@mdev: mediated device. - *=09=09=09Returns integer: success (0) or error (< 0) - * @release:=09=09release mediated device - *=09=09=09@mdev: mediated device. - * @read:=09=09Read emulation callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@buf: read buffer - *=09=09=09@count: number of bytes to read - *=09=09=09@ppos: address. - *=09=09=09Retuns number on bytes read on success or error. - * @write:=09=09Write emulation callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@buf: write buffer - *=09=09=09@count: number of bytes to be written - *=09=09=09@ppos: address. - *=09=09=09Retuns number on bytes written on success or error. - * @ioctl:=09=09IOCTL callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@cmd: ioctl command - *=09=09=09@arg: arguments to ioctl - * @mmap:=09=09mmap callback - *=09=09=09@mdev: mediated device structure - *=09=09=09@vma: vma structure + * * Parent device that support mediated device should be registered with md= ev * module with mdev_parent_ops structure. **/ @@ -83,15 +66,6 @@ struct mdev_parent_ops { =20 =09int (*create)(struct kobject *kobj, struct mdev_device *mdev); =09int (*remove)(struct mdev_device *mdev); -=09int (*open)(struct mdev_device *mdev); -=09void (*release)(struct mdev_device *mdev); -=09ssize_t (*read)(struct mdev_device *mdev, char __user *buf, -=09=09=09size_t count, loff_t *ppos); -=09ssize_t (*write)(struct mdev_device *mdev, const char __user *buf, -=09=09=09 size_t count, loff_t *ppos); -=09long=09(*ioctl)(struct mdev_device *mdev, unsigned int cmd, -=09=09=09 unsigned long arg); -=09int=09(*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma); }; =20 /* interface for exporting mdev supported type attributes */ @@ -135,6 +109,9 @@ void *mdev_get_drvdata(struct mdev_device *mdev); void mdev_set_drvdata(struct mdev_device *mdev, void *data); const guid_t *mdev_uuid(struct mdev_device *mdev); void mdev_set_class(struct mdev_device *mdev, u16 id); +void mdev_set_vfio_ops(struct mdev_device *mdev, +=09=09 const struct mdev_vfio_device_ops *vfio_ops); +const struct mdev_vfio_device_ops *mdev_get_vfio_ops(struct mdev_device *m= dev); =20 extern struct bus_type mdev_bus_type; =20 diff --git a/include/linux/mdev_vfio_ops.h b/include/linux/mdev_vfio_ops.h new file mode 100644 index 000000000000..317518f30621 --- /dev/null +++ b/include/linux/mdev_vfio_ops.h @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * VFIO Mediated device definition + */ + +#ifndef MDEV_VFIO_OPS_H +#define MDEV_VFIO_OPS_H + +#include + +/** + * struct mdev_vfio_device_ops - Structure to be registered for each + * mdev device to register the device to vfio-mdev module. + * + * @open:=09=09Open mediated device. + *=09=09=09@mdev: mediated device. + *=09=09=09Returns integer: success (0) or error (< 0) + * @release:=09=09release mediated device + *=09=09=09@mdev: mediated device. + * @read:=09=09Read emulation callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@buf: read buffer + *=09=09=09@count: number of bytes to read + *=09=09=09@ppos: address. + *=09=09=09Retuns number on bytes read on success or error. + * @write:=09=09Write emulation callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@buf: write buffer + *=09=09=09@count: number of bytes to be written + *=09=09=09@ppos: address. + *=09=09=09Retuns number on bytes written on success or error. + * @ioctl:=09=09IOCTL callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@cmd: ioctl command + *=09=09=09@arg: arguments to ioctl + * @mmap:=09=09mmap callback + *=09=09=09@mdev: mediated device structure + *=09=09=09@vma: vma structure + */ +struct mdev_vfio_device_ops { +=09int (*open)(struct mdev_device *mdev); +=09void (*release)(struct mdev_device *mdev); +=09ssize_t (*read)(struct mdev_device *mdev, char __user *buf, +=09=09=09size_t count, loff_t *ppos); +=09ssize_t (*write)(struct mdev_device *mdev, const char __user *buf, +=09=09=09 size_t count, loff_t *ppos); +=09long=09(*ioctl)(struct mdev_device *mdev, unsigned int cmd, +=09=09=09 unsigned long arg); +=09int=09(*mmap)(struct mdev_device *mdev, struct vm_area_struct *vma); +}; + +#endif diff --git a/samples/vfio-mdev/mbochs.c b/samples/vfio-mdev/mbochs.c index 115bc5074656..12963767ba37 100644 --- a/samples/vfio-mdev/mbochs.c +++ b/samples/vfio-mdev/mbochs.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -516,6 +517,8 @@ static int mbochs_reset(struct mdev_device *mdev) =09return 0; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int mbochs_create(struct kobject *kobj, struct mdev_device *mdev) { =09const struct mbochs_type *type =3D mbochs_find_type(kobj); @@ -561,7 +564,7 @@ static int mbochs_create(struct kobject *kobj, struct m= dev_device *mdev) =09mbochs_reset(mdev); =20 =09mbochs_used_mbytes +=3D type->mbytes; -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; =20 err_mem: @@ -1419,12 +1422,7 @@ static struct attribute_group *mdev_type_groups[] = =3D { =09NULL, }; =20 -static const struct mdev_parent_ops mdev_fops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.mdev_attr_groups=09=3D mdev_dev_groups, -=09.supported_type_groups=09=3D mdev_type_groups, -=09.create=09=09=09=3D mbochs_create, -=09.remove=09=09=09=3D mbochs_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D mbochs_open, =09.release=09=09=3D mbochs_close, =09.read=09=09=09=3D mbochs_read, @@ -1433,6 +1431,14 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.mmap=09=09=09=3D mbochs_mmap, }; =20 +static const struct mdev_parent_ops mdev_fops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.mdev_attr_groups=09=3D mdev_dev_groups, +=09.supported_type_groups=09=3D mdev_type_groups, +=09.create=09=09=09=3D mbochs_create, +=09.remove=09=09=09=3D mbochs_remove, +}; + static const struct file_operations vd_fops =3D { =09.owner=09=09=3D THIS_MODULE, }; diff --git a/samples/vfio-mdev/mdpy.c b/samples/vfio-mdev/mdpy.c index 665614574d50..50ee6c98b2af 100644 --- a/samples/vfio-mdev/mdpy.c +++ b/samples/vfio-mdev/mdpy.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include "mdpy-defs.h" @@ -226,6 +227,8 @@ static int mdpy_reset(struct mdev_device *mdev) =09return 0; } =20 +static const struct mdev_vfio_device_ops mdev_vfio_ops; + static int mdpy_create(struct kobject *kobj, struct mdev_device *mdev) { =09const struct mdpy_type *type =3D mdpy_find_type(kobj); @@ -269,7 +272,7 @@ static int mdpy_create(struct kobject *kobj, struct mde= v_device *mdev) =09mdpy_reset(mdev); =20 =09mdpy_count++; -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &mdev_vfio_ops); =09return 0; } =20 @@ -726,12 +729,7 @@ static struct attribute_group *mdev_type_groups[] =3D = { =09NULL, }; =20 -static const struct mdev_parent_ops mdev_fops =3D { -=09.owner=09=09=09=3D THIS_MODULE, -=09.mdev_attr_groups=09=3D mdev_dev_groups, -=09.supported_type_groups=09=3D mdev_type_groups, -=09.create=09=09=09=3D mdpy_create, -=09.remove=09=09=09=3D mdpy_remove, +static const struct mdev_vfio_device_ops mdev_vfio_ops =3D { =09.open=09=09=09=3D mdpy_open, =09.release=09=09=3D mdpy_close, =09.read=09=09=09=3D mdpy_read, @@ -740,6 +738,14 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.mmap=09=09=09=3D mdpy_mmap, }; =20 +static const struct mdev_parent_ops mdev_fops =3D { +=09.owner=09=09=09=3D THIS_MODULE, +=09.mdev_attr_groups=09=3D mdev_dev_groups, +=09.supported_type_groups=09=3D mdev_type_groups, +=09.create=09=09=09=3D mdpy_create, +=09.remove=09=09=09=3D mdpy_remove, +}; + static const struct file_operations vd_fops =3D { =09.owner=09=09=3D THIS_MODULE, }; diff --git a/samples/vfio-mdev/mtty.c b/samples/vfio-mdev/mtty.c index 90da12ff7fd9..be476e7ad1f8 100644 --- a/samples/vfio-mdev/mtty.c +++ b/samples/vfio-mdev/mtty.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -708,6 +709,8 @@ static ssize_t mdev_access(struct mdev_device *mdev, u8= *buf, size_t count, =09return ret; } =20 +static const struct mdev_vfio_device_ops vfio_dev_ops; + static int mtty_create(struct kobject *kobj, struct mdev_device *mdev) { =09struct mdev_state *mdev_state; @@ -755,7 +758,7 @@ static int mtty_create(struct kobject *kobj, struct mde= v_device *mdev) =09list_add(&mdev_state->next, &mdev_devices_list); =09mutex_unlock(&mdev_list_lock); =20 -=09mdev_set_class(mdev, MDEV_CLASS_ID_VFIO); +=09mdev_set_vfio_ops(mdev, &vfio_dev_ops); =09return 0; } =20 @@ -1388,6 +1391,14 @@ static struct attribute_group *mdev_type_groups[] = =3D { =09NULL, }; =20 +static const struct mdev_vfio_device_ops vfio_dev_ops =3D { +=09.open=09=09=3D mtty_open, +=09.release=09=3D mtty_close, +=09.read=09=09=3D mtty_read, +=09.write=09=09=3D mtty_write, +=09.ioctl=09=09=3D mtty_ioctl, +}; + static const struct mdev_parent_ops mdev_fops =3D { =09.owner =3D THIS_MODULE, =09.dev_attr_groups =3D mtty_dev_groups, @@ -1395,11 +1406,6 @@ static const struct mdev_parent_ops mdev_fops =3D { =09.supported_type_groups =3D mdev_type_groups, =09.create =3D mtty_create, =09.remove=09=09=09=3D mtty_remove, -=09.open =3D mtty_open, -=09.release =3D mtty_close, -=09.read =3D mtty_read, -=09.write =3D mtty_write, -=09.ioctl=09=09 =3D mtty_ioctl, }; =20 static void mtty_device_release(struct device *dev) --=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 081A6FA3748 for ; Tue, 5 Nov 2019 09:36: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 D8FFF20717 for ; Tue, 5 Nov 2019 09:36:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D8FFF20717 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 D1AF06E96A; Tue, 5 Nov 2019 09:36:44 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id 327E96E967 for ; Tue, 5 Nov 2019 09:36:43 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-205-SL5R8xcNNNaSYbYOfPc-pg-1; Tue, 05 Nov 2019 04:36:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 871BE8017DD; Tue, 5 Nov 2019 09:36:34 +0000 (UTC) Received: from jason-ThinkPad-X1-Carbon-6th.redhat.com (ovpn-12-252.pek2.redhat.com [10.72.12.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E6565C28C; Tue, 5 Nov 2019 09:35:23 +0000 (UTC) From: Jason Wang To: 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, mst@redhat.com, tiwei.bie@intel.com Subject: [PATCH V8 3/6] mdev: introduce device specific ops Date: Tue, 5 Nov 2019 17:32:37 +0800 Message-Id: <20191105093240.5135-4-jasowang@redhat.com> In-Reply-To: <20191105093240.5135-1-jasowang@redhat.com> References: <20191105093240.5135-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: SL5R8xcNNNaSYbYOfPc-pg-1 X-Mimecast-Spam-Score: 0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1572946602; 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=2x8V9gyXYk1AfWIMaSGj1lObBgUHnw7OWnFzCmlB8Cw=; b=WYjUZjCgkJnjJEF23vbKpPB/DiH0rXMIKvSmj0nFxmkuo2YqxPFit7ktfmopajMzNOSnxz ur6EE4DP9hRPvbJSgU4ifeiNDU3yXd1mOfUujrdmn+jK/B0SKEp5ryrCMpQjjZUa+eDjVX +lggoC8AbeeckzK8Mz2ags2Iq1KcTD4= 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: christophe.de.dinechin@gmail.com, sebott@linux.ibm.com, airlied@linux.ie, Jason Wang , heiko.carstens@de.ibm.com, kevin.tian@intel.com, virtualization@lists.linux-foundation.org, rob.miller@broadcom.com, lulu@redhat.com, eperezma@redhat.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, haotian.wang@sifive.com, zhi.a.wang@intel.com, farman@linux.ibm.com, idos@mellanox.com, gor@linux.ibm.com, cunming.liang@intel.com, rodrigo.vivi@intel.com, xiao.w.wang@intel.com, freude@linux.ibm.com, parav@mellanox.com, zhihong.wang@intel.com, stefanha@redhat.com, akrowiak@linux.ibm.com, netdev@vger.kernel.org, cohuck@redhat.com, oberpar@linux.ibm.com, maxime.coquelin@redhat.com, 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: <20191105093237.NR3PirTRcbk97k7kuK01rvZ-QlhVxxmxrHU2bKF9vCM@z> Q3VycmVudGx5LCBleGNlcHQgZm9yIHRoZSBjcmVhdGUgYW5kIHJlbW92ZSwgdGhlIHJlc3Qgb2YK bWRldl9wYXJlbnRfb3BzIGlzIGRlc2lnbmVkIGZvciB2ZmlvLW1kZXYgZHJpdmVyIG9ubHkgYW5k IG1heSBub3QgaGVscApmb3Iga2VybmVsIG1kZXYgZHJpdmVyLiBXaXRoIHRoZSBoZWxwIG9mIGNs YXNzIGlkLCB0aGlzIHBhdGNoCmludHJvZHVjZXMgZGV2aWNlIHNwZWNpZmljIGNhbGxiYWNrcyBp bnNpZGUgbWRldl9kZXZpY2UKc3RydWN0dXJlLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQgc2V0IG9m IGNhbGxiYWNrIHRvIGJlIHVzZWQgYnkKdmZpby1tZGV2IGFuZCB2aXJ0aW8tbWRldi4KClJldmll d2VkLWJ5OiBQYXJhdiBQYW5kaXQgPHBhcmF2QG1lbGxhbm94LmNvbT4KU2lnbmVkLW9mZi1ieTog SmFzb24gV2FuZyA8amFzb3dhbmdAcmVkaGF0LmNvbT4KLS0tCiAuLi4vZHJpdmVyLWFwaS92Zmlv LW1lZGlhdGVkLWRldmljZS5yc3QgICAgICAgfCAzNSArKysrKysrKystLS0tCiBNQUlOVEFJTkVS UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMSArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9ndnQva3ZtZ3QuYyAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiBkcml2ZXJzL3Mz OTAvY2lvL3ZmaW9fY2N3X29wcy5jICAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiBkcml2ZXJz L3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMgICAgICAgICAgICAgfCAxNCArKystLQogZHJpdmVy cy92ZmlvL21kZXYvbWRldl9jb3JlLmMgICAgICAgICAgICAgICAgIHwgMjQgKysrKysrKystCiBk cml2ZXJzL3ZmaW8vbWRldi9tZGV2X3ByaXZhdGUuaCAgICAgICAgICAgICAgfCAgNSArKwogZHJp dmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMgICAgICAgICAgICAgICAgIHwgMzcgKysrKysrLS0t LS0tLQogaW5jbHVkZS9saW51eC9tZGV2LmggICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDMg KysrKy0tLS0tLS0tLS0tCiBpbmNsdWRlL2xpbnV4L21kZXZfdmZpb19vcHMuaCAgICAgICAgICAg ICAgICAgfCA1MiArKysrKysrKysrKysrKysrKysrCiBzYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMu YyAgICAgICAgICAgICAgICAgICAgfCAyMCArKysrLS0tCiBzYW1wbGVzL3ZmaW8tbWRldi9tZHB5 LmMgICAgICAgICAgICAgICAgICAgICAgfCAyMCArKysrLS0tCiBzYW1wbGVzL3ZmaW8tbWRldi9t dHR5LmMgICAgICAgICAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiAxMyBmaWxlcyBjaGFuZ2Vk LCAyMDYgaW5zZXJ0aW9ucygrKSwgOTkgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg aW5jbHVkZS9saW51eC9tZGV2X3ZmaW9fb3BzLmgKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L2RyaXZlci1hcGkvdmZpby1tZWRpYXRlZC1kZXZpY2UucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2 ZXItYXBpL3ZmaW8tbWVkaWF0ZWQtZGV2aWNlLnJzdAppbmRleCA2NzA5NDEzYmVlMjkuLmUzNWYx ZjhmOTQ2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3ZmaW8tbWVkaWF0 ZWQtZGV2aWNlLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvdmZpby1tZWRpYXRl ZC1kZXZpY2UucnN0CkBAIC0xNTIsMTUgKzE1Miw2IEBAIGNhbGxiYWNrcyBwZXIgbWRldiBwYXJl bnQgZGV2aWNlLCBwZXIgbWRldiB0eXBlLCBvciBhbnkgb3RoZXIgY2F0ZWdvcml6YXRpb24uCiBW ZW5kb3IgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gYmUgZnVsbHkgYXN5bmNocm9ub3VzIGluIHRo aXMgcmVzcGVjdCBvcgogcHJvdmlkZSB0aGVpciBvd24gaW50ZXJuYWwgcmVzb3VyY2UgcHJvdGVj dGlvbi4pCiAKLVRoZSBjYWxsYmFja3MgaW4gdGhlIG1kZXZfcGFyZW50X29wcyBzdHJ1Y3R1cmUg YXJlIGFzIGZvbGxvd3M6Ci0KLSogb3Blbjogb3BlbiBjYWxsYmFjayBvZiBtZWRpYXRlZCBkZXZp Y2UKLSogY2xvc2U6IGNsb3NlIGNhbGxiYWNrIG9mIG1lZGlhdGVkIGRldmljZQotKiBpb2N0bDog aW9jdGwgY2FsbGJhY2sgb2YgbWVkaWF0ZWQgZGV2aWNlCi0qIHJlYWQgOiByZWFkIGVtdWxhdGlv biBjYWxsYmFjawotKiB3cml0ZTogd3JpdGUgZW11bGF0aW9uIGNhbGxiYWNrCi0qIG1tYXA6IG1t YXAgZW11bGF0aW9uIGNhbGxiYWNrCi0KIEEgZHJpdmVyIHNob3VsZCB1c2UgdGhlIG1kZXZfcGFy ZW50X29wcyBzdHJ1Y3R1cmUgaW4gdGhlIGZ1bmN0aW9uIGNhbGwgdG8KIHJlZ2lzdGVyIGl0c2Vs ZiB3aXRoIHRoZSBtZGV2IGNvcmUgZHJpdmVyOjoKIApAQCAtMTcyLDEwICsxNjMsMzQgQEAgdGhh dCBhIGRyaXZlciBzaG91bGQgdXNlIHRvIHVucmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIG1kZXYg Y29yZSBkcml2ZXI6OgogCiAJZXh0ZXJuIHZvaWQgbWRldl91bnJlZ2lzdGVyX2RldmljZShzdHJ1 Y3QgZGV2aWNlICpkZXYpOwogCi1JdCBpcyBhbHNvIHJlcXVpcmVkIHRvIHNwZWNpZnkgdGhlIGNs YXNzX2lkIGluIGNyZWF0ZSgpIGNhbGxiYWNrIHRocm91Z2g6OgorQXMgbXVsdGlwbGUgdHlwZXMg b2YgbWVkaWF0ZWQgZGV2aWNlcyBtYXkgYmUgc3VwcG9ydGVkLCBjbGFzcyBpZCBuZWVkcwordG8g YmUgc3BlY2lmaWVkIGluIHRoZSBjcmVhdGUgY2FsbGJhY2soKS4gVGhpcyBjb3VsZCBiZSBkb25l CitleHBsaWNpdGx5IGZvciB0aGUgZGV2aWNlIHRoYXQgZG9lcyBub3QgdXNlIG9uIG1kZXYgYnVz IGZvciBpdHMKK29wZXJhdGlvbiB0aHJvdWdoOgogCiAJaW50IG1kZXZfc2V0X2NsYXNzKHN0cnVj dCBtZGV2X2RldmljZSAqbWRldiwgdTE2IGlkKTsKIAorRm9yIHRoZSBkZXZpY2UgdGhhdCB1c2Vz IG9uIHRoZSBtZGV2IGJ1cyBmb3IgaXRzIG9wZXJhdGlvbiwgdGhlIGNsYXNzCitzaG91bGQgcHJv dmlkZSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGNsYXNzIGlkIGFuZCBkZXZpY2Ugc3BlY2lmaWMK K29wcy4gRS5nIGZvciB2ZmlvLW1kZXYgZGV2aWNlcywgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxl ZCBpczo6CisKKwlpbnQgbWRldl9zZXRfdmZpb19vcHMoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2 LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19k ZXZpY2Vfb3BzICp2ZmlvX29wcyk7CisKK1RoZSBjbGFzcyBpZCAoc2V0IGJ5IHRoaXMgZnVuY3Rp b24gdG8gTURFVl9DTEFTU19JRF9WRklPKSBpcyB1c2VkIHRvCittYXRjaCBhIGRldmljZSB3aXRo IGFuIG1kZXYgZHJpdmVyIHZpYSBpdHMgaWQgdGFibGUuIFRoZSBkZXZpY2UKK3NwZWNpZmljIGNh bGxiYWNrcyAoc3BlY2lmaWVkIGluICp2ZmlvX29wcykgYXJlIG9idGFpbmFibGUgdmlhCittZGV2 X2dldF92ZmlvX29wcygpIChmb3IgdXNlIGJ5IHRoZSBtZGV2IGJ1cyBkcml2ZXIpLiBBIHZmaW8t bWRldgorZGV2aWNlIChjbGFzcyBpZCBNREVWX0NMQVNTX0lEX1ZGSU8pIHVzZXMgdGhlIGZvbGxv d2luZworZGV2aWNlLXNwZWNpZmljIG9wczoKKworKiBvcGVuOiBvcGVuIGNhbGxiYWNrIG9mIHZm aW8gbWVkaWF0ZWQgZGV2aWNlCisqIGNsb3NlOiBjbG9zZSBjYWxsYmFjayBvZiB2ZmlvIG1lZGlh dGVkIGRldmljZQorKiBpb2N0bDogaW9jdGwgY2FsbGJhY2sgb2YgdmZpbyBtZWRpYXRlZCBkZXZp Y2UKKyogcmVhZCA6IHJlYWQgZW11bGF0aW9uIGNhbGxiYWNrCisqIHdyaXRlOiB3cml0ZSBlbXVs YXRpb24gY2FsbGJhY2sKKyogbW1hcDogbW1hcCBlbXVsYXRpb24gY2FsbGJhY2sKKwogTWVkaWF0 ZWQgRGV2aWNlIE1hbmFnZW1lbnQgSW50ZXJmYWNlIFRocm91Z2ggc3lzZnMKID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL01B SU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggY2JhMTA5NTU0N2ZkLi5mNjYxZDEzMzQ0ZDYg MTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xNzEyMSw2ICsx NzEyMSw3IEBAIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZHJpdmVyLWFwaS92Zmlv LW1lZGlhdGVkLWRldmljZS5yc3QKIEY6CWRyaXZlcnMvdmZpby9tZGV2LwogRjoJaW5jbHVkZS9s aW51eC9tZGV2LmgKK0Y6CWluY2x1ZGUvbGludXgvbWRldl92ZmlvX29wcy5oCiBGOglzYW1wbGVz L3ZmaW8tbWRldi8KIAogVkZJTyBQTEFURk9STSBEUklWRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d2dC9rdm1ndC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2t2bWd0 LmMKaW5kZXggNjQyMGYwZGJkMzFiLi42NjJmM2E2NzIzNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d2dC9rdm1ndC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9r dm1ndC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNp bmNsdWRlIDxsaW51eC92ZmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWRldi5oPgorI2luY2x1ZGUg PGxpbnV4L21kZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAKICNp bmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KQEAgLTY0Myw2ICs2NDQsOCBAQCBzdGF0aWMgdm9pZCBr dm1ndF9wdXRfdmZpb19kZXZpY2Uodm9pZCAqdmdwdSkKIAl2ZmlvX2RldmljZV9wdXQoKChzdHJ1 Y3QgaW50ZWxfdmdwdSAqKXZncHUpLT52ZGV2LnZmaW9fZGV2aWNlKTsKIH0KIAorc3RhdGljIGNv bnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyBpbnRlbF92ZmlvX3ZncHVfZGV2X29wczsK Kwogc3RhdGljIGludCBpbnRlbF92Z3B1X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3Ry dWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCXN0cnVjdCBpbnRlbF92Z3B1ICp2Z3B1ID0gTlVM TDsKQEAgLTY3OCw3ICs2ODEsNyBAQCBzdGF0aWMgaW50IGludGVsX3ZncHVfY3JlYXRlKHN0cnVj dCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJCSAgICAgZGV2X25h bWUobWRldl9kZXYobWRldikpKTsKIAlyZXQgPSAwOwogCi0JbWRldl9zZXRfY2xhc3MobWRldiwg TURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2X3NldF92ZmlvX29wcyhtZGV2LCAmaW50ZWxfdmZp b192Z3B1X2Rldl9vcHMpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNTk5LDIwICsxNjAy LDIxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICppbnRlbF92Z3B1X2dy b3Vwc1tdID0gewogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXZfcGFyZW50X29wcyBp bnRlbF92Z3B1X29wcyA9IHsKLQkubWRldl9hdHRyX2dyb3VwcyAgICAgICA9IGludGVsX3ZncHVf Z3JvdXBzLAotCS5jcmVhdGUJCQk9IGludGVsX3ZncHVfY3JlYXRlLAotCS5yZW1vdmUJCQk9IGlu dGVsX3ZncHVfcmVtb3ZlLAotCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vf b3BzIGludGVsX3ZmaW9fdmdwdV9kZXZfb3BzID0gewogCS5vcGVuCQkJPSBpbnRlbF92Z3B1X29w ZW4sCiAJLnJlbGVhc2UJCT0gaW50ZWxfdmdwdV9yZWxlYXNlLAotCiAJLnJlYWQJCQk9IGludGVs X3ZncHVfcmVhZCwKIAkud3JpdGUJCQk9IGludGVsX3ZncHVfd3JpdGUsCiAJLm1tYXAJCQk9IGlu dGVsX3ZncHVfbW1hcCwKIAkuaW9jdGwJCQk9IGludGVsX3ZncHVfaW9jdGwsCiB9OwogCitzdGF0 aWMgc3RydWN0IG1kZXZfcGFyZW50X29wcyBpbnRlbF92Z3B1X29wcyA9IHsKKwkubWRldl9hdHRy X2dyb3VwcyAgICAgICA9IGludGVsX3ZncHVfZ3JvdXBzLAorCS5jcmVhdGUJCQk9IGludGVsX3Zn cHVfY3JlYXRlLAorCS5yZW1vdmUJCQk9IGludGVsX3ZncHVfcmVtb3ZlLAorfTsKKwogc3RhdGlj IGludCBrdm1ndF9ob3N0X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpndnQsIGNvbnN0 IHZvaWQgKm9wcykKIHsKIAlzdHJ1Y3QgYXR0cmlidXRlICoqa3ZtX3R5cGVfYXR0cnM7CmRpZmYg LS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3ZmaW9fY2N3X29wcy5jIGIvZHJpdmVycy9zMzkwL2Np by92ZmlvX2Njd19vcHMuYwppbmRleCBjZjJjMDEzYWUzMmYuLmZhNDczZGVkNzFjNyAxMDA2NDQK LS0tIGEvZHJpdmVycy9zMzkwL2Npby92ZmlvX2Njd19vcHMuYworKysgYi9kcml2ZXJzL3MzOTAv Y2lvL3ZmaW9fY2N3X29wcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC92 ZmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21kZXZfdmZp b19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+CiAKQEAgLTExMCw2ICsxMTEsOCBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAq bWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0 IG1kZXZfdmZpb19kZXZpY2Vfb3BzIG1kZXZfdmZpb19vcHM7CisKIHN0YXRpYyBpbnQgdmZpb19j Y3dfbWRldl9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBtZGV2X2RldmljZSAq bWRldikKIHsKIAlzdHJ1Y3QgdmZpb19jY3dfcHJpdmF0ZSAqcHJpdmF0ZSA9CkBAIC0xMjksNyAr MTMyLDcgQEAgc3RhdGljIGludCB2ZmlvX2Njd19tZGV2X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAq a29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogCQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hp ZC5zc2lkLAogCQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hpZC5zY2hfbm8pOwogCi0JbWRldl9zZXRf Y2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2X3NldF92ZmlvX29wcyhtZGV2 LCAmbWRldl92ZmlvX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU3NSwxMSArNTc4LDcgQEAg c3RhdGljIHNzaXplX3QgdmZpb19jY3dfbWRldl9pb2N0bChzdHJ1Y3QgbWRldl9kZXZpY2UgKm1k ZXYsCiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Nj d19tZGV2X29wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5zdXBwb3J0ZWRfdHlw ZV9ncm91cHMgID0gbWRldl90eXBlX2dyb3VwcywKLQkuY3JlYXRlCQkJPSB2ZmlvX2Njd19tZGV2 X2NyZWF0ZSwKLQkucmVtb3ZlCQkJPSB2ZmlvX2Njd19tZGV2X3JlbW92ZSwKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgbWRldl92ZmlvX29wcyA9IHsKIAkub3BlbgkJ CT0gdmZpb19jY3dfbWRldl9vcGVuLAogCS5yZWxlYXNlCQk9IHZmaW9fY2N3X21kZXZfcmVsZWFz ZSwKIAkucmVhZAkJCT0gdmZpb19jY3dfbWRldl9yZWFkLApAQCAtNTg3LDYgKzU4NiwxMyBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Njd19tZGV2X29wcyA9IHsK IAkuaW9jdGwJCQk9IHZmaW9fY2N3X21kZXZfaW9jdGwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Njd19tZGV2X29wcyA9IHsKKwkub3duZXIJCQk9IFRI SVNfTU9EVUxFLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMgID0gbWRldl90eXBlX2dyb3VwcywK KwkuY3JlYXRlCQkJPSB2ZmlvX2Njd19tZGV2X2NyZWF0ZSwKKwkucmVtb3ZlCQkJPSB2ZmlvX2Nj d19tZGV2X3JlbW92ZSwKK307CisKIGludCB2ZmlvX2Njd19tZGV2X3JlZyhzdHJ1Y3Qgc3ViY2hh bm5lbCAqc2NoKQogewogCXJldHVybiBtZGV2X3JlZ2lzdGVyX2RldmljZSgmc2NoLT5kZXYsICZ2 ZmlvX2Njd19tZGV2X29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9f YXBfb3BzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMKaW5kZXggMDdjMzEw NzBhZmViLi43YmRjNjIzOTMxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vdmZp b19hcF9vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMKQEAgLTE2 LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9r dm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21k ZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxhc20va3ZtLmg+CiAjaW5jbHVkZSA8YXNtL3pjcnlw dC5oPgogCkBAIC0zMjEsNiArMzIyLDggQEAgc3RhdGljIHZvaWQgdmZpb19hcF9tYXRyaXhfaW5p dChzdHJ1Y3QgYXBfY29uZmlnX2luZm8gKmluZm8sCiAJbWF0cml4LT5hZG1fbWF4ID0gaW5mby0+ YXB4YSA/IGluZm8tPk5kIDogMTU7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl92Zmlv X2RldmljZV9vcHMgbWRldl92ZmlvX29wczsKKwogc3RhdGljIGludCB2ZmlvX2FwX21kZXZfY3Jl YXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiB7CiAJ c3RydWN0IGFwX21hdHJpeF9tZGV2ICptYXRyaXhfbWRldjsKQEAgLTM0Myw3ICszNDYsNyBAQCBz dGF0aWMgaW50IHZmaW9fYXBfbWRldl9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVj dCBtZGV2X2RldmljZSAqbWRldikKIAlsaXN0X2FkZCgmbWF0cml4X21kZXYtPm5vZGUsICZtYXRy aXhfZGV2LT5tZGV2X2xpc3QpOwogCW11dGV4X3VubG9jaygmbWF0cml4X2Rldi0+bG9jayk7CiAK LQltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVWX0NMQVNTX0lEX1ZGSU8pOworCW1kZXZfc2V0X3Zm aW9fb3BzKG1kZXYsICZtZGV2X3ZmaW9fb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI4MSwx NSArMTI4NCwxOCBAQCBzdGF0aWMgc3NpemVfdCB2ZmlvX2FwX21kZXZfaW9jdGwoc3RydWN0IG1k ZXZfZGV2aWNlICptZGV2LAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bWRldl92ZmlvX2RldmljZV9vcHMgbWRldl92ZmlvX29wcyA9IHsKKwkub3BlbgkJCT0gdmZpb19h cF9tZGV2X29wZW4sCisJLnJlbGVhc2UJCT0gdmZpb19hcF9tZGV2X3JlbGVhc2UsCisJLmlvY3Rs CQkJPSB2ZmlvX2FwX21kZXZfaW9jdGwsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZf cGFyZW50X29wcyB2ZmlvX2FwX21hdHJpeF9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVM RSwKIAkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBzCT0gdmZpb19hcF9tZGV2X3R5cGVfZ3JvdXBzLAog CS5tZGV2X2F0dHJfZ3JvdXBzCT0gdmZpb19hcF9tZGV2X2F0dHJfZ3JvdXBzLAogCS5jcmVhdGUJ CQk9IHZmaW9fYXBfbWRldl9jcmVhdGUsCiAJLnJlbW92ZQkJCT0gdmZpb19hcF9tZGV2X3JlbW92 ZSwKLQkub3BlbgkJCT0gdmZpb19hcF9tZGV2X29wZW4sCi0JLnJlbGVhc2UJCT0gdmZpb19hcF9t ZGV2X3JlbGVhc2UsCi0JLmlvY3RsCQkJPSB2ZmlvX2FwX21kZXZfaW9jdGwsCiB9OwogCiBpbnQg dmZpb19hcF9tZGV2X3JlZ2lzdGVyKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vbWRl di9tZGV2X2NvcmUuYyBiL2RyaXZlcnMvdmZpby9tZGV2L21kZXZfY29yZS5jCmluZGV4IDdiZmEy ZTQ2ZTgyOS4uNGU3MGYxOWFjMTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2 X2NvcmUuYworKysgYi9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X2NvcmUuYwpAQCAtNDcsNyArNDcs OCBAQCBFWFBPUlRfU1lNQk9MKG1kZXZfc2V0X2RydmRhdGEpOwogCiAvKgogICogU3BlY2lmeSB0 aGUgY2xhc3MgZm9yIHRoZSBtZGV2IGRldmljZSwgdGhpcyBtdXN0IGJlIGNhbGxlZCBkdXJpbmcK LSAqIGNyZWF0ZSgpIGNhbGxiYWNrLgorICogY3JlYXRlKCkgY2FsbGJhY2sgZXhwbGljaXRseSBv ciBpbXBsaWNpdGx5IHRocm91Z2ggdGhlIGhlbHBlcnMKKyAqIHByb3ZpZGVkIGJ5IGVhY2ggY2xh c3MuCiAgKi8KIHZvaWQgbWRldl9zZXRfY2xhc3Moc3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1 MTYgaWQpCiB7CkBAIC01Niw2ICs1NywyNyBAQCB2b2lkIG1kZXZfc2V0X2NsYXNzKHN0cnVjdCBt ZGV2X2RldmljZSAqbWRldiwgdTE2IGlkKQogfQogRVhQT1JUX1NZTUJPTChtZGV2X3NldF9jbGFz cyk7CiAKKy8qCisgKiBTcGVjaWZ5IHRoZSBtZGV2IGRldmljZSB0byBiZSBhIFZGSU8gbWRldiBk ZXZpY2UsIGFuZCBzZXQgVkZJTworICogZGV2aWNlIG9wcyBmb3IgaXQuIFRoaXMgbXVzdCBiZSBj YWxsZWQgZnJvbSB0aGUgY3JlYXRlKCkgY2FsbGJhY2sKKyAqIGZvciBWRklPIG1kZXYgZGV2aWNl LgorICovCit2b2lkIG1kZXZfc2V0X3ZmaW9fb3BzKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldiwK KwkJICAgICAgIGNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqdmZpb19vcHMpCit7 CisJbWRldl9zZXRfY2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2LT52Zmlv X29wcyA9IHZmaW9fb3BzOworfQorRVhQT1JUX1NZTUJPTChtZGV2X3NldF92ZmlvX29wcyk7CisK Ky8qIEdldCB0aGUgVkZJTyBkZXZpY2Ugb3BzIGZvciB0aGUgbWRldiBkZXZpY2UuICovCitjb25z dCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKm1kZXZfZ2V0X3ZmaW9fb3BzKHN0cnVjdCBt ZGV2X2RldmljZSAqbWRldikKK3sKKwlXQVJOX09OKG1kZXYtPmNsYXNzX2lkICE9IE1ERVZfQ0xB U1NfSURfVkZJTyk7CisJcmV0dXJuIG1kZXYtPnZmaW9fb3BzOworfQorRVhQT1JUX1NZTUJPTCht ZGV2X2dldF92ZmlvX29wcyk7CisKIHN0cnVjdCBkZXZpY2UgKm1kZXZfZGV2KHN0cnVjdCBtZGV2 X2RldmljZSAqbWRldikKIHsKIAlyZXR1cm4gJm1kZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oIGIvZHJpdmVycy92ZmlvL21kZXYvbWRldl9wcml2 YXRlLmgKaW5kZXggYzY1ZjQzNmMxODY5Li40MTEyMjczNzM2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvdmZpby9tZGV2L21kZXZf cHJpdmF0ZS5oCkBAIC0xMCw2ICsxMCw4IEBACiAjaWZuZGVmIE1ERVZfUFJJVkFURV9ICiAjZGVm aW5lIE1ERVZfUFJJVkFURV9ICiAKKyNpbmNsdWRlIDxsaW51eC9tZGV2X3ZmaW9fb3BzLmg+CisK IGludCAgbWRldl9idXNfcmVnaXN0ZXIodm9pZCk7CiB2b2lkIG1kZXZfYnVzX3VucmVnaXN0ZXIo dm9pZCk7CiAKQEAgLTM0LDYgKzM2LDkgQEAgc3RydWN0IG1kZXZfZGV2aWNlIHsKIAlzdHJ1Y3Qg ZGV2aWNlICppb21tdV9kZXZpY2U7CiAJYm9vbCBhY3RpdmU7CiAJdTE2IGNsYXNzX2lkOworCXVu aW9uIHsKKwkJY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzICp2ZmlvX29wczsKKwl9 OwogfTsKIAogI2RlZmluZSB0b19tZGV2X2RldmljZShkZXYpCWNvbnRhaW5lcl9vZihkZXYsIHN0 cnVjdCBtZGV2X2RldmljZSwgZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL21kZXYvdmZp b19tZGV2LmMgYi9kcml2ZXJzL3ZmaW8vbWRldi92ZmlvX21kZXYuYwppbmRleCBhNjY0MWNkOGI1 YTMuLmMwMWUyMTk0ZTRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2 LmMKKysrIGIvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMKQEAgLTE0LDYgKzE0LDcgQEAK ICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmZpby5oPgogI2luY2x1 ZGUgPGxpbnV4L21kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tZGV2X3ZmaW9fb3BzLmg+CiAKICNp bmNsdWRlICJtZGV2X3ByaXZhdGUuaCIKIApAQCAtMjQsMTYgKzI1LDE2IEBACiBzdGF0aWMgaW50 IHZmaW9fbWRldl9vcGVuKHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBtZGV2X2Rldmlj ZSAqbWRldiA9IGRldmljZV9kYXRhOwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRl di0+cGFyZW50OworCWNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRl dl9nZXRfdmZpb19vcHMobWRldik7CiAJaW50IHJldDsKIAotCWlmICh1bmxpa2VseSghcGFyZW50 LT5vcHMtPm9wZW4pKQorCWlmICh1bmxpa2VseSghb3BzLT5vcGVuKSkKIAkJcmV0dXJuIC1FSU5W QUw7CiAKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKIAkJcmV0dXJuIC1FTk9E RVY7CiAKLQlyZXQgPSBwYXJlbnQtPm9wcy0+b3BlbihtZGV2KTsKKwlyZXQgPSBvcHMtPm9wZW4o bWRldik7CiAJaWYgKHJldCkKIAkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAKQEAgLTQzLDEw ICs0NCwxMCBAQCBzdGF0aWMgaW50IHZmaW9fbWRldl9vcGVuKHZvaWQgKmRldmljZV9kYXRhKQog c3RhdGljIHZvaWQgdmZpb19tZGV2X3JlbGVhc2Uodm9pZCAqZGV2aWNlX2RhdGEpCiB7CiAJc3Ry dWN0IG1kZXZfZGV2aWNlICptZGV2ID0gZGV2aWNlX2RhdGE7Ci0Jc3RydWN0IG1kZXZfcGFyZW50 ICpwYXJlbnQgPSBtZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vf b3BzICpvcHMgPSBtZGV2X2dldF92ZmlvX29wcyhtZGV2KTsKIAotCWlmIChsaWtlbHkocGFyZW50 LT5vcHMtPnJlbGVhc2UpKQotCQlwYXJlbnQtPm9wcy0+cmVsZWFzZShtZGV2KTsKKwlpZiAobGlr ZWx5KG9wcy0+cmVsZWFzZSkpCisJCW9wcy0+cmVsZWFzZShtZGV2KTsKIAogCW1vZHVsZV9wdXQo VEhJU19NT0RVTEUpOwogfQpAQCAtNTUsNDcgKzU2LDQ3IEBAIHN0YXRpYyBsb25nIHZmaW9fbWRl dl91bmxvY2tlZF9pb2N0bCh2b2lkICpkZXZpY2VfZGF0YSwKIAkJCQkgICAgIHVuc2lnbmVkIGlu dCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9 IGRldmljZV9kYXRhOwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRldi0+cGFyZW50 OworCWNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRldl9nZXRfdmZp b19vcHMobWRldik7CiAKLQlpZiAodW5saWtlbHkoIXBhcmVudC0+b3BzLT5pb2N0bCkpCisJaWYg KHVubGlrZWx5KCFvcHMtPmlvY3RsKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFy ZW50LT5vcHMtPmlvY3RsKG1kZXYsIGNtZCwgYXJnKTsKKwlyZXR1cm4gb3BzLT5pb2N0bChtZGV2 LCBjbWQsIGFyZyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHZmaW9fbWRldl9yZWFkKHZvaWQgKmRl dmljZV9kYXRhLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2Zm X3QgKnBwb3MpCiB7CiAJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gZGV2aWNlX2RhdGE7Ci0J c3RydWN0IG1kZXZfcGFyZW50ICpwYXJlbnQgPSBtZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0 IG1kZXZfdmZpb19kZXZpY2Vfb3BzICpvcHMgPSBtZGV2X2dldF92ZmlvX29wcyhtZGV2KTsKIAot CWlmICh1bmxpa2VseSghcGFyZW50LT5vcHMtPnJlYWQpKQorCWlmICh1bmxpa2VseSghb3BzLT5y ZWFkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFyZW50LT5vcHMtPnJlYWQobWRl diwgYnVmLCBjb3VudCwgcHBvcyk7CisJcmV0dXJuIG9wcy0+cmVhZChtZGV2LCBidWYsIGNvdW50 LCBwcG9zKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdmZpb19tZGV2X3dyaXRlKHZvaWQgKmRldmlj ZV9kYXRhLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwg bG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9IGRldmljZV9kYXRh OwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRldi0+cGFyZW50OworCWNvbnN0IHN0 cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRldl9nZXRfdmZpb19vcHMobWRldik7 CiAKLQlpZiAodW5saWtlbHkoIXBhcmVudC0+b3BzLT53cml0ZSkpCisJaWYgKHVubGlrZWx5KCFv cHMtPndyaXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFyZW50LT5vcHMtPndy aXRlKG1kZXYsIGJ1ZiwgY291bnQsIHBwb3MpOworCXJldHVybiBvcHMtPndyaXRlKG1kZXYsIGJ1 ZiwgY291bnQsIHBwb3MpOwogfQogCiBzdGF0aWMgaW50IHZmaW9fbWRldl9tbWFwKHZvaWQgKmRl dmljZV9kYXRhLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgbWRldl9k ZXZpY2UgKm1kZXYgPSBkZXZpY2VfZGF0YTsKLQlzdHJ1Y3QgbWRldl9wYXJlbnQgKnBhcmVudCA9 IG1kZXYtPnBhcmVudDsKKwljb25zdCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKm9wcyA9 IG1kZXZfZ2V0X3ZmaW9fb3BzKG1kZXYpOwogCi0JaWYgKHVubGlrZWx5KCFwYXJlbnQtPm9wcy0+ bW1hcCkpCisJaWYgKHVubGlrZWx5KCFvcHMtPm1tYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAot CXJldHVybiBwYXJlbnQtPm9wcy0+bW1hcChtZGV2LCB2bWEpOworCXJldHVybiBvcHMtPm1tYXAo bWRldiwgdm1hKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2ZmlvX2RldmljZV9vcHMgdmZp b19tZGV2X2Rldl9vcHMgPSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21kZXYuaCBiL2lu Y2x1ZGUvbGludXgvbWRldi5oCmluZGV4IDc4YjY5ZDA5ZWI1NC4uOWUzNzUwNmQxOTg3IDEwMDY0 NAotLS0gYS9pbmNsdWRlL2xpbnV4L21kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21kZXYuaApA QCAtMTAsNyArMTAsMTMgQEAKICNpZm5kZWYgTURFVl9ICiAjZGVmaW5lIE1ERVZfSAogCisjaW5j bHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRl IDxsaW51eC9tZGV2Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC91dWlkLmg+CisKIHN0cnVjdCBt ZGV2X2RldmljZTsKK3N0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wczsKIAogLyoKICAqIENhbGxl ZCBieSB0aGUgcGFyZW50IGRldmljZSBkcml2ZXIgdG8gc2V0IHRoZSBkZXZpY2Ugd2hpY2ggcmVw cmVzZW50cwpAQCAtNDgsMzAgKzU0LDcgQEAgc3RydWN0IGRldmljZSAqbWRldl9nZXRfaW9tbXVf ZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgKgkJCUBtZGV2OiBtZGV2X2RldmljZSBkZXZp Y2Ugc3RydWN0dXJlIHdoaWNoIGlzIGJlaW5nCiAgKgkJCSAgICAgICBkZXN0cm95ZWQKICAqCQkJ UmV0dXJucyBpbnRlZ2VyOiBzdWNjZXNzICgwKSBvciBlcnJvciAoPCAwKQotICogQG9wZW46CQlP cGVuIG1lZGlhdGVkIGRldmljZS4KLSAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZS4KLSAqCQkJ UmV0dXJucyBpbnRlZ2VyOiBzdWNjZXNzICgwKSBvciBlcnJvciAoPCAwKQotICogQHJlbGVhc2U6 CQlyZWxlYXNlIG1lZGlhdGVkIGRldmljZQotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlLgot ICogQHJlYWQ6CQlSZWFkIGVtdWxhdGlvbiBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQg ZGV2aWNlIHN0cnVjdHVyZQotICoJCQlAYnVmOiByZWFkIGJ1ZmZlcgotICoJCQlAY291bnQ6IG51 bWJlciBvZiBieXRlcyB0byByZWFkCi0gKgkJCUBwcG9zOiBhZGRyZXNzLgotICoJCQlSZXR1bnMg bnVtYmVyIG9uIGJ5dGVzIHJlYWQgb24gc3VjY2VzcyBvciBlcnJvci4KLSAqIEB3cml0ZToJCVdy aXRlIGVtdWxhdGlvbiBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVj dHVyZQotICoJCQlAYnVmOiB3cml0ZSBidWZmZXIKLSAqCQkJQGNvdW50OiBudW1iZXIgb2YgYnl0 ZXMgdG8gYmUgd3JpdHRlbgotICoJCQlAcHBvczogYWRkcmVzcy4KLSAqCQkJUmV0dW5zIG51bWJl ciBvbiBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IuCi0gKiBAaW9jdGw6CQlJT0NU TCBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVjdHVyZQotICoJCQlA Y21kOiBpb2N0bCBjb21tYW5kCi0gKgkJCUBhcmc6IGFyZ3VtZW50cyB0byBpb2N0bAotICogQG1t YXA6CQltbWFwIGNhbGxiYWNrCi0gKgkJCUBtZGV2OiBtZWRpYXRlZCBkZXZpY2Ugc3RydWN0dXJl Ci0gKgkJCUB2bWE6IHZtYSBzdHJ1Y3R1cmUKKyAqCiAgKiBQYXJlbnQgZGV2aWNlIHRoYXQgc3Vw cG9ydCBtZWRpYXRlZCBkZXZpY2Ugc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCBtZGV2CiAgKiBt b2R1bGUgd2l0aCBtZGV2X3BhcmVudF9vcHMgc3RydWN0dXJlLgogICoqLwpAQCAtODMsMTUgKzY2 LDYgQEAgc3RydWN0IG1kZXZfcGFyZW50X29wcyB7CiAKIAlpbnQgICAgICgqY3JlYXRlKShzdHJ1 Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIAlpbnQgICAgICgq cmVtb3ZlKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpOwotCWludCAgICAgKCpvcGVuKShzdHJ1 Y3QgbWRldl9kZXZpY2UgKm1kZXYpOwotCXZvaWQgICAgKCpyZWxlYXNlKShzdHJ1Y3QgbWRldl9k ZXZpY2UgKm1kZXYpOwotCXNzaXplX3QgKCpyZWFkKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYs IGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0Jc3Np emVfdCAoKndyaXRlKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIGNvbnN0IGNoYXIgX191c2Vy ICpidWYsCi0JCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCWxvbmcJKCppb2N0bCko c3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJIHVuc2lnbmVk IGxvbmcgYXJnKTsKLQlpbnQJKCptbWFwKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHN0cnVj dCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIH07CiAKIC8qIGludGVyZmFjZSBmb3IgZXhwb3J0aW5n IG1kZXYgc3VwcG9ydGVkIHR5cGUgYXR0cmlidXRlcyAqLwpAQCAtMTM1LDYgKzEwOSw5IEBAIHZv aWQgKm1kZXZfZ2V0X2RydmRhdGEoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIHZvaWQgbWRl dl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHZvaWQgKmRhdGEpOwogY29u c3QgZ3VpZF90ICptZGV2X3V1aWQoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIHZvaWQgbWRl dl9zZXRfY2xhc3Moc3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1MTYgaWQpOwordm9pZCBtZGV2 X3NldF92ZmlvX29wcyhzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsCisJCSAgICAgICBjb25zdCBz dHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKnZmaW9fb3BzKTsKK2NvbnN0IHN0cnVjdCBtZGV2 X3ZmaW9fZGV2aWNlX29wcyAqbWRldl9nZXRfdmZpb19vcHMoc3RydWN0IG1kZXZfZGV2aWNlICpt ZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBtZGV2X2J1c190eXBlOwogCmRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21kZXZfdmZpb19vcHMuaCBiL2luY2x1ZGUvbGludXgvbWRldl92 ZmlvX29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMzE3NTE4 ZjMwNjIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZmaW9fb3BzLmgK QEAgLTAsMCArMSw1MiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eSAqLworLyoKKyAqIFZGSU8gTWVkaWF0ZWQgZGV2aWNlIGRlZmluaXRpb24KKyAqLworCisjaWZu ZGVmIE1ERVZfVkZJT19PUFNfSAorI2RlZmluZSBNREVWX1ZGSU9fT1BTX0gKKworI2luY2x1ZGUg PGxpbnV4L21kZXYuaD4KKworLyoqCisgKiBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgLSBT dHJ1Y3R1cmUgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgZWFjaAorICogbWRldiBkZXZpY2UgdG8gcmVn aXN0ZXIgdGhlIGRldmljZSB0byB2ZmlvLW1kZXYgbW9kdWxlLgorICoKKyAqIEBvcGVuOgkJT3Bl biBtZWRpYXRlZCBkZXZpY2UuCisgKgkJCUBtZGV2OiBtZWRpYXRlZCBkZXZpY2UuCisgKgkJCVJl dHVybnMgaW50ZWdlcjogc3VjY2VzcyAoMCkgb3IgZXJyb3IgKDwgMCkKKyAqIEByZWxlYXNlOgkJ cmVsZWFzZSBtZWRpYXRlZCBkZXZpY2UKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZS4KKyAq IEByZWFkOgkJUmVhZCBlbXVsYXRpb24gY2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRl dmljZSBzdHJ1Y3R1cmUKKyAqCQkJQGJ1ZjogcmVhZCBidWZmZXIKKyAqCQkJQGNvdW50OiBudW1i ZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoJCQlAcHBvczogYWRkcmVzcy4KKyAqCQkJUmV0dW5zIG51 bWJlciBvbiBieXRlcyByZWFkIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IuCisgKiBAd3JpdGU6CQlXcml0 ZSBlbXVsYXRpb24gY2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZSBzdHJ1Y3R1 cmUKKyAqCQkJQGJ1Zjogd3JpdGUgYnVmZmVyCisgKgkJCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVz IHRvIGJlIHdyaXR0ZW4KKyAqCQkJQHBwb3M6IGFkZHJlc3MuCisgKgkJCVJldHVucyBudW1iZXIg b24gYnl0ZXMgd3JpdHRlbiBvbiBzdWNjZXNzIG9yIGVycm9yLgorICogQGlvY3RsOgkJSU9DVEwg Y2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZSBzdHJ1Y3R1cmUKKyAqCQkJQGNt ZDogaW9jdGwgY29tbWFuZAorICoJCQlAYXJnOiBhcmd1bWVudHMgdG8gaW9jdGwKKyAqIEBtbWFw OgkJbW1hcCBjYWxsYmFjaworICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVjdHVyZQor ICoJCQlAdm1hOiB2bWEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29w cyB7CisJaW50ICAgICAoKm9wZW4pKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldik7CisJdm9pZCAg ICAoKnJlbGVhc2UpKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldik7CisJc3NpemVfdCAoKnJlYWQp KHN0cnVjdCBtZGV2X2RldmljZSAqbWRldiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBj b3VudCwgbG9mZl90ICpwcG9zKTsKKwlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBtZGV2X2Rldmlj ZSAqbWRldiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZf dCAqcHBvcyk7CisJbG9uZwkoKmlvY3RsKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHVuc2ln bmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpOworCWludAkoKm1tYXApKHN0cnVj dCBtZGV2X2RldmljZSAqbWRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworfTsKKwor I2VuZGlmCmRpZmYgLS1naXQgYS9zYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMuYyBiL3NhbXBsZXMv dmZpby1tZGV2L21ib2Nocy5jCmluZGV4IDExNWJjNTA3NDY1Ni4uMTI5NjM3NjdiYTM3IDEwMDY0 NAotLS0gYS9zYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMuYworKysgYi9zYW1wbGVzL3ZmaW8tbWRl di9tYm9jaHMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CiAj aW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tZGV2Lmg+CisjaW5jbHVk ZSA8bGludXgvbWRldl92ZmlvX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1 ZGUgPGxpbnV4L2RtYS1idWYuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC01MTYs NiArNTE3LDggQEAgc3RhdGljIGludCBtYm9jaHNfcmVzZXQoc3RydWN0IG1kZXZfZGV2aWNlICpt ZGV2KQogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZp Y2Vfb3BzIG1kZXZfdmZpb19vcHM7CisKIHN0YXRpYyBpbnQgbWJvY2hzX2NyZWF0ZShzdHJ1Y3Qg a29iamVjdCAqa29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCWNvbnN0IHN0cnVj dCBtYm9jaHNfdHlwZSAqdHlwZSA9IG1ib2Noc19maW5kX3R5cGUoa29iaik7CkBAIC01NjEsNyAr NTY0LDcgQEAgc3RhdGljIGludCBtYm9jaHNfY3JlYXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJbWJvY2hzX3Jlc2V0KG1kZXYpOwogCiAJbWJvY2hz X3VzZWRfbWJ5dGVzICs9IHR5cGUtPm1ieXRlczsKLQltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVW X0NMQVNTX0lEX1ZGSU8pOworCW1kZXZfc2V0X3ZmaW9fb3BzKG1kZXYsICZtZGV2X3ZmaW9fb3Bz KTsKIAlyZXR1cm4gMDsKIAogZXJyX21lbToKQEAgLTE0MTksMTIgKzE0MjIsNyBAQCBzdGF0aWMg c3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9 OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyBtZGV2X2ZvcHMgPSB7Ci0J Lm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkubWRldl9hdHRyX2dyb3Vwcwk9IG1kZXZfZGV2X2dy b3VwcywKLQkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBzCT0gbWRldl90eXBlX2dyb3VwcywKLQkuY3Jl YXRlCQkJPSBtYm9jaHNfY3JlYXRlLAotCS5yZW1vdmUJCQk9IG1ib2Noc19yZW1vdmUsCitzdGF0 aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzIG1kZXZfdmZpb19vcHMgPSB7CiAJ Lm9wZW4JCQk9IG1ib2Noc19vcGVuLAogCS5yZWxlYXNlCQk9IG1ib2Noc19jbG9zZSwKIAkucmVh ZAkJCT0gbWJvY2hzX3JlYWQsCkBAIC0xNDMzLDYgKzE0MzEsMTQgQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBtZGV2X3BhcmVudF9vcHMgbWRldl9mb3BzID0gewogCS5tbWFwCQkJPSBtYm9jaHNfbW1h cCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9 IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5tZGV2X2F0dHJfZ3JvdXBzCT0gbWRldl9k ZXZfZ3JvdXBzLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBtZGV2X3R5cGVfZ3JvdXBzLAor CS5jcmVhdGUJCQk9IG1ib2Noc19jcmVhdGUsCisJLnJlbW92ZQkJCT0gbWJvY2hzX3JlbW92ZSwK K307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZkX2ZvcHMgPSB7CiAJ Lm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdmZpby1tZGV2 L21kcHkuYyBiL3NhbXBsZXMvdmZpby1tZGV2L21kcHkuYwppbmRleCA2NjU2MTQ1NzRkNTAuLjUw ZWU2Yzk4YjJhZiAxMDA2NDQKLS0tIGEvc2FtcGxlcy92ZmlvLW1kZXYvbWRweS5jCisrKyBiL3Nh bXBsZXMvdmZpby1tZGV2L21kcHkuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4 L2lvbW11Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tZGV2 Lmg+CisjaW5jbHVkZSA8bGludXgvbWRldl92ZmlvX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bj aS5oPgogI2luY2x1ZGUgPGRybS9kcm1fZm91cmNjLmg+CiAjaW5jbHVkZSAibWRweS1kZWZzLmgi CkBAIC0yMjYsNiArMjI3LDggQEAgc3RhdGljIGludCBtZHB5X3Jlc2V0KHN0cnVjdCBtZGV2X2Rl dmljZSAqbWRldikKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGV2X3Zm aW9fZGV2aWNlX29wcyBtZGV2X3ZmaW9fb3BzOworCiBzdGF0aWMgaW50IG1kcHlfY3JlYXRlKHN0 cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiB7CiAJY29uc3Qg c3RydWN0IG1kcHlfdHlwZSAqdHlwZSA9IG1kcHlfZmluZF90eXBlKGtvYmopOwpAQCAtMjY5LDcg KzI3Miw3IEBAIHN0YXRpYyBpbnQgbWRweV9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0 cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAltZHB5X3Jlc2V0KG1kZXYpOwogCiAJbWRweV9jb3Vu dCsrOwotCW1kZXZfc2V0X2NsYXNzKG1kZXYsIE1ERVZfQ0xBU1NfSURfVkZJTyk7CisJbWRldl9z ZXRfdmZpb19vcHMobWRldiwgJm1kZXZfdmZpb19vcHMpOwogCXJldHVybiAwOwogfQogCkBAIC03 MjYsMTIgKzcyOSw3IEBAIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZGV2X3R5cGVf Z3JvdXBzW10gPSB7CiAJTlVMTCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJl bnRfb3BzIG1kZXZfZm9wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5tZGV2X2F0 dHJfZ3JvdXBzCT0gbWRldl9kZXZfZ3JvdXBzLAotCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBt ZGV2X3R5cGVfZ3JvdXBzLAotCS5jcmVhdGUJCQk9IG1kcHlfY3JlYXRlLAotCS5yZW1vdmUJCQk9 IG1kcHlfcmVtb3ZlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyBt ZGV2X3ZmaW9fb3BzID0gewogCS5vcGVuCQkJPSBtZHB5X29wZW4sCiAJLnJlbGVhc2UJCT0gbWRw eV9jbG9zZSwKIAkucmVhZAkJCT0gbWRweV9yZWFkLApAQCAtNzQwLDYgKzczOCwxNCBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyBtZGV2X2ZvcHMgPSB7CiAJLm1tYXAJCQk9 IG1kcHlfbW1hcCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1k ZXZfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5tZGV2X2F0dHJfZ3JvdXBz CT0gbWRldl9kZXZfZ3JvdXBzLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBtZGV2X3R5cGVf Z3JvdXBzLAorCS5jcmVhdGUJCQk9IG1kcHlfY3JlYXRlLAorCS5yZW1vdmUJCQk9IG1kcHlfcmVt b3ZlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmRfZm9wcyA9 IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy92Zmlv LW1kZXYvbXR0eS5jIGIvc2FtcGxlcy92ZmlvLW1kZXYvbXR0eS5jCmluZGV4IDkwZGExMmZmN2Zk OS4uYmU0NzZlN2FkMWY4IDEwMDY0NAotLS0gYS9zYW1wbGVzL3ZmaW8tbWRldi9tdHR5LmMKKysr IGIvc2FtcGxlcy92ZmlvLW1kZXYvbXR0eS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8 bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgv bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21kZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxsaW51 eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4 L3NlcmlhbF9yZWcuaD4KQEAgLTcwOCw2ICs3MDksOCBAQCBzdGF0aWMgc3NpemVfdCBtZGV2X2Fj Y2VzcyhzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHU4ICpidWYsIHNpemVfdCBjb3VudCwKIAly ZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3Bz IHZmaW9fZGV2X29wczsKKwogc3RhdGljIGludCBtdHR5X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAq a29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCXN0cnVjdCBtZGV2X3N0YXRlICpt ZGV2X3N0YXRlOwpAQCAtNzU1LDcgKzc1OCw3IEBAIHN0YXRpYyBpbnQgbXR0eV9jcmVhdGUoc3Ry dWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAlsaXN0X2FkZCgm bWRldl9zdGF0ZS0+bmV4dCwgJm1kZXZfZGV2aWNlc19saXN0KTsKIAltdXRleF91bmxvY2soJm1k ZXZfbGlzdF9sb2NrKTsKIAotCW1kZXZfc2V0X2NsYXNzKG1kZXYsIE1ERVZfQ0xBU1NfSURfVkZJ Tyk7CisJbWRldl9zZXRfdmZpb19vcHMobWRldiwgJnZmaW9fZGV2X29wcyk7CiAJcmV0dXJuIDA7 CiB9CiAKQEAgLTEzODgsNiArMTM5MSwxNCBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91 cCAqbWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzIHZmaW9fZGV2X29wcyA9IHsKKwkub3BlbgkJPSBtdHR5 X29wZW4sCisJLnJlbGVhc2UJPSBtdHR5X2Nsb3NlLAorCS5yZWFkCQk9IG10dHlfcmVhZCwKKwku d3JpdGUJCT0gbXR0eV93cml0ZSwKKwkuaW9jdGwJCT0gbXR0eV9pb2N0bCwKK307CisKIHN0YXRp YyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9IHsKIAkub3duZXIgICAg ICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5kZXZfYXR0cl9ncm91cHMgICAgICAgID0g bXR0eV9kZXZfZ3JvdXBzLApAQCAtMTM5NSwxMSArMTQwNiw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9IHsKIAkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBz ICA9IG1kZXZfdHlwZV9ncm91cHMsCiAJLmNyZWF0ZSAgICAgICAgICAgICAgICAgPSBtdHR5X2Ny ZWF0ZSwKIAkucmVtb3ZlCQkJPSBtdHR5X3JlbW92ZSwKLQkub3BlbiAgICAgICAgICAgICAgICAg ICA9IG10dHlfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgICAgICAgICA9IG10dHlfY2xvc2UsCi0J LnJlYWQgICAgICAgICAgICAgICAgICAgPSBtdHR5X3JlYWQsCi0JLndyaXRlICAgICAgICAgICAg ICAgICAgPSBtdHR5X3dyaXRlLAotCS5pb2N0bAkJICAgICAgICA9IG10dHlfaW9jdGwsCiB9Owog CiBzdGF0aWMgdm9pZCBtdHR5X2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLS0g CjIuMTkuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs 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 441E3C49EAB for ; Tue, 5 Nov 2019 09:36: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 21C61214B2 for ; Tue, 5 Nov 2019 09:36:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 21C61214B2 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 9153C6E967; Tue, 5 Nov 2019 09:36:44 +0000 (UTC) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3E03F6E96B for ; Tue, 5 Nov 2019 09:36:43 +0000 (UTC) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-205-SL5R8xcNNNaSYbYOfPc-pg-1; Tue, 05 Nov 2019 04:36:38 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 871BE8017DD; Tue, 5 Nov 2019 09:36:34 +0000 (UTC) Received: from jason-ThinkPad-X1-Carbon-6th.redhat.com (ovpn-12-252.pek2.redhat.com [10.72.12.252]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E6565C28C; Tue, 5 Nov 2019 09:35:23 +0000 (UTC) From: Jason Wang To: 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, mst@redhat.com, tiwei.bie@intel.com Date: Tue, 5 Nov 2019 17:32:37 +0800 Message-Id: <20191105093240.5135-4-jasowang@redhat.com> In-Reply-To: <20191105093240.5135-1-jasowang@redhat.com> References: <20191105093240.5135-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-MC-Unique: SL5R8xcNNNaSYbYOfPc-pg-1 X-Mimecast-Spam-Score: 0 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1572946602; 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=2x8V9gyXYk1AfWIMaSGj1lObBgUHnw7OWnFzCmlB8Cw=; b=WYjUZjCgkJnjJEF23vbKpPB/DiH0rXMIKvSmj0nFxmkuo2YqxPFit7ktfmopajMzNOSnxz ur6EE4DP9hRPvbJSgU4ifeiNDU3yXd1mOfUujrdmn+jK/B0SKEp5ryrCMpQjjZUa+eDjVX +lggoC8AbeeckzK8Mz2ags2Iq1KcTD4= Subject: [Intel-gfx] [PATCH V8 3/6] mdev: introduce device specific ops 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: christophe.de.dinechin@gmail.com, sebott@linux.ibm.com, airlied@linux.ie, Jason Wang , heiko.carstens@de.ibm.com, virtualization@lists.linux-foundation.org, rob.miller@broadcom.com, lulu@redhat.com, eperezma@redhat.com, pasic@linux.ibm.com, borntraeger@de.ibm.com, haotian.wang@sifive.com, farman@linux.ibm.com, idos@mellanox.com, gor@linux.ibm.com, cunming.liang@intel.com, xiao.w.wang@intel.com, freude@linux.ibm.com, parav@mellanox.com, zhihong.wang@intel.com, stefanha@redhat.com, akrowiak@linux.ibm.com, netdev@vger.kernel.org, cohuck@redhat.com, oberpar@linux.ibm.com, maxime.coquelin@redhat.com, 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: <20191105093237.hu3d4oyVg5vceUZqgVAae3KeeDlKBMVvU3Xp8H1YJYs@z> Q3VycmVudGx5LCBleGNlcHQgZm9yIHRoZSBjcmVhdGUgYW5kIHJlbW92ZSwgdGhlIHJlc3Qgb2YK bWRldl9wYXJlbnRfb3BzIGlzIGRlc2lnbmVkIGZvciB2ZmlvLW1kZXYgZHJpdmVyIG9ubHkgYW5k IG1heSBub3QgaGVscApmb3Iga2VybmVsIG1kZXYgZHJpdmVyLiBXaXRoIHRoZSBoZWxwIG9mIGNs YXNzIGlkLCB0aGlzIHBhdGNoCmludHJvZHVjZXMgZGV2aWNlIHNwZWNpZmljIGNhbGxiYWNrcyBp bnNpZGUgbWRldl9kZXZpY2UKc3RydWN0dXJlLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQgc2V0IG9m IGNhbGxiYWNrIHRvIGJlIHVzZWQgYnkKdmZpby1tZGV2IGFuZCB2aXJ0aW8tbWRldi4KClJldmll d2VkLWJ5OiBQYXJhdiBQYW5kaXQgPHBhcmF2QG1lbGxhbm94LmNvbT4KU2lnbmVkLW9mZi1ieTog SmFzb24gV2FuZyA8amFzb3dhbmdAcmVkaGF0LmNvbT4KLS0tCiAuLi4vZHJpdmVyLWFwaS92Zmlv LW1lZGlhdGVkLWRldmljZS5yc3QgICAgICAgfCAzNSArKysrKysrKystLS0tCiBNQUlOVEFJTkVS UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMSArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9ndnQva3ZtZ3QuYyAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiBkcml2ZXJzL3Mz OTAvY2lvL3ZmaW9fY2N3X29wcy5jICAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiBkcml2ZXJz L3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMgICAgICAgICAgICAgfCAxNCArKystLQogZHJpdmVy cy92ZmlvL21kZXYvbWRldl9jb3JlLmMgICAgICAgICAgICAgICAgIHwgMjQgKysrKysrKystCiBk cml2ZXJzL3ZmaW8vbWRldi9tZGV2X3ByaXZhdGUuaCAgICAgICAgICAgICAgfCAgNSArKwogZHJp dmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMgICAgICAgICAgICAgICAgIHwgMzcgKysrKysrLS0t LS0tLQogaW5jbHVkZS9saW51eC9tZGV2LmggICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDMg KysrKy0tLS0tLS0tLS0tCiBpbmNsdWRlL2xpbnV4L21kZXZfdmZpb19vcHMuaCAgICAgICAgICAg ICAgICAgfCA1MiArKysrKysrKysrKysrKysrKysrCiBzYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMu YyAgICAgICAgICAgICAgICAgICAgfCAyMCArKysrLS0tCiBzYW1wbGVzL3ZmaW8tbWRldi9tZHB5 LmMgICAgICAgICAgICAgICAgICAgICAgfCAyMCArKysrLS0tCiBzYW1wbGVzL3ZmaW8tbWRldi9t dHR5LmMgICAgICAgICAgICAgICAgICAgICAgfCAxOCArKysrLS0tCiAxMyBmaWxlcyBjaGFuZ2Vk LCAyMDYgaW5zZXJ0aW9ucygrKSwgOTkgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQg aW5jbHVkZS9saW51eC9tZGV2X3ZmaW9fb3BzLmgKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L2RyaXZlci1hcGkvdmZpby1tZWRpYXRlZC1kZXZpY2UucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2 ZXItYXBpL3ZmaW8tbWVkaWF0ZWQtZGV2aWNlLnJzdAppbmRleCA2NzA5NDEzYmVlMjkuLmUzNWYx ZjhmOTQ2ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3ZmaW8tbWVkaWF0 ZWQtZGV2aWNlLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvdmZpby1tZWRpYXRl ZC1kZXZpY2UucnN0CkBAIC0xNTIsMTUgKzE1Miw2IEBAIGNhbGxiYWNrcyBwZXIgbWRldiBwYXJl bnQgZGV2aWNlLCBwZXIgbWRldiB0eXBlLCBvciBhbnkgb3RoZXIgY2F0ZWdvcml6YXRpb24uCiBW ZW5kb3IgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gYmUgZnVsbHkgYXN5bmNocm9ub3VzIGluIHRo aXMgcmVzcGVjdCBvcgogcHJvdmlkZSB0aGVpciBvd24gaW50ZXJuYWwgcmVzb3VyY2UgcHJvdGVj dGlvbi4pCiAKLVRoZSBjYWxsYmFja3MgaW4gdGhlIG1kZXZfcGFyZW50X29wcyBzdHJ1Y3R1cmUg YXJlIGFzIGZvbGxvd3M6Ci0KLSogb3Blbjogb3BlbiBjYWxsYmFjayBvZiBtZWRpYXRlZCBkZXZp Y2UKLSogY2xvc2U6IGNsb3NlIGNhbGxiYWNrIG9mIG1lZGlhdGVkIGRldmljZQotKiBpb2N0bDog aW9jdGwgY2FsbGJhY2sgb2YgbWVkaWF0ZWQgZGV2aWNlCi0qIHJlYWQgOiByZWFkIGVtdWxhdGlv biBjYWxsYmFjawotKiB3cml0ZTogd3JpdGUgZW11bGF0aW9uIGNhbGxiYWNrCi0qIG1tYXA6IG1t YXAgZW11bGF0aW9uIGNhbGxiYWNrCi0KIEEgZHJpdmVyIHNob3VsZCB1c2UgdGhlIG1kZXZfcGFy ZW50X29wcyBzdHJ1Y3R1cmUgaW4gdGhlIGZ1bmN0aW9uIGNhbGwgdG8KIHJlZ2lzdGVyIGl0c2Vs ZiB3aXRoIHRoZSBtZGV2IGNvcmUgZHJpdmVyOjoKIApAQCAtMTcyLDEwICsxNjMsMzQgQEAgdGhh dCBhIGRyaXZlciBzaG91bGQgdXNlIHRvIHVucmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIG1kZXYg Y29yZSBkcml2ZXI6OgogCiAJZXh0ZXJuIHZvaWQgbWRldl91bnJlZ2lzdGVyX2RldmljZShzdHJ1 Y3QgZGV2aWNlICpkZXYpOwogCi1JdCBpcyBhbHNvIHJlcXVpcmVkIHRvIHNwZWNpZnkgdGhlIGNs YXNzX2lkIGluIGNyZWF0ZSgpIGNhbGxiYWNrIHRocm91Z2g6OgorQXMgbXVsdGlwbGUgdHlwZXMg b2YgbWVkaWF0ZWQgZGV2aWNlcyBtYXkgYmUgc3VwcG9ydGVkLCBjbGFzcyBpZCBuZWVkcwordG8g YmUgc3BlY2lmaWVkIGluIHRoZSBjcmVhdGUgY2FsbGJhY2soKS4gVGhpcyBjb3VsZCBiZSBkb25l CitleHBsaWNpdGx5IGZvciB0aGUgZGV2aWNlIHRoYXQgZG9lcyBub3QgdXNlIG9uIG1kZXYgYnVz IGZvciBpdHMKK29wZXJhdGlvbiB0aHJvdWdoOgogCiAJaW50IG1kZXZfc2V0X2NsYXNzKHN0cnVj dCBtZGV2X2RldmljZSAqbWRldiwgdTE2IGlkKTsKIAorRm9yIHRoZSBkZXZpY2UgdGhhdCB1c2Vz IG9uIHRoZSBtZGV2IGJ1cyBmb3IgaXRzIG9wZXJhdGlvbiwgdGhlIGNsYXNzCitzaG91bGQgcHJv dmlkZSBoZWxwZXIgZnVuY3Rpb24gdG8gc2V0IGNsYXNzIGlkIGFuZCBkZXZpY2Ugc3BlY2lmaWMK K29wcy4gRS5nIGZvciB2ZmlvLW1kZXYgZGV2aWNlcywgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxl ZCBpczo6CisKKwlpbnQgbWRldl9zZXRfdmZpb19vcHMoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2 LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19k ZXZpY2Vfb3BzICp2ZmlvX29wcyk7CisKK1RoZSBjbGFzcyBpZCAoc2V0IGJ5IHRoaXMgZnVuY3Rp b24gdG8gTURFVl9DTEFTU19JRF9WRklPKSBpcyB1c2VkIHRvCittYXRjaCBhIGRldmljZSB3aXRo IGFuIG1kZXYgZHJpdmVyIHZpYSBpdHMgaWQgdGFibGUuIFRoZSBkZXZpY2UKK3NwZWNpZmljIGNh bGxiYWNrcyAoc3BlY2lmaWVkIGluICp2ZmlvX29wcykgYXJlIG9idGFpbmFibGUgdmlhCittZGV2 X2dldF92ZmlvX29wcygpIChmb3IgdXNlIGJ5IHRoZSBtZGV2IGJ1cyBkcml2ZXIpLiBBIHZmaW8t bWRldgorZGV2aWNlIChjbGFzcyBpZCBNREVWX0NMQVNTX0lEX1ZGSU8pIHVzZXMgdGhlIGZvbGxv d2luZworZGV2aWNlLXNwZWNpZmljIG9wczoKKworKiBvcGVuOiBvcGVuIGNhbGxiYWNrIG9mIHZm aW8gbWVkaWF0ZWQgZGV2aWNlCisqIGNsb3NlOiBjbG9zZSBjYWxsYmFjayBvZiB2ZmlvIG1lZGlh dGVkIGRldmljZQorKiBpb2N0bDogaW9jdGwgY2FsbGJhY2sgb2YgdmZpbyBtZWRpYXRlZCBkZXZp Y2UKKyogcmVhZCA6IHJlYWQgZW11bGF0aW9uIGNhbGxiYWNrCisqIHdyaXRlOiB3cml0ZSBlbXVs YXRpb24gY2FsbGJhY2sKKyogbW1hcDogbW1hcCBlbXVsYXRpb24gY2FsbGJhY2sKKwogTWVkaWF0 ZWQgRGV2aWNlIE1hbmFnZW1lbnQgSW50ZXJmYWNlIFRocm91Z2ggc3lzZnMKID09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL01B SU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggY2JhMTA5NTU0N2ZkLi5mNjYxZDEzMzQ0ZDYg MTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xNzEyMSw2ICsx NzEyMSw3IEBAIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZHJpdmVyLWFwaS92Zmlv LW1lZGlhdGVkLWRldmljZS5yc3QKIEY6CWRyaXZlcnMvdmZpby9tZGV2LwogRjoJaW5jbHVkZS9s aW51eC9tZGV2LmgKK0Y6CWluY2x1ZGUvbGludXgvbWRldl92ZmlvX29wcy5oCiBGOglzYW1wbGVz L3ZmaW8tbWRldi8KIAogVkZJTyBQTEFURk9STSBEUklWRVIKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d2dC9rdm1ndC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Z0L2t2bWd0 LmMKaW5kZXggNjQyMGYwZGJkMzFiLi42NjJmM2E2NzIzNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2d2dC9rdm1ndC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9r dm1ndC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNp bmNsdWRlIDxsaW51eC92ZmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWRldi5oPgorI2luY2x1ZGUg PGxpbnV4L21kZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAKICNp bmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KQEAgLTY0Myw2ICs2NDQsOCBAQCBzdGF0aWMgdm9pZCBr dm1ndF9wdXRfdmZpb19kZXZpY2Uodm9pZCAqdmdwdSkKIAl2ZmlvX2RldmljZV9wdXQoKChzdHJ1 Y3QgaW50ZWxfdmdwdSAqKXZncHUpLT52ZGV2LnZmaW9fZGV2aWNlKTsKIH0KIAorc3RhdGljIGNv bnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyBpbnRlbF92ZmlvX3ZncHVfZGV2X29wczsK Kwogc3RhdGljIGludCBpbnRlbF92Z3B1X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3Ry dWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCXN0cnVjdCBpbnRlbF92Z3B1ICp2Z3B1ID0gTlVM TDsKQEAgLTY3OCw3ICs2ODEsNyBAQCBzdGF0aWMgaW50IGludGVsX3ZncHVfY3JlYXRlKHN0cnVj dCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJCSAgICAgZGV2X25h bWUobWRldl9kZXYobWRldikpKTsKIAlyZXQgPSAwOwogCi0JbWRldl9zZXRfY2xhc3MobWRldiwg TURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2X3NldF92ZmlvX29wcyhtZGV2LCAmaW50ZWxfdmZp b192Z3B1X2Rldl9vcHMpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNTk5LDIwICsxNjAy LDIxIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICppbnRlbF92Z3B1X2dy b3Vwc1tdID0gewogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IG1kZXZfcGFyZW50X29wcyBp bnRlbF92Z3B1X29wcyA9IHsKLQkubWRldl9hdHRyX2dyb3VwcyAgICAgICA9IGludGVsX3ZncHVf Z3JvdXBzLAotCS5jcmVhdGUJCQk9IGludGVsX3ZncHVfY3JlYXRlLAotCS5yZW1vdmUJCQk9IGlu dGVsX3ZncHVfcmVtb3ZlLAotCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vf b3BzIGludGVsX3ZmaW9fdmdwdV9kZXZfb3BzID0gewogCS5vcGVuCQkJPSBpbnRlbF92Z3B1X29w ZW4sCiAJLnJlbGVhc2UJCT0gaW50ZWxfdmdwdV9yZWxlYXNlLAotCiAJLnJlYWQJCQk9IGludGVs X3ZncHVfcmVhZCwKIAkud3JpdGUJCQk9IGludGVsX3ZncHVfd3JpdGUsCiAJLm1tYXAJCQk9IGlu dGVsX3ZncHVfbW1hcCwKIAkuaW9jdGwJCQk9IGludGVsX3ZncHVfaW9jdGwsCiB9OwogCitzdGF0 aWMgc3RydWN0IG1kZXZfcGFyZW50X29wcyBpbnRlbF92Z3B1X29wcyA9IHsKKwkubWRldl9hdHRy X2dyb3VwcyAgICAgICA9IGludGVsX3ZncHVfZ3JvdXBzLAorCS5jcmVhdGUJCQk9IGludGVsX3Zn cHVfY3JlYXRlLAorCS5yZW1vdmUJCQk9IGludGVsX3ZncHVfcmVtb3ZlLAorfTsKKwogc3RhdGlj IGludCBrdm1ndF9ob3N0X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpndnQsIGNvbnN0 IHZvaWQgKm9wcykKIHsKIAlzdHJ1Y3QgYXR0cmlidXRlICoqa3ZtX3R5cGVfYXR0cnM7CmRpZmYg LS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3ZmaW9fY2N3X29wcy5jIGIvZHJpdmVycy9zMzkwL2Np by92ZmlvX2Njd19vcHMuYwppbmRleCBjZjJjMDEzYWUzMmYuLmZhNDczZGVkNzFjNyAxMDA2NDQK LS0tIGEvZHJpdmVycy9zMzkwL2Npby92ZmlvX2Njd19vcHMuYworKysgYi9kcml2ZXJzL3MzOTAv Y2lvL3ZmaW9fY2N3X29wcy5jCkBAIC0xMiw2ICsxMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC92 ZmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21kZXZfdmZp b19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ub3NwZWMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+CiAKQEAgLTExMCw2ICsxMTEsOCBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAq bWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0 IG1kZXZfdmZpb19kZXZpY2Vfb3BzIG1kZXZfdmZpb19vcHM7CisKIHN0YXRpYyBpbnQgdmZpb19j Y3dfbWRldl9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBtZGV2X2RldmljZSAq bWRldikKIHsKIAlzdHJ1Y3QgdmZpb19jY3dfcHJpdmF0ZSAqcHJpdmF0ZSA9CkBAIC0xMjksNyAr MTMyLDcgQEAgc3RhdGljIGludCB2ZmlvX2Njd19tZGV2X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAq a29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogCQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hp ZC5zc2lkLAogCQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hpZC5zY2hfbm8pOwogCi0JbWRldl9zZXRf Y2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2X3NldF92ZmlvX29wcyhtZGV2 LCAmbWRldl92ZmlvX29wcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU3NSwxMSArNTc4LDcgQEAg c3RhdGljIHNzaXplX3QgdmZpb19jY3dfbWRldl9pb2N0bChzdHJ1Y3QgbWRldl9kZXZpY2UgKm1k ZXYsCiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Nj d19tZGV2X29wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5zdXBwb3J0ZWRfdHlw ZV9ncm91cHMgID0gbWRldl90eXBlX2dyb3VwcywKLQkuY3JlYXRlCQkJPSB2ZmlvX2Njd19tZGV2 X2NyZWF0ZSwKLQkucmVtb3ZlCQkJPSB2ZmlvX2Njd19tZGV2X3JlbW92ZSwKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgbWRldl92ZmlvX29wcyA9IHsKIAkub3BlbgkJ CT0gdmZpb19jY3dfbWRldl9vcGVuLAogCS5yZWxlYXNlCQk9IHZmaW9fY2N3X21kZXZfcmVsZWFz ZSwKIAkucmVhZAkJCT0gdmZpb19jY3dfbWRldl9yZWFkLApAQCAtNTg3LDYgKzU4NiwxMyBAQCBz dGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Njd19tZGV2X29wcyA9IHsK IAkuaW9jdGwJCQk9IHZmaW9fY2N3X21kZXZfaW9jdGwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG1kZXZfcGFyZW50X29wcyB2ZmlvX2Njd19tZGV2X29wcyA9IHsKKwkub3duZXIJCQk9IFRI SVNfTU9EVUxFLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMgID0gbWRldl90eXBlX2dyb3VwcywK KwkuY3JlYXRlCQkJPSB2ZmlvX2Njd19tZGV2X2NyZWF0ZSwKKwkucmVtb3ZlCQkJPSB2ZmlvX2Nj d19tZGV2X3JlbW92ZSwKK307CisKIGludCB2ZmlvX2Njd19tZGV2X3JlZyhzdHJ1Y3Qgc3ViY2hh bm5lbCAqc2NoKQogewogCXJldHVybiBtZGV2X3JlZ2lzdGVyX2RldmljZSgmc2NoLT5kZXYsICZ2 ZmlvX2Njd19tZGV2X29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9f YXBfb3BzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMKaW5kZXggMDdjMzEw NzBhZmViLi43YmRjNjIzOTMxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vdmZp b19hcF9vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMKQEAgLTE2 LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9r dm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21k ZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxhc20va3ZtLmg+CiAjaW5jbHVkZSA8YXNtL3pjcnlw dC5oPgogCkBAIC0zMjEsNiArMzIyLDggQEAgc3RhdGljIHZvaWQgdmZpb19hcF9tYXRyaXhfaW5p dChzdHJ1Y3QgYXBfY29uZmlnX2luZm8gKmluZm8sCiAJbWF0cml4LT5hZG1fbWF4ID0gaW5mby0+ YXB4YSA/IGluZm8tPk5kIDogMTU7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl92Zmlv X2RldmljZV9vcHMgbWRldl92ZmlvX29wczsKKwogc3RhdGljIGludCB2ZmlvX2FwX21kZXZfY3Jl YXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiB7CiAJ c3RydWN0IGFwX21hdHJpeF9tZGV2ICptYXRyaXhfbWRldjsKQEAgLTM0Myw3ICszNDYsNyBAQCBz dGF0aWMgaW50IHZmaW9fYXBfbWRldl9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVj dCBtZGV2X2RldmljZSAqbWRldikKIAlsaXN0X2FkZCgmbWF0cml4X21kZXYtPm5vZGUsICZtYXRy aXhfZGV2LT5tZGV2X2xpc3QpOwogCW11dGV4X3VubG9jaygmbWF0cml4X2Rldi0+bG9jayk7CiAK LQltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVWX0NMQVNTX0lEX1ZGSU8pOworCW1kZXZfc2V0X3Zm aW9fb3BzKG1kZXYsICZtZGV2X3ZmaW9fb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI4MSwx NSArMTI4NCwxOCBAQCBzdGF0aWMgc3NpemVfdCB2ZmlvX2FwX21kZXZfaW9jdGwoc3RydWN0IG1k ZXZfZGV2aWNlICptZGV2LAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg bWRldl92ZmlvX2RldmljZV9vcHMgbWRldl92ZmlvX29wcyA9IHsKKwkub3BlbgkJCT0gdmZpb19h cF9tZGV2X29wZW4sCisJLnJlbGVhc2UJCT0gdmZpb19hcF9tZGV2X3JlbGVhc2UsCisJLmlvY3Rs CQkJPSB2ZmlvX2FwX21kZXZfaW9jdGwsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZf cGFyZW50X29wcyB2ZmlvX2FwX21hdHJpeF9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVM RSwKIAkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBzCT0gdmZpb19hcF9tZGV2X3R5cGVfZ3JvdXBzLAog CS5tZGV2X2F0dHJfZ3JvdXBzCT0gdmZpb19hcF9tZGV2X2F0dHJfZ3JvdXBzLAogCS5jcmVhdGUJ CQk9IHZmaW9fYXBfbWRldl9jcmVhdGUsCiAJLnJlbW92ZQkJCT0gdmZpb19hcF9tZGV2X3JlbW92 ZSwKLQkub3BlbgkJCT0gdmZpb19hcF9tZGV2X29wZW4sCi0JLnJlbGVhc2UJCT0gdmZpb19hcF9t ZGV2X3JlbGVhc2UsCi0JLmlvY3RsCQkJPSB2ZmlvX2FwX21kZXZfaW9jdGwsCiB9OwogCiBpbnQg dmZpb19hcF9tZGV2X3JlZ2lzdGVyKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vbWRl di9tZGV2X2NvcmUuYyBiL2RyaXZlcnMvdmZpby9tZGV2L21kZXZfY29yZS5jCmluZGV4IDdiZmEy ZTQ2ZTgyOS4uNGU3MGYxOWFjMTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2 X2NvcmUuYworKysgYi9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X2NvcmUuYwpAQCAtNDcsNyArNDcs OCBAQCBFWFBPUlRfU1lNQk9MKG1kZXZfc2V0X2RydmRhdGEpOwogCiAvKgogICogU3BlY2lmeSB0 aGUgY2xhc3MgZm9yIHRoZSBtZGV2IGRldmljZSwgdGhpcyBtdXN0IGJlIGNhbGxlZCBkdXJpbmcK LSAqIGNyZWF0ZSgpIGNhbGxiYWNrLgorICogY3JlYXRlKCkgY2FsbGJhY2sgZXhwbGljaXRseSBv ciBpbXBsaWNpdGx5IHRocm91Z2ggdGhlIGhlbHBlcnMKKyAqIHByb3ZpZGVkIGJ5IGVhY2ggY2xh c3MuCiAgKi8KIHZvaWQgbWRldl9zZXRfY2xhc3Moc3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1 MTYgaWQpCiB7CkBAIC01Niw2ICs1NywyNyBAQCB2b2lkIG1kZXZfc2V0X2NsYXNzKHN0cnVjdCBt ZGV2X2RldmljZSAqbWRldiwgdTE2IGlkKQogfQogRVhQT1JUX1NZTUJPTChtZGV2X3NldF9jbGFz cyk7CiAKKy8qCisgKiBTcGVjaWZ5IHRoZSBtZGV2IGRldmljZSB0byBiZSBhIFZGSU8gbWRldiBk ZXZpY2UsIGFuZCBzZXQgVkZJTworICogZGV2aWNlIG9wcyBmb3IgaXQuIFRoaXMgbXVzdCBiZSBj YWxsZWQgZnJvbSB0aGUgY3JlYXRlKCkgY2FsbGJhY2sKKyAqIGZvciBWRklPIG1kZXYgZGV2aWNl LgorICovCit2b2lkIG1kZXZfc2V0X3ZmaW9fb3BzKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldiwK KwkJICAgICAgIGNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqdmZpb19vcHMpCit7 CisJbWRldl9zZXRfY2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsKKwltZGV2LT52Zmlv X29wcyA9IHZmaW9fb3BzOworfQorRVhQT1JUX1NZTUJPTChtZGV2X3NldF92ZmlvX29wcyk7CisK Ky8qIEdldCB0aGUgVkZJTyBkZXZpY2Ugb3BzIGZvciB0aGUgbWRldiBkZXZpY2UuICovCitjb25z dCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKm1kZXZfZ2V0X3ZmaW9fb3BzKHN0cnVjdCBt ZGV2X2RldmljZSAqbWRldikKK3sKKwlXQVJOX09OKG1kZXYtPmNsYXNzX2lkICE9IE1ERVZfQ0xB U1NfSURfVkZJTyk7CisJcmV0dXJuIG1kZXYtPnZmaW9fb3BzOworfQorRVhQT1JUX1NZTUJPTCht ZGV2X2dldF92ZmlvX29wcyk7CisKIHN0cnVjdCBkZXZpY2UgKm1kZXZfZGV2KHN0cnVjdCBtZGV2 X2RldmljZSAqbWRldikKIHsKIAlyZXR1cm4gJm1kZXYtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oIGIvZHJpdmVycy92ZmlvL21kZXYvbWRldl9wcml2 YXRlLmgKaW5kZXggYzY1ZjQzNmMxODY5Li40MTEyMjczNzM2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvdmZpby9tZGV2L21kZXZf cHJpdmF0ZS5oCkBAIC0xMCw2ICsxMCw4IEBACiAjaWZuZGVmIE1ERVZfUFJJVkFURV9ICiAjZGVm aW5lIE1ERVZfUFJJVkFURV9ICiAKKyNpbmNsdWRlIDxsaW51eC9tZGV2X3ZmaW9fb3BzLmg+CisK IGludCAgbWRldl9idXNfcmVnaXN0ZXIodm9pZCk7CiB2b2lkIG1kZXZfYnVzX3VucmVnaXN0ZXIo dm9pZCk7CiAKQEAgLTM0LDYgKzM2LDkgQEAgc3RydWN0IG1kZXZfZGV2aWNlIHsKIAlzdHJ1Y3Qg ZGV2aWNlICppb21tdV9kZXZpY2U7CiAJYm9vbCBhY3RpdmU7CiAJdTE2IGNsYXNzX2lkOworCXVu aW9uIHsKKwkJY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzICp2ZmlvX29wczsKKwl9 OwogfTsKIAogI2RlZmluZSB0b19tZGV2X2RldmljZShkZXYpCWNvbnRhaW5lcl9vZihkZXYsIHN0 cnVjdCBtZGV2X2RldmljZSwgZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL21kZXYvdmZp b19tZGV2LmMgYi9kcml2ZXJzL3ZmaW8vbWRldi92ZmlvX21kZXYuYwppbmRleCBhNjY0MWNkOGI1 YTMuLmMwMWUyMTk0ZTRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2 LmMKKysrIGIvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMKQEAgLTE0LDYgKzE0LDcgQEAK ICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmZpby5oPgogI2luY2x1 ZGUgPGxpbnV4L21kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tZGV2X3ZmaW9fb3BzLmg+CiAKICNp bmNsdWRlICJtZGV2X3ByaXZhdGUuaCIKIApAQCAtMjQsMTYgKzI1LDE2IEBACiBzdGF0aWMgaW50 IHZmaW9fbWRldl9vcGVuKHZvaWQgKmRldmljZV9kYXRhKQogewogCXN0cnVjdCBtZGV2X2Rldmlj ZSAqbWRldiA9IGRldmljZV9kYXRhOwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRl di0+cGFyZW50OworCWNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRl dl9nZXRfdmZpb19vcHMobWRldik7CiAJaW50IHJldDsKIAotCWlmICh1bmxpa2VseSghcGFyZW50 LT5vcHMtPm9wZW4pKQorCWlmICh1bmxpa2VseSghb3BzLT5vcGVuKSkKIAkJcmV0dXJuIC1FSU5W QUw7CiAKIAlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKIAkJcmV0dXJuIC1FTk9E RVY7CiAKLQlyZXQgPSBwYXJlbnQtPm9wcy0+b3BlbihtZGV2KTsKKwlyZXQgPSBvcHMtPm9wZW4o bWRldik7CiAJaWYgKHJldCkKIAkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAKQEAgLTQzLDEw ICs0NCwxMCBAQCBzdGF0aWMgaW50IHZmaW9fbWRldl9vcGVuKHZvaWQgKmRldmljZV9kYXRhKQog c3RhdGljIHZvaWQgdmZpb19tZGV2X3JlbGVhc2Uodm9pZCAqZGV2aWNlX2RhdGEpCiB7CiAJc3Ry dWN0IG1kZXZfZGV2aWNlICptZGV2ID0gZGV2aWNlX2RhdGE7Ci0Jc3RydWN0IG1kZXZfcGFyZW50 ICpwYXJlbnQgPSBtZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vf b3BzICpvcHMgPSBtZGV2X2dldF92ZmlvX29wcyhtZGV2KTsKIAotCWlmIChsaWtlbHkocGFyZW50 LT5vcHMtPnJlbGVhc2UpKQotCQlwYXJlbnQtPm9wcy0+cmVsZWFzZShtZGV2KTsKKwlpZiAobGlr ZWx5KG9wcy0+cmVsZWFzZSkpCisJCW9wcy0+cmVsZWFzZShtZGV2KTsKIAogCW1vZHVsZV9wdXQo VEhJU19NT0RVTEUpOwogfQpAQCAtNTUsNDcgKzU2LDQ3IEBAIHN0YXRpYyBsb25nIHZmaW9fbWRl dl91bmxvY2tlZF9pb2N0bCh2b2lkICpkZXZpY2VfZGF0YSwKIAkJCQkgICAgIHVuc2lnbmVkIGlu dCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9 IGRldmljZV9kYXRhOwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRldi0+cGFyZW50 OworCWNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRldl9nZXRfdmZp b19vcHMobWRldik7CiAKLQlpZiAodW5saWtlbHkoIXBhcmVudC0+b3BzLT5pb2N0bCkpCisJaWYg KHVubGlrZWx5KCFvcHMtPmlvY3RsKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFy ZW50LT5vcHMtPmlvY3RsKG1kZXYsIGNtZCwgYXJnKTsKKwlyZXR1cm4gb3BzLT5pb2N0bChtZGV2 LCBjbWQsIGFyZyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHZmaW9fbWRldl9yZWFkKHZvaWQgKmRl dmljZV9kYXRhLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2Zm X3QgKnBwb3MpCiB7CiAJc3RydWN0IG1kZXZfZGV2aWNlICptZGV2ID0gZGV2aWNlX2RhdGE7Ci0J c3RydWN0IG1kZXZfcGFyZW50ICpwYXJlbnQgPSBtZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0 IG1kZXZfdmZpb19kZXZpY2Vfb3BzICpvcHMgPSBtZGV2X2dldF92ZmlvX29wcyhtZGV2KTsKIAot CWlmICh1bmxpa2VseSghcGFyZW50LT5vcHMtPnJlYWQpKQorCWlmICh1bmxpa2VseSghb3BzLT5y ZWFkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFyZW50LT5vcHMtPnJlYWQobWRl diwgYnVmLCBjb3VudCwgcHBvcyk7CisJcmV0dXJuIG9wcy0+cmVhZChtZGV2LCBidWYsIGNvdW50 LCBwcG9zKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdmZpb19tZGV2X3dyaXRlKHZvaWQgKmRldmlj ZV9kYXRhLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwg bG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9IGRldmljZV9kYXRh OwotCXN0cnVjdCBtZGV2X3BhcmVudCAqcGFyZW50ID0gbWRldi0+cGFyZW50OworCWNvbnN0IHN0 cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyAqb3BzID0gbWRldl9nZXRfdmZpb19vcHMobWRldik7 CiAKLQlpZiAodW5saWtlbHkoIXBhcmVudC0+b3BzLT53cml0ZSkpCisJaWYgKHVubGlrZWx5KCFv cHMtPndyaXRlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcGFyZW50LT5vcHMtPndy aXRlKG1kZXYsIGJ1ZiwgY291bnQsIHBwb3MpOworCXJldHVybiBvcHMtPndyaXRlKG1kZXYsIGJ1 ZiwgY291bnQsIHBwb3MpOwogfQogCiBzdGF0aWMgaW50IHZmaW9fbWRldl9tbWFwKHZvaWQgKmRl dmljZV9kYXRhLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgbWRldl9k ZXZpY2UgKm1kZXYgPSBkZXZpY2VfZGF0YTsKLQlzdHJ1Y3QgbWRldl9wYXJlbnQgKnBhcmVudCA9 IG1kZXYtPnBhcmVudDsKKwljb25zdCBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKm9wcyA9 IG1kZXZfZ2V0X3ZmaW9fb3BzKG1kZXYpOwogCi0JaWYgKHVubGlrZWx5KCFwYXJlbnQtPm9wcy0+ bW1hcCkpCisJaWYgKHVubGlrZWx5KCFvcHMtPm1tYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAot CXJldHVybiBwYXJlbnQtPm9wcy0+bW1hcChtZGV2LCB2bWEpOworCXJldHVybiBvcHMtPm1tYXAo bWRldiwgdm1hKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2ZmlvX2RldmljZV9vcHMgdmZp b19tZGV2X2Rldl9vcHMgPSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21kZXYuaCBiL2lu Y2x1ZGUvbGludXgvbWRldi5oCmluZGV4IDc4YjY5ZDA5ZWI1NC4uOWUzNzUwNmQxOTg3IDEwMDY0 NAotLS0gYS9pbmNsdWRlL2xpbnV4L21kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21kZXYuaApA QCAtMTAsNyArMTAsMTMgQEAKICNpZm5kZWYgTURFVl9ICiAjZGVmaW5lIE1ERVZfSAogCisjaW5j bHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRl IDxsaW51eC9tZGV2Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC91dWlkLmg+CisKIHN0cnVjdCBt ZGV2X2RldmljZTsKK3N0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wczsKIAogLyoKICAqIENhbGxl ZCBieSB0aGUgcGFyZW50IGRldmljZSBkcml2ZXIgdG8gc2V0IHRoZSBkZXZpY2Ugd2hpY2ggcmVw cmVzZW50cwpAQCAtNDgsMzAgKzU0LDcgQEAgc3RydWN0IGRldmljZSAqbWRldl9nZXRfaW9tbXVf ZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAgKgkJCUBtZGV2OiBtZGV2X2RldmljZSBkZXZp Y2Ugc3RydWN0dXJlIHdoaWNoIGlzIGJlaW5nCiAgKgkJCSAgICAgICBkZXN0cm95ZWQKICAqCQkJ UmV0dXJucyBpbnRlZ2VyOiBzdWNjZXNzICgwKSBvciBlcnJvciAoPCAwKQotICogQG9wZW46CQlP cGVuIG1lZGlhdGVkIGRldmljZS4KLSAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZS4KLSAqCQkJ UmV0dXJucyBpbnRlZ2VyOiBzdWNjZXNzICgwKSBvciBlcnJvciAoPCAwKQotICogQHJlbGVhc2U6 CQlyZWxlYXNlIG1lZGlhdGVkIGRldmljZQotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlLgot ICogQHJlYWQ6CQlSZWFkIGVtdWxhdGlvbiBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQg ZGV2aWNlIHN0cnVjdHVyZQotICoJCQlAYnVmOiByZWFkIGJ1ZmZlcgotICoJCQlAY291bnQ6IG51 bWJlciBvZiBieXRlcyB0byByZWFkCi0gKgkJCUBwcG9zOiBhZGRyZXNzLgotICoJCQlSZXR1bnMg bnVtYmVyIG9uIGJ5dGVzIHJlYWQgb24gc3VjY2VzcyBvciBlcnJvci4KLSAqIEB3cml0ZToJCVdy aXRlIGVtdWxhdGlvbiBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVj dHVyZQotICoJCQlAYnVmOiB3cml0ZSBidWZmZXIKLSAqCQkJQGNvdW50OiBudW1iZXIgb2YgYnl0 ZXMgdG8gYmUgd3JpdHRlbgotICoJCQlAcHBvczogYWRkcmVzcy4KLSAqCQkJUmV0dW5zIG51bWJl ciBvbiBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IuCi0gKiBAaW9jdGw6CQlJT0NU TCBjYWxsYmFjawotICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVjdHVyZQotICoJCQlA Y21kOiBpb2N0bCBjb21tYW5kCi0gKgkJCUBhcmc6IGFyZ3VtZW50cyB0byBpb2N0bAotICogQG1t YXA6CQltbWFwIGNhbGxiYWNrCi0gKgkJCUBtZGV2OiBtZWRpYXRlZCBkZXZpY2Ugc3RydWN0dXJl Ci0gKgkJCUB2bWE6IHZtYSBzdHJ1Y3R1cmUKKyAqCiAgKiBQYXJlbnQgZGV2aWNlIHRoYXQgc3Vw cG9ydCBtZWRpYXRlZCBkZXZpY2Ugc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCBtZGV2CiAgKiBt b2R1bGUgd2l0aCBtZGV2X3BhcmVudF9vcHMgc3RydWN0dXJlLgogICoqLwpAQCAtODMsMTUgKzY2 LDYgQEAgc3RydWN0IG1kZXZfcGFyZW50X29wcyB7CiAKIAlpbnQgICAgICgqY3JlYXRlKShzdHJ1 Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIAlpbnQgICAgICgq cmVtb3ZlKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpOwotCWludCAgICAgKCpvcGVuKShzdHJ1 Y3QgbWRldl9kZXZpY2UgKm1kZXYpOwotCXZvaWQgICAgKCpyZWxlYXNlKShzdHJ1Y3QgbWRldl9k ZXZpY2UgKm1kZXYpOwotCXNzaXplX3QgKCpyZWFkKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYs IGNoYXIgX191c2VyICpidWYsCi0JCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0Jc3Np emVfdCAoKndyaXRlKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIGNvbnN0IGNoYXIgX191c2Vy ICpidWYsCi0JCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCWxvbmcJKCppb2N0bCko c3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJIHVuc2lnbmVk IGxvbmcgYXJnKTsKLQlpbnQJKCptbWFwKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHN0cnVj dCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIH07CiAKIC8qIGludGVyZmFjZSBmb3IgZXhwb3J0aW5n IG1kZXYgc3VwcG9ydGVkIHR5cGUgYXR0cmlidXRlcyAqLwpAQCAtMTM1LDYgKzEwOSw5IEBAIHZv aWQgKm1kZXZfZ2V0X2RydmRhdGEoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIHZvaWQgbWRl dl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHZvaWQgKmRhdGEpOwogY29u c3QgZ3VpZF90ICptZGV2X3V1aWQoc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KTsKIHZvaWQgbWRl dl9zZXRfY2xhc3Moc3RydWN0IG1kZXZfZGV2aWNlICptZGV2LCB1MTYgaWQpOwordm9pZCBtZGV2 X3NldF92ZmlvX29wcyhzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsCisJCSAgICAgICBjb25zdCBz dHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgKnZmaW9fb3BzKTsKK2NvbnN0IHN0cnVjdCBtZGV2 X3ZmaW9fZGV2aWNlX29wcyAqbWRldl9nZXRfdmZpb19vcHMoc3RydWN0IG1kZXZfZGV2aWNlICpt ZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBtZGV2X2J1c190eXBlOwogCmRpZmYgLS1n aXQgYS9pbmNsdWRlL2xpbnV4L21kZXZfdmZpb19vcHMuaCBiL2luY2x1ZGUvbGludXgvbWRldl92 ZmlvX29wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMzE3NTE4 ZjMwNjIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZGV2X3ZmaW9fb3BzLmgK QEAgLTAsMCArMSw1MiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25s eSAqLworLyoKKyAqIFZGSU8gTWVkaWF0ZWQgZGV2aWNlIGRlZmluaXRpb24KKyAqLworCisjaWZu ZGVmIE1ERVZfVkZJT19PUFNfSAorI2RlZmluZSBNREVWX1ZGSU9fT1BTX0gKKworI2luY2x1ZGUg PGxpbnV4L21kZXYuaD4KKworLyoqCisgKiBzdHJ1Y3QgbWRldl92ZmlvX2RldmljZV9vcHMgLSBT dHJ1Y3R1cmUgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgZWFjaAorICogbWRldiBkZXZpY2UgdG8gcmVn aXN0ZXIgdGhlIGRldmljZSB0byB2ZmlvLW1kZXYgbW9kdWxlLgorICoKKyAqIEBvcGVuOgkJT3Bl biBtZWRpYXRlZCBkZXZpY2UuCisgKgkJCUBtZGV2OiBtZWRpYXRlZCBkZXZpY2UuCisgKgkJCVJl dHVybnMgaW50ZWdlcjogc3VjY2VzcyAoMCkgb3IgZXJyb3IgKDwgMCkKKyAqIEByZWxlYXNlOgkJ cmVsZWFzZSBtZWRpYXRlZCBkZXZpY2UKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZS4KKyAq IEByZWFkOgkJUmVhZCBlbXVsYXRpb24gY2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRl dmljZSBzdHJ1Y3R1cmUKKyAqCQkJQGJ1ZjogcmVhZCBidWZmZXIKKyAqCQkJQGNvdW50OiBudW1i ZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoJCQlAcHBvczogYWRkcmVzcy4KKyAqCQkJUmV0dW5zIG51 bWJlciBvbiBieXRlcyByZWFkIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IuCisgKiBAd3JpdGU6CQlXcml0 ZSBlbXVsYXRpb24gY2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZSBzdHJ1Y3R1 cmUKKyAqCQkJQGJ1Zjogd3JpdGUgYnVmZmVyCisgKgkJCUBjb3VudDogbnVtYmVyIG9mIGJ5dGVz IHRvIGJlIHdyaXR0ZW4KKyAqCQkJQHBwb3M6IGFkZHJlc3MuCisgKgkJCVJldHVucyBudW1iZXIg b24gYnl0ZXMgd3JpdHRlbiBvbiBzdWNjZXNzIG9yIGVycm9yLgorICogQGlvY3RsOgkJSU9DVEwg Y2FsbGJhY2sKKyAqCQkJQG1kZXY6IG1lZGlhdGVkIGRldmljZSBzdHJ1Y3R1cmUKKyAqCQkJQGNt ZDogaW9jdGwgY29tbWFuZAorICoJCQlAYXJnOiBhcmd1bWVudHMgdG8gaW9jdGwKKyAqIEBtbWFw OgkJbW1hcCBjYWxsYmFjaworICoJCQlAbWRldjogbWVkaWF0ZWQgZGV2aWNlIHN0cnVjdHVyZQor ICoJCQlAdm1hOiB2bWEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29w cyB7CisJaW50ICAgICAoKm9wZW4pKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldik7CisJdm9pZCAg ICAoKnJlbGVhc2UpKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldik7CisJc3NpemVfdCAoKnJlYWQp KHN0cnVjdCBtZGV2X2RldmljZSAqbWRldiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBj b3VudCwgbG9mZl90ICpwcG9zKTsKKwlzc2l6ZV90ICgqd3JpdGUpKHN0cnVjdCBtZGV2X2Rldmlj ZSAqbWRldiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZf dCAqcHBvcyk7CisJbG9uZwkoKmlvY3RsKShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHVuc2ln bmVkIGludCBjbWQsCisJCQkgdW5zaWduZWQgbG9uZyBhcmcpOworCWludAkoKm1tYXApKHN0cnVj dCBtZGV2X2RldmljZSAqbWRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworfTsKKwor I2VuZGlmCmRpZmYgLS1naXQgYS9zYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMuYyBiL3NhbXBsZXMv dmZpby1tZGV2L21ib2Nocy5jCmluZGV4IDExNWJjNTA3NDY1Ni4uMTI5NjM3NjdiYTM3IDEwMDY0 NAotLS0gYS9zYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMuYworKysgYi9zYW1wbGVzL3ZmaW8tbWRl di9tYm9jaHMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CiAj aW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tZGV2Lmg+CisjaW5jbHVk ZSA8bGludXgvbWRldl92ZmlvX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1 ZGUgPGxpbnV4L2RtYS1idWYuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CkBAIC01MTYs NiArNTE3LDggQEAgc3RhdGljIGludCBtYm9jaHNfcmVzZXQoc3RydWN0IG1kZXZfZGV2aWNlICpt ZGV2KQogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZp Y2Vfb3BzIG1kZXZfdmZpb19vcHM7CisKIHN0YXRpYyBpbnQgbWJvY2hzX2NyZWF0ZShzdHJ1Y3Qg a29iamVjdCAqa29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCWNvbnN0IHN0cnVj dCBtYm9jaHNfdHlwZSAqdHlwZSA9IG1ib2Noc19maW5kX3R5cGUoa29iaik7CkBAIC01NjEsNyAr NTY0LDcgQEAgc3RhdGljIGludCBtYm9jaHNfY3JlYXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJbWJvY2hzX3Jlc2V0KG1kZXYpOwogCiAJbWJvY2hz X3VzZWRfbWJ5dGVzICs9IHR5cGUtPm1ieXRlczsKLQltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVW X0NMQVNTX0lEX1ZGSU8pOworCW1kZXZfc2V0X3ZmaW9fb3BzKG1kZXYsICZtZGV2X3ZmaW9fb3Bz KTsKIAlyZXR1cm4gMDsKIAogZXJyX21lbToKQEAgLTE0MTksMTIgKzE0MjIsNyBAQCBzdGF0aWMg c3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9 OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyBtZGV2X2ZvcHMgPSB7Ci0J Lm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkubWRldl9hdHRyX2dyb3Vwcwk9IG1kZXZfZGV2X2dy b3VwcywKLQkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBzCT0gbWRldl90eXBlX2dyb3VwcywKLQkuY3Jl YXRlCQkJPSBtYm9jaHNfY3JlYXRlLAotCS5yZW1vdmUJCQk9IG1ib2Noc19yZW1vdmUsCitzdGF0 aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzIG1kZXZfdmZpb19vcHMgPSB7CiAJ Lm9wZW4JCQk9IG1ib2Noc19vcGVuLAogCS5yZWxlYXNlCQk9IG1ib2Noc19jbG9zZSwKIAkucmVh ZAkJCT0gbWJvY2hzX3JlYWQsCkBAIC0xNDMzLDYgKzE0MzEsMTQgQEAgc3RhdGljIGNvbnN0IHN0 cnVjdCBtZGV2X3BhcmVudF9vcHMgbWRldl9mb3BzID0gewogCS5tbWFwCQkJPSBtYm9jaHNfbW1h cCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9 IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5tZGV2X2F0dHJfZ3JvdXBzCT0gbWRldl9k ZXZfZ3JvdXBzLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBtZGV2X3R5cGVfZ3JvdXBzLAor CS5jcmVhdGUJCQk9IG1ib2Noc19jcmVhdGUsCisJLnJlbW92ZQkJCT0gbWJvY2hzX3JlbW92ZSwK K307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZkX2ZvcHMgPSB7CiAJ Lm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdmZpby1tZGV2 L21kcHkuYyBiL3NhbXBsZXMvdmZpby1tZGV2L21kcHkuYwppbmRleCA2NjU2MTQ1NzRkNTAuLjUw ZWU2Yzk4YjJhZiAxMDA2NDQKLS0tIGEvc2FtcGxlcy92ZmlvLW1kZXYvbWRweS5jCisrKyBiL3Nh bXBsZXMvdmZpby1tZGV2L21kcHkuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4 L2lvbW11Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tZGV2 Lmg+CisjaW5jbHVkZSA8bGludXgvbWRldl92ZmlvX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Bj aS5oPgogI2luY2x1ZGUgPGRybS9kcm1fZm91cmNjLmg+CiAjaW5jbHVkZSAibWRweS1kZWZzLmgi CkBAIC0yMjYsNiArMjI3LDggQEAgc3RhdGljIGludCBtZHB5X3Jlc2V0KHN0cnVjdCBtZGV2X2Rl dmljZSAqbWRldikKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGV2X3Zm aW9fZGV2aWNlX29wcyBtZGV2X3ZmaW9fb3BzOworCiBzdGF0aWMgaW50IG1kcHlfY3JlYXRlKHN0 cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiB7CiAJY29uc3Qg c3RydWN0IG1kcHlfdHlwZSAqdHlwZSA9IG1kcHlfZmluZF90eXBlKGtvYmopOwpAQCAtMjY5LDcg KzI3Miw3IEBAIHN0YXRpYyBpbnQgbWRweV9jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0 cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAltZHB5X3Jlc2V0KG1kZXYpOwogCiAJbWRweV9jb3Vu dCsrOwotCW1kZXZfc2V0X2NsYXNzKG1kZXYsIE1ERVZfQ0xBU1NfSURfVkZJTyk7CisJbWRldl9z ZXRfdmZpb19vcHMobWRldiwgJm1kZXZfdmZpb19vcHMpOwogCXJldHVybiAwOwogfQogCkBAIC03 MjYsMTIgKzcyOSw3IEBAIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICptZGV2X3R5cGVf Z3JvdXBzW10gPSB7CiAJTlVMTCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJl bnRfb3BzIG1kZXZfZm9wcyA9IHsKLQkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5tZGV2X2F0 dHJfZ3JvdXBzCT0gbWRldl9kZXZfZ3JvdXBzLAotCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBt ZGV2X3R5cGVfZ3JvdXBzLAotCS5jcmVhdGUJCQk9IG1kcHlfY3JlYXRlLAotCS5yZW1vdmUJCQk9 IG1kcHlfcmVtb3ZlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGV2X3ZmaW9fZGV2aWNlX29wcyBt ZGV2X3ZmaW9fb3BzID0gewogCS5vcGVuCQkJPSBtZHB5X29wZW4sCiAJLnJlbGVhc2UJCT0gbWRw eV9jbG9zZSwKIAkucmVhZAkJCT0gbWRweV9yZWFkLApAQCAtNzQwLDYgKzczOCwxNCBAQCBzdGF0 aWMgY29uc3Qgc3RydWN0IG1kZXZfcGFyZW50X29wcyBtZGV2X2ZvcHMgPSB7CiAJLm1tYXAJCQk9 IG1kcHlfbW1hcCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1k ZXZfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5tZGV2X2F0dHJfZ3JvdXBz CT0gbWRldl9kZXZfZ3JvdXBzLAorCS5zdXBwb3J0ZWRfdHlwZV9ncm91cHMJPSBtZGV2X3R5cGVf Z3JvdXBzLAorCS5jcmVhdGUJCQk9IG1kcHlfY3JlYXRlLAorCS5yZW1vdmUJCQk9IG1kcHlfcmVt b3ZlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmRfZm9wcyA9 IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy92Zmlv LW1kZXYvbXR0eS5jIGIvc2FtcGxlcy92ZmlvLW1kZXYvbXR0eS5jCmluZGV4IDkwZGExMmZmN2Zk OS4uYmU0NzZlN2FkMWY4IDEwMDY0NAotLS0gYS9zYW1wbGVzL3ZmaW8tbWRldi9tdHR5LmMKKysr IGIvc2FtcGxlcy92ZmlvLW1kZXYvbXR0eS5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8 bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgv bWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21kZXZfdmZpb19vcHMuaD4KICNpbmNsdWRlIDxsaW51 eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDx1YXBpL2xpbnV4 L3NlcmlhbF9yZWcuaD4KQEAgLTcwOCw2ICs3MDksOCBAQCBzdGF0aWMgc3NpemVfdCBtZGV2X2Fj Y2VzcyhzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHU4ICpidWYsIHNpemVfdCBjb3VudCwKIAly ZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kZXZfdmZpb19kZXZpY2Vfb3Bz IHZmaW9fZGV2X29wczsKKwogc3RhdGljIGludCBtdHR5X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAq a29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQogewogCXN0cnVjdCBtZGV2X3N0YXRlICpt ZGV2X3N0YXRlOwpAQCAtNzU1LDcgKzc1OCw3IEBAIHN0YXRpYyBpbnQgbXR0eV9jcmVhdGUoc3Ry dWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAlsaXN0X2FkZCgm bWRldl9zdGF0ZS0+bmV4dCwgJm1kZXZfZGV2aWNlc19saXN0KTsKIAltdXRleF91bmxvY2soJm1k ZXZfbGlzdF9sb2NrKTsKIAotCW1kZXZfc2V0X2NsYXNzKG1kZXYsIE1ERVZfQ0xBU1NfSURfVkZJ Tyk7CisJbWRldl9zZXRfdmZpb19vcHMobWRldiwgJnZmaW9fZGV2X29wcyk7CiAJcmV0dXJuIDA7 CiB9CiAKQEAgLTEzODgsNiArMTM5MSwxNCBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91 cCAqbWRldl90eXBlX2dyb3Vwc1tdID0gewogCU5VTEwsCiB9OwogCitzdGF0aWMgY29uc3Qgc3Ry dWN0IG1kZXZfdmZpb19kZXZpY2Vfb3BzIHZmaW9fZGV2X29wcyA9IHsKKwkub3BlbgkJPSBtdHR5 X29wZW4sCisJLnJlbGVhc2UJPSBtdHR5X2Nsb3NlLAorCS5yZWFkCQk9IG10dHlfcmVhZCwKKwku d3JpdGUJCT0gbXR0eV93cml0ZSwKKwkuaW9jdGwJCT0gbXR0eV9pb2N0bCwKK307CisKIHN0YXRp YyBjb25zdCBzdHJ1Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9IHsKIAkub3duZXIgICAg ICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAogCS5kZXZfYXR0cl9ncm91cHMgICAgICAgID0g bXR0eV9kZXZfZ3JvdXBzLApAQCAtMTM5NSwxMSArMTQwNiw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgbWRldl9wYXJlbnRfb3BzIG1kZXZfZm9wcyA9IHsKIAkuc3VwcG9ydGVkX3R5cGVfZ3JvdXBz ICA9IG1kZXZfdHlwZV9ncm91cHMsCiAJLmNyZWF0ZSAgICAgICAgICAgICAgICAgPSBtdHR5X2Ny ZWF0ZSwKIAkucmVtb3ZlCQkJPSBtdHR5X3JlbW92ZSwKLQkub3BlbiAgICAgICAgICAgICAgICAg ICA9IG10dHlfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgICAgICAgICA9IG10dHlfY2xvc2UsCi0J LnJlYWQgICAgICAgICAgICAgICAgICAgPSBtdHR5X3JlYWQsCi0JLndyaXRlICAgICAgICAgICAg ICAgICAgPSBtdHR5X3dyaXRlLAotCS5pb2N0bAkJICAgICAgICA9IG10dHlfaW9jdGwsCiB9Owog CiBzdGF0aWMgdm9pZCBtdHR5X2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLS0g CjIuMTkuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K SW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4