From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753942AbeEOPXD (ORCPT ); Tue, 15 May 2018 11:23:03 -0400 Received: from lb1-smtp-cloud7.xs4all.net ([194.109.24.24]:58365 "EHLO lb1-smtp-cloud7.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752319AbeEOPXB (ORCPT ); Tue, 15 May 2018 11:23:01 -0400 Subject: Re: [PATCH v2 1/5] media: cec-notifier: Get notifier by device and connector name To: Neil Armstrong , airlied@linux.ie, hans.verkuil@cisco.com, lee.jones@linaro.org, olof@lixom.net, seanpaul@google.com Cc: sadolfsson@google.com, felixe@google.com, bleung@google.com, darekm@google.com, marcheu@chromium.org, fparent@baylibre.com, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org References: <1526395342-15481-1-git-send-email-narmstrong@baylibre.com> <1526395342-15481-2-git-send-email-narmstrong@baylibre.com> From: Hans Verkuil Message-ID: <309fa9b4-0c0b-25af-31a3-84fe5fc00743@xs4all.nl> Date: Tue, 15 May 2018 17:22:54 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <1526395342-15481-2-git-send-email-narmstrong@baylibre.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfPNjx/0/0WMbqV2ITBrCa4SvB7NHM0uiuZUwNYFSyMCyX4bTXaW4WKZUTlUaMhHcBCbhIVoO6nx+OJ9s5Ii3kpcuXi+mgh+2uQqN2nd5UWJFrHgiCemY +8b6d4NMG0/s1YpivU/t7hqYxkfAiNQO701UTM22QGwFx6tcn3tj4DF27TtbMnZipjXxolbPxFgd5dTA9luD4pkUn1wQdPyUaXjA5+vhV2T3GtPXwQp0sM68 FzmPMBhrziFn4N1BZShID4f9Xs0Op+9AUMpkYBvQm3Zf2ZAkfLxRp5XYnEqLXkxTZbKaIlsMKk4qeSUdYFCRCMvQIkkevjZEFbRKWM07AbUYNg8J1dNBpHve rF0g/TtFRTwlNEfT6wHvTlUcK/xwJqNKviP4ZT0Rs6rUenUPqUfaxSemku74olKXpmyZtY3yJMJREs3HzKKMjjtIokBXdK2+x+NKQHVcwGnP4zdgV9AKG6Mk AMYRgoRs8EqO3rSlN0aHR1BRX22oqRqoyqT/hWH1+nSR8GQvBld/2mW7XYek86dsIE0dlx1PnJHI9+uFIWVNDrKPRWBBxYzKwQhwHZijVMixC0kdJPv99uUO p5kjI+7NMD6ByN/BrzqlduhtJM1dlpDDgkQHkzeQXfVBk1BjKW14Hsgyj1kU7YSL3EAJfOoCwCrbiFSv/KAHgx2355yRt1xwTXKFX5/wa70+TJIyTGynQKxN fhqimyJxtmI= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/15/2018 04:42 PM, Neil Armstrong wrote: > In non device-tree world, we can need to get the notifier by the driver > name directly and eventually defer probe if not yet created. > > This patch adds a variant of the get function by using the device name > instead and will not create a notifier if not yet created. > > But the i915 driver exposes at least 2 HDMI connectors, this patch also > adds the possibility to add a connector name tied to the notifier device > to form a tuple and associate different CEC controllers for each HDMI > connectors. The patch looks good, but I'm curious about this paragraph above. Was this tested with devices with more than one HDMI output? Or only on laptops with a single physical HDMI output? If there are two or more outputs then I guess it is the HW designer that decides with output gets CEC support? Regards, Hans > > Signed-off-by: Neil Armstrong > --- > drivers/media/cec/cec-notifier.c | 11 ++++++++--- > include/media/cec-notifier.h | 27 ++++++++++++++++++++++++--- > 2 files changed, 32 insertions(+), 6 deletions(-) > > diff --git a/drivers/media/cec/cec-notifier.c b/drivers/media/cec/cec-notifier.c > index 16dffa0..dd2078b 100644 > --- a/drivers/media/cec/cec-notifier.c > +++ b/drivers/media/cec/cec-notifier.c > @@ -21,6 +21,7 @@ struct cec_notifier { > struct list_head head; > struct kref kref; > struct device *dev; > + const char *conn; > struct cec_adapter *cec_adap; > void (*callback)(struct cec_adapter *adap, u16 pa); > > @@ -30,13 +31,14 @@ struct cec_notifier { > static LIST_HEAD(cec_notifiers); > static DEFINE_MUTEX(cec_notifiers_lock); > > -struct cec_notifier *cec_notifier_get(struct device *dev) > +struct cec_notifier *cec_notifier_get_conn(struct device *dev, const char *conn) > { > struct cec_notifier *n; > > mutex_lock(&cec_notifiers_lock); > list_for_each_entry(n, &cec_notifiers, head) { > - if (n->dev == dev) { > + if (n->dev == dev && > + (!conn || !strcmp(n->conn, conn))) { > kref_get(&n->kref); > mutex_unlock(&cec_notifiers_lock); > return n; > @@ -46,6 +48,8 @@ struct cec_notifier *cec_notifier_get(struct device *dev) > if (!n) > goto unlock; > n->dev = dev; > + if (conn) > + n->conn = kstrdup(conn, GFP_KERNEL); > n->phys_addr = CEC_PHYS_ADDR_INVALID; > mutex_init(&n->lock); > kref_init(&n->kref); > @@ -54,7 +58,7 @@ struct cec_notifier *cec_notifier_get(struct device *dev) > mutex_unlock(&cec_notifiers_lock); > return n; > } > -EXPORT_SYMBOL_GPL(cec_notifier_get); > +EXPORT_SYMBOL_GPL(cec_notifier_get_conn); > > static void cec_notifier_release(struct kref *kref) > { > @@ -62,6 +66,7 @@ static void cec_notifier_release(struct kref *kref) > container_of(kref, struct cec_notifier, kref); > > list_del(&n->head); > + kfree(n->conn); > kfree(n); > } > > diff --git a/include/media/cec-notifier.h b/include/media/cec-notifier.h > index cf0add7..814eeef 100644 > --- a/include/media/cec-notifier.h > +++ b/include/media/cec-notifier.h > @@ -20,8 +20,10 @@ struct cec_notifier; > #if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER) > > /** > - * cec_notifier_get - find or create a new cec_notifier for the given device. > + * cec_notifier_get_conn - find or create a new cec_notifier for the given > + * device and connector tuple. > * @dev: device that sends the events. > + * @conn: the connector name from which the event occurs > * > * If a notifier for device @dev already exists, then increase the refcount > * and return that notifier. > @@ -31,7 +33,8 @@ struct cec_notifier; > * > * Return NULL if the memory could not be allocated. > */ > -struct cec_notifier *cec_notifier_get(struct device *dev); > +struct cec_notifier *cec_notifier_get_conn(struct device *dev, > + const char *conn); > > /** > * cec_notifier_put - decrease refcount and delete when the refcount reaches 0. > @@ -85,7 +88,8 @@ void cec_register_cec_notifier(struct cec_adapter *adap, > struct cec_notifier *notifier); > > #else > -static inline struct cec_notifier *cec_notifier_get(struct device *dev) > +static inline struct cec_notifier *cec_notifier_get_conn(struct device *dev, > + const char *conn) > { > /* A non-NULL pointer is expected on success */ > return (struct cec_notifier *)0xdeadfeed; > @@ -121,6 +125,23 @@ static inline void cec_register_cec_notifier(struct cec_adapter *adap, > #endif > > /** > + * cec_notifier_get - find or create a new cec_notifier for the given device. > + * @dev: device that sends the events. > + * > + * If a notifier for device @dev already exists, then increase the refcount > + * and return that notifier. > + * > + * If it doesn't exist, then allocate a new notifier struct and return a > + * pointer to that new struct. > + * > + * Return NULL if the memory could not be allocated. > + */ > +static inline struct cec_notifier *cec_notifier_get(struct device *dev) > +{ > + return cec_notifier_get_conn(dev, NULL); > +} > + > +/** > * cec_notifier_phys_addr_invalidate() - set the physical address to INVALID > * > * @n: the CEC notifier > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hans Verkuil Subject: Re: [PATCH v2 1/5] media: cec-notifier: Get notifier by device and connector name Date: Tue, 15 May 2018 17:22:54 +0200 Message-ID: <309fa9b4-0c0b-25af-31a3-84fe5fc00743@xs4all.nl> References: <1526395342-15481-1-git-send-email-narmstrong@baylibre.com> <1526395342-15481-2-git-send-email-narmstrong@baylibre.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1526395342-15481-2-git-send-email-narmstrong@baylibre.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Neil Armstrong , airlied@linux.ie, hans.verkuil@cisco.com, lee.jones@linaro.org, olof@lixom.net, seanpaul@google.com Cc: sadolfsson@google.com, intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, fparent@baylibre.com, felixe@google.com, bleung@google.com, darekm@google.com, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gMDUvMTUvMjAxOCAwNDo0MiBQTSwgTmVpbCBBcm1zdHJvbmcgd3JvdGU6Cj4gSW4gbm9uIGRl dmljZS10cmVlIHdvcmxkLCB3ZSBjYW4gbmVlZCB0byBnZXQgdGhlIG5vdGlmaWVyIGJ5IHRoZSBk cml2ZXIKPiBuYW1lIGRpcmVjdGx5IGFuZCBldmVudHVhbGx5IGRlZmVyIHByb2JlIGlmIG5vdCB5 ZXQgY3JlYXRlZC4KPiAKPiBUaGlzIHBhdGNoIGFkZHMgYSB2YXJpYW50IG9mIHRoZSBnZXQgZnVu Y3Rpb24gYnkgdXNpbmcgdGhlIGRldmljZSBuYW1lCj4gaW5zdGVhZCBhbmQgd2lsbCBub3QgY3Jl YXRlIGEgbm90aWZpZXIgaWYgbm90IHlldCBjcmVhdGVkLgo+IAo+IEJ1dCB0aGUgaTkxNSBkcml2 ZXIgZXhwb3NlcyBhdCBsZWFzdCAyIEhETUkgY29ubmVjdG9ycywgdGhpcyBwYXRjaCBhbHNvCj4g YWRkcyB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGEgY29ubmVjdG9yIG5hbWUgdGllZCB0byB0aGUg bm90aWZpZXIgZGV2aWNlCj4gdG8gZm9ybSBhIHR1cGxlIGFuZCBhc3NvY2lhdGUgZGlmZmVyZW50 IENFQyBjb250cm9sbGVycyBmb3IgZWFjaCBIRE1JCj4gY29ubmVjdG9ycy4KClRoZSBwYXRjaCBs b29rcyBnb29kLCBidXQgSSdtIGN1cmlvdXMgYWJvdXQgdGhpcyBwYXJhZ3JhcGggYWJvdmUuCgpX YXMgdGhpcyB0ZXN0ZWQgd2l0aCBkZXZpY2VzIHdpdGggbW9yZSB0aGFuIG9uZSBIRE1JIG91dHB1 dD8gT3Igb25seSBvbgpsYXB0b3BzIHdpdGggYSBzaW5nbGUgcGh5c2ljYWwgSERNSSBvdXRwdXQ/ IElmIHRoZXJlIGFyZSB0d28gb3IgbW9yZQpvdXRwdXRzIHRoZW4gSSBndWVzcyBpdCBpcyB0aGUg SFcgZGVzaWduZXIgdGhhdCBkZWNpZGVzIHdpdGggb3V0cHV0IGdldHMKQ0VDIHN1cHBvcnQ/CgpS ZWdhcmRzLAoKCUhhbnMKCj4gCj4gU2lnbmVkLW9mZi1ieTogTmVpbCBBcm1zdHJvbmcgPG5hcm1z dHJvbmdAYmF5bGlicmUuY29tPgo+IC0tLQo+ICBkcml2ZXJzL21lZGlhL2NlYy9jZWMtbm90aWZp ZXIuYyB8IDExICsrKysrKysrLS0tCj4gIGluY2x1ZGUvbWVkaWEvY2VjLW5vdGlmaWVyLmggICAg IHwgMjcgKysrKysrKysrKysrKysrKysrKysrKysrLS0tCj4gIDIgZmlsZXMgY2hhbmdlZCwgMzIg aW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9t ZWRpYS9jZWMvY2VjLW5vdGlmaWVyLmMgYi9kcml2ZXJzL21lZGlhL2NlYy9jZWMtbm90aWZpZXIu Ywo+IGluZGV4IDE2ZGZmYTAuLmRkMjA3OGIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9tZWRpYS9j ZWMvY2VjLW5vdGlmaWVyLmMKPiArKysgYi9kcml2ZXJzL21lZGlhL2NlYy9jZWMtbm90aWZpZXIu Ywo+IEBAIC0yMSw2ICsyMSw3IEBAIHN0cnVjdCBjZWNfbm90aWZpZXIgewo+ICAJc3RydWN0IGxp c3RfaGVhZCBoZWFkOwo+ICAJc3RydWN0IGtyZWYga3JlZjsKPiAgCXN0cnVjdCBkZXZpY2UgKmRl djsKPiArCWNvbnN0IGNoYXIgKmNvbm47Cj4gIAlzdHJ1Y3QgY2VjX2FkYXB0ZXIgKmNlY19hZGFw Owo+ICAJdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgY2VjX2FkYXB0ZXIgKmFkYXAsIHUxNiBwYSk7 Cj4gIAo+IEBAIC0zMCwxMyArMzEsMTQgQEAgc3RydWN0IGNlY19ub3RpZmllciB7Cj4gIHN0YXRp YyBMSVNUX0hFQUQoY2VjX25vdGlmaWVycyk7Cj4gIHN0YXRpYyBERUZJTkVfTVVURVgoY2VjX25v dGlmaWVyc19sb2NrKTsKPiAgCj4gLXN0cnVjdCBjZWNfbm90aWZpZXIgKmNlY19ub3RpZmllcl9n ZXQoc3RydWN0IGRldmljZSAqZGV2KQo+ICtzdHJ1Y3QgY2VjX25vdGlmaWVyICpjZWNfbm90aWZp ZXJfZ2V0X2Nvbm4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpjb25uKQo+ICB7Cj4g IAlzdHJ1Y3QgY2VjX25vdGlmaWVyICpuOwo+ICAKPiAgCW11dGV4X2xvY2soJmNlY19ub3RpZmll cnNfbG9jayk7Cj4gIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG4sICZjZWNfbm90aWZpZXJzLCBoZWFk KSB7Cj4gLQkJaWYgKG4tPmRldiA9PSBkZXYpIHsKPiArCQlpZiAobi0+ZGV2ID09IGRldiAmJgo+ ICsJCSAgICAoIWNvbm4gfHwgIXN0cmNtcChuLT5jb25uLCBjb25uKSkpIHsKPiAgCQkJa3JlZl9n ZXQoJm4tPmtyZWYpOwo+ICAJCQltdXRleF91bmxvY2soJmNlY19ub3RpZmllcnNfbG9jayk7Cj4g IAkJCXJldHVybiBuOwo+IEBAIC00Niw2ICs0OCw4IEBAIHN0cnVjdCBjZWNfbm90aWZpZXIgKmNl Y19ub3RpZmllcl9nZXQoc3RydWN0IGRldmljZSAqZGV2KQo+ICAJaWYgKCFuKQo+ICAJCWdvdG8g dW5sb2NrOwo+ICAJbi0+ZGV2ID0gZGV2Owo+ICsJaWYgKGNvbm4pCj4gKwkJbi0+Y29ubiA9IGtz dHJkdXAoY29ubiwgR0ZQX0tFUk5FTCk7Cj4gIAluLT5waHlzX2FkZHIgPSBDRUNfUEhZU19BRERS X0lOVkFMSUQ7Cj4gIAltdXRleF9pbml0KCZuLT5sb2NrKTsKPiAgCWtyZWZfaW5pdCgmbi0+a3Jl Zik7Cj4gQEAgLTU0LDcgKzU4LDcgQEAgc3RydWN0IGNlY19ub3RpZmllciAqY2VjX25vdGlmaWVy X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIAltdXRleF91bmxvY2soJmNlY19ub3RpZmllcnNf bG9jayk7Cj4gIAlyZXR1cm4gbjsKPiAgfQo+IC1FWFBPUlRfU1lNQk9MX0dQTChjZWNfbm90aWZp ZXJfZ2V0KTsKPiArRVhQT1JUX1NZTUJPTF9HUEwoY2VjX25vdGlmaWVyX2dldF9jb25uKTsKPiAg Cj4gIHN0YXRpYyB2b2lkIGNlY19ub3RpZmllcl9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQo+ ICB7Cj4gQEAgLTYyLDYgKzY2LDcgQEAgc3RhdGljIHZvaWQgY2VjX25vdGlmaWVyX3JlbGVhc2Uo c3RydWN0IGtyZWYgKmtyZWYpCj4gIAkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBjZWNfbm90 aWZpZXIsIGtyZWYpOwo+ICAKPiAgCWxpc3RfZGVsKCZuLT5oZWFkKTsKPiArCWtmcmVlKG4tPmNv bm4pOwo+ICAJa2ZyZWUobik7Cj4gIH0KPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEv Y2VjLW5vdGlmaWVyLmggYi9pbmNsdWRlL21lZGlhL2NlYy1ub3RpZmllci5oCj4gaW5kZXggY2Yw YWRkNy4uODE0ZWVlZiAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL21lZGlhL2NlYy1ub3RpZmllci5o Cj4gKysrIGIvaW5jbHVkZS9tZWRpYS9jZWMtbm90aWZpZXIuaAo+IEBAIC0yMCw4ICsyMCwxMCBA QCBzdHJ1Y3QgY2VjX25vdGlmaWVyOwo+ICAjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19DRUNfQ09S RSkgJiYgSVNfRU5BQkxFRChDT05GSUdfQ0VDX05PVElGSUVSKQo+ICAKPiAgLyoqCj4gLSAqIGNl Y19ub3RpZmllcl9nZXQgLSBmaW5kIG9yIGNyZWF0ZSBhIG5ldyBjZWNfbm90aWZpZXIgZm9yIHRo ZSBnaXZlbiBkZXZpY2UuCj4gKyAqIGNlY19ub3RpZmllcl9nZXRfY29ubiAtIGZpbmQgb3IgY3Jl YXRlIGEgbmV3IGNlY19ub3RpZmllciBmb3IgdGhlIGdpdmVuCj4gKyAqIGRldmljZSBhbmQgY29u bmVjdG9yIHR1cGxlLgo+ICAgKiBAZGV2OiBkZXZpY2UgdGhhdCBzZW5kcyB0aGUgZXZlbnRzLgo+ ICsgKiBAY29ubjogdGhlIGNvbm5lY3RvciBuYW1lIGZyb20gd2hpY2ggdGhlIGV2ZW50IG9jY3Vy cwo+ICAgKgo+ICAgKiBJZiBhIG5vdGlmaWVyIGZvciBkZXZpY2UgQGRldiBhbHJlYWR5IGV4aXN0 cywgdGhlbiBpbmNyZWFzZSB0aGUgcmVmY291bnQKPiAgICogYW5kIHJldHVybiB0aGF0IG5vdGlm aWVyLgo+IEBAIC0zMSw3ICszMyw4IEBAIHN0cnVjdCBjZWNfbm90aWZpZXI7Cj4gICAqCj4gICAq IFJldHVybiBOVUxMIGlmIHRoZSBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4KPiAgICov Cj4gLXN0cnVjdCBjZWNfbm90aWZpZXIgKmNlY19ub3RpZmllcl9nZXQoc3RydWN0IGRldmljZSAq ZGV2KTsKPiArc3RydWN0IGNlY19ub3RpZmllciAqY2VjX25vdGlmaWVyX2dldF9jb25uKHN0cnVj dCBkZXZpY2UgKmRldiwKPiArCQkJCQkgICBjb25zdCBjaGFyICpjb25uKTsKPiAgCj4gIC8qKgo+ ICAgKiBjZWNfbm90aWZpZXJfcHV0IC0gZGVjcmVhc2UgcmVmY291bnQgYW5kIGRlbGV0ZSB3aGVu IHRoZSByZWZjb3VudCByZWFjaGVzIDAuCj4gQEAgLTg1LDcgKzg4LDggQEAgdm9pZCBjZWNfcmVn aXN0ZXJfY2VjX25vdGlmaWVyKHN0cnVjdCBjZWNfYWRhcHRlciAqYWRhcCwKPiAgCQkJICAgICAg IHN0cnVjdCBjZWNfbm90aWZpZXIgKm5vdGlmaWVyKTsKPiAgCj4gICNlbHNlCj4gLXN0YXRpYyBp bmxpbmUgc3RydWN0IGNlY19ub3RpZmllciAqY2VjX25vdGlmaWVyX2dldChzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNlY19ub3RpZmllciAqY2VjX25vdGlmaWVy X2dldF9jb25uKHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCQkJCSBjb25zdCBjaGFyICpjb25u KQo+ICB7Cj4gIAkvKiBBIG5vbi1OVUxMIHBvaW50ZXIgaXMgZXhwZWN0ZWQgb24gc3VjY2VzcyAq Lwo+ICAJcmV0dXJuIChzdHJ1Y3QgY2VjX25vdGlmaWVyICopMHhkZWFkZmVlZDsKPiBAQCAtMTIx LDYgKzEyNSwyMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgY2VjX3JlZ2lzdGVyX2NlY19ub3RpZmll cihzdHJ1Y3QgY2VjX2FkYXB0ZXIgKmFkYXAsCj4gICNlbmRpZgo+ICAKPiAgLyoqCj4gKyAqIGNl Y19ub3RpZmllcl9nZXQgLSBmaW5kIG9yIGNyZWF0ZSBhIG5ldyBjZWNfbm90aWZpZXIgZm9yIHRo ZSBnaXZlbiBkZXZpY2UuCj4gKyAqIEBkZXY6IGRldmljZSB0aGF0IHNlbmRzIHRoZSBldmVudHMu Cj4gKyAqCj4gKyAqIElmIGEgbm90aWZpZXIgZm9yIGRldmljZSBAZGV2IGFscmVhZHkgZXhpc3Rz LCB0aGVuIGluY3JlYXNlIHRoZSByZWZjb3VudAo+ICsgKiBhbmQgcmV0dXJuIHRoYXQgbm90aWZp ZXIuCj4gKyAqCj4gKyAqIElmIGl0IGRvZXNuJ3QgZXhpc3QsIHRoZW4gYWxsb2NhdGUgYSBuZXcg bm90aWZpZXIgc3RydWN0IGFuZCByZXR1cm4gYQo+ICsgKiBwb2ludGVyIHRvIHRoYXQgbmV3IHN0 cnVjdC4KPiArICoKPiArICogUmV0dXJuIE5VTEwgaWYgdGhlIG1lbW9yeSBjb3VsZCBub3QgYmUg YWxsb2NhdGVkLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSBzdHJ1Y3QgY2VjX25vdGlmaWVyICpj ZWNfbm90aWZpZXJfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJcmV0dXJuIGNlY19u b3RpZmllcl9nZXRfY29ubihkZXYsIE5VTEwpOwo+ICt9Cj4gKwo+ICsvKioKPiAgICogY2VjX25v dGlmaWVyX3BoeXNfYWRkcl9pbnZhbGlkYXRlKCkgLSBzZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mg dG8gSU5WQUxJRAo+ICAgKgo+ICAgKiBAbjogdGhlIENFQyBub3RpZmllcgo+IAoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcg bGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRl c2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==