From patchwork Tue Aug 20 18:09:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Oleksandr Tyshchenko X-Patchwork-Id: 11104467 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 31937112C for ; Tue, 20 Aug 2019 18:12:02 +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 0C9F120644 for ; Tue, 20 Aug 2019 18:12:02 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZqqDkvdu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0C9F120644 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i08aE-00061s-LT; Tue, 20 Aug 2019 18:10:14 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1i08aE-00061Q-1J for xen-devel@lists.xenproject.org; Tue, 20 Aug 2019 18:10:14 +0000 X-Inumbo-ID: beec49be-c375-11e9-98ec-bc764e2007e4 Received: from mail-lj1-x242.google.com (unknown [2a00:1450:4864:20::242]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id beec49be-c375-11e9-98ec-bc764e2007e4; Tue, 20 Aug 2019 18:10:10 +0000 (UTC) Received: by mail-lj1-x242.google.com with SMTP id m24so5992356ljg.8 for ; Tue, 20 Aug 2019 11:10:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=monqjyZU3Mce+UAf6hb4PLF4rX782AE3G987gOGVeb4=; b=ZqqDkvduURlrsjegUvdXfDGXKwUzSI9y0/X42gnwykiSixH8w+MOVuzrqfbOmKyCb/ LdCb5eJ+T5Wx/IZ5pD6bqfKmgIW73+YcdL6SJPAC8LMv5aDkLqHB7ulULmNecYXBcsAI BugClaxjjqMsEd/c7TlMdw00jGllDrOiH8gCT/gRWntOVe7sJMcFFTrQMxj4dwxbpJzK 8FdEy4ToaJjzgPokb5bhyTX/YeG4/fK6TbXR+XqZ4XV+Fp9slXxvf8dR/TiPMaMGrB/D Z3yMcvitR2eVAhLqSykIa1Nrva6p2BUFyADLfM0IC4dI2x3xOMseqXSX9s7aSj1GKXJy zrPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=monqjyZU3Mce+UAf6hb4PLF4rX782AE3G987gOGVeb4=; b=D93Z9RvavU7mQyFB44JsJ9gB8Cpcl6x1GdEo/M3mlvp76hSHA5kG0mXTUCqHbQCXM8 ryL3eKarmlVC8g0evHyTmdwW16pqaYuTggb2hV7/0kBvgE3mU401AY7HswFxSr+/A1Pk bDlQ/In/qZf/XwyYKRpI06bseY/uR1WsZMMzAGyPKCBicvsRCUNXaE2GzwxfiqXaZKcr z2uZ2R3NCevORXI9UwDPMxIinCShrbB4zohLBsEfRy2Dc4Za16ZD33Hy1MpVPhEpLDqQ lGJOoJb37M8vUsi28BAxXYC7OnWbV8phKIdC0QxkunSmC++b8FktlwNSfPCYNY3APM5R Zu9A== X-Gm-Message-State: APjAAAUBMKTrBhaINlzfnofX1UcbSU4gS2wR36FnOJxWfQKXkyhUtewk CrAIn9VxRyzGAg1UHKZ1wHesYqgw X-Google-Smtp-Source: APXvYqzgTWNRbWBel3ePZUk5amgy+y8KyS2TMZhDiMuMD+HXnfKVgxA2TAgaPl7KFH7rUrJhMKQwtg== X-Received: by 2002:a2e:7001:: with SMTP id l1mr16841690ljc.48.1566324608714; Tue, 20 Aug 2019 11:10:08 -0700 (PDT) Received: from otyshchenko.kyiv.epam.com (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id f6sm2900642lja.16.2019.08.20.11.10.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 20 Aug 2019 11:10:08 -0700 (PDT) From: Oleksandr Tyshchenko To: xen-devel@lists.xenproject.org Date: Tue, 20 Aug 2019 21:09:41 +0300 Message-Id: <1566324587-3442-3-git-send-email-olekstysh@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1566324587-3442-1-git-send-email-olekstysh@gmail.com> References: <1566324587-3442-1-git-send-email-olekstysh@gmail.com> Subject: [Xen-devel] [PATCH V3 2/8] iommu/arm: Add ability to handle deferred probing request X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Oleksandr Tyshchenko , julien.grall@arm.com, sstabellini@kernel.org, Volodymyr_Babchuk@epam.com MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" From: Oleksandr Tyshchenko This patch adds minimal required support to General IOMMU framework to be able to handle a case when IOMMU driver requesting deferred probing for a device. In order not to pull Linux's error code (-EPROBE_DEFER) to Xen we have chosen -EAGAIN to be used for indicating that device probing is deferred. This is needed for the upcoming IPMMU driver which may request deferred probing depending on what device will be probed the first (there is some dependency between these devices, Root device must be registered before Cache devices. If not the case, driver will deny further Cache device probes until Root device is registered). As we can't guarantee a fixed pre-defined order for the device nodes in DT, we need to be ready for the situation where devices being probed in "any" order. While here, order the headers alphabetically. Signed-off-by: Oleksandr Tyshchenko CC: Julien Grall --- Changes V2 -> V3: - removed deferred_probe field from struct dt_device_node, re-used domain_list instead - documented domain_list usage - added ASSERT to check that np->domain_list is empty before re-using it - put deferred_probe_list to init section - used more strict logic regarding processing devices in the deferred list - added more comments to code - put headers in alphabetical order --- xen/drivers/passthrough/arm/iommu.c | 59 ++++++++++++++++++++++++++++++++++--- xen/include/asm-arm/device.h | 6 +++- xen/include/xen/device_tree.h | 7 +++++ 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/xen/drivers/passthrough/arm/iommu.c b/xen/drivers/passthrough/arm/iommu.c index f219de9..72a30e0 100644 --- a/xen/drivers/passthrough/arm/iommu.c +++ b/xen/drivers/passthrough/arm/iommu.c @@ -15,11 +15,20 @@ * GNU General Public License for more details. */ -#include -#include #include +#include +#include + #include +/* + * Deferred probe list is used to keep track of devices for which driver + * requested deferred probing (returned -EAGAIN). + * + * We re-use device's domain_list to link the device in the deferred list. + */ +static __initdata LIST_HEAD(deferred_probe_list); + static const struct iommu_ops *iommu_ops; const struct iommu_ops *iommu_get_ops(void) @@ -42,7 +51,7 @@ void __init iommu_set_ops(const struct iommu_ops *ops) int __init iommu_hardware_setup(void) { - struct dt_device_node *np; + struct dt_device_node *np, *tmp; int rc; unsigned int num_iommus = 0; @@ -51,6 +60,17 @@ int __init iommu_hardware_setup(void) rc = device_init(np, DEVICE_IOMMU, NULL); if ( !rc ) num_iommus++; + else if ( rc == -EAGAIN ) + { + /* We expect nobody uses domain_list at such early stage. */ + ASSERT(list_empty(&np->domain_list)); + + /* + * Driver requested deferred probing, so add this device to + * the deferred list for further processing. + */ + list_add(&np->domain_list, &deferred_probe_list); + } /* * Ignore the following error codes: * - EBADF: Indicate the current not is not an IOMMU @@ -61,7 +81,38 @@ int __init iommu_hardware_setup(void) return rc; } - return ( num_iommus > 0 ) ? 0 : -ENODEV; + /* Return immediately if there are no initialized devices. */ + if ( !num_iommus ) + return ( list_empty(&deferred_probe_list) ) ? -ENODEV : -EAGAIN; + + rc = 0; + + /* + * Process devices in the deferred list if it is not empty. + * Check that at least one device is initialized at each loop, otherwise + * we may get an infinite loop. Also stop processing if we got an error + * other than -EAGAIN. + */ + while ( !list_empty(&deferred_probe_list) && num_iommus ) + { + num_iommus = 0; + + list_for_each_entry_safe ( np, tmp, &deferred_probe_list, domain_list ) + { + rc = device_init(np, DEVICE_IOMMU, NULL); + if ( !rc ) + { + num_iommus++; + + /* Remove initialized device from the deferred list. */ + list_del_init(&np->domain_list); + } + else if ( rc != -EAGAIN ) + return rc; + } + } + + return rc; } void __hwdom_init arch_iommu_check_autotranslated_hwdom(struct domain *d) diff --git a/xen/include/asm-arm/device.h b/xen/include/asm-arm/device.h index 63a0f36..ee1c3bc 100644 --- a/xen/include/asm-arm/device.h +++ b/xen/include/asm-arm/device.h @@ -44,7 +44,11 @@ struct device_desc { enum device_class class; /* List of devices supported by this driver */ const struct dt_device_match *dt_match; - /* Device initialization */ + /* + * Device initialization. + * + * -EAGAIN is used to indicate that device probing is deferred. + */ int (*init)(struct dt_device_node *dev, const void *data); }; diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h index 9a7a8f2..3702e9b 100644 --- a/xen/include/xen/device_tree.h +++ b/xen/include/xen/device_tree.h @@ -92,6 +92,13 @@ struct dt_device_node { /* IOMMU specific fields */ bool is_protected; + /* + * The main purpose of this list node is to link the structure in the list + * of devices assigned to domain. + * + * Boot code (iommu_hardware_setup) re-uses this list to link the structure + * in the list of devices for which driver requested deferred probing. + */ struct list_head domain_list; struct device dev;