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=-7.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no 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 8E191C71156 for ; Tue, 1 Dec 2020 02:11:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 287D020857 for ; Tue, 1 Dec 2020 02:11:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="RNDsyUP9" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726924AbgLACLo (ORCPT ); Mon, 30 Nov 2020 21:11:44 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:22385 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726862AbgLACLo (ORCPT ); Mon, 30 Nov 2020 21:11:44 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606788615; 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=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=RNDsyUP9hxYGwDjDk1NHLLUH8Arv6aZObJamZWjV0iwqCVNseCzu/aB3XSwJcLmeuv9pcO 1Mgm72MbTVEAkuG47YfX/f/hcshc/Sq2wGMtAV4TfT0rS3R1KMMreDmUMIXYyq6fav69vy g9mhckxMAL3vysOe2/kms5gLEpCtfuc= Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-168-MrKyArhiO8aTVf3BM-6fKQ-1; Mon, 30 Nov 2020 21:10:09 -0500 X-MC-Unique: MrKyArhiO8aTVf3BM-6fKQ-1 Received: by mail-qk1-f197.google.com with SMTP id o25so168091qkj.1 for ; Mon, 30 Nov 2020 18:10:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=KSL7uYr6zujKH0NZD5aERnHXa/ECzneWK4CJmfAw4F8VVKr+CsXwkSlsPxQ52VWItr iPKhTxWISfy0YtO4VCRtM0IxzKz/butmb6o+EMyL2FIEEFxwZmJDjulKTEydOVe4jvbl kp/pRnhKEFIx8dexxXfOnxWVwJcuksIM7PptKkFXuN/35Rjub0eOMHkbRey/aDf3wfPn ozW6iNM+X2KGOdSWcWqk1J1qrq62NdKZrKAbc/3uYO9qbRARAPAwsqyt94wVE68u0+GJ kB2OLVJ3m0I+YRUQZScnbruU0iRuieDX5B5a++Jfel9yVzUzHh1GCWyGgZagfXH7haJC AmGA== X-Gm-Message-State: AOAM530xtbELxxysAUnaadT9ws5iOFvEeQHoKi1EDc8cMQ1BUtJxvG9o aVcF4mmagCEqctZCI+qTQvoAMhHDIzyXk+4POJzTBoVDHX3ExbRPlCPEMjVNsAljfk2wylhl/G8 vLTGxeLpGp6osCr0hUEGIEyvC X-Received: by 2002:ac8:548e:: with SMTP id h14mr523051qtq.326.1606788607518; Mon, 30 Nov 2020 18:10:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJydnmSM0Rc6kiEQxTp05Nu/josJ8rsxGS/zqzDwekiSnfNPQj14p4efdq7tNnm247maQH8toA== X-Received: by 2002:ac8:548e:: with SMTP id h14mr523017qtq.326.1606788607170; Mon, 30 Nov 2020 18:10:07 -0800 (PST) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j13sm484482qtc.81.2020.11.30.18.10.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Nov 2020 18:10:06 -0800 (PST) Message-ID: Subject: Re: [Intel-gfx] [RFC v2 3/8] drm/i915: Keep track of pwm-related backlight hooks separately From: Lyude Paul To: Jani Nikula , Dave Airlie Cc: David Airlie , Intel Graphics Development , Lucas De Marchi , open list , dri-devel , Chris Wilson , Vasily Khoruzhick , Sean Paul , Wambui Karuga Date: Mon, 30 Nov 2020 21:10:05 -0500 In-Reply-To: <87o8jkl4a6.fsf@intel.com> References: <20200916171855.129511-1-lyude@redhat.com> <20200916171855.129511-4-lyude@redhat.com> <87o8jkl4a6.fsf@intel.com> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.1 (3.38.1-1.fc33) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2020-11-26 at 13:57 +0200, Jani Nikula wrote: > On Thu, 26 Nov 2020, Dave Airlie wrote: > > On Thu, 17 Sept 2020 at 03:19, Lyude Paul wrote: > > > > > > Currently, every different type of backlight hook that i915 supports is > > > pretty straight forward - you have a backlight, probably through PWM > > > (but maybe DPCD), with a single set of platform-specific hooks that are > > > used for controlling it. > > > > > > HDR backlights, in particular VESA and Intel's HDR backlight > > > implementations, can end up being more complicated. With Intel's > > > proprietary interface, HDR backlight controls always run through the > > > DPCD. When the backlight is in SDR backlight mode however, the driver > > > may need to bypass the TCON and control the backlight directly through > > > PWM. > > > > > > So, in order to support this we'll need to split our backlight callbacks > > > into two groups: a set of high-level backlight control callbacks in > > > intel_panel, and an additional set of pwm-specific backlight control > > > callbacks. This also implies a functional changes for how these > > > callbacks are used: > > > > > > * We now keep track of two separate backlight level ranges, one for the > > >   high-level backlight, and one for the pwm backlight range > > > * We also keep track of backlight enablement and PWM backlight > > >   enablement separately > > > * Since the currently set backlight level might not be the same as the > > >   currently programmed PWM backlight level, we stop setting > > >   panel->backlight.level with the currently programmed PWM backlight > > >   level in panel->backlight.pwm_funcs.setup(). Instead, we rely > > >   on the higher level backlight control functions to retrieve the > > >   current PWM backlight level (in this case, intel_pwm_get_backlight()). > > >   Note that there are still a few PWM backlight setup callbacks that > > >   do actually need to retrieve the current PWM backlight level, although > > >   we no longer save this value in panel->backlight.level like before. > > > * panel->backlight.pwm_funcs.enable()/disable() both accept a PWM > > >   brightness level, unlike their siblings > > >   panel->backlight.enable()/disable(). This is so we can calculate the > > >   actual PWM brightness level we want to set on disable/enable in the > > >   higher level backlight enable()/disable() functions, since this value > > >   might be scaled from a brightness level that doesn't come from PWM. > > > > Oh this patch is a handful, I can see why people stall out here. > > > > I'm going to be annoying maintainer and see if you can clean this up a > > bit in advance of this patch. > > Agreed. And not looking into and requesting this earlier is on me. > > The thing that still keeps bugging me about the DPCD brightness control > in general is that it's a historical mistake to put all of this under > i915. (Again, mea culpa.) The standard DPCD brightness control should > really be under drm core, in one form or another. JFYI - I already actually have a WIP series to move all of the VESA standard brightness stuff into the DRM core (especially since I am adding support for the VESA interface to nouveau). It is pretty important to do so especially considering some of the ways panel manufacturers seem to have consistently gotten some portions of the spec wrong (there's currently a bug on almost every panel I've run into, minus some panels in laptops that run ChromeOS, where they interpret the brightness value as LSB aligned and not MSB aligned (which is what the eDP spec actually says), because almost everyone misread it. So, definitely the kind of stuff we'd want to keep in the drm core to make maintaining quirks like this easier. > > I'm not asking to fix that here. But I *am* wondering if the series > makes that harder. What would it look like if we did have that unicorn > of a brightness connector property? How would that tie into the hooks we > have? Re: making it harder, not really. But either way I'm planning on doing the work for this anyway :) > > Maybe the answer is that the DPCD backlight functions should just be > library code in drm core that the drivers could call. In the long run, > i915 really can't be the only one needing this stuff. > > We haven't implemented the mixed modes of DPCD and eDP PWM pin > brightness control. But the point is, the library code can't call into > i915 specific eDP PWM pin control code. The proprietary HDR brightness > code will still be i915 specific, but does it make sense to have a mixed > mode there that will be completely different from what a mixed mode with > the standard VESA DPCD brightness could be? > > I.e. what should be the entry points for the hooks, and who calls what? I think i915 is actually exactly where we want the hooks for this particular backlight interface, mostly because amdgpu already had to implement their own backlight control interface for similar reasons to Intel. From what I've seen, the interfaces which a panel supports backlight control through tend to be tightly tied to the hardware those panels usually accompany (at least in the x86 world, no idea about elsewhere). For example, I've only seen laptops which have no support/broken support for the VESA backlight interface, but not Intel's, on hardware which only had an Intel GPU present. Every single laptop I've tested with a Intel/Nvidia GPU setup (where the Nvidia GPU could drive the eDP display, no idea what the situation is like elsewhere) seems to support both interfaces perfectly. So, I don't think we'll ever see any need for this outside of i915 at least. Also in specific regards to the pwm control: I'm actually planning on keeping that out of the DRM core libraries, because some variants of the VESA interface actually need to be able to call down to PWM driver functions as well. Thus, I think the only way of coming up with helpers for this that make sense is to only add helpers for the DPCD related portions of backlight control that are going to apply to all drivers. So far the only spot where we ask the driver for PWM related info is during eDP backlight probing, where we can use it to calculate the number of supported backlight levels, but this is entirely optional for the driver to support it. JFYI, here's a WIP of that: https://gitlab.freedesktop.org/lyudess/linux/-/commit/a4bbe0d5ad980c12eb776e59a1bd522d74d09006 > > BR, > Jani. > > > > > 1) move the callbacks out of struct intel_panel.backlight into a separate > > struct > > and use const static object tables, having fn ptrs and data co-located > > in a struct > > isn't great. > > > > strcut intel_panel_backlight_funcs { > > > > }; > > struct intel_panel { > >     struct { > >         struct intel_panel_backlight_funcs *funcs; > >     }; > > }; > > > > type of thing. > > > > I think you could reuse the backlight funcs struct for the pwm stuff > > as well. (maybe with an assert on hz_to_pwm for the old hooks). > > > > 2) change the apis to pass 0 down in a separate patch, this modifies a > > bunch of apis to pass in an extra level parameter, do that > > first in a separate patch that doesn't change anything but hands 0 > > down the chain. Then switch over in another patch. > > > > 3) One comment in passing below. > > > > > > > > > -       if (cpu_mode) > > > -               val = pch_get_backlight(connector); > > > -       else > > > -               val = lpt_get_backlight(connector); > > > -       val = intel_panel_compute_brightness(connector, val); > > > -       panel->backlight.level = clamp(val, panel->backlight.min, > > > -                                      panel->backlight.max); > > > > > >         if (cpu_mode) { > > > +               val = intel_panel_sanitize_pwm_level(connector, > > > pch_get_backlight(connector)); > > > + > > >                 drm_dbg_kms(&dev_priv->drm, > > >                             "CPU backlight register was enabled, > > > switching to PCH override\n"); > > > > > >                 /* Write converted CPU PWM value to PCH override > > > register */ > > > -               lpt_set_backlight(connector->base.state, panel- > > > >backlight.level); > > > +               lpt_set_backlight(connector->base.state, val); > > >                 intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, > > >                                pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE); > > > > > The change here confused me since it no longer calls lpt_get_backlight > > in this path, the commit msg might explain this, but it didn't explain > > is so I could figure out if that was a mistake or intentional. > > > > Dave. > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > -- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat 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=-3.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=no 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 8B39DC63777 for ; Tue, 1 Dec 2020 02:10:18 +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 0AAB8207FF for ; Tue, 1 Dec 2020 02:10:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="c4vj52yd" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0AAB8207FF 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 BF2B289E52; Tue, 1 Dec 2020 02:10:16 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id D715489E52 for ; Tue, 1 Dec 2020 02:10:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606788614; 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=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=c4vj52ydNOnW7A5RRkIrN6eUv9CVSAUvY6ta37fZhgw+nQGKR1E0RlvUj7nNmyHekLX1YK nXfUO+jNhqUhkUBY6UtaeMXHb3NlO8V5Y1ZoPL5+LDb2rrcVROTpy6yC2Q62kcftFj/prX BMgaq6xg6H6iI8Vvof+5yV20DUxp35Y= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-46-81QgH11PMpm1qZ7LfPVEuw-1; Mon, 30 Nov 2020 21:10:09 -0500 X-MC-Unique: 81QgH11PMpm1qZ7LfPVEuw-1 Received: by mail-qv1-f69.google.com with SMTP id e13so77578qvl.19 for ; Mon, 30 Nov 2020 18:10:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=q4PbkIPdL4KqRmBVycl0qU0MlqRKlHiJpXK8ym8pLJfpTE46IQ0wI2IKtPhIs1I6ZC AGxmMFZdx2Ue544DNu3FqN32TBajzw99kEN0hdiTsamnyWATEc+Q2Y3XTyB6iqsaNnlO BryXdGcGOvWgPJtetxLD2PAwknwMkSlP8+2GNAE+q9CmNaJy3AvVZfGt4IWgWCV3BMOI SHAuu/+wdXQkKxHhn02FCN35DihsJJSQcypuySylCMS6Vl0I8sSZlNPVk5yLFNKMuKwg lRsLnCUMYSdxLQkIwkS1nKsXv7Fr9LUNnuoRHCGdh855CmbnD2Tn6Gsg5JYEG42yblu5 2kdA== X-Gm-Message-State: AOAM531xXk4MznWn18lDFpCkFvatm6lwBcvl1OncXmFVFBl10+kSW/Lr lquUyzqix5r05MJFUmY1VfKDd8jnaAbaYkwmPXZy4l/wjliPSb9z40RR95EwZBeEZJtHbR7t7th FU9ulBsWzo2epVaT09QWe4dbgeVNu X-Received: by 2002:ac8:548e:: with SMTP id h14mr523048qtq.326.1606788607518; Mon, 30 Nov 2020 18:10:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJydnmSM0Rc6kiEQxTp05Nu/josJ8rsxGS/zqzDwekiSnfNPQj14p4efdq7tNnm247maQH8toA== X-Received: by 2002:ac8:548e:: with SMTP id h14mr523017qtq.326.1606788607170; Mon, 30 Nov 2020 18:10:07 -0800 (PST) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j13sm484482qtc.81.2020.11.30.18.10.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Nov 2020 18:10:06 -0800 (PST) Message-ID: Subject: Re: [Intel-gfx] [RFC v2 3/8] drm/i915: Keep track of pwm-related backlight hooks separately From: Lyude Paul To: Jani Nikula , Dave Airlie Date: Mon, 30 Nov 2020 21:10:05 -0500 In-Reply-To: <87o8jkl4a6.fsf@intel.com> References: <20200916171855.129511-1-lyude@redhat.com> <20200916171855.129511-4-lyude@redhat.com> <87o8jkl4a6.fsf@intel.com> Organization: Red Hat User-Agent: Evolution 3.38.1 (3.38.1-1.fc33) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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: David Airlie , Intel Graphics Development , Lucas De Marchi , open list , dri-devel , Chris Wilson , Vasily Khoruzhick , Sean Paul , Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gVGh1LCAyMDIwLTExLTI2IGF0IDEzOjU3ICswMjAwLCBKYW5pIE5pa3VsYSB3cm90ZToKPiBP biBUaHUsIDI2IE5vdiAyMDIwLCBEYXZlIEFpcmxpZSA8YWlybGllZEBnbWFpbC5jb20+IHdyb3Rl Ogo+ID4gT24gVGh1LCAxNyBTZXB0IDIwMjAgYXQgMDM6MTksIEx5dWRlIFBhdWwgPGx5dWRlQHJl ZGhhdC5jb20+IHdyb3RlOgo+ID4gPiAKPiA+ID4gQ3VycmVudGx5LCBldmVyeSBkaWZmZXJlbnQg dHlwZSBvZiBiYWNrbGlnaHQgaG9vayB0aGF0IGk5MTUgc3VwcG9ydHMgaXMKPiA+ID4gcHJldHR5 IHN0cmFpZ2h0IGZvcndhcmQgLSB5b3UgaGF2ZSBhIGJhY2tsaWdodCwgcHJvYmFibHkgdGhyb3Vn aCBQV00KPiA+ID4gKGJ1dCBtYXliZSBEUENEKSwgd2l0aCBhIHNpbmdsZSBzZXQgb2YgcGxhdGZv cm0tc3BlY2lmaWMgaG9va3MgdGhhdCBhcmUKPiA+ID4gdXNlZCBmb3IgY29udHJvbGxpbmcgaXQu Cj4gPiA+IAo+ID4gPiBIRFIgYmFja2xpZ2h0cywgaW4gcGFydGljdWxhciBWRVNBIGFuZCBJbnRl bCdzIEhEUiBiYWNrbGlnaHQKPiA+ID4gaW1wbGVtZW50YXRpb25zLCBjYW4gZW5kIHVwIGJlaW5n IG1vcmUgY29tcGxpY2F0ZWQuIFdpdGggSW50ZWwncwo+ID4gPiBwcm9wcmlldGFyeSBpbnRlcmZh Y2UsIEhEUiBiYWNrbGlnaHQgY29udHJvbHMgYWx3YXlzIHJ1biB0aHJvdWdoIHRoZQo+ID4gPiBE UENELiBXaGVuIHRoZSBiYWNrbGlnaHQgaXMgaW4gU0RSIGJhY2tsaWdodCBtb2RlIGhvd2V2ZXIs IHRoZSBkcml2ZXIKPiA+ID4gbWF5IG5lZWQgdG8gYnlwYXNzIHRoZSBUQ09OIGFuZCBjb250cm9s IHRoZSBiYWNrbGlnaHQgZGlyZWN0bHkgdGhyb3VnaAo+ID4gPiBQV00uCj4gPiA+IAo+ID4gPiBT bywgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIHdlJ2xsIG5lZWQgdG8gc3BsaXQgb3VyIGJhY2ts aWdodCBjYWxsYmFja3MKPiA+ID4gaW50byB0d28gZ3JvdXBzOiBhIHNldCBvZiBoaWdoLWxldmVs IGJhY2tsaWdodCBjb250cm9sIGNhbGxiYWNrcyBpbgo+ID4gPiBpbnRlbF9wYW5lbCwgYW5kIGFu IGFkZGl0aW9uYWwgc2V0IG9mIHB3bS1zcGVjaWZpYyBiYWNrbGlnaHQgY29udHJvbAo+ID4gPiBj YWxsYmFja3MuIFRoaXMgYWxzbyBpbXBsaWVzIGEgZnVuY3Rpb25hbCBjaGFuZ2VzIGZvciBob3cg dGhlc2UKPiA+ID4gY2FsbGJhY2tzIGFyZSB1c2VkOgo+ID4gPiAKPiA+ID4gKiBXZSBub3cga2Vl cCB0cmFjayBvZiB0d28gc2VwYXJhdGUgYmFja2xpZ2h0IGxldmVsIHJhbmdlcywgb25lIGZvciB0 aGUKPiA+ID4gwqAgaGlnaC1sZXZlbCBiYWNrbGlnaHQsIGFuZCBvbmUgZm9yIHRoZSBwd20gYmFj a2xpZ2h0IHJhbmdlCj4gPiA+ICogV2UgYWxzbyBrZWVwIHRyYWNrIG9mIGJhY2tsaWdodCBlbmFi bGVtZW50IGFuZCBQV00gYmFja2xpZ2h0Cj4gPiA+IMKgIGVuYWJsZW1lbnQgc2VwYXJhdGVseQo+ ID4gPiAqIFNpbmNlIHRoZSBjdXJyZW50bHkgc2V0IGJhY2tsaWdodCBsZXZlbCBtaWdodCBub3Qg YmUgdGhlIHNhbWUgYXMgdGhlCj4gPiA+IMKgIGN1cnJlbnRseSBwcm9ncmFtbWVkIFBXTSBiYWNr bGlnaHQgbGV2ZWwsIHdlIHN0b3Agc2V0dGluZwo+ID4gPiDCoCBwYW5lbC0+YmFja2xpZ2h0Lmxl dmVsIHdpdGggdGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIFBXTSBiYWNrbGlnaHQKPiA+ID4gwqAg bGV2ZWwgaW4gcGFuZWwtPmJhY2tsaWdodC5wd21fZnVuY3Muc2V0dXAoKS4gSW5zdGVhZCwgd2Ug cmVseQo+ID4gPiDCoCBvbiB0aGUgaGlnaGVyIGxldmVsIGJhY2tsaWdodCBjb250cm9sIGZ1bmN0 aW9ucyB0byByZXRyaWV2ZSB0aGUKPiA+ID4gwqAgY3VycmVudCBQV00gYmFja2xpZ2h0IGxldmVs IChpbiB0aGlzIGNhc2UsIGludGVsX3B3bV9nZXRfYmFja2xpZ2h0KCkpLgo+ID4gPiDCoCBOb3Rl IHRoYXQgdGhlcmUgYXJlIHN0aWxsIGEgZmV3IFBXTSBiYWNrbGlnaHQgc2V0dXAgY2FsbGJhY2tz IHRoYXQKPiA+ID4gwqAgZG8gYWN0dWFsbHkgbmVlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBQ V00gYmFja2xpZ2h0IGxldmVsLCBhbHRob3VnaAo+ID4gPiDCoCB3ZSBubyBsb25nZXIgc2F2ZSB0 aGlzIHZhbHVlIGluIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgbGlrZSBiZWZvcmUuCj4gPiA+ICog cGFuZWwtPmJhY2tsaWdodC5wd21fZnVuY3MuZW5hYmxlKCkvZGlzYWJsZSgpIGJvdGggYWNjZXB0 IGEgUFdNCj4gPiA+IMKgIGJyaWdodG5lc3MgbGV2ZWwsIHVubGlrZSB0aGVpciBzaWJsaW5ncwo+ ID4gPiDCoCBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZSgpL2Rpc2FibGUoKS4gVGhpcyBpcyBzbyB3 ZSBjYW4gY2FsY3VsYXRlIHRoZQo+ID4gPiDCoCBhY3R1YWwgUFdNIGJyaWdodG5lc3MgbGV2ZWwg d2Ugd2FudCB0byBzZXQgb24gZGlzYWJsZS9lbmFibGUgaW4gdGhlCj4gPiA+IMKgIGhpZ2hlciBs ZXZlbCBiYWNrbGlnaHQgZW5hYmxlKCkvZGlzYWJsZSgpIGZ1bmN0aW9ucywgc2luY2UgdGhpcyB2 YWx1ZQo+ID4gPiDCoCBtaWdodCBiZSBzY2FsZWQgZnJvbSBhIGJyaWdodG5lc3MgbGV2ZWwgdGhh dCBkb2Vzbid0IGNvbWUgZnJvbSBQV00uCj4gPiAKPiA+IE9oIHRoaXMgcGF0Y2ggaXMgYSBoYW5k ZnVsLCBJIGNhbiBzZWUgd2h5IHBlb3BsZSBzdGFsbCBvdXQgaGVyZS4KPiA+IAo+ID4gSSdtIGdv aW5nIHRvIGJlIGFubm95aW5nIG1haW50YWluZXIgYW5kIHNlZSBpZiB5b3UgY2FuIGNsZWFuIHRo aXMgdXAgYQo+ID4gYml0IGluIGFkdmFuY2Ugb2YgdGhpcyBwYXRjaC4KPiAKPiBBZ3JlZWQuIEFu ZCBub3QgbG9va2luZyBpbnRvIGFuZCByZXF1ZXN0aW5nIHRoaXMgZWFybGllciBpcyBvbiBtZS4K PiAKPiBUaGUgdGhpbmcgdGhhdCBzdGlsbCBrZWVwcyBidWdnaW5nIG1lIGFib3V0IHRoZSBEUENE IGJyaWdodG5lc3MgY29udHJvbAo+IGluIGdlbmVyYWwgaXMgdGhhdCBpdCdzIGEgaGlzdG9yaWNh bCBtaXN0YWtlIHRvIHB1dCBhbGwgb2YgdGhpcyB1bmRlcgo+IGk5MTUuIChBZ2FpbiwgbWVhIGN1 bHBhLikgVGhlIHN0YW5kYXJkIERQQ0QgYnJpZ2h0bmVzcyBjb250cm9sIHNob3VsZAo+IHJlYWxs eSBiZSB1bmRlciBkcm0gY29yZSwgaW4gb25lIGZvcm0gb3IgYW5vdGhlci4KCkpGWUkgLSBJIGFs cmVhZHkgYWN0dWFsbHkgaGF2ZSBhIFdJUCBzZXJpZXMgdG8gbW92ZSBhbGwgb2YgdGhlIFZFU0Eg c3RhbmRhcmQKYnJpZ2h0bmVzcyBzdHVmZiBpbnRvIHRoZSBEUk0gY29yZSAoZXNwZWNpYWxseSBz aW5jZSBJIGFtIGFkZGluZyBzdXBwb3J0IGZvcgp0aGUgVkVTQSBpbnRlcmZhY2UgdG8gbm91dmVh dSkuIEl0IGlzIHByZXR0eSBpbXBvcnRhbnQgdG8gZG8gc28gZXNwZWNpYWxseQpjb25zaWRlcmlu ZyBzb21lIG9mIHRoZSB3YXlzIHBhbmVsIG1hbnVmYWN0dXJlcnMgc2VlbSB0byBoYXZlIGNvbnNp c3RlbnRseQpnb3R0ZW4gc29tZSBwb3J0aW9ucyBvZiB0aGUgc3BlYyB3cm9uZyAodGhlcmUncyBj dXJyZW50bHkgYSBidWcgb24gYWxtb3N0CmV2ZXJ5IHBhbmVsIEkndmUgcnVuIGludG8sIG1pbnVz IHNvbWUgcGFuZWxzIGluIGxhcHRvcHMgdGhhdCBydW4gQ2hyb21lT1MsCndoZXJlIHRoZXkgaW50 ZXJwcmV0IHRoZSBicmlnaHRuZXNzIHZhbHVlIGFzIExTQiBhbGlnbmVkIGFuZCBub3QgTVNCIGFs aWduZWQKKHdoaWNoIGlzIHdoYXQgdGhlIGVEUCBzcGVjIGFjdHVhbGx5IHNheXMpLCBiZWNhdXNl IGFsbW9zdCBldmVyeW9uZSBtaXNyZWFkCml0LiBTbywgZGVmaW5pdGVseSB0aGUga2luZCBvZiBz dHVmZiB3ZSdkIHdhbnQgdG8ga2VlcCBpbiB0aGUgZHJtIGNvcmUgdG8gbWFrZQptYWludGFpbmlu ZyBxdWlya3MgbGlrZSB0aGlzIGVhc2llci4KCj4gCj4gSSdtIG5vdCBhc2tpbmcgdG8gZml4IHRo YXQgaGVyZS4gQnV0IEkgKmFtKiB3b25kZXJpbmcgaWYgdGhlIHNlcmllcwo+IG1ha2VzIHRoYXQg aGFyZGVyLiBXaGF0IHdvdWxkIGl0IGxvb2sgbGlrZSBpZiB3ZSBkaWQgaGF2ZSB0aGF0IHVuaWNv cm4KPiBvZiBhIGJyaWdodG5lc3MgY29ubmVjdG9yIHByb3BlcnR5PyBIb3cgd291bGQgdGhhdCB0 aWUgaW50byB0aGUgaG9va3Mgd2UKPiBoYXZlPwoKUmU6IG1ha2luZyBpdCBoYXJkZXIsIG5vdCBy ZWFsbHkuIEJ1dCBlaXRoZXIgd2F5IEknbSBwbGFubmluZyBvbiBkb2luZyB0aGUKd29yayBmb3Ig dGhpcyBhbnl3YXkgOikKCj4gCj4gTWF5YmUgdGhlIGFuc3dlciBpcyB0aGF0IHRoZSBEUENEIGJh Y2tsaWdodCBmdW5jdGlvbnMgc2hvdWxkIGp1c3QgYmUKPiBsaWJyYXJ5IGNvZGUgaW4gZHJtIGNv cmUgdGhhdCB0aGUgZHJpdmVycyBjb3VsZCBjYWxsLiBJbiB0aGUgbG9uZyBydW4sCj4gaTkxNSBy ZWFsbHkgY2FuJ3QgYmUgdGhlIG9ubHkgb25lIG5lZWRpbmcgdGhpcyBzdHVmZi4KPiAKPiBXZSBo YXZlbid0IGltcGxlbWVudGVkIHRoZSBtaXhlZCBtb2RlcyBvZiBEUENEIGFuZCBlRFAgUFdNIHBp bgo+IGJyaWdodG5lc3MgY29udHJvbC4gQnV0IHRoZSBwb2ludCBpcywgdGhlIGxpYnJhcnkgY29k ZSBjYW4ndCBjYWxsIGludG8KPiBpOTE1IHNwZWNpZmljIGVEUCBQV00gcGluIGNvbnRyb2wgY29k ZS4gVGhlIHByb3ByaWV0YXJ5IEhEUiBicmlnaHRuZXNzCj4gY29kZSB3aWxsIHN0aWxsIGJlIGk5 MTUgc3BlY2lmaWMsIGJ1dCBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIG1peGVkCj4gbW9k ZSB0aGVyZSB0aGF0IHdpbGwgYmUgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IGEgbWl4 ZWQgbW9kZSB3aXRoCj4gdGhlIHN0YW5kYXJkIFZFU0EgRFBDRCBicmlnaHRuZXNzIGNvdWxkIGJl Pwo+IAo+IEkuZS4gd2hhdCBzaG91bGQgYmUgdGhlIGVudHJ5IHBvaW50cyBmb3IgdGhlIGhvb2tz LCBhbmQgd2hvIGNhbGxzIHdoYXQ/CgpJIHRoaW5rIGk5MTUgaXMgYWN0dWFsbHkgZXhhY3RseSB3 aGVyZSB3ZSB3YW50IHRoZSBob29rcyBmb3IgdGhpcyBwYXJ0aWN1bGFyCmJhY2tsaWdodCBpbnRl cmZhY2UsIG1vc3RseSBiZWNhdXNlIGFtZGdwdSBhbHJlYWR5IGhhZCB0byBpbXBsZW1lbnQgdGhl aXIgb3duCmJhY2tsaWdodCBjb250cm9sIGludGVyZmFjZSBmb3Igc2ltaWxhciByZWFzb25zIHRv IEludGVsLiBGcm9tIHdoYXQgSSd2ZSBzZWVuLAp0aGUgaW50ZXJmYWNlcyB3aGljaCBhIHBhbmVs IHN1cHBvcnRzIGJhY2tsaWdodCBjb250cm9sIHRocm91Z2ggdGVuZCB0byBiZQp0aWdodGx5IHRp ZWQgdG8gdGhlIGhhcmR3YXJlIHRob3NlIHBhbmVscyB1c3VhbGx5IGFjY29tcGFueSAoYXQgbGVh c3QgaW4gdGhlCng4NiB3b3JsZCwgbm8gaWRlYSBhYm91dCBlbHNld2hlcmUpLiBGb3IgZXhhbXBs ZSwgSSd2ZSBvbmx5IHNlZW4gbGFwdG9wcyB3aGljaApoYXZlIG5vIHN1cHBvcnQvYnJva2VuIHN1 cHBvcnQgZm9yIHRoZSBWRVNBIGJhY2tsaWdodCBpbnRlcmZhY2UsIGJ1dCBub3QKSW50ZWwncywg b24gaGFyZHdhcmUgd2hpY2ggb25seSBoYWQgYW4gSW50ZWwgR1BVIHByZXNlbnQuIEV2ZXJ5IHNp bmdsZSBsYXB0b3AKSSd2ZSB0ZXN0ZWQgd2l0aCBhIEludGVsL052aWRpYSBHUFUgc2V0dXAgKHdo ZXJlIHRoZSBOdmlkaWEgR1BVIGNvdWxkIGRyaXZlIHRoZQplRFAgZGlzcGxheSwgbm8gaWRlYSB3 aGF0IHRoZSBzaXR1YXRpb24gaXMgbGlrZSBlbHNld2hlcmUpIHNlZW1zIHRvIHN1cHBvcnQgYm90 aAppbnRlcmZhY2VzIHBlcmZlY3RseS4gU28sIEkgZG9uJ3QgdGhpbmsgd2UnbGwgZXZlciBzZWUg YW55IG5lZWQgZm9yIHRoaXMgb3V0c2lkZQpvZiBpOTE1IGF0IGxlYXN0LgoKQWxzbyBpbiBzcGVj aWZpYyByZWdhcmRzIHRvIHRoZSBwd20gY29udHJvbDogSSdtIGFjdHVhbGx5IHBsYW5uaW5nIG9u IGtlZXBpbmcKdGhhdCBvdXQgb2YgdGhlIERSTSBjb3JlIGxpYnJhcmllcywgYmVjYXVzZSBzb21l IHZhcmlhbnRzIG9mIHRoZSBWRVNBIGludGVyZmFjZQphY3R1YWxseSBuZWVkIHRvIGJlIGFibGUg dG8gY2FsbCBkb3duIHRvIFBXTSBkcml2ZXIgZnVuY3Rpb25zIGFzIHdlbGwuIFRodXMsIEkKdGhp bmsgdGhlIG9ubHkgd2F5IG9mIGNvbWluZyB1cCB3aXRoIGhlbHBlcnMgZm9yIHRoaXMgdGhhdCBt YWtlIHNlbnNlIGlzIHRvIG9ubHkKYWRkIGhlbHBlcnMgZm9yIHRoZSBEUENEIHJlbGF0ZWQgcG9y dGlvbnMgb2YgYmFja2xpZ2h0IGNvbnRyb2wgdGhhdCBhcmUgZ29pbmcgdG8KYXBwbHkgdG8gYWxs IGRyaXZlcnMuIFNvIGZhciB0aGUgb25seSBzcG90IHdoZXJlIHdlIGFzayB0aGUgZHJpdmVyIGZv ciBQV00KcmVsYXRlZCBpbmZvIGlzIGR1cmluZyBlRFAgYmFja2xpZ2h0IHByb2JpbmcsIHdoZXJl IHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlCnRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIGJhY2ts aWdodCBsZXZlbHMsIGJ1dCB0aGlzIGlzIGVudGlyZWx5IG9wdGlvbmFsIGZvciB0aGUKZHJpdmVy IHRvIHN1cHBvcnQgaXQuCgpKRllJLCBoZXJlJ3MgYSBXSVAgb2YgdGhhdDoKCmh0dHBzOi8vZ2l0 bGFiLmZyZWVkZXNrdG9wLm9yZy9seXVkZXNzL2xpbnV4Ly0vY29tbWl0L2E0YmJlMGQ1YWQ5ODBj MTJlYjc3NmU1OWExYmQ1MjJkNzRkMDkwMDYKCj4gCj4gQlIsCj4gSmFuaS4KPiAKPiA+IAo+ID4g MSkgbW92ZSB0aGUgY2FsbGJhY2tzIG91dCBvZiBzdHJ1Y3QgaW50ZWxfcGFuZWwuYmFja2xpZ2h0 IGludG8gYSBzZXBhcmF0ZQo+ID4gc3RydWN0Cj4gPiBhbmQgdXNlIGNvbnN0IHN0YXRpYyBvYmpl Y3QgdGFibGVzLCBoYXZpbmcgZm4gcHRycyBhbmQgZGF0YSBjby1sb2NhdGVkCj4gPiBpbiBhIHN0 cnVjdAo+ID4gaXNuJ3QgZ3JlYXQuCj4gPiAKPiA+IHN0cmN1dCBpbnRlbF9wYW5lbF9iYWNrbGln aHRfZnVuY3Mgewo+ID4gCj4gPiB9Owo+ID4gc3RydWN0IGludGVsX3BhbmVsIHsKPiA+IMKgwqDC oCBzdHJ1Y3Qgewo+ID4gwqDCoMKgwqDCoMKgwqAgc3RydWN0IGludGVsX3BhbmVsX2JhY2tsaWdo dF9mdW5jcyAqZnVuY3M7Cj4gPiDCoMKgwqAgfTsKPiA+IH07Cj4gPiAKPiA+IHR5cGUgb2YgdGhp bmcuCj4gPiAKPiA+IEkgdGhpbmsgeW91IGNvdWxkIHJldXNlIHRoZSBiYWNrbGlnaHQgZnVuY3Mg c3RydWN0IGZvciB0aGUgcHdtIHN0dWZmCj4gPiBhcyB3ZWxsLiAobWF5YmUgd2l0aCBhbiBhc3Nl cnQgb24gaHpfdG9fcHdtIGZvciB0aGUgb2xkIGhvb2tzKS4KPiA+IAo+ID4gMikgY2hhbmdlIHRo ZSBhcGlzIHRvIHBhc3MgMCBkb3duIGluIGEgc2VwYXJhdGUgcGF0Y2gsIHRoaXMgbW9kaWZpZXMg YQo+ID4gYnVuY2ggb2YgYXBpcyB0byBwYXNzIGluIGFuIGV4dHJhIGxldmVsIHBhcmFtZXRlciwg ZG8gdGhhdAo+ID4gZmlyc3QgaW4gYSBzZXBhcmF0ZSBwYXRjaCB0aGF0IGRvZXNuJ3QgY2hhbmdl IGFueXRoaW5nIGJ1dCBoYW5kcyAwCj4gPiBkb3duIHRoZSBjaGFpbi4gVGhlbiBzd2l0Y2ggb3Zl ciBpbiBhbm90aGVyIHBhdGNoLgo+ID4gCj4gPiAzKSBPbmUgY29tbWVudCBpbiBwYXNzaW5nIGJl bG93Lgo+ID4gPiAKPiA+ID4gCj4gPiA+IC3CoMKgwqDCoMKgwqAgaWYgKGNwdV9tb2RlKQo+ID4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWwgPSBwY2hfZ2V0X2JhY2tsaWdodChj b25uZWN0b3IpOwo+ID4gPiAtwqDCoMKgwqDCoMKgIGVsc2UKPiA+ID4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdmFsID0gbHB0X2dldF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKPiA+ID4g LcKgwqDCoMKgwqDCoCB2YWwgPSBpbnRlbF9wYW5lbF9jb21wdXRlX2JyaWdodG5lc3MoY29ubmVj dG9yLCB2YWwpOwo+ID4gPiAtwqDCoMKgwqDCoMKgIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBj bGFtcCh2YWwsIHBhbmVsLT5iYWNrbGlnaHQubWluLAo+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cGFuZWwtPmJhY2tsaWdodC5tYXgpOwo+ID4gPiAKPiA+ID4gwqDCoMKgwqDCoMKgwqAgaWYgKGNw dV9tb2RlKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZhbCA9IGludGVs X3BhbmVsX3Nhbml0aXplX3B3bV9sZXZlbChjb25uZWN0b3IsCj4gPiA+IHBjaF9nZXRfYmFja2xp Z2h0KGNvbm5lY3RvcikpOwo+ID4gPiArCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBkcm1fZGJnX2ttcygmZGV2X3ByaXYtPmRybSwKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJDUFUgYmFja2xpZ2h0IHJlZ2lz dGVyIHdhcyBlbmFibGVkLAo+ID4gPiBzd2l0Y2hpbmcgdG8gUENIIG92ZXJyaWRlXG4iKTsKPiA+ ID4gCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBXcml0ZSBjb252ZXJ0 ZWQgQ1BVIFBXTSB2YWx1ZSB0byBQQ0ggb3ZlcnJpZGUKPiA+ID4gcmVnaXN0ZXIgKi8KPiA+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHB0X3NldF9iYWNrbGlnaHQoY29ubmVjdG9y LT5iYXNlLnN0YXRlLCBwYW5lbC0KPiA+ID4gPmJhY2tsaWdodC5sZXZlbCk7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxwdF9zZXRfYmFja2xpZ2h0KGNvbm5lY3Rvci0+YmFz ZS5zdGF0ZSwgdmFsKTsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludGVs X2RlX3dyaXRlKGRldl9wcml2LCBCTENfUFdNX1BDSF9DVEwxLAo+ID4gPiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGNoX2N0bDEg fCBCTE1fUENIX09WRVJSSURFX0VOQUJMRSk7Cj4gPiA+IAo+ID4gVGhlIGNoYW5nZSBoZXJlIGNv bmZ1c2VkIG1lIHNpbmNlIGl0IG5vIGxvbmdlciBjYWxscyBscHRfZ2V0X2JhY2tsaWdodAo+ID4g aW4gdGhpcyBwYXRoLCB0aGUgY29tbWl0IG1zZyBtaWdodCBleHBsYWluIHRoaXMsIGJ1dCBpdCBk aWRuJ3QgZXhwbGFpbgo+ID4gaXMgc28gSSBjb3VsZCBmaWd1cmUgb3V0IGlmIHRoYXQgd2FzIGEg bWlzdGFrZSBvciBpbnRlbnRpb25hbC4KPiA+IAo+ID4gRGF2ZS4KPiA+IF9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gPiBJbnRlbC1nZnggbWFpbGluZyBs aXN0Cj4gPiBJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiBodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+IAoKLS0gCkNoZWVy cywKIEx5dWRlIFBhdWwgKHNoZS9oZXIpCiBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0Cgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwg bWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK 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=-3.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=no 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 3880BC64E90 for ; Tue, 1 Dec 2020 02:10:20 +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 AAE7E207FF for ; Tue, 1 Dec 2020 02:10:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="Jp8m3F69" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AAE7E207FF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 9744289E63; Tue, 1 Dec 2020 02:10:18 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0328789E63 for ; Tue, 1 Dec 2020 02:10:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1606788617; 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=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=Jp8m3F698uW2PCqArHVrV55tWWLx7MVaX5JR/aJdtN46jMJnNU2gnk9Jk0V2u/ocBMXG2H vxkIcfPeaY3d3Dy2O7ffQQuXr4udsoFX908KiF0dBR9FIR99yDLdfUyigX+jy7vxGGOV8i kAwRkdabhkVaG6adeClUgYbSIcAc1TQ= Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-594-0MttiDTuPV-rsPgci9NvBQ-1; Mon, 30 Nov 2020 21:10:09 -0500 X-MC-Unique: 0MttiDTuPV-rsPgci9NvBQ-1 Received: by mail-qv1-f70.google.com with SMTP id bn4so93025qvb.9 for ; Mon, 30 Nov 2020 18:10:08 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=XPYUombMnqQEmmxc+jyUTzWB2TL/8J8ymhI/NTRuPO0=; b=qt9o+WiM/d7AWFyysADWCXdK7oLy93cCeSHmUafpQNZI3W6FJPhzcTUOPY1tu4zE0T gf9LYEEoXMye5WKb3GDfwRR2LgCsLThH+lBKi2utniayT5tKJ+DE0TGxT8zETXiOdbud B4Y+qXa1L7pCCJoMEpDBZEfdGqw7UJZhqKjMhsCL2CRgq7ohOqR400fLiKvI0RWz79pg ZXy7rh7Rgc73LFenbvXEylm2CqFN3CAdz9ovXsi9Re7xkxbh9woIrbIBhjDkY+q4vt1B vkWRIicc84rVtRls8KdnglBjOUlzh2bFwhzclhkLscmiLq+gnWhquorcJnjfGl8EpEcF DtBQ== X-Gm-Message-State: AOAM531fqEnZYf6+5JEKZDYzn3pfWM3yrC0cISro4cOWVesXdqDfRxWc MHTSPMjcGd1XP+7Cvse2LtwUPHOymMXn3whkYEnKl0bcis+LeGjswZQUB48MQNv4zRVEGe+TA/L lCC44QsuyEqDf0rLGDkYLrVjFcSY8 X-Received: by 2002:ac8:548e:: with SMTP id h14mr523044qtq.326.1606788607517; Mon, 30 Nov 2020 18:10:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJydnmSM0Rc6kiEQxTp05Nu/josJ8rsxGS/zqzDwekiSnfNPQj14p4efdq7tNnm247maQH8toA== X-Received: by 2002:ac8:548e:: with SMTP id h14mr523017qtq.326.1606788607170; Mon, 30 Nov 2020 18:10:07 -0800 (PST) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j13sm484482qtc.81.2020.11.30.18.10.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Nov 2020 18:10:06 -0800 (PST) Message-ID: From: Lyude Paul To: Jani Nikula , Dave Airlie Date: Mon, 30 Nov 2020 21:10:05 -0500 In-Reply-To: <87o8jkl4a6.fsf@intel.com> References: <20200916171855.129511-1-lyude@redhat.com> <20200916171855.129511-4-lyude@redhat.com> <87o8jkl4a6.fsf@intel.com> Organization: Red Hat User-Agent: Evolution 3.38.1 (3.38.1-1.fc33) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Intel-gfx] [RFC v2 3/8] drm/i915: Keep track of pwm-related backlight hooks separately 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: David Airlie , Intel Graphics Development , Lucas De Marchi , open list , dri-devel , Chris Wilson , Vasily Khoruzhick , Sean Paul , Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gVGh1LCAyMDIwLTExLTI2IGF0IDEzOjU3ICswMjAwLCBKYW5pIE5pa3VsYSB3cm90ZToKPiBP biBUaHUsIDI2IE5vdiAyMDIwLCBEYXZlIEFpcmxpZSA8YWlybGllZEBnbWFpbC5jb20+IHdyb3Rl Ogo+ID4gT24gVGh1LCAxNyBTZXB0IDIwMjAgYXQgMDM6MTksIEx5dWRlIFBhdWwgPGx5dWRlQHJl ZGhhdC5jb20+IHdyb3RlOgo+ID4gPiAKPiA+ID4gQ3VycmVudGx5LCBldmVyeSBkaWZmZXJlbnQg dHlwZSBvZiBiYWNrbGlnaHQgaG9vayB0aGF0IGk5MTUgc3VwcG9ydHMgaXMKPiA+ID4gcHJldHR5 IHN0cmFpZ2h0IGZvcndhcmQgLSB5b3UgaGF2ZSBhIGJhY2tsaWdodCwgcHJvYmFibHkgdGhyb3Vn aCBQV00KPiA+ID4gKGJ1dCBtYXliZSBEUENEKSwgd2l0aCBhIHNpbmdsZSBzZXQgb2YgcGxhdGZv cm0tc3BlY2lmaWMgaG9va3MgdGhhdCBhcmUKPiA+ID4gdXNlZCBmb3IgY29udHJvbGxpbmcgaXQu Cj4gPiA+IAo+ID4gPiBIRFIgYmFja2xpZ2h0cywgaW4gcGFydGljdWxhciBWRVNBIGFuZCBJbnRl bCdzIEhEUiBiYWNrbGlnaHQKPiA+ID4gaW1wbGVtZW50YXRpb25zLCBjYW4gZW5kIHVwIGJlaW5n IG1vcmUgY29tcGxpY2F0ZWQuIFdpdGggSW50ZWwncwo+ID4gPiBwcm9wcmlldGFyeSBpbnRlcmZh Y2UsIEhEUiBiYWNrbGlnaHQgY29udHJvbHMgYWx3YXlzIHJ1biB0aHJvdWdoIHRoZQo+ID4gPiBE UENELiBXaGVuIHRoZSBiYWNrbGlnaHQgaXMgaW4gU0RSIGJhY2tsaWdodCBtb2RlIGhvd2V2ZXIs IHRoZSBkcml2ZXIKPiA+ID4gbWF5IG5lZWQgdG8gYnlwYXNzIHRoZSBUQ09OIGFuZCBjb250cm9s IHRoZSBiYWNrbGlnaHQgZGlyZWN0bHkgdGhyb3VnaAo+ID4gPiBQV00uCj4gPiA+IAo+ID4gPiBT bywgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzIHdlJ2xsIG5lZWQgdG8gc3BsaXQgb3VyIGJhY2ts aWdodCBjYWxsYmFja3MKPiA+ID4gaW50byB0d28gZ3JvdXBzOiBhIHNldCBvZiBoaWdoLWxldmVs IGJhY2tsaWdodCBjb250cm9sIGNhbGxiYWNrcyBpbgo+ID4gPiBpbnRlbF9wYW5lbCwgYW5kIGFu IGFkZGl0aW9uYWwgc2V0IG9mIHB3bS1zcGVjaWZpYyBiYWNrbGlnaHQgY29udHJvbAo+ID4gPiBj YWxsYmFja3MuIFRoaXMgYWxzbyBpbXBsaWVzIGEgZnVuY3Rpb25hbCBjaGFuZ2VzIGZvciBob3cg dGhlc2UKPiA+ID4gY2FsbGJhY2tzIGFyZSB1c2VkOgo+ID4gPiAKPiA+ID4gKiBXZSBub3cga2Vl cCB0cmFjayBvZiB0d28gc2VwYXJhdGUgYmFja2xpZ2h0IGxldmVsIHJhbmdlcywgb25lIGZvciB0 aGUKPiA+ID4gwqAgaGlnaC1sZXZlbCBiYWNrbGlnaHQsIGFuZCBvbmUgZm9yIHRoZSBwd20gYmFj a2xpZ2h0IHJhbmdlCj4gPiA+ICogV2UgYWxzbyBrZWVwIHRyYWNrIG9mIGJhY2tsaWdodCBlbmFi bGVtZW50IGFuZCBQV00gYmFja2xpZ2h0Cj4gPiA+IMKgIGVuYWJsZW1lbnQgc2VwYXJhdGVseQo+ ID4gPiAqIFNpbmNlIHRoZSBjdXJyZW50bHkgc2V0IGJhY2tsaWdodCBsZXZlbCBtaWdodCBub3Qg YmUgdGhlIHNhbWUgYXMgdGhlCj4gPiA+IMKgIGN1cnJlbnRseSBwcm9ncmFtbWVkIFBXTSBiYWNr bGlnaHQgbGV2ZWwsIHdlIHN0b3Agc2V0dGluZwo+ID4gPiDCoCBwYW5lbC0+YmFja2xpZ2h0Lmxl dmVsIHdpdGggdGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIFBXTSBiYWNrbGlnaHQKPiA+ID4gwqAg bGV2ZWwgaW4gcGFuZWwtPmJhY2tsaWdodC5wd21fZnVuY3Muc2V0dXAoKS4gSW5zdGVhZCwgd2Ug cmVseQo+ID4gPiDCoCBvbiB0aGUgaGlnaGVyIGxldmVsIGJhY2tsaWdodCBjb250cm9sIGZ1bmN0 aW9ucyB0byByZXRyaWV2ZSB0aGUKPiA+ID4gwqAgY3VycmVudCBQV00gYmFja2xpZ2h0IGxldmVs IChpbiB0aGlzIGNhc2UsIGludGVsX3B3bV9nZXRfYmFja2xpZ2h0KCkpLgo+ID4gPiDCoCBOb3Rl IHRoYXQgdGhlcmUgYXJlIHN0aWxsIGEgZmV3IFBXTSBiYWNrbGlnaHQgc2V0dXAgY2FsbGJhY2tz IHRoYXQKPiA+ID4gwqAgZG8gYWN0dWFsbHkgbmVlZCB0byByZXRyaWV2ZSB0aGUgY3VycmVudCBQ V00gYmFja2xpZ2h0IGxldmVsLCBhbHRob3VnaAo+ID4gPiDCoCB3ZSBubyBsb25nZXIgc2F2ZSB0 aGlzIHZhbHVlIGluIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgbGlrZSBiZWZvcmUuCj4gPiA+ICog cGFuZWwtPmJhY2tsaWdodC5wd21fZnVuY3MuZW5hYmxlKCkvZGlzYWJsZSgpIGJvdGggYWNjZXB0 IGEgUFdNCj4gPiA+IMKgIGJyaWdodG5lc3MgbGV2ZWwsIHVubGlrZSB0aGVpciBzaWJsaW5ncwo+ ID4gPiDCoCBwYW5lbC0+YmFja2xpZ2h0LmVuYWJsZSgpL2Rpc2FibGUoKS4gVGhpcyBpcyBzbyB3 ZSBjYW4gY2FsY3VsYXRlIHRoZQo+ID4gPiDCoCBhY3R1YWwgUFdNIGJyaWdodG5lc3MgbGV2ZWwg d2Ugd2FudCB0byBzZXQgb24gZGlzYWJsZS9lbmFibGUgaW4gdGhlCj4gPiA+IMKgIGhpZ2hlciBs ZXZlbCBiYWNrbGlnaHQgZW5hYmxlKCkvZGlzYWJsZSgpIGZ1bmN0aW9ucywgc2luY2UgdGhpcyB2 YWx1ZQo+ID4gPiDCoCBtaWdodCBiZSBzY2FsZWQgZnJvbSBhIGJyaWdodG5lc3MgbGV2ZWwgdGhh dCBkb2Vzbid0IGNvbWUgZnJvbSBQV00uCj4gPiAKPiA+IE9oIHRoaXMgcGF0Y2ggaXMgYSBoYW5k ZnVsLCBJIGNhbiBzZWUgd2h5IHBlb3BsZSBzdGFsbCBvdXQgaGVyZS4KPiA+IAo+ID4gSSdtIGdv aW5nIHRvIGJlIGFubm95aW5nIG1haW50YWluZXIgYW5kIHNlZSBpZiB5b3UgY2FuIGNsZWFuIHRo aXMgdXAgYQo+ID4gYml0IGluIGFkdmFuY2Ugb2YgdGhpcyBwYXRjaC4KPiAKPiBBZ3JlZWQuIEFu ZCBub3QgbG9va2luZyBpbnRvIGFuZCByZXF1ZXN0aW5nIHRoaXMgZWFybGllciBpcyBvbiBtZS4K PiAKPiBUaGUgdGhpbmcgdGhhdCBzdGlsbCBrZWVwcyBidWdnaW5nIG1lIGFib3V0IHRoZSBEUENE IGJyaWdodG5lc3MgY29udHJvbAo+IGluIGdlbmVyYWwgaXMgdGhhdCBpdCdzIGEgaGlzdG9yaWNh bCBtaXN0YWtlIHRvIHB1dCBhbGwgb2YgdGhpcyB1bmRlcgo+IGk5MTUuIChBZ2FpbiwgbWVhIGN1 bHBhLikgVGhlIHN0YW5kYXJkIERQQ0QgYnJpZ2h0bmVzcyBjb250cm9sIHNob3VsZAo+IHJlYWxs eSBiZSB1bmRlciBkcm0gY29yZSwgaW4gb25lIGZvcm0gb3IgYW5vdGhlci4KCkpGWUkgLSBJIGFs cmVhZHkgYWN0dWFsbHkgaGF2ZSBhIFdJUCBzZXJpZXMgdG8gbW92ZSBhbGwgb2YgdGhlIFZFU0Eg c3RhbmRhcmQKYnJpZ2h0bmVzcyBzdHVmZiBpbnRvIHRoZSBEUk0gY29yZSAoZXNwZWNpYWxseSBz aW5jZSBJIGFtIGFkZGluZyBzdXBwb3J0IGZvcgp0aGUgVkVTQSBpbnRlcmZhY2UgdG8gbm91dmVh dSkuIEl0IGlzIHByZXR0eSBpbXBvcnRhbnQgdG8gZG8gc28gZXNwZWNpYWxseQpjb25zaWRlcmlu ZyBzb21lIG9mIHRoZSB3YXlzIHBhbmVsIG1hbnVmYWN0dXJlcnMgc2VlbSB0byBoYXZlIGNvbnNp c3RlbnRseQpnb3R0ZW4gc29tZSBwb3J0aW9ucyBvZiB0aGUgc3BlYyB3cm9uZyAodGhlcmUncyBj dXJyZW50bHkgYSBidWcgb24gYWxtb3N0CmV2ZXJ5IHBhbmVsIEkndmUgcnVuIGludG8sIG1pbnVz IHNvbWUgcGFuZWxzIGluIGxhcHRvcHMgdGhhdCBydW4gQ2hyb21lT1MsCndoZXJlIHRoZXkgaW50 ZXJwcmV0IHRoZSBicmlnaHRuZXNzIHZhbHVlIGFzIExTQiBhbGlnbmVkIGFuZCBub3QgTVNCIGFs aWduZWQKKHdoaWNoIGlzIHdoYXQgdGhlIGVEUCBzcGVjIGFjdHVhbGx5IHNheXMpLCBiZWNhdXNl IGFsbW9zdCBldmVyeW9uZSBtaXNyZWFkCml0LiBTbywgZGVmaW5pdGVseSB0aGUga2luZCBvZiBz dHVmZiB3ZSdkIHdhbnQgdG8ga2VlcCBpbiB0aGUgZHJtIGNvcmUgdG8gbWFrZQptYWludGFpbmlu ZyBxdWlya3MgbGlrZSB0aGlzIGVhc2llci4KCj4gCj4gSSdtIG5vdCBhc2tpbmcgdG8gZml4IHRo YXQgaGVyZS4gQnV0IEkgKmFtKiB3b25kZXJpbmcgaWYgdGhlIHNlcmllcwo+IG1ha2VzIHRoYXQg aGFyZGVyLiBXaGF0IHdvdWxkIGl0IGxvb2sgbGlrZSBpZiB3ZSBkaWQgaGF2ZSB0aGF0IHVuaWNv cm4KPiBvZiBhIGJyaWdodG5lc3MgY29ubmVjdG9yIHByb3BlcnR5PyBIb3cgd291bGQgdGhhdCB0 aWUgaW50byB0aGUgaG9va3Mgd2UKPiBoYXZlPwoKUmU6IG1ha2luZyBpdCBoYXJkZXIsIG5vdCBy ZWFsbHkuIEJ1dCBlaXRoZXIgd2F5IEknbSBwbGFubmluZyBvbiBkb2luZyB0aGUKd29yayBmb3Ig dGhpcyBhbnl3YXkgOikKCj4gCj4gTWF5YmUgdGhlIGFuc3dlciBpcyB0aGF0IHRoZSBEUENEIGJh Y2tsaWdodCBmdW5jdGlvbnMgc2hvdWxkIGp1c3QgYmUKPiBsaWJyYXJ5IGNvZGUgaW4gZHJtIGNv cmUgdGhhdCB0aGUgZHJpdmVycyBjb3VsZCBjYWxsLiBJbiB0aGUgbG9uZyBydW4sCj4gaTkxNSBy ZWFsbHkgY2FuJ3QgYmUgdGhlIG9ubHkgb25lIG5lZWRpbmcgdGhpcyBzdHVmZi4KPiAKPiBXZSBo YXZlbid0IGltcGxlbWVudGVkIHRoZSBtaXhlZCBtb2RlcyBvZiBEUENEIGFuZCBlRFAgUFdNIHBp bgo+IGJyaWdodG5lc3MgY29udHJvbC4gQnV0IHRoZSBwb2ludCBpcywgdGhlIGxpYnJhcnkgY29k ZSBjYW4ndCBjYWxsIGludG8KPiBpOTE1IHNwZWNpZmljIGVEUCBQV00gcGluIGNvbnRyb2wgY29k ZS4gVGhlIHByb3ByaWV0YXJ5IEhEUiBicmlnaHRuZXNzCj4gY29kZSB3aWxsIHN0aWxsIGJlIGk5 MTUgc3BlY2lmaWMsIGJ1dCBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIG1peGVkCj4gbW9k ZSB0aGVyZSB0aGF0IHdpbGwgYmUgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IGEgbWl4 ZWQgbW9kZSB3aXRoCj4gdGhlIHN0YW5kYXJkIFZFU0EgRFBDRCBicmlnaHRuZXNzIGNvdWxkIGJl Pwo+IAo+IEkuZS4gd2hhdCBzaG91bGQgYmUgdGhlIGVudHJ5IHBvaW50cyBmb3IgdGhlIGhvb2tz LCBhbmQgd2hvIGNhbGxzIHdoYXQ/CgpJIHRoaW5rIGk5MTUgaXMgYWN0dWFsbHkgZXhhY3RseSB3 aGVyZSB3ZSB3YW50IHRoZSBob29rcyBmb3IgdGhpcyBwYXJ0aWN1bGFyCmJhY2tsaWdodCBpbnRl cmZhY2UsIG1vc3RseSBiZWNhdXNlIGFtZGdwdSBhbHJlYWR5IGhhZCB0byBpbXBsZW1lbnQgdGhl aXIgb3duCmJhY2tsaWdodCBjb250cm9sIGludGVyZmFjZSBmb3Igc2ltaWxhciByZWFzb25zIHRv IEludGVsLiBGcm9tIHdoYXQgSSd2ZSBzZWVuLAp0aGUgaW50ZXJmYWNlcyB3aGljaCBhIHBhbmVs IHN1cHBvcnRzIGJhY2tsaWdodCBjb250cm9sIHRocm91Z2ggdGVuZCB0byBiZQp0aWdodGx5IHRp ZWQgdG8gdGhlIGhhcmR3YXJlIHRob3NlIHBhbmVscyB1c3VhbGx5IGFjY29tcGFueSAoYXQgbGVh c3QgaW4gdGhlCng4NiB3b3JsZCwgbm8gaWRlYSBhYm91dCBlbHNld2hlcmUpLiBGb3IgZXhhbXBs ZSwgSSd2ZSBvbmx5IHNlZW4gbGFwdG9wcyB3aGljaApoYXZlIG5vIHN1cHBvcnQvYnJva2VuIHN1 cHBvcnQgZm9yIHRoZSBWRVNBIGJhY2tsaWdodCBpbnRlcmZhY2UsIGJ1dCBub3QKSW50ZWwncywg b24gaGFyZHdhcmUgd2hpY2ggb25seSBoYWQgYW4gSW50ZWwgR1BVIHByZXNlbnQuIEV2ZXJ5IHNp bmdsZSBsYXB0b3AKSSd2ZSB0ZXN0ZWQgd2l0aCBhIEludGVsL052aWRpYSBHUFUgc2V0dXAgKHdo ZXJlIHRoZSBOdmlkaWEgR1BVIGNvdWxkIGRyaXZlIHRoZQplRFAgZGlzcGxheSwgbm8gaWRlYSB3 aGF0IHRoZSBzaXR1YXRpb24gaXMgbGlrZSBlbHNld2hlcmUpIHNlZW1zIHRvIHN1cHBvcnQgYm90 aAppbnRlcmZhY2VzIHBlcmZlY3RseS4gU28sIEkgZG9uJ3QgdGhpbmsgd2UnbGwgZXZlciBzZWUg YW55IG5lZWQgZm9yIHRoaXMgb3V0c2lkZQpvZiBpOTE1IGF0IGxlYXN0LgoKQWxzbyBpbiBzcGVj aWZpYyByZWdhcmRzIHRvIHRoZSBwd20gY29udHJvbDogSSdtIGFjdHVhbGx5IHBsYW5uaW5nIG9u IGtlZXBpbmcKdGhhdCBvdXQgb2YgdGhlIERSTSBjb3JlIGxpYnJhcmllcywgYmVjYXVzZSBzb21l IHZhcmlhbnRzIG9mIHRoZSBWRVNBIGludGVyZmFjZQphY3R1YWxseSBuZWVkIHRvIGJlIGFibGUg dG8gY2FsbCBkb3duIHRvIFBXTSBkcml2ZXIgZnVuY3Rpb25zIGFzIHdlbGwuIFRodXMsIEkKdGhp bmsgdGhlIG9ubHkgd2F5IG9mIGNvbWluZyB1cCB3aXRoIGhlbHBlcnMgZm9yIHRoaXMgdGhhdCBt YWtlIHNlbnNlIGlzIHRvIG9ubHkKYWRkIGhlbHBlcnMgZm9yIHRoZSBEUENEIHJlbGF0ZWQgcG9y dGlvbnMgb2YgYmFja2xpZ2h0IGNvbnRyb2wgdGhhdCBhcmUgZ29pbmcgdG8KYXBwbHkgdG8gYWxs IGRyaXZlcnMuIFNvIGZhciB0aGUgb25seSBzcG90IHdoZXJlIHdlIGFzayB0aGUgZHJpdmVyIGZv ciBQV00KcmVsYXRlZCBpbmZvIGlzIGR1cmluZyBlRFAgYmFja2xpZ2h0IHByb2JpbmcsIHdoZXJl IHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlCnRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIGJhY2ts aWdodCBsZXZlbHMsIGJ1dCB0aGlzIGlzIGVudGlyZWx5IG9wdGlvbmFsIGZvciB0aGUKZHJpdmVy IHRvIHN1cHBvcnQgaXQuCgpKRllJLCBoZXJlJ3MgYSBXSVAgb2YgdGhhdDoKCmh0dHBzOi8vZ2l0 bGFiLmZyZWVkZXNrdG9wLm9yZy9seXVkZXNzL2xpbnV4Ly0vY29tbWl0L2E0YmJlMGQ1YWQ5ODBj MTJlYjc3NmU1OWExYmQ1MjJkNzRkMDkwMDYKCj4gCj4gQlIsCj4gSmFuaS4KPiAKPiA+IAo+ID4g MSkgbW92ZSB0aGUgY2FsbGJhY2tzIG91dCBvZiBzdHJ1Y3QgaW50ZWxfcGFuZWwuYmFja2xpZ2h0 IGludG8gYSBzZXBhcmF0ZQo+ID4gc3RydWN0Cj4gPiBhbmQgdXNlIGNvbnN0IHN0YXRpYyBvYmpl Y3QgdGFibGVzLCBoYXZpbmcgZm4gcHRycyBhbmQgZGF0YSBjby1sb2NhdGVkCj4gPiBpbiBhIHN0 cnVjdAo+ID4gaXNuJ3QgZ3JlYXQuCj4gPiAKPiA+IHN0cmN1dCBpbnRlbF9wYW5lbF9iYWNrbGln aHRfZnVuY3Mgewo+ID4gCj4gPiB9Owo+ID4gc3RydWN0IGludGVsX3BhbmVsIHsKPiA+IMKgwqDC oCBzdHJ1Y3Qgewo+ID4gwqDCoMKgwqDCoMKgwqAgc3RydWN0IGludGVsX3BhbmVsX2JhY2tsaWdo dF9mdW5jcyAqZnVuY3M7Cj4gPiDCoMKgwqAgfTsKPiA+IH07Cj4gPiAKPiA+IHR5cGUgb2YgdGhp bmcuCj4gPiAKPiA+IEkgdGhpbmsgeW91IGNvdWxkIHJldXNlIHRoZSBiYWNrbGlnaHQgZnVuY3Mg c3RydWN0IGZvciB0aGUgcHdtIHN0dWZmCj4gPiBhcyB3ZWxsLiAobWF5YmUgd2l0aCBhbiBhc3Nl cnQgb24gaHpfdG9fcHdtIGZvciB0aGUgb2xkIGhvb2tzKS4KPiA+IAo+ID4gMikgY2hhbmdlIHRo ZSBhcGlzIHRvIHBhc3MgMCBkb3duIGluIGEgc2VwYXJhdGUgcGF0Y2gsIHRoaXMgbW9kaWZpZXMg YQo+ID4gYnVuY2ggb2YgYXBpcyB0byBwYXNzIGluIGFuIGV4dHJhIGxldmVsIHBhcmFtZXRlciwg ZG8gdGhhdAo+ID4gZmlyc3QgaW4gYSBzZXBhcmF0ZSBwYXRjaCB0aGF0IGRvZXNuJ3QgY2hhbmdl IGFueXRoaW5nIGJ1dCBoYW5kcyAwCj4gPiBkb3duIHRoZSBjaGFpbi4gVGhlbiBzd2l0Y2ggb3Zl ciBpbiBhbm90aGVyIHBhdGNoLgo+ID4gCj4gPiAzKSBPbmUgY29tbWVudCBpbiBwYXNzaW5nIGJl bG93Lgo+ID4gPiAKPiA+ID4gCj4gPiA+IC3CoMKgwqDCoMKgwqAgaWYgKGNwdV9tb2RlKQo+ID4g PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2YWwgPSBwY2hfZ2V0X2JhY2tsaWdodChj b25uZWN0b3IpOwo+ID4gPiAtwqDCoMKgwqDCoMKgIGVsc2UKPiA+ID4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgdmFsID0gbHB0X2dldF9iYWNrbGlnaHQoY29ubmVjdG9yKTsKPiA+ID4g LcKgwqDCoMKgwqDCoCB2YWwgPSBpbnRlbF9wYW5lbF9jb21wdXRlX2JyaWdodG5lc3MoY29ubmVj dG9yLCB2YWwpOwo+ID4gPiAtwqDCoMKgwqDCoMKgIHBhbmVsLT5iYWNrbGlnaHQubGV2ZWwgPSBj bGFtcCh2YWwsIHBhbmVsLT5iYWNrbGlnaHQubWluLAo+ID4gPiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cGFuZWwtPmJhY2tsaWdodC5tYXgpOwo+ID4gPiAKPiA+ID4gwqDCoMKgwqDCoMKgwqAgaWYgKGNw dV9tb2RlKSB7Cj4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZhbCA9IGludGVs X3BhbmVsX3Nhbml0aXplX3B3bV9sZXZlbChjb25uZWN0b3IsCj4gPiA+IHBjaF9nZXRfYmFja2xp Z2h0KGNvbm5lY3RvcikpOwo+ID4gPiArCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBkcm1fZGJnX2ttcygmZGV2X3ByaXYtPmRybSwKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJDUFUgYmFja2xpZ2h0IHJlZ2lz dGVyIHdhcyBlbmFibGVkLAo+ID4gPiBzd2l0Y2hpbmcgdG8gUENIIG92ZXJyaWRlXG4iKTsKPiA+ ID4gCj4gPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBXcml0ZSBjb252ZXJ0 ZWQgQ1BVIFBXTSB2YWx1ZSB0byBQQ0ggb3ZlcnJpZGUKPiA+ID4gcmVnaXN0ZXIgKi8KPiA+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHB0X3NldF9iYWNrbGlnaHQoY29ubmVjdG9y LT5iYXNlLnN0YXRlLCBwYW5lbC0KPiA+ID4gPmJhY2tsaWdodC5sZXZlbCk7Cj4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxwdF9zZXRfYmFja2xpZ2h0KGNvbm5lY3Rvci0+YmFz ZS5zdGF0ZSwgdmFsKTsKPiA+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludGVs X2RlX3dyaXRlKGRldl9wcml2LCBCTENfUFdNX1BDSF9DVEwxLAo+ID4gPiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcGNoX2N0bDEg fCBCTE1fUENIX09WRVJSSURFX0VOQUJMRSk7Cj4gPiA+IAo+ID4gVGhlIGNoYW5nZSBoZXJlIGNv bmZ1c2VkIG1lIHNpbmNlIGl0IG5vIGxvbmdlciBjYWxscyBscHRfZ2V0X2JhY2tsaWdodAo+ID4g aW4gdGhpcyBwYXRoLCB0aGUgY29tbWl0IG1zZyBtaWdodCBleHBsYWluIHRoaXMsIGJ1dCBpdCBk aWRuJ3QgZXhwbGFpbgo+ID4gaXMgc28gSSBjb3VsZCBmaWd1cmUgb3V0IGlmIHRoYXQgd2FzIGEg bWlzdGFrZSBvciBpbnRlbnRpb25hbC4KPiA+IAo+ID4gRGF2ZS4KPiA+IF9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gPiBJbnRlbC1nZnggbWFpbGluZyBs aXN0Cj4gPiBJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiBodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo+IAoKLS0gCkNoZWVy cywKIEx5dWRlIFBhdWwgKHNoZS9oZXIpCiBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0Cgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZngg bWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK