From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C38FC3FC4 for ; Thu, 19 Aug 2021 22:09:50 +0000 (UTC) Received: by mail-lf1-f54.google.com with SMTP id g13so16011969lfj.12 for ; Thu, 19 Aug 2021 15:09:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Djc9fORZaX0jUQ208L1CXmP3iTRD6JSYsA+xYiTuRIM=; b=dMU6STbYnm9OflIqSy2qQXqjsJYwl7YMlINi7PykXT2hk4hVpl87FK13Gf1ev8geC3 K9caemrLnRsk5kMdD8lgWsp4zIB+EXGhHL8lT9qVG+rY9hboNmGWhYzNYfapsyKLHMRr BuVLkLyNXbyQV+L42XvasmlaKRmpbZ1esPdEDu7e07tVacSCCkZ69VwjPz7/bcAtO3HY MBcCelEAlUxXVzjYivWfZRipGBGcBePWKJgp4sYTzoaLrh6F7gyCw70q5JZvPfAXVxmg BBWjfPLtb9tscP8XQdZrCInxEKvKnskPHBdhH1dH2redmXEI+urWw82oLmmmFLtSnzpf Bcdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Djc9fORZaX0jUQ208L1CXmP3iTRD6JSYsA+xYiTuRIM=; b=uat0ayKEPQP3rZM5QKoceT7p07AbNIaoH62RlwRGEUTQ0W8N3pNyAxKojbM29q/qxT hvxvkhgjJoB+1eA0/vxBpXzwyUllUmr4AToObl8I8wxSKuvKBJ+kGj/mV/2yoBEb6kH5 MKi6QRtjuPqPcYuPJ4qh5pVtab/75n5lb0nEZUMq+xNCW4kUNkYViUWzUYlj+J80WCUs TSXC+QJSeyYQkcxOMJUcoz0x+lWB2HGiL0He87Wb542SvcvDvc+tNv+FrpLVCPiLGGpV KHeWDmo9UbC2zwAd4woHlgLf0gH9CLXdrEh4TdkDkk7K8M8+6v2WG++WW5VN0JmvoPnQ /vKg== X-Gm-Message-State: AOAM532Qi6gIzmZy/6dgzEkZwUyiGebicCBAmpAENKPkoYoBmnQJrH2l yTj86N5MscqkF3+Rt3lw2DE= X-Google-Smtp-Source: ABdhPJxvNxcxk5Wqttm8NgLj2sKnLsuL7sNLBaDY6UpJ6+A1Pob5mT38NwjMtPvD9CLOiEzV59Hqsg== X-Received: by 2002:a05:6512:3f08:: with SMTP id y8mr11381666lfa.221.1629410988761; Thu, 19 Aug 2021 15:09:48 -0700 (PDT) Received: from [192.168.2.145] (46-138-120-72.dynamic.spd-mgts.ru. [46.138.120.72]) by smtp.googlemail.com with ESMTPSA id z5sm430889lfs.126.2021.08.19.15.09.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Aug 2021 15:09:48 -0700 (PDT) Subject: Re: [PATCH v8 07/34] clk: tegra: Support runtime PM and power domain To: Thierry Reding Cc: Jonathan Hunter , Ulf Hansson , Viresh Kumar , Stephen Boyd , Peter De Schrijver , Mikko Perttunen , Peter Chen , Mark Brown , Lee Jones , =?UTF-8?Q?Uwe_Kleine-K=c3=b6nig?= , Nishanth Menon , Vignesh Raghavendra , Richard Weinberger , Miquel Raynal , Lucas Stach , Stefan Agner , Adrian Hunter , Mauro Carvalho Chehab , Rob Herring , Michael Turquette , linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, linux-staging@lists.linux.dev, linux-spi@vger.kernel.org, linux-pwm@vger.kernel.org, linux-mtd@lists.infradead.org, linux-mmc@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org References: <20210817012754.8710-1-digetx@gmail.com> <20210817012754.8710-8-digetx@gmail.com> From: Dmitry Osipenko Message-ID: Date: Fri, 20 Aug 2021 01:09:46 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 Precedence: bulk X-Mailing-List: linux-staging@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit 19.08.2021 19:54, Thierry Reding пишет: > On Wed, Aug 18, 2021 at 08:11:03PM +0300, Dmitry Osipenko wrote: >> 18.08.2021 19:42, Thierry Reding пишет: >>> On Wed, Aug 18, 2021 at 06:05:21PM +0300, Dmitry Osipenko wrote: >>>> 18.08.2021 17:07, Thierry Reding пишет: >>>>> On Tue, Aug 17, 2021 at 04:27:27AM +0300, Dmitry Osipenko wrote: >>>>> [...] >>>>>> +struct clk *tegra_clk_register(struct clk_hw *hw) >>>>>> +{ >>>>>> + struct platform_device *pdev; >>>>>> + struct device *dev = NULL; >>>>>> + struct device_node *np; >>>>>> + const char *dev_name; >>>>>> + >>>>>> + np = tegra_clk_get_of_node(hw); >>>>>> + >>>>>> + if (!of_device_is_available(np)) >>>>>> + goto put_node; >>>>>> + >>>>>> + dev_name = kasprintf(GFP_KERNEL, "tegra_clk_%s", hw->init->name); >>>>>> + if (!dev_name) >>>>>> + goto put_node; >>>>>> + >>>>>> + pdev = of_platform_device_create(np, dev_name, NULL); >>>>>> + if (!pdev) { >>>>>> + pr_err("%s: failed to create device for %pOF\n", __func__, np); >>>>>> + kfree(dev_name); >>>>>> + goto put_node; >>>>>> + } >>>>>> + >>>>>> + dev = &pdev->dev; >>>>>> + pm_runtime_enable(dev); >>>>>> +put_node: >>>>>> + of_node_put(np); >>>>>> + >>>>>> + return clk_register(dev, hw); >>>>>> +} >>>>> >>>>> This looks wrong. Why do we need struct platform_device objects for each >>>>> of these clocks? That's going to be a massive amount of platform devices >>>>> and they will completely mess up sysfs. >>>> >>>> RPM works with a device. It's not a massive amount of devices, it's one >>>> device for T20 and four devices for T30. >>> >>> I'm still not sure I understand why we need to call RPM functions on a >>> clock. And even if they are few, it seems wrong to make these platform >>> devices. >> >> Before clock is enabled, we need to raise core voltage. After clock is >> disabled, the voltage should be dropped. CCF+RPM takes care of handling >> this for us. > > That's the part that I do understand. What I don't understand is why a > clock needs to be runtime suspend/resumed. Typically we suspend/resume > devices, and doing so typically involves disabling/enabling clocks. So > I don't understand why the clocks themselves now need to be runtime > suspended/resumed. CCF provides RPM management for a device that backs clock. When clock is enabled, it resumes the backing device. RPM, GENPD and OPP frameworks work with a device. We use all these frameworks here. Since we don't have a dedicated device for a PLL clock, we need to create it in order to leverage the existing generic kernel APIs. In this case clocks are not runtime suspended/resumed, the device which backs clock is suspended/resumed. >>> Perhaps they can be simple struct device:s instead? Ideally they would >>> also be parented to the CAR so that they appear in the right place in >>> the sysfs hierarchy. >> >> Could you please clarify what do you mean by 'simple struct device:s'? >> These clock devices should be OF devices with a of_node and etc, >> otherwise we can't use OPP framework. > > Perhaps I misunderstand the goal of the OPP framework. My understanding > was that this was to attach a table of operating points with a device so > that appropriate operating points could be selected and switched to when > the workload changes. > > Typically these operating points would be roughly a clock rate and a > corresponding voltage for a regulator, so that when a certain clock rate > is requested, the regulator can be set to the matching voltage. > > Hm... so is it that each of these clocks that you want to create a > platform device for has its own regulator? Because the patch series only > mentions the CORE domain, so I assumed that we would accumulate all the > clock rates for the clocks that are part of that CORE domain and then > derive a voltage to be supplied to that CORE domain. > > But perhaps I just don't understand correctly how this is tied together. We don't use regulators, we use power domain that controls regulator. GENPD takes care of accumulating performance requests on a per-device basis. I'm creating platform device for the clocks that require DVFS. These clocks don't use regulator, they are attached to the CORE domain. GENPD framework manages the performance state, aggregating perf votes from each device, i.e. from each clock individually. You want to reinvent another layer of aggregation on top of GENPD. This doesn't worth the effort, we won't get anything from it, it should be a lot of extra complexity for nothing. We will also lose from it because pm_genpd_summary won't show you a per-device info. domain status children performance /device runtime status ---------------------------------------------------------------------------------------------- heg on 1000000 /devices/soc0/50000000.host1x active 1000000 /devices/soc0/50000000.host1x/54140000.gr2d suspended 0 mpe off-0 0 vdec off-0 0 /devices/soc0/6001a000.vde suspended 0 venc off-0 0 3d1 off-0 0 /devices/genpd:1:54180000.gr3d suspended 0 3d0 off-0 0 /devices/genpd:0:54180000.gr3d suspended 0 core-domain on 1000000 3d0, 3d1, venc, vdec, mpe, heg /devices/soc0/7d000000.usb active 1000000 /devices/soc0/78000400.mmc active 950000 /devices/soc0/7000f400.memory-controller unsupported 1000000 /devices/soc0/7000a000.pwm active 1000000 /devices/soc0/60006000.clock/tegra_clk_pll_c active 1000000 /devices/soc0/60006000.clock/tegra_clk_pll_e suspended 0 /devices/soc0/60006000.clock/tegra_clk_pll_m active 1000000 /devices/soc0/60006000.clock/tegra_clk_sclk active 1000000 >> We don't have driver for CAR to bind. I guess we could try to add a >> 'dummy' CAR driver that will create sub-devices for the rpm-clocks, is >> this what you're wanting? > > I got confused by the "tegra-clock" driver that this series was adding. > This is actually a driver that will bind to the virtual clocks rather > than the CAR device itself. > > For some reason I had assumed that you wanted to create a CAR driver in > order to get at the struct device embedded in the CAR's platform device > and use that as the parent for all these clocks. > > So even if we absolutely need some struct device for these clocks, maybe > adding that CAR driver and making the clock struct device:s children of > the CAR device will help keep a bit of a proper hierarchy in sysfs. Alright, that's easy to do. We will have to move out some clk data out of __init then. I already implemented it as you may see in the above PD summary. 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=-4.8 required=3.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, 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 77BEFC4338F for ; Thu, 19 Aug 2021 22:10:58 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3E2BD60200 for ; Thu, 19 Aug 2021 22:10:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 3E2BD60200 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:Cc:To:Subject:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=j0M3VXuq8mf6ckXiNgFE1YlO8lbfeNH6EAbM5VAyAQY=; b=ZerekRMCCheVKEzvweT5WFlLPv mElhY71NDkFZzSlCA24ccs8Ob65zva5nYmivkfXIBMKFd9ClH6/N9tTLEZfWRQdDyWT68JGNkhXPv GniuMVJ4VkqN+QhQg14iZ77xiaeJC7c3opkAM9rAgby7jifAJxo1za+MDOV1uMM+KE87Tk1D1Aat2 DnCJTp9fjRrKJ1X4umRR/0VV2vGMMShpScvcHbyNZFhwfOG/jCubfCiCQ971RJppe5B7a04T7PdHu DLZGTiiDAb7tJ49K9w39ldPE8WdnQxc2TDC/0UozY6SBgVMmnyi+UMo4JEiAIXFCNP6kcXZRdd6S2 YcYIzK3Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mGqEU-009ZMD-7R; Thu, 19 Aug 2021 22:09:54 +0000 Received: from mail-lf1-x12d.google.com ([2a00:1450:4864:20::12d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mGqER-009ZLb-7I for linux-mtd@lists.infradead.org; Thu, 19 Aug 2021 22:09:52 +0000 Received: by mail-lf1-x12d.google.com with SMTP id y34so16026980lfa.8 for ; Thu, 19 Aug 2021 15:09:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Djc9fORZaX0jUQ208L1CXmP3iTRD6JSYsA+xYiTuRIM=; b=dMU6STbYnm9OflIqSy2qQXqjsJYwl7YMlINi7PykXT2hk4hVpl87FK13Gf1ev8geC3 K9caemrLnRsk5kMdD8lgWsp4zIB+EXGhHL8lT9qVG+rY9hboNmGWhYzNYfapsyKLHMRr BuVLkLyNXbyQV+L42XvasmlaKRmpbZ1esPdEDu7e07tVacSCCkZ69VwjPz7/bcAtO3HY MBcCelEAlUxXVzjYivWfZRipGBGcBePWKJgp4sYTzoaLrh6F7gyCw70q5JZvPfAXVxmg BBWjfPLtb9tscP8XQdZrCInxEKvKnskPHBdhH1dH2redmXEI+urWw82oLmmmFLtSnzpf Bcdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Djc9fORZaX0jUQ208L1CXmP3iTRD6JSYsA+xYiTuRIM=; b=hrwzS5sjgYKar2iP8BVPPeq9Gw2m/1FEkpvIFlN2ZyUbswPl1bwyU5TPbdKTYf/71D j0+5EtLbCvhlm3s8NOd6bBvIABTu8w5eHLQiUImfmepPFmcARc71TjNV2GkWPrONPSnJ RCTQvBuCmXsY68ihNoSjLU/n5eL8CMYErGiANLihEObrAauF6Bq0etl9T1AwCQVI4HMt 2BlFqgUSqGrUlBbM8yUKUUP3u2c87DSxVLlpbkrUpEKitIn0H97A36WnhSOn0FWAGZ1n +7GC8w/HVGSGcwOd2FvnDrLfCWRZXXiE+NyJ9qAo2o4Sbs+O/78xZgftjrcoj+RTcKj2 Xjhw== X-Gm-Message-State: AOAM530ZatLnA6PNRf6WxPrzpZ2vVBtlATDd0g/AnFIzuSEFaOpDGyg/ Wgi7quuFuE51JTk4ayGsOBc= X-Google-Smtp-Source: ABdhPJxvNxcxk5Wqttm8NgLj2sKnLsuL7sNLBaDY6UpJ6+A1Pob5mT38NwjMtPvD9CLOiEzV59Hqsg== X-Received: by 2002:a05:6512:3f08:: with SMTP id y8mr11381666lfa.221.1629410988761; Thu, 19 Aug 2021 15:09:48 -0700 (PDT) Received: from [192.168.2.145] (46-138-120-72.dynamic.spd-mgts.ru. [46.138.120.72]) by smtp.googlemail.com with ESMTPSA id z5sm430889lfs.126.2021.08.19.15.09.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 19 Aug 2021 15:09:48 -0700 (PDT) Subject: Re: [PATCH v8 07/34] clk: tegra: Support runtime PM and power domain To: Thierry Reding Cc: Jonathan Hunter , Ulf Hansson , Viresh Kumar , Stephen Boyd , Peter De Schrijver , Mikko Perttunen , Peter Chen , Mark Brown , Lee Jones , =?UTF-8?Q?Uwe_Kleine-K=c3=b6nig?= , Nishanth Menon , Vignesh Raghavendra , Richard Weinberger , Miquel Raynal , Lucas Stach , Stefan Agner , Adrian Hunter , Mauro Carvalho Chehab , Rob Herring , Michael Turquette , linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, linux-staging@lists.linux.dev, linux-spi@vger.kernel.org, linux-pwm@vger.kernel.org, linux-mtd@lists.infradead.org, linux-mmc@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-clk@vger.kernel.org References: <20210817012754.8710-1-digetx@gmail.com> <20210817012754.8710-8-digetx@gmail.com> From: Dmitry Osipenko Message-ID: Date: Fri, 20 Aug 2021 01:09:46 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210819_150951_300286_F786E6D5 X-CRM114-Status: GOOD ( 47.25 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org MTkuMDguMjAyMSAxOTo1NCwgVGhpZXJyeSBSZWRpbmcg0L/QuNGI0LXRgjoKPiBPbiBXZWQsIEF1 ZyAxOCwgMjAyMSBhdCAwODoxMTowM1BNICswMzAwLCBEbWl0cnkgT3NpcGVua28gd3JvdGU6Cj4+ IDE4LjA4LjIwMjEgMTk6NDIsIFRoaWVycnkgUmVkaW5nINC/0LjRiNC10YI6Cj4+PiBPbiBXZWQs IEF1ZyAxOCwgMjAyMSBhdCAwNjowNToyMVBNICswMzAwLCBEbWl0cnkgT3NpcGVua28gd3JvdGU6 Cj4+Pj4gMTguMDguMjAyMSAxNzowNywgVGhpZXJyeSBSZWRpbmcg0L/QuNGI0LXRgjoKPj4+Pj4g T24gVHVlLCBBdWcgMTcsIDIwMjEgYXQgMDQ6Mjc6MjdBTSArMDMwMCwgRG1pdHJ5IE9zaXBlbmtv IHdyb3RlOgo+Pj4+PiBbLi4uXQo+Pj4+Pj4gK3N0cnVjdCBjbGsgKnRlZ3JhX2Nsa19yZWdpc3Rl cihzdHJ1Y3QgY2xrX2h3ICpodykKPj4+Pj4+ICt7Cj4+Pj4+PiArCXN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXY7Cj4+Pj4+PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7Cj4+Pj4+PiAr CXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Cj4+Pj4+PiArCWNvbnN0IGNoYXIgKmRldl9uYW1lOwo+ Pj4+Pj4gKwo+Pj4+Pj4gKwlucCA9IHRlZ3JhX2Nsa19nZXRfb2Zfbm9kZShodyk7Cj4+Pj4+PiAr Cj4+Pj4+PiArCWlmICghb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpCj4+Pj4+PiArCQlnb3Rv IHB1dF9ub2RlOwo+Pj4+Pj4gKwo+Pj4+Pj4gKwlkZXZfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VS TkVMLCAidGVncmFfY2xrXyVzIiwgaHctPmluaXQtPm5hbWUpOwo+Pj4+Pj4gKwlpZiAoIWRldl9u YW1lKQo+Pj4+Pj4gKwkJZ290byBwdXRfbm9kZTsKPj4+Pj4+ICsKPj4+Pj4+ICsJcGRldiA9IG9m X3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsIGRldl9uYW1lLCBOVUxMKTsKPj4+Pj4+ICsJaWYg KCFwZGV2KSB7Cj4+Pj4+PiArCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBm b3IgJXBPRlxuIiwgX19mdW5jX18sIG5wKTsKPj4+Pj4+ICsJCWtmcmVlKGRldl9uYW1lKTsKPj4+ Pj4+ICsJCWdvdG8gcHV0X25vZGU7Cj4+Pj4+PiArCX0KPj4+Pj4+ICsKPj4+Pj4+ICsJZGV2ID0g JnBkZXYtPmRldjsKPj4+Pj4+ICsJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKPj4+Pj4+ICtwdXRf bm9kZToKPj4+Pj4+ICsJb2Zfbm9kZV9wdXQobnApOwo+Pj4+Pj4gKwo+Pj4+Pj4gKwlyZXR1cm4g Y2xrX3JlZ2lzdGVyKGRldiwgaHcpOwo+Pj4+Pj4gK30KPj4+Pj4KPj4+Pj4gVGhpcyBsb29rcyB3 cm9uZy4gV2h5IGRvIHdlIG5lZWQgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvYmplY3RzIGZvciBl YWNoCj4+Pj4+IG9mIHRoZXNlIGNsb2Nrcz8gVGhhdCdzIGdvaW5nIHRvIGJlIGEgbWFzc2l2ZSBh bW91bnQgb2YgcGxhdGZvcm0gZGV2aWNlcwo+Pj4+PiBhbmQgdGhleSB3aWxsIGNvbXBsZXRlbHkg bWVzcyB1cCBzeXNmcy4KPj4+Pgo+Pj4+IFJQTSB3b3JrcyB3aXRoIGEgZGV2aWNlLiBJdCdzIG5v dCBhIG1hc3NpdmUgYW1vdW50IG9mIGRldmljZXMsIGl0J3Mgb25lCj4+Pj4gZGV2aWNlIGZvciBU MjAgYW5kIGZvdXIgZGV2aWNlcyBmb3IgVDMwLgo+Pj4KPj4+IEknbSBzdGlsbCBub3Qgc3VyZSBJ IHVuZGVyc3RhbmQgd2h5IHdlIG5lZWQgdG8gY2FsbCBSUE0gZnVuY3Rpb25zIG9uIGEKPj4+IGNs b2NrLiBBbmQgZXZlbiBpZiB0aGV5IGFyZSBmZXcsIGl0IHNlZW1zIHdyb25nIHRvIG1ha2UgdGhl c2UgcGxhdGZvcm0KPj4+IGRldmljZXMuCj4+Cj4+IEJlZm9yZSBjbG9jayBpcyBlbmFibGVkLCB3 ZSBuZWVkIHRvIHJhaXNlIGNvcmUgdm9sdGFnZS4gQWZ0ZXIgY2xvY2sgaXMKPj4gZGlzYWJsZWQs IHRoZSB2b2x0YWdlIHNob3VsZCBiZSBkcm9wcGVkLiBDQ0YrUlBNIHRha2VzIGNhcmUgb2YgaGFu ZGxpbmcKPj4gdGhpcyBmb3IgdXMuCj4gCj4gVGhhdCdzIHRoZSBwYXJ0IHRoYXQgSSBkbyB1bmRl cnN0YW5kLiBXaGF0IEkgZG9uJ3QgdW5kZXJzdGFuZCBpcyB3aHkgYQo+IGNsb2NrIG5lZWRzIHRv IGJlIHJ1bnRpbWUgc3VzcGVuZC9yZXN1bWVkLiBUeXBpY2FsbHkgd2Ugc3VzcGVuZC9yZXN1bWUK PiBkZXZpY2VzLCBhbmQgZG9pbmcgc28gdHlwaWNhbGx5IGludm9sdmVzIGRpc2FibGluZy9lbmFi bGluZyBjbG9ja3MuIFNvCj4gSSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGUgY2xvY2tzIHRoZW1z ZWx2ZXMgbm93IG5lZWQgdG8gYmUgcnVudGltZQo+IHN1c3BlbmRlZC9yZXN1bWVkLgoKQ0NGIHBy b3ZpZGVzIFJQTSBtYW5hZ2VtZW50IGZvciBhIGRldmljZSB0aGF0IGJhY2tzIGNsb2NrLiBXaGVu IGNsb2NrIGlzIGVuYWJsZWQsIGl0IHJlc3VtZXMgdGhlIGJhY2tpbmcgZGV2aWNlLgoKUlBNLCBH RU5QRCBhbmQgT1BQIGZyYW1ld29ya3Mgd29yayB3aXRoIGEgZGV2aWNlLiBXZSB1c2UgYWxsIHRo ZXNlIGZyYW1ld29ya3MgaGVyZS4gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGRlZGljYXRlZCBkZXZp Y2UgZm9yIGEgUExMIGNsb2NrLCB3ZSBuZWVkIHRvIGNyZWF0ZSBpdCBpbiBvcmRlciB0byBsZXZl cmFnZSB0aGUgZXhpc3RpbmcgZ2VuZXJpYyBrZXJuZWwgQVBJcy4KCkluIHRoaXMgY2FzZSBjbG9j a3MgYXJlIG5vdCBydW50aW1lIHN1c3BlbmRlZC9yZXN1bWVkLCB0aGUgZGV2aWNlIHdoaWNoIGJh Y2tzIGNsb2NrIGlzIHN1c3BlbmRlZC9yZXN1bWVkLgoKPj4+IFBlcmhhcHMgdGhleSBjYW4gYmUg c2ltcGxlIHN0cnVjdCBkZXZpY2U6cyBpbnN0ZWFkPyBJZGVhbGx5IHRoZXkgd291bGQKPj4+IGFs c28gYmUgcGFyZW50ZWQgdG8gdGhlIENBUiBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSByaWdo dCBwbGFjZSBpbgo+Pj4gdGhlIHN5c2ZzIGhpZXJhcmNoeS4KPj4KPj4gQ291bGQgeW91IHBsZWFz ZSBjbGFyaWZ5IHdoYXQgZG8geW91IG1lYW4gYnkgJ3NpbXBsZSBzdHJ1Y3QgZGV2aWNlOnMnPwo+ PiBUaGVzZSBjbG9jayBkZXZpY2VzIHNob3VsZCBiZSBPRiBkZXZpY2VzIHdpdGggYSBvZl9ub2Rl IGFuZCBldGMsCj4+IG90aGVyd2lzZSB3ZSBjYW4ndCB1c2UgT1BQIGZyYW1ld29yay4KPiAKPiBQ ZXJoYXBzIEkgbWlzdW5kZXJzdGFuZCB0aGUgZ29hbCBvZiB0aGUgT1BQIGZyYW1ld29yay4gTXkg dW5kZXJzdGFuZGluZwo+IHdhcyB0aGF0IHRoaXMgd2FzIHRvIGF0dGFjaCBhIHRhYmxlIG9mIG9w ZXJhdGluZyBwb2ludHMgd2l0aCBhIGRldmljZSBzbwo+IHRoYXQgYXBwcm9wcmlhdGUgb3BlcmF0 aW5nIHBvaW50cyBjb3VsZCBiZSBzZWxlY3RlZCBhbmQgc3dpdGNoZWQgdG8gd2hlbgo+IHRoZSB3 b3JrbG9hZCBjaGFuZ2VzLgo+IAo+IFR5cGljYWxseSB0aGVzZSBvcGVyYXRpbmcgcG9pbnRzIHdv dWxkIGJlIHJvdWdobHkgYSBjbG9jayByYXRlIGFuZCBhCj4gY29ycmVzcG9uZGluZyB2b2x0YWdl IGZvciBhIHJlZ3VsYXRvciwgc28gdGhhdCB3aGVuIGEgY2VydGFpbiBjbG9jayByYXRlCj4gaXMg cmVxdWVzdGVkLCB0aGUgcmVndWxhdG9yIGNhbiBiZSBzZXQgdG8gdGhlIG1hdGNoaW5nIHZvbHRh Z2UuCj4gCj4gSG0uLi4gc28gaXMgaXQgdGhhdCBlYWNoIG9mIHRoZXNlIGNsb2NrcyB0aGF0IHlv dSB3YW50IHRvIGNyZWF0ZSBhCj4gcGxhdGZvcm0gZGV2aWNlIGZvciBoYXMgaXRzIG93biByZWd1 bGF0b3I/IEJlY2F1c2UgdGhlIHBhdGNoIHNlcmllcyBvbmx5Cj4gbWVudGlvbnMgdGhlIENPUkUg ZG9tYWluLCBzbyBJIGFzc3VtZWQgdGhhdCB3ZSB3b3VsZCBhY2N1bXVsYXRlIGFsbCB0aGUKPiBj bG9jayByYXRlcyBmb3IgdGhlIGNsb2NrcyB0aGF0IGFyZSBwYXJ0IG9mIHRoYXQgQ09SRSBkb21h aW4gYW5kIHRoZW4KPiBkZXJpdmUgYSB2b2x0YWdlIHRvIGJlIHN1cHBsaWVkIHRvIHRoYXQgQ09S RSBkb21haW4uCj4gCj4gQnV0IHBlcmhhcHMgSSBqdXN0IGRvbid0IHVuZGVyc3RhbmQgY29ycmVj dGx5IGhvdyB0aGlzIGlzIHRpZWQgdG9nZXRoZXIuCgpXZSBkb24ndCB1c2UgcmVndWxhdG9ycywg d2UgdXNlIHBvd2VyIGRvbWFpbiB0aGF0IGNvbnRyb2xzIHJlZ3VsYXRvci4gR0VOUEQgdGFrZXMg Y2FyZSBvZiBhY2N1bXVsYXRpbmcgcGVyZm9ybWFuY2UgcmVxdWVzdHMgb24gYSBwZXItZGV2aWNl IGJhc2lzLgoKSSdtIGNyZWF0aW5nIHBsYXRmb3JtIGRldmljZSBmb3IgdGhlIGNsb2NrcyB0aGF0 IHJlcXVpcmUgRFZGUy4gVGhlc2UgY2xvY2tzIGRvbid0IHVzZSByZWd1bGF0b3IsIHRoZXkgYXJl IGF0dGFjaGVkIHRvIHRoZSBDT1JFIGRvbWFpbi4gR0VOUEQgZnJhbWV3b3JrIG1hbmFnZXMgdGhl IHBlcmZvcm1hbmNlIHN0YXRlLCBhZ2dyZWdhdGluZyBwZXJmIHZvdGVzIGZyb20gZWFjaCBkZXZp Y2UsIGkuZS4gZnJvbSBlYWNoIGNsb2NrIGluZGl2aWR1YWxseS4KCllvdSB3YW50IHRvIHJlaW52 ZW50IGFub3RoZXIgbGF5ZXIgb2YgYWdncmVnYXRpb24gb24gdG9wIG9mIEdFTlBELiBUaGlzIGRv ZXNuJ3Qgd29ydGggdGhlIGVmZm9ydCwgd2Ugd29uJ3QgZ2V0IGFueXRoaW5nIGZyb20gaXQsIGl0 IHNob3VsZCBiZSBhIGxvdCBvZiBleHRyYSBjb21wbGV4aXR5IGZvciBub3RoaW5nLiBXZSB3aWxs IGFsc28gbG9zZSBmcm9tIGl0IGJlY2F1c2UgcG1fZ2VucGRfc3VtbWFyeSB3b24ndCBzaG93IHlv dSBhIHBlci1kZXZpY2UgaW5mby4KCmRvbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh dHVzICAgICAgICAgIGNoaWxkcmVuICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFu Y2UKICAgIC9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBydW50aW1lIHN0YXR1cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmhl ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAogICAgL2RldmljZXMvc29jMC81MDAwMDAw MC5ob3N0MXggICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSAgICAgICAgICAgICAgICAgICAg IDEwMDAwMDAKICAgIC9kZXZpY2VzL3NvYzAvNTAwMDAwMDAuaG9zdDF4LzU0MTQwMDAwLmdyMmQg ICAgICAgICBzdXNwZW5kZWQgICAgICAgICAgICAgICAgICAwCm1wZSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgb2ZmLTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgMAp2ZGVjICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZi0wICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgIC9kZXZpY2VzL3NvYzAvNjAw MWEwMDAudmRlICAgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQgICAgICAgICAgICAg ICAgICAwCnZlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmLTAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAozZDEgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG9mZi0wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDAKICAgIC9kZXZpY2VzL2dlbnBkOjE6NTQxODAwMDAuZ3IzZCAgICAgICAgICAgICAgICAg ICAgICBzdXNwZW5kZWQgICAgICAgICAgICAgICAgICAwCjNkMCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgb2ZmLTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMAogICAgL2RldmljZXMvZ2VucGQ6MDo1NDE4MDAwMC5ncjNkICAgICAgICAgICAgICAgICAg ICAgIHN1c3BlbmRlZCAgICAgICAgICAgICAgICAgIDAKY29yZS1kb21haW4gICAgICAgICAgICAg ICAgICAgICBvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAxMDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDNkMCwgM2QxLCB2ZW5jLCB2ZGVjLCBtcGUsIGhlZwogICAgL2RldmljZXMvc29jMC83ZDAwMDAw MC51c2IgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSAgICAgICAgICAgICAgICAgICAg IDEwMDAwMDAKICAgIC9kZXZpY2VzL3NvYzAvNzgwMDA0MDAubW1jICAgICAgICAgICAgICAgICAg ICAgICAgICBhY3RpdmUgICAgICAgICAgICAgICAgICAgICA5NTAwMDAKICAgIC9kZXZpY2VzL3Nv YzAvNzAwMGY0MDAubWVtb3J5LWNvbnRyb2xsZXIgICAgICAgICAgICB1bnN1cHBvcnRlZCAgICAg ICAgICAgICAgICAxMDAwMDAwCiAgICAvZGV2aWNlcy9zb2MwLzcwMDBhMDAwLnB3bSAgICAgICAg ICAgICAgICAgICAgICAgICAgYWN0aXZlICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAogICAg L2RldmljZXMvc29jMC82MDAwNjAwMC5jbG9jay90ZWdyYV9jbGtfcGxsX2MgICAgICAgIGFjdGl2 ZSAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAKICAgIC9kZXZpY2VzL3NvYzAvNjAwMDYwMDAu Y2xvY2svdGVncmFfY2xrX3BsbF9lICAgICAgICBzdXNwZW5kZWQgICAgICAgICAgICAgICAgICAw CiAgICAvZGV2aWNlcy9zb2MwLzYwMDA2MDAwLmNsb2NrL3RlZ3JhX2Nsa19wbGxfbSAgICAgICAg YWN0aXZlICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAogICAgL2RldmljZXMvc29jMC82MDAw NjAwMC5jbG9jay90ZWdyYV9jbGtfc2NsayAgICAgICAgIGFjdGl2ZSAgICAgICAgICAgICAgICAg ICAgIDEwMDAwMDAKCgo+PiBXZSBkb24ndCBoYXZlIGRyaXZlciBmb3IgQ0FSIHRvIGJpbmQuIEkg Z3Vlc3Mgd2UgY291bGQgdHJ5IHRvIGFkZCBhCj4+ICdkdW1teScgQ0FSIGRyaXZlciB0aGF0IHdp bGwgY3JlYXRlIHN1Yi1kZXZpY2VzIGZvciB0aGUgcnBtLWNsb2NrcywgaXMKPj4gdGhpcyB3aGF0 IHlvdSdyZSB3YW50aW5nPwo+IAo+IEkgZ290IGNvbmZ1c2VkIGJ5IHRoZSAidGVncmEtY2xvY2si IGRyaXZlciB0aGF0IHRoaXMgc2VyaWVzIHdhcyBhZGRpbmcuCj4gVGhpcyBpcyBhY3R1YWxseSBh IGRyaXZlciB0aGF0IHdpbGwgYmluZCB0byB0aGUgdmlydHVhbCBjbG9ja3MgcmF0aGVyCj4gdGhh biB0aGUgQ0FSIGRldmljZSBpdHNlbGYuCj4gCj4gRm9yIHNvbWUgcmVhc29uIEkgaGFkIGFzc3Vt ZWQgdGhhdCB5b3Ugd2FudGVkIHRvIGNyZWF0ZSBhIENBUiBkcml2ZXIgaW4KPiBvcmRlciB0byBn ZXQgYXQgdGhlIHN0cnVjdCBkZXZpY2UgZW1iZWRkZWQgaW4gdGhlIENBUidzIHBsYXRmb3JtIGRl dmljZQo+IGFuZCB1c2UgdGhhdCBhcyB0aGUgcGFyZW50IGZvciBhbGwgdGhlc2UgY2xvY2tzLgo+ IAo+IFNvIGV2ZW4gaWYgd2UgYWJzb2x1dGVseSBuZWVkIHNvbWUgc3RydWN0IGRldmljZSBmb3Ig dGhlc2UgY2xvY2tzLCBtYXliZQo+IGFkZGluZyB0aGF0IENBUiBkcml2ZXIgYW5kIG1ha2luZyB0 aGUgY2xvY2sgc3RydWN0IGRldmljZTpzIGNoaWxkcmVuIG9mCj4gdGhlIENBUiBkZXZpY2Ugd2ls bCBoZWxwIGtlZXAgYSBiaXQgb2YgYSBwcm9wZXIgaGllcmFyY2h5IGluIHN5c2ZzLgoKQWxyaWdo dCwgdGhhdCdzIGVhc3kgdG8gZG8uIFdlIHdpbGwgaGF2ZSB0byBtb3ZlIG91dCBzb21lIGNsayBk YXRhIG91dCBvZiBfX2luaXQgdGhlbi4gSSBhbHJlYWR5IGltcGxlbWVudGVkIGl0IGFzIHlvdSBt YXkgc2VlIGluIHRoZSBhYm92ZSBQRCBzdW1tYXJ5LgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNjdXNzaW9uIG1haWxp bmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LW10ZC8K