Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3705pxb; Tue, 23 Feb 2021 16:15:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJwtTzjNbJpbU+08vf0+nA3K0uaCOnGyftTell0MBcl9xicY/usN2ZEtDt9Oa9JyfEL4Zaw1 X-Received: by 2002:a17:906:5fd9:: with SMTP id k25mr19004250ejv.161.1614125745356; Tue, 23 Feb 2021 16:15:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614125745; cv=none; d=google.com; s=arc-20160816; b=qkdgoU6Zyh+g6+USnoNgDgsTTY3u0pavHeaEhafQcgqOaNyye6BwN302x1wcCk9r7p ypFJ326PEryrUMsDtyEs52SM3jeeJeRsyjusJSJ14GuyNqtNEe9/9YfBiGp/rdQjLASF Pf7vci7xGNyogeUB5zAOhvjXAJDlZuIbZPm7x6UYPMKDuv5PeBJ9X9Wqff0Emj/GF2AG 12duC26IwWYhnVWpdQUR4kUrpIEH/WGiiebteOJSHW+tNLrsMj7Dbydnn0FFLvRVWJV8 SWr5Kjq4rLNJlHaDKMaJfLIYNRldRTD43wZROY/ErGmaXdmhOAwzpM8kkP1Vipx7A0J5 QkCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=e6QTcJlLmrBpR5F0NakOQ9CdKAjZnIyMcFmPI9qs7qc=; b=YCV8jPN17UPEmQUAc1kPYzpKJFzyNfOdMnsrVC8k3q73CoXt8T1q812bVk1Jt5b6Sy kPGarrt+lNLh4dK5pf4GxcJBco+dMk/eomuXZAJ6KbvHzkcDMR6UXdMCnBpTAmaN6LIp IXd/mlomXnievSatN2QkEx46dRDgG5l3kmHcUUoyZwsfp7r2ZFvy4QFdH9B1lzUtC1j7 01HZzr/T/ZrLGhfzqkecbcY8gfoCVe7bQH+oQ3Z04HEHKkmrEnxNDjTYZ7qSP4X1Ioko PnBUJ3ISrE9NwzJXbjeqGfY4YLXM/zONZIb2O29fRfjEvMISTrki1SQOZk6cvm+H6dr/ p7Kg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="Sz/cGg3Y"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b24si212124ejc.584.2021.02.23.16.14.24; Tue, 23 Feb 2021 16:15:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="Sz/cGg3Y"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234045AbhBWVBb (ORCPT + 99 others); Tue, 23 Feb 2021 16:01:31 -0500 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:45160 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233670AbhBWVAH (ORCPT ); Tue, 23 Feb 2021 16:00:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1614113921; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=e6QTcJlLmrBpR5F0NakOQ9CdKAjZnIyMcFmPI9qs7qc=; b=Sz/cGg3YIKKrqyoLaNNsZIogPG5PEY6BFOtYq+vs1YUlO8dvA3FFmUNBttumBTl9i71k7r wR9idebBYrmilFtnNXQhKItUqMKJWpxZ7n/gn4Vtj/EokuB933mfSopl7NAFHCJe26zbrA wNMTKDqCdmbDspkklnX0NB0obCps6gY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-436-PfnxHYN7NUi0gsGkzSn9BQ-1; Tue, 23 Feb 2021 15:58:37 -0500 X-MC-Unique: PfnxHYN7NUi0gsGkzSn9BQ-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C2E031E566; Tue, 23 Feb 2021 20:58:34 +0000 (UTC) Received: from laptop.redhat.com (ovpn-114-34.ams2.redhat.com [10.36.114.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 721785D9D0; Tue, 23 Feb 2021 20:58:29 +0000 (UTC) From: Eric Auger To: eric.auger.pro@gmail.com, eric.auger@redhat.com, iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, will@kernel.org, maz@kernel.org, robin.murphy@arm.com, joro@8bytes.org, alex.williamson@redhat.com, tn@semihalf.com, zhukeqian1@huawei.com Cc: jacob.jun.pan@linux.intel.com, yi.l.liu@intel.com, wangxingang5@huawei.com, jiangkunkun@huawei.com, jean-philippe@linaro.org, zhangfei.gao@linaro.org, zhangfei.gao@gmail.com, vivek.gautam@arm.com, shameerali.kolothum.thodi@huawei.com, yuzenghui@huawei.com, nicoleotsuka@gmail.com, lushenming@huawei.com, vsethi@nvidia.com Subject: [PATCH v14 10/13] iommu/smmuv3: Enforce incompatibility between nested mode and HW MSI regions Date: Tue, 23 Feb 2021 21:56:31 +0100 Message-Id: <20210223205634.604221-11-eric.auger@redhat.com> In-Reply-To: <20210223205634.604221-1-eric.auger@redhat.com> References: <20210223205634.604221-1-eric.auger@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Nested mode currently is not compatible with HW MSI reserved regions. Indeed MSI transactions targeting this MSI doorbells bypass the SMMU. Let's check nested mode is not attempted in such configuration. Signed-off-by: Eric Auger --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 23 +++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 0cf92cd0ab3e..ca6f796aeb95 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2460,6 +2460,23 @@ static bool arm_smmu_share_msi_domain(struct iommu_domain *domain, return share; } +static bool arm_smmu_has_hw_msi_resv_region(struct device *dev) +{ + struct iommu_resv_region *region; + bool has_msi_resv_region = false; + LIST_HEAD(resv_regions); + + iommu_get_resv_regions(dev, &resv_regions); + list_for_each_entry(region, &resv_regions, list) { + if (region->type == IOMMU_RESV_MSI) { + has_msi_resv_region = true; + break; + } + } + iommu_put_resv_regions(dev, &resv_regions); + return has_msi_resv_region; +} + static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) { int ret = 0; @@ -2520,10 +2537,12 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) /* * In nested mode we must check all devices belonging to the * domain share the same physical MSI doorbell. Otherwise nested - * stage MSI binding is not supported. + * stage MSI binding is not supported. Also nested mode is not + * compatible with MSI HW reserved regions. */ if (smmu_domain->stage == ARM_SMMU_DOMAIN_NESTED && - !arm_smmu_share_msi_domain(domain, dev)) { + (!arm_smmu_share_msi_domain(domain, dev) || + arm_smmu_has_hw_msi_resv_region(dev))) { ret = -EINVAL; goto out_unlock; } -- 2.26.2