From patchwork Wed Aug 7 18:19:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13756602 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C3A2DC3DA7F for ; Wed, 7 Aug 2024 18:20:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-ID:Date:Subject:Cc:To:From:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=K6WD6jm0UK5sPcjCZ/fAfsvVddmEtM5mTSnj/pU/fSs=; b=VOHHPz6MJjMx/K7+ktZLPPV+k4 CAPUMib4b0N4pIsI9LOz3cUdJpEs5LvjezVC+GcFOO+NRZQFFaoCiZmNAQZJ2AffKeE3HhLnc0c+l r6ZX+a1lZr9CskisHyFe2KVLKNPlD1JTDonvxv5kJ3Vz84NTyQw+gXy+RKFpdsomzyPtiImvaI0Cn vNVhjz7ptyMQ5AaQPiHVRNeFYDB/PyRQ3nyiIZNiAx+KXMdmysoXFS1kA6WXPZv+k4MwfY356ALti S4Grhyru9l7IK5tNO/WQJT8akTPg/WcyEgrLK747baQxfN1R3z2ixqh6Nt9CxCdOvU4dwFXVYwmE0 MHZLnV6w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sblGc-00000005vVf-2bCP; Wed, 07 Aug 2024 18:20:10 +0000 Received: from mail-dm3nam02on20600.outbound.protection.outlook.com ([2a01:111:f403:2405::600] helo=NAM02-DM3-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sblG3-00000005vOM-1T3s for linux-arm-kernel@lists.infradead.org; Wed, 07 Aug 2024 18:19:37 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PZD2dneXl7aRfcMCCiRAIPRPsU5cWns9eTeDw6nwBr7KaB76gJRQ5F5QbOKuAMA81XbP9BfoBSf39B7hBii50CTpcIzfJd8MvTmEtHZah3VsRafdZ3dlS6E8Iq1Tfba3sF5C7ZE4VmoG2jcYWFmu+t+BkQYbYVd3iaArBz4Gt31sv5RtLHk3CQLxO1AJqIrnL9fm2vu/gESv3RsL8XEEYGFFScJ375UyVyZ/m5Iu2EVNADz8hZzDG1oOJHWdMZ2iPyuf6AnmidheyfMny15ZMZ//f0aec7thuGR24MRqW9CikMJ2WYA0zEq1aGGPH0lTJe6P9Jzi6NHHp1wzb9xMrA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=K6WD6jm0UK5sPcjCZ/fAfsvVddmEtM5mTSnj/pU/fSs=; b=dAo1jF7KG0nOJtjh7ui3+d1EG9M5PIPY5LhXq3KDWJUdBu1fE8eq4U3y2PijV3OaLoce8IQWwpSJ5gW5AIETPIl+om+8lipMHiNRNO1pRET0ROsn15UyeZazhxK1Pe6NM3JV30Iy4xmKNZOf2hGv9etvlX1EKMVtko7m8mCd4icMb2ujYV8wMRsvxYRrEmDVDfRvJtncsyfekG6hqoaMK8yJG76xgCsJ86eEYwfmXjECl2ARCKsWdbDJRHkkgvUBBkAV4eCoeGU3GGVM2QwNukpSyAU0G1Cd0hqZGlMyCAfYHfuaiYCUSmj9YO6kY6938txE3L05QAgYafRO9MhpOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=K6WD6jm0UK5sPcjCZ/fAfsvVddmEtM5mTSnj/pU/fSs=; b=TiRSO24m7dozQzgLo81vMKEdKGmMkc8d5kOr/KxWhNytbvHwcS3IRoUM8Qsi0mxL3ZD7f4rytk4zwFlcqRDS4vWtzqrp5rV8SimCm4W/cp40LlAxVU0ZSQJ/6PfK1mOQhikjeNkTsO5w0Y+sbJD/qdTI+EAvE/xvHl0WS/NYHIIabiKoyGVRyiFBidoPvWXIPGBulZK/Zge4aHqfQYniqgLhrmufFnTyqZtr3o8BAQVEys8t7shFzDg0z57jhm1JdTt14XbqznaSBneo1v6Z7irMLhjYLB8YZLC0ssDWdZ87HEqAo2lsAyyCj3qWM1ji2vul+Uwzw/sgj7kIahgcQQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH3PR12MB7763.namprd12.prod.outlook.com (2603:10b6:610:145::10) by CH3PR12MB9021.namprd12.prod.outlook.com (2603:10b6:610:173::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7828.26; Wed, 7 Aug 2024 18:19:22 +0000 Received: from CH3PR12MB7763.namprd12.prod.outlook.com ([fe80::8b63:dd80:c182:4ce8]) by CH3PR12MB7763.namprd12.prod.outlook.com ([fe80::8b63:dd80:c182:4ce8%3]) with mapi id 15.20.7849.008; Wed, 7 Aug 2024 18:19:22 +0000 From: Jason Gunthorpe To: Lu Baolu , Bjorn Helgaas , David Woodhouse , iommu@lists.linux.dev, Joerg Roedel , kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, Robin Murphy , Suravee Suthikulpanit , Will Deacon Cc: patches@lists.linux.dev Subject: [PATCH] iommu: Allow ATS to work on VFs when the PF uses IDENTITY Date: Wed, 7 Aug 2024 15:19:20 -0300 Message-ID: <0-v1-0fb4d2ab6770+7e706-ats_vf_jgg@nvidia.com> X-ClientProxiedBy: BL1P221CA0022.NAMP221.PROD.OUTLOOK.COM (2603:10b6:208:2c5::16) To CH3PR12MB7763.namprd12.prod.outlook.com (2603:10b6:610:145::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH3PR12MB7763:EE_|CH3PR12MB9021:EE_ X-MS-Office365-Filtering-Correlation-Id: c6b83c53-c14a-49b2-af7c-08dcb70d75ce X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: Aa8NvXcflQhh130WjwGP+h3PjACK7Ww14i7qDFMoG0H43DXG6ge0jlwbaoROVkJ11cXMCUVnflx2XaOPFBhC8LeJB3O66mhX3vVegyKFTwFK6C2g9oLGTpJMQFHvcuBSuroLvzVgB2S8oBw+EgmUH1JaP1Qc8I7TA1l8P7GRUVVCA497i7lo/He2T2fPi7dgDYIqooB3RYxBc2hMw6kMCdqU5Lh9yqihmNXyG+m1L9kcKnp2EE3zOrgfkMU4p11R4CGX+nKrDobu7Ps0ZkAdVnskAJt9Nfv6Vi+wWcZ341Z+hCnnuxwdVhfDt/kH55B+bDInSvFO67h7k6vo0XVVZw567S3dPzGMQmNetA7UXlo/d5VshLwwc0GB/+Na8w+CUPrso53UhfRfO46EA62SsxtacccnNHXwwcsOV4kHtjYgTKtzdxUYkN+huzFb0XTxBPKLvlqeHKmXFhMUublMvO3Ejb9tRVl+B6lzYHFTUT15N3cc1uyTUSAn3tBcjXcryzLKSTQJy44HVF/ksdYuYT/2jHfJog7mvNiD49srR0bkU6cZNDcOhf+smQH2DL78ahbtDiB2YwJIBg0aeCKvK/A8iQpOVdTyF96OHNjpKu9xBxLLyoxkJYJUKk83GhzGa/hW6p5J1q6SaAO9ftIqtcAfEqn6S2xamwgyDvWXWJgSUnxmPf4cV7uTPjXbkqrpEdoyqMT+LvmbFMNIURJwbjI+LQtnttxfch2MZQFDRD3UAGhNeEuZp43YUTjB0Q0U9KgCkva5Ks+1TaouL/uwZHVnZrZGNAMVotk33K/IJkscqOGnFDxHLajOITerBbyKPXF4fAwxuYaqtbwyp6Bt6pJdmFM1f1aDVtQfU0hAc7tje9COqmdJcdGLiNAQDUiqK/YvNdsBDSrDGjMVkM1HQAotzxj4VZMVsLDoOdb2DqdW8RiejLgIpCYxnTbw9f9gzcxQ8f1VZidTUf2fq2gVltfzNZ0o+PmBjpRGIstMcNYYFJWWRc0feeKJcvm+pMmBJ2JJN5g7WDZ6gUkxqafiKfU6Fsa54p/XkPq2g1c4JLdDQHAichpXwG/3GN4xqnbKnhePvTFx1alspt+dbxib3BfmP3rNLDq9NL4lXCBj6cs4qwnZcdMwSXlvVVafDcuBm2OxhxnYGFvv7HyoPYFiJd/6IggJe/ESK7/5qWqE8x0+tnNNhemAi+w+6sRWIXvx2d1YpNsmT5z36CTsKM91j0iDaaX/Y0j6Mnr8iIhbnKcTjZ/kUNtpnswFMuKDyLtnZ4aJ09ZrGmtUo7FOdMwk44HYtITluwD5UStKDXmyQzbYsiz1kOOTAKaT9e3u1rYlPvaDxq29KHFNOGUhh8lXaAXvS/IuyMN9zqyAwvh55DkFCxua/h1ifJkDOO0zVNBy X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH3PR12MB7763.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(7416014)(376014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7NyOWYTxbLyJp31ovh0C+tp0KtgV3ZCpNEtgbasDC9qrPsHkYzwJnTFxaDvBlaL6vSqLgsQQGw/hD3A6cRk703rd1H150oard3vXyr8YXVJyJvqxSU9OLzyo5Yyt4dPc3Eb1aS0+G1BP7RLiAbElx1Z2Kvp1v8nC/lCDDiFZQFHVjKn8PaR1M/lkey5G3b/zmKv4RV9Ns4Blm/mWTRFMS3X+1hGFBHDl4mc44+IhADuXNqyiWZtB2uO51Sg8RYimz8ye7/EfeSXiCHBk8M8JI3zT3l84Tx2N8SHuwIaXJDrdF61L7vTQq907dgcOaVUh7ngw5wKd8QCtYa8pTMg7rn2pUrLeFTq5BYJYQQpNRAGdnkHZx45X4DoLIKb7wC+4i+oqU5wt30DAV68fySHowqmep6fBglqcwxMvpT5TEZVItzNO/vJ47WIu9JxkrqCvkvmVy9zI/mydIfFezeGXDerJR3fCGJro4dGNH0hr1TB45f94rxkj55Apag8Z+1FZ/cP1ClWo+Eug0bjl6N8RRoJ5k/F6QX0vdAqduwz7hpSCE2kz5Y+BmXHaSjKD8AjnFXZwjLayktkNHn60v4jvzm/hpaNHcu0UJo2aImqdJPB06g6gWTIaXQhuL3HrsL6WMY8zAjtG8zhl0Gh8we5R9EIsLbVjpP6hpyo+krLJ7svYSPLi0np3szHHKvw4PQV4VRi06zzpw+N2eyF+qxAylQDpGGINcgVqir6aQ5CYNC7McaqjcqOdoXkt+HaJaJCHLcS55WW4PM/hFoSm2M0Mibi75bwl1D9iC00Zagtpu2RrsQKCWW09rsE8LOAybdb4QpiDOOTn2ZD7/QBIOQABlPw8neXWeBQd+TgWg9WRtZB+F9HNroysDmRUM0LwZOcHAqw/peDpxlcrN4h+aChfeOH9NXj/RUDikW7wFjTfZGCdrVMObB3m2mjJgrKUuzTk5yYI/vK6iGkp1wexIalURbUs0NCm+/y8Y4xSy1K6xTg23OKOQZGR8FC1EpTYQsyn+unRBEDM78FLWozJJvtsO1bTpPeLTd6KyuammmqtDUqEg/zWHvp37QkV+dRLMiQNAE54cLRiIzxt2vNKe2iWME99dSr0KaJeVB+4kYsapkZa90RaZRujATjtAEJVFE1CEjC9up2/QyBoS0alIQEpAy0UWDW3pu7GBJKA0u7se3RbcpqWsPh29XmYO2q7cwwnl4RrnLsg+fmnfibOErvMWk8DFUsARLVXeSbCuklKTTmsHtFIzLG1NoV8sLWzphPBbRYSkkZUhaDMmGOsPGRW7O33cyuERXpUDoOKpz5yWkqRO1IQqfg0lwWQneIqFNF4ER1QpVtbPkVqPj02WjOt4DyEsFYBVo73MSfHTpC7uaOz/9OfxMsJUSF81Yx/UxqsUqqd79GicvIeg64aUTI0lRIZNanuj3CC+7bxQrSWovtVN+X8PjTTf8P1HQVvAUU6/XFrnRosSczppT8mh9DJGNWZQl2BK1eZopdkBwNROFdm5nhKUikd8Ts/NFesDri/R8INobs/i+kCuyQDVHJe5PjlfI+qaCCQVlJKds++ce0= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6b83c53-c14a-49b2-af7c-08dcb70d75ce X-MS-Exchange-CrossTenant-AuthSource: CH3PR12MB7763.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Aug 2024 18:19:21.9982 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1HD6Tq665n11cFFmvCaodTCfM3pkR4kOiZu6iWrB0YXiZs4DpOmhrmhr+jRvjwOf X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB9021 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240807_111935_403992_14707918 X-CRM114-Status: GOOD ( 20.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org PCI ATS has a global Smallest Translation Unit field that is located in the PF but shared by all of the VFs. The expectation is that the STU will be set to the root port's global STU capability which is driven by the IO page table configuration of the iommu HW. Today it becomes set when the iommu driver first enables ATS. Thus, to enable ATS on the VF, the PF must have already had the correct STU programmed, even if ATS is off on the PF. Unfortunately the PF only programs the STU when the PF enables ATS. The iommu drivers tend to leave ATS disabled when IDENTITY translation is being used. Thus we can get into a state where the PF is setup to use IDENTITY with the DMA API while the VF would like to use VFIO with a PAGING domain and have ATS turned on. This fails because the PF never loaded a PAGING domain and so it never setup the STU, and the VF can't do it. The simplest solution is to have the iommu driver set the ATS STU when it probes the device. This way the ATS STU is loaded immediately at boot time to all PFs and there is no issue when a VF comes to use it. Add a new call pci_prepare_ats() which should be called by iommu drivers in their probe_device() op for every PCI device if the iommu driver supports ATS. This will setup the STU based on whatever page size capability the iommu HW has. Signed-off-by: Jason Gunthorpe Acked-by: Bjorn Helgaas Reviewed-by: Lu Baolu --- drivers/iommu/amd/iommu.c | 3 ++ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 6 ++++ drivers/iommu/intel/iommu.c | 1 + drivers/pci/ats.c | 33 +++++++++++++++++++++ include/linux/pci-ats.h | 1 + 5 files changed, 44 insertions(+) base-commit: e7153d9c8cee2f17fdcd011509860717bfa91423 diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index b19e8c0f48fa25..98054497d343bc 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2203,6 +2203,9 @@ static struct iommu_device *amd_iommu_probe_device(struct device *dev) iommu_completion_wait(iommu); + if (dev_is_pci(dev)) + pci_prepare_ats(to_pci_dev(dev), PAGE_SHIFT); + return iommu_dev; } 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 a31460f9f3d421..9bc50bded5af72 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -3295,6 +3295,12 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev) smmu->features & ARM_SMMU_FEAT_STALL_FORCE) master->stall_enabled = true; + if (dev_is_pci(dev)) { + unsigned int stu = __ffs(smmu->pgsize_bitmap); + + pci_prepare_ats(to_pci_dev(dev), stu); + } + return &smmu->iommu; err_free_master: diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 9ff8b83c19a3e2..ad81db026ab236 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -4091,6 +4091,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev) dev_iommu_priv_set(dev, info); if (pdev && pci_ats_supported(pdev)) { + pci_prepare_ats(pdev, VTD_PAGE_SHIFT); ret = device_rbtree_insert(iommu, info); if (ret) goto free; diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index c570892b209095..87fa03540b8a21 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c @@ -47,6 +47,39 @@ bool pci_ats_supported(struct pci_dev *dev) } EXPORT_SYMBOL_GPL(pci_ats_supported); +/** + * pci_prepare_ats - Setup the PS for ATS + * @dev: the PCI device + * @ps: the IOMMU page shift + * + * This must be done by the IOMMU driver on the PF before any VFs are created to + * ensure that the VF can have ATS enabled. + * + * Returns 0 on success, or negative on failure. + */ +int pci_prepare_ats(struct pci_dev *dev, int ps) +{ + u16 ctrl; + + if (!pci_ats_supported(dev)) + return -EINVAL; + + if (WARN_ON(dev->ats_enabled)) + return -EBUSY; + + if (ps < PCI_ATS_MIN_STU) + return -EINVAL; + + if (dev->is_virtfn) + return 0; + + dev->ats_stu = ps; + ctrl = PCI_ATS_CTRL_STU(dev->ats_stu - PCI_ATS_MIN_STU); + pci_write_config_word(dev, dev->ats_cap + PCI_ATS_CTRL, ctrl); + return 0; +} +EXPORT_SYMBOL_GPL(pci_prepare_ats); + /** * pci_enable_ats - enable the ATS capability * @dev: the PCI device diff --git a/include/linux/pci-ats.h b/include/linux/pci-ats.h index df54cd5b15db09..d98929c86991be 100644 --- a/include/linux/pci-ats.h +++ b/include/linux/pci-ats.h @@ -8,6 +8,7 @@ /* Address Translation Service */ bool pci_ats_supported(struct pci_dev *dev); int pci_enable_ats(struct pci_dev *dev, int ps); +int pci_prepare_ats(struct pci_dev *dev, int ps); void pci_disable_ats(struct pci_dev *dev); int pci_ats_queue_depth(struct pci_dev *dev); int pci_ats_page_aligned(struct pci_dev *dev);