From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753723AbbLDSJ5 (ORCPT ); Fri, 4 Dec 2015 13:09:57 -0500 Received: from mail-yk0-f172.google.com ([209.85.160.172]:33169 "EHLO mail-yk0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753196AbbLDSJz convert rfc822-to-8bit (ORCPT ); Fri, 4 Dec 2015 13:09:55 -0500 MIME-Version: 1.0 In-Reply-To: <566154A0.5050205@amd.com> References: <1449185167-6886-1-git-send-email-cpaul@redhat.com> <566154A0.5050205@amd.com> Date: Fri, 4 Dec 2015 13:09:54 -0500 Message-ID: Subject: Re: [PATCH v2] drm/radeon: Retry DDC probing on DVI on failure if we got an HPD interrupt From: Alex Deucher To: =?UTF-8?Q?Christian_K=C3=B6nig?= Cc: Stephen Chandler Paul , Alex Deucher , David Airlie , Maling list - DRI developers , LKML , Jerome Glisse , Benjamin Tissoires Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Dec 4, 2015 at 3:53 AM, Christian König wrote: > On 04.12.2015 00:26, cpaul@redhat.com wrote: >> >> From: Lyude >> >> HPD signals on DVI ports can be fired off before the pins required for >> DDC probing actually make contact, due to the pins for HPD making >> contact first. This results in a HPD signal being asserted but DDC >> probing failing, resulting in hotplugging occasionally failing. >> >> This is somewhat rare on most cards (depending on what angle you plug >> the DVI connector in), but on some cards it happens constantly. The >> Radeon R5 on the machine used for testing this patch for instance, runs >> into this issue just about every time I try to hotplug a DVI monitor and >> as a result hotplugging almost never works. >> >> Rescheduling the hotplug work for a second when we run into an HPD >> signal with a failing DDC probe usually gives enough time for the rest >> of the connector's pins to make contact, and fixes this issue. >> >> Signed-off-by: Lyude > > > I find a second a bit long, but if it works so what? > > Looks sane enough to me, patch is Reviewed-by: Christian König > Applied. thanks! Alex > > >> --- >> Sending this version of the patch because Jerome says this will probably >> be the >> least controversial of the potential fixes. Instead of sending userspace >> tons of >> hotplug events, we just reschedule the hotplug work. >> >> drivers/gpu/drm/radeon/cik.c | 2 +- >> drivers/gpu/drm/radeon/evergreen.c | 2 +- >> drivers/gpu/drm/radeon/r100.c | 2 +- >> drivers/gpu/drm/radeon/r600.c | 2 +- >> drivers/gpu/drm/radeon/radeon.h | 2 +- >> drivers/gpu/drm/radeon/radeon_connectors.c | 21 ++++++++++++++++++++- >> drivers/gpu/drm/radeon/radeon_irq_kms.c | 8 ++++---- >> drivers/gpu/drm/radeon/radeon_mode.h | 1 + >> drivers/gpu/drm/radeon/rs600.c | 2 +- >> drivers/gpu/drm/radeon/si.c | 2 +- >> 10 files changed, 32 insertions(+), 12 deletions(-) >> >> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c >> index 248953d..6801a0c 100644 >> --- a/drivers/gpu/drm/radeon/cik.c >> +++ b/drivers/gpu/drm/radeon/cik.c >> @@ -8472,7 +8472,7 @@ restart_ih: >> if (queue_dp) >> schedule_work(&rdev->dp_work); >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (queue_reset) { >> rdev->needs_reset = true; >> wake_up_all(&rdev->fence_queue); >> diff --git a/drivers/gpu/drm/radeon/evergreen.c >> b/drivers/gpu/drm/radeon/evergreen.c >> index 0acde19..f8e4986 100644 >> --- a/drivers/gpu/drm/radeon/evergreen.c >> +++ b/drivers/gpu/drm/radeon/evergreen.c >> @@ -5368,7 +5368,7 @@ restart_ih: >> if (queue_dp) >> schedule_work(&rdev->dp_work); >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (queue_hdmi) >> schedule_work(&rdev->audio_work); >> if (queue_thermal && rdev->pm.dpm_enabled) >> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c >> index 238b13f..2df3c86 100644 >> --- a/drivers/gpu/drm/radeon/r100.c >> +++ b/drivers/gpu/drm/radeon/r100.c >> @@ -806,7 +806,7 @@ int r100_irq_process(struct radeon_device *rdev) >> status = r100_irq_ack(rdev); >> } >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (rdev->msi_enabled) { >> switch (rdev->family) { >> case CHIP_RS400: >> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c >> index 4ea5b10..cc2fdf0 100644 >> --- a/drivers/gpu/drm/radeon/r600.c >> +++ b/drivers/gpu/drm/radeon/r600.c >> @@ -4276,7 +4276,7 @@ restart_ih: >> WREG32(IH_RB_RPTR, rptr); >> } >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (queue_hdmi) >> schedule_work(&rdev->audio_work); >> if (queue_thermal && rdev->pm.dpm_enabled) >> diff --git a/drivers/gpu/drm/radeon/radeon.h >> b/drivers/gpu/drm/radeon/radeon.h >> index b6cbd81..87db649 100644 >> --- a/drivers/gpu/drm/radeon/radeon.h >> +++ b/drivers/gpu/drm/radeon/radeon.h >> @@ -2414,7 +2414,7 @@ struct radeon_device { >> struct r600_ih ih; /* r6/700 interrupt ring */ >> struct radeon_rlc rlc; >> struct radeon_mec mec; >> - struct work_struct hotplug_work; >> + struct delayed_work hotplug_work; >> struct work_struct dp_work; >> struct work_struct audio_work; >> int num_crtc; /* number of crtcs */ >> diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c >> b/drivers/gpu/drm/radeon/radeon_connectors.c >> index 5a2cafb..340f3f5 100644 >> --- a/drivers/gpu/drm/radeon/radeon_connectors.c >> +++ b/drivers/gpu/drm/radeon/radeon_connectors.c >> @@ -1234,13 +1234,32 @@ radeon_dvi_detect(struct drm_connector *connector, >> bool force) >> if (r < 0) >> return connector_status_disconnected; >> + if (radeon_connector->detected_hpd_without_ddc) { >> + force = true; >> + radeon_connector->detected_hpd_without_ddc = false; >> + } >> + >> if (!force && radeon_check_hpd_status_unchanged(connector)) { >> ret = connector->status; >> goto exit; >> } >> - if (radeon_connector->ddc_bus) >> + if (radeon_connector->ddc_bus) { >> dret = radeon_ddc_probe(radeon_connector, false); >> + >> + /* Sometimes the pins required for the DDC probe on DVI >> + * connectors don't make contact at the same time that the >> ones >> + * for HPD do. If the DDC probe fails even though we had >> an HPD >> + * signal, try again later */ >> + if (!dret && !force && >> + connector->status != connector_status_connected) { >> + DRM_DEBUG_KMS("hpd detected without ddc, retrying >> in 1 second\n"); >> + radeon_connector->detected_hpd_without_ddc = true; >> + schedule_delayed_work(&rdev->hotplug_work, >> + msecs_to_jiffies(1000)); >> + goto exit; >> + } >> + } >> if (dret) { >> radeon_connector->detected_by_load = false; >> radeon_connector_free_edid(connector); >> diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c >> b/drivers/gpu/drm/radeon/radeon_irq_kms.c >> index 171d3e4..979f3bf 100644 >> --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c >> +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c >> @@ -74,7 +74,7 @@ irqreturn_t radeon_driver_irq_handler_kms(int irq, void >> *arg) >> static void radeon_hotplug_work_func(struct work_struct *work) >> { >> struct radeon_device *rdev = container_of(work, struct >> radeon_device, >> - hotplug_work); >> + hotplug_work.work); >> struct drm_device *dev = rdev->ddev; >> struct drm_mode_config *mode_config = &dev->mode_config; >> struct drm_connector *connector; >> @@ -302,7 +302,7 @@ int radeon_irq_kms_init(struct radeon_device *rdev) >> } >> } >> - INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); >> + INIT_DELAYED_WORK(&rdev->hotplug_work, radeon_hotplug_work_func); >> INIT_WORK(&rdev->dp_work, radeon_dp_work_func); >> INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi); >> @@ -310,7 +310,7 @@ int radeon_irq_kms_init(struct radeon_device *rdev) >> r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq); >> if (r) { >> rdev->irq.installed = false; >> - flush_work(&rdev->hotplug_work); >> + flush_delayed_work(&rdev->hotplug_work); >> return r; >> } >> @@ -333,7 +333,7 @@ void radeon_irq_kms_fini(struct radeon_device *rdev) >> rdev->irq.installed = false; >> if (rdev->msi_enabled) >> pci_disable_msi(rdev->pdev); >> - flush_work(&rdev->hotplug_work); >> + flush_delayed_work(&rdev->hotplug_work); >> } >> } >> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h >> b/drivers/gpu/drm/radeon/radeon_mode.h >> index 457b026..0aeb3ee 100644 >> --- a/drivers/gpu/drm/radeon/radeon_mode.h >> +++ b/drivers/gpu/drm/radeon/radeon_mode.h >> @@ -553,6 +553,7 @@ struct radeon_connector { >> void *con_priv; >> bool dac_load_detect; >> bool detected_by_load; /* if the connection status was determined >> by load */ >> + bool detected_hpd_without_ddc; /* if an HPD signal was detected on >> DVI, but ddc probing failed */ >> uint16_t connector_object_id; >> struct radeon_hpd hpd; >> struct radeon_router router; >> diff --git a/drivers/gpu/drm/radeon/rs600.c >> b/drivers/gpu/drm/radeon/rs600.c >> index 97a9048..6244f4e 100644 >> --- a/drivers/gpu/drm/radeon/rs600.c >> +++ b/drivers/gpu/drm/radeon/rs600.c >> @@ -813,7 +813,7 @@ int rs600_irq_process(struct radeon_device *rdev) >> status = rs600_irq_ack(rdev); >> } >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (queue_hdmi) >> schedule_work(&rdev->audio_work); >> if (rdev->msi_enabled) { >> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c >> index 07037e3..fb1a7ec 100644 >> --- a/drivers/gpu/drm/radeon/si.c >> +++ b/drivers/gpu/drm/radeon/si.c >> @@ -6848,7 +6848,7 @@ restart_ih: >> if (queue_dp) >> schedule_work(&rdev->dp_work); >> if (queue_hotplug) >> - schedule_work(&rdev->hotplug_work); >> + schedule_delayed_work(&rdev->hotplug_work, 0); >> if (queue_thermal && rdev->pm.dpm_enabled) >> schedule_work(&rdev->pm.dpm.thermal.work); >> rdev->ih.rptr = rptr; > > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: Re: [PATCH v2] drm/radeon: Retry DDC probing on DVI on failure if we got an HPD interrupt Date: Fri, 4 Dec 2015 13:09:54 -0500 Message-ID: References: <1449185167-6886-1-git-send-email-cpaul@redhat.com> <566154A0.5050205@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yk0-f182.google.com (mail-yk0-f182.google.com [209.85.160.182]) by gabe.freedesktop.org (Postfix) with ESMTPS id 613CB6E41A for ; Fri, 4 Dec 2015 10:09:55 -0800 (PST) Received: by ykfs79 with SMTP id s79so134118148ykf.1 for ; Fri, 04 Dec 2015 10:09:54 -0800 (PST) In-Reply-To: <566154A0.5050205@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: =?UTF-8?Q?Christian_K=C3=B6nig?= Cc: LKML , Maling list - DRI developers , Jerome Glisse , Benjamin Tissoires , Alex Deucher , Stephen Chandler Paul List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBEZWMgNCwgMjAxNSBhdCAzOjUzIEFNLCBDaHJpc3RpYW4gS8O2bmlnCjxjaHJpc3Rp YW4ua29lbmlnQGFtZC5jb20+IHdyb3RlOgo+IE9uIDA0LjEyLjIwMTUgMDA6MjYsIGNwYXVsQHJl ZGhhdC5jb20gd3JvdGU6Cj4+Cj4+IEZyb206IEx5dWRlIDxjcGF1bEByZWRoYXQuY29tPgo+Pgo+ PiBIUEQgc2lnbmFscyBvbiBEVkkgcG9ydHMgY2FuIGJlIGZpcmVkIG9mZiBiZWZvcmUgdGhlIHBp bnMgcmVxdWlyZWQgZm9yCj4+IEREQyBwcm9iaW5nIGFjdHVhbGx5IG1ha2UgY29udGFjdCwgZHVl IHRvIHRoZSBwaW5zIGZvciBIUEQgbWFraW5nCj4+IGNvbnRhY3QgZmlyc3QuIFRoaXMgcmVzdWx0 cyBpbiBhIEhQRCBzaWduYWwgYmVpbmcgYXNzZXJ0ZWQgYnV0IEREQwo+PiBwcm9iaW5nIGZhaWxp bmcsIHJlc3VsdGluZyBpbiBob3RwbHVnZ2luZyBvY2Nhc2lvbmFsbHkgZmFpbGluZy4KPj4KPj4g VGhpcyBpcyBzb21ld2hhdCByYXJlIG9uIG1vc3QgY2FyZHMgKGRlcGVuZGluZyBvbiB3aGF0IGFu Z2xlIHlvdSBwbHVnCj4+IHRoZSBEVkkgY29ubmVjdG9yIGluKSwgYnV0IG9uIHNvbWUgY2FyZHMg aXQgaGFwcGVucyBjb25zdGFudGx5LiBUaGUKPj4gUmFkZW9uIFI1IG9uIHRoZSBtYWNoaW5lIHVz ZWQgZm9yIHRlc3RpbmcgdGhpcyBwYXRjaCBmb3IgaW5zdGFuY2UsIHJ1bnMKPj4gaW50byB0aGlz IGlzc3VlIGp1c3QgYWJvdXQgZXZlcnkgdGltZSBJIHRyeSB0byBob3RwbHVnIGEgRFZJIG1vbml0 b3IgYW5kCj4+IGFzIGEgcmVzdWx0IGhvdHBsdWdnaW5nIGFsbW9zdCBuZXZlciB3b3Jrcy4KPj4K Pj4gUmVzY2hlZHVsaW5nIHRoZSBob3RwbHVnIHdvcmsgZm9yIGEgc2Vjb25kIHdoZW4gd2UgcnVu IGludG8gYW4gSFBECj4+IHNpZ25hbCB3aXRoIGEgZmFpbGluZyBEREMgcHJvYmUgdXN1YWxseSBn aXZlcyBlbm91Z2ggdGltZSBmb3IgdGhlIHJlc3QKPj4gb2YgdGhlIGNvbm5lY3RvcidzIHBpbnMg dG8gbWFrZSBjb250YWN0LCBhbmQgZml4ZXMgdGhpcyBpc3N1ZS4KPj4KPj4gU2lnbmVkLW9mZi1i eTogTHl1ZGUgPGNwYXVsQHJlZGhhdC5jb20+Cj4KPgo+IEkgZmluZCBhIHNlY29uZCBhIGJpdCBs b25nLCBidXQgaWYgaXQgd29ya3Mgc28gd2hhdD8KPgo+IExvb2tzIHNhbmUgZW5vdWdoIHRvIG1l LCBwYXRjaCBpcyBSZXZpZXdlZC1ieTogQ2hyaXN0aWFuIEvDtm5pZwo+IDxjaHJpc3RpYW4ua29l bmlnQGFtZC5jb20+CgpBcHBsaWVkLiAgdGhhbmtzIQoKQWxleAoKPgo+Cj4+IC0tLQo+PiBTZW5k aW5nIHRoaXMgdmVyc2lvbiBvZiB0aGUgcGF0Y2ggYmVjYXVzZSBKZXJvbWUgc2F5cyB0aGlzIHdp bGwgcHJvYmFibHkKPj4gYmUgdGhlCj4+IGxlYXN0IGNvbnRyb3ZlcnNpYWwgb2YgdGhlIHBvdGVu dGlhbCBmaXhlcy4gSW5zdGVhZCBvZiBzZW5kaW5nIHVzZXJzcGFjZQo+PiB0b25zIG9mCj4+IGhv dHBsdWcgZXZlbnRzLCB3ZSBqdXN0IHJlc2NoZWR1bGUgdGhlIGhvdHBsdWcgd29yay4KPj4KPj4g ICBkcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npay5jICAgICAgICAgICAgICAgfCAgMiArLQo+PiAg IGRyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgICAgICAgICB8ICAyICstCj4+ICAg ZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yMTAwLmMgICAgICAgICAgICAgIHwgIDIgKy0KPj4gICBk cml2ZXJzL2dwdS9kcm0vcmFkZW9uL3I2MDAuYyAgICAgICAgICAgICAgfCAgMiArLQo+PiAgIGRy aXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmggICAgICAgICAgICB8ICAyICstCj4+ICAgZHJp dmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jIHwgMjEgKysrKysrKysrKysr KysrKysrKystCj4+ICAgZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jICAg IHwgIDggKysrKy0tLS0KPj4gICBkcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgg ICAgICAgfCAgMSArCj4+ICAgZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jICAgICAgICAg ICAgIHwgIDIgKy0KPj4gICBkcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpLmMgICAgICAgICAgICAg ICAgfCAgMiArLQo+PiAgIDEwIGZpbGVzIGNoYW5nZWQsIDMyIGluc2VydGlvbnMoKyksIDEyIGRl bGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWsu YyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrLmMKPj4gaW5kZXggMjQ4OTUzZC4uNjgwMWEw YyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9jaWsuYwo+PiArKysgYi9k cml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npay5jCj4+IEBAIC04NDcyLDcgKzg0NzIsNyBAQCByZXN0 YXJ0X2loOgo+PiAgICAgICAgIGlmIChxdWV1ZV9kcCkKPj4gICAgICAgICAgICAgICAgIHNjaGVk dWxlX3dvcmsoJnJkZXYtPmRwX3dvcmspOwo+PiAgICAgICAgIGlmIChxdWV1ZV9ob3RwbHVnKQo+ PiAtICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmcmRldi0+aG90cGx1Z193b3JrKTsKPj4g KyAgICAgICAgICAgICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+aG90cGx1Z193b3Jr LCAwKTsKPj4gICAgICAgICBpZiAocXVldWVfcmVzZXQpIHsKPj4gICAgICAgICAgICAgICAgIHJk ZXYtPm5lZWRzX3Jlc2V0ID0gdHJ1ZTsKPj4gICAgICAgICAgICAgICAgIHdha2VfdXBfYWxsKCZy ZGV2LT5mZW5jZV9xdWV1ZSk7Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9u L2V2ZXJncmVlbi5jCj4+IGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwo+PiBp bmRleCAwYWNkZTE5Li5mOGU0OTg2IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFk ZW9uL2V2ZXJncmVlbi5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVu LmMKPj4gQEAgLTUzNjgsNyArNTM2OCw3IEBAIHJlc3RhcnRfaWg6Cj4+ICAgICAgICAgaWYgKHF1 ZXVlX2RwKQo+PiAgICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmcmRldi0+ZHBfd29yayk7 Cj4+ICAgICAgICAgaWYgKHF1ZXVlX2hvdHBsdWcpCj4+IC0gICAgICAgICAgICAgICBzY2hlZHVs ZV93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwo+PiArICAgICAgICAgICAgICAgc2NoZWR1bGVf ZGVsYXllZF93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmssIDApOwo+PiAgICAgICAgIGlmIChxdWV1 ZV9oZG1pKQo+PiAgICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmcmRldi0+YXVkaW9fd29y ayk7Cj4+ICAgICAgICAgaWYgKHF1ZXVlX3RoZXJtYWwgJiYgcmRldi0+cG0uZHBtX2VuYWJsZWQp Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMv Z3B1L2RybS9yYWRlb24vcjEwMC5jCj4+IGluZGV4IDIzOGIxM2YuLjJkZjNjODYgMTAwNjQ0Cj4+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCj4+ICsrKyBiL2RyaXZlcnMvZ3B1 L2RybS9yYWRlb24vcjEwMC5jCj4+IEBAIC04MDYsNyArODA2LDcgQEAgaW50IHIxMDBfaXJxX3By b2Nlc3Moc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCj4+ICAgICAgICAgICAgICAgICBzdGF0 dXMgPSByMTAwX2lycV9hY2socmRldik7Cj4+ICAgICAgICAgfQo+PiAgICAgICAgIGlmIChxdWV1 ZV9ob3RwbHVnKQo+PiAtICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmcmRldi0+aG90cGx1 Z193b3JrKTsKPj4gKyAgICAgICAgICAgICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+ aG90cGx1Z193b3JrLCAwKTsKPj4gICAgICAgICBpZiAocmRldi0+bXNpX2VuYWJsZWQpIHsKPj4g ICAgICAgICAgICAgICAgIHN3aXRjaCAocmRldi0+ZmFtaWx5KSB7Cj4+ICAgICAgICAgICAgICAg ICBjYXNlIENISVBfUlM0MDA6Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9u L3I2MDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCj4+IGluZGV4IDRlYTViMTAu LmNjMmZkZjAgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCj4+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjYwMC5jCj4+IEBAIC00Mjc2LDcgKzQyNzYs NyBAQCByZXN0YXJ0X2loOgo+PiAgICAgICAgICAgICAgICAgV1JFRzMyKElIX1JCX1JQVFIsIHJw dHIpOwo+PiAgICAgICAgIH0KPj4gICAgICAgICBpZiAocXVldWVfaG90cGx1ZykKPj4gLSAgICAg ICAgICAgICAgIHNjaGVkdWxlX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29yayk7Cj4+ICsgICAgICAg ICAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29yaywgMCk7Cj4+ ICAgICAgICAgaWYgKHF1ZXVlX2hkbWkpCj4+ICAgICAgICAgICAgICAgICBzY2hlZHVsZV93b3Jr KCZyZGV2LT5hdWRpb193b3JrKTsKPj4gICAgICAgICBpZiAocXVldWVfdGhlcm1hbCAmJiByZGV2 LT5wbS5kcG1fZW5hYmxlZCkKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24v cmFkZW9uLmgKPj4gYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCj4+IGluZGV4IGI2 Y2JkODEuLjg3ZGI2NDkgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFk ZW9uLmgKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAo+PiBAQCAtMjQx NCw3ICsyNDE0LDcgQEAgc3RydWN0IHJhZGVvbl9kZXZpY2Ugewo+PiAgICAgICAgIHN0cnVjdCBy NjAwX2loIGloOyAvKiByNi83MDAgaW50ZXJydXB0IHJpbmcgKi8KPj4gICAgICAgICBzdHJ1Y3Qg cmFkZW9uX3JsYyBybGM7Cj4+ICAgICAgICAgc3RydWN0IHJhZGVvbl9tZWMgbWVjOwo+PiAtICAg ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBob3RwbHVnX3dvcms7Cj4+ICsgICAgICAgc3RydWN0IGRl bGF5ZWRfd29yayBob3RwbHVnX3dvcms7Cj4+ICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGRw X3dvcms7Cj4+ICAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGF1ZGlvX3dvcms7Cj4+ICAgICAg ICAgaW50IG51bV9jcnRjOyAvKiBudW1iZXIgb2YgY3J0Y3MgKi8KPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwo+PiBiL2RyaXZlcnMvZ3B1 L2RybS9yYWRlb24vcmFkZW9uX2Nvbm5lY3RvcnMuYwo+PiBpbmRleCA1YTJjYWZiLi4zNDBmM2Y1 IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9jb25uZWN0b3Jz LmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fY29ubmVjdG9ycy5jCj4+ IEBAIC0xMjM0LDEzICsxMjM0LDMyIEBAIHJhZGVvbl9kdmlfZGV0ZWN0KHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IsCj4+IGJvb2wgZm9yY2UpCj4+ICAgICAgICAgaWYgKHIgPCAwKQo+ PiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwo+ PiAgICsgICAgIGlmIChyYWRlb25fY29ubmVjdG9yLT5kZXRlY3RlZF9ocGRfd2l0aG91dF9kZGMp IHsKPj4gKyAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKPj4gKyAgICAgICAgICAgICAgIHJh ZGVvbl9jb25uZWN0b3ItPmRldGVjdGVkX2hwZF93aXRob3V0X2RkYyA9IGZhbHNlOwo+PiArICAg ICAgIH0KPj4gKwo+PiAgICAgICAgIGlmICghZm9yY2UgJiYgcmFkZW9uX2NoZWNrX2hwZF9zdGF0 dXNfdW5jaGFuZ2VkKGNvbm5lY3RvcikpIHsKPj4gICAgICAgICAgICAgICAgIHJldCA9IGNvbm5l Y3Rvci0+c3RhdHVzOwo+PiAgICAgICAgICAgICAgICAgZ290byBleGl0Owo+PiAgICAgICAgIH0K Pj4gICAtICAgICBpZiAocmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykKPj4gKyAgICAgICBpZiAo cmFkZW9uX2Nvbm5lY3Rvci0+ZGRjX2J1cykgewo+PiAgICAgICAgICAgICAgICAgZHJldCA9IHJh ZGVvbl9kZGNfcHJvYmUocmFkZW9uX2Nvbm5lY3RvciwgZmFsc2UpOwo+PiArCj4+ICsgICAgICAg ICAgICAgICAvKiBTb21ldGltZXMgdGhlIHBpbnMgcmVxdWlyZWQgZm9yIHRoZSBEREMgcHJvYmUg b24gRFZJCj4+ICsgICAgICAgICAgICAgICAgKiBjb25uZWN0b3JzIGRvbid0IG1ha2UgY29udGFj dCBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgdGhlCj4+IG9uZXMKPj4gKyAgICAgICAgICAgICAgICAq IGZvciBIUEQgZG8uIElmIHRoZSBEREMgcHJvYmUgZmFpbHMgZXZlbiB0aG91Z2ggd2UgaGFkCj4+ IGFuIEhQRAo+PiArICAgICAgICAgICAgICAgICogc2lnbmFsLCB0cnkgYWdhaW4gbGF0ZXIgKi8K Pj4gKyAgICAgICAgICAgICAgIGlmICghZHJldCAmJiAhZm9yY2UgJiYKPj4gKyAgICAgICAgICAg ICAgICAgICBjb25uZWN0b3ItPnN0YXR1cyAhPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCkg ewo+PiArICAgICAgICAgICAgICAgICAgICAgICBEUk1fREVCVUdfS01TKCJocGQgZGV0ZWN0ZWQg d2l0aG91dCBkZGMsIHJldHJ5aW5nCj4+IGluIDEgc2Vjb25kXG4iKTsKPj4gKyAgICAgICAgICAg ICAgICAgICAgICAgcmFkZW9uX2Nvbm5lY3Rvci0+ZGV0ZWN0ZWRfaHBkX3dpdGhvdXRfZGRjID0g dHJ1ZTsKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZy ZGV2LT5ob3RwbHVnX3dvcmssCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgZ290byBleGl0Owo+PiArICAgICAgICAgICAgICAgfQo+PiArICAgICAgIH0KPj4gICAg ICAgICBpZiAoZHJldCkgewo+PiAgICAgICAgICAgICAgICAgcmFkZW9uX2Nvbm5lY3Rvci0+ZGV0 ZWN0ZWRfYnlfbG9hZCA9IGZhbHNlOwo+PiAgICAgICAgICAgICAgICAgcmFkZW9uX2Nvbm5lY3Rv cl9mcmVlX2VkaWQoY29ubmVjdG9yKTsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y YWRlb24vcmFkZW9uX2lycV9rbXMuYwo+PiBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9u X2lycV9rbXMuYwo+PiBpbmRleCAxNzFkM2U0Li45NzlmM2JmIDEwMDY0NAo+PiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9pcnFfa21zLmMKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL3JhZGVvbi9yYWRlb25faXJxX2ttcy5jCj4+IEBAIC03NCw3ICs3NCw3IEBAIGlycXJldHVy bl90IHJhZGVvbl9kcml2ZXJfaXJxX2hhbmRsZXJfa21zKGludCBpcnEsIHZvaWQKPj4gKmFyZykK Pj4gICBzdGF0aWMgdm9pZCByYWRlb25faG90cGx1Z193b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3Ry dWN0ICp3b3JrKQo+PiAgIHsKPj4gICAgICAgICBzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldiA9 IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QKPj4gcmFkZW9uX2RldmljZSwKPj4gLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3RwbHVnX3dvcmspOwo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdHBs dWdfd29yay53b3JrKTsKPj4gICAgICAgICBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcmRldi0+ ZGRldjsKPj4gICAgICAgICBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZk ZXYtPm1vZGVfY29uZmlnOwo+PiAgICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3I7Cj4+IEBAIC0zMDIsNyArMzAyLDcgQEAgaW50IHJhZGVvbl9pcnFfa21zX2luaXQoc3RydWN0 IHJhZGVvbl9kZXZpY2UgKnJkZXYpCj4+ICAgICAgICAgICAgICAgICB9Cj4+ICAgICAgICAgfQo+ PiAgIC0gICAgIElOSVRfV09SSygmcmRldi0+aG90cGx1Z193b3JrLCByYWRlb25faG90cGx1Z193 b3JrX2Z1bmMpOwo+PiArICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZyZGV2LT5ob3RwbHVnX3dv cmssIHJhZGVvbl9ob3RwbHVnX3dvcmtfZnVuYyk7Cj4+ICAgICAgICAgSU5JVF9XT1JLKCZyZGV2 LT5kcF93b3JrLCByYWRlb25fZHBfd29ya19mdW5jKTsKPj4gICAgICAgICBJTklUX1dPUksoJnJk ZXYtPmF1ZGlvX3dvcmssIHI2MDBfYXVkaW9fdXBkYXRlX2hkbWkpOwo+PiAgIEBAIC0zMTAsNyAr MzEwLDcgQEAgaW50IHJhZGVvbl9pcnFfa21zX2luaXQoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJk ZXYpCj4+ICAgICAgICAgciA9IGRybV9pcnFfaW5zdGFsbChyZGV2LT5kZGV2LCByZGV2LT5kZGV2 LT5wZGV2LT5pcnEpOwo+PiAgICAgICAgIGlmIChyKSB7Cj4+ICAgICAgICAgICAgICAgICByZGV2 LT5pcnEuaW5zdGFsbGVkID0gZmFsc2U7Cj4+IC0gICAgICAgICAgICAgICBmbHVzaF93b3JrKCZy ZGV2LT5ob3RwbHVnX3dvcmspOwo+PiArICAgICAgICAgICAgICAgZmx1c2hfZGVsYXllZF93b3Jr KCZyZGV2LT5ob3RwbHVnX3dvcmspOwo+PiAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Cj4+ICAg ICAgICAgfQo+PiAgIEBAIC0zMzMsNyArMzMzLDcgQEAgdm9pZCByYWRlb25faXJxX2ttc19maW5p KHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQo+PiAgICAgICAgICAgICAgICAgcmRldi0+aXJx Lmluc3RhbGxlZCA9IGZhbHNlOwo+PiAgICAgICAgICAgICAgICAgaWYgKHJkZXYtPm1zaV9lbmFi bGVkKQo+PiAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfZGlzYWJsZV9tc2kocmRldi0+cGRl dik7Cj4+IC0gICAgICAgICAgICAgICBmbHVzaF93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmspOwo+ PiArICAgICAgICAgICAgICAgZmx1c2hfZGVsYXllZF93b3JrKCZyZGV2LT5ob3RwbHVnX3dvcmsp Owo+PiAgICAgICAgIH0KPj4gICB9Cj4+ICAgZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9y YWRlb24vcmFkZW9uX21vZGUuaAo+PiBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21v ZGUuaAo+PiBpbmRleCA0NTdiMDI2Li4wYWViM2VlIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vcmFkZW9uL3JhZGVvbl9tb2RlLmgKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVv bi9yYWRlb25fbW9kZS5oCj4+IEBAIC01NTMsNiArNTUzLDcgQEAgc3RydWN0IHJhZGVvbl9jb25u ZWN0b3Igewo+PiAgICAgICAgIHZvaWQgKmNvbl9wcml2Owo+PiAgICAgICAgIGJvb2wgZGFjX2xv YWRfZGV0ZWN0Owo+PiAgICAgICAgIGJvb2wgZGV0ZWN0ZWRfYnlfbG9hZDsgLyogaWYgdGhlIGNv bm5lY3Rpb24gc3RhdHVzIHdhcyBkZXRlcm1pbmVkCj4+IGJ5IGxvYWQgKi8KPj4gKyAgICAgICBi b29sIGRldGVjdGVkX2hwZF93aXRob3V0X2RkYzsgLyogaWYgYW4gSFBEIHNpZ25hbCB3YXMgZGV0 ZWN0ZWQgb24KPj4gRFZJLCBidXQgZGRjIHByb2JpbmcgZmFpbGVkICovCj4+ICAgICAgICAgdWlu dDE2X3QgY29ubmVjdG9yX29iamVjdF9pZDsKPj4gICAgICAgICBzdHJ1Y3QgcmFkZW9uX2hwZCBo cGQ7Cj4+ICAgICAgICAgc3RydWN0IHJhZGVvbl9yb3V0ZXIgcm91dGVyOwo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCj4+IGIvZHJpdmVycy9ncHUvZHJtL3Jh ZGVvbi9yczYwMC5jCj4+IGluZGV4IDk3YTkwNDguLjYyNDRmNGUgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFk ZW9uL3JzNjAwLmMKPj4gQEAgLTgxMyw3ICs4MTMsNyBAQCBpbnQgcnM2MDBfaXJxX3Byb2Nlc3Mo c3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYpCj4+ICAgICAgICAgICAgICAgICBzdGF0dXMgPSBy czYwMF9pcnFfYWNrKHJkZXYpOwo+PiAgICAgICAgIH0KPj4gICAgICAgICBpZiAocXVldWVfaG90 cGx1ZykKPj4gLSAgICAgICAgICAgICAgIHNjaGVkdWxlX3dvcmsoJnJkZXYtPmhvdHBsdWdfd29y ayk7Cj4+ICsgICAgICAgICAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJkZXYtPmhvdHBs dWdfd29yaywgMCk7Cj4+ICAgICAgICAgaWYgKHF1ZXVlX2hkbWkpCj4+ICAgICAgICAgICAgICAg ICBzY2hlZHVsZV93b3JrKCZyZGV2LT5hdWRpb193b3JrKTsKPj4gICAgICAgICBpZiAocmRldi0+ bXNpX2VuYWJsZWQpIHsKPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2ku YyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2kuYwo+PiBpbmRleCAwNzAzN2UzLi5mYjFhN2Vj IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpLmMKPj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3JhZGVvbi9zaS5jCj4+IEBAIC02ODQ4LDcgKzY4NDgsNyBAQCByZXN0YXJ0 X2loOgo+PiAgICAgICAgIGlmIChxdWV1ZV9kcCkKPj4gICAgICAgICAgICAgICAgIHNjaGVkdWxl X3dvcmsoJnJkZXYtPmRwX3dvcmspOwo+PiAgICAgICAgIGlmIChxdWV1ZV9ob3RwbHVnKQo+PiAt ICAgICAgICAgICAgICAgc2NoZWR1bGVfd29yaygmcmRldi0+aG90cGx1Z193b3JrKTsKPj4gKyAg ICAgICAgICAgICAgIHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmRldi0+aG90cGx1Z193b3JrLCAw KTsKPj4gICAgICAgICBpZiAocXVldWVfdGhlcm1hbCAmJiByZGV2LT5wbS5kcG1fZW5hYmxlZCkK Pj4gICAgICAgICAgICAgICAgIHNjaGVkdWxlX3dvcmsoJnJkZXYtPnBtLmRwbS50aGVybWFsLndv cmspOwo+PiAgICAgICAgIHJkZXYtPmloLnJwdHIgPSBycHRyOwo+Cj4KPiBfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGRyaS1kZXZlbCBtYWlsaW5nIGxp c3QKPiBkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gaHR0cDovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbApfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=