From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-oo1-f47.google.com (mail-oo1-f47.google.com [209.85.161.47]) (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 3074329CF3 for ; Thu, 19 Oct 2023 15:04:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="c/FPuaup" Received: by mail-oo1-f47.google.com with SMTP id 006d021491bc7-581cb88f645so1896602eaf.1 for ; Thu, 19 Oct 2023 08:04:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1697727889; x=1698332689; darn=lists.linux.dev; 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=IIXhQZU8Z4kn0kT0kPBF+vVNN+HKrEeu0tgZww4gEls=; b=c/FPuaupzvjmTE+0ECEd86NpeS5MbKcFAKOcprO6vqCIo6FyDqe16rDQRIjX+U3t8G B7Evifj9ws3a49UDIYwG7q5K+7fOE/A7n4y/fISgy03qd7rsNGXnaayIyXxquBOxXAX3 /Ie22pDP5hCMdh7etyIDZQfdo/mdVPuTj+UbcI+IgC8s80OsKkHBecq21VrvyFLSgghV 41idN7/8HxfqTi/3OolBNAb18Fb2nEmiscU+e015UdpE+9GCLJqZIHv2vxQnA8y8HKIQ Ubml5FSzHlXrNtSHCIHMteh1vberHvt2RNSDxGj4YXfEfclMfOeXDxF915RBg8sgu1KR qNNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697727889; x=1698332689; 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=IIXhQZU8Z4kn0kT0kPBF+vVNN+HKrEeu0tgZww4gEls=; b=rBjQ+t4fiZps5Wna9ZtkggJ/WtVLhH3xl7sa5KU1Xa1CXvu82KAAFyzfduY1PdkvAw HC/2iSEh3tAOpWzIUJmim0s0bv3iMEJ5Wgwzs3IZrHjqXRFxR6y6FZGLihvSVPVSY5vz FNCxSjYVz1YQlxVpaizedrZb/++RD3HGJg3C20VHvX4lFujfWu4vyHSaX2WOzhOcAIv3 nQvhnSH4yX5woM3Iy6JMekELiRb4WORc2MG2Z1PTR7wcYsVBvhBtKWVppKnYyV2X0EUx CGHK0tKQhjYywyCNtn8n1l36k5pdtiRT6dLTA4c58otpHiCcL8Dk2kcIDpC9yo8hJiL0 pWEA== X-Gm-Message-State: AOJu0Yzx4DXhBjMAs80M0e11YBOaWVKF4bZSK9bLTsuK+zYG40NzyI3X b9okHWGxTZIl+R7MVD4HXhr+ X-Google-Smtp-Source: AGHT+IHswvGO/BsCpanzXCw3l9Yzeb9XsuqM1gWPXOnqP5h+AFTTxtYIt8BiUG5mY9q2I/pa9JygBg== X-Received: by 2002:a05:6358:cb27:b0:142:fb84:92e6 with SMTP id gr39-20020a056358cb2700b00142fb8492e6mr2190669rwb.9.1697727888774; Thu, 19 Oct 2023 08:04:48 -0700 (PDT) Received: from thinkpad ([117.202.186.40]) by smtp.gmail.com with ESMTPSA id h18-20020aa79f52000000b00692b6fe1c7asm5384074pfr.179.2023.10.19.08.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Oct 2023 08:04:48 -0700 (PDT) Date: Thu, 19 Oct 2023 20:34:41 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: 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@kernel.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, lpieralisi@kernel.org, maz@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20231019150441.GA7254@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@thinkpad> 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: On Tue, Oct 17, 2023 at 02:55:57PM -0400, Frank Li wrote: > On Wed, Oct 18, 2023 at 12:07:22AM +0530, Manivannan Sadhasivam wrote: > > On Mon, Sep 11, 2023 at 06:09:16PM -0400, Frank Li wrote: > > > This commit introduces a common method for sending messages from the Root > > > Complex (RC) to the Endpoint (EP) by utilizing the platform MSI interrupt > > > controller, such as ARM GIC, as an EP doorbell. Maps the memory assigned > > > for the BAR region by the PCI host to the message address of the platform > > > MSI interrupt controller in the PCI EP. As a result, when the PCI RC writes > > > > "Doorbell feature is implemented by mapping the EP's MSI interrupt controller > > message address to a dedicated BAR in the EPC core. It is the responsibility > > of the EPF driver to pass the actual message data to be written by the host to > > the doorbell BAR region through its own logic." > > > > > to the BAR region, it triggers an IRQ at the EP. This implementation serves > > > as a common method for all endpoint function drivers. > > > > > > However, it currently supports only one EP physical function due to > > > limitations in ARM MSI/IMS readiness. > > > > > > Signed-off-by: Frank Li > > > --- > > > drivers/pci/endpoint/pci-epc-core.c | 192 ++++++++++++++++++++++++++++ > > > drivers/pci/endpoint/pci-epf-core.c | 44 +++++++ > > > include/linux/pci-epc.h | 6 + > > > include/linux/pci-epf.h | 7 + > > > 4 files changed, 249 insertions(+) > > > > > > diff --git a/drivers/pci/endpoint/pci-epc-core.c b/drivers/pci/endpoint/pci-epc-core.c > > > index 5a4a8b0be6262..d336a99c6a94f 100644 > > > --- a/drivers/pci/endpoint/pci-epc-core.c > > > +++ b/drivers/pci/endpoint/pci-epc-core.c > > > @@ -10,6 +10,7 @@ > > > #include > > > #include > > > > > > +#include > > > #include > > > #include > > > #include > > > @@ -783,6 +784,197 @@ void pci_epc_bme_notify(struct pci_epc *epc) > > > } > > > EXPORT_SYMBOL_GPL(pci_epc_bme_notify); > > > > > > +/** > > > + * pci_epc_alloc_doorbell() - alloc an address space to let RC trigger EP side IRQ by write data to > > > + * the space. > > > > "Allocate platform specific doorbell IRQs to be used by the host to trigger > > doorbells on EP." > > > > > + * > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > > EPC device for which the doorbell needs to be allocated > > > > > + * @func_no: the physical endpoint function number in the EPC device. > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > + * @num_msgs: the total number of doorbell messages > > > > s/num_msgs/num_db > > > > > + * > > > + * Return: 0 success, other is failure > > > + */ > > > +int pci_epc_alloc_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no, int num_msgs) > > > +{ > > > + int ret; > > > + > > > + if (IS_ERR_OR_NULL(epc) || func_no >= epc->max_functions) > > > + return -EINVAL; > > > + > > > + if (vfunc_no > 0 && (!epc->max_vfs || vfunc_no > epc->max_vfs[func_no])) > > > + return -EINVAL; > > > + > > > + if (!epc->ops->alloc_doorbell) > > > + return 0; > > > > You mentioned 0 is a success. So if there is no callback, you want to return > > success? > > > > > + > > > + mutex_lock(&epc->lock); > > > + ret = epc->ops->alloc_doorbell(epc, func_no, vfunc_no, num_msgs); > > > > Why can't you just call the generic function here and in other places instead of > > implementing callbacks? I do not see a necessity for EPC specific callbacks. If > > there is one, please specify. > > 1. Refer v1 your comments. > https://lore.kernel.org/imx/20230906145227.GC5930@thinkpad/ I do not find where I suggested the callback approach. > 2. Maybe some ep controller have built-in doorbell support. Write to some > address to trigger doorbell irq. > We will handle it whenever such EP controllers arrive. Until then, let's keep it simple. - Mani > Frank > > > > > > + mutex_unlock(&epc->lock); > > > + > > > + return ret; > > > +} > > > +EXPORT_SYMBOL_GPL(pci_epc_alloc_doorbell); > > > + > > > +/** > > > + * pci_epc_free_doorbell() - free resource allocated by pci_epc_alloc_doorbell() > > > + * > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > > Same as above. > > > > > + * @func_no: the physical endpoint function number in the EPC device. > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > + * > > > + * Return: 0 success, other is failure > > > + */ > > > +void pci_epc_free_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no) > > > +{ > > > + if (IS_ERR_OR_NULL(epc) || func_no >= epc->max_functions) > > > + return; > > > + > > > + if (vfunc_no > 0 && (!epc->max_vfs || vfunc_no > epc->max_vfs[func_no])) > > > + return; > > > + > > > + if (!epc->ops->free_doorbell) > > > + return; > > > + > > > + mutex_lock(&epc->lock); > > > + epc->ops->free_doorbell(epc, func_no, vfunc_no); > > > > Same as suggested above. > > > > > + mutex_unlock(&epc->lock); > > > +} > > > +EXPORT_SYMBOL_GPL(pci_epc_free_doorbell); > > > + > > > +static irqreturn_t pci_epf_generic_doorbell_handler(int irq, void *data) > > > +{ > > > + struct pci_epf *epf = data; > > > + > > > + if (epf->event_ops && epf->event_ops->doorbell) > > > + epf->event_ops->doorbell(epf, irq - epf->virq_base); > > > > Same as suggested above. > > > > > + > > > + return IRQ_HANDLED; > > > +} > > > + > > > +static void pci_epc_generic_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg) > > > +{ > > > + struct pci_epc *epc = NULL; > > > + struct class_dev_iter iter; > > > + struct pci_epf *epf; > > > + struct device *dev; > > > + > > > + class_dev_iter_init(&iter, pci_epc_class, NULL, NULL); > > > + while ((dev = class_dev_iter_next(&iter))) { > > > + if (dev->parent != desc->dev) > > > + continue; > > > + > > > + epc = to_pci_epc(dev); > > > + > > > + class_dev_iter_exit(&iter); > > > + break; > > > + } > > > + > > > + if (!epc) > > > + return; > > > + > > > + /* Only support one EPF for doorbell */ > > > + epf = list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list); > > > + > > > > No need of this newline > > > > > + if (!epf) > > > + return; > > > + > > > + if (epf->msg && desc->msi_index < epf->num_msgs) > > > + epf->msg[desc->msi_index] = *msg; > > > +} > > > + > > > + > > > > Remove extra newline > > > > > +/** > > > + * pci_epc_generic_alloc_doorbell() - Common help function. Allocate address space from MSI > > > + * controller > > > + * > > > + * @epc: the EPC device that need doorbell address and data from RC. > > > + * @func_no: the physical endpoint function number in the EPC device. > > > + * @vfunc_no: the virtual endpoint function number in the physical function. > > > + * @num_msgs: the total number of doorbell messages > > > + * > > > > Same comment as for pci_epc_alloc_doorbell() > > > > > + * Remark: use this function only if EPC driver just register one EPC device. > > > + * > > > + * Return: 0 success, other is failure > > > + */ > > > +int pci_epc_generic_alloc_doorbell(struct pci_epc *epc, u8 func_no, u8 vfunc_no, int num_msgs) > > > +{ > > > + struct pci_epf *epf; > > > + struct device *dev; > > > + int virq, last; > > > + int ret; > > > + int i; > > > + > > > + if (IS_ERR_OR_NULL(epc)) > > > + return -EINVAL; > > > + > > > + /* Currently only support one func and one vfunc for doorbell */ > > > + if (func_no || vfunc_no) > > > + return -EINVAL; > > > + > > > + epf = list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list); > > > + if (!epf) > > > + return -EINVAL; > > > + > > > + dev = epc->dev.parent; > > > + ret = platform_msi_domain_alloc_irqs(dev, num_msgs, pci_epc_generic_write_msi_msg); > > > + if (ret) { > > > + dev_err(dev, "Failed to allocate MSI\n"); > > > + return -ENOMEM; > > > + } > > > + > > > + last = -1; > > > + for (i = 0; i < num_msgs; i++) { > > > > You should iterate over msi_desc as below: > > > > msi_lock_descs(dev); > > msi_for_each_desc(desc, dev, MSI_DESC_ALL) { > > ... > > } > > msi_unlock_descs(dev); > > > > > + virq = msi_get_virq(dev, i); > > > + if (i == 0) > > > + epf->virq_base = virq; > > > + > > > + ret = request_irq(virq, pci_epf_generic_doorbell_handler, 0, > > > > request_irq(desc->irq, ...) > > > > > + kasprintf(GFP_KERNEL, "pci-epc-doorbell%d", i), epf); > > > + > > > + if (ret) { > > > + dev_err(dev, "Failed to request doorbell\n"); > > > + goto err_free_irq; > > > + } > > > + last = i; > > > + } > > > + > > > + return 0; > > > + > > > +err_free_irq: > > > + for (i = 0; i < last; i++) > > > + kfree(free_irq(epf->virq_base + i, epf)); > > > + platform_msi_domain_free_irqs(dev); > > > + > > > + return -EINVAL; > > > > return ret; > > > > > +} > > > +EXPORT_SYMBOL_GPL(pci_epc_generic_alloc_doorbell); > > > + > > > > [...] > > > > > diff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h > > > index 3f44b6aec4770..485c146a5efe2 100644 > > > --- a/include/linux/pci-epf.h > > > +++ b/include/linux/pci-epf.h > > > @@ -79,6 +79,7 @@ struct pci_epc_event_ops { > > > int (*link_up)(struct pci_epf *epf); > > > int (*link_down)(struct pci_epf *epf); > > > int (*bme)(struct pci_epf *epf); > > > + int (*doorbell)(struct pci_epf *epf, int index); > > > > kdoc missing. > > > > > }; > > > > > > /** > > > @@ -180,6 +181,9 @@ struct pci_epf { > > > unsigned long vfunction_num_map; > > > struct list_head pci_vepf; > > > const struct pci_epc_event_ops *event_ops; > > > + struct msi_msg *msg; > > > + u16 num_msgs; > > > > num_db > > > > You also need to add kdoc for each new member. > > > > - 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 DFA18CDB465 for ; Thu, 19 Oct 2023 15:05:21 +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=CaTpWzcRbJGUvEKb9rTaXtdEIIXXuv2REWiYWs1Hrwc=; b=2lIJ8Gf9/R6rra ha1PksHMeLOAxbrn0IPNTXWPiVsni8vdUNGePfP+yg6Whl2hAwAlVTeUiuivqcSBhVRqzyCd/empM 4K39IGmHBRIx+r9zOPe9uQ+LY5U83KeVb4dmcuw/aQHmymojLelWOhdH9QCFokAlH+F96sniJpXAL wuJ/dPUTbK5IDvqJAayrKtIUd30BCwEpEIyOpuigpINynwibI/8PsefyWtQ7GgaBEHY7VloY0WSwT DL1/OcI7+TBy7TCPNIyxkUMRw2E9vh9UwH6d9vB7N2mFeEtqAjO7+OnIKvt15ezd2zvMRSpcRDWIU KdY+C7CgwmCT1Floz/8Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qtUZy-0009qD-1o; Thu, 19 Oct 2023 15:04:54 +0000 Received: from mail-oo1-xc2f.google.com ([2607:f8b0:4864:20::c2f]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qtUZv-0009pZ-1J for linux-arm-kernel@lists.infradead.org; Thu, 19 Oct 2023 15:04:53 +0000 Received: by mail-oo1-xc2f.google.com with SMTP id 006d021491bc7-57de6e502fcso4680051eaf.3 for ; Thu, 19 Oct 2023 08:04:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1697727889; x=1698332689; darn=lists.infradead.org; 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=IIXhQZU8Z4kn0kT0kPBF+vVNN+HKrEeu0tgZww4gEls=; b=zx7d7xN8qrVR6bUcl8QOVjEfhcOeCH7oAXBFILuFIB1xj+CYtWQaZvdigw/CxADU8N fTsxbMdPHD+XM1Vr8WRqVYrkAMabsT3RRlV4ubtIUDAlob7z/JQnOR1WqVoSFqP/xFD7 6Mm7BoxFTCaNuUnI8mNcsg84oBIi/LlQ0yQH51WP1p9lffIlICbX0689Yn4VBM7yEJsY 7RNXCcc7sdTV7+8L59EP1Pu5kNUc2qXe5D7yPshxtrglc4cmZjahxCftdi7Z4iQZ+WAw tLqvgwYY6anD3dGyXKQk3LT2ebGEV8L5f9Zux1FZkZPOKpuhXm9yiHvm/URMyaeEfmBF lQ+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1697727889; x=1698332689; 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=IIXhQZU8Z4kn0kT0kPBF+vVNN+HKrEeu0tgZww4gEls=; b=FDw0C6Y2QfWMAyMrXMGsRLkH+PpaqQa75UNHWvykbOKhyFu49GdKO+gsr3+cMRtB7G /ZQc3dHactNgw1x6hs0vVajORFaHEtHmxOwJnqTfw8v8Awr0v6ItqrIv+lGIUTf3S1jF p/53pg7B8Ie3D4RYKVFCEpdPHASN3YDT1TY3OhouGUW3/bHu2dNGXoYr+MtPs3PHaWGp tKYKrpCfdQUjFqo9f8yn18FvQCZYjTr2sDFmRV/9FDXXlXL29xcS85IbHeY6fAGwlOCj NUZ+MeWDHBwklcLSIQtZ+sh8iuB3bbO39ONmX6yp/LmupNizgaq7HYIEzhwBC3nPH1+a 4nEA== X-Gm-Message-State: AOJu0YzT075Mj0vA/MxaBmAmLWE052PlkOLC2/sQVbjW52XyxMF8CUwH h6WPLIrDEZ9Gtlb5w8IX8cvD X-Google-Smtp-Source: AGHT+IHswvGO/BsCpanzXCw3l9Yzeb9XsuqM1gWPXOnqP5h+AFTTxtYIt8BiUG5mY9q2I/pa9JygBg== X-Received: by 2002:a05:6358:cb27:b0:142:fb84:92e6 with SMTP id gr39-20020a056358cb2700b00142fb8492e6mr2190669rwb.9.1697727888774; Thu, 19 Oct 2023 08:04:48 -0700 (PDT) Received: from thinkpad ([117.202.186.40]) by smtp.gmail.com with ESMTPSA id h18-20020aa79f52000000b00692b6fe1c7asm5384074pfr.179.2023.10.19.08.04.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Oct 2023 08:04:48 -0700 (PDT) Date: Thu, 19 Oct 2023 20:34:41 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: 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@kernel.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, lpieralisi@kernel.org, maz@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org, tglx@linutronix.de Subject: Re: [PATCH v2 1/5] PCI: endpoint: Add RC-to-EP doorbell support using platform MSI controller Message-ID: <20231019150441.GA7254@thinkpad> References: <20230911220920.1817033-1-Frank.Li@nxp.com> <20230911220920.1817033-2-Frank.Li@nxp.com> <20231017183722.GB137137@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-20231019_080451_453129_B75C6137 X-CRM114-Status: GOOD ( 50.40 ) 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 T24gVHVlLCBPY3QgMTcsIDIwMjMgYXQgMDI6NTU6NTdQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gV2VkLCBPY3QgMTgsIDIwMjMgYXQgMTI6MDc6MjJBTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gTW9uLCBTZXAgMTEsIDIwMjMgYXQgMDY6MDk6MTZQTSAt MDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+IFRoaXMgY29tbWl0IGludHJvZHVjZXMgYSBjb21t b24gbWV0aG9kIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGZyb20gdGhlIFJvb3QKPiA+ID4gQ29tcGxl eCAoUkMpIHRvIHRoZSBFbmRwb2ludCAoRVApIGJ5IHV0aWxpemluZyB0aGUgcGxhdGZvcm0gTVNJ IGludGVycnVwdAo+ID4gPiBjb250cm9sbGVyLCBzdWNoIGFzIEFSTSBHSUMsIGFzIGFuIEVQIGRv b3JiZWxsLiBNYXBzIHRoZSBtZW1vcnkgYXNzaWduZWQKPiA+ID4gZm9yIHRoZSBCQVIgcmVnaW9u IGJ5IHRoZSBQQ0kgaG9zdCB0byB0aGUgbWVzc2FnZSBhZGRyZXNzIG9mIHRoZSBwbGF0Zm9ybQo+ ID4gPiBNU0kgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gdGhlIFBDSSBFUC4gQXMgYSByZXN1bHQs IHdoZW4gdGhlIFBDSSBSQyB3cml0ZXMKPiA+IAo+ID4gIkRvb3JiZWxsIGZlYXR1cmUgaXMgaW1w bGVtZW50ZWQgYnkgbWFwcGluZyB0aGUgRVAncyBNU0kgaW50ZXJydXB0IGNvbnRyb2xsZXIKPiA+ IG1lc3NhZ2UgYWRkcmVzcyB0byBhIGRlZGljYXRlZCBCQVIgaW4gdGhlIEVQQyBjb3JlLiBJdCBp cyB0aGUgcmVzcG9uc2liaWxpdHkKPiA+IG9mIHRoZSBFUEYgZHJpdmVyIHRvIHBhc3MgdGhlIGFj dHVhbCBtZXNzYWdlIGRhdGEgdG8gYmUgd3JpdHRlbiBieSB0aGUgaG9zdCB0bwo+ID4gdGhlIGRv b3JiZWxsIEJBUiByZWdpb24gdGhyb3VnaCBpdHMgb3duIGxvZ2ljLiIKPiA+IAo+ID4gPiB0byB0 aGUgQkFSIHJlZ2lvbiwgaXQgdHJpZ2dlcnMgYW4gSVJRIGF0IHRoZSBFUC4gVGhpcyBpbXBsZW1l bnRhdGlvbiBzZXJ2ZXMKPiA+ID4gYXMgYSBjb21tb24gbWV0aG9kIGZvciBhbGwgZW5kcG9pbnQg ZnVuY3Rpb24gZHJpdmVycy4KPiA+ID4gCj4gPiA+IEhvd2V2ZXIsIGl0IGN1cnJlbnRseSBzdXBw b3J0cyBvbmx5IG9uZSBFUCBwaHlzaWNhbCBmdW5jdGlvbiBkdWUgdG8KPiA+ID4gbGltaXRhdGlv bnMgaW4gQVJNIE1TSS9JTVMgcmVhZGluZXNzLgo+ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTog RnJhbmsgTGkgPEZyYW5rLkxpQG54cC5jb20+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9wY2kv ZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMgfCAxOTIgKysrKysrKysrKysrKysrKysrKysrKysrKysr Kwo+ID4gPiAgZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwZi1jb3JlLmMgfCAgNDQgKysrKysr Kwo+ID4gPiAgaW5jbHVkZS9saW51eC9wY2ktZXBjLmggICAgICAgICAgICAgfCAgIDYgKwo+ID4g PiAgaW5jbHVkZS9saW51eC9wY2ktZXBmLmggICAgICAgICAgICAgfCAgIDcgKwo+ID4gPiAgNCBm aWxlcyBjaGFuZ2VkLCAyNDkgaW5zZXJ0aW9ucygrKQo+ID4gPiAKPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvcGNpL2VuZHBvaW50L3BjaS1lcGMtY29yZS5jIGIvZHJpdmVycy9wY2kvZW5kcG9p bnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4gaW5kZXggNWE0YThiMGJlNjI2Mi4uZDMzNmE5OWM2YTk0 ZiAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMK PiA+ID4gKysrIGIvZHJpdmVycy9wY2kvZW5kcG9pbnQvcGNpLWVwYy1jb3JlLmMKPiA+ID4gQEAg LTEwLDYgKzEwLDcgQEAKPiA+ID4gICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4gPiA+ICAjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiA+ICAKPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9tc2ku aD4KPiA+ID4gICNpbmNsdWRlIDxsaW51eC9wY2ktZXBjLmg+Cj4gPiA+ICAjaW5jbHVkZSA8bGlu dXgvcGNpLWVwZi5oPgo+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L3BjaS1lcC1jZnMuaD4KPiA+ID4g QEAgLTc4Myw2ICs3ODQsMTk3IEBAIHZvaWQgcGNpX2VwY19ibWVfbm90aWZ5KHN0cnVjdCBwY2lf ZXBjICplcGMpCj4gPiA+ICB9Cj4gPiA+ICBFWFBPUlRfU1lNQk9MX0dQTChwY2lfZXBjX2JtZV9u b3RpZnkpOwo+ID4gPiAgCj4gPiA+ICsvKioKPiA+ID4gKyAqIHBjaV9lcGNfYWxsb2NfZG9vcmJl bGwoKSAtIGFsbG9jIGFuIGFkZHJlc3Mgc3BhY2UgdG8gbGV0IFJDIHRyaWdnZXIgRVAgc2lkZSBJ UlEgYnkgd3JpdGUgZGF0YSB0bwo+ID4gPiArICoJCQkgICAgICB0aGUgc3BhY2UuCj4gPiAKPiA+ ICJBbGxvY2F0ZSBwbGF0Zm9ybSBzcGVjaWZpYyBkb29yYmVsbCBJUlFzIHRvIGJlIHVzZWQgYnkg dGhlIGhvc3QgdG8gdHJpZ2dlcgo+ID4gZG9vcmJlbGxzIG9uIEVQLiIKPiA+IAo+ID4gPiArICoK PiA+ID4gKyAqIEBlcGM6IHRoZSBFUEMgZGV2aWNlIHRoYXQgbmVlZCBkb29yYmVsbCBhZGRyZXNz IGFuZCBkYXRhIGZyb20gUkMuCj4gPiAKPiA+IEVQQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBkb29y YmVsbCBuZWVkcyB0byBiZSBhbGxvY2F0ZWQKPiA+IAo+ID4gPiArICogQGZ1bmNfbm86IHRoZSBw aHlzaWNhbCBlbmRwb2ludCBmdW5jdGlvbiBudW1iZXIgaW4gdGhlIEVQQyBkZXZpY2UuCj4gPiA+ ICsgKiBAdmZ1bmNfbm86IHRoZSB2aXJ0dWFsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0 aGUgcGh5c2ljYWwgZnVuY3Rpb24uCj4gPiA+ICsgKiBAbnVtX21zZ3M6IHRoZSB0b3RhbCBudW1i ZXIgb2YgZG9vcmJlbGwgbWVzc2FnZXMKPiA+IAo+ID4gcy9udW1fbXNncy9udW1fZGIKPiA+IAo+ ID4gPiArICoKPiA+ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBvdGhlciBpcyBmYWlsdXJlCj4g PiA+ICsgKi8KPiA+ID4gK2ludCBwY2lfZXBjX2FsbG9jX2Rvb3JiZWxsKHN0cnVjdCBwY2lfZXBj ICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5jX25vLCBpbnQgbnVtX21zZ3MpCj4gPiA+ICt7Cj4g PiA+ICsJaW50IHJldDsKPiA+ID4gKwo+ID4gPiArCWlmIChJU19FUlJfT1JfTlVMTChlcGMpIHx8 IGZ1bmNfbm8gPj0gZXBjLT5tYXhfZnVuY3Rpb25zKQo+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsK PiA+ID4gKwo+ID4gPiArCWlmICh2ZnVuY19ubyA+IDAgJiYgKCFlcGMtPm1heF92ZnMgfHwgdmZ1 bmNfbm8gPiBlcGMtPm1heF92ZnNbZnVuY19ub10pKQo+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsK PiA+ID4gKwo+ID4gPiArCWlmICghZXBjLT5vcHMtPmFsbG9jX2Rvb3JiZWxsKQo+ID4gPiArCQly ZXR1cm4gMDsKPiA+IAo+ID4gWW91IG1lbnRpb25lZCAwIGlzIGEgc3VjY2Vzcy4gU28gaWYgdGhl cmUgaXMgbm8gY2FsbGJhY2ssIHlvdSB3YW50IHRvIHJldHVybgo+ID4gc3VjY2Vzcz8KPiA+IAo+ ID4gPiArCj4gPiA+ICsJbXV0ZXhfbG9jaygmZXBjLT5sb2NrKTsKPiA+ID4gKwlyZXQgPSBlcGMt Pm9wcy0+YWxsb2NfZG9vcmJlbGwoZXBjLCBmdW5jX25vLCB2ZnVuY19ubywgbnVtX21zZ3MpOwo+ ID4gCj4gPiBXaHkgY2FuJ3QgeW91IGp1c3QgY2FsbCB0aGUgZ2VuZXJpYyBmdW5jdGlvbiBoZXJl IGFuZCBpbiBvdGhlciBwbGFjZXMgaW5zdGVhZCBvZgo+ID4gaW1wbGVtZW50aW5nIGNhbGxiYWNr cz8gSSBkbyBub3Qgc2VlIGEgbmVjZXNzaXR5IGZvciBFUEMgc3BlY2lmaWMgY2FsbGJhY2tzLiBJ Zgo+ID4gdGhlcmUgaXMgb25lLCBwbGVhc2Ugc3BlY2lmeS4KPiAKPiAxLiBSZWZlciB2MSB5b3Vy IGNvbW1lbnRzLgo+IGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2lteC8yMDIzMDkwNjE0NTIyNy5H QzU5MzBAdGhpbmtwYWQvCgpJIGRvIG5vdCBmaW5kIHdoZXJlIEkgc3VnZ2VzdGVkIHRoZSBjYWxs YmFjayBhcHByb2FjaC4KCj4gMi4gTWF5YmUgc29tZSBlcCBjb250cm9sbGVyIGhhdmUgYnVpbHQt aW4gZG9vcmJlbGwgc3VwcG9ydC4gV3JpdGUgdG8gc29tZQo+IGFkZHJlc3MgdG8gdHJpZ2dlciBk b29yYmVsbCBpcnEuCj4gCgpXZSB3aWxsIGhhbmRsZSBpdCB3aGVuZXZlciBzdWNoIEVQIGNvbnRy b2xsZXJzIGFycml2ZS4gVW50aWwgdGhlbiwgbGV0J3Mga2VlcCBpdApzaW1wbGUuCgotIE1hbmkK Cj4gRnJhbmsKPiAKPiA+IAo+ID4gPiArCW11dGV4X3VubG9jaygmZXBjLT5sb2NrKTsKPiA+ID4g Kwo+ID4gPiArCXJldHVybiByZXQ7Cj4gPiA+ICt9Cj4gPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChw Y2lfZXBjX2FsbG9jX2Rvb3JiZWxsKTsKPiA+ID4gKwo+ID4gPiArLyoqCj4gPiA+ICsgKiBwY2lf ZXBjX2ZyZWVfZG9vcmJlbGwoKSAtIGZyZWUgcmVzb3VyY2UgYWxsb2NhdGVkIGJ5IHBjaV9lcGNf YWxsb2NfZG9vcmJlbGwoKQo+ID4gPiArICoKPiA+ID4gKyAqIEBlcGM6IHRoZSBFUEMgZGV2aWNl IHRoYXQgbmVlZCBkb29yYmVsbCBhZGRyZXNzIGFuZCBkYXRhIGZyb20gUkMuCj4gPiAKPiA+IFNh bWUgYXMgYWJvdmUuCj4gPiAKPiA+ID4gKyAqIEBmdW5jX25vOiB0aGUgcGh5c2ljYWwgZW5kcG9p bnQgZnVuY3Rpb24gbnVtYmVyIGluIHRoZSBFUEMgZGV2aWNlLgo+ID4gPiArICogQHZmdW5jX25v OiB0aGUgdmlydHVhbCBlbmRwb2ludCBmdW5jdGlvbiBudW1iZXIgaW4gdGhlIHBoeXNpY2FsIGZ1 bmN0aW9uLgo+ID4gPiArICoKPiA+ID4gKyAqIFJldHVybjogMCBzdWNjZXNzLCBvdGhlciBpcyBm YWlsdXJlCj4gPiA+ICsgKi8KPiA+ID4gK3ZvaWQgcGNpX2VwY19mcmVlX2Rvb3JiZWxsKHN0cnVj dCBwY2lfZXBjICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5jX25vKQo+ID4gPiArewo+ID4gPiAr CWlmIChJU19FUlJfT1JfTlVMTChlcGMpIHx8IGZ1bmNfbm8gPj0gZXBjLT5tYXhfZnVuY3Rpb25z KQo+ID4gPiArCQlyZXR1cm47Cj4gPiA+ICsKPiA+ID4gKwlpZiAodmZ1bmNfbm8gPiAwICYmICgh ZXBjLT5tYXhfdmZzIHx8IHZmdW5jX25vID4gZXBjLT5tYXhfdmZzW2Z1bmNfbm9dKSkKPiA+ID4g KwkJcmV0dXJuOwo+ID4gPiArCj4gPiA+ICsJaWYgKCFlcGMtPm9wcy0+ZnJlZV9kb29yYmVsbCkK PiA+ID4gKwkJcmV0dXJuOwo+ID4gPiArCj4gPiA+ICsJbXV0ZXhfbG9jaygmZXBjLT5sb2NrKTsK PiA+ID4gKwllcGMtPm9wcy0+ZnJlZV9kb29yYmVsbChlcGMsIGZ1bmNfbm8sIHZmdW5jX25vKTsK PiA+IAo+ID4gU2FtZSBhcyBzdWdnZXN0ZWQgYWJvdmUuCj4gPiAKPiA+ID4gKwltdXRleF91bmxv Y2soJmVwYy0+bG9jayk7Cj4gPiA+ICt9Cj4gPiA+ICtFWFBPUlRfU1lNQk9MX0dQTChwY2lfZXBj X2ZyZWVfZG9vcmJlbGwpOwo+ID4gPiArCj4gPiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgcGNpX2Vw Zl9nZW5lcmljX2Rvb3JiZWxsX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKPiA+ID4gK3sK PiA+ID4gKwlzdHJ1Y3QgcGNpX2VwZiAqZXBmID0gZGF0YTsKPiA+ID4gKwo+ID4gPiArCWlmIChl cGYtPmV2ZW50X29wcyAmJiBlcGYtPmV2ZW50X29wcy0+ZG9vcmJlbGwpCj4gPiA+ICsJCWVwZi0+ ZXZlbnRfb3BzLT5kb29yYmVsbChlcGYsIGlycSAtIGVwZi0+dmlycV9iYXNlKTsKPiA+IAo+ID4g U2FtZSBhcyBzdWdnZXN0ZWQgYWJvdmUuCj4gPiAKPiA+ID4gKwo+ID4gPiArCXJldHVybiBJUlFf SEFORExFRDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIHZvaWQgcGNpX2VwY19nZW5l cmljX3dyaXRlX21zaV9tc2coc3RydWN0IG1zaV9kZXNjICpkZXNjLCBzdHJ1Y3QgbXNpX21zZyAq bXNnKQo+ID4gPiArewo+ID4gPiArCXN0cnVjdCBwY2lfZXBjICplcGMgPSBOVUxMOwo+ID4gPiAr CXN0cnVjdCBjbGFzc19kZXZfaXRlciBpdGVyOwo+ID4gPiArCXN0cnVjdCBwY2lfZXBmICplcGY7 Cj4gPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Owo+ID4gPiArCj4gPiA+ICsJY2xhc3NfZGV2X2l0 ZXJfaW5pdCgmaXRlciwgcGNpX2VwY19jbGFzcywgTlVMTCwgTlVMTCk7Cj4gPiA+ICsJd2hpbGUg KChkZXYgPSBjbGFzc19kZXZfaXRlcl9uZXh0KCZpdGVyKSkpIHsKPiA+ID4gKwkJaWYgKGRldi0+ cGFyZW50ICE9IGRlc2MtPmRldikKPiA+ID4gKwkJCWNvbnRpbnVlOwo+ID4gPiArCj4gPiA+ICsJ CWVwYyA9IHRvX3BjaV9lcGMoZGV2KTsKPiA+ID4gKwo+ID4gPiArCQljbGFzc19kZXZfaXRlcl9l eGl0KCZpdGVyKTsKPiA+ID4gKwkJYnJlYWs7Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJaWYg KCFlcGMpCj4gPiA+ICsJCXJldHVybjsKPiA+ID4gKwo+ID4gPiArCS8qIE9ubHkgc3VwcG9ydCBv bmUgRVBGIGZvciBkb29yYmVsbCAqLwo+ID4gPiArCWVwZiA9IGxpc3RfZmlyc3RfZW50cnlfb3Jf bnVsbCgmZXBjLT5wY2lfZXBmLCBzdHJ1Y3QgcGNpX2VwZiwgbGlzdCk7Cj4gPiA+ICsKPiA+IAo+ ID4gTm8gbmVlZCBvZiB0aGlzIG5ld2xpbmUKPiA+IAo+ID4gPiArCWlmICghZXBmKQo+ID4gPiAr CQlyZXR1cm47Cj4gPiA+ICsKPiA+ID4gKwlpZiAoZXBmLT5tc2cgJiYgZGVzYy0+bXNpX2luZGV4 IDwgZXBmLT5udW1fbXNncykKPiA+ID4gKwkJZXBmLT5tc2dbZGVzYy0+bXNpX2luZGV4XSA9ICpt c2c7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gKwo+ID4gCj4gPiBSZW1vdmUgZXh0cmEgbmV3bGlu ZQo+ID4gCj4gPiA+ICsvKioKPiA+ID4gKyAqIHBjaV9lcGNfZ2VuZXJpY19hbGxvY19kb29yYmVs bCgpIC0gQ29tbW9uIGhlbHAgZnVuY3Rpb24uIEFsbG9jYXRlIGFkZHJlc3Mgc3BhY2UgZnJvbSBN U0kKPiA+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxl cgo+ID4gPiArICoKPiA+ID4gKyAqIEBlcGM6IHRoZSBFUEMgZGV2aWNlIHRoYXQgbmVlZCBkb29y YmVsbCBhZGRyZXNzIGFuZCBkYXRhIGZyb20gUkMuCj4gPiA+ICsgKiBAZnVuY19ubzogdGhlIHBo eXNpY2FsIGVuZHBvaW50IGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgRVBDIGRldmljZS4KPiA+ID4g KyAqIEB2ZnVuY19ubzogdGhlIHZpcnR1YWwgZW5kcG9pbnQgZnVuY3Rpb24gbnVtYmVyIGluIHRo ZSBwaHlzaWNhbCBmdW5jdGlvbi4KPiA+ID4gKyAqIEBudW1fbXNnczogdGhlIHRvdGFsIG51bWJl ciBvZiBkb29yYmVsbCBtZXNzYWdlcwo+ID4gPiArICoKPiA+IAo+ID4gU2FtZSBjb21tZW50IGFz IGZvciBwY2lfZXBjX2FsbG9jX2Rvb3JiZWxsKCkKPiA+IAo+ID4gPiArICogUmVtYXJrOiB1c2Ug dGhpcyBmdW5jdGlvbiBvbmx5IGlmIEVQQyBkcml2ZXIganVzdCByZWdpc3RlciBvbmUgRVBDIGRl dmljZS4KPiA+ID4gKyAqCj4gPiA+ICsgKiBSZXR1cm46IDAgc3VjY2Vzcywgb3RoZXIgaXMgZmFp bHVyZQo+ID4gPiArICovCj4gPiA+ICtpbnQgcGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3JiZWxs KHN0cnVjdCBwY2lfZXBjICplcGMsIHU4IGZ1bmNfbm8sIHU4IHZmdW5jX25vLCBpbnQgbnVtX21z Z3MpCj4gPiA+ICt7Cj4gPiA+ICsJc3RydWN0IHBjaV9lcGYgKmVwZjsKPiA+ID4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXY7Cj4gPiA+ICsJaW50IHZpcnEsIGxhc3Q7Cj4gPiA+ICsJaW50IHJldDsKPiA+ ID4gKwlpbnQgaTsKPiA+ID4gKwo+ID4gPiArCWlmIChJU19FUlJfT1JfTlVMTChlcGMpKQo+ID4g PiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ID4gKwo+ID4gPiArCS8qIEN1cnJlbnRseSBvbmx5IHN1 cHBvcnQgb25lIGZ1bmMgYW5kIG9uZSB2ZnVuYyBmb3IgZG9vcmJlbGwgKi8KPiA+ID4gKwlpZiAo ZnVuY19ubyB8fCB2ZnVuY19ubykKPiA+ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ICsKPiA+ ID4gKwllcGYgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwYy0+cGNpX2VwZiwgc3RydWN0 IHBjaV9lcGYsIGxpc3QpOwo+ID4gPiArCWlmICghZXBmKQo+ID4gPiArCQlyZXR1cm4gLUVJTlZB TDsKPiA+ID4gKwo+ID4gPiArCWRldiA9IGVwYy0+ZGV2LnBhcmVudDsKPiA+ID4gKwlyZXQgPSBw bGF0Zm9ybV9tc2lfZG9tYWluX2FsbG9jX2lycXMoZGV2LCBudW1fbXNncywgcGNpX2VwY19nZW5l cmljX3dyaXRlX21zaV9tc2cpOwo+ID4gPiArCWlmIChyZXQpIHsKPiA+ID4gKwkJZGV2X2Vycihk ZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTVNJXG4iKTsKPiA+ID4gKwkJcmV0dXJuIC1FTk9NRU07 Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJbGFzdCA9IC0xOwo+ID4gPiArCWZvciAoaSA9IDA7 IGkgPCBudW1fbXNnczsgaSsrKSB7Cj4gPiAKPiA+IFlvdSBzaG91bGQgaXRlcmF0ZSBvdmVyIG1z aV9kZXNjIGFzIGJlbG93Ogo+ID4gCj4gPiAgICAgICAgIG1zaV9sb2NrX2Rlc2NzKGRldik7Cj4g PiAgICAgICAgIG1zaV9mb3JfZWFjaF9kZXNjKGRlc2MsIGRldiwgTVNJX0RFU0NfQUxMKSB7Cj4g PiAJCS4uLgo+ID4gCX0KPiA+IAltc2lfdW5sb2NrX2Rlc2NzKGRldik7Cj4gPiAKPiA+ID4gKwkJ dmlycSA9IG1zaV9nZXRfdmlycShkZXYsIGkpOwo+ID4gPiArCQlpZiAoaSA9PSAwKQo+ID4gPiAr CQkJZXBmLT52aXJxX2Jhc2UgPSB2aXJxOwo+ID4gPiArCj4gPiA+ICsJCXJldCA9IHJlcXVlc3Rf aXJxKHZpcnEsIHBjaV9lcGZfZ2VuZXJpY19kb29yYmVsbF9oYW5kbGVyLCAwLAo+ID4gCj4gPiAJ cmVxdWVzdF9pcnEoZGVzYy0+aXJxLCAuLi4pCj4gPiAKPiA+ID4gKwkJCQkgIGthc3ByaW50ZihH RlBfS0VSTkVMLCAicGNpLWVwYy1kb29yYmVsbCVkIiwgaSksIGVwZik7Cj4gPiA+ICsKPiA+ID4g KwkJaWYgKHJldCkgewo+ID4gPiArCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBk b29yYmVsbFxuIik7Cj4gPiA+ICsJCQlnb3RvIGVycl9mcmVlX2lycTsKPiA+ID4gKwkJfQo+ID4g PiArCQlsYXN0ID0gaTsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gMDsKPiA+ID4g Kwo+ID4gPiArZXJyX2ZyZWVfaXJxOgo+ID4gPiArCWZvciAoaSA9IDA7IGkgPCBsYXN0OyBpKysp Cj4gPiA+ICsJCWtmcmVlKGZyZWVfaXJxKGVwZi0+dmlycV9iYXNlICsgaSwgZXBmKSk7Cj4gPiA+ ICsJcGxhdGZvcm1fbXNpX2RvbWFpbl9mcmVlX2lycXMoZGV2KTsKPiA+ID4gKwo+ID4gPiArCXJl dHVybiAtRUlOVkFMOwo+ID4gCj4gPiAJcmV0dXJuIHJldDsKPiA+IAo+ID4gPiArfQo+ID4gPiAr RVhQT1JUX1NZTUJPTF9HUEwocGNpX2VwY19nZW5lcmljX2FsbG9jX2Rvb3JiZWxsKTsKPiA+ID4g Kwo+ID4gCj4gPiBbLi4uXQo+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bj aS1lcGYuaCBiL2luY2x1ZGUvbGludXgvcGNpLWVwZi5oCj4gPiA+IGluZGV4IDNmNDRiNmFlYzQ3 NzAuLjQ4NWMxNDZhNWVmZTIgMTAwNjQ0Cj4gPiA+IC0tLSBhL2luY2x1ZGUvbGludXgvcGNpLWVw Zi5oCj4gPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvcGNpLWVwZi5oCj4gPiA+IEBAIC03OSw2ICs3 OSw3IEBAIHN0cnVjdCBwY2lfZXBjX2V2ZW50X29wcyB7Cj4gPiA+ICAJaW50ICgqbGlua191cCko c3RydWN0IHBjaV9lcGYgKmVwZik7Cj4gPiA+ICAJaW50ICgqbGlua19kb3duKShzdHJ1Y3QgcGNp X2VwZiAqZXBmKTsKPiA+ID4gIAlpbnQgKCpibWUpKHN0cnVjdCBwY2lfZXBmICplcGYpOwo+ID4g PiArCWludCAoKmRvb3JiZWxsKShzdHJ1Y3QgcGNpX2VwZiAqZXBmLCBpbnQgaW5kZXgpOwo+ID4g Cj4gPiBrZG9jIG1pc3NpbmcuCj4gPiAKPiA+ID4gIH07Cj4gPiA+ICAKPiA+ID4gIC8qKgo+ID4g PiBAQCAtMTgwLDYgKzE4MSw5IEBAIHN0cnVjdCBwY2lfZXBmIHsKPiA+ID4gIAl1bnNpZ25lZCBs b25nCQl2ZnVuY3Rpb25fbnVtX21hcDsKPiA+ID4gIAlzdHJ1Y3QgbGlzdF9oZWFkCXBjaV92ZXBm Owo+ID4gPiAgCWNvbnN0IHN0cnVjdCBwY2lfZXBjX2V2ZW50X29wcyAqZXZlbnRfb3BzOwo+ID4g PiArCXN0cnVjdCBtc2lfbXNnICptc2c7Cj4gPiA+ICsJdTE2IG51bV9tc2dzOwo+ID4gCj4gPiBu dW1fZGIKPiA+IAo+ID4gWW91IGFsc28gbmVlZCB0byBhZGQga2RvYyBmb3IgZWFjaCBuZXcgbWVt YmVyLgo+ID4gCj4gPiAtIE1hbmkKPiA+IAo+ID4gLS0gCj4gPiDgrq7grqPgrr/grrXgrqPgr43g rqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCgotLSAK4K6u4K6j4K6/4K614K6j4K+N 4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QK bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=