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=-14.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 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 339BEC12002 for ; Mon, 19 Jul 2021 09:00:37 +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 006CD611AF for ; Mon, 19 Jul 2021 09:00:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 006CD611AF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.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 2746B89E14; Mon, 19 Jul 2021 09:00:36 +0000 (UTC) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id AF7AA89E01; Mon, 19 Jul 2021 09:00:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10049"; a="198278878" X-IronPort-AV: E=Sophos;i="5.84,251,1620716400"; d="scan'208";a="198278878" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 02:00:34 -0700 X-IronPort-AV: E=Sophos;i="5.84,251,1620716400"; d="scan'208";a="631839741" Received: from mtlovett-mobl.ger.corp.intel.com (HELO [10.213.196.244]) ([10.213.196.244]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 02:00:31 -0700 Subject: Re: [PATCH 4/4] drm/i915/uapi: reject set_domain for discrete To: Jason Ekstrand References: <20210715101536.2606307-1-matthew.auld@intel.com> <20210715101536.2606307-5-matthew.auld@intel.com> <70159117-ca97-667a-3e9b-82125bf309df@linux.intel.com> From: Tvrtko Ursulin Organization: Intel Corporation UK Plc Message-ID: <6e7493e6-33b6-afa7-e981-e3675c961416@linux.intel.com> Date: Mon, 19 Jul 2021 10:00:29 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , Jordan Justen , Intel GFX , Maling list - DRI developers , Kenneth Graunke , Matthew Auld , Daniel Vetter Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 16/07/2021 16:23, Jason Ekstrand wrote: > On Fri, Jul 16, 2021 at 9:52 AM Tvrtko Ursulin > wrote: >> >> >> On 15/07/2021 11:15, Matthew Auld wrote: >>> The CPU domain should be static for discrete, and on DG1 we don't need >>> any flushing since everything is already coherent, so really all this >>> does is an object wait, for which we have an ioctl. Longer term the >>> desired caching should be an immutable creation time property for the >>> BO, which can be set with something like gem_create_ext. >>> >>> One other user is iris + userptr, which uses the set_domain to probe all >>> the pages to check if the GUP succeeds, however we now have a PROBE >>> flag for this purpose. >>> >>> v2: add some more kernel doc, also add the implicit rules with caching >>> >>> Suggested-by: Daniel Vetter >>> Signed-off-by: Matthew Auld >>> Cc: Thomas Hellström >>> Cc: Maarten Lankhorst >>> Cc: Tvrtko Ursulin >>> Cc: Jordan Justen >>> Cc: Kenneth Graunke >>> Cc: Jason Ekstrand >>> Cc: Daniel Vetter >>> Cc: Ramalingam C >>> Reviewed-by: Ramalingam C >>> --- >>> drivers/gpu/drm/i915/gem/i915_gem_domain.c | 3 +++ >>> include/uapi/drm/i915_drm.h | 19 +++++++++++++++++++ >>> 2 files changed, 22 insertions(+) >>> >>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_domain.c b/drivers/gpu/drm/i915/gem/i915_gem_domain.c >>> index 43004bef55cb..b684a62bf3b0 100644 >>> --- a/drivers/gpu/drm/i915/gem/i915_gem_domain.c >>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_domain.c >>> @@ -490,6 +490,9 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data, >>> u32 write_domain = args->write_domain; >>> int err; >>> >>> + if (IS_DGFX(to_i915(dev))) >>> + return -ENODEV; >>> + >>> /* Only handle setting domains to types used by the CPU. */ >>> if ((write_domain | read_domains) & I915_GEM_GPU_DOMAINS) >>> return -EINVAL; >>> diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h >>> index 2e4112bf4d38..04ce310e7ee6 100644 >>> --- a/include/uapi/drm/i915_drm.h >>> +++ b/include/uapi/drm/i915_drm.h >>> @@ -901,6 +901,25 @@ struct drm_i915_gem_mmap_offset { >>> * - I915_GEM_DOMAIN_GTT: Mappable aperture domain >>> * >>> * All other domains are rejected. >>> + * >>> + * Note that for discrete, starting from DG1, this is no longer supported, and >>> + * is instead rejected. On such platforms the CPU domain is effectively static, >>> + * where we also only support a single &drm_i915_gem_mmap_offset cache mode, >>> + * which can't be set explicitly and instead depends on the object placements, >>> + * as per the below. >>> + * >>> + * Implicit caching rules, starting from DG1: >>> + * >>> + * - If any of the object placements (see &drm_i915_gem_create_ext_memory_regions) >>> + * contain I915_MEMORY_CLASS_DEVICE then the object will be allocated and >>> + * mapped as write-combined only. > > Is this accurate? I thought they got WB when living in SMEM and WC > when on the device. But, since both are coherent, it's safe to lie to > userspace and say it's all WC. Is that correct or am I missing > something? > >> A note about write-combine buffer? I guess saying it is userspace >> responsibility to do it and how. > > What exactly are you thinking is userspace's responsibility? Flushing of the write combine buffer. > >>> + * >>> + * - Everything else is always allocated and mapped as write-back, with the >>> + * guarantee that everything is also coherent with the GPU. >> >> Haven't been following this so just a question on this one - it is not >> considered interesting to offer non-coherent modes, or even write >> combine, with system memory buffers, for a specific reason? > > We only care about non-coherent modes on integrated little-core. > There, we share memory between CPU and GPU but snooping from the GPU > is optional. Depending on access patterns, we might want WB with GPU > snooping or we might want WC. I don't think we care about WC for SMEM > allocations on discrete. For that matter, I'm not sure you can > actually shut snooping off when going across a "real" PCIe bus. At > least not with DG1. But writes to system memory buffers aren't going over the PCIe bus?! Anyways, I am not claiming it is an interesting use case, just wondering about the reasoning for making the modes fixed. Regards, Tvrtko > > --Jason > >> Regards, >> >> Tvrtko >> >>> + * >>> + * Note that this is likely to change in the future again, where we might need >>> + * more flexibility on future devices, so making this all explicit as part of a >>> + * new &drm_i915_gem_create_ext extension is probable. >>> */ >>> struct drm_i915_gem_set_domain { >>> /** @handle: Handle for the object. */ >>> 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=-14.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,HK_RANDOM_FROM,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 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 453D3C636C9 for ; Mon, 19 Jul 2021 09:00:36 +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 0D7E86100C for ; Mon, 19 Jul 2021 09:00:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0D7E86100C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.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 AD0E189E01; Mon, 19 Jul 2021 09:00:35 +0000 (UTC) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id AF7AA89E01; Mon, 19 Jul 2021 09:00:34 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10049"; a="198278878" X-IronPort-AV: E=Sophos;i="5.84,251,1620716400"; d="scan'208";a="198278878" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 02:00:34 -0700 X-IronPort-AV: E=Sophos;i="5.84,251,1620716400"; d="scan'208";a="631839741" Received: from mtlovett-mobl.ger.corp.intel.com (HELO [10.213.196.244]) ([10.213.196.244]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2021 02:00:31 -0700 To: Jason Ekstrand References: <20210715101536.2606307-1-matthew.auld@intel.com> <20210715101536.2606307-5-matthew.auld@intel.com> <70159117-ca97-667a-3e9b-82125bf309df@linux.intel.com> From: Tvrtko Ursulin Organization: Intel Corporation UK Plc Message-ID: <6e7493e6-33b6-afa7-e981-e3675c961416@linux.intel.com> Date: Mon, 19 Jul 2021 10:00:29 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH 4/4] drm/i915/uapi: reject set_domain for discrete X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?Q?Thomas_Hellstr=c3=b6m?= , Intel GFX , Maling list - DRI developers , Kenneth Graunke , Matthew Auld , Daniel Vetter Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Ck9uIDE2LzA3LzIwMjEgMTY6MjMsIEphc29uIEVrc3RyYW5kIHdyb3RlOgo+IE9uIEZyaSwgSnVs IDE2LCAyMDIxIGF0IDk6NTIgQU0gVHZydGtvIFVyc3VsaW4KPiA8dHZydGtvLnVyc3VsaW5AbGlu dXguaW50ZWwuY29tPiB3cm90ZToKPj4KPj4KPj4gT24gMTUvMDcvMjAyMSAxMToxNSwgTWF0dGhl dyBBdWxkIHdyb3RlOgo+Pj4gVGhlIENQVSBkb21haW4gc2hvdWxkIGJlIHN0YXRpYyBmb3IgZGlz Y3JldGUsIGFuZCBvbiBERzEgd2UgZG9uJ3QgbmVlZAo+Pj4gYW55IGZsdXNoaW5nIHNpbmNlIGV2 ZXJ5dGhpbmcgaXMgYWxyZWFkeSBjb2hlcmVudCwgc28gcmVhbGx5IGFsbCB0aGlzCj4+PiBkb2Vz IGlzIGFuIG9iamVjdCB3YWl0LCBmb3Igd2hpY2ggd2UgaGF2ZSBhbiBpb2N0bC4gTG9uZ2VyIHRl cm0gdGhlCj4+PiBkZXNpcmVkIGNhY2hpbmcgc2hvdWxkIGJlIGFuIGltbXV0YWJsZSBjcmVhdGlv biB0aW1lIHByb3BlcnR5IGZvciB0aGUKPj4+IEJPLCB3aGljaCBjYW4gYmUgc2V0IHdpdGggc29t ZXRoaW5nIGxpa2UgZ2VtX2NyZWF0ZV9leHQuCj4+Pgo+Pj4gT25lIG90aGVyIHVzZXIgaXMgaXJp cyArIHVzZXJwdHIsIHdoaWNoIHVzZXMgdGhlIHNldF9kb21haW4gdG8gcHJvYmUgYWxsCj4+PiB0 aGUgcGFnZXMgdG8gY2hlY2sgaWYgdGhlIEdVUCBzdWNjZWVkcywgaG93ZXZlciB3ZSBub3cgaGF2 ZSBhIFBST0JFCj4+PiBmbGFnIGZvciB0aGlzIHB1cnBvc2UuCj4+Pgo+Pj4gdjI6IGFkZCBzb21l IG1vcmUga2VybmVsIGRvYywgYWxzbyBhZGQgdGhlIGltcGxpY2l0IHJ1bGVzIHdpdGggY2FjaGlu Zwo+Pj4KPj4+IFN1Z2dlc3RlZC1ieTogRGFuaWVsIFZldHRlciA8ZGFuaWVsQGZmd2xsLmNoPgo+ Pj4gU2lnbmVkLW9mZi1ieTogTWF0dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgo+ Pj4gQ2M6IFRob21hcyBIZWxsc3Ryw7ZtIDx0aG9tYXMuaGVsbHN0cm9tQGxpbnV4LmludGVsLmNv bT4KPj4+IENjOiBNYWFydGVuIExhbmtob3JzdCA8bWFhcnRlbi5sYW5raG9yc3RAbGludXguaW50 ZWwuY29tPgo+Pj4gQ2M6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBsaW51eC5pbnRl bC5jb20+Cj4+PiBDYzogSm9yZGFuIEp1c3RlbiA8am9yZGFuLmwuanVzdGVuQGludGVsLmNvbT4K Pj4+IENjOiBLZW5uZXRoIEdyYXVua2UgPGtlbm5ldGhAd2hpdGVjYXBlLm9yZz4KPj4+IENjOiBK YXNvbiBFa3N0cmFuZCA8amFzb25Aamxla3N0cmFuZC5uZXQ+Cj4+PiBDYzogRGFuaWVsIFZldHRl ciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KPj4+IENjOiBSYW1hbGluZ2FtIEMgPHJhbWFsaW5n YW0uY0BpbnRlbC5jb20+Cj4+PiBSZXZpZXdlZC1ieTogUmFtYWxpbmdhbSBDIDxyYW1hbGluZ2Ft LmNAaW50ZWwuY29tPgo+Pj4gLS0tCj4+PiAgICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkx NV9nZW1fZG9tYWluLmMgfCAgMyArKysKPj4+ICAgIGluY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0u aCAgICAgICAgICAgICAgICB8IDE5ICsrKysrKysrKysrKysrKysrKysKPj4+ICAgIDIgZmlsZXMg Y2hhbmdlZCwgMjIgaW5zZXJ0aW9ucygrKQo+Pj4KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fZG9tYWluLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n ZW0vaTkxNV9nZW1fZG9tYWluLmMKPj4+IGluZGV4IDQzMDA0YmVmNTVjYi4uYjY4NGE2MmJmM2Iw IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2RvbWFp bi5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fZG9tYWluLmMK Pj4+IEBAIC00OTAsNiArNDkwLDkgQEAgaTkxNV9nZW1fc2V0X2RvbWFpbl9pb2N0bChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+Pj4gICAgICAgIHUzMiB3cml0ZV9kb21haW4g PSBhcmdzLT53cml0ZV9kb21haW47Cj4+PiAgICAgICAgaW50IGVycjsKPj4+Cj4+PiArICAgICBp ZiAoSVNfREdGWCh0b19pOTE1KGRldikpKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVOT0RF VjsKPj4+ICsKPj4+ICAgICAgICAvKiBPbmx5IGhhbmRsZSBzZXR0aW5nIGRvbWFpbnMgdG8gdHlw ZXMgdXNlZCBieSB0aGUgQ1BVLiAqLwo+Pj4gICAgICAgIGlmICgod3JpdGVfZG9tYWluIHwgcmVh ZF9kb21haW5zKSAmIEk5MTVfR0VNX0dQVV9ET01BSU5TKQo+Pj4gICAgICAgICAgICAgICAgcmV0 dXJuIC1FSU5WQUw7Cj4+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5o IGIvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5oCj4+PiBpbmRleCAyZTQxMTJiZjRkMzguLjA0 Y2UzMTBlN2VlNiAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvdWFwaS9kcm0vaTkxNV9kcm0uaAo+ Pj4gKysrIGIvaW5jbHVkZS91YXBpL2RybS9pOTE1X2RybS5oCj4+PiBAQCAtOTAxLDYgKzkwMSwy NSBAQCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfb2Zmc2V0IHsKPj4+ICAgICAqICAtIEk5MTVf R0VNX0RPTUFJTl9HVFQ6IE1hcHBhYmxlIGFwZXJ0dXJlIGRvbWFpbgo+Pj4gICAgICoKPj4+ICAg ICAqIEFsbCBvdGhlciBkb21haW5zIGFyZSByZWplY3RlZC4KPj4+ICsgKgo+Pj4gKyAqIE5vdGUg dGhhdCBmb3IgZGlzY3JldGUsIHN0YXJ0aW5nIGZyb20gREcxLCB0aGlzIGlzIG5vIGxvbmdlciBz dXBwb3J0ZWQsIGFuZAo+Pj4gKyAqIGlzIGluc3RlYWQgcmVqZWN0ZWQuIE9uIHN1Y2ggcGxhdGZv cm1zIHRoZSBDUFUgZG9tYWluIGlzIGVmZmVjdGl2ZWx5IHN0YXRpYywKPj4+ICsgKiB3aGVyZSB3 ZSBhbHNvIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSAmZHJtX2k5MTVfZ2VtX21tYXBfb2Zmc2V0IGNh Y2hlIG1vZGUsCj4+PiArICogd2hpY2ggY2FuJ3QgYmUgc2V0IGV4cGxpY2l0bHkgYW5kIGluc3Rl YWQgZGVwZW5kcyBvbiB0aGUgb2JqZWN0IHBsYWNlbWVudHMsCj4+PiArICogYXMgcGVyIHRoZSBi ZWxvdy4KPj4+ICsgKgo+Pj4gKyAqIEltcGxpY2l0IGNhY2hpbmcgcnVsZXMsIHN0YXJ0aW5nIGZy b20gREcxOgo+Pj4gKyAqCj4+PiArICogICAtIElmIGFueSBvZiB0aGUgb2JqZWN0IHBsYWNlbWVu dHMgKHNlZSAmZHJtX2k5MTVfZ2VtX2NyZWF0ZV9leHRfbWVtb3J5X3JlZ2lvbnMpCj4+PiArICog ICAgIGNvbnRhaW4gSTkxNV9NRU1PUllfQ0xBU1NfREVWSUNFIHRoZW4gdGhlIG9iamVjdCB3aWxs IGJlIGFsbG9jYXRlZCBhbmQKPj4+ICsgKiAgICAgbWFwcGVkIGFzIHdyaXRlLWNvbWJpbmVkIG9u bHkuCj4gCj4gSXMgdGhpcyBhY2N1cmF0ZT8gIEkgdGhvdWdodCB0aGV5IGdvdCBXQiB3aGVuIGxp dmluZyBpbiBTTUVNIGFuZCBXQwo+IHdoZW4gb24gdGhlIGRldmljZS4gIEJ1dCwgc2luY2UgYm90 aCBhcmUgY29oZXJlbnQsIGl0J3Mgc2FmZSB0byBsaWUgdG8KPiB1c2Vyc3BhY2UgYW5kIHNheSBp dCdzIGFsbCBXQy4gIElzIHRoYXQgY29ycmVjdCBvciBhbSBJIG1pc3NpbmcKPiBzb21ldGhpbmc/ Cj4gCj4+IEEgbm90ZSBhYm91dCB3cml0ZS1jb21iaW5lIGJ1ZmZlcj8gSSBndWVzcyBzYXlpbmcg aXQgaXMgdXNlcnNwYWNlCj4+IHJlc3BvbnNpYmlsaXR5IHRvIGRvIGl0IGFuZCBob3cuCj4gCj4g V2hhdCBleGFjdGx5IGFyZSB5b3UgdGhpbmtpbmcgaXMgdXNlcnNwYWNlJ3MgcmVzcG9uc2liaWxp dHk/CgpGbHVzaGluZyBvZiB0aGUgd3JpdGUgY29tYmluZSBidWZmZXIuCgo+IAo+Pj4gKyAqCj4+ PiArICogICAtIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhbHdheXMgYWxsb2NhdGVkIGFuZCBtYXBwZWQg YXMgd3JpdGUtYmFjaywgd2l0aCB0aGUKPj4+ICsgKiAgICAgZ3VhcmFudGVlIHRoYXQgZXZlcnl0 aGluZyBpcyBhbHNvIGNvaGVyZW50IHdpdGggdGhlIEdQVS4KPj4KPj4gSGF2ZW4ndCBiZWVuIGZv bGxvd2luZyB0aGlzIHNvIGp1c3QgYSBxdWVzdGlvbiBvbiB0aGlzIG9uZSAtIGl0IGlzIG5vdAo+ PiBjb25zaWRlcmVkIGludGVyZXN0aW5nIHRvIG9mZmVyIG5vbi1jb2hlcmVudCBtb2Rlcywgb3Ig ZXZlbiB3cml0ZQo+PiBjb21iaW5lLCB3aXRoIHN5c3RlbSBtZW1vcnkgYnVmZmVycywgZm9yIGEg c3BlY2lmaWMgcmVhc29uPwo+IAo+IFdlIG9ubHkgY2FyZSBhYm91dCBub24tY29oZXJlbnQgbW9k ZXMgb24gaW50ZWdyYXRlZCBsaXR0bGUtY29yZS4KPiBUaGVyZSwgd2Ugc2hhcmUgbWVtb3J5IGJl dHdlZW4gQ1BVIGFuZCBHUFUgYnV0IHNub29waW5nIGZyb20gdGhlIEdQVQo+IGlzIG9wdGlvbmFs LiAgRGVwZW5kaW5nIG9uIGFjY2VzcyBwYXR0ZXJucywgd2UgbWlnaHQgd2FudCBXQiB3aXRoIEdQ VQo+IHNub29waW5nIG9yIHdlIG1pZ2h0IHdhbnQgV0MuICBJIGRvbid0IHRoaW5rIHdlIGNhcmUg YWJvdXQgV0MgZm9yIFNNRU0KPiBhbGxvY2F0aW9ucyBvbiBkaXNjcmV0ZS4gIEZvciB0aGF0IG1h dHRlciwgSSdtIG5vdCBzdXJlIHlvdSBjYW4KPiBhY3R1YWxseSBzaHV0IHNub29waW5nIG9mZiB3 aGVuIGdvaW5nIGFjcm9zcyBhICJyZWFsIiBQQ0llIGJ1cy4gIEF0Cj4gbGVhc3Qgbm90IHdpdGgg REcxLgoKQnV0IHdyaXRlcyB0byBzeXN0ZW0gbWVtb3J5IGJ1ZmZlcnMgYXJlbid0IGdvaW5nIG92 ZXIgdGhlIFBDSWUgYnVzPyEKCkFueXdheXMsIEkgYW0gbm90IGNsYWltaW5nIGl0IGlzIGFuIGlu dGVyZXN0aW5nIHVzZSBjYXNlLCBqdXN0IHdvbmRlcmluZyAKYWJvdXQgdGhlIHJlYXNvbmluZyBm b3IgbWFraW5nIHRoZSBtb2RlcyBmaXhlZC4KClJlZ2FyZHMsCgpUdnJ0a28KCj4gCj4gLS1KYXNv bgo+IAo+PiBSZWdhcmRzLAo+Pgo+PiBUdnJ0a28KPj4KPj4+ICsgKgo+Pj4gKyAqIE5vdGUgdGhh dCB0aGlzIGlzIGxpa2VseSB0byBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBhZ2Fpbiwgd2hlcmUgd2Ug bWlnaHQgbmVlZAo+Pj4gKyAqIG1vcmUgZmxleGliaWxpdHkgb24gZnV0dXJlIGRldmljZXMsIHNv IG1ha2luZyB0aGlzIGFsbCBleHBsaWNpdCBhcyBwYXJ0IG9mIGEKPj4+ICsgKiBuZXcgJmRybV9p OTE1X2dlbV9jcmVhdGVfZXh0IGV4dGVuc2lvbiBpcyBwcm9iYWJsZS4KPj4+ICAgICAqLwo+Pj4g ICAgc3RydWN0IGRybV9pOTE1X2dlbV9zZXRfZG9tYWluIHsKPj4+ICAgICAgICAvKiogQGhhbmRs ZTogSGFuZGxlIGZvciB0aGUgb2JqZWN0LiAqLwo+Pj4KX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==