From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com ([134.134.136.20]:55290 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750800AbdA1Iwb (ORCPT ); Sat, 28 Jan 2017 03:52:31 -0500 Date: Sat, 28 Jan 2017 09:54:09 +0200 From: Imre Deak To: "Sharma, Shashank" Cc: intel-gfx@lists.freedesktop.org, Jani Nikula , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , Daniel Vetter , stable@vger.kernel.org Subject: Re: [PATCH 1/4] drm/i915/gen9+: Enable hotplug detection early Message-ID: <20170128075409.GA32065@ideak-desk.fi.intel.com> Reply-To: imre.deak@intel.com References: <1485509961-9010-1-git-send-email-imre.deak@intel.com> <1485509961-9010-2-git-send-email-imre.deak@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Sender: stable-owner@vger.kernel.org List-ID: On Sat, Jan 28, 2017 at 10:24:19AM +0530, Sharma, Shashank wrote: > Regards > > Shashank > > > On 1/27/2017 3:09 PM, Imre Deak wrote: > >For LSPCON resume time initialization we need to sample the > >corresponding pin's HPD level, but this is only available when HPD > >detection is enabled. Currently we enable detection only when enabling > >HPD interrupts which is too late, so bring the enabling of detection > >earlier. > > > >This is needed by the next patch. > > > >Cc: Shashank Sharma > >Cc: Jani Nikula > >Cc: Ville Syrj�l� > >Cc: Daniel Vetter > >Cc: # v4.9+ > >Signed-off-by: Imre Deak > >--- > > drivers/gpu/drm/i915/i915_irq.c | 71 +++++++++++++++++++++++++++++------------ > > 1 file changed, 51 insertions(+), 20 deletions(-) > > > >diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > >index 8440d8b..6daf522 100644 > >--- a/drivers/gpu/drm/i915/i915_irq.c > >+++ b/drivers/gpu/drm/i915/i915_irq.c > >@@ -3142,24 +3142,33 @@ static void ibx_hpd_irq_setup(struct drm_i915_private *dev_priv) > > I915_WRITE(PCH_PORT_HOTPLUG, hotplug); > > } > >+static void spt_hpd_detection_setup(struct drm_i915_private *dev_priv) > >+{ > >+ u32 hotplug; > >+ > >+ /* Enable digital hotplug on the PCH */ > >+ hotplug = I915_READ(PCH_PORT_HOTPLUG); > >+ hotplug |= PORTA_HOTPLUG_ENABLE | > >+ PORTB_HOTPLUG_ENABLE | > >+ PORTC_HOTPLUG_ENABLE | > >+ PORTD_HOTPLUG_ENABLE; > >+ I915_WRITE(PCH_PORT_HOTPLUG, hotplug); > >+ > >+ hotplug = I915_READ(PCH_PORT_HOTPLUG2); > >+ hotplug |= PORTE_HOTPLUG_ENABLE; > >+ I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); > >+} > >+ > > static void spt_hpd_irq_setup(struct drm_i915_private *dev_priv) > > { > >- u32 hotplug_irqs, hotplug, enabled_irqs; > >+ u32 hotplug_irqs, enabled_irqs; > > hotplug_irqs = SDE_HOTPLUG_MASK_SPT; > > enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_spt); > > ibx_display_interrupt_update(dev_priv, hotplug_irqs, enabled_irqs); > >- /* Enable digital hotplug on the PCH */ > >- hotplug = I915_READ(PCH_PORT_HOTPLUG); > >- hotplug |= PORTD_HOTPLUG_ENABLE | PORTC_HOTPLUG_ENABLE | > >- PORTB_HOTPLUG_ENABLE | PORTA_HOTPLUG_ENABLE; > >- I915_WRITE(PCH_PORT_HOTPLUG, hotplug); > >- > >- hotplug = I915_READ(PCH_PORT_HOTPLUG2); > >- hotplug |= PORTE_HOTPLUG_ENABLE; > >- I915_WRITE(PCH_PORT_HOTPLUG2, hotplug); > >+ spt_hpd_detection_setup(dev_priv); > > } > > static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) > >@@ -3196,18 +3205,15 @@ static void ilk_hpd_irq_setup(struct drm_i915_private *dev_priv) > > ibx_hpd_irq_setup(dev_priv); > > } > >-static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) > >+static void __bxt_hpd_detection_setup(struct drm_i915_private *dev_priv, > >+ u32 enabled_irqs) > > { > >- u32 hotplug_irqs, hotplug, enabled_irqs; > >- > >- enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt); > >- hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; > >- > >- bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); > >+ u32 hotplug; > > hotplug = I915_READ(PCH_PORT_HOTPLUG); > >- hotplug |= PORTC_HOTPLUG_ENABLE | PORTB_HOTPLUG_ENABLE | > >- PORTA_HOTPLUG_ENABLE; > >+ hotplug |= PORTA_HOTPLUG_ENABLE | > >+ PORTB_HOTPLUG_ENABLE | > >+ PORTC_HOTPLUG_ENABLE; > > DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n", > > hotplug, enabled_irqs); > >@@ -3217,7 +3223,6 @@ static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) > > * For BXT invert bit has to be set based on AOB design > > * for HPD detection logic, update it based on VBT fields. > > */ > >- > > if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) && > > intel_bios_is_port_hpd_inverted(dev_priv, PORT_A)) > > hotplug |= BXT_DDIA_HPD_INVERT; > >@@ -3231,6 +3236,23 @@ static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) > > I915_WRITE(PCH_PORT_HOTPLUG, hotplug); > > } > >+static void bxt_hpd_detection_setup(struct drm_i915_private *dev_priv) > >+{ > >+ __bxt_hpd_detection_setup(dev_priv, BXT_DE_PORT_HOTPLUG_MASK); > Do we need another layer of internal function ? Why cant the content of > __bxt_hpd_detection_setup be here, just > like spd_hpd_detection_setup, as they both are static to the file ? The port configuration is platform specific and so I wanted to keep it close to where the rest of HPD setup is done. The caller of bxt_hpd_detection_setup() only cares about enabling detection on _all_ ports as the other *_hpd_detection_setup() helpers. > >+} > >+ > >+static void bxt_hpd_irq_setup(struct drm_i915_private *dev_priv) > >+{ > >+ u32 hotplug_irqs, enabled_irqs; > >+ > >+ enabled_irqs = intel_hpd_enabled_irqs(dev_priv, hpd_bxt); > >+ hotplug_irqs = BXT_DE_PORT_HOTPLUG_MASK; > >+ > >+ bdw_update_port_irq(dev_priv, hotplug_irqs, enabled_irqs); > >+ > >+ __bxt_hpd_detection_setup(dev_priv, enabled_irqs); > >+} > >+ > > static void ibx_irq_postinstall(struct drm_device *dev) > > { > > struct drm_i915_private *dev_priv = to_i915(dev); > >@@ -3246,6 +3268,12 @@ static void ibx_irq_postinstall(struct drm_device *dev) > > gen5_assert_iir_is_zero(dev_priv, SDEIIR); > > I915_WRITE(SDEIMR, ~mask); > >+ > >+ if (HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv) || > >+ HAS_PCH_LPT(dev_priv)) > >+ ; /* TODO: Enable HPD detection on older PCH platforms too */ > >+ else > >+ spt_hpd_detection_setup(dev_priv); > > } > > static void gen5_gt_irq_postinstall(struct drm_device *dev) > >@@ -3457,6 +3485,9 @@ static void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv) > > GEN5_IRQ_INIT(GEN8_DE_PORT_, ~de_port_masked, de_port_enables); > > GEN5_IRQ_INIT(GEN8_DE_MISC_, ~de_misc_masked, de_misc_masked); > >+ > >+ if (IS_GEN9_LP(dev_priv)) > I have not done the delta analysis between hotplug interrupts, but this will > be true for GLK too. > Should we bother ? The GLK HPD detection setup and interrupt setup and handling is the same as on BXT. See bxt_hpd_irq_setup() and bxt_hpd_irq_handler() that are called on GLK as well. > > - Shashank > >+ bxt_hpd_detection_setup(dev_priv); > > } > > static int gen8_irq_postinstall(struct drm_device *dev) > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Imre Deak Subject: Re: [PATCH 1/4] drm/i915/gen9+: Enable hotplug detection early Date: Sat, 28 Jan 2017 09:54:09 +0200 Message-ID: <20170128075409.GA32065@ideak-desk.fi.intel.com> References: <1485509961-9010-1-git-send-email-imre.deak@intel.com> <1485509961-9010-2-git-send-email-imre.deak@intel.com> Reply-To: imre.deak@intel.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id D891A6E03C for ; Sat, 28 Jan 2017 07:54:12 +0000 (UTC) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Sharma, Shashank" Cc: Daniel Vetter , intel-gfx@lists.freedesktop.org, stable@vger.kernel.org List-Id: intel-gfx@lists.freedesktop.org T24gU2F0LCBKYW4gMjgsIDIwMTcgYXQgMTA6MjQ6MTlBTSArMDUzMCwgU2hhcm1hLCBTaGFzaGFu ayB3cm90ZToKPiBSZWdhcmRzCj4gCj4gU2hhc2hhbmsKPiAKPiAKPiBPbiAxLzI3LzIwMTcgMzow OSBQTSwgSW1yZSBEZWFrIHdyb3RlOgo+ID5Gb3IgTFNQQ09OIHJlc3VtZSB0aW1lIGluaXRpYWxp emF0aW9uIHdlIG5lZWQgdG8gc2FtcGxlIHRoZQo+ID5jb3JyZXNwb25kaW5nIHBpbidzIEhQRCBs ZXZlbCwgYnV0IHRoaXMgaXMgb25seSBhdmFpbGFibGUgd2hlbiBIUEQKPiA+ZGV0ZWN0aW9uIGlz IGVuYWJsZWQuIEN1cnJlbnRseSB3ZSBlbmFibGUgZGV0ZWN0aW9uIG9ubHkgd2hlbiBlbmFibGlu Zwo+ID5IUEQgaW50ZXJydXB0cyB3aGljaCBpcyB0b28gbGF0ZSwgc28gYnJpbmcgdGhlIGVuYWJs aW5nIG9mIGRldGVjdGlvbgo+ID5lYXJsaWVyLgo+ID4KPiA+VGhpcyBpcyBuZWVkZWQgYnkgdGhl IG5leHQgcGF0Y2guCj4gPgo+ID5DYzogU2hhc2hhbmsgU2hhcm1hIDxzaGFzaGFuay5zaGFybWFA aW50ZWwuY29tPgo+ID5DYzogSmFuaSBOaWt1bGEgPGphbmkubmlrdWxhQGxpbnV4LmludGVsLmNv bT4KPiA+Q2M6IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+ Cj4gPkNjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPgo+ID5DYzogPHN0 YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgdjQuOSsKPiA+U2lnbmVkLW9mZi1ieTogSW1yZSBEZWFr IDxpbXJlLmRlYWtAaW50ZWwuY29tPgo+ID4tLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2lycS5jIHwgNzEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0K PiA+ICAxIGZpbGUgY2hhbmdlZCwgNTEgaW5zZXJ0aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCj4g Pgo+ID5kaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfaXJxLmMKPiA+aW5kZXggODQ0MGQ4Yi4uNmRhZjUyMiAxMDA2 NDQKPiA+LS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9pcnEuYwo+ID4rKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2lycS5jCj4gPkBAIC0zMTQyLDI0ICszMTQyLDMzIEBAIHN0 YXRpYyB2b2lkIGlieF9ocGRfaXJxX3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdikKPiA+ICAJSTkxNV9XUklURShQQ0hfUE9SVF9IT1RQTFVHLCBob3RwbHVnKTsKPiA+ICB9 Cj4gPitzdGF0aWMgdm9pZCBzcHRfaHBkX2RldGVjdGlvbl9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpCj4gPit7Cj4gPisJdTMyIGhvdHBsdWc7Cj4gPisKPiA+KwkvKiBF bmFibGUgZGlnaXRhbCBob3RwbHVnIG9uIHRoZSBQQ0ggKi8KPiA+Kwlob3RwbHVnID0gSTkxNV9S RUFEKFBDSF9QT1JUX0hPVFBMVUcpOwo+ID4rCWhvdHBsdWcgfD0gUE9SVEFfSE9UUExVR19FTkFC TEUgfAo+ID4rCQkgICBQT1JUQl9IT1RQTFVHX0VOQUJMRSB8Cj4gPisJCSAgIFBPUlRDX0hPVFBM VUdfRU5BQkxFIHwKPiA+KwkJICAgUE9SVERfSE9UUExVR19FTkFCTEU7Cj4gPisJSTkxNV9XUklU RShQQ0hfUE9SVF9IT1RQTFVHLCBob3RwbHVnKTsKPiA+Kwo+ID4rCWhvdHBsdWcgPSBJOTE1X1JF QUQoUENIX1BPUlRfSE9UUExVRzIpOwo+ID4rCWhvdHBsdWcgfD0gUE9SVEVfSE9UUExVR19FTkFC TEU7Cj4gPisJSTkxNV9XUklURShQQ0hfUE9SVF9IT1RQTFVHMiwgaG90cGx1Zyk7Cj4gPit9Cj4g PisKPiA+ICBzdGF0aWMgdm9pZCBzcHRfaHBkX2lycV9zZXR1cChzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYpCj4gPiAgewo+ID4tCXUzMiBob3RwbHVnX2lycXMsIGhvdHBsdWcsIGVu YWJsZWRfaXJxczsKPiA+Kwl1MzIgaG90cGx1Z19pcnFzLCBlbmFibGVkX2lycXM7Cj4gPiAgCWhv dHBsdWdfaXJxcyA9IFNERV9IT1RQTFVHX01BU0tfU1BUOwo+ID4gIAllbmFibGVkX2lycXMgPSBp bnRlbF9ocGRfZW5hYmxlZF9pcnFzKGRldl9wcml2LCBocGRfc3B0KTsKPiA+ICAJaWJ4X2Rpc3Bs YXlfaW50ZXJydXB0X3VwZGF0ZShkZXZfcHJpdiwgaG90cGx1Z19pcnFzLCBlbmFibGVkX2lycXMp Owo+ID4tCS8qIEVuYWJsZSBkaWdpdGFsIGhvdHBsdWcgb24gdGhlIFBDSCAqLwo+ID4tCWhvdHBs dWcgPSBJOTE1X1JFQUQoUENIX1BPUlRfSE9UUExVRyk7Cj4gPi0JaG90cGx1ZyB8PSBQT1JURF9I T1RQTFVHX0VOQUJMRSB8IFBPUlRDX0hPVFBMVUdfRU5BQkxFIHwKPiA+LQkJUE9SVEJfSE9UUExV R19FTkFCTEUgfCBQT1JUQV9IT1RQTFVHX0VOQUJMRTsKPiA+LQlJOTE1X1dSSVRFKFBDSF9QT1JU X0hPVFBMVUcsIGhvdHBsdWcpOwo+ID4tCj4gPi0JaG90cGx1ZyA9IEk5MTVfUkVBRChQQ0hfUE9S VF9IT1RQTFVHMik7Cj4gPi0JaG90cGx1ZyB8PSBQT1JURV9IT1RQTFVHX0VOQUJMRTsKPiA+LQlJ OTE1X1dSSVRFKFBDSF9QT1JUX0hPVFBMVUcyLCBob3RwbHVnKTsKPiA+KwlzcHRfaHBkX2RldGVj dGlvbl9zZXR1cChkZXZfcHJpdik7Cj4gPiAgfQo+ID4gIHN0YXRpYyB2b2lkIGlsa19ocGRfaXJx X3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKPiA+QEAgLTMxOTYsMTgg KzMyMDUsMTUgQEAgc3RhdGljIHZvaWQgaWxrX2hwZF9pcnFfc2V0dXAoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2KQo+ID4gIAlpYnhfaHBkX2lycV9zZXR1cChkZXZfcHJpdik7Cj4g PiAgfQo+ID4tc3RhdGljIHZvaWQgYnh0X2hwZF9pcnFfc2V0dXAoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KQo+ID4rc3RhdGljIHZvaWQgX19ieHRfaHBkX2RldGVjdGlvbl9zZXR1 cChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCj4gPisJCQkJCSAgICAgdTMyIGVu YWJsZWRfaXJxcykKPiA+ICB7Cj4gPi0JdTMyIGhvdHBsdWdfaXJxcywgaG90cGx1ZywgZW5hYmxl ZF9pcnFzOwo+ID4tCj4gPi0JZW5hYmxlZF9pcnFzID0gaW50ZWxfaHBkX2VuYWJsZWRfaXJxcyhk ZXZfcHJpdiwgaHBkX2J4dCk7Cj4gPi0JaG90cGx1Z19pcnFzID0gQlhUX0RFX1BPUlRfSE9UUExV R19NQVNLOwo+ID4tCj4gPi0JYmR3X3VwZGF0ZV9wb3J0X2lycShkZXZfcHJpdiwgaG90cGx1Z19p cnFzLCBlbmFibGVkX2lycXMpOwo+ID4rCXUzMiBob3RwbHVnOwo+ID4gIAlob3RwbHVnID0gSTkx NV9SRUFEKFBDSF9QT1JUX0hPVFBMVUcpOwo+ID4tCWhvdHBsdWcgfD0gUE9SVENfSE9UUExVR19F TkFCTEUgfCBQT1JUQl9IT1RQTFVHX0VOQUJMRSB8Cj4gPi0JCVBPUlRBX0hPVFBMVUdfRU5BQkxF Owo+ID4rCWhvdHBsdWcgfD0gUE9SVEFfSE9UUExVR19FTkFCTEUgfAo+ID4rCQkgICBQT1JUQl9I T1RQTFVHX0VOQUJMRSB8Cj4gPisJCSAgIFBPUlRDX0hPVFBMVUdfRU5BQkxFOwo+ID4gIAlEUk1f REVCVUdfS01TKCJJbnZlcnQgYml0IHNldHRpbmc6IGhwX2N0bDoleCBocF9wb3J0OiV4XG4iLAo+ ID4gIAkJICAgICAgaG90cGx1ZywgZW5hYmxlZF9pcnFzKTsKPiA+QEAgLTMyMTcsNyArMzIyMyw2 IEBAIHN0YXRpYyB2b2lkIGJ4dF9ocGRfaXJxX3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKPiA+ICAJICogRm9yIEJYVCBpbnZlcnQgYml0IGhhcyB0byBiZSBzZXQgYmFz ZWQgb24gQU9CIGRlc2lnbgo+ID4gIAkgKiBmb3IgSFBEIGRldGVjdGlvbiBsb2dpYywgdXBkYXRl IGl0IGJhc2VkIG9uIFZCVCBmaWVsZHMuCj4gPiAgCSAqLwo+ID4tCj4gPiAgCWlmICgoZW5hYmxl ZF9pcnFzICYgQlhUX0RFX1BPUlRfSFBfRERJQSkgJiYKPiA+ICAJICAgIGludGVsX2Jpb3NfaXNf cG9ydF9ocGRfaW52ZXJ0ZWQoZGV2X3ByaXYsIFBPUlRfQSkpCj4gPiAgCQlob3RwbHVnIHw9IEJY VF9ERElBX0hQRF9JTlZFUlQ7Cj4gPkBAIC0zMjMxLDYgKzMyMzYsMjMgQEAgc3RhdGljIHZvaWQg Ynh0X2hwZF9pcnFfc2V0dXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQo+ID4g IAlJOTE1X1dSSVRFKFBDSF9QT1JUX0hPVFBMVUcsIGhvdHBsdWcpOwo+ID4gIH0KPiA+K3N0YXRp YyB2b2lkIGJ4dF9ocGRfZGV0ZWN0aW9uX3NldHVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdikKPiA+K3sKPiA+KwlfX2J4dF9ocGRfZGV0ZWN0aW9uX3NldHVwKGRldl9wcml2LCBC WFRfREVfUE9SVF9IT1RQTFVHX01BU0spOwo+IERvIHdlIG5lZWQgYW5vdGhlciBsYXllciBvZiBp bnRlcm5hbCBmdW5jdGlvbiA/IFdoeSBjYW50IHRoZSBjb250ZW50IG9mCj4gX19ieHRfaHBkX2Rl dGVjdGlvbl9zZXR1cCBiZSBoZXJlLCBqdXN0Cj4gbGlrZSBzcGRfaHBkX2RldGVjdGlvbl9zZXR1 cCwgYXMgdGhleSBib3RoIGFyZSBzdGF0aWMgdG8gdGhlIGZpbGUgPwoKVGhlIHBvcnQgY29uZmln dXJhdGlvbiBpcyBwbGF0Zm9ybSBzcGVjaWZpYyBhbmQgc28gSSB3YW50ZWQgdG8ga2VlcCBpdApj bG9zZSB0byB3aGVyZSB0aGUgcmVzdCBvZiBIUEQgc2V0dXAgaXMgZG9uZS4gVGhlIGNhbGxlciBv ZgpieHRfaHBkX2RldGVjdGlvbl9zZXR1cCgpIG9ubHkgY2FyZXMgYWJvdXQgZW5hYmxpbmcgZGV0 ZWN0aW9uIG9uIF9hbGxfCnBvcnRzIGFzIHRoZSBvdGhlciAqX2hwZF9kZXRlY3Rpb25fc2V0dXAo KSBoZWxwZXJzLgoKPiA+K30KPiA+Kwo+ID4rc3RhdGljIHZvaWQgYnh0X2hwZF9pcnFfc2V0dXAo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQo+ID4rewo+ID4rCXUzMiBob3RwbHVn X2lycXMsIGVuYWJsZWRfaXJxczsKPiA+Kwo+ID4rCWVuYWJsZWRfaXJxcyA9IGludGVsX2hwZF9l bmFibGVkX2lycXMoZGV2X3ByaXYsIGhwZF9ieHQpOwo+ID4rCWhvdHBsdWdfaXJxcyA9IEJYVF9E RV9QT1JUX0hPVFBMVUdfTUFTSzsKPiA+Kwo+ID4rCWJkd191cGRhdGVfcG9ydF9pcnEoZGV2X3By aXYsIGhvdHBsdWdfaXJxcywgZW5hYmxlZF9pcnFzKTsKPiA+Kwo+ID4rCV9fYnh0X2hwZF9kZXRl Y3Rpb25fc2V0dXAoZGV2X3ByaXYsIGVuYWJsZWRfaXJxcyk7Cj4gPit9Cj4gPisKPiA+ICBzdGF0 aWMgdm9pZCBpYnhfaXJxX3Bvc3RpbnN0YWxsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gPiAg ewo+ID4gIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7 Cj4gPkBAIC0zMjQ2LDYgKzMyNjgsMTIgQEAgc3RhdGljIHZvaWQgaWJ4X2lycV9wb3N0aW5zdGFs bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID4gIAlnZW41X2Fzc2VydF9paXJfaXNfemVybyhk ZXZfcHJpdiwgU0RFSUlSKTsKPiA+ICAJSTkxNV9XUklURShTREVJTVIsIH5tYXNrKTsKPiA+Kwo+ ID4rCWlmIChIQVNfUENIX0lCWChkZXZfcHJpdikgfHwgSEFTX1BDSF9DUFQoZGV2X3ByaXYpIHx8 Cj4gPisJICAgIEhBU19QQ0hfTFBUKGRldl9wcml2KSkKPiA+KwkJOyAvKiBUT0RPOiBFbmFibGUg SFBEIGRldGVjdGlvbiBvbiBvbGRlciBQQ0ggcGxhdGZvcm1zIHRvbyAqLwo+ID4rCWVsc2UKPiA+ KwkJc3B0X2hwZF9kZXRlY3Rpb25fc2V0dXAoZGV2X3ByaXYpOwo+ID4gIH0KPiA+ICBzdGF0aWMg dm9pZCBnZW41X2d0X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ID5A QCAtMzQ1Nyw2ICszNDg1LDkgQEAgc3RhdGljIHZvaWQgZ2VuOF9kZV9pcnFfcG9zdGluc3RhbGwo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQo+ID4gIAlHRU41X0lSUV9JTklUKEdF TjhfREVfUE9SVF8sIH5kZV9wb3J0X21hc2tlZCwgZGVfcG9ydF9lbmFibGVzKTsKPiA+ICAJR0VO NV9JUlFfSU5JVChHRU44X0RFX01JU0NfLCB+ZGVfbWlzY19tYXNrZWQsIGRlX21pc2NfbWFza2Vk KTsKPiA+Kwo+ID4rCWlmIChJU19HRU45X0xQKGRldl9wcml2KSkKPiBJIGhhdmUgbm90IGRvbmUg dGhlIGRlbHRhIGFuYWx5c2lzIGJldHdlZW4gaG90cGx1ZyBpbnRlcnJ1cHRzLCBidXQgdGhpcyB3 aWxsCj4gYmUgdHJ1ZSBmb3IgR0xLIHRvby4KPiBTaG91bGQgd2UgYm90aGVyID8KClRoZSBHTEsg SFBEIGRldGVjdGlvbiBzZXR1cCBhbmQgaW50ZXJydXB0IHNldHVwIGFuZCBoYW5kbGluZyBpcyB0 aGUgc2FtZSBhcwpvbiBCWFQuIFNlZSBieHRfaHBkX2lycV9zZXR1cCgpIGFuZCBieHRfaHBkX2ly cV9oYW5kbGVyKCkgdGhhdCBhcmUKY2FsbGVkIG9uIEdMSyBhcyB3ZWxsLgoKPiAKPiAtIFNoYXNo YW5rCj4gPisJCWJ4dF9ocGRfZGV0ZWN0aW9uX3NldHVwKGRldl9wcml2KTsKPiA+ICB9Cj4gPiAg c3RhdGljIGludCBnZW44X2lycV9wb3N0aW5zdGFsbChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ IApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK