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=-5.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE, SPF_PASS,USER_AGENT_SANE_1 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 471A5C19437 for ; Tue, 8 Dec 2020 13:16:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0EEF223AAC for ; Tue, 8 Dec 2020 13:16:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728698AbgLHNQD (ORCPT ); Tue, 8 Dec 2020 08:16:03 -0500 Received: from foss.arm.com ([217.140.110.172]:48696 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727135AbgLHNQD (ORCPT ); Tue, 8 Dec 2020 08:16:03 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7181B30E; Tue, 8 Dec 2020 05:15:17 -0800 (PST) Received: from [10.57.61.26] (unknown [10.57.61.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 295BB3F718; Tue, 8 Dec 2020 05:15:15 -0800 (PST) Subject: Re: [PATCH v4 3/4] scmi-cpufreq: get opp_shared_cpus from opp-v2 for EM To: Sudeep Holla , Lukasz Luba , Viresh Kumar Cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, rjw@rjwysocki.net, vireshk@kernel.org, robh+dt@kernel.org, sboyd@kernel.org, nm@ti.com, daniel.lezcano@linaro.org, morten.rasmussen@arm.com, chris.redpath@arm.com References: <20201202172356.10508-1-nicola.mazzucato@arm.com> <20201202172356.10508-4-nicola.mazzucato@arm.com> <20201208055053.kggxw26kxtnpneua@vireshk-i7> <0e4d3134-f9b2-31fa-b454-fb30265a80b5@arm.com> <20201208072611.ptsqupv4y2wybs6p@vireshk-i7> <20201208112008.niesjrunxq2jz3kt@bogus> <1f9daaf8-e850-7c1b-7a32-71367982beaf@arm.com> <20201208122222.bp3o6y3xsxo642wd@bogus> From: Nicola Mazzucato Message-ID: <508c46a8-bf5a-bf29-a1df-c9a96b3de5f6@arm.com> Date: Tue, 8 Dec 2020 13:17:19 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <20201208122222.bp3o6y3xsxo642wd@bogus> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi All, thanks for your feedback, please see below On 12/8/20 12:22 PM, Sudeep Holla wrote: > On Tue, Dec 08, 2020 at 11:34:36AM +0000, Lukasz Luba wrote: >> >> >> On 12/8/20 11:20 AM, Sudeep Holla wrote: >>> On Tue, Dec 08, 2020 at 12:56:11PM +0530, Viresh Kumar wrote: >>>> On 08-12-20, 07:22, Nicola Mazzucato wrote: >>>>> On 12/8/20 5:50 AM, Viresh Kumar wrote: >>>>>> On 02-12-20, 17:23, Nicola Mazzucato wrote: >>>>>>> nr_opp = dev_pm_opp_get_opp_count(cpu_dev); >>>>>>> if (nr_opp <= 0) { >>>>>>> - dev_dbg(cpu_dev, "OPP table is not ready, deferring probe\n"); >>>>>>> - ret = -EPROBE_DEFER; >>>>>>> - goto out_free_opp; >>>>>>> + ret = handle->perf_ops->device_opps_add(handle, cpu_dev); >>>>>>> + if (ret) { >>>>>>> + dev_warn(cpu_dev, "failed to add opps to the device\n"); >>>>>>> + goto out_free_cpumask; >>>>>>> + } >>>>>>> + >>>>>>> + ret = dev_pm_opp_set_sharing_cpus(cpu_dev, opp_shared_cpus); >>>>>>> + if (ret) { >>>>>>> + dev_err(cpu_dev, "%s: failed to mark OPPs as shared: %d\n", >>>>>>> + __func__, ret); >>>>>>> + goto out_free_cpumask; >>>>>>> + } >>>>>>> + >>>>>> >>>>>> Why do we need to call above two after calling >>>>>> dev_pm_opp_get_opp_count() ? >>>>> >>>>> Sorry, I am not sure to understand your question here. If there are no opps for >>>>> a device we want to add them to it >>>> >>>> Earlier we used to call handle->perf_ops->device_opps_add() and >>>> dev_pm_opp_set_sharing_cpus() before calling dev_pm_opp_get_opp_count(), why is >>>> the order changed now ? >>>> >>>> >>>> I am not sure why they would be duplicated in your case. I though >>>> device_opps_add() is responsible for dynamically adding the OPPs here. >>>> >>> >>> It is because of per-CPU vs per domain drama here. Imagine a system with >>> 4 CPUs which the firmware puts in individual domains while they all are >>> in the same perf domain and hence OPP is marked shared in DT. >>> >>> Since this probe gets called for all the cpus, we need to skip adding >>> OPPs for the last 3(add only for 1st one and mark others as shared). >>> If we attempt to add OPPs on second cpu probe, it *will* shout as duplicate >>> OPP as we would have already marked it as shared table with the first cpu. >>> Am I missing anything ? I suggested this as Nicola saw OPP duplicate >>> warnings when he was hacking up this patch. >>> >>>>> otherwise no need as they would be duplicated. >>>>>> And we don't check the return value of >>>>>> the below call anymore, moreover we have to call it twice now. >>> >>> Yes, that looks wrong, we need to add the check for non zero values, but .... will add the check, thanks >>> >>>>> >>>>> This second get_opp_count is required such that we register em with the correct >>>>> opp number after having added them. Without this the opp_count would not be correct. >>>> >>> >>> ... I have a question here. Why do you need to call >>> >>> em_dev_register_perf_domain(cpu_dev, nr_opp, &em_cb, opp_shared_cpus..) >>> >>> on each CPU ? Why can't that be done once for unique opp_shared_cpus ? I left it untouched to reduce changes, but I see your point. >> >> It just have to be called once, for one CPU from the mask. Otherwise for >> the next CPUs you should see error: >> "EM: exists for CPU%d" > > OK cool, at least it is designed and expected to be used like I thought. > Ah, I might have seen those, but never thought it was error message 😄 > >> It can happen that this print is not seen when the get_cpu_device(cpu) >> failed, but that would lead to investigation why CPU devices are not >> there yet. >> >> Nicola: have you seen that print? >> > > I assume you must see that and you need to pull this inside if condition > to do this once for each performance domain. I don't see that error, and that's also why I left it there. If there's already and em_pd for a device, EM just returns with an error that we don't check. I agree that it makes more sense to register em for opp_shared_cpus. > > -- > Regards, > Sudeep > 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=-5.3 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 10342C433FE for ; Tue, 8 Dec 2020 13:16:39 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 B716923AA7 for ; Tue, 8 Dec 2020 13:16:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B716923AA7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=SJNzWbvoGv+de7bYU6yit0cBxzWR9aEUSIIhjTN3Dwo=; b=z2jxEfQo8eNZ9u8HxKIgCkzcE 9XRwruK0qkkOGmu36mECDu8amQw3tsMlNVOTH9Upu3wpOD26xV6io3YveLJ/DysjWlUifDsJ5iZVn 6tq8W5kzJs/wrJF9XTlJMplT/6HD/s+4Lg/cOia4FpcqYME9L+eZTELRZ0x3wM0JUTtrYiSBYYKWg RYZkqWQ56HSS3JKE/r8hHJKRSrFlfy5wTsVE3sD/6F9gUqyngOsxPDVsP7m/M89oFgTJTPB+whIQw fIC3sSFsRqUvvd6qI/mcmMXJL16tnjHhf8G6Oui/DPvhnJF90fw+TZRs9lzaSIzXLbWUKFx4Ad5II XkMKnMx2A==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kmcpx-0001iT-UH; Tue, 08 Dec 2020 13:15:25 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kmcpv-0001hz-Uy for linux-arm-kernel@lists.infradead.org; Tue, 08 Dec 2020 13:15:24 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 7181B30E; Tue, 8 Dec 2020 05:15:17 -0800 (PST) Received: from [10.57.61.26] (unknown [10.57.61.26]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 295BB3F718; Tue, 8 Dec 2020 05:15:15 -0800 (PST) Subject: Re: [PATCH v4 3/4] scmi-cpufreq: get opp_shared_cpus from opp-v2 for EM To: Sudeep Holla , Lukasz Luba , Viresh Kumar References: <20201202172356.10508-1-nicola.mazzucato@arm.com> <20201202172356.10508-4-nicola.mazzucato@arm.com> <20201208055053.kggxw26kxtnpneua@vireshk-i7> <0e4d3134-f9b2-31fa-b454-fb30265a80b5@arm.com> <20201208072611.ptsqupv4y2wybs6p@vireshk-i7> <20201208112008.niesjrunxq2jz3kt@bogus> <1f9daaf8-e850-7c1b-7a32-71367982beaf@arm.com> <20201208122222.bp3o6y3xsxo642wd@bogus> From: Nicola Mazzucato Message-ID: <508c46a8-bf5a-bf29-a1df-c9a96b3de5f6@arm.com> Date: Tue, 8 Dec 2020 13:17:19 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: <20201208122222.bp3o6y3xsxo642wd@bogus> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201208_081524_150800_4BDF961B X-CRM114-Status: GOOD ( 26.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: nm@ti.com, devicetree@vger.kernel.org, linux-pm@vger.kernel.org, sboyd@kernel.org, vireshk@kernel.org, daniel.lezcano@linaro.org, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, robh+dt@kernel.org, chris.redpath@arm.com, morten.rasmussen@arm.com, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgQWxsLCB0aGFua3MgZm9yIHlvdXIgZmVlZGJhY2ssIHBsZWFzZSBzZWUgYmVsb3cKCk9uIDEy LzgvMjAgMTI6MjIgUE0sIFN1ZGVlcCBIb2xsYSB3cm90ZToKPiBPbiBUdWUsIERlYyAwOCwgMjAy MCBhdCAxMTozNDozNkFNICswMDAwLCBMdWthc3ogTHViYSB3cm90ZToKPj4KPj4KPj4gT24gMTIv OC8yMCAxMToyMCBBTSwgU3VkZWVwIEhvbGxhIHdyb3RlOgo+Pj4gT24gVHVlLCBEZWMgMDgsIDIw MjAgYXQgMTI6NTY6MTFQTSArMDUzMCwgVmlyZXNoIEt1bWFyIHdyb3RlOgo+Pj4+IE9uIDA4LTEy LTIwLCAwNzoyMiwgTmljb2xhIE1henp1Y2F0byB3cm90ZToKPj4+Pj4gT24gMTIvOC8yMCA1OjUw IEFNLCBWaXJlc2ggS3VtYXIgd3JvdGU6Cj4+Pj4+PiBPbiAwMi0xMi0yMCwgMTc6MjMsIE5pY29s YSBNYXp6dWNhdG8gd3JvdGU6Cj4+Pj4+Pj4gICAJbnJfb3BwID0gZGV2X3BtX29wcF9nZXRfb3Bw X2NvdW50KGNwdV9kZXYpOwo+Pj4+Pj4+ICAgCWlmIChucl9vcHAgPD0gMCkgewo+Pj4+Pj4+IC0J CWRldl9kYmcoY3B1X2RldiwgIk9QUCB0YWJsZSBpcyBub3QgcmVhZHksIGRlZmVycmluZyBwcm9i ZVxuIik7Cj4+Pj4+Pj4gLQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKPj4+Pj4+PiAtCQlnb3RvIG91 dF9mcmVlX29wcDsKPj4+Pj4+PiArCQlyZXQgPSBoYW5kbGUtPnBlcmZfb3BzLT5kZXZpY2Vfb3Bw c19hZGQoaGFuZGxlLCBjcHVfZGV2KTsKPj4+Pj4+PiArCQlpZiAocmV0KSB7Cj4+Pj4+Pj4gKwkJ CWRldl93YXJuKGNwdV9kZXYsICJmYWlsZWQgdG8gYWRkIG9wcHMgdG8gdGhlIGRldmljZVxuIik7 Cj4+Pj4+Pj4gKwkJCWdvdG8gb3V0X2ZyZWVfY3B1bWFzazsKPj4+Pj4+PiArCQl9Cj4+Pj4+Pj4g Kwo+Pj4+Pj4+ICsJCXJldCA9IGRldl9wbV9vcHBfc2V0X3NoYXJpbmdfY3B1cyhjcHVfZGV2LCBv cHBfc2hhcmVkX2NwdXMpOwo+Pj4+Pj4+ICsJCWlmIChyZXQpIHsKPj4+Pj4+PiArCQkJZGV2X2Vy cihjcHVfZGV2LCAiJXM6IGZhaWxlZCB0byBtYXJrIE9QUHMgYXMgc2hhcmVkOiAlZFxuIiwKPj4+ Pj4+PiArCQkJCV9fZnVuY19fLCByZXQpOwo+Pj4+Pj4+ICsJCQlnb3RvIG91dF9mcmVlX2NwdW1h c2s7Cj4+Pj4+Pj4gKwkJfQo+Pj4+Pj4+ICsKPj4+Pj4+Cj4+Pj4+PiBXaHkgZG8gd2UgbmVlZCB0 byBjYWxsIGFib3ZlIHR3byBhZnRlciBjYWxsaW5nCj4+Pj4+PiBkZXZfcG1fb3BwX2dldF9vcHBf Y291bnQoKSA/Cj4+Pj4+Cj4+Pj4+IFNvcnJ5LCBJIGFtIG5vdCBzdXJlIHRvIHVuZGVyc3RhbmQg eW91ciBxdWVzdGlvbiBoZXJlLiBJZiB0aGVyZSBhcmUgbm8gb3BwcyBmb3IKPj4+Pj4gYSBkZXZp Y2Ugd2Ugd2FudCB0byBhZGQgdGhlbSB0byBpdAo+Pj4+Cj4+Pj4gRWFybGllciB3ZSB1c2VkIHRv IGNhbGwgaGFuZGxlLT5wZXJmX29wcy0+ZGV2aWNlX29wcHNfYWRkKCkgYW5kCj4+Pj4gZGV2X3Bt X29wcF9zZXRfc2hhcmluZ19jcHVzKCkgYmVmb3JlIGNhbGxpbmcgZGV2X3BtX29wcF9nZXRfb3Bw X2NvdW50KCksIHdoeSBpcwo+Pj4+IHRoZSBvcmRlciBjaGFuZ2VkIG5vdyA/Cj4+Pj4KPj4+Pgo+ Pj4+IEkgYW0gbm90IHN1cmUgd2h5IHRoZXkgd291bGQgYmUgZHVwbGljYXRlZCBpbiB5b3VyIGNh c2UuIEkgdGhvdWdoCj4+Pj4gZGV2aWNlX29wcHNfYWRkKCkgaXMgcmVzcG9uc2libGUgZm9yIGR5 bmFtaWNhbGx5IGFkZGluZyB0aGUgT1BQcyBoZXJlLgo+Pj4+Cj4+Pgo+Pj4gSXQgaXMgYmVjYXVz ZSBvZiBwZXItQ1BVIHZzIHBlciBkb21haW4gZHJhbWEgaGVyZS4gSW1hZ2luZSBhIHN5c3RlbSB3 aXRoCj4+PiA0IENQVXMgd2hpY2ggdGhlIGZpcm13YXJlIHB1dHMgaW4gaW5kaXZpZHVhbCBkb21h aW5zIHdoaWxlIHRoZXkgYWxsIGFyZQo+Pj4gaW4gdGhlIHNhbWUgcGVyZiBkb21haW4gYW5kIGhl bmNlIE9QUCBpcyBtYXJrZWQgc2hhcmVkIGluIERULgo+Pj4KPj4+IFNpbmNlIHRoaXMgcHJvYmUg Z2V0cyBjYWxsZWQgZm9yIGFsbCB0aGUgY3B1cywgd2UgbmVlZCB0byBza2lwIGFkZGluZwo+Pj4g T1BQcyBmb3IgdGhlIGxhc3QgMyhhZGQgb25seSBmb3IgMXN0IG9uZSBhbmQgbWFyayBvdGhlcnMg YXMgc2hhcmVkKS4KPj4+IElmIHdlIGF0dGVtcHQgdG8gYWRkIE9QUHMgb24gc2Vjb25kIGNwdSBw cm9iZSwgaXQgKndpbGwqIHNob3V0IGFzIGR1cGxpY2F0ZQo+Pj4gT1BQIGFzIHdlIHdvdWxkIGhh dmUgYWxyZWFkeSBtYXJrZWQgaXQgYXMgc2hhcmVkIHRhYmxlIHdpdGggdGhlIGZpcnN0IGNwdS4K Pj4+IEFtIEkgbWlzc2luZyBhbnl0aGluZyA/IEkgc3VnZ2VzdGVkIHRoaXMgYXMgTmljb2xhIHNh dyBPUFAgZHVwbGljYXRlCj4+PiB3YXJuaW5ncyB3aGVuIGhlIHdhcyBoYWNraW5nIHVwIHRoaXMg cGF0Y2guCj4+Pgo+Pj4+PiBvdGhlcndpc2Ugbm8gbmVlZCBhcyB0aGV5IHdvdWxkIGJlIGR1cGxp Y2F0ZWQuCj4+Pj4+PiBBbmQgd2UgZG9uJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZgo+Pj4+ Pj4gdGhlIGJlbG93IGNhbGwgYW55bW9yZSwgbW9yZW92ZXIgd2UgaGF2ZSB0byBjYWxsIGl0IHR3 aWNlIG5vdy4KPj4+Cj4+PiBZZXMsIHRoYXQgbG9va3Mgd3JvbmcsIHdlIG5lZWQgdG8gYWRkIHRo ZSBjaGVjayBmb3Igbm9uIHplcm8gdmFsdWVzLCBidXQgLi4uLgoKd2lsbCBhZGQgdGhlIGNoZWNr LCB0aGFua3MKCj4+Pgo+Pj4+Pgo+Pj4+PiBUaGlzIHNlY29uZCBnZXRfb3BwX2NvdW50IGlzIHJl cXVpcmVkIHN1Y2ggdGhhdCB3ZSByZWdpc3RlciBlbSB3aXRoIHRoZSBjb3JyZWN0Cj4+Pj4+IG9w cCBudW1iZXIgYWZ0ZXIgaGF2aW5nIGFkZGVkIHRoZW0uIFdpdGhvdXQgdGhpcyB0aGUgb3BwX2Nv dW50IHdvdWxkIG5vdCBiZSBjb3JyZWN0Lgo+Pj4+Cj4+Pgo+Pj4gLi4uIEkgaGF2ZSBhIHF1ZXN0 aW9uIGhlcmUuIFdoeSBkbyB5b3UgbmVlZCB0byBjYWxsCj4+Pgo+Pj4gZW1fZGV2X3JlZ2lzdGVy X3BlcmZfZG9tYWluKGNwdV9kZXYsIG5yX29wcCwgJmVtX2NiLCBvcHBfc2hhcmVkX2NwdXMuLikK Pj4+Cj4+PiBvbiBlYWNoIENQVSA/IFdoeSBjYW4ndCB0aGF0IGJlIGRvbmUgb25jZSBmb3IgdW5p cXVlIG9wcF9zaGFyZWRfY3B1cyA/CgpJIGxlZnQgaXQgdW50b3VjaGVkIHRvIHJlZHVjZSBjaGFu Z2VzLCBidXQgSSBzZWUgeW91ciBwb2ludC4KCj4+Cj4+IEl0IGp1c3QgaGF2ZSB0byBiZSBjYWxs ZWQgb25jZSwgZm9yIG9uZSBDUFUgZnJvbSB0aGUgbWFzay4gT3RoZXJ3aXNlIGZvcgo+PiB0aGUg bmV4dCBDUFVzIHlvdSBzaG91bGQgc2VlIGVycm9yOgo+PiAiRU06IGV4aXN0cyBmb3IgQ1BVJWQi Cj4gCj4gT0sgY29vbCwgYXQgbGVhc3QgaXQgaXMgZGVzaWduZWQgYW5kIGV4cGVjdGVkIHRvIGJl IHVzZWQgbGlrZSBJIHRob3VnaHQuCj4gQWgsIEkgbWlnaHQgaGF2ZSBzZWVuIHRob3NlLCBidXQg bmV2ZXIgdGhvdWdodCBpdCB3YXMgZXJyb3IgbWVzc2FnZSDwn5iEIAo+IAo+PiBJdCBjYW4gaGFw cGVuIHRoYXQgdGhpcyBwcmludCBpcyBub3Qgc2VlbiB3aGVuIHRoZSBnZXRfY3B1X2RldmljZShj cHUpCj4+IGZhaWxlZCwgYnV0IHRoYXQgd291bGQgbGVhZCB0byBpbnZlc3RpZ2F0aW9uIHdoeSBD UFUgZGV2aWNlcyBhcmUgbm90Cj4+IHRoZXJlIHlldC4KPj4KPj4gTmljb2xhOiBoYXZlIHlvdSBz ZWVuIHRoYXQgcHJpbnQ/Cj4+Cj4gCj4gSSBhc3N1bWUgeW91IG11c3Qgc2VlIHRoYXQgYW5kIHlv dSBuZWVkIHRvIHB1bGwgdGhpcyBpbnNpZGUgaWYgY29uZGl0aW9uCj4gdG8gZG8gdGhpcyBvbmNl IGZvciBlYWNoIHBlcmZvcm1hbmNlIGRvbWFpbi4KCkkgZG9uJ3Qgc2VlIHRoYXQgZXJyb3IsIGFu ZCB0aGF0J3MgYWxzbyB3aHkgSSBsZWZ0IGl0IHRoZXJlLiBJZiB0aGVyZSdzIGFscmVhZHkKYW5k IGVtX3BkIGZvciBhIGRldmljZSwgRU0ganVzdCByZXR1cm5zIHdpdGggYW4gZXJyb3IgdGhhdCB3 ZSBkb24ndCBjaGVjay4KCkkgYWdyZWUgdGhhdCBpdCBtYWtlcyBtb3JlIHNlbnNlIHRvIHJlZ2lz dGVyIGVtIGZvciBvcHBfc2hhcmVkX2NwdXMuCgo+IAo+IC0tCj4gUmVnYXJkcywKPiBTdWRlZXAK PiAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK