From patchwork Thu Apr 20 15:17:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Roger_Pau_Monn=C3=A9?= X-Patchwork-Id: 9690791 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id F2F76600C8 for ; Thu, 20 Apr 2017 15:20:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D83722848D for ; Thu, 20 Apr 2017 15:20:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CCAC6284A5; Thu, 20 Apr 2017 15:20:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 0C2BD28490 for ; Thu, 20 Apr 2017 15:20:22 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d1DqN-0005rQ-3w; Thu, 20 Apr 2017 15:18:03 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1d1DqL-0005r6-GK for xen-devel@lists.xenproject.org; Thu, 20 Apr 2017 15:18:01 +0000 Received: from [85.158.137.68] by server-7.bemta-3.messagelabs.com id 52/B0-02202-821D8F85; Thu, 20 Apr 2017 15:18:00 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprNIsWRWlGSWpSXmKPExsXitHRDpK7GxR8 RBgcfcll83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBnfz/SxFnxRqti64wNTA+MU6S5GTg4JAX+J 660X2UFsNgEdiYtzd7J1MXJwiAioSNzeawASZhZIltiwYQMbiC0sECxx/ccHVhCbRUBV4v/df rBWXgFLiaNnLrFCjNSTeDvxBSPIGE4BK4nFn8JAwkJAJQd7jjNClAtKnJz5hAVivKZE6/bf7B C2vETz1tnMEPWKEv3zHrBNYOSbhaRlFpKWWUhaFjAyr2LUKE4tKkst0jUy10sqykzPKMlNzMz RNTQw1stNLS5OTE/NSUwq1kvOz93ECAy0egYGxh2MLXv9DjFKcjApifKqzf0RIcSXlJ9SmZFY nBFfVJqTWnyIUYaDQ0mC98l5oJxgUWp6akVaZg4w5GHSEhw8SiK8bSBp3uKCxNzizHSI1ClGR SlxiD4BkERGaR5cGyzOLjHKSgnzMjIwMAjxFKQW5WaWoMq/YhTnYFQS5uW+ADSFJzOvBG76K6 DFTECLz/qBLS5JREhJNTD6vN73+etttRm/pY2jjstb1MRrJAnu2TIl+KL0xvNCTec2WnIq3F9 122dxEEPf+XtbX57v0y35xfRSvSTtQKVhzJ+Uf1MOLPyQWro/7NN1zgcNpXq/G/8+OiOlJv/m yYO0c1+sluxr8LPb9Kfo0vmvpT3Hgu//zlXb2XtrR8mR7Q/DJoZVV5aJKLEUZyQaajEXFScCA CAOckmuAgAA X-Env-Sender: prvs=2769e1f82=roger.pau@citrix.com X-Msg-Ref: server-7.tower-31.messagelabs.com!1492701478!89051076!1 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.12; banners=-,-,- X-VirusChecked: Checked Received: (qmail 2442 invoked from network); 20 Apr 2017 15:17:59 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 20 Apr 2017 15:17:59 -0000 X-IronPort-AV: E=Sophos;i="5.37,225,1488844800"; d="scan'208";a="420092627" From: Roger Pau Monne To: Date: Thu, 20 Apr 2017 16:17:41 +0100 Message-ID: <20170420151743.90889-8-roger.pau@citrix.com> X-Mailer: git-send-email 2.11.0 (Apple Git-81) In-Reply-To: <20170420151743.90889-1-roger.pau@citrix.com> References: <20170420151743.90889-1-roger.pau@citrix.com> MIME-Version: 1.0 Cc: boris.ostrovsky@oracle.com, Roger Pau Monne Subject: [Xen-devel] [PATCH v2 7/9] vpci: add a priority field to the vPCI register initializer X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP And mark the capability and header vPCI register initializers as high priority, so that they are initialized first. This is needed for MSI-X, since MSI-X needs to know the position of the BARs in order to perform it's initialization, and in order to mask or enable the MSI/MSI-X functionality on demand. Signed-off-by: Roger Pau Monné --- Jan Beulich Andrew Cooper --- tools/tests/vpci/Makefile | 4 ++-- xen/drivers/vpci/capabilities.c | 2 +- xen/drivers/vpci/header.c | 2 +- xen/drivers/vpci/vpci.c | 14 ++++++++++++-- xen/include/xen/vpci.h | 13 +++++++++++-- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/tools/tests/vpci/Makefile b/tools/tests/vpci/Makefile index 7969fcbd82..e5edc4f512 100644 --- a/tools/tests/vpci/Makefile +++ b/tools/tests/vpci/Makefile @@ -31,8 +31,8 @@ vpci.c: $(XEN_ROOT)/xen/drivers/vpci/vpci.c # Trick the compiler so it doesn't complain about missing symbols sed -e '/#include/d' \ -e '1s;^;#include "emul.h"\ - const vpci_register_init_t __start_vpci_array[1]\;\ - const vpci_register_init_t __end_vpci_array[1]\;\ + const struct vpci_register_init __start_vpci_array[1]\;\ + const struct vpci_register_init __end_vpci_array[1]\;\ ;' <$< >$@ rbtree.h: $(XEN_ROOT)/xen/include/xen/rbtree.h diff --git a/xen/drivers/vpci/capabilities.c b/xen/drivers/vpci/capabilities.c index b2a3326aa7..204355e673 100644 --- a/xen/drivers/vpci/capabilities.c +++ b/xen/drivers/vpci/capabilities.c @@ -145,7 +145,7 @@ static int vpci_capabilities_init(struct pci_dev *pdev) return 0; } -REGISTER_VPCI_INIT(vpci_capabilities_init); +REGISTER_VPCI_INIT(vpci_capabilities_init, true); /* * Local variables: diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 808888c329..d77d82455f 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -256,7 +256,7 @@ static int vpci_init_bars(struct pci_dev *pdev) return 0; } -REGISTER_VPCI_INIT(vpci_init_bars); +REGISTER_VPCI_INIT(vpci_init_bars, true); /* * Local variables: diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index f4cd04f11d..9f9abadbdb 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -20,7 +20,7 @@ #include #include -extern const vpci_register_init_t __start_vpci_array[], __end_vpci_array[]; +extern const struct vpci_register_init __start_vpci_array[], __end_vpci_array[]; #define NUM_VPCI_INIT (__end_vpci_array - __start_vpci_array) #define vpci_init __start_vpci_array @@ -42,6 +42,7 @@ struct vpci_register { int xen_vpci_add_handlers(struct pci_dev *pdev) { int i, rc = 0; + bool priority = true; if ( !has_vpci(pdev->domain) ) return 0; @@ -52,9 +53,13 @@ int xen_vpci_add_handlers(struct pci_dev *pdev) pdev->vpci->handlers = RB_ROOT; + again: for ( i = 0; i < NUM_VPCI_INIT; i++ ) { - rc = vpci_init[i](pdev); + if ( priority != vpci_init[i].priority ) + continue; + + rc = vpci_init[i].init(pdev); if ( rc ) break; } @@ -74,6 +79,11 @@ int xen_vpci_add_handlers(struct pci_dev *pdev) } xfree(pdev->vpci); } + else if ( priority ) + { + priority = false; + goto again; + } return rc; } diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index 53443f5164..75564b9d93 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -29,8 +29,17 @@ typedef int (*vpci_write_t)(struct pci_dev *pdev, unsigned int reg, typedef int (*vpci_register_init_t)(struct pci_dev *dev); -#define REGISTER_VPCI_INIT(x) \ - static const vpci_register_init_t x##_entry __used_section(".data.vpci") = x +struct vpci_register_init { + vpci_register_init_t init; + bool priority; +}; + +#define REGISTER_VPCI_INIT(f, p) \ + static const struct vpci_register_init \ + x##_entry __used_section(".data.vpci") = { \ + .init = f, \ + .priority = p, \ +} /* Add vPCI handlers to device. */ int xen_vpci_add_handlers(struct pci_dev *dev);