Message ID | 20230209041642.9346-2-yi.l.liu@intel.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp119241wrn; Wed, 8 Feb 2023 20:25:25 -0800 (PST) X-Google-Smtp-Source: AK7set8DsxsCKXx/A9JPqyNonfCWBrviPQ8LiXp8je+GykHTSzDvpAsWMjMYVtWVewEcsehoQCbJ X-Received: by 2002:a17:906:36d9:b0:870:b950:18d4 with SMTP id b25-20020a17090636d900b00870b95018d4mr9842503ejc.5.1675916725285; Wed, 08 Feb 2023 20:25:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675916725; cv=none; d=google.com; s=arc-20160816; b=BRa94HXCmvJulnN0vL5LyRx4jtFvy/q1Q6lrzzOUbTHY+Cd3q7kiDb+eKPvTDYgorK yfxBCtrqU7yM/VHtHxPhpFlC77ZjwlUy/hpr14X/gwjPcZTvc3ALuSEvsFD2m6K+hide mcv/P05wk/iV+M64mU1nZbnNweNTbtws0gpURndpPmdpiqqoThR7sZv7OG/OQuh9la1H iwk54P4t8eFIls1sVxYzNdNeeqPbEouWg5adN2QhFK1TOH6dNSAOMUaMJjpDG1lOnbYj Er/ASx06i2rR4fv+eA4F7iZuNyyZxnlqPwG4j5Y2SO7pds0dYN+PjuEW/13yn4ImPfIj 3MxQ== 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=hjWSK7UruQVaRWIlkV2xVAYap7M5RLxgZvtgZGdypPo=; b=P7Ord4rjYbMzHBAlq2+fYuJC6YxCvtFjlKCRtN34MkH/deNOPDECmBa+dXuTLH8LrS cyB6rjyl5xeJzflW65YbSwX6dM15IeZUscLKVEPTag5eJYkS4Bk4RwbrUXH+hfpgQdkO MAey3GDy/w/fHAcw71avVZvO/IOzWx2ZxBfwLxDxb81LGOyMb41KU+WZY3SoG9wzqhBP rqSmRfdZbUvbaJgTga1svQRheZsvlP95SECOOFpxMKl3Qal1Le9cvUtOH80kZcqXNA1t 7mE+Fg91hW/K1BBr1nsBlVJrOlNRBrZQX89OQdOKdAeMaw390/ik4BDOY6deVVD041ts Fyng== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=D538TFeN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id z23-20020aa7d417000000b004aadabcf7c8si930052edq.78.2023.02.08.20.25.02; Wed, 08 Feb 2023 20:25:25 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=D538TFeN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229576AbjBIETa (ORCPT <rfc822;gnulinuxfreebsd@gmail.com> + 99 others); Wed, 8 Feb 2023 23:19:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229478AbjBIETY (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 8 Feb 2023 23:19:24 -0500 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D5E4D10242; Wed, 8 Feb 2023 20:18:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675916308; x=1707452308; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yLfWIPfMZf4ex+xdPNvOR4QIAocyXgXzIiZTA67s30A=; b=D538TFeNArPwCJ3B2b+VXX2e33wRjGsR6l0o5tmgmjSst0/YJhbi1jmp nxr4uyN6P51gcB53b+9GjfT1ctKxALXC8iQ01ZSbAsC0Pw84tybaBnTg/ hI8gI/0jNsOp6z0/FCFzbJM+oLO8kepQpMkGdfHZAmDspZxM/3lgb2Qtu uK6ZTV8PjeKRro+rtCuh9isTP7OSOIrLVqmeX05leBIUkhjzRyadimrWx W91YOpqjRy74vavhdUBEqcpUZZr/U/wKDsoKVRKt2BQ/zaKZ1MCKYELec gw9Es7nb8l0ngfy81M9xhN4M3fVWfnQTNLYuPQgrse78XfYgIGqLRNo6q w==; X-IronPort-AV: E=McAfee;i="6500,9779,10615"; a="394600702" X-IronPort-AV: E=Sophos;i="5.97,281,1669104000"; d="scan'208";a="394600702" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2023 20:16:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10615"; a="912982084" X-IronPort-AV: E=Sophos;i="5.97,281,1669104000"; d="scan'208";a="912982084" Received: from 984fee00a4c6.jf.intel.com ([10.165.58.231]) by fmsmga006.fm.intel.com with ESMTP; 08 Feb 2023 20:16:45 -0800 From: Yi Liu <yi.l.liu@intel.com> To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com, robin.murphy@arm.com Cc: cohuck@redhat.com, eric.auger@redhat.com, nicolinc@nvidia.com, kvm@vger.kernel.org, mjrosato@linux.ibm.com, chao.p.peng@linux.intel.com, yi.l.liu@intel.com, yi.y.sun@linux.intel.com, peterx@redhat.com, jasowang@redhat.com, shameerali.kolothum.thodi@huawei.com, lulu@redhat.com, suravee.suthikulpanit@amd.com, iommu@lists.linux.dev, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, baolu.lu@linux.intel.com Subject: [PATCH 1/6] iommu: Add new iommu op to get iommu hardware information Date: Wed, 8 Feb 2023 20:16:37 -0800 Message-Id: <20230209041642.9346-2-yi.l.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230209041642.9346-1-yi.l.liu@intel.com> References: <20230209041642.9346-1-yi.l.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757326056262525809?= X-GMAIL-MSGID: =?utf-8?q?1757326056262525809?= |
Series |
iommufd: Add iommu capability reporting
|
|
Commit Message
Yi Liu
Feb. 9, 2023, 4:16 a.m. UTC
From: Lu Baolu <baolu.lu@linux.intel.com> Introduce a new iommu op get the IOMMU hardware capabilities for iommufd. This information will be used by any vIOMMU driver which is owned by userspace. This op chooses to make the special parameters opaque to the core. This suits the current usage model where accessing any of the IOMMU device special parameters does require a userspace driver that matches the kernel driver. If a need for common parameters, implemented similarly by several drivers, arises then there is room in the design to grow a generic parameter set as well. No warpper API is added as it is supposed to be used by iommufd only. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Yi Liu <yi.l.liu@intel.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> --- include/linux/iommu.h | 8 ++++++++ include/uapi/linux/iommufd.h | 6 ++++++ 2 files changed, 14 insertions(+)
Comments
> From: Liu, Yi L <yi.l.liu@intel.com> > Sent: Thursday, February 9, 2023 12:17 PM > @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { > /** > * struct iommu_ops - iommu ops and capabilities > * @capable: check capability > + * @hw_info: IOMMU hardware capabilities. The type of the returned data > is is it 'info' or 'capability'? > + * defined in include/uapi/linux/iommufd.h. The data buffer is > + * allocated in the IOMMU driver and the caller should free it > + * after use. Return the data buffer if success, or ERR_PTR on > + * failure. > * @domain_alloc: allocate iommu domain > * @probe_device: Add device to iommu driver handling > * @release_device: Remove device from iommu driver handling > @@ -252,6 +258,7 @@ struct iommu_iotlb_gather { > */ > struct iommu_ops { > bool (*capable)(struct device *dev, enum iommu_cap); > + void *(*hw_info)(struct device *dev, u32 *length); > > /* Domain allocation and freeing by the iommu driver */ > struct iommu_domain *(*domain_alloc)(unsigned > iommu_domain_type); > @@ -280,6 +287,7 @@ struct iommu_ops { > void (*remove_dev_pasid)(struct device *dev, ioasid_t pasid); > > const struct iommu_domain_ops *default_domain_ops; > + enum iommu_device_data_type driver_type; the enum is called 'device_data_type' while the field is called 'driver_type'. btw this new field is not documented above.
On 2023/2/10 15:28, Tian, Kevin wrote: >> From: Liu, Yi L <yi.l.liu@intel.com> >> Sent: Thursday, February 9, 2023 12:17 PM >> @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { >> /** >> * struct iommu_ops - iommu ops and capabilities >> * @capable: check capability >> + * @hw_info: IOMMU hardware capabilities. The type of the returned data >> is > > is it 'info' or 'capability'? > >> + * defined in include/uapi/linux/iommufd.h. The data buffer is >> + * allocated in the IOMMU driver and the caller should free it >> + * after use. Return the data buffer if success, or ERR_PTR on >> + * failure. >> * @domain_alloc: allocate iommu domain >> * @probe_device: Add device to iommu driver handling >> * @release_device: Remove device from iommu driver handling >> @@ -252,6 +258,7 @@ struct iommu_iotlb_gather { >> */ >> struct iommu_ops { >> bool (*capable)(struct device *dev, enum iommu_cap); >> + void *(*hw_info)(struct device *dev, u32 *length); >> >> /* Domain allocation and freeing by the iommu driver */ >> struct iommu_domain *(*domain_alloc)(unsigned >> iommu_domain_type); >> @@ -280,6 +287,7 @@ struct iommu_ops { >> void (*remove_dev_pasid)(struct device *dev, ioasid_t pasid); >> >> const struct iommu_domain_ops *default_domain_ops; >> + enum iommu_device_data_type driver_type; > > the enum is called 'device_data_type' while the field is called 'driver_type'. The enum is named from uAPI's p-o-v and driver_type is from IOMMU's. > btw this new field is not documented above. Yes. Will do that. Best regards, baolu
On 2023/2/10 15:28, Tian, Kevin wrote: >> From: Liu, Yi L<yi.l.liu@intel.com> >> Sent: Thursday, February 9, 2023 12:17 PM >> @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { >> /** >> * struct iommu_ops - iommu ops and capabilities >> * @capable: check capability >> + * @hw_info: IOMMU hardware capabilities. The type of the returned data >> is > is it 'info' or 'capability'? hw_info. IOMMU core does not care about specific content, so it is not necessary to define it as capability or anything else. Perhaps we need to change the comments a bit, say, "IOMMU hardware information"? Best regards, baolu
> From: Baolu Lu <baolu.lu@linux.intel.com> > Sent: Saturday, February 11, 2023 11:43 AM > > On 2023/2/10 15:28, Tian, Kevin wrote: > >> From: Liu, Yi L<yi.l.liu@intel.com> > >> Sent: Thursday, February 9, 2023 12:17 PM > >> @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { > >> /** > >> * struct iommu_ops - iommu ops and capabilities > >> * @capable: check capability > >> + * @hw_info: IOMMU hardware capabilities. The type of the returned > data > >> is > > is it 'info' or 'capability'? > > hw_info. IOMMU core does not care about specific content, so it is not > necessary to define it as capability or anything else. > > Perhaps we need to change the comments a bit, say, "IOMMU hardware > information"? > yes, that is probably more consistent.
On 2/9/2023 12:16 PM, Yi Liu wrote: > From: Lu Baolu <baolu.lu@linux.intel.com> > > Introduce a new iommu op get get -> to get > the IOMMU hardware capabilities for iommufd. > This information will be used by any vIOMMU driver which is owned by > userspace. > > This op chooses to make the special parameters opaque to the core. This > suits the current usage model where accessing any of the IOMMU device > special parameters does require a userspace driver that matches the kernel > driver. If a need for common parameters, implemented similarly by several > drivers, arises then there is room in the design to grow a generic parameter > set as well. No warpper warpper -> wrapper > API is added as it is supposed to be used by > iommufd only. > > Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> > Signed-off-by: Yi Liu <yi.l.liu@intel.com> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> > --- > include/linux/iommu.h | 8 ++++++++ > include/uapi/linux/iommufd.h | 6 ++++++ > 2 files changed, 14 insertions(+) > > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index cb586d054c57..97b398d19fd2 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -15,6 +15,7 @@ > #include <linux/of.h> > #include <linux/ioasid.h> > #include <uapi/linux/iommu.h> > +#include <uapi/linux/iommufd.h> > > #define IOMMU_READ (1 << 0) > #define IOMMU_WRITE (1 << 1) > @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { > /** > * struct iommu_ops - iommu ops and capabilities > * @capable: check capability > + * @hw_info: IOMMU hardware capabilities. The type of the returned data is > + * defined in include/uapi/linux/iommufd.h. The data buffer is > + * allocated in the IOMMU driver and the caller should free it > + * after use. Return the data buffer if success, or ERR_PTR on > + * failure. > * @domain_alloc: allocate iommu domain > * @probe_device: Add device to iommu driver handling > * @release_device: Remove device from iommu driver handling > @@ -252,6 +258,7 @@ struct iommu_iotlb_gather { > */ > struct iommu_ops { > bool (*capable)(struct device *dev, enum iommu_cap); > + void *(*hw_info)(struct device *dev, u32 *length); > > /* Domain allocation and freeing by the iommu driver */ > struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); > @@ -280,6 +287,7 @@ struct iommu_ops { > void (*remove_dev_pasid)(struct device *dev, ioasid_t pasid); > > const struct iommu_domain_ops *default_domain_ops; > + enum iommu_device_data_type driver_type; How to understand the name "iommu_device_data_type"? Is it just refer to the driver types or it has a more generic meaning? > unsigned long pgsize_bitmap; > struct module *owner; > }; > diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h > index 98ebba80cfa1..2309edb55028 100644 > --- a/include/uapi/linux/iommufd.h > +++ b/include/uapi/linux/iommufd.h > @@ -344,4 +344,10 @@ struct iommu_vfio_ioas { > __u16 __reserved; > }; > #define IOMMU_VFIO_IOAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VFIO_IOAS) > + > +/** > + * enum iommu_device_data_type - IOMMU hardware Data types > + */ > +enum iommu_device_data_type { > +}; > #endif
On 2023/2/13 10:36, Binbin Wu wrote: > > On 2/9/2023 12:16 PM, Yi Liu wrote: >> From: Lu Baolu <baolu.lu@linux.intel.com> >> >> Introduce a new iommu op get > > get -> to get > > >> the IOMMU hardware capabilities for iommufd. >> This information will be used by any vIOMMU driver which is owned by >> userspace. >> >> This op chooses to make the special parameters opaque to the core. This >> suits the current usage model where accessing any of the IOMMU device >> special parameters does require a userspace driver that matches the >> kernel >> driver. If a need for common parameters, implemented similarly by several >> drivers, arises then there is room in the design to grow a generic >> parameter >> set as well. No warpper > > warpper -> wrapper Thanks, will update. > >> API is added as it is supposed to be used by >> iommufd only. >> >> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> >> Signed-off-by: Yi Liu <yi.l.liu@intel.com> >> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> >> --- >> include/linux/iommu.h | 8 ++++++++ >> include/uapi/linux/iommufd.h | 6 ++++++ >> 2 files changed, 14 insertions(+) >> >> diff --git a/include/linux/iommu.h b/include/linux/iommu.h >> index cb586d054c57..97b398d19fd2 100644 >> --- a/include/linux/iommu.h >> +++ b/include/linux/iommu.h >> @@ -15,6 +15,7 @@ >> #include <linux/of.h> >> #include <linux/ioasid.h> >> #include <uapi/linux/iommu.h> >> +#include <uapi/linux/iommufd.h> >> #define IOMMU_READ (1 << 0) >> #define IOMMU_WRITE (1 << 1) >> @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { >> /** >> * struct iommu_ops - iommu ops and capabilities >> * @capable: check capability >> + * @hw_info: IOMMU hardware capabilities. The type of the returned >> data is >> + * defined in include/uapi/linux/iommufd.h. The data buffer is >> + * allocated in the IOMMU driver and the caller should free it >> + * after use. Return the data buffer if success, or ERR_PTR on >> + * failure. >> * @domain_alloc: allocate iommu domain >> * @probe_device: Add device to iommu driver handling >> * @release_device: Remove device from iommu driver handling >> @@ -252,6 +258,7 @@ struct iommu_iotlb_gather { >> */ >> struct iommu_ops { >> bool (*capable)(struct device *dev, enum iommu_cap); >> + void *(*hw_info)(struct device *dev, u32 *length); >> /* Domain allocation and freeing by the iommu driver */ >> struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); >> @@ -280,6 +287,7 @@ struct iommu_ops { >> void (*remove_dev_pasid)(struct device *dev, ioasid_t pasid); >> const struct iommu_domain_ops *default_domain_ops; >> + enum iommu_device_data_type driver_type; > > > How to understand the name "iommu_device_data_type"? This is to tell userspace which type of IOMMU the returned information comes from, Intel VT-d, ARM or others... > Is it just refer to the driver types or it has a more generic meaning? IOMMU driver sets this field to distinguish different IOMMU hardware. Best regards, baolu
diff --git a/include/linux/iommu.h b/include/linux/iommu.h index cb586d054c57..97b398d19fd2 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -15,6 +15,7 @@ #include <linux/of.h> #include <linux/ioasid.h> #include <uapi/linux/iommu.h> +#include <uapi/linux/iommufd.h> #define IOMMU_READ (1 << 0) #define IOMMU_WRITE (1 << 1) @@ -223,6 +224,11 @@ struct iommu_iotlb_gather { /** * struct iommu_ops - iommu ops and capabilities * @capable: check capability + * @hw_info: IOMMU hardware capabilities. The type of the returned data is + * defined in include/uapi/linux/iommufd.h. The data buffer is + * allocated in the IOMMU driver and the caller should free it + * after use. Return the data buffer if success, or ERR_PTR on + * failure. * @domain_alloc: allocate iommu domain * @probe_device: Add device to iommu driver handling * @release_device: Remove device from iommu driver handling @@ -252,6 +258,7 @@ struct iommu_iotlb_gather { */ struct iommu_ops { bool (*capable)(struct device *dev, enum iommu_cap); + void *(*hw_info)(struct device *dev, u32 *length); /* Domain allocation and freeing by the iommu driver */ struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); @@ -280,6 +287,7 @@ struct iommu_ops { void (*remove_dev_pasid)(struct device *dev, ioasid_t pasid); const struct iommu_domain_ops *default_domain_ops; + enum iommu_device_data_type driver_type; unsigned long pgsize_bitmap; struct module *owner; }; diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 98ebba80cfa1..2309edb55028 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -344,4 +344,10 @@ struct iommu_vfio_ioas { __u16 __reserved; }; #define IOMMU_VFIO_IOAS _IO(IOMMUFD_TYPE, IOMMUFD_CMD_VFIO_IOAS) + +/** + * enum iommu_device_data_type - IOMMU hardware Data types + */ +enum iommu_device_data_type { +}; #endif