From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 7CE1F23B3 for ; Thu, 24 Nov 2022 09:00:40 +0000 (UTC) Received: by mail-pf1-f172.google.com with SMTP id w129so1096030pfb.5 for ; Thu, 24 Nov 2022 01:00:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=w+w4tmZDiPM69E7coV2CH15uQShu4W0QLk13WRdoYqo=; b=dD5T/z9NKIJhTp/gaxnDGrU96mZ28E5PpqSuka/NwlG93DRTeTfBa75wdv99Fncy8D puavEF4RcN5c2+Y35jocuaOW69CtUX+kkBEPhWsa0eGlGNPUCoHrwrUgLL5xC/puH3FM q81wpISgFha+xw6j6WpjkF0/Kkt+KyMMNf/UgPGc1V9Q3kcuMkG2xO8Z6MCBYeT15/8S j15flgsrb0Em9z5rcHvTlnMyD36xcdaPycMktGq18iOKEnrm1y+TCYKBGge3vWd39AWe 9nKKii5tMvSfR4TvKT7SiYnX5aczyB5llNYPkWBlfVp2ZziByxguNNW59TcJytD7KMC+ DW/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w+w4tmZDiPM69E7coV2CH15uQShu4W0QLk13WRdoYqo=; b=EmUQYn4ReLNXlwldKrtcaJ0+Bmj8AQwzc4AZw4Xlvt4zK2/RtcIVGaIJiXcqPv8Bc2 dmb55T1pzXGHtWXo8vtGTUg8bKRY4O8Eyr1V+aOXZoJAW2q9bvlYZxBox/gQKR27O+wM dhgC8YJCQ0IFkg1qdXu/5K4pn/VEo01Lr4IepiCGkSmCyT/tQvELIOrA4s4jh2RG3DFM vmqodm/nBQa2eckD5SP672bA5zmI6ausAOQNEDEeRDALZAqSSSozb+4J575iaxGz0H6Q Qg10Q58MEPVyeZjd4QLMsok/TpIYTqYfxdzltoFSeujatGwdgJ4/LQYa2AqHW+U3d6qL tlPg== X-Gm-Message-State: ANoB5pnODrj1iVhPWoUrE+UYBxPxSSGCND4/de+MjpXXa2JFXBcCdkWL HI68DItpXR3vo+ONeMjN6CXU X-Google-Smtp-Source: AA0mqf61Q3kR3fx0rJaTtcPJhpcU3lR6pU8IQfMAubF9oJ8HCJATlfXwTnvlGQZa466xICWBLj/+jQ== X-Received: by 2002:a63:f241:0:b0:46f:da0:f093 with SMTP id d1-20020a63f241000000b0046f0da0f093mr10972642pgk.441.1669280439701; Thu, 24 Nov 2022 01:00:39 -0800 (PST) Received: from thinkpad ([59.92.97.13]) by smtp.gmail.com with ESMTPSA id g16-20020aa796b0000000b005385e2e86eesm700314pfk.18.2022.11.24.01.00.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Nov 2022 01:00:38 -0800 (PST) Date: Thu, 24 Nov 2022 14:30:28 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: lpieralisi@kernel.org, aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@ti.com, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lznuaa@gmail.com, maz@kernel.org, ntb@lists.linux.dev, peng.fan@nxp.com, robh+dt@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v13 2/2] PCI: endpoint: pci-epf-vntb: using platform MSI as doorbell Message-ID: <20221124090028.GC5119@thinkpad> References: <20221124055036.1630573-1-Frank.Li@nxp.com> <20221124055036.1630573-3-Frank.Li@nxp.com> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20221124055036.1630573-3-Frank.Li@nxp.com> On Thu, Nov 24, 2022 at 12:50:36AM -0500, Frank Li wrote: > ┌────────────┐ ┌───────────────────────────────────┐ ┌────────────────┐ > │ │ │ │ │ │ > │ │ │ PCI Endpoint │ │ PCI Host │ > │ │ │ │ │ │ > │ │◄──┤ 1.platform_msi_domain_alloc_irqs()│ │ │ > │ │ │ │ │ │ > │ MSI ├──►│ 2.write_msi_msg() ├──►├─BAR │ > │ Controller │ │ update doorbell register address│ │ │ > │ │ │ for BAR │ │ │ > │ │ │ │ │ 3. Write BAR│ > │ │◄──┼───────────────────────────────────┼───┤ │ > │ │ │ │ │ │ > │ ├──►│ 4.Irq Handle │ │ │ > │ │ │ │ │ │ > │ │ │ │ │ │ > └────────────┘ └───────────────────────────────────┘ └────────────────┘ > There are at least couple of BAR regions used in this patch but they were not mentioned in the above diagram. The subject should be: "PCI: endpoint: pci-epf-vntb: Use EP MSI controller to handle DB from host" > Using platform MSI interrupt controller as endpoint(EP)'s doorbell. > Above line is not needed. > The memory assigned for BAR region by the PCI host is mapped to the Which BAR? (BAR 1 aka. DB BAR)? There are multiple BAR regions exposed by this function driver. > message address of platform msi interrupt controller in PCI Endpoint. s/msi/MSI. Also, use either Endpoint or EP, pick one but not both. > Such that, whenever the PCI host writes to the BAR region, it will > trigger an IRQ in the EP. > > Basic working follow as "work flow is"? > 1. EP function driver call platform_msi_domain_alloc_irqs() alloc a pci-epf-vntb function driver calls platform_msi_domain_alloc_irqs() to allocate MSI's from the platform MSI controller. > MSI irq from MSI controller with call back function write_msi_msg(); > 2. write_msg_msg will config BAR and map to address defined in msi_msg; The epf_ntb_write_msi_msg() passed as a callback will write the offset of the MSI controller's MSI address dedicated for each MSI to the doorbell register db_offset and also writes the MSI data to db_data register in the CTRL BAR region. > 3. Host side trigger an IRQ at Endpoint by write to BAR region. > Finally, the host can trigger doorbell by reading the offset of the doorbell from db_offset register and writing the data read from db_data register in CTRL BAR region to the computed address in the DB BAR region. > Add MSI doorbell support for pci-epf-vntb. Query if system has an MSI > controller. Set up doorbell address according to struct msi_msg. > > So PCI host can write this doorbell address to trigger EP side's IRQ. > > If no MSI controller exists, fall back to software polling. > "Add doorbell support to pci-epf-vntb function driver making use of the platform MSI controller. If the MSI controller is not available, fallback to the polling method." Also, please move this paragraph to the beginning of the description. > Signed-off-by: Frank Li > --- > drivers/pci/endpoint/functions/pci-epf-vntb.c | 146 +++++++++++++++--- > 1 file changed, 125 insertions(+), 21 deletions(-) > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c > index 0d744975f815..f770a068e58c 100644 > --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c > +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c > @@ -44,6 +44,7 @@ > #include > #include > #include > +#include > > static struct workqueue_struct *kpcintb_workqueue; > > @@ -137,11 +138,14 @@ struct epf_ntb { > struct epf_ntb_ctrl *reg; > > u32 *epf_db; > + phys_addr_t epf_db_phys; > > phys_addr_t vpci_mw_phy[MAX_MW]; > void __iomem *vpci_mw_addr[MAX_MW]; > > struct delayed_work cmd_handler; > + > + int msi_virqbase; > }; You should add kernel doc comments for this struct in a separate patch. It will help in understanding the driver better. > > #define to_epf_ntb(epf_group) container_of((epf_group), struct epf_ntb, group) > @@ -256,11 +260,13 @@ static void epf_ntb_cmd_handler(struct work_struct *work) > > ntb = container_of(work, struct epf_ntb, cmd_handler.work); > > - for (i = 1; i < ntb->db_count; i++) { > - if (ntb->epf_db[i]) { > - ntb->db |= 1 << (i - 1); > - ntb_db_event(&ntb->ntb, i); > - ntb->epf_db[i] = 0; A comment here stating that polling is implemented would be better. > + if (!ntb->epf_db_phys) { > + for (i = 1; i < ntb->db_count; i++) { > + if (ntb->epf_db[i]) { > + ntb->db |= 1 << (i - 1); > + ntb_db_event(&ntb->ntb, i); > + ntb->epf_db[i] = 0; > + } > } > } > > @@ -518,6 +524,28 @@ static int epf_ntb_configure_interrupt(struct epf_ntb *ntb) > return 0; > } > > +static int epf_ntb_db_size(struct epf_ntb *ntb) > +{ > + const struct pci_epc_features *epc_features; > + size_t size = sizeof(u32) * ntb->db_count; > + u32 align; > + > + epc_features = pci_epc_get_features(ntb->epf->epc, > + ntb->epf->func_no, > + ntb->epf->vfunc_no); > + align = epc_features->align; > + > + if (size < 128) Shouldn't this be (size > 128)? > + size = 128; > + > + if (align) > + size = ALIGN(size, align); > + else > + size = roundup_pow_of_two(size); > + > + return size; > +} > + > /** > * epf_ntb_db_bar_init() - Configure Doorbell window BARs > * @ntb: NTB device that facilitates communication between HOST and VHOST > @@ -539,27 +567,26 @@ static int epf_ntb_db_bar_init(struct epf_ntb *ntb) > ntb->epf->func_no, > ntb->epf->vfunc_no); > align = epc_features->align; > - > - if (size < 128) > - size = 128; > - > - if (align) > - size = ALIGN(size, align); > - else > - size = roundup_pow_of_two(size); > + size = epf_ntb_db_size(ntb); > > barno = ntb->epf_ntb_bar[BAR_DB]; > + epf_bar = &ntb->epf->bar[barno]; > > - mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0); > - if (!mw_addr) { > - dev_err(dev, "Failed to allocate OB address\n"); > - return -ENOMEM; > + if (ntb->epf_db_phys) { > + mw_addr = NULL; > + epf_bar->phys_addr = ntb->epf_db_phys; > + epf_bar->barno = barno; > + epf_bar->size = size; > + } else { > + mw_addr = pci_epf_alloc_space(ntb->epf, size, barno, align, 0); > + if (!mw_addr) { > + dev_err(dev, "Failed to allocate doorbell address\n"); > + return -ENOMEM; > + } > } > > ntb->epf_db = mw_addr; > > - epf_bar = &ntb->epf->bar[barno]; > - > ret = pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, ntb->epf->vfunc_no, epf_bar); > if (ret) { > dev_err(dev, "Doorbell BAR set failed\n"); > @@ -728,6 +755,82 @@ static int epf_ntb_init_epc_bar(struct epf_ntb *ntb) > return 0; > } > > +static irqreturn_t epf_ntb_interrupt_handler(int irq, void *data) Shouldn't this function also be guarded? > +{ > + struct epf_ntb *ntb = data; > + int index; > + > + index = irq - ntb->msi_virqbase; > + ntb->db |= 1 << (index - 1); > + ntb_db_event(&ntb->ntb, index); > + > + return IRQ_HANDLED; > +} > + > +#ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN It'd be better to use the relevant commit description as a comment here. > +static void epf_ntb_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) > +{ > + struct epf_ntb *ntb = dev_get_drvdata(desc->dev); > + struct epf_ntb_ctrl *reg = ntb->reg; > + int size = epf_ntb_db_size(ntb); > + u64 addr; > + > + addr = msg->address_hi; > + addr <<= 32; > + addr |= msg->address_lo; > + > + reg->db_data[desc->msi_index] = msg->data; > + A comment stating that the base address to be used as the DB BAR is set here would be useful too. > + if (!desc->msi_index) > + ntb->epf_db_phys = round_down(addr, size); > + > + reg->db_offset[desc->msi_index] = addr - ntb->epf_db_phys; > +} > + > +static void epf_ntb_epc_msi_init(struct epf_ntb *ntb) > +{ > + struct device *dev = &ntb->epf->dev; > + struct irq_domain *domain; > + int virq; > + int ret; > + int i; > + > + domain = dev_get_msi_domain(ntb->epf->epc->dev.parent); > + if (!domain) > + return; > + > + dev_set_msi_domain(dev, domain); > + > + if (platform_msi_domain_alloc_irqs(&ntb->epf->dev, > + ntb->db_count, > + epf_ntb_write_msi_msg)) { Please wrap above two in a single line till 100 column limit. > + dev_err(dev, "Can't allocate MSI, falling back to polling mode\n"); This should be dev_dbg(). > + return; > + } > + dev_dbg(dev, "Using MSI as doorbell\n"); > + > + for (i = 0; i < ntb->db_count; i++) { > + virq = msi_get_virq(dev, i); > + ret = devm_request_irq(dev, virq, > + epf_ntb_interrupt_handler, 0, > + "pci_epf_vntb", ntb); > + > + if (ret) { > + dev_err(dev, "Failed to request doorbell IRQ! Falling back to polling mode"); Again, dev_dbg() > + ntb->epf_db_phys = 0; > + platform_msi_domain_free_irqs(&ntb->epf->dev); > + break; > + } > + > + if (!i) > + ntb->msi_virqbase = virq; /* msi start virq number */ > + } > +} > +#else Since this is not exposed as an API, just end the ifdef here and... > +static void epf_ntb_epc_msi_init(struct epf_ntb *ntb) > +{ > +} > +#endif /* CONFIG_GENERIC_MSI_IRQ_DOMAIN */ > /** > * epf_ntb_epc_init() - Initialize NTB interface > * @ntb: NTB device that facilitates communication between HOST and VHOST > @@ -1336,14 +1439,15 @@ static int epf_ntb_bind(struct pci_epf *epf) > goto err_bar_alloc; > } > > + epf_set_drvdata(epf, ntb); > + epf_ntb_epc_msi_init(ntb); Guard this function instead: #ifdef CONFIG_GENERIC_MSI_IRQ_DOMAIN epf_ntb_epc_msi_init(ntb); #endif Thanks, Mani > + > ret = epf_ntb_epc_init(ntb); > if (ret) { > dev_err(dev, "Failed to initialize EPC\n"); > goto err_bar_alloc; > } > > - epf_set_drvdata(epf, ntb); > - > pci_space[0] = (ntb->vntb_pid << 16) | ntb->vntb_vid; > pci_vntb_table[0].vendor = ntb->vntb_vid; > pci_vntb_table[0].device = ntb->vntb_pid; > -- > 2.34.1 > -- மணிவண்ணன் சதாசிவம் 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 0AC4AC433FE for ; Thu, 24 Nov 2022 09:02:07 +0000 (UTC) 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:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=vOeLXeIEo7TP5rwOBY2yUw4aeGhuxmc2YN1sYvIiY+w=; b=JbV5xu62up07zZ PgfXZT+JZKa8lTgmjNNFt9YQFSK5beEfP/KR1VmgnMq2KVNFiPPpx6vdPJfVXwsgQMycYBnATaDoz WUgq3UPo4QHc3GDN1BYV8nEom+pjZPnCsxiaeum76g/u2x3ZGveGGk5MoA+B8OTYOwakXb16tc6tg UoOwcJD77xhS2zrar6C/kN2kj6JPaDfyJU4nwvE4Od0TUs2Ch7RbcM1uKT2caUnXEeqyt3ikNTQj+ 2i6E4SZi6bMJq7xctjEBd2YW/yyx3Q5nE8HJ5csaBlGTNEmUHz48dh3+u8QrRhPQEy79PFjXFR15q 9yo+rWFqRlyK+L0CtjZw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oy86A-006nlt-UG; Thu, 24 Nov 2022 09:00:47 +0000 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oy866-006ngz-K8 for linux-arm-kernel@lists.infradead.org; Thu, 24 Nov 2022 09:00:44 +0000 Received: by mail-pg1-x52e.google.com with SMTP id r18so1037334pgr.12 for ; Thu, 24 Nov 2022 01:00:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=w+w4tmZDiPM69E7coV2CH15uQShu4W0QLk13WRdoYqo=; b=dD5T/z9NKIJhTp/gaxnDGrU96mZ28E5PpqSuka/NwlG93DRTeTfBa75wdv99Fncy8D puavEF4RcN5c2+Y35jocuaOW69CtUX+kkBEPhWsa0eGlGNPUCoHrwrUgLL5xC/puH3FM q81wpISgFha+xw6j6WpjkF0/Kkt+KyMMNf/UgPGc1V9Q3kcuMkG2xO8Z6MCBYeT15/8S j15flgsrb0Em9z5rcHvTlnMyD36xcdaPycMktGq18iOKEnrm1y+TCYKBGge3vWd39AWe 9nKKii5tMvSfR4TvKT7SiYnX5aczyB5llNYPkWBlfVp2ZziByxguNNW59TcJytD7KMC+ DW/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w+w4tmZDiPM69E7coV2CH15uQShu4W0QLk13WRdoYqo=; b=gtgvbHyGX8HySdr5olH4PbeTMQqq7aCtQMEcGv66b6nry6p7jdH9y3uU/NTJvgNU4t zQWJzDGd+nE66syZYeLOOoLeR89tpOqbG3Xn+P4ollf96TQPUdOEzvvYMs17WT5nr4+s 433Uz0ArKq0O3nighdGqqrSU7Q/pEmDDdGVqQorVzIAdhBr3EozqnhL7XEwfvIlV3uk8 q0/BKBIR7d3VmLHkbSGtYbocVTGOupK0e9y3Xm4TMCLYEJT8vbHLJNn72ch6d5d5Eb+b DHt5pGX5tOnpYuP+BIG+ZOmfZ73z47wdNSysG4y+PotaqHJuuW2UUrVAGNaXhCpuP+Q4 1voA== X-Gm-Message-State: ANoB5pknwwRnmvEgrYTmMo2kL5GYlh69c1DDi9YBPPguR92ZG3p+iNX8 iW7Od9VzSUfDKPVKrBxrszKz X-Google-Smtp-Source: AA0mqf61Q3kR3fx0rJaTtcPJhpcU3lR6pU8IQfMAubF9oJ8HCJATlfXwTnvlGQZa466xICWBLj/+jQ== X-Received: by 2002:a63:f241:0:b0:46f:da0:f093 with SMTP id d1-20020a63f241000000b0046f0da0f093mr10972642pgk.441.1669280439701; Thu, 24 Nov 2022 01:00:39 -0800 (PST) Received: from thinkpad ([59.92.97.13]) by smtp.gmail.com with ESMTPSA id g16-20020aa796b0000000b005385e2e86eesm700314pfk.18.2022.11.24.01.00.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Nov 2022 01:00:38 -0800 (PST) Date: Thu, 24 Nov 2022 14:30:28 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: lpieralisi@kernel.org, aisheng.dong@nxp.com, bhelgaas@google.com, devicetree@vger.kernel.org, festevam@gmail.com, imx@lists.linux.dev, jdmason@kudzu.us, kernel@pengutronix.de, kishon@ti.com, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, lznuaa@gmail.com, maz@kernel.org, ntb@lists.linux.dev, peng.fan@nxp.com, robh+dt@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v13 2/2] PCI: endpoint: pci-epf-vntb: using platform MSI as doorbell Message-ID: <20221124090028.GC5119@thinkpad> References: <20221124055036.1630573-1-Frank.Li@nxp.com> <20221124055036.1630573-3-Frank.Li@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20221124055036.1630573-3-Frank.Li@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221124_010042_776744_8CA699C1 X-CRM114-Status: GOOD ( 43.47 ) 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-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 T24gVGh1LCBOb3YgMjQsIDIwMjIgYXQgMTI6NTA6MzZBTSAtMDUwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4g4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQICAg4pSM4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCj4g4pSCICAgICAg ICAgICAg4pSCICAg4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgICDi lIIgICAgICAgICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSCICAg4pSCIFBDSSBFbmRw b2ludCAgICAgICAgICAgICAgICAgICAgICDilIIgICDilIIgUENJIEhvc3QgICAgICAg4pSCCj4g 4pSCICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICDilIIgICDilIIgICAgICAgICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSC4peE4pSA 4pSA4pSkIDEucGxhdGZvcm1fbXNpX2RvbWFpbl9hbGxvY19pcnFzKCnilIIgICDilIIgICAgICAg ICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICDilIIgICDilIIgICAgICAgICAgICAgICAg4pSCCj4g4pSCIE1TSSAg ICAgICAg4pSc4pSA4pSA4pa64pSCIDIud3JpdGVfbXNpX21zZygpICAgICAgICAgICAgICAgICDi lJzilIDilIDilrrilJzilIBCQVI8bj4gICAgICAgICDilIIKPiDilIIgQ29udHJvbGxlciDilIIg ICDilIIgICB1cGRhdGUgZG9vcmJlbGwgcmVnaXN0ZXIgYWRkcmVzc+KUgiAgIOKUgiAgICAgICAg ICAgICAgICDilIIKPiDilIIgICAgICAgICAgICDilIIgICDilIIgICBmb3IgQkFSICAgICAgICAg ICAgICAgICAgICAgICAgIOKUgiAgIOKUgiAgICAgICAgICAgICAgICDilIIKPiDilIIgICAgICAg ICAgICDilIIgICDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiAgIOKU giAzLiBXcml0ZSBCQVI8bj7ilIIKPiDilIIgICAgICAgICAgICDilILil4TilIDilIDilLzilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDi lKQgICAgICAgICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgICDilIIgICAgICAgICAgICAgICAg4pSCCj4g 4pSCICAgICAgICAgICAg4pSc4pSA4pSA4pa64pSCIDQuSXJxIEhhbmRsZSAgICAgICAgICAgICAg ICAgICAgICDilIIgICDilIIgICAgICAgICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSC ICAg4pSCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgICDilIIgICAgICAg ICAgICAgICAg4pSCCj4g4pSCICAgICAgICAgICAg4pSCICAg4pSCICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICDilIIgICDilIIgICAgICAgICAgICAgICAg4pSCCj4g4pSU4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYCj4gCgpUaGVyZSBhcmUgYXQgbGVhc3Qg Y291cGxlIG9mIEJBUiByZWdpb25zIHVzZWQgaW4gdGhpcyBwYXRjaCBidXQgdGhleSB3ZXJlIG5v dAptZW50aW9uZWQgaW4gdGhlIGFib3ZlIGRpYWdyYW0uCgpUaGUgc3ViamVjdCBzaG91bGQgYmU6 CgoiUENJOiBlbmRwb2ludDogcGNpLWVwZi12bnRiOiBVc2UgRVAgTVNJIGNvbnRyb2xsZXIgdG8g aGFuZGxlIERCIGZyb20gaG9zdCIKCj4gVXNpbmcgcGxhdGZvcm0gTVNJIGludGVycnVwdCBjb250 cm9sbGVyIGFzIGVuZHBvaW50KEVQKSdzIGRvb3JiZWxsLgo+IAoKQWJvdmUgbGluZSBpcyBub3Qg bmVlZGVkLgoKPiBUaGUgbWVtb3J5IGFzc2lnbmVkIGZvciBCQVIgcmVnaW9uIGJ5IHRoZSBQQ0kg aG9zdCBpcyBtYXBwZWQgdG8gdGhlCgpXaGljaCBCQVI/IChCQVIgMSBha2EuIERCIEJBUik/IFRo ZXJlIGFyZSBtdWx0aXBsZSBCQVIgcmVnaW9ucyBleHBvc2VkIGJ5IHRoaXMgZnVuY3Rpb24gZHJp dmVyLgoKPiBtZXNzYWdlIGFkZHJlc3Mgb2YgcGxhdGZvcm0gbXNpIGludGVycnVwdCBjb250cm9s bGVyIGluIFBDSSBFbmRwb2ludC4KCnMvbXNpL01TSS4gQWxzbywgdXNlIGVpdGhlciBFbmRwb2lu dCBvciBFUCwgcGljayBvbmUgYnV0IG5vdCBib3RoLgoKPiBTdWNoIHRoYXQsIHdoZW5ldmVyIHRo ZSBQQ0kgaG9zdCB3cml0ZXMgdG8gdGhlIEJBUiByZWdpb24sIGl0IHdpbGwKPiB0cmlnZ2VyIGFu IElSUSBpbiB0aGUgRVAuCj4gCj4gQmFzaWMgd29ya2luZyBmb2xsb3cgYXMKCiJ3b3JrIGZsb3cg aXMiPwoKPiAxLiBFUCBmdW5jdGlvbiBkcml2ZXIgY2FsbCBwbGF0Zm9ybV9tc2lfZG9tYWluX2Fs bG9jX2lycXMoKSBhbGxvYyBhCgpwY2ktZXBmLXZudGIgZnVuY3Rpb24gZHJpdmVyIGNhbGxzIHBs YXRmb3JtX21zaV9kb21haW5fYWxsb2NfaXJxcygpIHRvIGFsbG9jYXRlCk1TSSdzIGZyb20gdGhl IHBsYXRmb3JtIE1TSSBjb250cm9sbGVyLgoKPiBNU0kgaXJxIGZyb20gTVNJIGNvbnRyb2xsZXIg d2l0aCBjYWxsIGJhY2sgZnVuY3Rpb24gd3JpdGVfbXNpX21zZygpOwo+IDIuIHdyaXRlX21zZ19t c2cgd2lsbCBjb25maWcgQkFSIGFuZCBtYXAgdG8gYWRkcmVzcyBkZWZpbmVkIGluIG1zaV9tc2c7 CgpUaGUgZXBmX250Yl93cml0ZV9tc2lfbXNnKCkgcGFzc2VkIGFzIGEgY2FsbGJhY2sgd2lsbCB3 cml0ZSB0aGUgb2Zmc2V0IG9mIHRoZQpNU0kgY29udHJvbGxlcidzIE1TSSBhZGRyZXNzIGRlZGlj YXRlZCBmb3IgZWFjaCBNU0kgdG8gdGhlIGRvb3JiZWxsIHJlZ2lzdGVyCmRiX29mZnNldCBhbmQg YWxzbyB3cml0ZXMgdGhlIE1TSSBkYXRhIHRvIGRiX2RhdGEgcmVnaXN0ZXIgaW4gdGhlIENUUkwg QkFSCnJlZ2lvbi4KCj4gMy4gSG9zdCBzaWRlIHRyaWdnZXIgYW4gSVJRIGF0IEVuZHBvaW50IGJ5 IHdyaXRlIHRvIEJBUiByZWdpb24uCj4gCgpGaW5hbGx5LCB0aGUgaG9zdCBjYW4gdHJpZ2dlciBk b29yYmVsbCBieSByZWFkaW5nIHRoZSBvZmZzZXQgb2YgdGhlIGRvb3JiZWxsCmZyb20gZGJfb2Zm c2V0IHJlZ2lzdGVyIGFuZCB3cml0aW5nIHRoZSBkYXRhIHJlYWQgZnJvbSBkYl9kYXRhIHJlZ2lz dGVyIGluIENUUkwKQkFSIHJlZ2lvbiB0byB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbiB0aGUgREIg QkFSIHJlZ2lvbi4KCj4gQWRkIE1TSSBkb29yYmVsbCBzdXBwb3J0IGZvciBwY2ktZXBmLXZudGIu IFF1ZXJ5IGlmIHN5c3RlbSBoYXMgYW4gTVNJCj4gY29udHJvbGxlci4gU2V0IHVwIGRvb3JiZWxs IGFkZHJlc3MgYWNjb3JkaW5nIHRvIHN0cnVjdCBtc2lfbXNnLgo+IAo+IFNvIFBDSSBob3N0IGNh biB3cml0ZSB0aGlzIGRvb3JiZWxsIGFkZHJlc3MgdG8gdHJpZ2dlciBFUCBzaWRlJ3MgSVJRLgo+ IAo+IElmIG5vIE1TSSBjb250cm9sbGVyIGV4aXN0cywgZmFsbCBiYWNrIHRvIHNvZnR3YXJlIHBv bGxpbmcuCj4gCgoiQWRkIGRvb3JiZWxsIHN1cHBvcnQgdG8gcGNpLWVwZi12bnRiIGZ1bmN0aW9u IGRyaXZlciBtYWtpbmcgdXNlIG9mIHRoZSBwbGF0Zm9ybQpNU0kgY29udHJvbGxlci4gSWYgdGhl IE1TSSBjb250cm9sbGVyIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxiYWNrIHRvIHRoZSBwb2xsaW5n Cm1ldGhvZC4iCgpBbHNvLCBwbGVhc2UgbW92ZSB0aGlzIHBhcmFncmFwaCB0byB0aGUgYmVnaW5u aW5nIG9mIHRoZSBkZXNjcmlwdGlvbi4KCj4gU2lnbmVkLW9mZi1ieTogRnJhbmsgTGkgPEZyYW5r LkxpQG54cC5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvcGNpL2VuZHBvaW50L2Z1bmN0aW9ucy9wY2kt ZXBmLXZudGIuYyB8IDE0NiArKysrKysrKysrKysrKystLS0KPiAgMSBmaWxlIGNoYW5nZWQsIDEy NSBpbnNlcnRpb25zKCspLCAyMSBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVy cy9wY2kvZW5kcG9pbnQvZnVuY3Rpb25zL3BjaS1lcGYtdm50Yi5jIGIvZHJpdmVycy9wY2kvZW5k cG9pbnQvZnVuY3Rpb25zL3BjaS1lcGYtdm50Yi5jCj4gaW5kZXggMGQ3NDQ5NzVmODE1Li5mNzcw YTA2OGU1OGMgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wY2kvZW5kcG9pbnQvZnVuY3Rpb25zL3Bj aS1lcGYtdm50Yi5jCj4gKysrIGIvZHJpdmVycy9wY2kvZW5kcG9pbnQvZnVuY3Rpb25zL3BjaS1l cGYtdm50Yi5jCj4gQEAgLTQ0LDYgKzQ0LDcgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L3BjaS1lcGMu aD4KPiAgI2luY2x1ZGUgPGxpbnV4L3BjaS1lcGYuaD4KPiAgI2luY2x1ZGUgPGxpbnV4L250Yi5o Pgo+ICsjaW5jbHVkZSA8bGludXgvbXNpLmg+Cj4gIAo+ICBzdGF0aWMgc3RydWN0IHdvcmtxdWV1 ZV9zdHJ1Y3QgKmtwY2ludGJfd29ya3F1ZXVlOwo+ICAKPiBAQCAtMTM3LDExICsxMzgsMTQgQEAg c3RydWN0IGVwZl9udGIgewo+ICAJc3RydWN0IGVwZl9udGJfY3RybCAqcmVnOwo+ICAKPiAgCXUz MiAqZXBmX2RiOwo+ICsJcGh5c19hZGRyX3QgZXBmX2RiX3BoeXM7Cj4gIAo+ICAJcGh5c19hZGRy X3QgdnBjaV9td19waHlbTUFYX01XXTsKPiAgCXZvaWQgX19pb21lbSAqdnBjaV9td19hZGRyW01B WF9NV107Cj4gIAo+ICAJc3RydWN0IGRlbGF5ZWRfd29yayBjbWRfaGFuZGxlcjsKPiArCj4gKwlp bnQgbXNpX3ZpcnFiYXNlOwo+ICB9OwoKWW91IHNob3VsZCBhZGQga2VybmVsIGRvYyBjb21tZW50 cyBmb3IgdGhpcyBzdHJ1Y3QgaW4gYSBzZXBhcmF0ZSBwYXRjaC4gSXQgd2lsbApoZWxwIGluIHVu ZGVyc3RhbmRpbmcgdGhlIGRyaXZlciBiZXR0ZXIuCgo+ICAKPiAgI2RlZmluZSB0b19lcGZfbnRi KGVwZl9ncm91cCkgY29udGFpbmVyX29mKChlcGZfZ3JvdXApLCBzdHJ1Y3QgZXBmX250YiwgZ3Jv dXApCj4gQEAgLTI1NiwxMSArMjYwLDEzIEBAIHN0YXRpYyB2b2lkIGVwZl9udGJfY21kX2hhbmRs ZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICAKPiAgCW50YiA9IGNvbnRhaW5lcl9vZih3 b3JrLCBzdHJ1Y3QgZXBmX250YiwgY21kX2hhbmRsZXIud29yayk7Cj4gIAo+IC0JZm9yIChpID0g MTsgaSA8IG50Yi0+ZGJfY291bnQ7IGkrKykgewo+IC0JCWlmIChudGItPmVwZl9kYltpXSkgewo+ IC0JCQludGItPmRiIHw9IDEgPDwgKGkgLSAxKTsKPiAtCQkJbnRiX2RiX2V2ZW50KCZudGItPm50 YiwgaSk7Cj4gLQkJCW50Yi0+ZXBmX2RiW2ldID0gMDsKCkEgY29tbWVudCBoZXJlIHN0YXRpbmcg dGhhdCBwb2xsaW5nIGlzIGltcGxlbWVudGVkIHdvdWxkIGJlIGJldHRlci4KCj4gKwlpZiAoIW50 Yi0+ZXBmX2RiX3BoeXMpIHsKPiArCQlmb3IgKGkgPSAxOyBpIDwgbnRiLT5kYl9jb3VudDsgaSsr KSB7Cj4gKwkJCWlmIChudGItPmVwZl9kYltpXSkgewo+ICsJCQkJbnRiLT5kYiB8PSAxIDw8IChp IC0gMSk7Cj4gKwkJCQludGJfZGJfZXZlbnQoJm50Yi0+bnRiLCBpKTsKPiArCQkJCW50Yi0+ZXBm X2RiW2ldID0gMDsKPiArCQkJfQo+ICAJCX0KPiAgCX0KPiAgCj4gQEAgLTUxOCw2ICs1MjQsMjgg QEAgc3RhdGljIGludCBlcGZfbnRiX2NvbmZpZ3VyZV9pbnRlcnJ1cHQoc3RydWN0IGVwZl9udGIg Km50YikKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW50IGVwZl9udGJfZGJfc2l6 ZShzdHJ1Y3QgZXBmX250YiAqbnRiKQo+ICt7Cj4gKwljb25zdCBzdHJ1Y3QgcGNpX2VwY19mZWF0 dXJlcyAqZXBjX2ZlYXR1cmVzOwo+ICsJc2l6ZV90IHNpemUgPSBzaXplb2YodTMyKSAqIG50Yi0+ ZGJfY291bnQ7Cj4gKwl1MzIgYWxpZ247Cj4gKwo+ICsJZXBjX2ZlYXR1cmVzID0gcGNpX2VwY19n ZXRfZmVhdHVyZXMobnRiLT5lcGYtPmVwYywKPiArCQkJCQkgICAgbnRiLT5lcGYtPmZ1bmNfbm8s Cj4gKwkJCQkJICAgIG50Yi0+ZXBmLT52ZnVuY19ubyk7Cj4gKwlhbGlnbiA9IGVwY19mZWF0dXJl cy0+YWxpZ247Cj4gKwo+ICsJaWYgKHNpemUgPCAxMjgpCgpTaG91bGRuJ3QgdGhpcyBiZSAoc2l6 ZSA+IDEyOCk/Cgo+ICsJCXNpemUgPSAxMjg7Cj4gKwo+ICsJaWYgKGFsaWduKQo+ICsJCXNpemUg PSBBTElHTihzaXplLCBhbGlnbik7Cj4gKwllbHNlCj4gKwkJc2l6ZSA9IHJvdW5kdXBfcG93X29m X3R3byhzaXplKTsKPiArCj4gKwlyZXR1cm4gc2l6ZTsKPiArfQo+ICsKPiAgLyoqCj4gICAqIGVw Zl9udGJfZGJfYmFyX2luaXQoKSAtIENvbmZpZ3VyZSBEb29yYmVsbCB3aW5kb3cgQkFScwo+ICAg KiBAbnRiOiBOVEIgZGV2aWNlIHRoYXQgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVu IEhPU1QgYW5kIFZIT1NUCj4gQEAgLTUzOSwyNyArNTY3LDI2IEBAIHN0YXRpYyBpbnQgZXBmX250 Yl9kYl9iYXJfaW5pdChzdHJ1Y3QgZXBmX250YiAqbnRiKQo+ICAJCQkJCSAgICBudGItPmVwZi0+ ZnVuY19ubywKPiAgCQkJCQkgICAgbnRiLT5lcGYtPnZmdW5jX25vKTsKPiAgCWFsaWduID0gZXBj X2ZlYXR1cmVzLT5hbGlnbjsKPiAtCj4gLQlpZiAoc2l6ZSA8IDEyOCkKPiAtCQlzaXplID0gMTI4 Owo+IC0KPiAtCWlmIChhbGlnbikKPiAtCQlzaXplID0gQUxJR04oc2l6ZSwgYWxpZ24pOwo+IC0J ZWxzZQo+IC0JCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28oc2l6ZSk7Cj4gKwlzaXplID0gZXBm X250Yl9kYl9zaXplKG50Yik7Cj4gIAo+ICAJYmFybm8gPSBudGItPmVwZl9udGJfYmFyW0JBUl9E Ql07Cj4gKwllcGZfYmFyID0gJm50Yi0+ZXBmLT5iYXJbYmFybm9dOwo+ICAKPiAtCW13X2FkZHIg PSBwY2lfZXBmX2FsbG9jX3NwYWNlKG50Yi0+ZXBmLCBzaXplLCBiYXJubywgYWxpZ24sIDApOwo+ IC0JaWYgKCFtd19hZGRyKSB7Cj4gLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUg T0IgYWRkcmVzc1xuIik7Cj4gLQkJcmV0dXJuIC1FTk9NRU07Cj4gKwlpZiAobnRiLT5lcGZfZGJf cGh5cykgewo+ICsJCW13X2FkZHIgPSBOVUxMOwo+ICsJCWVwZl9iYXItPnBoeXNfYWRkciA9IG50 Yi0+ZXBmX2RiX3BoeXM7Cj4gKwkJZXBmX2Jhci0+YmFybm8gPSBiYXJubzsKPiArCQllcGZfYmFy LT5zaXplID0gc2l6ZTsKPiArCX0gZWxzZSB7Cj4gKwkJbXdfYWRkciA9IHBjaV9lcGZfYWxsb2Nf c3BhY2UobnRiLT5lcGYsIHNpemUsIGJhcm5vLCBhbGlnbiwgMCk7Cj4gKwkJaWYgKCFtd19hZGRy KSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRvb3JiZWxsIGFkZHJl c3NcbiIpOwo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCQl9Cj4gIAl9Cj4gIAo+ICAJbnRiLT5l cGZfZGIgPSBtd19hZGRyOwo+ICAKPiAtCWVwZl9iYXIgPSAmbnRiLT5lcGYtPmJhcltiYXJub107 Cj4gLQo+ICAJcmV0ID0gcGNpX2VwY19zZXRfYmFyKG50Yi0+ZXBmLT5lcGMsIG50Yi0+ZXBmLT5m dW5jX25vLCBudGItPmVwZi0+dmZ1bmNfbm8sIGVwZl9iYXIpOwo+ICAJaWYgKHJldCkgewo+ICAJ CWRldl9lcnIoZGV2LCAiRG9vcmJlbGwgQkFSIHNldCBmYWlsZWRcbiIpOwo+IEBAIC03MjgsNiAr NzU1LDgyIEBAIHN0YXRpYyBpbnQgZXBmX250Yl9pbml0X2VwY19iYXIoc3RydWN0IGVwZl9udGIg Km50YikKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgZXBmX250 Yl9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoKU2hvdWxkbid0IHRoaXMg ZnVuY3Rpb24gYWxzbyBiZSBndWFyZGVkPwoKPiArewo+ICsJc3RydWN0IGVwZl9udGIgKm50YiA9 IGRhdGE7Cj4gKwlpbnQgaW5kZXg7Cj4gKwo+ICsJaW5kZXggPSBpcnEgLSBudGItPm1zaV92aXJx YmFzZTsKPiArCW50Yi0+ZGIgfD0gMSA8PCAoaW5kZXggLSAxKTsKPiArCW50Yl9kYl9ldmVudCgm bnRiLT5udGIsIGluZGV4KTsKPiArCj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gK30KPiArCj4g KyNpZmRlZiBDT05GSUdfR0VORVJJQ19NU0lfSVJRX0RPTUFJTgoKSXQnZCBiZSBiZXR0ZXIgdG8g dXNlIHRoZSByZWxldmFudCBjb21taXQgZGVzY3JpcHRpb24gYXMgYSBjb21tZW50IGhlcmUuCgo+ ICtzdGF0aWMgdm9pZCBlcGZfbnRiX3dyaXRlX21zaV9tc2coc3RydWN0IG1zaV9kZXNjICpkZXNj LCBzdHJ1Y3QgbXNpX21zZyAqbXNnKQo+ICt7Cj4gKwlzdHJ1Y3QgZXBmX250YiAqbnRiID0gZGV2 X2dldF9kcnZkYXRhKGRlc2MtPmRldik7Cj4gKwlzdHJ1Y3QgZXBmX250Yl9jdHJsICpyZWcgPSBu dGItPnJlZzsKPiArCWludCBzaXplID0gZXBmX250Yl9kYl9zaXplKG50Yik7Cj4gKwl1NjQgYWRk cjsKPiArCj4gKwlhZGRyID0gbXNnLT5hZGRyZXNzX2hpOwo+ICsJYWRkciA8PD0gMzI7Cj4gKwlh ZGRyIHw9IG1zZy0+YWRkcmVzc19sbzsKPiArCj4gKwlyZWctPmRiX2RhdGFbZGVzYy0+bXNpX2lu ZGV4XSA9IG1zZy0+ZGF0YTsKPiArCgpBIGNvbW1lbnQgc3RhdGluZyB0aGF0IHRoZSBiYXNlIGFk ZHJlc3MgdG8gYmUgdXNlZCBhcyB0aGUgREIgQkFSIGlzIHNldCBoZXJlCndvdWxkIGJlIHVzZWZ1 bCB0b28uCgo+ICsJaWYgKCFkZXNjLT5tc2lfaW5kZXgpCj4gKwkJbnRiLT5lcGZfZGJfcGh5cyA9 IHJvdW5kX2Rvd24oYWRkciwgc2l6ZSk7Cj4gKwo+ICsJcmVnLT5kYl9vZmZzZXRbZGVzYy0+bXNp X2luZGV4XSA9IGFkZHIgLSBudGItPmVwZl9kYl9waHlzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBlcGZfbnRiX2VwY19tc2lfaW5pdChzdHJ1Y3QgZXBmX250YiAqbnRiKQo+ICt7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmbnRiLT5lcGYtPmRldjsKPiArCXN0cnVjdCBpcnFfZG9tYWluICpk b21haW47Cj4gKwlpbnQgdmlycTsKPiArCWludCByZXQ7Cj4gKwlpbnQgaTsKPiArCj4gKwlkb21h aW4gPSBkZXZfZ2V0X21zaV9kb21haW4obnRiLT5lcGYtPmVwYy0+ZGV2LnBhcmVudCk7Cj4gKwlp ZiAoIWRvbWFpbikKPiArCQlyZXR1cm47Cj4gKwo+ICsJZGV2X3NldF9tc2lfZG9tYWluKGRldiwg ZG9tYWluKTsKPiArCj4gKwlpZiAocGxhdGZvcm1fbXNpX2RvbWFpbl9hbGxvY19pcnFzKCZudGIt PmVwZi0+ZGV2LAo+ICsJCW50Yi0+ZGJfY291bnQsCj4gKwkJZXBmX250Yl93cml0ZV9tc2lfbXNn KSkgewoKUGxlYXNlIHdyYXAgYWJvdmUgdHdvIGluIGEgc2luZ2xlIGxpbmUgdGlsbCAxMDAgY29s dW1uIGxpbWl0LgoKPiArCQlkZXZfZXJyKGRldiwgIkNhbid0IGFsbG9jYXRlIE1TSSwgZmFsbGlu ZyBiYWNrIHRvIHBvbGxpbmcgbW9kZVxuIik7CgpUaGlzIHNob3VsZCBiZSBkZXZfZGJnKCkuCgo+ ICsJCXJldHVybjsKPiArCX0KPiArCWRldl9kYmcoZGV2LCAiVXNpbmcgTVNJIGFzIGRvb3JiZWxs XG4iKTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbnRiLT5kYl9jb3VudDsgaSsrKSB7Cj4gKwkJ dmlycSA9IG1zaV9nZXRfdmlycShkZXYsIGkpOwo+ICsJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEo ZGV2LCB2aXJxLAo+ICsJCQkgICAgICAgZXBmX250Yl9pbnRlcnJ1cHRfaGFuZGxlciwgMCwKPiAr CQkJICAgICAgICJwY2lfZXBmX3ZudGIiLCBudGIpOwo+ICsKPiArCQlpZiAocmV0KSB7Cj4gKwkJ CWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgZG9vcmJlbGwgSVJRISBGYWxsaW5nIGJh Y2sgdG8gcG9sbGluZyBtb2RlIik7CgpBZ2FpbiwgZGV2X2RiZygpCgo+ICsJCQludGItPmVwZl9k Yl9waHlzID0gMDsKPiArCQkJcGxhdGZvcm1fbXNpX2RvbWFpbl9mcmVlX2lycXMoJm50Yi0+ZXBm LT5kZXYpOwo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwo+ICsJCWlmICghaSkKPiArCQkJbnRiLT5t c2lfdmlycWJhc2UgPSB2aXJxOyAvKiBtc2kgc3RhcnQgdmlycSBudW1iZXIgKi8KPiArCX0KPiAr fQo+ICsjZWxzZQoKU2luY2UgdGhpcyBpcyBub3QgZXhwb3NlZCBhcyBhbiBBUEksIGp1c3QgZW5k IHRoZSBpZmRlZiBoZXJlIGFuZC4uLgoKPiArc3RhdGljIHZvaWQgZXBmX250Yl9lcGNfbXNpX2lu aXQoc3RydWN0IGVwZl9udGIgKm50YikKPiArewo+ICt9Cj4gKyNlbmRpZiAvKiBDT05GSUdfR0VO RVJJQ19NU0lfSVJRX0RPTUFJTiAqLwo+ICAvKioKPiAgICogZXBmX250Yl9lcGNfaW5pdCgpIC0g SW5pdGlhbGl6ZSBOVEIgaW50ZXJmYWNlCj4gICAqIEBudGI6IE5UQiBkZXZpY2UgdGhhdCBmYWNp bGl0YXRlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gSE9TVCBhbmQgVkhPU1QKPiBAQCAtMTMzNiwx NCArMTQzOSwxNSBAQCBzdGF0aWMgaW50IGVwZl9udGJfYmluZChzdHJ1Y3QgcGNpX2VwZiAqZXBm KQo+ICAJCWdvdG8gZXJyX2Jhcl9hbGxvYzsKPiAgCX0KPiAgCj4gKwllcGZfc2V0X2RydmRhdGEo ZXBmLCBudGIpOwo+ICsJZXBmX250Yl9lcGNfbXNpX2luaXQobnRiKTsKCkd1YXJkIHRoaXMgZnVu Y3Rpb24gaW5zdGVhZDoKCiNpZmRlZiBDT05GSUdfR0VORVJJQ19NU0lfSVJRX0RPTUFJTgoJZXBm X250Yl9lcGNfbXNpX2luaXQobnRiKTsKI2VuZGlmCgpUaGFua3MsCk1hbmkKCj4gKwo+ICAJcmV0 ID0gZXBmX250Yl9lcGNfaW5pdChudGIpOwo+ICAJaWYgKHJldCkgewo+ICAJCWRldl9lcnIoZGV2 LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgRVBDXG4iKTsKPiAgCQlnb3RvIGVycl9iYXJfYWxsb2M7 Cj4gIAl9Cj4gIAo+IC0JZXBmX3NldF9kcnZkYXRhKGVwZiwgbnRiKTsKPiAtCj4gIAlwY2lfc3Bh Y2VbMF0gPSAobnRiLT52bnRiX3BpZCA8PCAxNikgfCBudGItPnZudGJfdmlkOwo+ICAJcGNpX3Zu dGJfdGFibGVbMF0udmVuZG9yID0gbnRiLT52bnRiX3ZpZDsKPiAgCXBjaV92bnRiX3RhYmxlWzBd LmRldmljZSA9IG50Yi0+dm50Yl9waWQ7Cj4gLS0gCj4gMi4zNC4xCj4gCgotLSAK4K6u4K6j4K6/ 4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=