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,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 96A7CC48BE5 for ; Wed, 16 Jun 2021 01:09:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 65F2961246 for ; Wed, 16 Jun 2021 01:09:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231226AbhFPBLu (ORCPT ); Tue, 15 Jun 2021 21:11:50 -0400 Received: from szxga03-in.huawei.com ([45.249.212.189]:6384 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229979AbhFPBLt (ORCPT ); Tue, 15 Jun 2021 21:11:49 -0400 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.54]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4G4Rng2YF3z6y5N; Wed, 16 Jun 2021 09:05:43 +0800 (CST) Received: from dggema757-chm.china.huawei.com (10.1.198.199) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2176.2; Wed, 16 Jun 2021 09:09:41 +0800 Received: from [127.0.0.1] (10.69.38.203) by dggema757-chm.china.huawei.com (10.1.198.199) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Wed, 16 Jun 2021 09:09:41 +0800 Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU To: =?UTF-8?Q?Krzysztof_Wilczy=c5=84ski?= , Linuxarm CC: , , , , , , References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> <20210611233355.GA183580@rocinante> From: "liuqi (BA)" Message-ID: Date: Wed, 16 Jun 2021 09:09:40 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20210611233355.GA183580@rocinante> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit X-Originating-IP: [10.69.38.203] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To dggema757-chm.china.huawei.com (10.1.198.199) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Krzysztof, On 2021/6/12 7:33, Krzysztof Wilczyński wrote: > Hi Qi, > > Thank you for sending the patch over! > > [...] >> +/* >> + * This driver adds support for PCIe PMU RCiEP device. Related >> + * perf events are bandwidth, bandwidth utilization, latency >> + * etc. >> + * >> + * Copyright (C) 2021 HiSilicon Limited >> + * Author: Qi Liu >> + */ > > A small nitpick: missing space between your name and the e-mail address. > thanks, will fix this. > [...] >> +static ssize_t hisi_pcie_event_sysfs_show(struct device *dev, >> + struct device_attribute *attr, char *buf) >> +{ >> + struct dev_ext_attribute *eattr; >> + >> + eattr = container_of(attr, struct dev_ext_attribute, attr); >> + >> + return sysfs_emit(buf, "config=0x%lx\n", (unsigned long)eattr->var); >> +} > > I am not that familiar with the perf drivers, thus I might be completely > wrong here, but usually for sysfs objects a single value is preferred, > so that this "config=" technically would not be needed, unless this is > somewhat essential to the consumers of this attribute to know what the > value is?  What do you think? "config=" is a supported for userspace tool, it is a kind of alias, so cannot be remover here, thanks. > > [...] >> +static ssize_t hisi_pcie_identifier_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); >> + >> + return sysfs_emit(buf, "0x%x\n", pcie_pmu->identifier); >> +} > > What about using the "%#x" formatting flag? It would automatically > added the "0x" prefix, etc. > thanks, will fix this. >> +static ssize_t hisi_pcie_bus_show(struct device *dev, >> + struct device_attribute *attr, char *buf) >> +{ >> + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); >> + >> + return sysfs_emit(buf, "0x%02x\n", PCI_BUS_NUM(pcie_pmu->bdf_min)); >> +} > > Same as above, what about "%#02x"? > thanks, will fix this. > [...] >> +static bool hisi_pcie_pmu_valid_filter(struct perf_event *event, >> + struct hisi_pcie_pmu *pcie_pmu) >> +{ >> + u32 subev_idx = hisi_pcie_get_subevent(event); >> + u32 event_idx = hisi_pcie_get_event(event); >> + u32 requester_id = hisi_pcie_get_bdf(event); >> + >> + if (subev_idx > HISI_PCIE_SUBEVENT_MAX || >> + event_idx > HISI_PCIE_EVENT_MAX) { >> + pci_err(pcie_pmu->pdev, >> + "Max event index and max subevent index is: %d, %d.\n", >> + HISI_PCIE_EVENT_MAX, HISI_PCIE_SUBEVENT_MAX); >> + return false; >> + } > > Was this error message above intended to be a debug message? It's a bit > opaque in terms what the error actually is here. We might need to clear > it up a little. > thanks, will change this message to pci_dbg next time. > [...] >> +static bool hisi_pcie_pmu_validate_event_group(struct perf_event *event) >> +{ >> + struct perf_event *sibling, *leader = event->group_leader; >> + int counters = 1; > > How big this counter could become? > > Would it ever be greater than HISI_PCIE_MAX_COUNTERS? I am asking, as > if it would be ever greater, then perhaps unsigned int would be better > to use, and if not, then perhaps something smaller than int? What do > you think, does this even make sense to change? > I think this "counter" is used to caculate how many events have been set in cmdline, so it will always bigger than zero. So int and u32 seems same here.Thanks, > [...] >> +static int hisi_pcie_pmu_event_init(struct perf_event *event) >> +{ >> + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); >> + >> + event->cpu = pcie_pmu->on_cpu; >> + >> + if (event->attr.type != event->pmu->type) >> + return -ENOENT; >> + >> + /* Sampling is not supported. */ >> + if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) >> + return -EOPNOTSUPP; >> + >> + if (!hisi_pcie_pmu_valid_filter(event, pcie_pmu)) { >> + pci_err(pcie_pmu->pdev, "Invalid filter!\n"); >> + return -EINVAL; >> + } > > [...] >> +/* >> + * The bandwidth, latency, bus utilization and buffer occupancy features are >> + * calculated from data in HISI_PCIE_CNT and extended data in HISI_PCIE_EXT_CNT. >> + * Other features are obtained only by HISI_PCIE_CNT. >> + * So data and data_ext are processed in this function to get performanace >> + * value like, bandwidth, latency, etc. >> + */ > > A small typo in the world "performance" above. > thanks, will fix this. > [...] >> +static u64 hisi_pcie_pmu_get_performance(struct perf_event *event, u64 data, >> + u64 data_ext) >> +{ >> +#define CONVERT_DW_TO_BYTE(x) (sizeof(u32) * (x)) > > I would move this macro at the top alongside other constants and macros, > as here it makes the code harder to read. What do you think? > > [...] >> +static int hisi_pcie_pmu_irq_register(struct pci_dev *pdev, >> + struct hisi_pcie_pmu *pcie_pmu) >> +{ >> + int irq, ret; >> + >> + ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); >> + if (ret < 0) { >> + pci_err(pdev, "Failed to enable MSI vectors, ret = %d!\n", ret); >> + return ret; >> + } > > This is a nitpick, so feel free to ignore it, but what do you think of > changing this (and also other messages alike) message to be, for > example: > > pci_err(pdev, "Failed to enable MSI vectors: %d\n", ret); > > Why? I personally don't find displaying a return code/value followed by > a punctuation easy to read, especially when looking through a lot of > lines and other messages in the kernel ring buffer. > got it, will fix this next time. > [...] >> + >> + irq = pci_irq_vector(pdev, 0); >> + ret = request_irq(irq, hisi_pcie_pmu_irq, >> + IRQF_NOBALANCING | IRQF_NO_THREAD, "hisi_pcie_pmu", >> + pcie_pmu); >> + if (ret) { >> + pci_err(pdev, "Failed to register irq, ret = %d!\n", ret); >> + pci_free_irq_vectors(pdev); >> + return ret; >> + } > > It would be "IRQ" in the error message above. > ok, will change this, thanks. > [...] >> +static int hisi_pcie_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) >> +{ >> + struct hisi_pcie_pmu *pcie_pmu = hlist_entry_safe(node, >> + struct hisi_pcie_pmu, node); >> + unsigned int target; >> + >> + /* Nothing to do if this CPU doesn't own the PMU */ >> + if (pcie_pmu->on_cpu != cpu) >> + return 0; >> + >> + /* Choose a new CPU from all online cpus. */ >> + target = cpumask_first(cpu_online_mask); >> + if (target >= nr_cpu_ids) { >> + pci_err(pcie_pmu->pdev, "There is no cpu to set!\n"); >> + return 0; >> + } > > To be consistent, it would be "CPUs" and "CPU" in the above. > > [...] >> +static struct device_attribute hisi_pcie_pmu_bus_attr = >> + __ATTR(bus, 0444, hisi_pcie_bus_show, NULL); > [...] >> +static struct device_attribute hisi_pcie_pmu_cpumask_attr = >> + __ATTR(cpumask, 0444, hisi_pcie_cpumask_show, NULL); > [...] >> +static struct device_attribute hisi_pcie_pmu_identifier_attr = >> + __ATTR(identifier, 0444, hisi_pcie_identifier_show, NULL); > > Would it be at possible for any of the above __ATTR() macros to be > replaced with the DEVICE_ATTR_RO() macro? Or perhaps with __ATTR_RO() > if the other one would be a good fit? > yes, DEVICE_ATTR_RO() macro could be used here, thanks. > [...] >> +static int hisi_pcie_init_dev(struct pci_dev *pdev) >> +{ >> + int ret; >> + >> + ret = pci_enable_device(pdev); >> + if (ret) { >> + pci_err(pdev, "Failed to enable pci device, ret = %d.\n", ret); >> + return ret; >> + } >> + >> + ret = pci_request_mem_regions(pdev, "hisi_pcie_pmu"); >> + if (ret < 0) { >> + pci_err(pdev, "Failed to request pci mem regions, ret = %d.\n", >> + ret); >> + pci_disable_device(pdev); >> + return ret; >> + } > > It would be "PCI" in both error messages above. > will fix it. > [...] >> +static int __init hisi_pcie_module_init(void) >> +{ >> + int ret; >> + >> + ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE, >> + "AP_PERF_ARM_HISI_PCIE_PMU_ONLINE", >> + hisi_pcie_pmu_online_cpu, >> + hisi_pcie_pmu_offline_cpu); >> + if (ret) { >> + pr_err("Failed to setup PCIE PMU hotplug, ret = %d.\n", ret); >> + return ret; >> + } > > It would be "PCIe" in the error message above. > will fix it. Thanks, Qi > Krzysztof > . > 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.5 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 6195EC48BE5 for ; Wed, 16 Jun 2021 01:11:40 +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 21EB260724 for ; Wed, 16 Jun 2021 01:11:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 21EB260724 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=huawei.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=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding: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=CQ7W1ghbysjSOgkH4dIo6x0NiD1COOVhlnuaZln7iww=; b=vzy0WgB6CbJznYe4eKLrOMDTbO N2vURv6R9UTgb2trIOTD6mYVGh9Hj/W0vE6phc5SQ49+BsFayKlpQ58YR0FCc0/rh0p7pFTYxLCZq /Z6TbPG5yfHcaR5+v6ateP02QekuhWaeQI86Z1qiio1vUTavcsZhFCEhVaGiH7ORUygXJA3hqvPma X1FY6dNV0TzRvHQF2dEIMnxfH/7iLRz8rQntPXE8GGj7z2mIst0ZTYOehHl9nL9LfvZ42pDNKYTEt IdzwwuHLsTTWErxSa2J6kywioT3wfPG0QdB1ehNWxemmXhp1RAAred9pQsioTMj+b+YivmFp3eIK3 vTnoPeMQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltK41-004KLw-EJ; Wed, 16 Jun 2021 01:09:53 +0000 Received: from szxga03-in.huawei.com ([45.249.212.189]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltK3w-004KKi-Hc for linux-arm-kernel@lists.infradead.org; Wed, 16 Jun 2021 01:09:51 +0000 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.54]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4G4Rng2YF3z6y5N; Wed, 16 Jun 2021 09:05:43 +0800 (CST) Received: from dggema757-chm.china.huawei.com (10.1.198.199) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2176.2; Wed, 16 Jun 2021 09:09:41 +0800 Received: from [127.0.0.1] (10.69.38.203) by dggema757-chm.china.huawei.com (10.1.198.199) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Wed, 16 Jun 2021 09:09:41 +0800 Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU To: =?UTF-8?Q?Krzysztof_Wilczy=c5=84ski?= , Linuxarm CC: , , , , , , References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> <20210611233355.GA183580@rocinante> From: "liuqi (BA)" Message-ID: Date: Wed, 16 Jun 2021 09:09:40 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20210611233355.GA183580@rocinante> Content-Language: en-GB X-Originating-IP: [10.69.38.203] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To dggema757-chm.china.huawei.com (10.1.198.199) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210615_180948_969158_C44FCA74 X-CRM114-Status: GOOD ( 43.76 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CkhpIEtyenlzenRvZiwKT24gMjAyMS82LzEyIDc6MzMsIEtyenlzenRvZiBXaWxjennFhHNraSB3 cm90ZToKPiBIaSBRaSwKPiAKPiBUaGFuayB5b3UgZm9yIHNlbmRpbmcgdGhlIHBhdGNoIG92ZXIh Cj4gCj4gWy4uLl0KPj4gKy8qCj4+ICsgKiBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIFBD SWUgUE1VIFJDaUVQIGRldmljZS4gUmVsYXRlZAo+PiArICogcGVyZiBldmVudHMgYXJlIGJhbmR3 aWR0aCwgYmFuZHdpZHRoIHV0aWxpemF0aW9uLCBsYXRlbmN5Cj4+ICsgKiBldGMuCj4+ICsgKgo+ PiArICogQ29weXJpZ2h0IChDKSAyMDIxIEhpU2lsaWNvbiBMaW1pdGVkCj4+ICsgKiBBdXRob3I6 IFFpIExpdTxsaXVxaTExNUBodWF3ZWkuY29tPgo+PiArICovCj4gCj4gQSBzbWFsbCBuaXRwaWNr OiBtaXNzaW5nIHNwYWNlIGJldHdlZW4geW91ciBuYW1lIGFuZCB0aGUgZS1tYWlsIGFkZHJlc3Mu Cj4gCnRoYW5rcywgd2lsbCBmaXggdGhpcy4KPiBbLi4uXQo+PiArc3RhdGljIHNzaXplX3QgaGlz aV9wY2llX2V2ZW50X3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAo+PiArCQkJCSAgIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4+ICt7Cj4+ICsJc3RydWN0 IGRldl9leHRfYXR0cmlidXRlICplYXR0cjsKPj4gKwo+PiArCWVhdHRyID0gY29udGFpbmVyX29m KGF0dHIsIHN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSwgYXR0cik7Cj4+ICsKPj4gKwlyZXR1cm4g c3lzZnNfZW1pdChidWYsICJjb25maWc9MHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWVhdHRyLT52 YXIpOwo+PiArfQo+IAo+IEkgYW0gbm90IHRoYXQgZmFtaWxpYXIgd2l0aCB0aGUgcGVyZiBkcml2 ZXJzLCB0aHVzIEkgbWlnaHQgYmUgY29tcGxldGVseQo+IHdyb25nIGhlcmUsIGJ1dCB1c3VhbGx5 IGZvciBzeXNmcyBvYmplY3RzIGEgc2luZ2xlIHZhbHVlIGlzIHByZWZlcnJlZCwKPiBzbyB0aGF0 IHRoaXMgImNvbmZpZz0iIHRlY2huaWNhbGx5IHdvdWxkIG5vdCBiZSBuZWVkZWQsIHVubGVzcyB0 aGlzIGlzCj4gc29tZXdoYXQgZXNzZW50aWFsIHRvIHRoZSBjb25zdW1lcnMgb2YgdGhpcyBhdHRy aWJ1dGUgdG8ga25vdyB3aGF0IHRoZQo+IHZhbHVlIGlzPyDCoFdoYXQgZG8geW91IHRoaW5rPwoi Y29uZmlnPSIgaXMgYSBzdXBwb3J0ZWQgZm9yIHVzZXJzcGFjZSB0b29sLCBpdCBpcyBhIGtpbmQg b2YgYWxpYXMsIHNvIApjYW5ub3QgYmUgcmVtb3ZlciBoZXJlLCB0aGFua3MuCj4gCj4gWy4uLl0K Pj4gK3N0YXRpYyBzc2l6ZV90IGhpc2lfcGNpZV9pZGVudGlmaWVyX3Nob3coc3RydWN0IGRldmlj ZSAqZGV2LAo+PiArCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+ICsJCQkJ CSBjaGFyICpidWYpCj4+ICt7Cj4+ICsJc3RydWN0IGhpc2lfcGNpZV9wbXUgKnBjaWVfcG11ID0g dG9fcGNpZV9wbXUoZGV2X2dldF9kcnZkYXRhKGRldikpOwo+PiArCj4+ICsJcmV0dXJuIHN5c2Zz X2VtaXQoYnVmLCAiMHgleFxuIiwgcGNpZV9wbXUtPmlkZW50aWZpZXIpOwo+PiArfQo+IAo+IFdo YXQgYWJvdXQgdXNpbmcgdGhlICIlI3giIGZvcm1hdHRpbmcgZmxhZz8gIEl0IHdvdWxkIGF1dG9t YXRpY2FsbHkKPiBhZGRlZCB0aGUgIjB4IiBwcmVmaXgsIGV0Yy4KPiAKdGhhbmtzLCB3aWxsIGZp eCB0aGlzLgo+PiArc3RhdGljIHNzaXplX3QgaGlzaV9wY2llX2J1c19zaG93KHN0cnVjdCBkZXZp Y2UgKmRldiwKPj4gKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCj4+ICt7Cj4+ICsJc3RydWN0IGhpc2lfcGNpZV9wbXUgKnBjaWVfcG11ID0gdG9fcGNpZV9w bXUoZGV2X2dldF9kcnZkYXRhKGRldikpOwo+PiArCj4+ICsJcmV0dXJuIHN5c2ZzX2VtaXQoYnVm LCAiMHglMDJ4XG4iLCBQQ0lfQlVTX05VTShwY2llX3BtdS0+YmRmX21pbikpOwo+PiArfQo+IAo+ IFNhbWUgYXMgYWJvdmUsIHdoYXQgYWJvdXQgIiUjMDJ4Ij8KPiAKdGhhbmtzLCB3aWxsIGZpeCB0 aGlzLgo+IFsuLi5dCj4+ICtzdGF0aWMgYm9vbCBoaXNpX3BjaWVfcG11X3ZhbGlkX2ZpbHRlcihz dHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCj4+ICsJCQkJICAgICAgIHN0cnVjdCBoaXNpX3BjaWVf cG11ICpwY2llX3BtdSkKPj4gK3sKPj4gKwl1MzIgc3ViZXZfaWR4ID0gaGlzaV9wY2llX2dldF9z dWJldmVudChldmVudCk7Cj4+ICsJdTMyIGV2ZW50X2lkeCA9IGhpc2lfcGNpZV9nZXRfZXZlbnQo ZXZlbnQpOwo+PiArCXUzMiByZXF1ZXN0ZXJfaWQgPSBoaXNpX3BjaWVfZ2V0X2JkZihldmVudCk7 Cj4+ICsKPj4gKwlpZiAoc3ViZXZfaWR4ID4gSElTSV9QQ0lFX1NVQkVWRU5UX01BWCB8fAo+PiAr CSAgICBldmVudF9pZHggPiBISVNJX1BDSUVfRVZFTlRfTUFYKSB7Cj4+ICsJCXBjaV9lcnIocGNp ZV9wbXUtPnBkZXYsCj4+ICsJCQkiTWF4IGV2ZW50IGluZGV4IGFuZCBtYXggc3ViZXZlbnQgaW5k ZXggaXM6ICVkLCAlZC5cbiIsCj4+ICsJCQlISVNJX1BDSUVfRVZFTlRfTUFYLCBISVNJX1BDSUVf U1VCRVZFTlRfTUFYKTsKPj4gKwkJcmV0dXJuIGZhbHNlOwo+PiArCX0KPiAKPiBXYXMgdGhpcyBl cnJvciBtZXNzYWdlIGFib3ZlIGludGVuZGVkIHRvIGJlIGEgZGVidWcgbWVzc2FnZT8gIEl0J3Mg YSBiaXQKPiBvcGFxdWUgaW4gdGVybXMgd2hhdCB0aGUgZXJyb3IgYWN0dWFsbHkgaXMgaGVyZS4g IFdlIG1pZ2h0IG5lZWQgdG8gY2xlYXIKPiBpdCB1cCBhIGxpdHRsZS4KPiAKdGhhbmtzLCB3aWxs IGNoYW5nZSB0aGlzIG1lc3NhZ2UgdG8gcGNpX2RiZyBuZXh0IHRpbWUuCj4gWy4uLl0KPj4gK3N0 YXRpYyBib29sIGhpc2lfcGNpZV9wbXVfdmFsaWRhdGVfZXZlbnRfZ3JvdXAoc3RydWN0IHBlcmZf ZXZlbnQgKmV2ZW50KQo+PiArewo+PiArCXN0cnVjdCBwZXJmX2V2ZW50ICpzaWJsaW5nLCAqbGVh ZGVyID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKPj4gKwlpbnQgY291bnRlcnMgPSAxOwo+IAo+IEhv dyBiaWcgdGhpcyBjb3VudGVyIGNvdWxkIGJlY29tZT8KPiAKPiBXb3VsZCBpdCBldmVyIGJlIGdy ZWF0ZXIgdGhhbiBISVNJX1BDSUVfTUFYX0NPVU5URVJTPyAgSSBhbSBhc2tpbmcsIGFzCj4gaWYg aXQgd291bGQgYmUgZXZlciBncmVhdGVyLCB0aGVuIHBlcmhhcHMgdW5zaWduZWQgaW50IHdvdWxk IGJlIGJldHRlcgo+IHRvIHVzZSwgYW5kIGlmIG5vdCwgdGhlbiBwZXJoYXBzIHNvbWV0aGluZyBz bWFsbGVyIHRoYW4gaW50PyAgV2hhdCBkbwo+IHlvdSB0aGluaywgZG9lcyB0aGlzIGV2ZW4gbWFr ZSBzZW5zZSB0byBjaGFuZ2U/Cj4gCkkgdGhpbmsgdGhpcyAiY291bnRlciIgaXMgdXNlZCB0byBj YWN1bGF0ZSBob3cgbWFueSBldmVudHMgaGF2ZSBiZWVuIHNldCAKaW4gY21kbGluZSwgc28gaXQg d2lsbCBhbHdheXMgYmlnZ2VyIHRoYW4gemVyby4gU28gaW50IGFuZCB1MzIgc2VlbXMgCnNhbWUg aGVyZS5UaGFua3MsCgo+IFsuLi5dCj4+ICtzdGF0aWMgaW50IGhpc2lfcGNpZV9wbXVfZXZlbnRf aW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCj4+ICt7Cj4+ICsJc3RydWN0IGhpc2lfcGNp ZV9wbXUgKnBjaWVfcG11ID0gdG9fcGNpZV9wbXUoZXZlbnQtPnBtdSk7Cj4+ICsKPj4gKwlldmVu dC0+Y3B1ID0gcGNpZV9wbXUtPm9uX2NwdTsKPj4gKwo+PiArCWlmIChldmVudC0+YXR0ci50eXBl ICE9IGV2ZW50LT5wbXUtPnR5cGUpCj4+ICsJCXJldHVybiAtRU5PRU5UOwo+PiArCj4+ICsJLyog U2FtcGxpbmcgaXMgbm90IHN1cHBvcnRlZC4gKi8KPj4gKwlpZiAoaXNfc2FtcGxpbmdfZXZlbnQo ZXZlbnQpIHx8IGV2ZW50LT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKQo+PiArCQly ZXR1cm4gLUVPUE5PVFNVUFA7Cj4+ICsKPj4gKwlpZiAoIWhpc2lfcGNpZV9wbXVfdmFsaWRfZmls dGVyKGV2ZW50LCBwY2llX3BtdSkpIHsKPj4gKwkJcGNpX2VycihwY2llX3BtdS0+cGRldiwgIklu dmFsaWQgZmlsdGVyIVxuIik7Cj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCX0KPiAKPiBbLi4u XQo+PiArLyoKPj4gKyAqIFRoZSBiYW5kd2lkdGgsIGxhdGVuY3ksIGJ1cyB1dGlsaXphdGlvbiBh bmQgYnVmZmVyIG9jY3VwYW5jeSBmZWF0dXJlcyBhcmUKPj4gKyAqIGNhbGN1bGF0ZWQgZnJvbSBk YXRhIGluIEhJU0lfUENJRV9DTlQgYW5kIGV4dGVuZGVkIGRhdGEgaW4gSElTSV9QQ0lFX0VYVF9D TlQuCj4+ICsgKiBPdGhlciBmZWF0dXJlcyBhcmUgb2J0YWluZWQgb25seSBieSBISVNJX1BDSUVf Q05ULgo+PiArICogU28gZGF0YSBhbmQgZGF0YV9leHQgYXJlIHByb2Nlc3NlZCBpbiB0aGlzIGZ1 bmN0aW9uIHRvIGdldCBwZXJmb3JtYW5hY2UKPj4gKyAqIHZhbHVlIGxpa2UsIGJhbmR3aWR0aCwg bGF0ZW5jeSwgZXRjLgo+PiArICovCj4gCj4gQSBzbWFsbCB0eXBvIGluIHRoZSB3b3JsZCAicGVy Zm9ybWFuY2UiIGFib3ZlLgo+IAp0aGFua3MsIHdpbGwgZml4IHRoaXMuCj4gWy4uLl0KPj4gK3N0 YXRpYyB1NjQgaGlzaV9wY2llX3BtdV9nZXRfcGVyZm9ybWFuY2Uoc3RydWN0IHBlcmZfZXZlbnQg KmV2ZW50LCB1NjQgZGF0YSwKPj4gKwkJCQkJIHU2NCBkYXRhX2V4dCkKPj4gK3sKPj4gKyNkZWZp bmUgQ09OVkVSVF9EV19UT19CWVRFKHgpCShzaXplb2YodTMyKSAqICh4KSkKPiAKPiBJIHdvdWxk IG1vdmUgdGhpcyBtYWNybyBhdCB0aGUgdG9wIGFsb25nc2lkZSBvdGhlciBjb25zdGFudHMgYW5k IG1hY3JvcywKPiBhcyBoZXJlIGl0IG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkLiAgV2hh dCBkbyB5b3UgdGhpbms/Cj4gCj4gWy4uLl0KPj4gK3N0YXRpYyBpbnQgaGlzaV9wY2llX3BtdV9p cnFfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCj4+ICsJCQkJICAgICAgc3RydWN0IGhp c2lfcGNpZV9wbXUgKnBjaWVfcG11KQo+PiArewo+PiArCWludCBpcnEsIHJldDsKPj4gKwo+PiAr CXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCBQQ0lfSVJRX01TSSk7Cj4+ ICsJaWYgKHJldCA8IDApIHsKPj4gKwkJcGNpX2VycihwZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBN U0kgdmVjdG9ycywgcmV0ID0gJWQhXG4iLCByZXQpOwo+PiArCQlyZXR1cm4gcmV0Owo+PiArCX0K PiAKPiBUaGlzIGlzIGEgbml0cGljaywgc28gZmVlbCBmcmVlIHRvIGlnbm9yZSBpdCwgYnV0IHdo YXQgZG8geW91IHRoaW5rIG9mCj4gY2hhbmdpbmcgdGhpcyAoYW5kIGFsc28gb3RoZXIgbWVzc2Fn ZXMgYWxpa2UpIG1lc3NhZ2UgdG8gYmUsIGZvcgo+IGV4YW1wbGU6Cj4gCj4gICAgcGNpX2Vycihw ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBNU0kgdmVjdG9yczogJWRcbiIsIHJldCk7Cj4gCj4gV2h5 PyAgSSBwZXJzb25hbGx5IGRvbid0IGZpbmQgZGlzcGxheWluZyBhIHJldHVybiBjb2RlL3ZhbHVl IGZvbGxvd2VkIGJ5Cj4gYSBwdW5jdHVhdGlvbiBlYXN5IHRvIHJlYWQsIGVzcGVjaWFsbHkgd2hl biBsb29raW5nIHRocm91Z2ggYSBsb3Qgb2YKPiBsaW5lcyBhbmQgb3RoZXIgbWVzc2FnZXMgaW4g dGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4KPiAKCmdvdCBpdCwgd2lsbCBmaXggdGhpcyBuZXh0IHRp bWUuCj4gWy4uLl0KPj4gKwo+PiArCWlycSA9IHBjaV9pcnFfdmVjdG9yKHBkZXYsIDApOwo+PiAr CXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaGlzaV9wY2llX3BtdV9pcnEsCj4+ICsJCQkgIElSUUZf Tk9CQUxBTkNJTkcgfCBJUlFGX05PX1RIUkVBRCwgImhpc2lfcGNpZV9wbXUiLAo+PiArCQkJICBw Y2llX3BtdSk7Cj4+ICsJaWYgKHJldCkgewo+PiArCQlwY2lfZXJyKHBkZXYsICJGYWlsZWQgdG8g cmVnaXN0ZXIgaXJxLCByZXQgPSAlZCFcbiIsIHJldCk7Cj4+ICsJCXBjaV9mcmVlX2lycV92ZWN0 b3JzKHBkZXYpOwo+PiArCQlyZXR1cm4gcmV0Owo+PiArCX0KPiAKPiBJdCB3b3VsZCBiZSAiSVJR IiBpbiB0aGUgZXJyb3IgbWVzc2FnZSBhYm92ZS4KPiAKb2ssIHdpbGwgY2hhbmdlIHRoaXMsIHRo YW5rcy4KPiBbLi4uXQo+PiArc3RhdGljIGludCBoaXNpX3BjaWVfcG11X29mZmxpbmVfY3B1KHVu c2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQo+PiArewo+PiArCXN0cnVj dCBoaXNpX3BjaWVfcG11ICpwY2llX3BtdSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwKPj4gKwkJ CQkJIHN0cnVjdCBoaXNpX3BjaWVfcG11LCBub2RlKTsKPj4gKwl1bnNpZ25lZCBpbnQgdGFyZ2V0 Owo+PiArCj4+ICsJLyogTm90aGluZyB0byBkbyBpZiB0aGlzIENQVSBkb2Vzbid0IG93biB0aGUg UE1VICovCj4+ICsJaWYgKHBjaWVfcG11LT5vbl9jcHUgIT0gY3B1KQo+PiArCQlyZXR1cm4gMDsK Pj4gKwo+PiArCS8qIENob29zZSBhIG5ldyBDUFUgZnJvbSBhbGwgb25saW5lIGNwdXMuICovCj4+ ICsJdGFyZ2V0ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwo+PiArCWlmICh0YXJn ZXQgPj0gbnJfY3B1X2lkcykgewo+PiArCQlwY2lfZXJyKHBjaWVfcG11LT5wZGV2LCAiVGhlcmUg aXMgbm8gY3B1IHRvIHNldCFcbiIpOwo+PiArCQlyZXR1cm4gMDsKPj4gKwl9Cj4gCj4gVG8gYmUg Y29uc2lzdGVudCwgaXQgd291bGQgYmUgIkNQVXMiIGFuZCAiQ1BVIiBpbiB0aGUgYWJvdmUuCj4g Cj4gWy4uLl0KPj4gK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBoaXNpX3BjaWVfcG11 X2J1c19hdHRyID0KPj4gKwlfX0FUVFIoYnVzLCAwNDQ0LCBoaXNpX3BjaWVfYnVzX3Nob3csIE5V TEwpOwo+IFsuLi5dCj4+ICtzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgaGlzaV9wY2ll X3BtdV9jcHVtYXNrX2F0dHIgPQo+PiArCV9fQVRUUihjcHVtYXNrLCAwNDQ0LCBoaXNpX3BjaWVf Y3B1bWFza19zaG93LCBOVUxMKTsKPiBbLi4uXQo+PiArc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0 cmlidXRlIGhpc2lfcGNpZV9wbXVfaWRlbnRpZmllcl9hdHRyID0KPj4gKwlfX0FUVFIoaWRlbnRp ZmllciwgMDQ0NCwgaGlzaV9wY2llX2lkZW50aWZpZXJfc2hvdywgTlVMTCk7Cj4gCj4gV291bGQg aXQgYmUgYXQgcG9zc2libGUgZm9yIGFueSBvZiB0aGUgYWJvdmUgX19BVFRSKCkgbWFjcm9zIHRv IGJlCj4gcmVwbGFjZWQgd2l0aCB0aGUgREVWSUNFX0FUVFJfUk8oKSBtYWNybz8gIE9yIHBlcmhh cHMgd2l0aCBfX0FUVFJfUk8oKQo+IGlmIHRoZSBvdGhlciBvbmUgd291bGQgYmUgYSBnb29kIGZp dD8KPiAKeWVz77yMIERFVklDRV9BVFRSX1JPKCkgbWFjcm8gY291bGQgYmUgdXNlZCBoZXJlLCB0 aGFua3MuCj4gWy4uLl0KPj4gK3N0YXRpYyBpbnQgaGlzaV9wY2llX2luaXRfZGV2KHN0cnVjdCBw Y2lfZGV2ICpwZGV2KQo+PiArewo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlyZXQgPSBwY2lfZW5h YmxlX2RldmljZShwZGV2KTsKPj4gKwlpZiAocmV0KSB7Cj4+ICsJCXBjaV9lcnIocGRldiwgIkZh aWxlZCB0byBlbmFibGUgcGNpIGRldmljZSwgcmV0ID0gJWQuXG4iLCByZXQpOwo+PiArCQlyZXR1 cm4gcmV0Owo+PiArCX0KPj4gKwo+PiArCXJldCA9IHBjaV9yZXF1ZXN0X21lbV9yZWdpb25zKHBk ZXYsICJoaXNpX3BjaWVfcG11Iik7Cj4+ICsJaWYgKHJldCA8IDApIHsKPj4gKwkJcGNpX2Vycihw ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgcGNpIG1lbSByZWdpb25zLCByZXQgPSAlZC5cbiIsCj4+ ICsJCQlyZXQpOwo+PiArCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cj4+ICsJCXJldHVybiBy ZXQ7Cj4+ICsJfQo+IAo+IEl0IHdvdWxkIGJlICJQQ0kiIGluIGJvdGggZXJyb3IgbWVzc2FnZXMg YWJvdmUuCj4gCndpbGwgZml4IGl0LgoKPiBbLi4uXQo+PiArc3RhdGljIGludCBfX2luaXQgaGlz aV9wY2llX21vZHVsZV9pbml0KHZvaWQpCj4+ICt7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCXJl dCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX1BFUkZfQVJNX0hJU0lfUENJRV9Q TVVfT05MSU5FLAo+PiArCQkJCSAgICAgICJBUF9QRVJGX0FSTV9ISVNJX1BDSUVfUE1VX09OTElO RSIsCj4+ICsJCQkJICAgICAgaGlzaV9wY2llX3BtdV9vbmxpbmVfY3B1LAo+PiArCQkJCSAgICAg IGhpc2lfcGNpZV9wbXVfb2ZmbGluZV9jcHUpOwo+PiArCWlmIChyZXQpIHsKPj4gKwkJcHJfZXJy KCJGYWlsZWQgdG8gc2V0dXAgUENJRSBQTVUgaG90cGx1ZywgcmV0ID0gJWQuXG4iLCByZXQpOwo+ PiArCQlyZXR1cm4gcmV0Owo+PiArCX0KPiAKPiBJdCB3b3VsZCBiZSAiUENJZSIgaW4gdGhlIGVy cm9yIG1lc3NhZ2UgYWJvdmUuCj4gCndpbGwgZml4IGl0LgpUaGFua3MsClFpCj4gCUtyenlzenRv Zgo+IC4KPiAKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==