From nobody Wed Feb 11 19:41:06 2026 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 58E0AC76196 for ; Tue, 11 Apr 2023 06:49:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230415AbjDKGtZ (ORCPT ); Tue, 11 Apr 2023 02:49:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59786 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230252AbjDKGs7 (ORCPT ); Tue, 11 Apr 2023 02:48:59 -0400 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 06A974496 for ; Mon, 10 Apr 2023 23:48:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1681195718; x=1712731718; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AH2O7XJ83CyJq/BvNVtHKqMDArNO32apjduqQxjWqso=; b=cWQ5TCJEjNL1aWnMqBR8UzCGqH2DY9kLGPSCpeJ1FEU2AOfyPKD2UYPs GoThGqnamTXZD+XtpBDO6kqA6GB24iF8xjMMxNXWH9RfORYBjkDWKNz3w B2RBv4nqPL5cdY6LCADDQ2HKKrLVzMZbL0JP4/hivp0X2IEWqNZ76z1UI bqtrmtOlOXe+cE6eqUF1a0fuUjYtarcUmNqtSGAJcMhAocQ9qfmr9O6xV peyWC4wAerkfsENFEw5UY6DtxFaOH4l98PLKDETmehD3ki7/V4rM8roUi U16NxpHTn47Hj5Qo2BI/jVjr82WIEQ+AmuyO2cZ6c9ytjSS84OZ2YmNHg Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10676"; a="341028514" X-IronPort-AV: E=Sophos;i="5.98,336,1673942400"; d="scan'208";a="341028514" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Apr 2023 23:48:18 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10676"; a="1018256547" X-IronPort-AV: E=Sophos;i="5.98,336,1673942400"; d="scan'208";a="1018256547" Received: from allen-box.sh.intel.com ([10.239.159.127]) by fmsmga005.fm.intel.com with ESMTP; 10 Apr 2023 23:48:15 -0700 From: Lu Baolu To: Joerg Roedel Cc: Vinod Koul , Tina Zhang , Jacob Pan , Christophe JAILLET , iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: [PATCH 03/17] iommu/vt-d: Move iopf code from SVA to IOPF enabling path Date: Tue, 11 Apr 2023 14:48:01 +0800 Message-Id: <20230411064815.31456-4-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230411064815.31456-1-baolu.lu@linux.intel.com> References: <20230411064815.31456-1-baolu.lu@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Generally enabling IOMMU_DEV_FEAT_SVA requires IOMMU_DEV_FEAT_IOPF, but some devices manage I/O Page Faults themselves instead of relying on the IOMMU. Move IOPF related code from SVA to IOPF enabling path. For the device drivers that relies on the IOMMU for IOPF through PCI/PRI, IOMMU_DEV_FEAT_IOPF must be enabled before and disabled after IOMMU_DEV_FEAT_SVA. Reviewed-by: Kevin Tian Signed-off-by: Lu Baolu Link: https://lore.kernel.org/r/20230324120234.313643-4-baolu.lu@linux.inte= l.com --- drivers/iommu/intel/iommu.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index caf664448ee9..a6f07c74da2d 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -4638,7 +4638,6 @@ static int intel_iommu_enable_sva(struct device *dev) { struct device_domain_info *info =3D dev_iommu_priv_get(dev); struct intel_iommu *iommu; - int ret; =20 if (!info || dmar_disabled) return -EINVAL; @@ -4667,6 +4666,21 @@ static int intel_iommu_enable_sva(struct device *dev) if (!info->pri_enabled) return -EINVAL; =20 + return 0; +} + +static int intel_iommu_enable_iopf(struct device *dev) +{ + struct device_domain_info *info =3D dev_iommu_priv_get(dev); + struct intel_iommu *iommu; + int ret; + + if (!info || !info->ats_enabled || !info->pri_enabled) + return -ENODEV; + iommu =3D info->iommu; + if (!iommu) + return -EINVAL; + ret =3D iopf_queue_add_device(iommu->iopf_queue, dev); if (ret) return ret; @@ -4678,7 +4692,7 @@ static int intel_iommu_enable_sva(struct device *dev) return ret; } =20 -static int intel_iommu_disable_sva(struct device *dev) +static int intel_iommu_disable_iopf(struct device *dev) { struct device_domain_info *info =3D dev_iommu_priv_get(dev); struct intel_iommu *iommu =3D info->iommu; @@ -4695,16 +4709,6 @@ static int intel_iommu_disable_sva(struct device *de= v) return ret; } =20 -static int intel_iommu_enable_iopf(struct device *dev) -{ - struct device_domain_info *info =3D dev_iommu_priv_get(dev); - - if (info && info->pri_supported) - return 0; - - return -ENODEV; -} - static int intel_iommu_dev_enable_feat(struct device *dev, enum iommu_dev_features fe= at) { @@ -4725,10 +4729,10 @@ intel_iommu_dev_disable_feat(struct device *dev, en= um iommu_dev_features feat) { switch (feat) { case IOMMU_DEV_FEAT_IOPF: - return 0; + return intel_iommu_disable_iopf(dev); =20 case IOMMU_DEV_FEAT_SVA: - return intel_iommu_disable_sva(dev); + return 0; =20 default: return -ENODEV; --=20 2.34.1