From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934036AbcIOG7Q (ORCPT ); Thu, 15 Sep 2016 02:59:16 -0400 Received: from mga03.intel.com ([134.134.136.65]:58916 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760010AbcIOG7O (ORCPT ); Thu, 15 Sep 2016 02:59:14 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,338,1470726000"; d="scan'208";a="1040135749" From: Jani Nikula To: bobcao3 , Daniel Vetter , David Airlie Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Icenowy Zheng , stable@vger.kernel.org, bobcao3 Subject: Re: [PATCH] DRM: i915: Fix gen8 graphics on Broadwell-U. These patches stop the random gpu hang on my XPS-13-9343, kernel version 4.8-rc5. In-Reply-To: <20160915031208.20191-1-bobcaocheng@163.com> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <20160915031208.20191-1-bobcaocheng@163.com> User-Agent: Notmuch/0.22.1+62~g2a7b11b (https://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Thu, 15 Sep 2016 09:59:01 +0300 Message-ID: <87poo5zm16.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 15 Sep 2016, bobcao3 wrote: > DRM: i915: Fix gen8 graphics on Broadwell-U. These patches stop the > random gpu hang on my XPS-13-9343, kernel version 4.8-rc5. Please do everyone a favor and file a bug on the hangs over at [1], describing the issue and attaching the error state etc. After that, referencing the bug in a patch fixing the issue goes a long way for justifying the patch. What you have here isn't enough. BR, Jani. [1] https://bugs.freedesktop.org/enter_bug.cgi?product=DRI&component=DRM/Intel On Thu, 15 Sep 2016, bobcao3 wrote: > Signed-off-by: bobcao3 > --- > drivers/gpu/drm/i915/i915_gem_gtt.c | 6 ++++ > drivers/gpu/drm/i915/i915_gem_stolen.c | 61 ++++++++++++++++----------------- > drivers/gpu/drm/i915/i915_reg.h | 6 ++++ > drivers/gpu/drm/i915/intel_ringbuffer.c | 19 +++++++++- > 4 files changed, 59 insertions(+), 33 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c > index 7a30af7..0b05dd9 100644 > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c > @@ -2907,6 +2907,12 @@ static unsigned int gen8_get_total_gtt_size(u16 bdw_gmch_ctl) > if (bdw_gmch_ctl > 4) > bdw_gmch_ctl = 4; > #endif > +#ifdef CONFIG_X86_64 > + /* Limit 64b platforms to a 4GB GGTT */ > + /* DMA 4GB protection */ > + if (bdw_gmch_ctl > 8) > + bdw_gmch_ctl = 8; > +#endif > > return bdw_gmch_ctl << 20; > } > diff --git a/drivers/gpu/drm/i915/i915_gem_stolen.c b/drivers/gpu/drm/i915/i915_gem_stolen.c > index 66be299a1..da272ae 100644 > --- a/drivers/gpu/drm/i915/i915_gem_stolen.c > +++ b/drivers/gpu/drm/i915/i915_gem_stolen.c > @@ -352,47 +352,44 @@ static void gen8_get_stolen_reserved(struct drm_i915_private *dev_priv, > unsigned long *base, unsigned long *size) > { > uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); > + unsigned long stolen_top; > + struct i915_ggtt *ggtt = &dev_priv->ggtt; > > *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; > > switch (reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK) { > case GEN8_STOLEN_RESERVED_1M: > - *size = 1024 * 1024; > + *size = 1 << 10 << 10; > break; > case GEN8_STOLEN_RESERVED_2M: > - *size = 2 * 1024 * 1024; > + *size = 2 << 10 << 10; > break; > case GEN8_STOLEN_RESERVED_4M: > - *size = 4 * 1024 * 1024; > + *size = 4 << 10 << 10; > break; > case GEN8_STOLEN_RESERVED_8M: > - *size = 8 * 1024 * 1024; > + *size = 8 << 10 << 10; > break; > default: > - *size = 8 * 1024 * 1024; > - MISSING_CASE(reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK); > - } > -} > - > -static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv, > - unsigned long *base, unsigned long *size) > -{ > - struct i915_ggtt *ggtt = &dev_priv->ggtt; > - uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED); > - unsigned long stolen_top; > + /* Whatever if it is a BDW device or SKL device > + * Or others devices.. > + * This way is always going to work on 5th > + * generation Intel Processer > + */ > + stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size; > > - stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size; > + *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; > > - *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK; > + /* MLIMIT - MBASE => PEG */ > + /* -- mobile-5th-gen-core-family-datasheet-vol-2.pdf */ > + if (*base == 0) { > + *size = 0; > + MISSING_CASE(reg_val & GEN8_STOLEN_RESERVED_SIZE_MASK); > + } else > + *size = stolen_top - *base; > > - /* On these platforms, the register doesn't have a size field, so the > - * size is the distance between the base and the top of the stolen > - * memory. We also have the genuine case where base is zero and there's > - * nothing reserved. */ > - if (*base == 0) > - *size = 0; > - else > - *size = stolen_top - *base; > + break; > + } > } > > int i915_gem_init_stolen(struct drm_device *dev) > @@ -442,14 +439,14 @@ int i915_gem_init_stolen(struct drm_device *dev) > gen7_get_stolen_reserved(dev_priv, &reserved_base, > &reserved_size); > break; > + case 8: > + gen8_get_stolen_reserved(dev_priv, &reserved_base, > + &reserved_size); > + break; > default: > - if (IS_BROADWELL(dev_priv) || > - IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev)) > - bdw_get_stolen_reserved(dev_priv, &reserved_base, > - &reserved_size); > - else > - gen8_get_stolen_reserved(dev_priv, &reserved_base, > - &reserved_size); > + // FIXME: This seemed like going to work > + gen8_get_stolen_reserved(dev_priv, &reserved_base, > + &reserved_size); > break; > } > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index bf2cad3..3dce37b 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -1748,6 +1748,12 @@ enum skl_disp_power_wells { > #define RING_INDIRECT_CTX_OFFSET(base) _MMIO((base)+0x1c8) /* gen8+ */ > #define RING_CTX_TIMESTAMP(base) _MMIO((base)+0x3a8) /* gen8+ */ > > +// 64 bit, low 32 preserved > +#define IOTLB_INVALID(base) _MMIO((base)+0x508 + 4) /* gen8+ */ > +#define IOTLB_INVALID_IVT (1<<31) > +#define IOTLB_GLOBAL_INV_REQ (1<<28) > +#define IOTLB_INVALID_IAIG (1<<25) > + > #define ERROR_GEN6 _MMIO(0x40a0) > #define GEN7_ERR_INT _MMIO(0x44040) > #define ERR_INT_POISON (1<<31) > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c > index 1d3161b..77bb6ff 100644 > --- a/drivers/gpu/drm/i915/intel_ringbuffer.c > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c > @@ -498,7 +498,24 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *engine) > * arises: do we still need this and if so how should we go about > * invalidating the TLB? > */ > - if (IS_GEN(dev_priv, 6, 7)) { > + /* Respond to this question: > + * According to mobile-5th-gen-core-family-datasheet-vol-2 from Intel > + * There are registers for invalidation, set those registers will > + * cause the hardware to perform IOTLB invalidation. > + */ > + if (IS_GEN8(dev_priv)) { > + i915_reg_t reg = IOTLB_INVALID(engine->mmio_base); > + > + /* ring should be idle before issuing a sync flush*/ > + WARN_ON((I915_READ_MODE(engine) & MODE_IDLE) == 0); > + > + I915_WRITE(reg, 0x0 | IOTLB_INVALID_IVT | IOTLB_GLOBAL_INV_REQ); > + > + if (intel_wait_for_register(dev_priv, > + reg, IOTLB_INVALID_IAIG, 0, > + 1000)) > + DRM_ERROR("%s: wait for TLB invalidation timed out\n", > + engine->name); > + } else if (IS_GEN(dev_priv, 6, 7)) { > i915_reg_t reg = RING_INSTPM(engine->mmio_base); > > /* ring should be idle before issuing a sync flush*/ -- Jani Nikula, Intel Open Source Technology Center From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: Re: [PATCH] DRM: i915: Fix gen8 graphics on Broadwell-U. These patches stop the random gpu hang on my XPS-13-9343, kernel version 4.8-rc5. Date: Thu, 15 Sep 2016 09:59:01 +0300 Message-ID: <87poo5zm16.fsf@intel.com> References: <20160915031208.20191-1-bobcaocheng@163.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20160915031208.20191-1-bobcaocheng@163.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Daniel Vetter , David Airlie Cc: bobcao3 , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, dri-devel@lists.freedesktop.org, Icenowy Zheng List-Id: dri-devel@lists.freedesktop.org Ck9uIFRodSwgMTUgU2VwIDIwMTYsIGJvYmNhbzMgPGJvYmNhb2NoZW5nQDE2My5jb20+IHdyb3Rl Ogo+IERSTTogaTkxNTogRml4IGdlbjggZ3JhcGhpY3Mgb24gQnJvYWR3ZWxsLVUuIFRoZXNlIHBh dGNoZXMgc3RvcCB0aGUKPiByYW5kb20gZ3B1IGhhbmcgb24gbXkgWFBTLTEzLTkzNDMsIGtlcm5l bCB2ZXJzaW9uIDQuOC1yYzUuCgpQbGVhc2UgZG8gZXZlcnlvbmUgYSBmYXZvciBhbmQgZmlsZSBh IGJ1ZyBvbiB0aGUgaGFuZ3Mgb3ZlciBhdCBbMV0sCmRlc2NyaWJpbmcgdGhlIGlzc3VlIGFuZCBh dHRhY2hpbmcgdGhlIGVycm9yIHN0YXRlIGV0Yy4gQWZ0ZXIgdGhhdCwKcmVmZXJlbmNpbmcgdGhl IGJ1ZyBpbiBhIHBhdGNoIGZpeGluZyB0aGUgaXNzdWUgZ29lcyBhIGxvbmcgd2F5IGZvcgpqdXN0 aWZ5aW5nIHRoZSBwYXRjaC4gV2hhdCB5b3UgaGF2ZSBoZXJlIGlzbid0IGVub3VnaC4KCkJSLApK YW5pLgoKClsxXSBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL2VudGVyX2J1Zy5jZ2k/cHJv ZHVjdD1EUkkmY29tcG9uZW50PURSTS9JbnRlbAoKCk9uIFRodSwgMTUgU2VwIDIwMTYsIGJvYmNh bzMgPGJvYmNhb2NoZW5nQDE2My5jb20+IHdyb3RlOgo+IFNpZ25lZC1vZmYtYnk6IGJvYmNhbzMg PGJvYmNhb2NoZW5nQDE2My5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2d0dC5jICAgICB8ICA2ICsrKysKPiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f c3RvbGVuLmMgIHwgNjEgKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tCj4gIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmggICAgICAgICB8ICA2ICsrKysKPiAgZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIHwgMTkgKysrKysrKysrLQo+ICA0IGZpbGVz IGNoYW5nZWQsIDU5IGluc2VydGlvbnMoKyksIDMzIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW1fZ3R0LmMKPiBpbmRleCA3YTMwYWY3Li4wYjA1ZGQ5IDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKPiBAQCAtMjkwNyw2ICsyOTA3LDEyIEBAIHN0YXRp YyB1bnNpZ25lZCBpbnQgZ2VuOF9nZXRfdG90YWxfZ3R0X3NpemUodTE2IGJkd19nbWNoX2N0bCkK PiAgCWlmIChiZHdfZ21jaF9jdGwgPiA0KQo+ICAJCWJkd19nbWNoX2N0bCA9IDQ7Cj4gICNlbmRp Zgo+ICsjaWZkZWYgQ09ORklHX1g4Nl82NAo+ICsJLyogTGltaXQgNjRiIHBsYXRmb3JtcyB0byBh IDRHQiBHR1RUICovCj4gKwkvKiBETUEgNEdCIHByb3RlY3Rpb24gKi8KPiArCWlmIChiZHdfZ21j aF9jdGwgPiA4KQo+ICsJCWJkd19nbWNoX2N0bCA9IDg7Cj4gKyNlbmRpZgo+ICAKPiAgCXJldHVy biBiZHdfZ21jaF9jdGwgPDwgMjA7Cj4gIH0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW1fc3RvbGVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9z dG9sZW4uYwo+IGluZGV4IDY2YmUyOTlhMS4uZGEyNzJhZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9zdG9sZW4uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtX3N0b2xlbi5jCj4gQEAgLTM1Miw0NyArMzUyLDQ0IEBAIHN0YXRpYyB2b2lk IGdlbjhfZ2V0X3N0b2xlbl9yZXNlcnZlZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYsCj4gIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmJhc2UsIHVuc2lnbmVkIGxvbmcgKnNpemUp Cj4gIHsKPiAgCXVpbnQzMl90IHJlZ192YWwgPSBJOTE1X1JFQUQoR0VONl9TVE9MRU5fUkVTRVJW RUQpOwo+ICsJdW5zaWduZWQgbG9uZyBzdG9sZW5fdG9wOwo+ICsJc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCA9ICZkZXZfcHJpdi0+Z2d0dDsKPiAgCj4gIAkqYmFzZSA9IHJlZ192YWwgJiBHRU42X1NU T0xFTl9SRVNFUlZFRF9BRERSX01BU0s7Cj4gIAo+ICAJc3dpdGNoIChyZWdfdmFsICYgR0VOOF9T VE9MRU5fUkVTRVJWRURfU0laRV9NQVNLKSB7Cj4gIAljYXNlIEdFTjhfU1RPTEVOX1JFU0VSVkVE XzFNOgo+IC0JCSpzaXplID0gMTAyNCAqIDEwMjQ7Cj4gKwkJKnNpemUgPSAxIDw8IDEwIDw8IDEw Owo+ICAJCWJyZWFrOwo+ICAJY2FzZSBHRU44X1NUT0xFTl9SRVNFUlZFRF8yTToKPiAtCQkqc2l6 ZSA9IDIgKiAxMDI0ICogMTAyNDsKPiArCQkqc2l6ZSA9IDIgPDwgMTAgPDwgMTA7Cj4gIAkJYnJl YWs7Cj4gIAljYXNlIEdFTjhfU1RPTEVOX1JFU0VSVkVEXzRNOgo+IC0JCSpzaXplID0gNCAqIDEw MjQgKiAxMDI0Owo+ICsJCSpzaXplID0gNCA8PCAxMCA8PCAxMDsKPiAgCQlicmVhazsKPiAgCWNh c2UgR0VOOF9TVE9MRU5fUkVTRVJWRURfOE06Cj4gLQkJKnNpemUgPSA4ICogMTAyNCAqIDEwMjQ7 Cj4gKwkJKnNpemUgPSA4IDw8IDEwIDw8IDEwOwo+ICAJCWJyZWFrOwo+ICAJZGVmYXVsdDoKPiAt CQkqc2l6ZSA9IDggKiAxMDI0ICogMTAyNDsKPiAtCQlNSVNTSU5HX0NBU0UocmVnX3ZhbCAmIEdF TjhfU1RPTEVOX1JFU0VSVkVEX1NJWkVfTUFTSyk7Cj4gLQl9Cj4gLX0KPiAtCj4gLXN0YXRpYyB2 b2lkIGJkd19nZXRfc3RvbGVuX3Jlc2VydmVkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKPiAtCQkJCSAgICB1bnNpZ25lZCBsb25nICpiYXNlLCB1bnNpZ25lZCBsb25nICpzaXpl KQo+IC17Cj4gLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gJmRldl9wcml2LT5nZ3R0Owo+IC0J dWludDMyX3QgcmVnX3ZhbCA9IEk5MTVfUkVBRChHRU42X1NUT0xFTl9SRVNFUlZFRCk7Cj4gLQl1 bnNpZ25lZCBsb25nIHN0b2xlbl90b3A7Cj4gKwkJLyogV2hhdGV2ZXIgaWYgaXQgaXMgYSBCRFcg ZGV2aWNlIG9yIFNLTCBkZXZpY2UKPiArCQkgKiBPciBvdGhlcnMgZGV2aWNlcy4uCj4gKwkJICog VGhpcyB3YXkgaXMgYWx3YXlzIGdvaW5nIHRvIHdvcmsgb24gNXRoCj4gKwkJICogZ2VuZXJhdGlv biBJbnRlbCBQcm9jZXNzZXIKPiArCQkgKi8KPiArCQlzdG9sZW5fdG9wID0gZGV2X3ByaXYtPm1t LnN0b2xlbl9iYXNlICsgZ2d0dC0+c3RvbGVuX3NpemU7Cj4gIAo+IC0Jc3RvbGVuX3RvcCA9IGRl dl9wcml2LT5tbS5zdG9sZW5fYmFzZSArIGdndHQtPnN0b2xlbl9zaXplOwo+ICsJCSpiYXNlID0g cmVnX3ZhbCAmIEdFTjZfU1RPTEVOX1JFU0VSVkVEX0FERFJfTUFTSzsKPiAgCj4gLQkqYmFzZSA9 IHJlZ192YWwgJiBHRU42X1NUT0xFTl9SRVNFUlZFRF9BRERSX01BU0s7Cj4gKwkJLyogTUxJTUlU IC0gTUJBU0UgPT4gUEVHICovCj4gKwkJLyogICAtLSBtb2JpbGUtNXRoLWdlbi1jb3JlLWZhbWls eS1kYXRhc2hlZXQtdm9sLTIucGRmICovCj4gKwkJaWYgKCpiYXNlID09IDApIHsKPiArCQkJKnNp emUgPSAwOwo+ICsJCQlNSVNTSU5HX0NBU0UocmVnX3ZhbCAmIEdFTjhfU1RPTEVOX1JFU0VSVkVE X1NJWkVfTUFTSyk7Cj4gKwkJfSBlbHNlCj4gKwkJCSpzaXplID0gc3RvbGVuX3RvcCAtICpiYXNl Owo+ICAKPiAtCS8qIE9uIHRoZXNlIHBsYXRmb3JtcywgdGhlIHJlZ2lzdGVyIGRvZXNuJ3QgaGF2 ZSBhIHNpemUgZmllbGQsIHNvIHRoZQo+IC0JICogc2l6ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2Vl biB0aGUgYmFzZSBhbmQgdGhlIHRvcCBvZiB0aGUgc3RvbGVuCj4gLQkgKiBtZW1vcnkuIFdlIGFs c28gaGF2ZSB0aGUgZ2VudWluZSBjYXNlIHdoZXJlIGJhc2UgaXMgemVybyBhbmQgdGhlcmUncwo+ IC0JICogbm90aGluZyByZXNlcnZlZC4gKi8KPiAtCWlmICgqYmFzZSA9PSAwKQo+IC0JCSpzaXpl ID0gMDsKPiAtCWVsc2UKPiAtCQkqc2l6ZSA9IHN0b2xlbl90b3AgLSAqYmFzZTsKPiArCQlicmVh azsKPiArCX0KPiAgfQo+ICAKPiAgaW50IGk5MTVfZ2VtX2luaXRfc3RvbGVuKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCj4gQEAgLTQ0MiwxNCArNDM5LDE0IEBAIGludCBpOTE1X2dlbV9pbml0X3N0 b2xlbihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ICAJCWdlbjdfZ2V0X3N0b2xlbl9yZXNlcnZl ZChkZXZfcHJpdiwgJnJlc2VydmVkX2Jhc2UsCj4gIAkJCQkJICZyZXNlcnZlZF9zaXplKTsKPiAg CQlicmVhazsKPiArCWNhc2UgODoKPiArCQlnZW44X2dldF9zdG9sZW5fcmVzZXJ2ZWQoZGV2X3By aXYsICZyZXNlcnZlZF9iYXNlLAo+ICsJCQkJCSAmcmVzZXJ2ZWRfc2l6ZSk7Cj4gKwkJYnJlYWs7 Cj4gIAlkZWZhdWx0Ogo+IC0JCWlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpIHx8Cj4gLQkJICAg IElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8IElTX0tBQllMQUtFKGRldikpCj4gLQkJCWJkd19nZXRf c3RvbGVuX3Jlc2VydmVkKGRldl9wcml2LCAmcmVzZXJ2ZWRfYmFzZSwKPiAtCQkJCQkJJnJlc2Vy dmVkX3NpemUpOwo+IC0JCWVsc2UKPiAtCQkJZ2VuOF9nZXRfc3RvbGVuX3Jlc2VydmVkKGRldl9w cml2LCAmcmVzZXJ2ZWRfYmFzZSwKPiAtCQkJCQkJICZyZXNlcnZlZF9zaXplKTsKPiArCQkvLyBG SVhNRTogVGhpcyBzZWVtZWQgbGlrZSBnb2luZyB0byB3b3JrCj4gKwkJZ2VuOF9nZXRfc3RvbGVu X3Jlc2VydmVkKGRldl9wcml2LCAmcmVzZXJ2ZWRfYmFzZSwKPiArCQkJCSAmcmVzZXJ2ZWRfc2l6 ZSk7Cj4gIAkJYnJlYWs7Cj4gIAl9Cj4gIAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAo+IGluZGV4 IGJmMmNhZDMuLjNkY2UzN2IgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9yZWcuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKPiBAQCAtMTc0 OCw2ICsxNzQ4LDEyIEBAIGVudW0gc2tsX2Rpc3BfcG93ZXJfd2VsbHMgewo+ICAjZGVmaW5lIFJJ TkdfSU5ESVJFQ1RfQ1RYX09GRlNFVChiYXNlKQlfTU1JTygoYmFzZSkrMHgxYzgpIC8qIGdlbjgr ICovCj4gICNkZWZpbmUgUklOR19DVFhfVElNRVNUQU1QKGJhc2UpCV9NTUlPKChiYXNlKSsweDNh OCkgLyogZ2VuOCsgKi8KPiAgCj4gKy8vIDY0IGJpdCwgbG93IDMyIHByZXNlcnZlZAo+ICsjZGVm aW5lIElPVExCX0lOVkFMSUQoYmFzZSkgX01NSU8oKGJhc2UpKzB4NTA4ICsgNCkgLyogZ2VuOCsg Ki8KPiArI2RlZmluZSAgIElPVExCX0lOVkFMSURfSVZUICgxPDwzMSkKPiArI2RlZmluZSAgIElP VExCX0dMT0JBTF9JTlZfUkVRICgxPDwyOCkKPiArI2RlZmluZSAgIElPVExCX0lOVkFMSURfSUFJ RyAoMTw8MjUpCj4gKwo+ICAjZGVmaW5lIEVSUk9SX0dFTjYJX01NSU8oMHg0MGEwKQo+ICAjZGVm aW5lIEdFTjdfRVJSX0lOVAlfTU1JTygweDQ0MDQwKQo+ICAjZGVmaW5lICAgRVJSX0lOVF9QT0lT T04JCSgxPDwzMSkKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmlu Z2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jCj4gaW5k ZXggMWQzMTYxYi4uNzdiYjZmZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9yaW5nYnVmZmVyLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5n YnVmZmVyLmMKPiBAQCAtNDk4LDcgKzQ5OCwyNCBAQCBzdGF0aWMgdm9pZCBpbnRlbF9yaW5nX3Nl dHVwX3N0YXR1c19wYWdlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKPiAgCSAqIGFy aXNlczogZG8gd2Ugc3RpbGwgbmVlZCB0aGlzIGFuZCBpZiBzbyBob3cgc2hvdWxkIHdlIGdvIGFi b3V0Cj4gIAkgKiBpbnZhbGlkYXRpbmcgdGhlIFRMQj8KPiAgCSAqLwo+IC0JaWYgKElTX0dFTihk ZXZfcHJpdiwgNiwgNykpIHsKPiArCS8qIFJlc3BvbmQgdG8gdGhpcyBxdWVzdGlvbjoKPiArCSAq ICBBY2NvcmRpbmcgdG8gbW9iaWxlLTV0aC1nZW4tY29yZS1mYW1pbHktZGF0YXNoZWV0LXZvbC0y IGZyb20gSW50ZWwKPiArCSAqICBUaGVyZSBhcmUgcmVnaXN0ZXJzIGZvciBpbnZhbGlkYXRpb24s IHNldCB0aG9zZSByZWdpc3RlcnMgd2lsbAo+ICsJICogIGNhdXNlIHRoZSBoYXJkd2FyZSB0byBw ZXJmb3JtIElPVExCIGludmFsaWRhdGlvbi4KPiArCSAqLwo+ICsJaWYgKElTX0dFTjgoZGV2X3By aXYpKSB7Cj4gKwkJaTkxNV9yZWdfdCByZWcgPSBJT1RMQl9JTlZBTElEKGVuZ2luZS0+bW1pb19i YXNlKTsKPiArCj4gKwkJLyogcmluZyBzaG91bGQgYmUgaWRsZSBiZWZvcmUgaXNzdWluZyBhIHN5 bmMgZmx1c2gqLwo+ICsJCVdBUk5fT04oKEk5MTVfUkVBRF9NT0RFKGVuZ2luZSkgJiBNT0RFX0lE TEUpID09IDApOwo+ICsKPiArCQlJOTE1X1dSSVRFKHJlZywgMHgwIHwgSU9UTEJfSU5WQUxJRF9J VlQgfCBJT1RMQl9HTE9CQUxfSU5WX1JFUSk7Cj4gKwo+ICsJCWlmIChpbnRlbF93YWl0X2Zvcl9y ZWdpc3RlcihkZXZfcHJpdiwKPiArCQkJCQkgICAgcmVnLCBJT1RMQl9JTlZBTElEX0lBSUcsIDAs Cj4gKwkJCQkJICAgIDEwMDApKQo+ICsJCQlEUk1fRVJST1IoIiVzOiB3YWl0IGZvciBUTEIgaW52 YWxpZGF0aW9uIHRpbWVkIG91dFxuIiwKPiArCQkJCSAgZW5naW5lLT5uYW1lKTsKPiArCX0gZWxz ZQlpZiAoSVNfR0VOKGRldl9wcml2LCA2LCA3KSkgewo+ICAJCWk5MTVfcmVnX3QgcmVnID0gUklO R19JTlNUUE0oZW5naW5lLT5tbWlvX2Jhc2UpOwo+ICAKPiAgCQkvKiByaW5nIHNob3VsZCBiZSBp ZGxlIGJlZm9yZSBpc3N1aW5nIGEgc3luYyBmbHVzaCovCgotLSAKSmFuaSBOaWt1bGEsIEludGVs IE9wZW4gU291cmNlIFRlY2hub2xvZ3kgQ2VudGVyCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxp c3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFu L2xpc3RpbmZvL2ludGVsLWdmeAo=