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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97D0DECAAD2 for ; Fri, 2 Sep 2022 01:39:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234985AbiIBBjF (ORCPT ); Thu, 1 Sep 2022 21:39:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:32876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231764AbiIBBjC (ORCPT ); Thu, 1 Sep 2022 21:39:02 -0400 Received: from mail-pg1-x533.google.com (mail-pg1-x533.google.com [IPv6:2607:f8b0:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 638DE91D2F for ; Thu, 1 Sep 2022 18:39:00 -0700 (PDT) Received: by mail-pg1-x533.google.com with SMTP id b196so681079pga.7 for ; Thu, 01 Sep 2022 18:39:00 -0700 (PDT) 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; bh=xtrTkJ4Uu3ohhJxNrzty1GMo4mCUZ5As2LZg/P4tK50=; b=YYQS3U2an0NHsaT3kRyB/CjX2F6iSDaaaXdAkWZvO6gonxfA9qhHlPPJIy66EZe3ZR wxIjWeCJzO7jdFWWO88kKC3qSXJ1mLTTNBSOcVvGsmLmcdYAQSBwKNehifBdxOZDugqV isbdfKU8zmXU8m/Rm4CMHQofJVobu0qt2c+DjTYFJ5nX6ZsHTBHOxLlM51mZyvNLpmVQ Q+YgCC0+Y8zFHJRTaKTF2NKyWdE/a8DEmMRHAUZ8A1vOp/Kq1MqYaKQzBTyto1CV5NQP 3+lPV55ABJaNHPEdbwbeUfQ4cHlupDfFN0jhMHJfQ5143PjQWyb5UgPyMSfsKXs/t6TM bxOg== 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; bh=xtrTkJ4Uu3ohhJxNrzty1GMo4mCUZ5As2LZg/P4tK50=; b=ITm33MYxWbAoQxO4o3qDZ0Ph7nSvtmEPthODzDiSE3Mre+O5i9axk6TJOecH5L3tcw FDU2CnYuEOEO245RBSjTmWp/xNbszz6yJ7ZijBFBIKmKE8p4UNMmgHthuncTUZhCU+FN WR7Kx+i8CyFP9QEQ2XLjct6UKMcfWN9vnng6JOBI21Excn0HauvVO+zJIbTBkMLRgJLg V4a3CzeI5yo98y6SQ59U6chLMxD7eHkOSUQGOoBeWe+xlc4ZScyY4cNlyzwmYcHGZHmG WxYq2j89Ag5cO5yUCuw+3r8NiOTgwREyi8n91aoFe6CwhzpLNGJ38GL3GMaZEWiFXMRr oo8A== X-Gm-Message-State: ACgBeo18D+vSc4O/tQ2OV6X7cV5PcS4xju23cqEXyNl5+d+7D5yTAMsI pC+kZ3RdRxWgBLt+S4NewKKw X-Google-Smtp-Source: AA6agR7DjBAE56OPQD2pNaMD6zNmrRU9jU2sr6gi8usaSIIxK9Wdjn2+Sdz7pqPgMja4jY2efNlR5A== X-Received: by 2002:a63:4b5e:0:b0:41d:e04b:4515 with SMTP id k30-20020a634b5e000000b0041de04b4515mr28031011pgl.100.1662082739808; Thu, 01 Sep 2022 18:38:59 -0700 (PDT) Received: from thinkpad ([117.217.177.124]) by smtp.gmail.com with ESMTPSA id y1-20020a17090a474100b001fdbb2e38acsm4058764pjg.5.2022.09.01.18.38.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 18:38:58 -0700 (PDT) Date: Fri, 2 Sep 2022 07:08:48 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: "maz@kernel.org" , "tglx@linutronix.de" , "robh+dt@kernel.org" , "krzysztof.kozlowski+dt@linaro.org" , "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , "kw@linux.com" , "bhelgaas@google.com" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-pci@vger.kernel.org" , Peng Fan , Aisheng Dong , "jdmason@kudzu.us" , "kernel@pengutronix.de" , "festevam@gmail.com" , dl-linux-imx , "kishon@ti.com" , "lorenzo.pieralisi@arm.com" , "ntb@lists.linux.dev" , "lznuaa@gmail.com" Subject: Re: [EXT] Re: [PATCH v6 4/4] pcie: endpoint: pci-epf-vntb: add endpoint MSI support Message-ID: <20220902013848.GA4935@thinkpad> References: <20220818151127.2449064-1-Frank.Li@nxp.com> <20220818151127.2449064-5-Frank.Li@nxp.com> <20220831104203.GD5076@thinkpad> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Wed, Aug 31, 2022 at 04:19:17PM +0000, Frank Li wrote: > > > > -----Original Message----- > > From: Manivannan Sadhasivam > > Sent: Wednesday, August 31, 2022 5:42 AM > > To: Frank Li > > Cc: maz@kernel.org; tglx@linutronix.de; robh+dt@kernel.org; > > krzysztof.kozlowski+dt@linaro.org; shawnguo@kernel.org; > > s.hauer@pengutronix.de; kw@linux.com; bhelgaas@google.com; linux- > > kernel@vger.kernel.org; devicetree@vger.kernel.org; linux-arm- > > kernel@lists.infradead.org; linux-pci@vger.kernel.org; Peng Fan > > ; Aisheng Dong ; > > jdmason@kudzu.us; kernel@pengutronix.de; festevam@gmail.com; dl-linux- > > imx ; kishon@ti.com; lorenzo.pieralisi@arm.com; > > ntb@lists.linux.dev; lznuaa@gmail.com > > Subject: [EXT] Re: [PATCH v6 4/4] pcie: endpoint: pci-epf-vntb: add endpoint > > MSI support > > > > Caution: EXT Email > > > > On Thu, Aug 18, 2022 at 10:11:27AM -0500, Frank Li wrote: > > > ┌───────┐ ┌──────────┐ > > > │ │ │ │ > > > ┌─────────────┐ │ │ │ PCI Host │ > > > │ MSI │◄┐ │ │ │ │ > > > │ Controller │ │ │ │ │ │ > > > └─────────────┘ └─┼───────┼─── > > ───────┼─BAR0 │ > > > │ PCI │ │ BAR1 │ > > > │ Func │ │ BAR2 │ > > > │ │ │ BAR3 │ > > > │ │ │ BAR4 │ > > > │ ├─────────►│ │ > > > └───────┘ └──────────┘ > > > > > > > This diagram doesn't say which side is host and which one is endpoint. > > And not conveying any useful information. > > [Frank Li] At V2 version, this diagram is in cover letter. Bjorn suggest move to here. > I think you have good background knowledge. But it should be helpful for new > People, who just touch this area. > Having the block diagram always helps but my point is that this diagram doesn't convey the immediate knowledge that it is supposed to do so. Like there is no partition between host and endpoint and you did not add any explanation about it in the below text. So in v2, please incorporate those. > I already mark "PCI Func" and "PCI Host". > Sorry, that's not helpful and you need to improve it. > > > > > Linux supports endpoint functions. PCI Host write BAR space like write > > > to memory. The EP side can't know memory changed by the host driver. > > > > > > > I think you just say, that there is no defined way of raising IRQs by host > > to the endpoint. > > > > > PCI Spec has not defined a standard method to do that. Only define MSI(x) > > > to let EP notified RC status change. > > > > > > > MSI is from EP, right? Throughout the driver you should call it as "doorbell" > > and not MSI. > > [Frank Li] What's I want said is that PCI standard define MSI(x) to let EP notify RC. > But there are not standard way for reverse direction. MSI should be correct here. > Right. But also use "MSI/MSI-X" instead of "MSI(x)" > > > > > The basic idea is to trigger an IRQ when PCI RC writes to a memory > > > address. That's what MSI controller provided. EP drivers just need to > > > request a platform MSI interrupt, struct msi_msg *msg will pass down a > > > memory address and data. EP driver will map such memory address to one > > of > > > PCI BAR. Host just writes such an address to trigger EP side irq. > > > > > > > IIUC (by looking at other patches in the series), the memory assigned for BAR > > region by the PCI host is mapped to the platform interrupt controller in > > PCI Endpoint. Such that, whenever the PCI host writes to the BAR region, it > > will trigger an IRQ in the Endpoint. > > > > This kind of setup is available in other platforms like Qualcomm where the > > mapping of a register region available in BAR0 and interrupt controller is > > done in the hardware itself. So whenever the PCI host writes to that register > > in BAR0, an IRQ will be delivered to the endpoint. > > [Frank Li] Yes, not all platform have it. And EP driver have not provide a API > to get register region. I think platform msi API is pretty good API. > Many system have GIC ITS, so EP function driver can use it. Our test platform > have not ITS yet, so we added a simple MU-MSI driver to do it. I think qualcomm > platform can use similar method. So all EP function driver can use common method > to get notification from PCI host. > What is the common method here? If you want to make this doorbell feature common across all EPF drivers, then you need to provide EPF APIs. > > > > > Add MSI support for pci-epf-vntb. pci-epf-vntb driver query if system > > > have MSI controller. Setup doorbell address according to struct msi_msg. > > > > > > So PCIe host can write this doorbell address to triger EP side's irq. > > > > > > If no MSI controller exist, fall back to software polling. > > > > > > Signed-off-by: Frank Li > > > --- > > > drivers/pci/endpoint/functions/pci-epf-vntb.c | 134 +++++++++++++++--- > > > 1 file changed, 112 insertions(+), 22 deletions(-) > > > > > > diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c > > b/drivers/pci/endpoint/functions/pci-epf-vntb.c [...] > > > +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)) { > > > + dev_info(dev, "Can't allocate MSI, fall back to poll mode\n"); > > > + return; > > > + } > > > + > > > + dev_info(dev, "vntb use MSI as doorbell\n"); > > > + > > > > Why are you using the interrupt controller as the MSI controller? Why not > > just > > a plain interrupt controller? > > [Frank Li] what's your means? I think only MSI controller support write memory to trigger irq. > >From EPF driver perspective, only the IRQs need to be requested, right? So why cannot you expose MU as a generic irqchip driver, instead of a MSI controller? Thanks, Mani -- மணிவண்ணன் சதாசிவம் 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 21CFEECAAD2 for ; Fri, 2 Sep 2022 01:40:24 +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=blNJ5XO1drcQ6UftNps4vM15+iGnjx3inBMsP9JUu4M=; b=xpcGXocYYJW58u VRgOsfwG0w/GW8F90FwlJ7G09vbIjwsmV5Qiwj3eEcz75O0Cos/X1rGL1uHGDYxNL/Xm9eeJwz2r0 3sj4yL94Y5j+qF8FxiezgHelYybo7hjSzu4YDSa+iGLxCc8efJkrTJE0pj/EhjVchj5H4g9iLZp2R Gm07XANEDUavkxxLZrj+ee9PSJQGzMR2IHqGxmjtNuj0CJpfAGx1QnDNQjPvb3m+zZCM1X1uYB81B rPd4g6P/OsL0lirGA2eAnRd0bf19E9YfJGroixVOBxBVAeynJdeAaHpO+YjcEx2fr5gBMUc3W7RcQ uNEfUvcAdPFjjTQ7OGxQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oTveF-00GdIQ-4E; Fri, 02 Sep 2022 01:39:07 +0000 Received: from mail-pg1-x52f.google.com ([2607:f8b0:4864:20::52f]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oTveA-00GdGm-EB for linux-arm-kernel@lists.infradead.org; Fri, 02 Sep 2022 01:39:05 +0000 Received: by mail-pg1-x52f.google.com with SMTP id q63so674176pga.9 for ; Thu, 01 Sep 2022 18:39:00 -0700 (PDT) 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; bh=xtrTkJ4Uu3ohhJxNrzty1GMo4mCUZ5As2LZg/P4tK50=; b=YYQS3U2an0NHsaT3kRyB/CjX2F6iSDaaaXdAkWZvO6gonxfA9qhHlPPJIy66EZe3ZR wxIjWeCJzO7jdFWWO88kKC3qSXJ1mLTTNBSOcVvGsmLmcdYAQSBwKNehifBdxOZDugqV isbdfKU8zmXU8m/Rm4CMHQofJVobu0qt2c+DjTYFJ5nX6ZsHTBHOxLlM51mZyvNLpmVQ Q+YgCC0+Y8zFHJRTaKTF2NKyWdE/a8DEmMRHAUZ8A1vOp/Kq1MqYaKQzBTyto1CV5NQP 3+lPV55ABJaNHPEdbwbeUfQ4cHlupDfFN0jhMHJfQ5143PjQWyb5UgPyMSfsKXs/t6TM bxOg== 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; bh=xtrTkJ4Uu3ohhJxNrzty1GMo4mCUZ5As2LZg/P4tK50=; b=0XBsFsDAdwWuexB4b945Hw2TEmFgtbj2a+E8posILdgsY4DNh/CtmeGw6TlgWZ2OAm KemyVEFlqwKiguspW++MsxacLPLYXGxFwPWRrR5yI4GzxU5EcgAOAnlFqDtXZq8qjoEZ LOlXL1/S1nK8l6TZtxvYMwaUsuXXJYg+gn7wKDVEBa3YtCeGIP2u1XBogHG87wmJHE5U zgCbViieIGvsbASjtapRbMiAX8IyhpykXjGJlP/400/Ts5ENDEDm4FhwVrn2yDy7tdTr uV4SyGYxyUelPS4feVHLF+EMwgeW3oBCNFo2Az/41mdHZ+nbcYVePhaCU3AkSH4xPgEQ ivMQ== X-Gm-Message-State: ACgBeo362UT2HNoxH7WW5xSjpPFp9QD9iETE1qQhZ+uO2f94gec0r/FM yQD7ADA5X+buxscn+Hkr/FLC X-Google-Smtp-Source: AA6agR7DjBAE56OPQD2pNaMD6zNmrRU9jU2sr6gi8usaSIIxK9Wdjn2+Sdz7pqPgMja4jY2efNlR5A== X-Received: by 2002:a63:4b5e:0:b0:41d:e04b:4515 with SMTP id k30-20020a634b5e000000b0041de04b4515mr28031011pgl.100.1662082739808; Thu, 01 Sep 2022 18:38:59 -0700 (PDT) Received: from thinkpad ([117.217.177.124]) by smtp.gmail.com with ESMTPSA id y1-20020a17090a474100b001fdbb2e38acsm4058764pjg.5.2022.09.01.18.38.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 01 Sep 2022 18:38:58 -0700 (PDT) Date: Fri, 2 Sep 2022 07:08:48 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: "maz@kernel.org" , "tglx@linutronix.de" , "robh+dt@kernel.org" , "krzysztof.kozlowski+dt@linaro.org" , "shawnguo@kernel.org" , "s.hauer@pengutronix.de" , "kw@linux.com" , "bhelgaas@google.com" , "linux-kernel@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-pci@vger.kernel.org" , Peng Fan , Aisheng Dong , "jdmason@kudzu.us" , "kernel@pengutronix.de" , "festevam@gmail.com" , dl-linux-imx , "kishon@ti.com" , "lorenzo.pieralisi@arm.com" , "ntb@lists.linux.dev" , "lznuaa@gmail.com" Subject: Re: [EXT] Re: [PATCH v6 4/4] pcie: endpoint: pci-epf-vntb: add endpoint MSI support Message-ID: <20220902013848.GA4935@thinkpad> References: <20220818151127.2449064-1-Frank.Li@nxp.com> <20220818151127.2449064-5-Frank.Li@nxp.com> <20220831104203.GD5076@thinkpad> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220901_183902_586253_3A8EB057 X-CRM114-Status: GOOD ( 51.89 ) 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 T24gV2VkLCBBdWcgMzEsIDIwMjIgYXQgMDQ6MTk6MTdQTSArMDAwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gCj4gCj4gPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gRnJvbTogTWFuaXZhbm5h biBTYWRoYXNpdmFtIDxtYW5pdmFubmFuLnNhZGhhc2l2YW1AbGluYXJvLm9yZz4KPiA+IFNlbnQ6 IFdlZG5lc2RheSwgQXVndXN0IDMxLCAyMDIyIDU6NDIgQU0KPiA+IFRvOiBGcmFuayBMaSA8ZnJh bmsubGlAbnhwLmNvbT4KPiA+IENjOiBtYXpAa2VybmVsLm9yZzsgdGdseEBsaW51dHJvbml4LmRl OyByb2JoK2R0QGtlcm5lbC5vcmc7Cj4gPiBrcnp5c3p0b2Yua296bG93c2tpK2R0QGxpbmFyby5v cmc7IHNoYXduZ3VvQGtlcm5lbC5vcmc7Cj4gPiBzLmhhdWVyQHBlbmd1dHJvbml4LmRlOyBrd0Bs aW51eC5jb207IGJoZWxnYWFzQGdvb2dsZS5jb207IGxpbnV4LQo+ID4ga2VybmVsQHZnZXIua2Vy bmVsLm9yZzsgZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWFybS0KPiA+IGtlcm5l bEBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBQZW5nIEZh bgo+ID4gPHBlbmcuZmFuQG54cC5jb20+OyBBaXNoZW5nIERvbmcgPGFpc2hlbmcuZG9uZ0BueHAu Y29tPjsKPiA+IGpkbWFzb25Aa3VkenUudXM7IGtlcm5lbEBwZW5ndXRyb25peC5kZTsgZmVzdGV2 YW1AZ21haWwuY29tOyBkbC1saW51eC0KPiA+IGlteCA8bGludXgtaW14QG54cC5jb20+OyBraXNo b25AdGkuY29tOyBsb3JlbnpvLnBpZXJhbGlzaUBhcm0uY29tOwo+ID4gbnRiQGxpc3RzLmxpbnV4 LmRldjsgbHpudWFhQGdtYWlsLmNvbQo+ID4gU3ViamVjdDogW0VYVF0gUmU6IFtQQVRDSCB2NiA0 LzRdIHBjaWU6IGVuZHBvaW50OiBwY2ktZXBmLXZudGI6IGFkZCBlbmRwb2ludAo+ID4gTVNJIHN1 cHBvcnQKPiA+IAo+ID4gQ2F1dGlvbjogRVhUIEVtYWlsCj4gPiAKPiA+IE9uIFRodSwgQXVnIDE4 LCAyMDIyIGF0IDEwOjExOjI3QU0gLTA1MDAsIEZyYW5rIExpIHdyb3RlOgo+ID4gPiAgICAgICAg ICAgICAgICAgICAgICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilJAgICAgICAgICAg4pSM 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCj4gPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgIOKUgiAgICAgICDilIIgICAgICAgICAg4pSCICAgICAgICAgIOKUggo+ID4gPiAgICAg ICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIIgICAg ICAg4pSCICAgICAgICAgIOKUgiBQQ0kgSG9zdCDilIIKPiA+ID4gICAgICAg4pSCIE1TSSAgICAg ICAgIOKUguKXhOKUkCDilIIgICAgICAg4pSCICAgICAgICAgIOKUgiAgICAgICAgICDilIIKPiA+ ID4gICAgICAg4pSCIENvbnRyb2xsZXIgIOKUgiDilIIg4pSCICAgICAgIOKUgiAgICAgICAgICDi lIIgICAgICAgICAg4pSCCj4gPiA+ICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUmCDilJTilIDilLzilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDi lIAKPiA+IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgEJBUjAgICAgIOKUggo+ID4gPiAgICAg ICAgICAgICAgICAgICAgICAgICDilIIgUENJICAg4pSCICAgICAgICAgIOKUgiBCQVIxICAgICDi lIIKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAg4pSCIEZ1bmMgIOKUgiAgICAgICAgICDi lIIgQkFSMiAgICAg4pSCCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiAgICAgICDi lIIgICAgICAgICAg4pSCIEJBUjMgICAgIOKUggo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAg ICDilIIgICAgICAg4pSCICAgICAgICAgIOKUgiBCQVI0ICAgICDilIIKPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgICAg4pSCICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKW uuKUgiAgICAgICAgICDilIIKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAg4pSU4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSYICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUmAo+ID4gPgo+ID4gCj4gPiBUaGlzIGRpYWdyYW0gZG9lc24ndCBzYXkgd2hpY2ggc2lk ZSBpcyBob3N0IGFuZCB3aGljaCBvbmUgaXMgZW5kcG9pbnQuCj4gPiBBbmQgbm90IGNvbnZleWlu ZyBhbnkgdXNlZnVsIGluZm9ybWF0aW9uLgo+IAo+IFtGcmFuayBMaV0gQXQgVjIgdmVyc2lvbiwg dGhpcyBkaWFncmFtIGlzIGluIGNvdmVyIGxldHRlci4gIEJqb3JuIHN1Z2dlc3QgbW92ZSB0byBo ZXJlLgo+IEkgdGhpbmsgeW91IGhhdmUgZ29vZCBiYWNrZ3JvdW5kIGtub3dsZWRnZS4gIEJ1dCBp dCBzaG91bGQgYmUgaGVscGZ1bCBmb3IgbmV3Cj4gUGVvcGxlLCAgd2hvIGp1c3QgdG91Y2ggdGhp cyBhcmVhLiAKPiAKCkhhdmluZyB0aGUgYmxvY2sgZGlhZ3JhbSBhbHdheXMgaGVscHMgYnV0IG15 IHBvaW50IGlzIHRoYXQgdGhpcyBkaWFncmFtIGRvZXNuJ3QKY29udmV5IHRoZSBpbW1lZGlhdGUg a25vd2xlZGdlIHRoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8gc28uIExpa2UgdGhlcmUgaXMgbm8K cGFydGl0aW9uIGJldHdlZW4gaG9zdCBhbmQgZW5kcG9pbnQgYW5kIHlvdSBkaWQgbm90IGFkZCBh bnkgZXhwbGFuYXRpb24gYWJvdXQKaXQgaW4gdGhlIGJlbG93IHRleHQuIFNvIGluIHYyLCBwbGVh c2UgaW5jb3Jwb3JhdGUgdGhvc2UuCgo+IEkgYWxyZWFkeSBtYXJrICJQQ0kgRnVuYyIgYW5kICJQ Q0kgSG9zdCIuICAKPiAKClNvcnJ5LCB0aGF0J3Mgbm90IGhlbHBmdWwgYW5kIHlvdSBuZWVkIHRv IGltcHJvdmUgaXQuCgo+ID4gCj4gPiA+IExpbnV4IHN1cHBvcnRzIGVuZHBvaW50IGZ1bmN0aW9u cy4gUENJIEhvc3Qgd3JpdGUgQkFSPG4+IHNwYWNlIGxpa2Ugd3JpdGUKPiA+ID4gdG8gbWVtb3J5 LiBUaGUgRVAgc2lkZSBjYW4ndCBrbm93IG1lbW9yeSBjaGFuZ2VkIGJ5IHRoZSBob3N0IGRyaXZl ci4KPiA+ID4KPiA+IAo+ID4gSSB0aGluayB5b3UganVzdCBzYXksIHRoYXQgdGhlcmUgaXMgbm8g ZGVmaW5lZCB3YXkgb2YgcmFpc2luZyBJUlFzIGJ5IGhvc3QKPiA+IHRvIHRoZSBlbmRwb2ludC4K PiA+IAo+ID4gPiBQQ0kgU3BlYyBoYXMgbm90IGRlZmluZWQgYSBzdGFuZGFyZCBtZXRob2QgdG8g ZG8gdGhhdC4gT25seSBkZWZpbmUgTVNJKHgpCj4gPiA+IHRvIGxldCBFUCBub3RpZmllZCBSQyBz dGF0dXMgY2hhbmdlLgo+ID4gPgo+ID4gCj4gPiBNU0kgaXMgZnJvbSBFUCwgcmlnaHQ/IFRocm91 Z2hvdXQgdGhlIGRyaXZlciB5b3Ugc2hvdWxkIGNhbGwgaXQgYXMgImRvb3JiZWxsIgo+ID4gYW5k IG5vdCBNU0kuCj4gCj4gW0ZyYW5rIExpXSBXaGF0J3MgSSB3YW50IHNhaWQgaXMgdGhhdCBQQ0kg c3RhbmRhcmQgZGVmaW5lIE1TSSh4KSB0byBsZXQgRVAgbm90aWZ5IFJDLiAKPiBCdXQgdGhlcmUg YXJlIG5vdCBzdGFuZGFyZCB3YXkgZm9yIHJldmVyc2UgZGlyZWN0aW9uLiAgTVNJIHNob3VsZCBi ZSBjb3JyZWN0IGhlcmUuCj4gCgpSaWdodC4gQnV0IGFsc28gdXNlICJNU0kvTVNJLVgiIGluc3Rl YWQgb2YgIk1TSSh4KSIKCj4gPiAKPiA+ID4gVGhlIGJhc2ljIGlkZWEgaXMgdG8gdHJpZ2dlciBh biBJUlEgd2hlbiBQQ0kgUkMgd3JpdGVzIHRvIGEgbWVtb3J5Cj4gPiA+IGFkZHJlc3MuIFRoYXQn cyB3aGF0IE1TSSBjb250cm9sbGVyIHByb3ZpZGVkLiBFUCBkcml2ZXJzIGp1c3QgbmVlZCB0bwo+ ID4gPiByZXF1ZXN0IGEgcGxhdGZvcm0gTVNJIGludGVycnVwdCwgc3RydWN0IG1zaV9tc2cgKm1z ZyB3aWxsIHBhc3MgZG93biBhCj4gPiA+IG1lbW9yeSBhZGRyZXNzIGFuZCBkYXRhLiBFUCBkcml2 ZXIgd2lsbCBtYXAgc3VjaCBtZW1vcnkgYWRkcmVzcyB0byBvbmUKPiA+IG9mCj4gPiA+IFBDSSBC QVI8bj4uICBIb3N0IGp1c3Qgd3JpdGVzIHN1Y2ggYW4gYWRkcmVzcyB0byB0cmlnZ2VyIEVQIHNp ZGUgaXJxLgo+ID4gPgo+ID4gCj4gPiBJSVVDIChieSBsb29raW5nIGF0IG90aGVyIHBhdGNoZXMg aW4gdGhlIHNlcmllcyksIHRoZSBtZW1vcnkgYXNzaWduZWQgZm9yIEJBUgo+ID4gcmVnaW9uIGJ5 IHRoZSBQQ0kgaG9zdCBpcyBtYXBwZWQgdG8gdGhlIHBsYXRmb3JtIGludGVycnVwdCBjb250cm9s bGVyIGluCj4gPiBQQ0kgRW5kcG9pbnQuIFN1Y2ggdGhhdCwgd2hlbmV2ZXIgdGhlIFBDSSBob3N0 IHdyaXRlcyB0byB0aGUgQkFSIHJlZ2lvbiwgaXQKPiA+IHdpbGwgdHJpZ2dlciBhbiBJUlEgaW4g dGhlIEVuZHBvaW50Lgo+ID4gCj4gPiBUaGlzIGtpbmQgb2Ygc2V0dXAgaXMgYXZhaWxhYmxlIGlu IG90aGVyIHBsYXRmb3JtcyBsaWtlIFF1YWxjb21tIHdoZXJlIHRoZQo+ID4gbWFwcGluZyBvZiBh IHJlZ2lzdGVyIHJlZ2lvbiBhdmFpbGFibGUgaW4gQkFSMCBhbmQgaW50ZXJydXB0IGNvbnRyb2xs ZXIgaXMKPiA+IGRvbmUgaW4gdGhlIGhhcmR3YXJlIGl0c2VsZi4gU28gd2hlbmV2ZXIgdGhlIFBD SSBob3N0IHdyaXRlcyB0byB0aGF0IHJlZ2lzdGVyCj4gPiBpbiBCQVIwLCBhbiBJUlEgd2lsbCBi ZSBkZWxpdmVyZWQgdG8gdGhlIGVuZHBvaW50Lgo+IAo+IFtGcmFuayBMaV0gWWVzLCAgbm90IGFs bCBwbGF0Zm9ybSBoYXZlIGl0LiBBbmQgRVAgZHJpdmVyIGhhdmUgbm90IHByb3ZpZGUgYSBBUEkK PiB0byBnZXQgcmVnaXN0ZXIgcmVnaW9uLiAgSSB0aGluayBwbGF0Zm9ybSBtc2kgQVBJIGlzIHBy ZXR0eSBnb29kIEFQSS4gCj4gTWFueSBzeXN0ZW0gaGF2ZSBHSUMgSVRTLCAgc28gRVAgZnVuY3Rp b24gZHJpdmVyIGNhbiB1c2UgaXQuICBPdXIgdGVzdCBwbGF0Zm9ybQo+IGhhdmUgbm90IElUUyB5 ZXQsICBzbyB3ZSBhZGRlZCBhIHNpbXBsZSBNVS1NU0kgZHJpdmVyIHRvIGRvIGl0LiBJIHRoaW5r IHF1YWxjb21tCj4gcGxhdGZvcm0gY2FuIHVzZSBzaW1pbGFyIG1ldGhvZC4gIFNvIGFsbCBFUCBm dW5jdGlvbiBkcml2ZXIgY2FuIHVzZSBjb21tb24gbWV0aG9kCj4gdG8gZ2V0IG5vdGlmaWNhdGlv biBmcm9tIFBDSSBob3N0Lgo+IAoKV2hhdCBpcyB0aGUgY29tbW9uIG1ldGhvZCBoZXJlPyBJZiB5 b3Ugd2FudCB0byBtYWtlIHRoaXMgZG9vcmJlbGwgZmVhdHVyZQpjb21tb24gYWNyb3NzIGFsbCBF UEYgZHJpdmVycywgdGhlbiB5b3UgbmVlZCB0byBwcm92aWRlIEVQRiBBUElzLgoKPiA+IAo+ID4g PiBBZGQgTVNJIHN1cHBvcnQgZm9yIHBjaS1lcGYtdm50Yi4gcGNpLWVwZi12bnRiIGRyaXZlciBx dWVyeSBpZiBzeXN0ZW0KPiA+ID4gaGF2ZSBNU0kgY29udHJvbGxlci4gU2V0dXAgZG9vcmJlbGwg YWRkcmVzcyBhY2NvcmRpbmcgdG8gc3RydWN0IG1zaV9tc2cuCj4gPiA+Cj4gPiA+IFNvIFBDSWUg aG9zdCBjYW4gd3JpdGUgdGhpcyBkb29yYmVsbCBhZGRyZXNzIHRvIHRyaWdlciBFUCBzaWRlJ3Mg aXJxLgo+ID4gPgo+ID4gPiBJZiBubyBNU0kgY29udHJvbGxlciBleGlzdCwgZmFsbCBiYWNrIHRv IHNvZnR3YXJlIHBvbGxpbmcuCj4gPiA+Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IEZyYW5rIExpIDxG cmFuay5MaUBueHAuY29tPgo+ID4gPiAtLS0KPiA+ID4gIGRyaXZlcnMvcGNpL2VuZHBvaW50L2Z1 bmN0aW9ucy9wY2ktZXBmLXZudGIuYyB8IDEzNCArKysrKysrKysrKysrKystLS0KPiA+ID4gIDEg ZmlsZSBjaGFuZ2VkLCAxMTIgaW5zZXJ0aW9ucygrKSwgMjIgZGVsZXRpb25zKC0pCj4gPiA+Cj4g PiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9lbmRwb2ludC9mdW5jdGlvbnMvcGNpLWVwZi12 bnRiLmMKPiA+IGIvZHJpdmVycy9wY2kvZW5kcG9pbnQvZnVuY3Rpb25zL3BjaS1lcGYtdm50Yi5j CgpbLi4uXQoKPiA+ID4gK3N0YXRpYyB2b2lkIGVwZl9udGJfZXBjX21zaV9pbml0KHN0cnVjdCBl cGZfbnRiICpudGIpCj4gPiA+ICt7Cj4gPiA+ICsgICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZu dGItPmVwZi0+ZGV2Owo+ID4gPiArICAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOwo+ID4g PiArICAgICBpbnQgdmlycTsKPiA+ID4gKyAgICAgaW50IHJldDsKPiA+ID4gKyAgICAgaW50IGk7 Cj4gPiA+ICsKPiA+ID4gKyAgICAgZG9tYWluID0gZGV2X2dldF9tc2lfZG9tYWluKG50Yi0+ZXBm LT5lcGMtPmRldi5wYXJlbnQpOwo+ID4gPiArICAgICBpZiAoIWRvbWFpbikKPiA+ID4gKyAgICAg ICAgICAgICByZXR1cm47Cj4gPiA+ICsKPiA+ID4gKyAgICAgZGV2X3NldF9tc2lfZG9tYWluKGRl diwgZG9tYWluKTsKPiA+ID4gKwo+ID4gPiArICAgICBpZiAocGxhdGZvcm1fbXNpX2RvbWFpbl9h bGxvY19pcnFzKCZudGItPmVwZi0+ZGV2LAo+ID4gPiArICAgICAgICAgICAgIG50Yi0+ZGJfY291 bnQsCj4gPiA+ICsgICAgICAgICAgICAgZXBmX250Yl93cml0ZV9tc2lfbXNnKSkgewo+ID4gPiAr ICAgICAgICAgICAgIGRldl9pbmZvKGRldiwgIkNhbid0IGFsbG9jYXRlIE1TSSwgZmFsbCBiYWNr IHRvIHBvbGwgbW9kZVxuIik7Cj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuOwo+ID4gPiArICAg ICB9Cj4gPiA+ICsKPiA+ID4gKyAgICAgZGV2X2luZm8oZGV2LCAidm50YiB1c2UgTVNJIGFzIGRv b3JiZWxsXG4iKTsKPiA+ID4gKwo+ID4gCj4gPiBXaHkgYXJlIHlvdSB1c2luZyB0aGUgaW50ZXJy dXB0IGNvbnRyb2xsZXIgYXMgdGhlIE1TSSBjb250cm9sbGVyPyBXaHkgbm90Cj4gPiBqdXN0Cj4g PiBhIHBsYWluIGludGVycnVwdCBjb250cm9sbGVyPwo+IAo+IFtGcmFuayBMaV0gd2hhdCdzIHlv dXIgbWVhbnM/ICAgSSB0aGluayBvbmx5IE1TSSBjb250cm9sbGVyIHN1cHBvcnQgd3JpdGUgbWVt b3J5IHRvIHRyaWdnZXIgaXJxLgo+IAoKRnJvbSBFUEYgZHJpdmVyIHBlcnNwZWN0aXZlLCBvbmx5 IHRoZSBJUlFzIG5lZWQgdG8gYmUgcmVxdWVzdGVkLCByaWdodD8gU28gd2h5CmNhbm5vdCB5b3Ug ZXhwb3NlIE1VIGFzIGEgZ2VuZXJpYyBpcnFjaGlwIGRyaXZlciwgaW5zdGVhZCBvZiBhIE1TSSBj b250cm9sbGVyPyAKClRoYW5rcywKTWFuaQoKLS0gCuCuruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCv jSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFy bS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK