From nobody Wed Dec 31 08:45:34 2025 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 0400AC4332F for ; Mon, 6 Nov 2023 07:14:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229831AbjKFHOE (ORCPT ); Mon, 6 Nov 2023 02:14:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47702 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229583AbjKFHOD (ORCPT ); Mon, 6 Nov 2023 02:14:03 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44A93D8 for ; Sun, 5 Nov 2023 23:14:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699254841; x=1730790841; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=c9GeMl676tMxuvRJHqXrxAMwFdaSUf5heq0NrXZPU0Q=; b=Yz3QYMGXBJaVza0EErGtDr++UqnzoYwipTPYBeeJZIjZITKxzCNvxyGV KKMiM9oe9bDJdynXu5iR4jDXxeE8W+vLpWHzrthCKCkcDOF1q8woWVMRT kyxVKLDI3dC5HsfrKiiElE4+lgelm0dCGwKJw5AWPpD1eXuiKUVAZl5i8 OQprKUnp0uHtkv8jhE5TW13W7zobrb5UwfKAPRX69pMGcS41kg11Ysd8l PShFL+qPhrtR/6mf2KjT6eBw4SVKDTf0f00AJ2gvk9FRwqeLmSxBiNr6B jExKqBxZgF4P6i6w3y2B2P9wXUbivZW8Qbh8UuDFFVryElB5cA4we0pft g==; X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="10759042" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="10759042" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2023 23:14:01 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="1093690868" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="1093690868" Received: from sqa-gate.sh.intel.com (HELO localhost.localdomain) ([10.239.48.212]) by fmsmga005.fm.intel.com with ESMTP; 05 Nov 2023 23:13:57 -0800 From: Tina Zhang To: Jean-Philippe Brucker , Kevin Tian , Lu Baolu , joro@8bytes.org, will@kernel.org, Yi Liu Cc: virtualization@lists.linux-foundation.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [RFC PATCH 1/5] iommu/virtio-iommu: Correct the values of granule and nr_pages Date: Mon, 6 Nov 2023 02:12:22 -0500 Message-Id: <20231106071226.9656-2-tina.zhang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231106071226.9656-1-tina.zhang@intel.com> References: <20231106071226.9656-1-tina.zhang@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" The value of granule is ilog2(pgsize). When the value of pgsize isn't a power of two, granule would make pgsize less than the actual size of pgsize. E.g., if pgsize =3D 0x6000 and granule =3D ilog2(gather->pgsize), t= hen granule =3D 0xe. 2^0xe =3D 0x4000 makes the pgsize (0x4000) smaller than the actual pgsize (0x6000). Invalidating IOTLB with smaller range would lead to cache incoherence. So, roundup pgsize value to the nearest power of 2 to make sure the granule won't make pgsize less than the actual size. The value of "gather->end - gather->start + 1" also needs similar adjustment. Signed-off-by: Tina Zhang --- drivers/iommu/virtio-iommu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index 08e310672e57..b1ceaac974e2 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -1289,8 +1289,8 @@ static void viommu_iotlb_sync(struct iommu_domain *do= main, if (!gather->pgsize) return; =20 - granule =3D ilog2(gather->pgsize); - nr_pages =3D (gather->end - gather->start + 1) >> granule; + granule =3D ilog2(__roundup_pow_of_two(gather->pgsize)); + nr_pages =3D __roundup_pow_of_two(gather->end - gather->start + 1) >> gr= anule; req =3D (struct virtio_iommu_req_invalidate) { .head.type =3D VIRTIO_IOMMU_T_INVALIDATE, .inv_gran =3D cpu_to_le16(VIRTIO_IOMMU_INVAL_G_VA), --=20 2.39.3 From nobody Wed Dec 31 08:45:34 2025 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 F14A5C0018A for ; Mon, 6 Nov 2023 07:14:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230503AbjKFHOI (ORCPT ); Mon, 6 Nov 2023 02:14:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230469AbjKFHOG (ORCPT ); Mon, 6 Nov 2023 02:14:06 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7E31CC for ; Sun, 5 Nov 2023 23:14:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699254844; x=1730790844; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=S7SongTvx/p0pTy8okzpB1bVkyF2tFwb7xoxlsuTkxM=; b=a1qCtoE2Ieor2z5id0XlQi9RpyZ4vMSXb6MD9YURfRsCY7cCkSJuWk5S RuDjTsvm+uNO3+/uXlHK+sR+/hOvWVrg7Nn3cx5sMgl6Q5hYLDBOAJVhw z1K9CqunG7PJRWZgQTMQO88lxOV24U2qSMzraxBOvkktYaQNqb2/XKher IQRRbcbw3F1zJwW4JXHtk54yntRMDUMt/Odbsr8Cm5xRwPd+TwxI9f+5r t1FeP9utGfFxgjJRHmeQgg5Etz/KZ8BssHfvOQm5juqhm47yV2hUje+vu gpteEVAZLJN39CJqfpUPsCpCFNj5F6bfBtNzVRc2fVx9nSnFNHbdeIwDM w==; X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="10759052" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="10759052" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2023 23:14:03 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="1093690884" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="1093690884" Received: from sqa-gate.sh.intel.com (HELO localhost.localdomain) ([10.239.48.212]) by fmsmga005.fm.intel.com with ESMTP; 05 Nov 2023 23:14:00 -0800 From: Tina Zhang To: Jean-Philippe Brucker , Kevin Tian , Lu Baolu , joro@8bytes.org, will@kernel.org, Yi Liu Cc: virtualization@lists.linux-foundation.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [RFC PATCH 2/5] iommu/vt-d: Add generic IO page table support Date: Mon, 6 Nov 2023 02:12:23 -0500 Message-Id: <20231106071226.9656-3-tina.zhang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231106071226.9656-1-tina.zhang@intel.com> References: <20231106071226.9656-1-tina.zhang@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" Add basic hook up code to implement generic IO page table framework. Signed-off-by: Tina Zhang --- drivers/iommu/intel/Kconfig | 1 + drivers/iommu/intel/iommu.c | 94 +++++++++++++++++++++++++++++++++++++ drivers/iommu/intel/iommu.h | 7 +++ drivers/iommu/io-pgtable.c | 3 ++ include/linux/io-pgtable.h | 2 + 5 files changed, 107 insertions(+) diff --git a/drivers/iommu/intel/Kconfig b/drivers/iommu/intel/Kconfig index 2e56bd79f589..8334e7e50e69 100644 --- a/drivers/iommu/intel/Kconfig +++ b/drivers/iommu/intel/Kconfig @@ -15,6 +15,7 @@ config INTEL_IOMMU select DMA_OPS select IOMMU_API select IOMMU_IOVA + select IOMMU_IO_PGTABLE select NEED_DMA_MAP_STATE select DMAR_TABLE select SWIOTLB diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index dbcdf7b95b9f..80bd1993861c 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -23,6 +23,7 @@ #include #include #include +#include =20 #include "iommu.h" #include "../dma-iommu.h" @@ -67,6 +68,20 @@ #define LEVEL_STRIDE (9) #define LEVEL_MASK (((u64)1 << LEVEL_STRIDE) - 1) =20 +#define io_pgtable_cfg_to_dmar_pgtable(x) \ + container_of((x), struct dmar_io_pgtable, pgtbl_cfg) + +#define io_pgtable_to_dmar_pgtable(x) \ + container_of((x), struct dmar_io_pgtable, iop) + +#define io_pgtable_to_dmar_domain(x) \ + container_of(io_pgtable_to_dmar_pgtable(x), \ + struct dmar_domain, dmar_iop) + +#define io_pgtable_ops_to_dmar_domain(x) \ + container_of(io_pgtable_to_dmar_pgtable(io_pgtable_ops_to_pgtable(x)), \ + struct dmar_domain, dmar_iop) + static inline int agaw_to_level(int agaw) { return agaw + 2; @@ -5171,3 +5186,82 @@ int ecmd_submit_sync(struct intel_iommu *iommu, u8 e= cmd, u64 oa, u64 ob) =20 return ret; } + +static void flush_all(void *cookie) +{ +} + +static void flush_walk(unsigned long iova, size_t size, + size_t granule, void *cookie) +{ +} + +static void add_page(struct iommu_iotlb_gather *gather, + unsigned long iova, size_t granule, + void *cookie) +{ +} + +static const struct iommu_flush_ops flush_ops =3D { + .tlb_flush_all =3D flush_all, + .tlb_flush_walk =3D flush_walk, + .tlb_add_page =3D add_page, +}; + +static void free_pgtable(struct io_pgtable *iop) +{ + struct dmar_domain *dmar_domain =3D io_pgtable_to_dmar_domain(iop); + + if (dmar_domain->pgd) { + LIST_HEAD(freelist); + + domain_unmap(dmar_domain, 0, DOMAIN_MAX_PFN(dmar_domain->gaw), &freelist= ); + put_pages_list(&freelist); + } +} + +static int pgtable_map_pages(struct io_pgtable_ops *ops, unsigned long iov= a, + phys_addr_t paddr, size_t pgsize, size_t pgcount, + int iommu_prot, gfp_t gfp, size_t *mapped) +{ + struct dmar_domain *dmar_domain =3D io_pgtable_ops_to_dmar_domain(ops); + + return intel_iommu_map_pages(&dmar_domain->domain, iova, paddr, pgsize, + pgcount, iommu_prot, gfp, mapped); +} + +static size_t pgtable_unmap_pages(struct io_pgtable_ops *ops, unsigned lon= g iova, + size_t pgsize, size_t pgcount, + struct iommu_iotlb_gather *gather) +{ + struct dmar_domain *dmar_domain =3D io_pgtable_ops_to_dmar_domain(ops); + + return intel_iommu_unmap_pages(&dmar_domain->domain, iova, pgsize, + pgcount, gather); +} + +static phys_addr_t pgtable_iova_to_phys(struct io_pgtable_ops *ops, + unsigned long iova) +{ + struct dmar_domain *dmar_domain =3D io_pgtable_ops_to_dmar_domain(ops); + + return intel_iommu_iova_to_phys(&dmar_domain->domain, iova); +} + +static struct io_pgtable *alloc_pgtable(struct io_pgtable_cfg *cfg, void *= cookie) +{ + struct dmar_io_pgtable *pgtable =3D io_pgtable_cfg_to_dmar_pgtable(cfg); + + pgtable->iop.ops.map_pages =3D pgtable_map_pages; + pgtable->iop.ops.unmap_pages =3D pgtable_unmap_pages; + pgtable->iop.ops.iova_to_phys =3D pgtable_iova_to_phys; + + cfg->tlb =3D &flush_ops; + + return &pgtable->iop; +} + +struct io_pgtable_init_fns io_pgtable_intel_iommu_init_fns =3D { + .alloc =3D alloc_pgtable, + .free =3D free_pgtable, +}; diff --git a/drivers/iommu/intel/iommu.h b/drivers/iommu/intel/iommu.h index 8d0aac71c135..5207fea6477a 100644 --- a/drivers/iommu/intel/iommu.h +++ b/drivers/iommu/intel/iommu.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -579,6 +580,11 @@ struct iommu_domain_info { * to VT-d spec, section 9.3 */ }; =20 +struct dmar_io_pgtable { + struct io_pgtable_cfg pgtbl_cfg; + struct io_pgtable iop; +}; + struct dmar_domain { int nid; /* node id */ struct xarray iommu_array; /* Attached IOMMU array */ @@ -633,6 +639,7 @@ struct dmar_domain { =20 struct iommu_domain domain; /* generic domain data structure for iommu core */ + struct dmar_io_pgtable dmar_iop; }; =20 /* diff --git a/drivers/iommu/io-pgtable.c b/drivers/iommu/io-pgtable.c index 5755dee96a68..533b27557290 100644 --- a/drivers/iommu/io-pgtable.c +++ b/drivers/iommu/io-pgtable.c @@ -35,6 +35,9 @@ io_pgtable_init_table[IO_PGTABLE_NUM_FMTS] =3D { #ifdef CONFIG_IOMMU_IO_PGTABLE_VIRT [VIRT_IO_PGTABLE] =3D &io_pgtable_virt_init_fns, #endif +#ifdef CONFIG_INTEL_IOMMU + [INTEL_IOMMU] =3D &io_pgtable_intel_iommu_init_fns, +#endif }; =20 struct io_pgtable_ops *alloc_io_pgtable_ops(enum io_pgtable_fmt fmt, diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index bdcade2c4844..b2857c18f963 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -20,6 +20,7 @@ enum io_pgtable_fmt { APPLE_DART, APPLE_DART2, VIRT_IO_PGTABLE, + INTEL_IOMMU, IO_PGTABLE_NUM_FMTS, }; =20 @@ -281,5 +282,6 @@ extern struct io_pgtable_init_fns io_pgtable_amd_iommu_= v1_init_fns; extern struct io_pgtable_init_fns io_pgtable_amd_iommu_v2_init_fns; extern struct io_pgtable_init_fns io_pgtable_apple_dart_init_fns; extern struct io_pgtable_init_fns io_pgtable_virt_init_fns; +extern struct io_pgtable_init_fns io_pgtable_intel_iommu_init_fns; =20 #endif /* __IO_PGTABLE_H */ --=20 2.39.3 From nobody Wed Dec 31 08:45:34 2025 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 0CD84C41535 for ; Mon, 6 Nov 2023 07:14:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230516AbjKFHOL (ORCPT ); Mon, 6 Nov 2023 02:14:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47830 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230469AbjKFHOJ (ORCPT ); Mon, 6 Nov 2023 02:14:09 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44D71D8 for ; Sun, 5 Nov 2023 23:14:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699254846; x=1730790846; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gWxXYuEpy8G84pCRxEr8zR2qYt2dBXJPyl6P3BJNrtQ=; b=iCGJDlT80R6YCHX5t8JBh5lfoEhLNwqldMKYrIszg6vl+2jAWpg5MPKj fv+avqXdwNJAvcnaROHzr7Uj+ktrVGazLbsl9UNRcUx0SF30HdDfCqlpR QywpLBbS6x8zTZK6oaS4ifXvKn87imaFo7sF9SANme1m9GXEIvud7r/Um /Sqh1MKpPmzSx/91yGbI4BNHot85N1WZLNvrsCXRCntnYJacqJbkhIM+v TW8pa2lCHZxn9reEIlKOAs/agXepX84ib4yGF5wuVS68x+Qh1+Ub1PsxX JtQfbovuLeU9g2z3YGPNvEm6YbT6xLNd8k+i+Skz1m5nSRVnounzUB339 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="10759058" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="10759058" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2023 23:14:06 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="1093690893" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="1093690893" Received: from sqa-gate.sh.intel.com (HELO localhost.localdomain) ([10.239.48.212]) by fmsmga005.fm.intel.com with ESMTP; 05 Nov 2023 23:14:02 -0800 From: Tina Zhang To: Jean-Philippe Brucker , Kevin Tian , Lu Baolu , joro@8bytes.org, will@kernel.org, Yi Liu Cc: virtualization@lists.linux-foundation.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [RFC PATCH 3/5] iommu/io-pgtable: Introduce struct vtd_cfg Date: Mon, 6 Nov 2023 02:12:24 -0500 Message-Id: <20231106071226.9656-4-tina.zhang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231106071226.9656-1-tina.zhang@intel.com> References: <20231106071226.9656-1-tina.zhang@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" VT-d hardware cap/ecap information is needed for driver to generate VT-d format IO page table. Add struct vtd_cfg to keep the info. Signed-off-by: Tina Zhang --- include/linux/io-pgtable.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/linux/io-pgtable.h b/include/linux/io-pgtable.h index b2857c18f963..ae6a2e44b027 100644 --- a/include/linux/io-pgtable.h +++ b/include/linux/io-pgtable.h @@ -147,6 +147,11 @@ struct io_pgtable_cfg { u32 n_ttbrs; } apple_dart_cfg; =20 + struct { + u64 cap_reg; + u64 ecap_reg; + } vtd_cfg; + struct { dma_addr_t pgd; } virt; --=20 2.39.3 From nobody Wed Dec 31 08:45:34 2025 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 EEB58C4332F for ; Mon, 6 Nov 2023 07:14:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230517AbjKFHOP (ORCPT ); Mon, 6 Nov 2023 02:14:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47846 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230520AbjKFHOL (ORCPT ); Mon, 6 Nov 2023 02:14:11 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DF7FA125 for ; Sun, 5 Nov 2023 23:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699254849; x=1730790849; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AMX3QyiSsHY62hL/1ZifmtDUB3BOUarR8RpIWdZzzu4=; b=FDDD+bquOdN9x9TArfJUiGpReYtymTnUV90mF95hYEZLClkSsEVGfJ7N PF33sL4AvuZ2olIVqSJVdWzNmwPl+0tkNRV4ZWpBVS5sJJ3rQfcQ/R3kE XD4UyKV5PSC22a4W6JzT/iOOi7r9II/JYVS/r3i0OJw8kJoZS1HHjTE0T JPhedcIZa6wJgf0v+wqEnF0MLW/YkcgKq+07dqhtm880kVI8f5FqniFpH 6nKReK6cL8V8/zwUgDVm/sxX81PGBauo+CCZvA8We6UDWopLEK3UaKLZt PegyURF0zzxfvNCDUr0Sn80WH+xOTU1S+Iv0WNgXbdOZqmYRJll4YR9jq w==; X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="10759067" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="10759067" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2023 23:14:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="1093690901" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="1093690901" Received: from sqa-gate.sh.intel.com (HELO localhost.localdomain) ([10.239.48.212]) by fmsmga005.fm.intel.com with ESMTP; 05 Nov 2023 23:14:05 -0800 From: Tina Zhang To: Jean-Philippe Brucker , Kevin Tian , Lu Baolu , joro@8bytes.org, will@kernel.org, Yi Liu Cc: virtualization@lists.linux-foundation.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [RFC PATCH 4/5] iommu/vt-d: Adapt alloc_pgtable interface to be used by others Date: Mon, 6 Nov 2023 02:12:25 -0500 Message-Id: <20231106071226.9656-5-tina.zhang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231106071226.9656-1-tina.zhang@intel.com> References: <20231106071226.9656-1-tina.zhang@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" The generic IO page table framework provides a set of interfaces for invoking IO page table operations. Other entity (e.g., virtio-iommu driver) can use the interface to ask VT-d driver to generate a VT-d format IO page table. This patch adds the support. Signed-off-by: Tina Zhang --- drivers/iommu/intel/iommu.c | 69 +++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 80bd1993861c..d714e780a031 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -5248,17 +5248,80 @@ static phys_addr_t pgtable_iova_to_phys(struct io_p= gtable_ops *ops, return intel_iommu_iova_to_phys(&dmar_domain->domain, iova); } =20 +static void __iommu_calculate_cfg(struct io_pgtable_cfg *cfg) +{ + unsigned long fl_sagaw, sl_sagaw, sagaw; + int agaw, addr_width; + + fl_sagaw =3D BIT(2) | (cap_fl5lp_support(cfg->vtd_cfg.cap_reg) ? BIT(3) := 0); + sl_sagaw =3D cap_sagaw(cfg->vtd_cfg.cap_reg); + sagaw =3D fl_sagaw & sl_sagaw; + + for (agaw =3D width_to_agaw(DEFAULT_DOMAIN_ADDRESS_WIDTH); agaw >=3D 0; a= gaw--) { + if (test_bit(agaw, &sagaw)) + break; + } + + addr_width =3D agaw_to_width(agaw); + if (cfg->ias > addr_width) + cfg->ias =3D addr_width; + if (cfg->oas !=3D addr_width) + cfg->oas =3D addr_width; +} + static struct io_pgtable *alloc_pgtable(struct io_pgtable_cfg *cfg, void *= cookie) { - struct dmar_io_pgtable *pgtable =3D io_pgtable_cfg_to_dmar_pgtable(cfg); + struct dmar_io_pgtable *pgtable; + struct dmar_domain *domain; + int adjust_width; + + /* Platform must have nested translation support */ + if (!ecap_nest(cfg->vtd_cfg.ecap_reg)) + return NULL; + + domain =3D kzalloc(sizeof(*domain), GFP_KERNEL); + if (!domain) + return NULL; + + domain->nid =3D NUMA_NO_NODE; + domain->use_first_level =3D true; + domain->has_iotlb_device =3D false; + INIT_LIST_HEAD(&domain->devices); + spin_lock_init(&domain->lock); + xa_init(&domain->iommu_array); + + /* calculate AGAW */ + __iommu_calculate_cfg(cfg); + domain->gaw =3D cfg->ias; + adjust_width =3D guestwidth_to_adjustwidth(domain->gaw); + domain->agaw =3D width_to_agaw(adjust_width); + + domain->iommu_coherency =3D ecap_smpwc(cfg->vtd_cfg.ecap_reg); + domain->force_snooping =3D true; + domain->iommu_superpage =3D cap_fl1gp_support(cfg->vtd_cfg.ecap_reg) ? 2 = : 1; + domain->max_addr =3D 0; + + cfg->coherent_walk =3D domain->iommu_coherency; + + pgtable =3D &domain->dmar_iop; =20 + /* always allocate the top pgd */ + domain->pgd =3D alloc_pgtable_page(domain->nid, GFP_KERNEL); + if (!domain->pgd) + goto out_free_domain; + domain_flush_cache(domain, domain->pgd, PAGE_SIZE); + + cfg->virt.pgd =3D virt_to_phys(domain->pgd); + cfg->tlb =3D &flush_ops; pgtable->iop.ops.map_pages =3D pgtable_map_pages; pgtable->iop.ops.unmap_pages =3D pgtable_unmap_pages; pgtable->iop.ops.iova_to_phys =3D pgtable_iova_to_phys; =20 - cfg->tlb =3D &flush_ops; - return &pgtable->iop; + +out_free_domain: + kfree(domain); + return NULL; } =20 struct io_pgtable_init_fns io_pgtable_intel_iommu_init_fns =3D { --=20 2.39.3 From nobody Wed Dec 31 08:45:34 2025 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 43413C4332F for ; Mon, 6 Nov 2023 07:16:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229892AbjKFHQB (ORCPT ); Mon, 6 Nov 2023 02:16:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47894 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230527AbjKFHOO (ORCPT ); Mon, 6 Nov 2023 02:14:14 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4311AD69 for ; Sun, 5 Nov 2023 23:14:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1699254851; x=1730790851; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JXrcRndberQgWoGawVfq93WylWTuPjjrsB1zsCyDKUk=; b=Pdvq3G9oshsK/10S7GAfl+yak1B80KtayzriiEpXy+JD8IR8QmZarkj+ 1GooCPhIB0OoS04T0mB9PgJoaiPGjdxWCEoT714ujaABCR369/0Evj3Ot A6MnCHgwx0t3GrcK330ROjNsjD6c7fYeT6XIxmiz/1CrjRZARBWjWCC/F Mrmk/5YXn9vRQkQodY26VRH2ASWb085Jw5ywtk4u4mFouRIHK8XED0xkC Dt+Llx2haVlsbuGO4C1kRhn6iHg96ZfjGrNc8EjSupLwBZJE+ZgCSDE2C +jShQeNsmNGjCh/oAOKLYu4UIjZm22lBTFQFWAToT7oxcPkCyI+jVCdXH Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="10759075" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="10759075" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2023 23:14:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10885"; a="1093690912" X-IronPort-AV: E=Sophos;i="6.03,280,1694761200"; d="scan'208";a="1093690912" Received: from sqa-gate.sh.intel.com (HELO localhost.localdomain) ([10.239.48.212]) by fmsmga005.fm.intel.com with ESMTP; 05 Nov 2023 23:14:07 -0800 From: Tina Zhang To: Jean-Philippe Brucker , Kevin Tian , Lu Baolu , joro@8bytes.org, will@kernel.org, Yi Liu Cc: virtualization@lists.linux-foundation.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, Tina Zhang Subject: [RFC PATCH 5/5] iommu/virtio-iommu: Support attaching VT-d IO pgtable Date: Mon, 6 Nov 2023 02:12:26 -0500 Message-Id: <20231106071226.9656-6-tina.zhang@intel.com> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20231106071226.9656-1-tina.zhang@intel.com> References: <20231106071226.9656-1-tina.zhang@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" Add VT-d IO page table support to ATTACH_TABLE request. Signed-off-by: Tina Zhang --- drivers/iommu/virtio-iommu.c | 23 +++++++++++++++++++++++ include/uapi/linux/virtio_iommu.h | 26 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index b1ceaac974e2..b02eeb1d27a4 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -991,12 +991,25 @@ static int viommu_attach_pgtable(struct viommu_domain= *vdomain, }; =20 /* TODO: bypass flag? */ + if (vdomain->bypass =3D=3D true) + return 0; =20 switch (fmt) { case VIRT_IO_PGTABLE: req.format =3D cpu_to_le16(VIRTIO_IOMMU_FORMAT_PGTF_VIRT); req.pgd =3D cpu_to_le64((u64)cfg->virt.pgd); break; + case INTEL_IOMMU: { + struct virtio_iommu_req_attach_pgt_vtd *vtd_req =3D + (struct virtio_iommu_req_attach_pgt_vtd *)&req; + + vtd_req->format =3D cpu_to_le16(VIRTIO_IOMMU_FORMAT_PGTF_VTD); + vtd_req->pgd =3D cpu_to_le64((u64)cfg->virt.pgd); + vtd_req->addr_width =3D cpu_to_le32(cfg->oas); + vtd_req->pasid =3D IOMMU_NO_PASID; + break; + } + default: return -EINVAL; }; @@ -1034,6 +1047,16 @@ static int viommu_setup_pgtable(struct viommu_domain= *vdomain, case VIRTIO_IOMMU_FORMAT_PGTF_VIRT: fmt =3D VIRT_IO_PGTABLE; break; + case VIRTIO_IOMMU_FORMAT_PGTF_VTD: + { + struct virtio_iommu_probe_pgt_vtd *vtd_desc =3D + (struct virtio_iommu_probe_pgt_vtd *)desc; + + cfg.vtd_cfg.cap_reg =3D le64_to_cpu(vtd_desc->cap_reg); + cfg.vtd_cfg.ecap_reg =3D le64_to_cpu(vtd_desc->ecap_reg); + fmt =3D INTEL_IOMMU; + break; + } default: dev_warn(vdev->dev, "unsupported page table format 0x%x\n", le16_to_cpu(desc->format)); diff --git a/include/uapi/linux/virtio_iommu.h b/include/uapi/linux/virtio_= iommu.h index 656be1f3d926..17e0d5fcdd54 100644 --- a/include/uapi/linux/virtio_iommu.h +++ b/include/uapi/linux/virtio_iommu.h @@ -139,6 +139,22 @@ struct virtio_iommu_req_attach_pgt_virt { struct virtio_iommu_req_tail tail; }; =20 +/* Vt-d I/O Page Table Descriptor */ +struct virtio_iommu_req_attach_pgt_vtd { + struct virtio_iommu_req_head head; + __le32 domain; + __le32 endpoint; + __le32 flags; + __le16 format; + __u8 reserved[2]; + __le32 pasid; + __le64 pgd; + __le64 fl_flags; + __le32 addr_width; + __u8 reserved2[36]; + struct virtio_iommu_req_tail tail; +}; + #define VIRTIO_IOMMU_MAP_F_READ (1 << 0) #define VIRTIO_IOMMU_MAP_F_WRITE (1 << 1) #define VIRTIO_IOMMU_MAP_F_MMIO (1 << 2) @@ -224,6 +240,8 @@ struct virtio_iommu_probe_pasid_size { #define VIRTIO_IOMMU_FORMAT_PSTF_ARM_SMMU_V3 2 /* Virt I/O page table format */ #define VIRTIO_IOMMU_FORMAT_PGTF_VIRT 3 +/* VT-d I/O page table format */ +#define VIRTIO_IOMMU_FORMAT_PGTF_VTD 4 =20 struct virtio_iommu_probe_table_format { struct virtio_iommu_probe_property head; @@ -231,6 +249,14 @@ struct virtio_iommu_probe_table_format { __u8 reserved[2]; }; =20 +struct virtio_iommu_probe_pgt_vtd { + struct virtio_iommu_probe_property head; + __le16 format; + __u8 reserved[2]; + __le64 cap_reg; + __le64 ecap_reg; +}; + struct virtio_iommu_req_probe { struct virtio_iommu_req_head head; __le32 endpoint; --=20 2.39.3