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=-19.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,USER_AGENT_GIT autolearn=ham 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 12D5DC433B4 for ; Thu, 6 May 2021 15:33:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D8768613D6 for ; Thu, 6 May 2021 15:33:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235562AbhEFPeE (ORCPT ); Thu, 6 May 2021 11:34:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:45940 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235527AbhEFPds (ORCPT ); Thu, 6 May 2021 11:33:48 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4E8C461434; Thu, 6 May 2021 15:32:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620315170; bh=1sKdRSDWZQDgd5KUeWJnyAld8807tC29lRbcEtY4HEA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UtD+5ok6KQaP3oZRK5I7CcxMyHMmBrBNWE1KRjfI+AKAaCu6riOACR2lQSooforV2 gU9Y7z2NUCjHFzIFvO2Xg+y697IoSWcxnLQZmSxeL1G5JBIG5W1FsH+afh4EzZc35x cJfVjZfzhbCL/VEvws1f9eG/vI6wycpWFbogUWxE+ErHS5BP7mqYy1WbeWppOlrrU2 cHDXRZpllZUTLswV6VuPVLeXQe3qBvEMdKpExhmZwrG2y7Lp7xJ05zGvsHkvrrZzzY SIrSLnqlsiSSHfd/VQTv79uYzRfEWLxpjbzpxC8+nmufhEE5AQIKTWnCnZVbzmS39o QseH1/RE0B01A== Received: by pali.im (Postfix) id 083448A1; Thu, 6 May 2021 17:32:50 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Thomas Petazzoni , Rob Herring , Bjorn Helgaas Cc: Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Remi Pommarel , Xogium , Tomasz Maciej Nowak , Marc Zyngier , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 20/42] PCI: aardvark: Add support for more than 32 MSI interrupts Date: Thu, 6 May 2021 17:31:31 +0200 Message-Id: <20210506153153.30454-21-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210506153153.30454-1-pali@kernel.org> References: <20210506153153.30454-1-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Aardvark HW can handle MSI interrupt with any 16-bit number. Received MSI interrupt number is visible in PCIE_MSI_PAYLOAD_REG register after clearing corresponding bit in PCIE_MSI_STATUS_REG register. The first 32 interrupt numbers are currently stored in linear map in MSI inner domain. Store the rest in dynamic radix tree for space efficiency. Free interrupt numbers (available for MSI inner domain allocation) for the first 32 interrupts are currently stored in a bitmap. For the rest, introduce a linked list of allocated regions. In the most common scenario there is only one PCIe card connected on boards with Armada 3720 SoC. Since in Multi-MSI mode the PCIe device can use at most 32 interrupts, all these interrupts are allocated in the linear map of MSI inner domain and marked as used in the bitmap. For less common scenarios with PCIe devices with multiple functions or with a PCIe Bridge with packet switches with more connected PCIe devices more than 32 interrupts are requested. In this case, store each interrupt range from each interrupt request into the linked list as one node. In the worst case every PCIe function will occupy one node in this linked list. This change allows to use all 32 Multi-MSI interrupts on every connected PCIe card on the Turris Mox router with Mox G module. Signed-off-by: Pali Rohár Reviewed-by: Marek Behún --- drivers/pci/controller/pci-aardvark.c | 71 ++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 7 deletions(-) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 199015215779..d74e84b0e689 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -178,11 +178,18 @@ #define RETRAIN_WAIT_MAX_RETRIES 10 #define RETRAIN_WAIT_USLEEP_US 2000 -#define MSI_IRQ_NUM 32 +#define MSI_IRQ_LINEAR_COUNT 32 +#define MSI_IRQ_TOTAL_COUNT 65536 #define CFG_RD_UR_VAL 0xffffffff #define CFG_RD_CRS_VAL 0xffff0001 +struct advk_msi_range { + struct list_head list; + u16 first; + u16 count; +}; + struct advk_pcie { struct platform_device *pdev; void __iomem *base; @@ -193,7 +200,8 @@ struct advk_pcie { struct irq_chip msi_bottom_irq_chip; struct irq_chip msi_irq_chip; struct msi_domain_info msi_domain_info; - DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); + DECLARE_BITMAP(msi_used_linear, MSI_IRQ_LINEAR_COUNT); + struct list_head msi_used_radix; struct mutex msi_used_lock; int link_gen; struct pci_bridge_emul bridge; @@ -885,12 +893,44 @@ static int advk_msi_irq_domain_alloc(struct irq_domain *domain, unsigned int nr_irqs, void *args) { struct advk_pcie *pcie = domain->host_data; + struct advk_msi_range *msi_range, *msi_range_prev, *msi_range_next; + unsigned int first, count, last; int hwirq, i; mutex_lock(&pcie->msi_used_lock); - hwirq = bitmap_find_free_region(pcie->msi_used, MSI_IRQ_NUM, + + /* First few used interrupt numbers are marked in bitmap (the most common) */ + hwirq = bitmap_find_free_region(pcie->msi_used_linear, MSI_IRQ_LINEAR_COUNT, order_base_2(nr_irqs)); + + /* And rest used interrupt numbers are stored in linked list as ranges */ + if (hwirq < 0) { + count = 1 << order_base_2(nr_irqs); + msi_range_prev = list_entry(&pcie->msi_used_radix, typeof(*msi_range), list); + do { + msi_range_next = list_next_entry(msi_range_prev, list); + last = list_entry_is_head(msi_range_next, &pcie->msi_used_radix, list) + ? MSI_IRQ_TOTAL_COUNT : msi_range_next->first; + first = list_entry_is_head(msi_range_prev, &pcie->msi_used_radix, list) + ? MSI_IRQ_LINEAR_COUNT : round_up(msi_range_prev->first + + msi_range_prev->count, count); + if (first + count > last) { + msi_range_prev = msi_range_next; + continue; + } + msi_range = kzalloc(sizeof(*msi_range), GFP_KERNEL); + if (msi_range) { + hwirq = first; + msi_range->first = first; + msi_range->count = count; + list_add(&msi_range->list, &msi_range_prev->list); + } + break; + } while (!list_entry_is_head(msi_range_next, &pcie->msi_used_radix, list)); + } + mutex_unlock(&pcie->msi_used_lock); + if (hwirq < 0) return -ENOSPC; @@ -908,9 +948,20 @@ static void advk_msi_irq_domain_free(struct irq_domain *domain, { struct irq_data *d = irq_domain_get_irq_data(domain, virq); struct advk_pcie *pcie = domain->host_data; + struct advk_msi_range *msi_range; mutex_lock(&pcie->msi_used_lock); - bitmap_release_region(pcie->msi_used, d->hwirq, order_base_2(nr_irqs)); + if (d->hwirq < MSI_IRQ_LINEAR_COUNT) { + bitmap_release_region(pcie->msi_used_linear, d->hwirq, order_base_2(nr_irqs)); + } else { + list_for_each_entry(msi_range, &pcie->msi_used_radix, list) { + if (msi_range->first != d->hwirq) + continue; + list_del(&msi_range->list); + kfree(msi_range); + break; + } + } mutex_unlock(&pcie->msi_used_lock); } @@ -967,6 +1018,7 @@ static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) struct msi_domain_info *msi_di; mutex_init(&pcie->msi_used_lock); + INIT_LIST_HEAD(&pcie->msi_used_radix); bottom_ic = &pcie->msi_bottom_irq_chip; @@ -982,9 +1034,14 @@ static int advk_pcie_init_msi_irq_domain(struct advk_pcie *pcie) MSI_FLAG_MULTI_PCI_MSI; msi_di->chip = msi_ic; + /* + * Aardvark HW can handle MSI interrupt with any 16bit number. + * For optimization first few interrupts are allocated in linear map + * (which is common scenario) and rest are allocated in radix tree. + */ pcie->msi_inner_domain = - irq_domain_add_linear(NULL, MSI_IRQ_NUM, - &advk_msi_domain_ops, pcie); + __irq_domain_add(NULL, MSI_IRQ_LINEAR_COUNT, MSI_IRQ_TOTAL_COUNT, 0, + &advk_msi_domain_ops, pcie); if (!pcie->msi_inner_domain) return -ENOMEM; @@ -1052,7 +1109,7 @@ static void advk_pcie_handle_msi(struct advk_pcie *pcie) msi_val = advk_readl(pcie, PCIE_MSI_STATUS_REG); msi_status = msi_val & ((~msi_mask) & PCIE_MSI_ALL_MASK); - for (msi_idx = 0; msi_idx < MSI_IRQ_NUM; msi_idx++) { + for (msi_idx = 0; msi_idx < BITS_PER_TYPE(msi_status); msi_idx++) { if (!(BIT(msi_idx) & msi_status)) continue; -- 2.20.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 X-Spam-Level: X-Spam-Status: No, score=-17.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham 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 4ACD0C433B4 for ; Thu, 6 May 2021 15:46:49 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (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 D4765610A1 for ; Thu, 6 May 2021 15:46:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D4765610A1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=AwNqxR0XVGQKOMGeAndpaKM6EEMccyjbALti7o0+tAY=; b=Ysa9DTgDt6qgY2iB5mM1je2Oo 4I7j5UTnw4rJ7820/cuhEbwh/T1VK9PToNW2H2r79VUus9MXrlXOIL4bmwXv8OZ7sepGlKz/idS8t tHyV1e+F5h2ld0roB4HCyxeLtTeNQ49YeGoqUFt2y/w/cb97b1MDOf6s28AH2Zhg02FnzXy/Z0C4S w6yeCoRAy070njbmM2KcaF6sbXLxaMw2xxGiR27gM3YIp9kO3RZ2lD9wJTBFd2DlW8dSwSOVXskXA rgaDMpvjrZsA/5YNws4nasyh4RVNVmZhrYR1SPJevnU2rln/YZ4Wht4pGngf6Hsp7UCsqV8JS+E2m 6534qHR5w==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1legAm-004dyn-IC; Thu, 06 May 2021 15:44:21 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lefzp-004a7F-0r for linux-arm-kernel@desiato.infradead.org; Thu, 06 May 2021 15:33:02 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:Content-ID:Content-Description; bh=UDcVYQTqbz9OseTq0S0QydX4WFu/9YqW2MhPwXkVW/I=; b=VO3z1+vNWoxQ7OUL4AwXcd/ihp jroZ/QJzvaXlTOFLj3MCnbwQsL5L7w0cizJ3tWWwXtDFz/CFAuPNeQ0Mrw0msgxnWj6m9jbqFmsyo t6+527QZ2OaUVMWAmSs5eYUUWQkOX8uf/evEJ4D22ou9uUA3uyf8e+2+CAnkQHKAlENRP4F5tApp7 DKooVYaC32v9M3AQQ2dhF1x1iHdg5NxM51SP7U9pbFDXaqVf+pRKZQkS0XwPmx7C8fXlOC2yPLrKM sO6SIA+oJOQAEIF27oNhvwetvGoxp4k5t/0RJ8VMm0pZgYPa5ft74PFHZzuQK1Urum37tGi0fa/XM QHMIxqIQ==; Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1lefzi-0069lK-8A for linux-arm-kernel@lists.infradead.org; Thu, 06 May 2021 15:32:59 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4E8C461434; Thu, 6 May 2021 15:32:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1620315170; bh=1sKdRSDWZQDgd5KUeWJnyAld8807tC29lRbcEtY4HEA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UtD+5ok6KQaP3oZRK5I7CcxMyHMmBrBNWE1KRjfI+AKAaCu6riOACR2lQSooforV2 gU9Y7z2NUCjHFzIFvO2Xg+y697IoSWcxnLQZmSxeL1G5JBIG5W1FsH+afh4EzZc35x cJfVjZfzhbCL/VEvws1f9eG/vI6wycpWFbogUWxE+ErHS5BP7mqYy1WbeWppOlrrU2 cHDXRZpllZUTLswV6VuPVLeXQe3qBvEMdKpExhmZwrG2y7Lp7xJ05zGvsHkvrrZzzY SIrSLnqlsiSSHfd/VQTv79uYzRfEWLxpjbzpxC8+nmufhEE5AQIKTWnCnZVbzmS39o QseH1/RE0B01A== Received: by pali.im (Postfix) id 083448A1; Thu, 6 May 2021 17:32:50 +0200 (CEST) From: =?UTF-8?q?Pali=20Roh=C3=A1r?= To: Lorenzo Pieralisi , Thomas Petazzoni , Rob Herring , Bjorn Helgaas Cc: Russell King , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Remi Pommarel , Xogium , Tomasz Maciej Nowak , Marc Zyngier , linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 20/42] PCI: aardvark: Add support for more than 32 MSI interrupts Date: Thu, 6 May 2021 17:31:31 +0200 Message-Id: <20210506153153.30454-21-pali@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20210506153153.30454-1-pali@kernel.org> References: <20210506153153.30454-1-pali@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210506_083254_409640_86A55C66 X-CRM114-Status: GOOD ( 18.81 ) 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 QWFyZHZhcmsgSFcgY2FuIGhhbmRsZSBNU0kgaW50ZXJydXB0IHdpdGggYW55IDE2LWJpdCBudW1i ZXIuIFJlY2VpdmVkIE1TSQppbnRlcnJ1cHQgbnVtYmVyIGlzIHZpc2libGUgaW4gUENJRV9NU0lf UEFZTE9BRF9SRUcgcmVnaXN0ZXIgYWZ0ZXIgY2xlYXJpbmcKY29ycmVzcG9uZGluZyBiaXQgaW4g UENJRV9NU0lfU1RBVFVTX1JFRyByZWdpc3Rlci4KClRoZSBmaXJzdCAzMiBpbnRlcnJ1cHQgbnVt YmVycyBhcmUgY3VycmVudGx5IHN0b3JlZCBpbiBsaW5lYXIgbWFwIGluIE1TSQppbm5lciBkb21h aW4uIFN0b3JlIHRoZSByZXN0IGluIGR5bmFtaWMgcmFkaXggdHJlZSBmb3Igc3BhY2UgZWZmaWNp ZW5jeS4KCkZyZWUgaW50ZXJydXB0IG51bWJlcnMgKGF2YWlsYWJsZSBmb3IgTVNJIGlubmVyIGRv bWFpbiBhbGxvY2F0aW9uKSBmb3IgdGhlCmZpcnN0IDMyIGludGVycnVwdHMgYXJlIGN1cnJlbnRs eSBzdG9yZWQgaW4gYSBiaXRtYXAuIEZvciB0aGUgcmVzdCwKaW50cm9kdWNlIGEgbGlua2VkIGxp c3Qgb2YgYWxsb2NhdGVkIHJlZ2lvbnMuCgpJbiB0aGUgbW9zdCBjb21tb24gc2NlbmFyaW8gdGhl cmUgaXMgb25seSBvbmUgUENJZSBjYXJkIGNvbm5lY3RlZCBvbiBib2FyZHMKd2l0aCBBcm1hZGEg MzcyMCBTb0MuIFNpbmNlIGluIE11bHRpLU1TSSBtb2RlIHRoZSBQQ0llIGRldmljZSBjYW4gdXNl IGF0Cm1vc3QgMzIgaW50ZXJydXB0cywgYWxsIHRoZXNlIGludGVycnVwdHMgYXJlIGFsbG9jYXRl ZCBpbiB0aGUgbGluZWFyIG1hcCBvZgpNU0kgaW5uZXIgZG9tYWluIGFuZCBtYXJrZWQgYXMgdXNl ZCBpbiB0aGUgYml0bWFwLgoKRm9yIGxlc3MgY29tbW9uIHNjZW5hcmlvcyB3aXRoIFBDSWUgZGV2 aWNlcyB3aXRoIG11bHRpcGxlIGZ1bmN0aW9ucyBvciB3aXRoCmEgUENJZSBCcmlkZ2Ugd2l0aCBw YWNrZXQgc3dpdGNoZXMgd2l0aCBtb3JlIGNvbm5lY3RlZCBQQ0llIGRldmljZXMgbW9yZQp0aGFu IDMyIGludGVycnVwdHMgYXJlIHJlcXVlc3RlZC4gSW4gdGhpcyBjYXNlLCBzdG9yZSBlYWNoIGlu dGVycnVwdCByYW5nZQpmcm9tIGVhY2ggaW50ZXJydXB0IHJlcXVlc3QgaW50byB0aGUgbGlua2Vk IGxpc3QgYXMgb25lIG5vZGUuIEluIHRoZSB3b3JzdApjYXNlIGV2ZXJ5IFBDSWUgZnVuY3Rpb24g d2lsbCBvY2N1cHkgb25lIG5vZGUgaW4gdGhpcyBsaW5rZWQgbGlzdC4KClRoaXMgY2hhbmdlIGFs bG93cyB0byB1c2UgYWxsIDMyIE11bHRpLU1TSSBpbnRlcnJ1cHRzIG9uIGV2ZXJ5IGNvbm5lY3Rl ZApQQ0llIGNhcmQgb24gdGhlIFR1cnJpcyBNb3ggcm91dGVyIHdpdGggTW94IEcgbW9kdWxlLgoK U2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KUmV2aWV3ZWQtYnk6 IE1hcmVrIEJlaMO6biA8a2FiZWxAa2VybmVsLm9yZz4KLS0tCiBkcml2ZXJzL3BjaS9jb250cm9s bGVyL3BjaS1hYXJkdmFyay5jIHwgNzEgKysrKysrKysrKysrKysrKysrKysrKysrLS0tCiAxIGZp bGUgY2hhbmdlZCwgNjQgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jIGIvZHJpdmVycy9wY2kvY29u dHJvbGxlci9wY2ktYWFyZHZhcmsuYwppbmRleCAxOTkwMTUyMTU3NzkuLmQ3NGU4NGIwZTY4OSAx MDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYworKysgYi9k cml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1hYXJkdmFyay5jCkBAIC0xNzgsMTEgKzE3OCwxOCBA QAogI2RlZmluZSBSRVRSQUlOX1dBSVRfTUFYX1JFVFJJRVMJMTAKICNkZWZpbmUgUkVUUkFJTl9X QUlUX1VTTEVFUF9VUwkJMjAwMAogCi0jZGVmaW5lIE1TSV9JUlFfTlVNCQkJMzIKKyNkZWZpbmUg TVNJX0lSUV9MSU5FQVJfQ09VTlQJCTMyCisjZGVmaW5lIE1TSV9JUlFfVE9UQUxfQ09VTlQJCTY1 NTM2CiAKICNkZWZpbmUgQ0ZHX1JEX1VSX1ZBTAkJCTB4ZmZmZmZmZmYKICNkZWZpbmUgQ0ZHX1JE X0NSU19WQUwJCQkweGZmZmYwMDAxCiAKK3N0cnVjdCBhZHZrX21zaV9yYW5nZSB7CisJc3RydWN0 IGxpc3RfaGVhZCBsaXN0OworCXUxNiBmaXJzdDsKKwl1MTYgY291bnQ7Cit9OworCiBzdHJ1Y3Qg YWR2a19wY2llIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXZvaWQgX19pb21l bSAqYmFzZTsKQEAgLTE5Myw3ICsyMDAsOCBAQCBzdHJ1Y3QgYWR2a19wY2llIHsKIAlzdHJ1Y3Qg aXJxX2NoaXAgbXNpX2JvdHRvbV9pcnFfY2hpcDsKIAlzdHJ1Y3QgaXJxX2NoaXAgbXNpX2lycV9j aGlwOwogCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gbXNpX2RvbWFpbl9pbmZvOwotCURFQ0xBUkVf QklUTUFQKG1zaV91c2VkLCBNU0lfSVJRX05VTSk7CisJREVDTEFSRV9CSVRNQVAobXNpX3VzZWRf bGluZWFyLCBNU0lfSVJRX0xJTkVBUl9DT1VOVCk7CisJc3RydWN0IGxpc3RfaGVhZCBtc2lfdXNl ZF9yYWRpeDsKIAlzdHJ1Y3QgbXV0ZXggbXNpX3VzZWRfbG9jazsKIAlpbnQgbGlua19nZW47CiAJ c3RydWN0IHBjaV9icmlkZ2VfZW11bCBicmlkZ2U7CkBAIC04ODUsMTIgKzg5Myw0NCBAQCBzdGF0 aWMgaW50IGFkdmtfbXNpX2lycV9kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmRvbWFp biwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICphcmdzKQogewogCXN0cnVj dCBhZHZrX3BjaWUgKnBjaWUgPSBkb21haW4tPmhvc3RfZGF0YTsKKwlzdHJ1Y3QgYWR2a19tc2lf cmFuZ2UgKm1zaV9yYW5nZSwgKm1zaV9yYW5nZV9wcmV2LCAqbXNpX3JhbmdlX25leHQ7CisJdW5z aWduZWQgaW50IGZpcnN0LCBjb3VudCwgbGFzdDsKIAlpbnQgaHdpcnEsIGk7CiAKIAltdXRleF9s b2NrKCZwY2llLT5tc2lfdXNlZF9sb2NrKTsKLQlod2lycSA9IGJpdG1hcF9maW5kX2ZyZWVfcmVn aW9uKHBjaWUtPm1zaV91c2VkLCBNU0lfSVJRX05VTSwKKworCS8qIEZpcnN0IGZldyB1c2VkIGlu dGVycnVwdCBudW1iZXJzIGFyZSBtYXJrZWQgaW4gYml0bWFwICh0aGUgbW9zdCBjb21tb24pICov CisJaHdpcnEgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihwY2llLT5tc2lfdXNlZF9saW5lYXIs IE1TSV9JUlFfTElORUFSX0NPVU5ULAogCQkJCQlvcmRlcl9iYXNlXzIobnJfaXJxcykpOworCisJ LyogQW5kIHJlc3QgdXNlZCBpbnRlcnJ1cHQgbnVtYmVycyBhcmUgc3RvcmVkIGluIGxpbmtlZCBs aXN0IGFzIHJhbmdlcyAqLworCWlmIChod2lycSA8IDApIHsKKwkJY291bnQgPSAxIDw8IG9yZGVy X2Jhc2VfMihucl9pcnFzKTsKKwkJbXNpX3JhbmdlX3ByZXYgPSBsaXN0X2VudHJ5KCZwY2llLT5t c2lfdXNlZF9yYWRpeCwgdHlwZW9mKCptc2lfcmFuZ2UpLCBsaXN0KTsKKwkJZG8geworCQkJbXNp X3JhbmdlX25leHQgPSBsaXN0X25leHRfZW50cnkobXNpX3JhbmdlX3ByZXYsIGxpc3QpOworCQkJ bGFzdCA9IGxpc3RfZW50cnlfaXNfaGVhZChtc2lfcmFuZ2VfbmV4dCwgJnBjaWUtPm1zaV91c2Vk X3JhZGl4LCBsaXN0KQorCQkJCT8gTVNJX0lSUV9UT1RBTF9DT1VOVCA6IG1zaV9yYW5nZV9uZXh0 LT5maXJzdDsKKwkJCWZpcnN0ID0gbGlzdF9lbnRyeV9pc19oZWFkKG1zaV9yYW5nZV9wcmV2LCAm cGNpZS0+bXNpX3VzZWRfcmFkaXgsIGxpc3QpCisJCQkJPyBNU0lfSVJRX0xJTkVBUl9DT1VOVCA6 IHJvdW5kX3VwKG1zaV9yYW5nZV9wcmV2LT5maXJzdCArCisJCQkJCQkJCSAgbXNpX3JhbmdlX3By ZXYtPmNvdW50LCBjb3VudCk7CisJCQlpZiAoZmlyc3QgKyBjb3VudCA+IGxhc3QpIHsKKwkJCQlt c2lfcmFuZ2VfcHJldiA9IG1zaV9yYW5nZV9uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJ bXNpX3JhbmdlID0ga3phbGxvYyhzaXplb2YoKm1zaV9yYW5nZSksIEdGUF9LRVJORUwpOworCQkJ aWYgKG1zaV9yYW5nZSkgeworCQkJCWh3aXJxID0gZmlyc3Q7CisJCQkJbXNpX3JhbmdlLT5maXJz dCA9IGZpcnN0OworCQkJCW1zaV9yYW5nZS0+Y291bnQgPSBjb3VudDsKKwkJCQlsaXN0X2FkZCgm bXNpX3JhbmdlLT5saXN0LCAmbXNpX3JhbmdlX3ByZXYtPmxpc3QpOworCQkJfQorCQkJYnJlYWs7 CisJCX0gd2hpbGUgKCFsaXN0X2VudHJ5X2lzX2hlYWQobXNpX3JhbmdlX25leHQsICZwY2llLT5t c2lfdXNlZF9yYWRpeCwgbGlzdCkpOworCX0KKwogCW11dGV4X3VubG9jaygmcGNpZS0+bXNpX3Vz ZWRfbG9jayk7CisKIAlpZiAoaHdpcnEgPCAwKQogCQlyZXR1cm4gLUVOT1NQQzsKIApAQCAtOTA4 LDkgKzk0OCwyMCBAQCBzdGF0aWMgdm9pZCBhZHZrX21zaV9pcnFfZG9tYWluX2ZyZWUoc3RydWN0 IGlycV9kb21haW4gKmRvbWFpbiwKIHsKIAlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSBpcnFfZG9tYWlu X2dldF9pcnFfZGF0YShkb21haW4sIHZpcnEpOwogCXN0cnVjdCBhZHZrX3BjaWUgKnBjaWUgPSBk b21haW4tPmhvc3RfZGF0YTsKKwlzdHJ1Y3QgYWR2a19tc2lfcmFuZ2UgKm1zaV9yYW5nZTsKIAog CW11dGV4X2xvY2soJnBjaWUtPm1zaV91c2VkX2xvY2spOwotCWJpdG1hcF9yZWxlYXNlX3JlZ2lv bihwY2llLT5tc2lfdXNlZCwgZC0+aHdpcnEsIG9yZGVyX2Jhc2VfMihucl9pcnFzKSk7CisJaWYg KGQtPmh3aXJxIDwgTVNJX0lSUV9MSU5FQVJfQ09VTlQpIHsKKwkJYml0bWFwX3JlbGVhc2VfcmVn aW9uKHBjaWUtPm1zaV91c2VkX2xpbmVhciwgZC0+aHdpcnEsIG9yZGVyX2Jhc2VfMihucl9pcnFz KSk7CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtc2lfcmFuZ2UsICZwY2llLT5t c2lfdXNlZF9yYWRpeCwgbGlzdCkgeworCQkJaWYgKG1zaV9yYW5nZS0+Zmlyc3QgIT0gZC0+aHdp cnEpCisJCQkJY29udGludWU7CisJCQlsaXN0X2RlbCgmbXNpX3JhbmdlLT5saXN0KTsKKwkJCWtm cmVlKG1zaV9yYW5nZSk7CisJCQlicmVhazsKKwkJfQorCX0KIAltdXRleF91bmxvY2soJnBjaWUt Pm1zaV91c2VkX2xvY2spOwogfQogCkBAIC05NjcsNiArMTAxOCw3IEBAIHN0YXRpYyBpbnQgYWR2 a19wY2llX2luaXRfbXNpX2lycV9kb21haW4oc3RydWN0IGFkdmtfcGNpZSAqcGNpZSkKIAlzdHJ1 Y3QgbXNpX2RvbWFpbl9pbmZvICptc2lfZGk7CiAKIAltdXRleF9pbml0KCZwY2llLT5tc2lfdXNl ZF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcGNpZS0+bXNpX3VzZWRfcmFkaXgpOwogCiAJYm90 dG9tX2ljID0gJnBjaWUtPm1zaV9ib3R0b21faXJxX2NoaXA7CiAKQEAgLTk4Miw5ICsxMDM0LDE0 IEBAIHN0YXRpYyBpbnQgYWR2a19wY2llX2luaXRfbXNpX2lycV9kb21haW4oc3RydWN0IGFkdmtf cGNpZSAqcGNpZSkKIAkJTVNJX0ZMQUdfTVVMVElfUENJX01TSTsKIAltc2lfZGktPmNoaXAgPSBt c2lfaWM7CiAKKwkvKgorCSAqIEFhcmR2YXJrIEhXIGNhbiBoYW5kbGUgTVNJIGludGVycnVwdCB3 aXRoIGFueSAxNmJpdCBudW1iZXIuCisJICogRm9yIG9wdGltaXphdGlvbiBmaXJzdCBmZXcgaW50 ZXJydXB0cyBhcmUgYWxsb2NhdGVkIGluIGxpbmVhciBtYXAKKwkgKiAod2hpY2ggaXMgY29tbW9u IHNjZW5hcmlvKSBhbmQgcmVzdCBhcmUgYWxsb2NhdGVkIGluIHJhZGl4IHRyZWUuCisJICovCiAJ cGNpZS0+bXNpX2lubmVyX2RvbWFpbiA9Ci0JCWlycV9kb21haW5fYWRkX2xpbmVhcihOVUxMLCBN U0lfSVJRX05VTSwKLQkJCQkgICAgICAmYWR2a19tc2lfZG9tYWluX29wcywgcGNpZSk7CisJCV9f aXJxX2RvbWFpbl9hZGQoTlVMTCwgTVNJX0lSUV9MSU5FQVJfQ09VTlQsIE1TSV9JUlFfVE9UQUxf Q09VTlQsIDAsCisJCQkJICZhZHZrX21zaV9kb21haW5fb3BzLCBwY2llKTsKIAlpZiAoIXBjaWUt Pm1zaV9pbm5lcl9kb21haW4pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMDUyLDcgKzExMDks NyBAQCBzdGF0aWMgdm9pZCBhZHZrX3BjaWVfaGFuZGxlX21zaShzdHJ1Y3QgYWR2a19wY2llICpw Y2llKQogCW1zaV92YWwgPSBhZHZrX3JlYWRsKHBjaWUsIFBDSUVfTVNJX1NUQVRVU19SRUcpOwog CW1zaV9zdGF0dXMgPSBtc2lfdmFsICYgKCh+bXNpX21hc2spICYgUENJRV9NU0lfQUxMX01BU0sp OwogCi0JZm9yIChtc2lfaWR4ID0gMDsgbXNpX2lkeCA8IE1TSV9JUlFfTlVNOyBtc2lfaWR4Kysp IHsKKwlmb3IgKG1zaV9pZHggPSAwOyBtc2lfaWR4IDwgQklUU19QRVJfVFlQRShtc2lfc3RhdHVz KTsgbXNpX2lkeCsrKSB7CiAJCWlmICghKEJJVChtc2lfaWR4KSAmIG1zaV9zdGF0dXMpKQogCQkJ Y29udGludWU7CiAKLS0gCjIuMjAuMQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK