From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: [PATCH V7 1/6] mdev: class id support Date: Mon, 4 Nov 2019 20:39:47 +0800 Message-ID: <20191104123952.17276-2-jasowang@redhat.com> References: <20191104123952.17276-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: <20191104123952.17276-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 Mdev bus only supports vfio driver right now, so it doesn't implement match method. But in the future, we may add drivers other than vfio, the first driver could be virtio-mdev. This means we need to add device class id support in bus match method to pair the mdev device and mdev driver correctly. So this patch adds id_table to mdev_driver and class_id for mdev device with the match method for mdev bus. Reviewed-by: Parav Pandit Signed-off-by: Jason Wang --- .../driver-api/vfio-mediated-device.rst | 5 ++++ drivers/gpu/drm/i915/gvt/kvmgt.c | 1 + drivers/s390/cio/vfio_ccw_ops.c | 1 + drivers/s390/crypto/vfio_ap_ops.c | 1 + drivers/vfio/mdev/mdev_core.c | 16 ++++++++++++ drivers/vfio/mdev/mdev_driver.c | 25 +++++++++++++++++++ drivers/vfio/mdev/mdev_private.h | 1 + drivers/vfio/mdev/vfio_mdev.c | 6 +++++ include/linux/mdev.h | 8 ++++++ include/linux/mod_devicetable.h | 8 ++++++ samples/vfio-mdev/mbochs.c | 1 + samples/vfio-mdev/mdpy.c | 1 + samples/vfio-mdev/mtty.c | 1 + 13 files changed, 75 insertions(+) diff --git a/Documentation/driver-api/vfio-mediated-device.rst b/Documentat= ion/driver-api/vfio-mediated-device.rst index 25eb7d5b834b..6709413bee29 100644 --- a/Documentation/driver-api/vfio-mediated-device.rst +++ b/Documentation/driver-api/vfio-mediated-device.rst @@ -102,12 +102,14 @@ structure to represent a mediated device's driver:: * @probe: called when new device created * @remove: called when device removed * @driver: device driver structure + * @id_table: the ids serviced by this driver */ struct mdev_driver { =09 const char *name; =09 int (*probe) (struct device *dev); =09 void (*remove) (struct device *dev); =09 struct device_driver driver; +=09 const struct mdev_class_id *id_table; }; =20 A mediated bus driver for mdev should use this structure in the function c= alls @@ -170,6 +172,9 @@ that a driver should use to unregister itself with the = 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:: + +=09int mdev_set_class(struct mdev_device *mdev, u16 id); =20 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 diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kv= mgt.c index 343d79c1cb7e..6420f0dbd31b 100644 --- a/drivers/gpu/drm/i915/gvt/kvmgt.c +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c @@ -678,6 +678,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); out: =09return ret; } diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_op= s.c index f0d71ab77c50..cf2c013ae32f 100644 --- a/drivers/s390/cio/vfio_ccw_ops.c +++ b/drivers/s390/cio/vfio_ccw_ops.c @@ -129,6 +129,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); =09return 0; } =20 diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_a= p_ops.c index 5c0f53c6dde7..07c31070afeb 100644 --- a/drivers/s390/crypto/vfio_ap_ops.c +++ b/drivers/s390/crypto/vfio_ap_ops.c @@ -343,6 +343,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); =09return 0; } =20 diff --git a/drivers/vfio/mdev/mdev_core.c b/drivers/vfio/mdev/mdev_core.c index b558d4cfd082..d23ca39e3be6 100644 --- a/drivers/vfio/mdev/mdev_core.c +++ b/drivers/vfio/mdev/mdev_core.c @@ -45,6 +45,16 @@ void mdev_set_drvdata(struct mdev_device *mdev, void *da= ta) } EXPORT_SYMBOL(mdev_set_drvdata); =20 +/* Specify the class for the mdev device, this must be called during + * create() callback. + */ +void mdev_set_class(struct mdev_device *mdev, u16 id) +{ +=09WARN_ON(mdev->class_id); +=09mdev->class_id =3D id; +} +EXPORT_SYMBOL(mdev_set_class); + struct device *mdev_dev(struct mdev_device *mdev) { =09return &mdev->dev; @@ -324,6 +334,12 @@ int mdev_device_create(struct kobject *kobj, =09if (ret) =09=09goto ops_create_fail; =20 +=09if (!mdev->class_id) { +=09=09ret =3D -EINVAL; +=09=09dev_warn(dev, "mdev vendor driver failed to specify device class\n")= ; +=09=09goto add_fail; +=09} + =09ret =3D device_add(&mdev->dev); =09if (ret) =09=09goto add_fail; diff --git a/drivers/vfio/mdev/mdev_driver.c b/drivers/vfio/mdev/mdev_drive= r.c index 0d3223aee20b..ed06433693e8 100644 --- a/drivers/vfio/mdev/mdev_driver.c +++ b/drivers/vfio/mdev/mdev_driver.c @@ -69,8 +69,33 @@ static int mdev_remove(struct device *dev) =09return 0; } =20 +static int mdev_match(struct device *dev, struct device_driver *drv) +{ +=09unsigned int i; +=09struct mdev_device *mdev =3D to_mdev_device(dev); +=09struct mdev_driver *mdrv =3D to_mdev_driver(drv); +=09const struct mdev_class_id *ids =3D mdrv->id_table; + +=09if (!ids) +=09=09return 0; + +=09for (i =3D 0; ids[i].id; i++) +=09=09if (ids[i].id =3D=3D mdev->class_id) +=09=09=09return 1; +=09return 0; +} + +static int mdev_uevent(struct device *dev, struct kobj_uevent_env *env) +{ +=09struct mdev_device *mdev =3D to_mdev_device(dev); + +=09return add_uevent_var(env, "MODALIAS=3Dmdev:c%02X", mdev->class_id); +} + struct bus_type mdev_bus_type =3D { =09.name=09=09=3D "mdev", +=09.match=09=09=3D mdev_match, +=09.uevent=09=09=3D mdev_uevent, =09.probe=09=09=3D mdev_probe, =09.remove=09=09=3D mdev_remove, }; diff --git a/drivers/vfio/mdev/mdev_private.h b/drivers/vfio/mdev/mdev_priv= ate.h index 7d922950caaf..c65f436c1869 100644 --- a/drivers/vfio/mdev/mdev_private.h +++ b/drivers/vfio/mdev/mdev_private.h @@ -33,6 +33,7 @@ struct mdev_device { =09struct kobject *type_kobj; =09struct device *iommu_device; =09bool active; +=09u16 class_id; }; =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 30964a4e0a28..38431e9ef7f5 100644 --- a/drivers/vfio/mdev/vfio_mdev.c +++ b/drivers/vfio/mdev/vfio_mdev.c @@ -120,10 +120,16 @@ static void vfio_mdev_remove(struct device *dev) =09vfio_del_group_dev(dev); } =20 +static const struct mdev_class_id vfio_id_table[] =3D { +=09{ MDEV_CLASS_ID_VFIO }, +=09{ 0 }, +}; + static struct mdev_driver vfio_mdev_driver =3D { =09.name=09=3D "vfio_mdev", =09.probe=09=3D vfio_mdev_probe, =09.remove=09=3D vfio_mdev_remove, +=09.id_table =3D vfio_id_table, }; =20 static int __init vfio_mdev_init(void) diff --git a/include/linux/mdev.h b/include/linux/mdev.h index 0ce30ca78db0..78b69d09eb54 100644 --- a/include/linux/mdev.h +++ b/include/linux/mdev.h @@ -118,6 +118,7 @@ struct mdev_type_attribute mdev_type_attr_##_name =3D= =09=09\ * @probe: called when new device created * @remove: called when device removed * @driver: device driver structure + * @id_table: the ids serviced by this driver * **/ struct mdev_driver { @@ -125,6 +126,7 @@ struct mdev_driver { =09int (*probe)(struct device *dev); =09void (*remove)(struct device *dev); =09struct device_driver driver; +=09const struct mdev_class_id *id_table; }; =20 #define to_mdev_driver(drv)=09container_of(drv, struct mdev_driver, driver= ) @@ -132,6 +134,7 @@ struct mdev_driver { 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); =20 extern struct bus_type mdev_bus_type; =20 @@ -145,4 +148,9 @@ struct device *mdev_parent_dev(struct mdev_device *mdev= ); struct device *mdev_dev(struct mdev_device *mdev); struct mdev_device *mdev_from_dev(struct device *dev); =20 +enum { +=09MDEV_CLASS_ID_VFIO =3D 1, +=09/* New entries must be added here */ +}; + #endif /* MDEV_H */ diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetabl= e.h index 5714fd35a83c..f32c6e44fb1a 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h @@ -821,4 +821,12 @@ struct wmi_device_id { =09const void *context; }; =20 +/** + * struct mdev_class_id - MDEV device class identifier + * @id: Used to identify a specific class of device, e.g vfio-mdev device. + */ +struct mdev_class_id { +=09__u16 id; +}; + #endif /* LINUX_MOD_DEVICETABLE_H */ diff --git a/samples/vfio-mdev/mbochs.c b/samples/vfio-mdev/mbochs.c index ac5c8c17b1ff..115bc5074656 100644 --- a/samples/vfio-mdev/mbochs.c +++ b/samples/vfio-mdev/mbochs.c @@ -561,6 +561,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); =09return 0; =20 err_mem: diff --git a/samples/vfio-mdev/mdpy.c b/samples/vfio-mdev/mdpy.c index cc86bf6566e4..665614574d50 100644 --- a/samples/vfio-mdev/mdpy.c +++ b/samples/vfio-mdev/mdpy.c @@ -269,6 +269,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); =09return 0; } =20 diff --git a/samples/vfio-mdev/mtty.c b/samples/vfio-mdev/mtty.c index ce84a300a4da..90da12ff7fd9 100644 --- a/samples/vfio-mdev/mtty.c +++ b/samples/vfio-mdev/mtty.c @@ -755,6 +755,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); =09return 0; } =20 --=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 73C4FCA9ED3 for ; Mon, 4 Nov 2019 12:43:11 +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 5528621D7D for ; Mon, 4 Nov 2019 12:43:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5528621D7D 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 57DAD6E3A4; Mon, 4 Nov 2019 12:43:10 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id EBFDD6E379 for ; Mon, 4 Nov 2019 12:43:08 +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-28-2G__RSVRPBKBWJJih5i-Fw-1; Mon, 04 Nov 2019 07:43:04 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 67699800C73; Mon, 4 Nov 2019 12:43:00 +0000 (UTC) Received: from jason-ThinkPad-X1-Carbon-6th.redhat.com (ovpn-12-65.pek2.redhat.com [10.72.12.65]) by smtp.corp.redhat.com (Postfix) with ESMTP id EA45B60CD0; Mon, 4 Nov 2019 12:41:26 +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 V7 1/6] mdev: class id support Date: Mon, 4 Nov 2019 20:39:47 +0800 Message-Id: <20191104123952.17276-2-jasowang@redhat.com> In-Reply-To: <20191104123952.17276-1-jasowang@redhat.com> References: <20191104123952.17276-1-jasowang@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-MC-Unique: 2G__RSVRPBKBWJJih5i-Fw-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=1572871387; 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=j3uX4xKUPpnTCQ7S+H5OVBiI//DbCpSXZrAOsfut9UQ=; b=aRjZjkt+RtPAZP3H++M03wAzBCWTwvg0oEWkdiVheWZoTPUybZo4MycAt92fU8VL60WuGu Ijg//Zsy6A0qsT6kXvJ73TK23LZQHVHJAZ6mLVg0cgoacjcXGubNxbMjPG6ETPIe7ZfgDV m/wO/vZc+hH6aWSPNbxae3e7Dv+RO7I= 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: <20191104123947.dqt-xq9Rf-IfbB5sDxe07piZh0_TJVwvxj-5iGtcBA4@z> TWRldiBidXMgb25seSBzdXBwb3J0cyB2ZmlvIGRyaXZlciByaWdodCBub3csIHNvIGl0IGRvZXNu J3QgaW1wbGVtZW50Cm1hdGNoIG1ldGhvZC4gQnV0IGluIHRoZSBmdXR1cmUsIHdlIG1heSBhZGQg ZHJpdmVycyBvdGhlciB0aGFuIHZmaW8sCnRoZSBmaXJzdCBkcml2ZXIgY291bGQgYmUgdmlydGlv LW1kZXYuIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBhZGQKZGV2aWNlIGNsYXNzIGlkIHN1cHBvcnQg aW4gYnVzIG1hdGNoIG1ldGhvZCB0byBwYWlyIHRoZSBtZGV2IGRldmljZQphbmQgbWRldiBkcml2 ZXIgY29ycmVjdGx5LgoKU28gdGhpcyBwYXRjaCBhZGRzIGlkX3RhYmxlIHRvIG1kZXZfZHJpdmVy IGFuZCBjbGFzc19pZCBmb3IgbWRldgpkZXZpY2Ugd2l0aCB0aGUgbWF0Y2ggbWV0aG9kIGZvciBt ZGV2IGJ1cy4KClJldmlld2VkLWJ5OiBQYXJhdiBQYW5kaXQgPHBhcmF2QG1lbGxhbm94LmNvbT4K U2lnbmVkLW9mZi1ieTogSmFzb24gV2FuZyA8amFzb3dhbmdAcmVkaGF0LmNvbT4KLS0tCiAuLi4v ZHJpdmVyLWFwaS92ZmlvLW1lZGlhdGVkLWRldmljZS5yc3QgICAgICAgfCAgNSArKysrCiBkcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndnQva3ZtZ3QuYyAgICAgICAgICAgICAgfCAgMSArCiBkcml2ZXJz L3MzOTAvY2lvL3ZmaW9fY2N3X29wcy5jICAgICAgICAgICAgICAgfCAgMSArCiBkcml2ZXJzL3Mz OTAvY3J5cHRvL3ZmaW9fYXBfb3BzLmMgICAgICAgICAgICAgfCAgMSArCiBkcml2ZXJzL3ZmaW8v bWRldi9tZGV2X2NvcmUuYyAgICAgICAgICAgICAgICAgfCAxNiArKysrKysrKysrKysKIGRyaXZl cnMvdmZpby9tZGV2L21kZXZfZHJpdmVyLmMgICAgICAgICAgICAgICB8IDI1ICsrKysrKysrKysr KysrKysrKysKIGRyaXZlcnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oICAgICAgICAgICAgICB8 ICAxICsKIGRyaXZlcnMvdmZpby9tZGV2L3ZmaW9fbWRldi5jICAgICAgICAgICAgICAgICB8ICA2 ICsrKysrCiBpbmNsdWRlL2xpbnV4L21kZXYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg OCArKysrKysKIGluY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggICAgICAgICAgICAgICB8 ICA4ICsrKysrKwogc2FtcGxlcy92ZmlvLW1kZXYvbWJvY2hzLmMgICAgICAgICAgICAgICAgICAg IHwgIDEgKwogc2FtcGxlcy92ZmlvLW1kZXYvbWRweS5jICAgICAgICAgICAgICAgICAgICAgIHwg IDEgKwogc2FtcGxlcy92ZmlvLW1kZXYvbXR0eS5jICAgICAgICAgICAgICAgICAgICAgIHwgIDEg KwogMTMgZmlsZXMgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL0RvY3Vt ZW50YXRpb24vZHJpdmVyLWFwaS92ZmlvLW1lZGlhdGVkLWRldmljZS5yc3QgYi9Eb2N1bWVudGF0 aW9uL2RyaXZlci1hcGkvdmZpby1tZWRpYXRlZC1kZXZpY2UucnN0CmluZGV4IDI1ZWI3ZDViODM0 Yi4uNjcwOTQxM2JlZTI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvdmZp by1tZWRpYXRlZC1kZXZpY2UucnN0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS92Zmlv LW1lZGlhdGVkLWRldmljZS5yc3QKQEAgLTEwMiwxMiArMTAyLDE0IEBAIHN0cnVjdHVyZSB0byBy ZXByZXNlbnQgYSBtZWRpYXRlZCBkZXZpY2UncyBkcml2ZXI6OgogICAgICAgKiBAcHJvYmU6IGNh bGxlZCB3aGVuIG5ldyBkZXZpY2UgY3JlYXRlZAogICAgICAgKiBAcmVtb3ZlOiBjYWxsZWQgd2hl biBkZXZpY2UgcmVtb3ZlZAogICAgICAgKiBAZHJpdmVyOiBkZXZpY2UgZHJpdmVyIHN0cnVjdHVy ZQorICAgICAgKiBAaWRfdGFibGU6IHRoZSBpZHMgc2VydmljZWQgYnkgdGhpcyBkcml2ZXIKICAg ICAgICovCiAgICAgIHN0cnVjdCBtZGV2X2RyaXZlciB7CiAJICAgICBjb25zdCBjaGFyICpuYW1l OwogCSAgICAgaW50ICAoKnByb2JlKSAgKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJICAgICB2b2lk ICgqcmVtb3ZlKSAoc3RydWN0IGRldmljZSAqZGV2KTsKIAkgICAgIHN0cnVjdCBkZXZpY2VfZHJp dmVyICAgIGRyaXZlcjsKKwkgICAgIGNvbnN0IHN0cnVjdCBtZGV2X2NsYXNzX2lkICppZF90YWJs ZTsKICAgICAgfTsKIAogQSBtZWRpYXRlZCBidXMgZHJpdmVyIGZvciBtZGV2IHNob3VsZCB1c2Ug dGhpcyBzdHJ1Y3R1cmUgaW4gdGhlIGZ1bmN0aW9uIGNhbGxzCkBAIC0xNzAsNiArMTcyLDkgQEAg dGhhdCBhIGRyaXZlciBzaG91bGQgdXNlIHRvIHVucmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIG1k ZXYgY29yZSBkcml2ZXI6OgogCiAJZXh0ZXJuIHZvaWQgbWRldl91bnJlZ2lzdGVyX2RldmljZShz dHJ1Y3QgZGV2aWNlICpkZXYpOwogCitJdCBpcyBhbHNvIHJlcXVpcmVkIHRvIHNwZWNpZnkgdGhl IGNsYXNzX2lkIGluIGNyZWF0ZSgpIGNhbGxiYWNrIHRocm91Z2g6OgorCisJaW50IG1kZXZfc2V0 X2NsYXNzKHN0cnVjdCBtZGV2X2RldmljZSAqbWRldiwgdTE2IGlkKTsKIAogTWVkaWF0ZWQgRGV2 aWNlIE1hbmFnZW1lbnQgSW50ZXJmYWNlIFRocm91Z2ggc3lzZnMKID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndnQva3ZtZ3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d2dC9rdm1ndC5j CmluZGV4IDM0M2Q3OWMxY2I3ZS4uNjQyMGYwZGJkMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndnQva3ZtZ3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQva3Zt Z3QuYwpAQCAtNjc4LDYgKzY3OCw3IEBAIHN0YXRpYyBpbnQgaW50ZWxfdmdwdV9jcmVhdGUoc3Ry dWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAkJICAgICBkZXZf bmFtZShtZGV2X2RldihtZGV2KSkpOwogCXJldCA9IDA7CiAKKwltZGV2X3NldF9jbGFzcyhtZGV2 LCBNREVWX0NMQVNTX0lEX1ZGSU8pOwogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQg YS9kcml2ZXJzL3MzOTAvY2lvL3ZmaW9fY2N3X29wcy5jIGIvZHJpdmVycy9zMzkwL2Npby92Zmlv X2Njd19vcHMuYwppbmRleCBmMGQ3MWFiNzdjNTAuLmNmMmMwMTNhZTMyZiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9zMzkwL2Npby92ZmlvX2Njd19vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3Zm aW9fY2N3X29wcy5jCkBAIC0xMjksNiArMTI5LDcgQEAgc3RhdGljIGludCB2ZmlvX2Njd19tZGV2 X2NyZWF0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IG1kZXZfZGV2aWNlICptZGV2KQog CQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hpZC5zc2lkLAogCQkJICAgcHJpdmF0ZS0+c2NoLT5zY2hp ZC5zY2hfbm8pOwogCisJbWRldl9zZXRfY2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsK IAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NyeXB0by92ZmlvX2Fw X29wcy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by92ZmlvX2FwX29wcy5jCmluZGV4IDVjMGY1M2M2 ZGRlNy4uMDdjMzEwNzBhZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL3ZmaW9f YXBfb3BzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by92ZmlvX2FwX29wcy5jCkBAIC0zNDMs NiArMzQzLDcgQEAgc3RhdGljIGludCB2ZmlvX2FwX21kZXZfY3JlYXRlKHN0cnVjdCBrb2JqZWN0 ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJbGlzdF9hZGQoJm1hdHJpeF9tZGV2 LT5ub2RlLCAmbWF0cml4X2Rldi0+bWRldl9saXN0KTsKIAltdXRleF91bmxvY2soJm1hdHJpeF9k ZXYtPmxvY2spOwogCisJbWRldl9zZXRfY2xhc3MobWRldiwgTURFVl9DTEFTU19JRF9WRklPKTsK IAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL21kZXYvbWRldl9jb3Jl LmMgYi9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X2NvcmUuYwppbmRleCBiNTU4ZDRjZmQwODIuLmQy M2NhMzllM2JlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL21kZXYvbWRldl9jb3JlLmMKKysr IGIvZHJpdmVycy92ZmlvL21kZXYvbWRldl9jb3JlLmMKQEAgLTQ1LDYgKzQ1LDE2IEBAIHZvaWQg bWRldl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYsIHZvaWQgKmRhdGEpCiB9 CiBFWFBPUlRfU1lNQk9MKG1kZXZfc2V0X2RydmRhdGEpOwogCisvKiBTcGVjaWZ5IHRoZSBjbGFz cyBmb3IgdGhlIG1kZXYgZGV2aWNlLCB0aGlzIG11c3QgYmUgY2FsbGVkIGR1cmluZworICogY3Jl YXRlKCkgY2FsbGJhY2suCisgKi8KK3ZvaWQgbWRldl9zZXRfY2xhc3Moc3RydWN0IG1kZXZfZGV2 aWNlICptZGV2LCB1MTYgaWQpCit7CisJV0FSTl9PTihtZGV2LT5jbGFzc19pZCk7CisJbWRldi0+ Y2xhc3NfaWQgPSBpZDsKK30KK0VYUE9SVF9TWU1CT0wobWRldl9zZXRfY2xhc3MpOworCiBzdHJ1 Y3QgZGV2aWNlICptZGV2X2RldihzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiB7CiAJcmV0dXJu ICZtZGV2LT5kZXY7CkBAIC0zMjQsNiArMzM0LDEyIEBAIGludCBtZGV2X2RldmljZV9jcmVhdGUo c3RydWN0IGtvYmplY3QgKmtvYmosCiAJaWYgKHJldCkKIAkJZ290byBvcHNfY3JlYXRlX2ZhaWw7 CiAKKwlpZiAoIW1kZXYtPmNsYXNzX2lkKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWRldl93YXJu KGRldiwgIm1kZXYgdmVuZG9yIGRyaXZlciBmYWlsZWQgdG8gc3BlY2lmeSBkZXZpY2UgY2xhc3Nc biIpOworCQlnb3RvIGFkZF9mYWlsOworCX0KKwogCXJldCA9IGRldmljZV9hZGQoJm1kZXYtPmRl dik7CiAJaWYgKHJldCkKIAkJZ290byBhZGRfZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZp by9tZGV2L21kZXZfZHJpdmVyLmMgYi9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X2RyaXZlci5jCmlu ZGV4IDBkMzIyM2FlZTIwYi4uZWQwNjQzMzY5M2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8v bWRldi9tZGV2X2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmZpby9tZGV2L21kZXZfZHJpdmVyLmMK QEAgLTY5LDggKzY5LDMzIEBAIHN0YXRpYyBpbnQgbWRldl9yZW1vdmUoc3RydWN0IGRldmljZSAq ZGV2KQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1kZXZfbWF0Y2goc3RydWN0IGRldmlj ZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXVuc2lnbmVkIGludCBpOwor CXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9IHRvX21kZXZfZGV2aWNlKGRldik7CisJc3RydWN0 IG1kZXZfZHJpdmVyICptZHJ2ID0gdG9fbWRldl9kcml2ZXIoZHJ2KTsKKwljb25zdCBzdHJ1Y3Qg bWRldl9jbGFzc19pZCAqaWRzID0gbWRydi0+aWRfdGFibGU7CisKKwlpZiAoIWlkcykKKwkJcmV0 dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpZHNbaV0uaWQ7IGkrKykKKwkJaWYgKGlkc1tpXS5pZCA9 PSBtZGV2LT5jbGFzc19pZCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IG1kZXZfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2Vu diAqZW52KQoreworCXN0cnVjdCBtZGV2X2RldmljZSAqbWRldiA9IHRvX21kZXZfZGV2aWNlKGRl dik7CisKKwlyZXR1cm4gYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9bWRldjpjJTAyWCIs IG1kZXYtPmNsYXNzX2lkKTsKK30KKwogc3RydWN0IGJ1c190eXBlIG1kZXZfYnVzX3R5cGUgPSB7 CiAJLm5hbWUJCT0gIm1kZXYiLAorCS5tYXRjaAkJPSBtZGV2X21hdGNoLAorCS51ZXZlbnQJCT0g bWRldl91ZXZlbnQsCiAJLnByb2JlCQk9IG1kZXZfcHJvYmUsCiAJLnJlbW92ZQkJPSBtZGV2X3Jl bW92ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X3ByaXZhdGUuaCBi L2RyaXZlcnMvdmZpby9tZGV2L21kZXZfcHJpdmF0ZS5oCmluZGV4IDdkOTIyOTUwY2FhZi4uYzY1 ZjQzNmMxODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X3ByaXZhdGUuaAor KysgYi9kcml2ZXJzL3ZmaW8vbWRldi9tZGV2X3ByaXZhdGUuaApAQCAtMzMsNiArMzMsNyBAQCBz dHJ1Y3QgbWRldl9kZXZpY2UgewogCXN0cnVjdCBrb2JqZWN0ICp0eXBlX2tvYmo7CiAJc3RydWN0 IGRldmljZSAqaW9tbXVfZGV2aWNlOwogCWJvb2wgYWN0aXZlOworCXUxNiBjbGFzc19pZDsKIH07 CiAKICNkZWZpbmUgdG9fbWRldl9kZXZpY2UoZGV2KQljb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qg bWRldl9kZXZpY2UsIGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9tZGV2L3ZmaW9fbWRl di5jIGIvZHJpdmVycy92ZmlvL21kZXYvdmZpb19tZGV2LmMKaW5kZXggMzA5NjRhNGUwYTI4Li4z ODQzMWU5ZWY3ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9tZGV2L3ZmaW9fbWRldi5jCisr KyBiL2RyaXZlcnMvdmZpby9tZGV2L3ZmaW9fbWRldi5jCkBAIC0xMjAsMTAgKzEyMCwxNiBAQCBz dGF0aWMgdm9pZCB2ZmlvX21kZXZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIAl2ZmlvX2Rl bF9ncm91cF9kZXYoZGV2KTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtZGV2X2NsYXNzX2lk IHZmaW9faWRfdGFibGVbXSA9IHsKKwl7IE1ERVZfQ0xBU1NfSURfVkZJTyB9LAorCXsgMCB9LAor fTsKKwogc3RhdGljIHN0cnVjdCBtZGV2X2RyaXZlciB2ZmlvX21kZXZfZHJpdmVyID0gewogCS5u YW1lCT0gInZmaW9fbWRldiIsCiAJLnByb2JlCT0gdmZpb19tZGV2X3Byb2JlLAogCS5yZW1vdmUJ PSB2ZmlvX21kZXZfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHZmaW9faWRfdGFibGUsCiB9OwogCiBz dGF0aWMgaW50IF9faW5pdCB2ZmlvX21kZXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9saW51eC9tZGV2LmggYi9pbmNsdWRlL2xpbnV4L21kZXYuaAppbmRleCAwY2UzMGNhNzhkYjAu Ljc4YjY5ZDA5ZWI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZGV2LmgKKysrIGIvaW5j bHVkZS9saW51eC9tZGV2LmgKQEAgLTExOCw2ICsxMTgsNyBAQCBzdHJ1Y3QgbWRldl90eXBlX2F0 dHJpYnV0ZSBtZGV2X3R5cGVfYXR0cl8jI19uYW1lID0JCVwKICAqIEBwcm9iZTogY2FsbGVkIHdo ZW4gbmV3IGRldmljZSBjcmVhdGVkCiAgKiBAcmVtb3ZlOiBjYWxsZWQgd2hlbiBkZXZpY2UgcmVt b3ZlZAogICogQGRyaXZlcjogZGV2aWNlIGRyaXZlciBzdHJ1Y3R1cmUKKyAqIEBpZF90YWJsZTog dGhlIGlkcyBzZXJ2aWNlZCBieSB0aGlzIGRyaXZlcgogICoKICAqKi8KIHN0cnVjdCBtZGV2X2Ry aXZlciB7CkBAIC0xMjUsNiArMTI2LDcgQEAgc3RydWN0IG1kZXZfZHJpdmVyIHsKIAlpbnQgICgq cHJvYmUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJdm9pZCAoKnJlbW92ZSkoc3RydWN0IGRldmlj ZSAqZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJY29uc3Qgc3RydWN0IG1k ZXZfY2xhc3NfaWQgKmlkX3RhYmxlOwogfTsKIAogI2RlZmluZSB0b19tZGV2X2RyaXZlcihkcnYp CWNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBtZGV2X2RyaXZlciwgZHJpdmVyKQpAQCAtMTMyLDYg KzEzNCw3IEBAIHN0cnVjdCBtZGV2X2RyaXZlciB7CiB2b2lkICptZGV2X2dldF9kcnZkYXRhKHN0 cnVjdCBtZGV2X2RldmljZSAqbWRldik7CiB2b2lkIG1kZXZfc2V0X2RydmRhdGEoc3RydWN0IG1k ZXZfZGV2aWNlICptZGV2LCB2b2lkICpkYXRhKTsKIGNvbnN0IGd1aWRfdCAqbWRldl91dWlkKHN0 cnVjdCBtZGV2X2RldmljZSAqbWRldik7Cit2b2lkIG1kZXZfc2V0X2NsYXNzKHN0cnVjdCBtZGV2 X2RldmljZSAqbWRldiwgdTE2IGlkKTsKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBtZGV2X2J1 c190eXBlOwogCkBAIC0xNDUsNCArMTQ4LDkgQEAgc3RydWN0IGRldmljZSAqbWRldl9wYXJlbnRf ZGV2KHN0cnVjdCBtZGV2X2RldmljZSAqbWRldik7CiBzdHJ1Y3QgZGV2aWNlICptZGV2X2Rldihz dHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpOwogc3RydWN0IG1kZXZfZGV2aWNlICptZGV2X2Zyb21f ZGV2KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKK2VudW0geworCU1ERVZfQ0xBU1NfSURfVkZJTyA9 IDEsCisJLyogTmV3IGVudHJpZXMgbXVzdCBiZSBhZGRlZCBoZXJlICovCit9OworCiAjZW5kaWYg LyogTURFVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5o IGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAppbmRleCA1NzE0ZmQzNWE4M2MuLmYz MmM2ZTQ0ZmIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAor KysgYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCkBAIC04MjEsNCArODIxLDEyIEBA IHN0cnVjdCB3bWlfZGV2aWNlX2lkIHsKIAljb25zdCB2b2lkICpjb250ZXh0OwogfTsKIAorLyoq CisgKiBzdHJ1Y3QgbWRldl9jbGFzc19pZCAtIE1ERVYgZGV2aWNlIGNsYXNzIGlkZW50aWZpZXIK KyAqIEBpZDogVXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIGNsYXNzIG9mIGRldmljZSwgZS5n IHZmaW8tbWRldiBkZXZpY2UuCisgKi8KK3N0cnVjdCBtZGV2X2NsYXNzX2lkIHsKKwlfX3UxNiBp ZDsKK307CisKICNlbmRpZiAvKiBMSU5VWF9NT0RfREVWSUNFVEFCTEVfSCAqLwpkaWZmIC0tZ2l0 IGEvc2FtcGxlcy92ZmlvLW1kZXYvbWJvY2hzLmMgYi9zYW1wbGVzL3ZmaW8tbWRldi9tYm9jaHMu YwppbmRleCBhYzVjOGMxN2IxZmYuLjExNWJjNTA3NDY1NiAxMDA2NDQKLS0tIGEvc2FtcGxlcy92 ZmlvLW1kZXYvbWJvY2hzLmMKKysrIGIvc2FtcGxlcy92ZmlvLW1kZXYvbWJvY2hzLmMKQEAgLTU2 MSw2ICs1NjEsNyBAQCBzdGF0aWMgaW50IG1ib2Noc19jcmVhdGUoc3RydWN0IGtvYmplY3QgKmtv YmosIHN0cnVjdCBtZGV2X2RldmljZSAqbWRldikKIAltYm9jaHNfcmVzZXQobWRldik7CiAKIAlt Ym9jaHNfdXNlZF9tYnl0ZXMgKz0gdHlwZS0+bWJ5dGVzOworCW1kZXZfc2V0X2NsYXNzKG1kZXYs IE1ERVZfQ0xBU1NfSURfVkZJTyk7CiAJcmV0dXJuIDA7CiAKIGVycl9tZW06CmRpZmYgLS1naXQg YS9zYW1wbGVzL3ZmaW8tbWRldi9tZHB5LmMgYi9zYW1wbGVzL3ZmaW8tbWRldi9tZHB5LmMKaW5k ZXggY2M4NmJmNjU2NmU0Li42NjU2MTQ1NzRkNTAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdmZpby1t ZGV2L21kcHkuYworKysgYi9zYW1wbGVzL3ZmaW8tbWRldi9tZHB5LmMKQEAgLTI2OSw2ICsyNjks NyBAQCBzdGF0aWMgaW50IG1kcHlfY3JlYXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qg bWRldl9kZXZpY2UgKm1kZXYpCiAJbWRweV9yZXNldChtZGV2KTsKIAogCW1kcHlfY291bnQrKzsK KwltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVWX0NMQVNTX0lEX1ZGSU8pOwogCXJldHVybiAwOwog fQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL3ZmaW8tbWRldi9tdHR5LmMgYi9zYW1wbGVzL3ZmaW8t bWRldi9tdHR5LmMKaW5kZXggY2U4NGEzMDBhNGRhLi45MGRhMTJmZjdmZDkgMTAwNjQ0Ci0tLSBh L3NhbXBsZXMvdmZpby1tZGV2L210dHkuYworKysgYi9zYW1wbGVzL3ZmaW8tbWRldi9tdHR5LmMK QEAgLTc1NSw2ICs3NTUsNyBAQCBzdGF0aWMgaW50IG10dHlfY3JlYXRlKHN0cnVjdCBrb2JqZWN0 ICprb2JqLCBzdHJ1Y3QgbWRldl9kZXZpY2UgKm1kZXYpCiAJbGlzdF9hZGQoJm1kZXZfc3RhdGUt Pm5leHQsICZtZGV2X2RldmljZXNfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZtZGV2X2xpc3RfbG9j ayk7CiAKKwltZGV2X3NldF9jbGFzcyhtZGV2LCBNREVWX0NMQVNTX0lEX1ZGSU8pOwogCXJldHVy biAwOwogfQogCi0tIAoyLjE5LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2RyaS1kZXZlbA==