From patchwork Wed Sep 22 10:14:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Andrushchenko X-Patchwork-Id: 12510001 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=-12.9 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNWANTED_LANGUAGE_BODY, 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 0ADC1C433EF for ; Wed, 22 Sep 2021 10:14:43 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 A0A57611B0 for ; Wed, 22 Sep 2021 10:14:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org A0A57611B0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.192409.342824 (Exim 4.92) (envelope-from ) id 1mSzGn-0003Qv-DV; Wed, 22 Sep 2021 10:14:29 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 192409.342824; Wed, 22 Sep 2021 10:14:29 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSzGn-0003Qo-8G; Wed, 22 Sep 2021 10:14:29 +0000 Received: by outflank-mailman (input) for mailman id 192409; Wed, 22 Sep 2021 10:14:28 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSzGl-0003Qi-VW for xen-devel@lists.xenproject.org; Wed, 22 Sep 2021 10:14:28 +0000 Received: from mail-lf1-x133.google.com (unknown [2a00:1450:4864:20::133]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 81ceafab-3834-45af-a5ff-6eee1c3e1f38; Wed, 22 Sep 2021 10:14:26 +0000 (UTC) Received: by mail-lf1-x133.google.com with SMTP id e15so9685285lfr.10 for ; Wed, 22 Sep 2021 03:14:26 -0700 (PDT) Received: from a2klaptop.epam.com (host-176-36-245-220.b024.la.net.ua. [176.36.245.220]) by smtp.gmail.com with ESMTPSA id k22sm184211ljm.18.2021.09.22.03.14.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Sep 2021 03:14:24 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 81ceafab-3834-45af-a5ff-6eee1c3e1f38 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=SvLayk7gLTLICLvUIqlFHN+Qd7wHHCUL73ogGPkKfx8=; b=dkrfcJFRtgM58BtsNkps8s/wg+2uBksUXZT7yMoNtS2Z7ULeyfkZ4w5Z4DEGDS8CqM qZDNTlKTqTfMUi3sz+S35Y6/nsbXQpGVWPkaBrrRvQ0BfCo1P0Iuw2KMLyiFQ5W7UQxi GLVSWFruCbLxZAWoD8Wg5K+pRM77JlbiSUuTjDIHpfVMOF0wfuhB5eYj9Uux96e0rQPe HhDSHZWqS1zOkWvLhvCAohmYlNGNI3roGCzGQ2ly8v5M1gSGPCbqnVSipAc6DXx6UdzN CfVzmKn654p7y4ejqoY6hn45KENIFY2FEa9usJqX2CCk7BLryqJgzPj3x8u4mw0glxAp pXnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=SvLayk7gLTLICLvUIqlFHN+Qd7wHHCUL73ogGPkKfx8=; b=PXsDlah+msW6MuDytbAGLrTBf4bedjMUaCy0XyywTmxyS5Dr2H0cGU6gOas8pj2kRe ZF3CDzC8I9LtzZQUnsn72hYnc3blon7plWnpJVTUAVOhVasGOwicJ+YKjgGwANuSoG4O ebAQ/xMaNzFhdtUMx5whPMNMcWVAAPdRZdtsfOpCZNNeAjr563DnGoB+U257fijA/xtl aB2VKUVk61UOEwVneDVFRQMgMB4pzzPeVIyztm7qwkmv0ymCWKrhNpv0gyVUgDPh5GoT AuxyF0Y2OyiTVRVdLPVLvXsbrHzslyCi5g+MSxfBuX3lmTO0wGqlMESE7Ijx9Ple6STn BzBQ== X-Gm-Message-State: AOAM530LrHWN9OENu5n50JD60qrnJCFecvk40NSloN4pr+UKN52cyivx 4Xr6ZoHK+iTCdAgUpKAYwUV6oxlj270nUw== X-Google-Smtp-Source: ABdhPJzEPEcaoU33JxJRvmxxIKFMw67F936g3tk7uJedNHMtFok0NvPUOOD9BNrp97mm81Fd5UBtoQ== X-Received: by 2002:a2e:545a:: with SMTP id y26mr28468856ljd.225.1632305665218; Wed, 22 Sep 2021 03:14:25 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Cc: boris.ostrovsky@oracle.com, jgross@suse.com, julien@xen.org, sstabellini@kernel.org, jbeulich@suse.com, Oleksandr Andrushchenko , Anastasiia Lukianenko Subject: [PATCH 1/2] xen-pciback: allow compiling on other archs than x86 Date: Wed, 22 Sep 2021 13:14:21 +0300 Message-Id: <20210922101422.2319240-1-andr2000@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 From: Oleksandr Andrushchenko Xen-pciback driver was designed to be built for x86 only. But it can also be used by other architectures, e.g. Arm. Re-structure the driver in a way that it can be built for other platforms as well. Signed-off-by: Oleksandr Andrushchenko Signed-off-by: Anastasiia Lukianenko --- Since v1: - Do not move pci_xen_initial_domain as it is x86 specific --- arch/x86/include/asm/xen/pci.h | 18 +------ arch/x86/pci/xen.c | 74 +---------------------------- drivers/xen/Kconfig | 2 +- drivers/xen/pci.c | 75 ++++++++++++++++++++++++++++++ drivers/xen/xen-pciback/pci_stub.c | 3 +- drivers/xen/xen-pciback/xenbus.c | 2 +- include/xen/pci.h | 28 +++++++++++ 7 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 include/xen/pci.h diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h index 3506d8c598c1..2889f091f459 100644 --- a/arch/x86/include/asm/xen/pci.h +++ b/arch/x86/include/asm/xen/pci.h @@ -16,26 +16,10 @@ static inline int pci_xen_hvm_init(void) #endif #if defined(CONFIG_XEN_DOM0) int __init pci_xen_initial_domain(void); -int xen_find_device_domain_owner(struct pci_dev *dev); -int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain); -int xen_unregister_device_domain_owner(struct pci_dev *dev); #else static inline int __init pci_xen_initial_domain(void) { - return -1; -} -static inline int xen_find_device_domain_owner(struct pci_dev *dev) -{ - return -1; -} -static inline int xen_register_device_domain_owner(struct pci_dev *dev, - uint16_t domain) -{ - return -1; -} -static inline int xen_unregister_device_domain_owner(struct pci_dev *dev) -{ - return -1; + return -1; } #endif diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index 3d41a09c2c14..4a45b0bf9ae4 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -583,77 +584,4 @@ int __init pci_xen_initial_domain(void) } return 0; } - -struct xen_device_domain_owner { - domid_t domain; - struct pci_dev *dev; - struct list_head list; -}; - -static DEFINE_SPINLOCK(dev_domain_list_spinlock); -static struct list_head dev_domain_list = LIST_HEAD_INIT(dev_domain_list); - -static struct xen_device_domain_owner *find_device(struct pci_dev *dev) -{ - struct xen_device_domain_owner *owner; - - list_for_each_entry(owner, &dev_domain_list, list) { - if (owner->dev == dev) - return owner; - } - return NULL; -} - -int xen_find_device_domain_owner(struct pci_dev *dev) -{ - struct xen_device_domain_owner *owner; - int domain = -ENODEV; - - spin_lock(&dev_domain_list_spinlock); - owner = find_device(dev); - if (owner) - domain = owner->domain; - spin_unlock(&dev_domain_list_spinlock); - return domain; -} -EXPORT_SYMBOL_GPL(xen_find_device_domain_owner); - -int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain) -{ - struct xen_device_domain_owner *owner; - - owner = kzalloc(sizeof(struct xen_device_domain_owner), GFP_KERNEL); - if (!owner) - return -ENODEV; - - spin_lock(&dev_domain_list_spinlock); - if (find_device(dev)) { - spin_unlock(&dev_domain_list_spinlock); - kfree(owner); - return -EEXIST; - } - owner->domain = domain; - owner->dev = dev; - list_add_tail(&owner->list, &dev_domain_list); - spin_unlock(&dev_domain_list_spinlock); - return 0; -} -EXPORT_SYMBOL_GPL(xen_register_device_domain_owner); - -int xen_unregister_device_domain_owner(struct pci_dev *dev) -{ - struct xen_device_domain_owner *owner; - - spin_lock(&dev_domain_list_spinlock); - owner = find_device(dev); - if (!owner) { - spin_unlock(&dev_domain_list_spinlock); - return -ENODEV; - } - list_del(&owner->list); - spin_unlock(&dev_domain_list_spinlock); - kfree(owner); - return 0; -} -EXPORT_SYMBOL_GPL(xen_unregister_device_domain_owner); #endif diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index a37eb52fb401..057ddf61ef61 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -182,7 +182,7 @@ config SWIOTLB_XEN config XEN_PCIDEV_BACKEND tristate "Xen PCI-device backend driver" - depends on PCI && X86 && XEN + depends on PCI && XEN depends on XEN_BACKEND default m help diff --git a/drivers/xen/pci.c b/drivers/xen/pci.c index 224df03ce42e..fc8c1249d49f 100644 --- a/drivers/xen/pci.c +++ b/drivers/xen/pci.c @@ -254,3 +254,78 @@ static int xen_mcfg_late(void) return 0; } #endif + +#ifdef CONFIG_XEN_DOM0 +struct xen_device_domain_owner { + domid_t domain; + struct pci_dev *dev; + struct list_head list; +}; + +static DEFINE_SPINLOCK(dev_domain_list_spinlock); +static struct list_head dev_domain_list = LIST_HEAD_INIT(dev_domain_list); + +static struct xen_device_domain_owner *find_device(struct pci_dev *dev) +{ + struct xen_device_domain_owner *owner; + + list_for_each_entry(owner, &dev_domain_list, list) { + if (owner->dev == dev) + return owner; + } + return NULL; +} + +int xen_find_device_domain_owner(struct pci_dev *dev) +{ + struct xen_device_domain_owner *owner; + int domain = -ENODEV; + + spin_lock(&dev_domain_list_spinlock); + owner = find_device(dev); + if (owner) + domain = owner->domain; + spin_unlock(&dev_domain_list_spinlock); + return domain; +} +EXPORT_SYMBOL_GPL(xen_find_device_domain_owner); + +int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain) +{ + struct xen_device_domain_owner *owner; + + owner = kzalloc(sizeof(struct xen_device_domain_owner), GFP_KERNEL); + if (!owner) + return -ENODEV; + + spin_lock(&dev_domain_list_spinlock); + if (find_device(dev)) { + spin_unlock(&dev_domain_list_spinlock); + kfree(owner); + return -EEXIST; + } + owner->domain = domain; + owner->dev = dev; + list_add_tail(&owner->list, &dev_domain_list); + spin_unlock(&dev_domain_list_spinlock); + return 0; +} +EXPORT_SYMBOL_GPL(xen_register_device_domain_owner); + +int xen_unregister_device_domain_owner(struct pci_dev *dev) +{ + struct xen_device_domain_owner *owner; + + spin_lock(&dev_domain_list_spinlock); + owner = find_device(dev); + if (!owner) { + spin_unlock(&dev_domain_list_spinlock); + return -ENODEV; + } + list_del(&owner->list); + spin_unlock(&dev_domain_list_spinlock); + kfree(owner); + return 0; +} +EXPORT_SYMBOL_GPL(xen_unregister_device_domain_owner); +#endif diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index f8e4faa96ad6..bba527620507 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c @@ -19,7 +19,8 @@ #include #include #include -#include +#include +#include #include #include #include "pciback.h" diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c index c09c7ebd6968..da34ce85dc88 100644 --- a/drivers/xen/xen-pciback/xenbus.c +++ b/drivers/xen/xen-pciback/xenbus.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include "pciback.h" #define INVALID_EVTCHN_IRQ (-1) diff --git a/include/xen/pci.h b/include/xen/pci.h new file mode 100644 index 000000000000..b8337cf85fd1 --- /dev/null +++ b/include/xen/pci.h @@ -0,0 +1,28 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __XEN_PCI_H__ +#define __XEN_PCI_H__ + +#if defined(CONFIG_XEN_DOM0) +int xen_find_device_domain_owner(struct pci_dev *dev); +int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain); +int xen_unregister_device_domain_owner(struct pci_dev *dev); +#else +static inline int xen_find_device_domain_owner(struct pci_dev *dev) +{ + return -1; +} + +static inline int xen_register_device_domain_owner(struct pci_dev *dev, + uint16_t domain) +{ + return -1; +} + +static inline int xen_unregister_device_domain_owner(struct pci_dev *dev) +{ + return -1; +} +#endif + +#endif From patchwork Wed Sep 22 10:14:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Andrushchenko X-Patchwork-Id: 12510003 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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,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 90406C4332F for ; Wed, 22 Sep 2021 10:14:43 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 4434D61178 for ; Wed, 22 Sep 2021 10:14:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 4434D61178 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.xenproject.org Received: from list by lists.xenproject.org with outflank-mailman.192410.342834 (Exim 4.92) (envelope-from ) id 1mSzGr-0003hj-Ja; Wed, 22 Sep 2021 10:14:33 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version Received: by outflank-mailman (output) from mailman id 192410.342834; Wed, 22 Sep 2021 10:14:33 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSzGr-0003hc-GJ; Wed, 22 Sep 2021 10:14:33 +0000 Received: by outflank-mailman (input) for mailman id 192410; Wed, 22 Sep 2021 10:14:32 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mSzGq-0003Qi-TU for xen-devel@lists.xenproject.org; Wed, 22 Sep 2021 10:14:32 +0000 Received: from mail-lf1-x131.google.com (unknown [2a00:1450:4864:20::131]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 2921a4ad-ee42-4ba1-9b79-4d81487bfd60; Wed, 22 Sep 2021 10:14:27 +0000 (UTC) Received: by mail-lf1-x131.google.com with SMTP id u18so9615082lfd.12 for ; Wed, 22 Sep 2021 03:14:27 -0700 (PDT) Received: from a2klaptop.epam.com (host-176-36-245-220.b024.la.net.ua. [176.36.245.220]) by smtp.gmail.com with ESMTPSA id k22sm184211ljm.18.2021.09.22.03.14.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Sep 2021 03:14:25 -0700 (PDT) X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 2921a4ad-ee42-4ba1-9b79-4d81487bfd60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=S7YpcnCy6xLh/G7NWgBXppr94/jTIZ707mYLR+adzZ8=; b=MDb9bj+gV09rJeEKWwfvQ8F7islMHLhb2Zr1D7kZc7sP8kkdgMOggtYc3qWGwo9Eh6 qMZQLSayzx1bD+4+fPjFwbIF0VJXuP5XqdJ9AkKF8oBameS5fS60pO5B8UFBl/pVsXx+ CQnuUtkzfFIKGIIBjJZ1MeJ4XZKb0EeKi7HB4KP4vne0AQT8UYaKAzLpDEji52Io5mEr 64P++MrKK7N0AFqKV8Y7yLVE6UVOqovI+eB+uiwXQLCUaB+E6OMDwNAe8e4mUKHfc/xj VbiULS1FPqJN9NzPVdXvE9hwEw1aPWK0qQ8WXnJh+hlgGaXHy5xzf0b41YGWOnuYDMtZ N2rw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=S7YpcnCy6xLh/G7NWgBXppr94/jTIZ707mYLR+adzZ8=; b=FBpZPRE8TyKhrfuWQjb/SX8fD3Prn1e9uAcHIWZhVLEJhyd+dNZsr11WHoYcQJ5o2i s5KlLzHbuwhIksJnlCyKrKYiIvkyKut2F4gc3EbxxfyRIeMY/uRmdUR55g7T7MdTQGMN HFwwHbVMVKGyEfaCqcyoPAABOjgogrmD7rNZYT+7v7bLLkDTW1BeowrgRnV3d5cykchx HwHsv29MjeWe/l4yAqrXCLi5ytsPS54z4NJSZERTY93MNnJrz8fWKUKNVpRsdMA3vXP4 u4c4yD8TQk5kysQp15fY6N+7Q7KDBNjvEdmQ7xKUIBMS1Gj3q6Drh14y5whe2uinmgbc cg7A== X-Gm-Message-State: AOAM532TO2WFGh5WLWNgJhXj48SF1Q5XPxgzTLzdT6a56YF2WSaE/m8p rIl9wzU3XBvnV6PDaJXuKSQjyshUVrPZQA== X-Google-Smtp-Source: ABdhPJzKS19pslQy4wS9JYyX5fy6N2+1K+GIKEJvBUgsxXAmj5HYIIECMdVwL2DivXpc15UuvD9uAA== X-Received: by 2002:a05:6512:3ee:: with SMTP id n14mr27553556lfq.589.1632305666273; Wed, 22 Sep 2021 03:14:26 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Cc: boris.ostrovsky@oracle.com, jgross@suse.com, julien@xen.org, sstabellini@kernel.org, jbeulich@suse.com, Oleksandr Andrushchenko Subject: [PATCH 2/2] xen-pciback: prepare for the split for stub and PV Date: Wed, 22 Sep 2021 13:14:22 +0300 Message-Id: <20210922101422.2319240-2-andr2000@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210922101422.2319240-1-andr2000@gmail.com> References: <20210922101422.2319240-1-andr2000@gmail.com> MIME-Version: 1.0 From: Oleksandr Andrushchenko Currently PCI backend implements multiple functionalities at a time. To name a few: 1. it is used as a database for assignable PCI devices, e.g. xl pci-assignable-{add|remove|list} manipulates that list. So, whenever the toolstack needs to know which PCI devices can be passed through it reads that from the relevant sysfs entries of the pciback. 2. it is used to hold the unbound PCI devices list, e.g. when passing through a PCI device it needs to be unbound from the relevant device driver and bound to pciback (strictly speaking it is not required that the device is bound to pciback, but pciback is again used as a database of the passed through PCI devices, so we can re-bind the devices back to their original drivers when guest domain shuts down) 3. device reset for the devices being passed through 4. para-virtualized use-cases support The para-virtualized part of the driver is not always needed as some architectures, e.g. Arm or x86 PVH Dom0, are not using backend-frontend model for PCI device passthrough. For such use-cases make the very first step in splitting the xen-pciback driver into two parts: extended PCI stub and PCI PV backend drivers. At the moment x86 platform will continue using CONFIG_XEN_PCIDEV_BACKEND for the fully featured backend driver and new platforms may build a driver with limited functionality (no PV) by enabling CONFIG_XEN_PCIDEV_STUB. Signed-off-by: Oleksandr Andrushchenko --- New in v2 --- drivers/xen/Kconfig | 26 +++++++++++++++++++++++++- drivers/xen/Makefile | 2 +- drivers/xen/xen-pciback/Makefile | 1 + drivers/xen/xen-pciback/pciback.h | 5 +++++ drivers/xen/xen-pciback/xenbus.c | 6 +++++- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index 057ddf61ef61..6e92c6be19f1 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -180,10 +180,34 @@ config SWIOTLB_XEN select DMA_OPS select SWIOTLB +config XEN_PCI_STUB + bool + +config XEN_PCIDEV_STUB + tristate "Xen PCI-device stub driver" + depends on PCI && !X86 && XEN + depends on XEN_BACKEND + select XEN_PCI_STUB + default m + help + The PCI device stub driver provides limited version of the PCI + device backend driver without para-virtualized support for guests. + If you select this to be a module, you will need to make sure no + other driver has bound to the device(s) you want to make visible to + other guests. + + The "hide" parameter (only applicable if backend driver is compiled + into the kernel) allows you to bind the PCI devices to this module + from the default device drivers. The argument is the list of PCI BDFs: + xen-pciback.hide=(03:00.0)(04:00.0) + + If in doubt, say m. + config XEN_PCIDEV_BACKEND tristate "Xen PCI-device backend driver" - depends on PCI && XEN + depends on PCI && X86 && XEN depends on XEN_BACKEND + select XEN_PCI_STUB default m help The PCI device backend driver allows the kernel to export arbitrary diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile index 3434593455b2..5aae66e638a7 100644 --- a/drivers/xen/Makefile +++ b/drivers/xen/Makefile @@ -24,7 +24,7 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o obj-$(CONFIG_XEN_PVHVM_GUEST) += platform-pci.o obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o obj-$(CONFIG_XEN_MCE_LOG) += mcelog.o -obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ +obj-$(CONFIG_XEN_PCI_STUB) += xen-pciback/ obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o obj-$(CONFIG_XEN_ACPI_PROCESSOR) += xen-acpi-processor.o obj-$(CONFIG_XEN_EFI) += efi.o diff --git a/drivers/xen/xen-pciback/Makefile b/drivers/xen/xen-pciback/Makefile index e8d981d43235..e2cb376444a6 100644 --- a/drivers/xen/xen-pciback/Makefile +++ b/drivers/xen/xen-pciback/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback.o +obj-$(CONFIG_XEN_PCIDEV_STUB) += xen-pciback.o xen-pciback-y := pci_stub.o pciback_ops.o xenbus.o xen-pciback-y += conf_space.o conf_space_header.o \ diff --git a/drivers/xen/xen-pciback/pciback.h b/drivers/xen/xen-pciback/pciback.h index 95e28ee48d52..9a64196e831d 100644 --- a/drivers/xen/xen-pciback/pciback.h +++ b/drivers/xen/xen-pciback/pciback.h @@ -71,6 +71,11 @@ struct pci_dev *pcistub_get_pci_dev(struct xen_pcibk_device *pdev, struct pci_dev *dev); void pcistub_put_pci_dev(struct pci_dev *dev); +static inline bool xen_pcibk_pv_support(void) +{ + return IS_ENABLED(CONFIG_XEN_PCIDEV_BACKEND); +} + /* Ensure a device is turned off or reset */ void xen_pcibk_reset_device(struct pci_dev *pdev); diff --git a/drivers/xen/xen-pciback/xenbus.c b/drivers/xen/xen-pciback/xenbus.c index da34ce85dc88..bde63ef677b8 100644 --- a/drivers/xen/xen-pciback/xenbus.c +++ b/drivers/xen/xen-pciback/xenbus.c @@ -743,6 +743,9 @@ const struct xen_pcibk_backend *__read_mostly xen_pcibk_backend; int __init xen_pcibk_xenbus_register(void) { + if (!xen_pcibk_pv_support()) + return 0; + xen_pcibk_backend = &xen_pcibk_vpci_backend; if (passthrough) xen_pcibk_backend = &xen_pcibk_passthrough_backend; @@ -752,5 +755,6 @@ int __init xen_pcibk_xenbus_register(void) void __exit xen_pcibk_xenbus_unregister(void) { - xenbus_unregister_driver(&xen_pcibk_driver); + if (xen_pcibk_pv_support()) + xenbus_unregister_driver(&xen_pcibk_driver); }