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 98A0FC433FE for ; Sun, 20 Feb 2022 19:34:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234790AbiBTTeV (ORCPT ); Sun, 20 Feb 2022 14:34:21 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:43226 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244630AbiBTTeV (ORCPT ); Sun, 20 Feb 2022 14:34:21 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8D0BB4506C for ; Sun, 20 Feb 2022 11:33:59 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2E37E60EF0 for ; Sun, 20 Feb 2022 19:33:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5142C340F5; Sun, 20 Feb 2022 19:33:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385638; bh=PblWfxvaUhZyRQBAqC2pjjMgYbO0y3fvBMCw0i0YvI8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bSmprwFw3gddkoe9XO5PiY7xPhM7xzxX6Dcygm0VB7yC4vFTkUEPvtJm2Z3k7EvTI YtoGoxnKz1rdIBrEShpwZm6JPtYgvRgHz/38zNL4aUoPM0pJiu/FZhPFUIDfbh9Emd hIhPNecHtMQzCDEaKEkoOUnjIX7kw9M9ybXJnvv9nYDAJL2THnuievMvmyORqLgygv VMTOELX6ezchbux5JVSTRyFbWIn7vln1HNtek20Mev00cW9/5nOdykLGIdfwIdTmbv /Dp0izX0yjqUvs6WHN7LpaB/Mkvufqh+Dx7kueCPLLsiqWHUdOSCnO+JCUo5EvLi3j phHmrnzvsFGjg== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Lorenzo Pieralisi , Bjorn Helgaas Cc: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Marc Zyngier , pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Gregory CLEMENT , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 03/18] PCI: aardvark: Add support for AER registers on emulated bridge Date: Sun, 20 Feb 2022 20:33:31 +0100 Message-Id: <20220220193346.23789-4-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220220193346.23789-1-kabel@kernel.org> References: <20220220193346.23789-1-kabel@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 From: Pali Rohár Aardvark controller supports Advanced Error Reporting configuration registers. Export these registers on the emulated root bridge via the new .read_ext and .write_ext methods. Note that in the Advanced Error Reporting Capability header the offset to the next Extended Capability header is set, but it is not documented in Armada 3700 Functional Specification. Since this change adds support only for Advanced Error Reporting, explicitly clear PCI_EXT_CAP_NEXT bits in AER capability header. Now the pcieport driver correctly detects AER support and allows PCIe AER driver to start receiving ERR interrupts. Kernel log now says: [ 4.358401] pcieport 0000:00:00.0: AER: enabled with IRQ 52 Signed-off-by: Pali Rohár Signed-off-by: Marek Behún --- drivers/pci/controller/pci-aardvark.c | 77 +++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c index 7621c9344a2b..01dd530e1b5f 100644 --- a/drivers/pci/controller/pci-aardvark.c +++ b/drivers/pci/controller/pci-aardvark.c @@ -33,6 +33,7 @@ #define PCIE_CORE_CMD_STATUS_REG 0x4 #define PCIE_CORE_DEV_REV_REG 0x8 #define PCIE_CORE_PCIEXP_CAP 0xc0 +#define PCIE_CORE_PCIERR_CAP 0x100 #define PCIE_CORE_ERR_CAPCTL_REG 0x118 #define PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX BIT(5) #define PCIE_CORE_ERR_CAPCTL_ECRC_CHK_TX_EN BIT(6) @@ -945,11 +946,87 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge, } } +static pci_bridge_emul_read_status_t +advk_pci_bridge_emul_ext_conf_read(struct pci_bridge_emul *bridge, + int reg, u32 *value) +{ + struct advk_pcie *pcie = bridge->data; + + switch (reg) { + case 0: + *value = advk_readl(pcie, PCIE_CORE_PCIERR_CAP + reg); + /* + * PCI_EXT_CAP_NEXT bits are set to offset 0x150, but Armada + * 3700 Functional Specification does not document registers + * at those addresses. + * Thus we clear PCI_EXT_CAP_NEXT bits to make Advanced Error + * Reporting Capability header the last of Extended + * Capabilities. (If we obtain documentation for those + * registers in the future, this can be changed.) + */ + *value &= 0x000fffff; + return PCI_BRIDGE_EMUL_HANDLED; + + case PCI_ERR_UNCOR_STATUS: + case PCI_ERR_UNCOR_MASK: + case PCI_ERR_UNCOR_SEVER: + case PCI_ERR_COR_STATUS: + case PCI_ERR_COR_MASK: + case PCI_ERR_CAP: + case PCI_ERR_HEADER_LOG + 0: + case PCI_ERR_HEADER_LOG + 4: + case PCI_ERR_HEADER_LOG + 8: + case PCI_ERR_HEADER_LOG + 12: + case PCI_ERR_ROOT_COMMAND: + case PCI_ERR_ROOT_STATUS: + case PCI_ERR_ROOT_ERR_SRC: + *value = advk_readl(pcie, PCIE_CORE_PCIERR_CAP + reg); + return PCI_BRIDGE_EMUL_HANDLED; + + default: + return PCI_BRIDGE_EMUL_NOT_HANDLED; + } +} + +static void +advk_pci_bridge_emul_ext_conf_write(struct pci_bridge_emul *bridge, + int reg, u32 old, u32 new, u32 mask) +{ + struct advk_pcie *pcie = bridge->data; + + switch (reg) { + /* These are W1C registers, so clear other bits */ + case PCI_ERR_UNCOR_STATUS: + case PCI_ERR_COR_STATUS: + case PCI_ERR_ROOT_STATUS: + new &= mask; + fallthrough; + + case PCI_ERR_UNCOR_MASK: + case PCI_ERR_UNCOR_SEVER: + case PCI_ERR_COR_MASK: + case PCI_ERR_CAP: + case PCI_ERR_HEADER_LOG + 0: + case PCI_ERR_HEADER_LOG + 4: + case PCI_ERR_HEADER_LOG + 8: + case PCI_ERR_HEADER_LOG + 12: + case PCI_ERR_ROOT_COMMAND: + case PCI_ERR_ROOT_ERR_SRC: + advk_writel(pcie, new, PCIE_CORE_PCIERR_CAP + reg); + break; + + default: + break; + } +} + static const struct pci_bridge_emul_ops advk_pci_bridge_emul_ops = { .read_base = advk_pci_bridge_emul_base_conf_read, .write_base = advk_pci_bridge_emul_base_conf_write, .read_pcie = advk_pci_bridge_emul_pcie_conf_read, .write_pcie = advk_pci_bridge_emul_pcie_conf_write, + .read_ext = advk_pci_bridge_emul_ext_conf_read, + .write_ext = advk_pci_bridge_emul_ext_conf_write, }; /* -- 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 1440BC433F5 for ; Sun, 20 Feb 2022 19:35:55 +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: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=mE/5tRqt+5IXxHy11HUQB1ahVApY3ZQr9KBsjr+iFng=; b=gIKIMjSC58UiH3 oZ6cwHVfkVETussLq6FzyzgaaxwDaCi5c0EL03cbjgrFtRRGjlKeVorJVQB6TAjeHJUkBqIFlR+jx VguKp1GQHt4SXgS+DyUJkOlNMXa0T3Qq0d3ao6U1tK2R6/m3eHgRhrhFMo6G0QSXLi7S0PeHaxIKg cbd6ltc1VuwjfuEJrl25/Pc+EbLpk4LO1n3U8YV1CVK0rZeN9zmUIJbyiWhLYJLx3ii7MWoee5h5S khDRa7ofmTW0zVZzV7BWqylxONKTFkn5ZMkQbJbUhXATeLEEiOXK2uShwregkBhETCrrsiNQWSulm BF4Ck2DnuouO/MRIociw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLryb-002BNG-IO; Sun, 20 Feb 2022 19:34:33 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nLry4-002B7p-5p for linux-arm-kernel@lists.infradead.org; Sun, 20 Feb 2022 19:34:01 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 2825A60EEF; Sun, 20 Feb 2022 19:33:59 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A5142C340F5; Sun, 20 Feb 2022 19:33:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1645385638; bh=PblWfxvaUhZyRQBAqC2pjjMgYbO0y3fvBMCw0i0YvI8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bSmprwFw3gddkoe9XO5PiY7xPhM7xzxX6Dcygm0VB7yC4vFTkUEPvtJm2Z3k7EvTI YtoGoxnKz1rdIBrEShpwZm6JPtYgvRgHz/38zNL4aUoPM0pJiu/FZhPFUIDfbh9Emd hIhPNecHtMQzCDEaKEkoOUnjIX7kw9M9ybXJnvv9nYDAJL2THnuievMvmyORqLgygv VMTOELX6ezchbux5JVSTRyFbWIn7vln1HNtek20Mev00cW9/5nOdykLGIdfwIdTmbv /Dp0izX0yjqUvs6WHN7LpaB/Mkvufqh+Dx7kueCPLLsiqWHUdOSCnO+JCUo5EvLi3j phHmrnzvsFGjg== From: =?UTF-8?q?Marek=20Beh=C3=BAn?= To: Lorenzo Pieralisi , Bjorn Helgaas Cc: =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Marc Zyngier , pali@kernel.org, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Gregory CLEMENT , =?UTF-8?q?Marek=20Beh=C3=BAn?= Subject: [PATCH 03/18] PCI: aardvark: Add support for AER registers on emulated bridge Date: Sun, 20 Feb 2022 20:33:31 +0100 Message-Id: <20220220193346.23789-4-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220220193346.23789-1-kabel@kernel.org> References: <20220220193346.23789-1-kabel@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220220_113400_336420_DCEF7DA0 X-CRM114-Status: GOOD ( 15.00 ) 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 RnJvbTogUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4KCkFhcmR2YXJrIGNvbnRyb2xsZXIg c3VwcG9ydHMgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIGNvbmZpZ3VyYXRpb24KcmVnaXN0ZXJz LgoKRXhwb3J0IHRoZXNlIHJlZ2lzdGVycyBvbiB0aGUgZW11bGF0ZWQgcm9vdCBicmlkZ2Ugdmlh IHRoZSBuZXcgLnJlYWRfZXh0CmFuZCAud3JpdGVfZXh0IG1ldGhvZHMuCgpOb3RlIHRoYXQgaW4g dGhlIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBDYXBhYmlsaXR5IGhlYWRlciB0aGUgb2Zmc2V0 CnRvIHRoZSBuZXh0IEV4dGVuZGVkIENhcGFiaWxpdHkgaGVhZGVyIGlzIHNldCwgYnV0IGl0IGlz IG5vdCBkb2N1bWVudGVkCmluIEFybWFkYSAzNzAwIEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbi4g U2luY2UgdGhpcyBjaGFuZ2UgYWRkcyBzdXBwb3J0Cm9ubHkgZm9yIEFkdmFuY2VkIEVycm9yIFJl cG9ydGluZywgZXhwbGljaXRseSBjbGVhciBQQ0lfRVhUX0NBUF9ORVhUCmJpdHMgaW4gQUVSIGNh cGFiaWxpdHkgaGVhZGVyLgoKTm93IHRoZSBwY2llcG9ydCBkcml2ZXIgY29ycmVjdGx5IGRldGVj dHMgQUVSIHN1cHBvcnQgYW5kIGFsbG93cyBQQ0llCkFFUiBkcml2ZXIgdG8gc3RhcnQgcmVjZWl2 aW5nIEVSUiBpbnRlcnJ1cHRzLiBLZXJuZWwgbG9nIG5vdyBzYXlzOgoKICAgIFsgICAgNC4zNTg0 MDFdIHBjaWVwb3J0IDAwMDA6MDA6MDAuMDogQUVSOiBlbmFibGVkIHdpdGggSVJRIDUyCgpTaWdu ZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaUBrZXJuZWwub3JnPgpTaWduZWQtb2ZmLWJ5OiBN YXJlayBCZWjDum4gPGthYmVsQGtlcm5lbC5vcmc+Ci0tLQogZHJpdmVycy9wY2kvY29udHJvbGxl ci9wY2ktYWFyZHZhcmsuYyB8IDc3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDc3IGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250 cm9sbGVyL3BjaS1hYXJkdmFyay5jIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZh cmsuYwppbmRleCA3NjIxYzkzNDRhMmIuLjAxZGQ1MzBlMWI1ZiAxMDA2NDQKLS0tIGEvZHJpdmVy cy9wY2kvY29udHJvbGxlci9wY2ktYWFyZHZhcmsuYworKysgYi9kcml2ZXJzL3BjaS9jb250cm9s bGVyL3BjaS1hYXJkdmFyay5jCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIFBDSUVfQ09SRV9D TURfU1RBVFVTX1JFRwkJCQkweDQKICNkZWZpbmUgUENJRV9DT1JFX0RFVl9SRVZfUkVHCQkJCQkw eDgKICNkZWZpbmUgUENJRV9DT1JFX1BDSUVYUF9DQVAJCQkJCTB4YzAKKyNkZWZpbmUgUENJRV9D T1JFX1BDSUVSUl9DQVAJCQkJCTB4MTAwCiAjZGVmaW5lIFBDSUVfQ09SRV9FUlJfQ0FQQ1RMX1JF RwkJCQkweDExOAogI2RlZmluZSAgICAgUENJRV9DT1JFX0VSUl9DQVBDVExfRUNSQ19DSEtfVFgJ CQlCSVQoNSkKICNkZWZpbmUgICAgIFBDSUVfQ09SRV9FUlJfQ0FQQ1RMX0VDUkNfQ0hLX1RYX0VO CQkJQklUKDYpCkBAIC05NDUsMTEgKzk0Niw4NyBAQCBhZHZrX3BjaV9icmlkZ2VfZW11bF9wY2ll X2NvbmZfd3JpdGUoc3RydWN0IHBjaV9icmlkZ2VfZW11bCAqYnJpZGdlLAogCX0KIH0KIAorc3Rh dGljIHBjaV9icmlkZ2VfZW11bF9yZWFkX3N0YXR1c190CithZHZrX3BjaV9icmlkZ2VfZW11bF9l eHRfY29uZl9yZWFkKHN0cnVjdCBwY2lfYnJpZGdlX2VtdWwgKmJyaWRnZSwKKwkJCQkgICBpbnQg cmVnLCB1MzIgKnZhbHVlKQoreworCXN0cnVjdCBhZHZrX3BjaWUgKnBjaWUgPSBicmlkZ2UtPmRh dGE7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgMDoKKwkJKnZhbHVlID0gYWR2a19yZWFkbChw Y2llLCBQQ0lFX0NPUkVfUENJRVJSX0NBUCArIHJlZyk7CisJCS8qCisJCSAqIFBDSV9FWFRfQ0FQ X05FWFQgYml0cyBhcmUgc2V0IHRvIG9mZnNldCAweDE1MCwgYnV0IEFybWFkYQorCQkgKiAzNzAw IEZ1bmN0aW9uYWwgU3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBkb2N1bWVudCByZWdpc3RlcnMKKwkJ ICogYXQgdGhvc2UgYWRkcmVzc2VzLgorCQkgKiBUaHVzIHdlIGNsZWFyIFBDSV9FWFRfQ0FQX05F WFQgYml0cyB0byBtYWtlIEFkdmFuY2VkIEVycm9yCisJCSAqIFJlcG9ydGluZyBDYXBhYmlsaXR5 IGhlYWRlciB0aGUgbGFzdCBvZiBFeHRlbmRlZAorCQkgKiBDYXBhYmlsaXRpZXMuIChJZiB3ZSBv YnRhaW4gZG9jdW1lbnRhdGlvbiBmb3IgdGhvc2UKKwkJICogcmVnaXN0ZXJzIGluIHRoZSBmdXR1 cmUsIHRoaXMgY2FuIGJlIGNoYW5nZWQuKQorCQkgKi8KKwkJKnZhbHVlICY9IDB4MDAwZmZmZmY7 CisJCXJldHVybiBQQ0lfQlJJREdFX0VNVUxfSEFORExFRDsKKworCWNhc2UgUENJX0VSUl9VTkNP Ul9TVEFUVVM6CisJY2FzZSBQQ0lfRVJSX1VOQ09SX01BU0s6CisJY2FzZSBQQ0lfRVJSX1VOQ09S X1NFVkVSOgorCWNhc2UgUENJX0VSUl9DT1JfU1RBVFVTOgorCWNhc2UgUENJX0VSUl9DT1JfTUFT SzoKKwljYXNlIFBDSV9FUlJfQ0FQOgorCWNhc2UgUENJX0VSUl9IRUFERVJfTE9HICsgMDoKKwlj YXNlIFBDSV9FUlJfSEVBREVSX0xPRyArIDQ6CisJY2FzZSBQQ0lfRVJSX0hFQURFUl9MT0cgKyA4 OgorCWNhc2UgUENJX0VSUl9IRUFERVJfTE9HICsgMTI6CisJY2FzZSBQQ0lfRVJSX1JPT1RfQ09N TUFORDoKKwljYXNlIFBDSV9FUlJfUk9PVF9TVEFUVVM6CisJY2FzZSBQQ0lfRVJSX1JPT1RfRVJS X1NSQzoKKwkJKnZhbHVlID0gYWR2a19yZWFkbChwY2llLCBQQ0lFX0NPUkVfUENJRVJSX0NBUCAr IHJlZyk7CisJCXJldHVybiBQQ0lfQlJJREdFX0VNVUxfSEFORExFRDsKKworCWRlZmF1bHQ6CisJ CXJldHVybiBQQ0lfQlJJREdFX0VNVUxfTk9UX0hBTkRMRUQ7CisJfQorfQorCitzdGF0aWMgdm9p ZAorYWR2a19wY2lfYnJpZGdlX2VtdWxfZXh0X2NvbmZfd3JpdGUoc3RydWN0IHBjaV9icmlkZ2Vf ZW11bCAqYnJpZGdlLAorCQkJCSAgICBpbnQgcmVnLCB1MzIgb2xkLCB1MzIgbmV3LCB1MzIgbWFz aykKK3sKKwlzdHJ1Y3QgYWR2a19wY2llICpwY2llID0gYnJpZGdlLT5kYXRhOworCisJc3dpdGNo IChyZWcpIHsKKwkvKiBUaGVzZSBhcmUgVzFDIHJlZ2lzdGVycywgc28gY2xlYXIgb3RoZXIgYml0 cyAqLworCWNhc2UgUENJX0VSUl9VTkNPUl9TVEFUVVM6CisJY2FzZSBQQ0lfRVJSX0NPUl9TVEFU VVM6CisJY2FzZSBQQ0lfRVJSX1JPT1RfU1RBVFVTOgorCQluZXcgJj0gbWFzazsKKwkJZmFsbHRo cm91Z2g7CisKKwljYXNlIFBDSV9FUlJfVU5DT1JfTUFTSzoKKwljYXNlIFBDSV9FUlJfVU5DT1Jf U0VWRVI6CisJY2FzZSBQQ0lfRVJSX0NPUl9NQVNLOgorCWNhc2UgUENJX0VSUl9DQVA6CisJY2Fz ZSBQQ0lfRVJSX0hFQURFUl9MT0cgKyAwOgorCWNhc2UgUENJX0VSUl9IRUFERVJfTE9HICsgNDoK KwljYXNlIFBDSV9FUlJfSEVBREVSX0xPRyArIDg6CisJY2FzZSBQQ0lfRVJSX0hFQURFUl9MT0cg KyAxMjoKKwljYXNlIFBDSV9FUlJfUk9PVF9DT01NQU5EOgorCWNhc2UgUENJX0VSUl9ST09UX0VS Ul9TUkM6CisJCWFkdmtfd3JpdGVsKHBjaWUsIG5ldywgUENJRV9DT1JFX1BDSUVSUl9DQVAgKyBy ZWcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGNv bnN0IHN0cnVjdCBwY2lfYnJpZGdlX2VtdWxfb3BzIGFkdmtfcGNpX2JyaWRnZV9lbXVsX29wcyA9 IHsKIAkucmVhZF9iYXNlID0gYWR2a19wY2lfYnJpZGdlX2VtdWxfYmFzZV9jb25mX3JlYWQsCiAJ LndyaXRlX2Jhc2UgPSBhZHZrX3BjaV9icmlkZ2VfZW11bF9iYXNlX2NvbmZfd3JpdGUsCiAJLnJl YWRfcGNpZSA9IGFkdmtfcGNpX2JyaWRnZV9lbXVsX3BjaWVfY29uZl9yZWFkLAogCS53cml0ZV9w Y2llID0gYWR2a19wY2lfYnJpZGdlX2VtdWxfcGNpZV9jb25mX3dyaXRlLAorCS5yZWFkX2V4dCA9 IGFkdmtfcGNpX2JyaWRnZV9lbXVsX2V4dF9jb25mX3JlYWQsCisJLndyaXRlX2V4dCA9IGFkdmtf cGNpX2JyaWRnZV9lbXVsX2V4dF9jb25mX3dyaXRlLAogfTsKIAogLyoKLS0gCjIuMzQuMQoKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1r ZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpo dHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJu ZWwK