From patchwork Thu Aug 3 14:31:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Liu X-Patchwork-Id: 130679 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f41:0:b0:3e4:2afc:c1 with SMTP id v1csp1214400vqx; Thu, 3 Aug 2023 08:10:25 -0700 (PDT) X-Google-Smtp-Source: APBJJlHn8ltvGhqFd3hYrFTd3VOgunTwW5q3Qh22x6jcJ0G5lumYufBUd55eETipQ3wxTd9P8wCp X-Received: by 2002:a17:90b:1102:b0:263:ebab:a152 with SMTP id gi2-20020a17090b110200b00263ebaba152mr15903961pjb.19.1691075425593; Thu, 03 Aug 2023 08:10:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691075425; cv=none; d=google.com; s=arc-20160816; b=lguHuVZ4Rhgm9vlJjV5JSMA8i07X7xEfwqkhbQ3jq7AHP0RIqolgHG8xp9BX+VZq3/ NbPKvSVH4zKWKgAUa3wB3k7TGafERTc59KmDNjQE0RRoxx9eT/C0UQijVQQU2ci9/roY uW4rvlSiOyhOvAGeV2anhVV0VyvPqRdkHGRKQtGpEN7OeYw/Mn/n8+yhEYVq9251cX7/ fKBWkwOSapHM8QAnFjyl+ynvr5nM1fqETh0E1hY/DtCEPFY3feMbJ5rMvF9fqY73+eO+ QkdPQ4H8dk9aqIIVRaMCvSFIawKsdKwYYLU9EBjXOmSAulK4j0TE5025n5EIWbReN+gT 6WIQ== 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=qYKFcoX/32SqnlHj3mVzs0qaHMvQZg3RhZZ/J0UOMHY=; fh=25kVo4cotgMzE250R6E3K5ES7E7C2JawiavlW0h5mKU=; b=PbLcvkb/O7DAxHyaEWyUwQ7HZLri84e9uK733xw1uIohO15MBJBpawMei4ZtzYDIxZ 9Ydqqq8Lcr+vZtxA4RDI2g2LtEtzkIOH1SHEGablwu6BML0dWPHSnYyOCRopxq01aKBS mdXC2Kqst9gBCei6MHWWxHD5aYfBvSeVWD0sci8mlVcFNhr84okMy1hYQHy/osAuZL6F 8wU3uPgGmfE2kl72l5z/sBdrZPlT9U59KODNUoLO8yU0HZJIQX8XyOrMuU64fe98ILqH idHloApElYiVw5IThD8vKQm2mxwTxgakQa/CS+AcBgPVvm3QeoVGEoo68v73KNN6o3Yo Pm6w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=aMKcPWGj; 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 e14-20020a63e00e000000b00563fe7f89e9si6308pgh.186.2023.08.03.08.10.10; Thu, 03 Aug 2023 08:10:25 -0700 (PDT) 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=aMKcPWGj; 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 S234849AbjHCOiU (ORCPT + 99 others); Thu, 3 Aug 2023 10:38:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44738 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236350AbjHCOhm (ORCPT ); Thu, 3 Aug 2023 10:37:42 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3A60422B; Thu, 3 Aug 2023 07:36:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691073407; x=1722609407; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=jyeuaCSwcnEpIvAt6SkFbJoVnSmQjh1HrN7Z4gQT92w=; b=aMKcPWGjKxT80zN9HckQlGpMgH5PJ7QF551Hu+bDbtevA9fHaAjzGGkH +U+7IkPITI06oxeelynJ5FUVadnmqdb74N2ffyVYLN/ljU56mBh1dP88N CyD4I9QKXDDeaRO71vlGvJ0Rx/XknyLOWgcdgl7q+FapdyDJB08Krhl3u NXOtm/84gNW91Gib/FnxsrqiBPUHH9XoOfiHnejvE/EWvxdf0NSnSHBm7 Crub1yoHhq8g7akCFaYJGxwt0/zfPcchV2SvlK++jXO1MLPsUtz2SqiWe Flyj+aZ2WUCHApeaABhRH86wegrVhYazOX4q7Y2XIDBHij2Mt/7PDMOcP Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="372643355" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="372643355" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2023 07:31:46 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="759153162" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="759153162" Received: from 984fee00a4c6.jf.intel.com ([10.165.58.231]) by orsmga008.jf.intel.com with ESMTP; 03 Aug 2023 07:31:46 -0700 From: Yi Liu To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com, robin.murphy@arm.com, baolu.lu@linux.intel.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, zhenzhong.duan@intel.com Subject: [PATCH v5 1/4] iommu: Move dev_iommu_ops() to private header Date: Thu, 3 Aug 2023 07:31:41 -0700 Message-Id: <20230803143144.200945-2-yi.l.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230803143144.200945-1-yi.l.liu@intel.com> References: <20230803143144.200945-1-yi.l.liu@intel.com> MIME-Version: 1.0 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, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1773221105669951738 X-GMAIL-MSGID: 1773221105669951738 dev_iommu_ops() is essentially only used in iommu subsystem, so move to a private header to avoid being abused by other drivers. Suggested-by: Jason Gunthorpe Reviewed-by: Kevin Tian Reviewed-by: Lu Baolu Reviewed-by: Jason Gunthorpe Signed-off-by: Yi Liu --- drivers/iommu/iommu-priv.h | 11 +++++++++++ include/linux/iommu.h | 11 ----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/drivers/iommu/iommu-priv.h b/drivers/iommu/iommu-priv.h index 7c8011bfd153..a6e694f59f64 100644 --- a/drivers/iommu/iommu-priv.h +++ b/drivers/iommu/iommu-priv.h @@ -4,6 +4,17 @@ #include +static inline const struct iommu_ops *dev_iommu_ops(struct device *dev) +{ + /* + * Assume that valid ops must be installed if iommu_probe_device() + * has succeeded. The device ops are essentially for internal use + * within the IOMMU subsystem itself, so we should be able to trust + * ourselves not to misuse the helper. + */ + return dev->iommu->iommu_dev->ops; +} + int iommu_group_replace_domain(struct iommu_group *group, struct iommu_domain *new_domain); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index d31642596675..e0245aa82b75 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -450,17 +450,6 @@ static inline void iommu_iotlb_gather_init(struct iommu_iotlb_gather *gather) }; } -static inline const struct iommu_ops *dev_iommu_ops(struct device *dev) -{ - /* - * Assume that valid ops must be installed if iommu_probe_device() - * has succeeded. The device ops are essentially for internal use - * within the IOMMU subsystem itself, so we should be able to trust - * ourselves not to misuse the helper. - */ - return dev->iommu->iommu_dev->ops; -} - extern int bus_iommu_probe(const struct bus_type *bus); extern bool iommu_present(const struct bus_type *bus); extern bool device_iommu_capable(struct device *dev, enum iommu_cap cap); From patchwork Thu Aug 3 14:31:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Liu X-Patchwork-Id: 130678 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f41:0:b0:3e4:2afc:c1 with SMTP id v1csp1214377vqx; Thu, 3 Aug 2023 08:10:23 -0700 (PDT) X-Google-Smtp-Source: APBJJlHHTmzkD2/cbi/IIhHAX+UjCqLpBXxpPvZgPweJJE6GBryhGLJuNWzkqQBWt8o/Hydwv8yL X-Received: by 2002:a17:906:3088:b0:99c:50ee:3da9 with SMTP id 8-20020a170906308800b0099c50ee3da9mr3483961ejv.45.1691075423335; Thu, 03 Aug 2023 08:10:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691075423; cv=none; d=google.com; s=arc-20160816; b=I/6G43SFYm6uo/IQNpUumB7rYmHqZV7FNvpBDvgPhYH9jJZn5v0MjJbijI0p3n7jXS Z30ioNhpskZ2B4XXAOjkZ75R6LhJtYjyXBkFrNeYjm23fvfV3iELgRXIh02yuuibQgYu V0eeOx/cE6NUP5/MpeW4ROzZoCMXtzXJPB6Jd3KlyYWO80DxC36Xcn6MTQbfkVpbNOUW 7Gz7Fi2+KHCjIVtuutjzbrsDKzAe8ocPNlnH0RtZgFQ4l7xZ0b/lMlsVryq32UfezYFP ZGkSH+9ryA+sCLhQCZ/2zOTw+Fa7xocsrI1PnQ0vDxYMClHyiEOBqjyct+em7b8tTJSO rg8Q== 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=LyW67dsUQ5p1beAfrCSChiKNcmT6kfyQrq0kbpiRIrQ=; fh=25kVo4cotgMzE250R6E3K5ES7E7C2JawiavlW0h5mKU=; b=rbdyeDKrRkyG/EIUyiAW0TJaSwdVgfvgPU0zpiFxg/Z7CNr2nKrsexxq7o644b52lg wmcz4mF/83H+VeqQEgSIx0UjdwGedvi2FlxYqj6MaXsAx6Pke77yuKsNAi+RF4Xb62r4 IEUMI/r7sCi0aNITmKuEbZoptgPngqJIAe5vh8A3JnFxpG7s9JPyC45kgrTcxTmQQxHR ciS/Rb2cDLgcJ0VahwWNTa0/PD51CdZQVPGlTZXRH96JGLWI8dYFDxzaUv3Lp4U1Opmi heq95BQvRPbiDW3u2cxUUq/mmJL48+4w80lGY/GseRgk8RdEX613s8Hr2LSyjTlXQIuK cdUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Ax5Bz2nc; 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 gw21-20020a170906f15500b009903666fcd0si7909027ejb.384.2023.08.03.08.09.58; Thu, 03 Aug 2023 08:10:23 -0700 (PDT) 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=Ax5Bz2nc; 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 S235601AbjHCOhr (ORCPT + 99 others); Thu, 3 Aug 2023 10:37:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44772 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236424AbjHCOhW (ORCPT ); Thu, 3 Aug 2023 10:37:22 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C36B730C2; Thu, 3 Aug 2023 07:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691073387; x=1722609387; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=AGDwKm4e+hgAjZnZl+805wCEVMh599r7jQ3Hi0hIRrk=; b=Ax5Bz2nczDKtT2Bj8B1e1KVC3wi3oDLdiR179/Gof/MGNp22j9DKuGmA tkPbJ4LpFBmG4TBwb8+z86gfrg2pFq9rchyuqKhWvBCNmS1YjHqLZFx6q 25z2kWMRVKxx+Up7VEEmunhhQXt5rFpoz5EyXHv09VyMr7LEInx2UO65N asJqHFNFig5QKg2O1rO096+HKcgcQWmN+okKhxFGm+i64tnvzmX3Z3Y3u w/OoUFJxlqhs2oGChavq5HJKnUgTYeVLdCPRObuFx1Q4MElEYSoZKMITm oYxELPy/vWcvOK89HY+pRbOaGlMPYTGSkU9EV88yKGrJwddJjb696TUVL Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="372643374" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="372643374" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2023 07:31:47 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="759153177" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="759153177" Received: from 984fee00a4c6.jf.intel.com ([10.165.58.231]) by orsmga008.jf.intel.com with ESMTP; 03 Aug 2023 07:31:47 -0700 From: Yi Liu To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com, robin.murphy@arm.com, baolu.lu@linux.intel.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, zhenzhong.duan@intel.com Subject: [PATCH v5 2/4] iommu: Add new iommu op to get iommu hardware information Date: Thu, 3 Aug 2023 07:31:42 -0700 Message-Id: <20230803143144.200945-3-yi.l.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230803143144.200945-1-yi.l.liu@intel.com> References: <20230803143144.200945-1-yi.l.liu@intel.com> MIME-Version: 1.0 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, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1773221103073984221 X-GMAIL-MSGID: 1773221103073984221 From: Lu Baolu Introduce a new iommu op 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's room in the design to grow a generic parameter set as well. No wrapper API is added as it is supposed to be used by iommufd only. Different IOMMU hardware would have different hardware information. So the information reported differs as well. To let the external user understand the difference. enum iommu_hw_info_type is defined. For the iommu drivers that are capable to report hardware information, it should have a unique iommu_hw_info_type and return to caller. For the driver doesn't report hardware information, caller just uses IOMMU_HW_INFO_TYPE_NONE if a type is required. Signed-off-by: Lu Baolu Co-developed-by: Nicolin Chen Signed-off-by: Nicolin Chen Signed-off-by: Yi Liu --- include/linux/iommu.h | 9 +++++++++ include/uapi/linux/iommufd.h | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/include/linux/iommu.h b/include/linux/iommu.h index e0245aa82b75..f2d6a3989713 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -228,6 +228,14 @@ struct iommu_iotlb_gather { /** * struct iommu_ops - iommu ops and capabilities * @capable: check capability + * @hw_info: IOMMU hardware information. The type of the returned data is + * marked by the output type of this op. Type is one of + * enum iommu_hw_info_type defined in include/uapi/linux/iommufd.h. + * The drivers that support this op should define a unique type + * in include/uapi/linux/iommufd.h. The data buffer returned by this + * op 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 @@ -257,6 +265,7 @@ struct iommu_iotlb_gather { */ struct iommu_ops { bool (*capable)(struct device *dev, enum iommu_cap); + void *(*hw_info)(struct device *dev, u32 *length, u32 *type); /* Domain allocation and freeing by the iommu driver */ struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 8245c01adca6..1f616b0f8ae0 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -370,4 +370,12 @@ struct iommu_hwpt_alloc { __u32 __reserved; }; #define IOMMU_HWPT_ALLOC _IO(IOMMUFD_TYPE, IOMMUFD_CMD_HWPT_ALLOC) + +/** + * enum iommu_hw_info_type - IOMMU Hardware Info Types + * @IOMMU_HW_INFO_TYPE_NONE: Used by the drivers that does not report hardware info + */ +enum iommu_hw_info_type { + IOMMU_HW_INFO_TYPE_NONE, +}; #endif From patchwork Thu Aug 3 14:31:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Liu X-Patchwork-Id: 130677 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f41:0:b0:3e4:2afc:c1 with SMTP id v1csp1214208vqx; Thu, 3 Aug 2023 08:10:10 -0700 (PDT) X-Google-Smtp-Source: APBJJlH/SANCtrCYQRk0EVoHNAs7AnHMcBtxFpmlUvheG+IlwO8OULyeA7pibGw8zEFZP614aqex X-Received: by 2002:a17:903:454:b0:1b5:5162:53bd with SMTP id iw20-20020a170903045400b001b5516253bdmr18590656plb.33.1691075409904; Thu, 03 Aug 2023 08:10:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691075409; cv=none; d=google.com; s=arc-20160816; b=Yuxt72vWsYa9BYFUNhVvLvu4sgX1A6yxBgNz+m0j1bsvU3dTE2lEVwDkttTEm1By1i zQfNlnPkWhYfWSwkyeowTUN5dYbJI/rIF0I5e7ECuj0xFpeheew7qpEpPglL5JM0sHlN RHwKV98l/fQqRhjLgEjn8xvaYcqQpbMXYX2+XTxpJDqPyUjjxjWJ8ivk+UD4oE2z0LQf 8GatQ0LzyUe4OZ1v5lXnVW3lT/1wVB88OoG31pKmQ4uPrcslpOSLlPLSNow68S7iYMo8 Jm+LYnP7Q+/7tFk2G7L+4ldywFNLIgHxZfBOE+d0RUXvzLRwEI8QWUaeCdMZyBhJkHhf RcUA== 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=ms/UaDIdjCYpP60opwWSC7HWXRfDKOYiMAkZe03B49w=; fh=25kVo4cotgMzE250R6E3K5ES7E7C2JawiavlW0h5mKU=; b=j8ZFP7lAClMFDTkr8+0gkiAueOknq5SX2u5VQTte1fh8Xo3XKwEZq0IONFoncmzFVh 6rajys34P7VNEDOyMQ5iio4XlhGTH8Drw+qaoFjGMTVo1yjyynY8FSEXwUEj/1LNWHz+ f+xkRDtpxYXf6hayRxm+ZvGWe4Z7gfa/l52Tp8DR8Ey59DoVqBx/91AfjvPBb767ijJ9 8WxzJ8m8BHW/fvB+exTwR8Vz4o37dSBda4d/MQmIdnRKGOOcM48a9bjvOXwLQb5BXTde oZWJxQoBpqFdc2KK2aNEZarZ7VTMQyIzWgH/QTdcV6nexnwZZcTvC+1G3Yss7MATtMau VjJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=foDL2oam; 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 h17-20020a170902f55100b001b9eda236b5si13372056plf.506.2023.08.03.08.09.33; Thu, 03 Aug 2023 08:10:09 -0700 (PDT) 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=foDL2oam; 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 S235677AbjHCOiR (ORCPT + 99 others); Thu, 3 Aug 2023 10:38:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45380 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236809AbjHCOhd (ORCPT ); Thu, 3 Aug 2023 10:37:33 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C13244B2; Thu, 3 Aug 2023 07:36:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691073396; x=1722609396; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=GHvJWmVEgPmP5fCBzqgy8RHw41J8OSR3oPgFTdNs7wU=; b=foDL2oamkQAAYFxfQLERjghjQtrncd5hPCM51/2M9yqnM8pkztowt1r1 x/fkEuLTPMuQR5Gzaa0kRp12wsYgkMjCauKth8958NWxqygSct1N4skAN bWnVunK+WB69T/SK4BWsZfaYM9mOKt7Va8nqEX+F/YTiOkE1LO5PqgEV1 Q+8EElXNFWa8BTDFGURHHfxhPHmBcgcJWE4/IPCkaLkRmEaq/P24OMNc4 fPnIzmEgDkCPt6HvrWHXbMegMz7PZPqbRM+khDkZh4sWgVPjKRWrNnFQ9 CdBUoOyJS7Ek2Fkhgjna6aBLvutXPPKh9+0eOT9TrkNg+LyUjJKQy2nqo w==; X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="372643383" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="372643383" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2023 07:31:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="759153186" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="759153186" Received: from 984fee00a4c6.jf.intel.com ([10.165.58.231]) by orsmga008.jf.intel.com with ESMTP; 03 Aug 2023 07:31:48 -0700 From: Yi Liu To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com, robin.murphy@arm.com, baolu.lu@linux.intel.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, zhenzhong.duan@intel.com Subject: [PATCH v5 3/4] iommufd: Add IOMMU_GET_HW_INFO Date: Thu, 3 Aug 2023 07:31:43 -0700 Message-Id: <20230803143144.200945-4-yi.l.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230803143144.200945-1-yi.l.liu@intel.com> References: <20230803143144.200945-1-yi.l.liu@intel.com> MIME-Version: 1.0 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, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1773221088858884176 X-GMAIL-MSGID: 1773221088858884176 Under nested IOMMU translation, userspace owns the stage-1 translation table (e.g. the stage-1 page table of Intel VT-d or the context table of ARM SMMUv3, and etc.). Stage-1 translation tables are vendor specific, and need to be compatiable with the underlying IOMMU hardware. Hence, userspace should know the IOMMU hardware capability before creating and configuring the stage-1 translation table to kernel. This adds IOMMU_GET_HW_INFO ioctl to query the IOMMU hardware information (a.k.a capability) for a given device. The returned data is vendor specific, userspace needs to decode it with the structure mapped by the @out_data_type field. As only physical devices have IOMMU hardware, so this will return error if the given device is not a physical device. Co-developed-by: Nicolin Chen Signed-off-by: Nicolin Chen Signed-off-by: Yi Liu Reviewed-by: Lu Baolu --- drivers/iommu/iommufd/main.c | 79 ++++++++++++++++++++++++++++++++++++ include/uapi/linux/iommufd.h | 36 ++++++++++++++++ 2 files changed, 115 insertions(+) diff --git a/drivers/iommu/iommufd/main.c b/drivers/iommu/iommufd/main.c index 94c498b8fdf6..a0302bcaa97c 100644 --- a/drivers/iommu/iommufd/main.c +++ b/drivers/iommu/iommufd/main.c @@ -17,6 +17,7 @@ #include #include #include +#include "../iommu-priv.h" #include "io_pagetable.h" #include "iommufd_private.h" @@ -177,6 +178,81 @@ static int iommufd_destroy(struct iommufd_ucmd *ucmd) return 0; } +static int iommufd_zero_fill_user(void __user *ptr, size_t bytes) +{ + int index = 0; + + for (; index < bytes; index++) { + if (put_user(0, (uint8_t __user *)(ptr + index))) + return -EFAULT; + } + return 0; +} + +static int iommufd_get_hw_info(struct iommufd_ucmd *ucmd) +{ + u32 hw_info_type = IOMMU_HW_INFO_TYPE_NONE; + struct iommu_hw_info *cmd = ucmd->cmd; + unsigned int length = 0, data_len; + struct iommufd_device *idev; + const struct iommu_ops *ops; + void __user *user_ptr; + void *data = NULL; + int rc = 0; + + if (cmd->flags || cmd->__reserved || !cmd->data_len) + return -EOPNOTSUPP; + + idev = iommufd_get_device(ucmd, cmd->dev_id); + if (IS_ERR(idev)) + return PTR_ERR(idev); + + user_ptr = u64_to_user_ptr(cmd->data_ptr); + + ops = dev_iommu_ops(idev->dev); + if (!ops->hw_info) + goto done; + + data = ops->hw_info(idev->dev, &data_len, &hw_info_type); + if (IS_ERR(data)) { + rc = PTR_ERR(data); + goto out_err; + } + + /* driver has hw_info callback should have a unique hw_info_type */ + if (WARN_ON_ONCE(hw_info_type == IOMMU_HW_INFO_TYPE_NONE)) { + rc = -ENODEV; + goto out_err; + } + + length = min(cmd->data_len, data_len); + if (copy_to_user(user_ptr, data, length)) { + rc = -EFAULT; + goto out_err; + } + +done: + /* + * Zero the trailing bytes if the user buffer is bigger than the + * data size kernel actually has. + */ + if (length < cmd->data_len) { + rc = iommufd_zero_fill_user(user_ptr + length, + cmd->data_len - length); + if (rc) + goto out_err; + } + + cmd->data_len = length; + cmd->out_data_type = hw_info_type; + rc = iommufd_ucmd_respond(ucmd, sizeof(*cmd)); + +out_err: + kfree(data); + iommufd_put_object(&idev->obj); + return rc; +} + static int iommufd_fops_open(struct inode *inode, struct file *filp) { struct iommufd_ctx *ictx; @@ -265,6 +341,7 @@ static int iommufd_option(struct iommufd_ucmd *ucmd) union ucmd_buffer { struct iommu_destroy destroy; + struct iommu_hw_info info; struct iommu_hwpt_alloc hwpt; struct iommu_ioas_alloc alloc; struct iommu_ioas_allow_iovas allow_iovas; @@ -297,6 +374,8 @@ struct iommufd_ioctl_op { } static const struct iommufd_ioctl_op iommufd_ioctl_ops[] = { IOCTL_OP(IOMMU_DESTROY, iommufd_destroy, struct iommu_destroy, id), + IOCTL_OP(IOMMU_GET_HW_INFO, iommufd_get_hw_info, struct iommu_hw_info, + __reserved), IOCTL_OP(IOMMU_HWPT_ALLOC, iommufd_hwpt_alloc, struct iommu_hwpt_alloc, __reserved), IOCTL_OP(IOMMU_IOAS_ALLOC, iommufd_ioas_alloc_ioctl, diff --git a/include/uapi/linux/iommufd.h b/include/uapi/linux/iommufd.h index 1f616b0f8ae0..4295362e7b44 100644 --- a/include/uapi/linux/iommufd.h +++ b/include/uapi/linux/iommufd.h @@ -46,6 +46,7 @@ enum { IOMMUFD_CMD_OPTION, IOMMUFD_CMD_VFIO_IOAS, IOMMUFD_CMD_HWPT_ALLOC, + IOMMUFD_CMD_GET_HW_INFO, }; /** @@ -378,4 +379,39 @@ struct iommu_hwpt_alloc { enum iommu_hw_info_type { IOMMU_HW_INFO_TYPE_NONE, }; + +/** + * struct iommu_hw_info - ioctl(IOMMU_GET_HW_INFO) + * @size: sizeof(struct iommu_hw_info) + * @flags: Must be 0 + * @dev_id: The device bound to the iommufd + * @data_len: Input the length of the user buffer in bytes. Output the length + * of data filled in the user buffer. + * @data_ptr: Pointer to the user buffer + * @out_data_type: Output the iommu hardware info type as defined in the enum + * iommu_hw_info_type. + * @__reserved: Must be 0 + * + * Query the hardware information from an iommu behind a given device that has + * been bound to iommufd. @data_len is the size of the buffer, which captures an + * iommu type specific input data and a filled output data. Trailing bytes will + * be zeroed if the user buffer is larger than the data kernel has. + * + * The type specific data would be used to sync capabilities between the virtual + * IOMMU and the hardware IOMMU, e.g. a nested translation setup needs to check + * the hardware information, so the guest stage-1 page table will be compatible. + * + * The @out_data_type will be filled if the ioctl succeeds. It would be used to + * decode the data filled in the buffer pointed by @data_ptr. + */ +struct iommu_hw_info { + __u32 size; + __u32 flags; + __u32 dev_id; + __u32 data_len; + __aligned_u64 data_ptr; + __u32 out_data_type; + __u32 __reserved; +}; +#define IOMMU_GET_HW_INFO _IO(IOMMUFD_TYPE, IOMMUFD_CMD_GET_HW_INFO) #endif From patchwork Thu Aug 3 14:31:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yi Liu X-Patchwork-Id: 130680 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9f41:0:b0:3e4:2afc:c1 with SMTP id v1csp1214692vqx; Thu, 3 Aug 2023 08:10:54 -0700 (PDT) X-Google-Smtp-Source: APBJJlF35CnwEc/JSn9Xagmu10/OVcn1oviozDLSM+7H8C0Kla1ePHtYjjKgEa/WNx5fnqWdCk0C X-Received: by 2002:a05:6a20:a11d:b0:12f:d350:8a12 with SMTP id q29-20020a056a20a11d00b0012fd3508a12mr23239221pzk.21.1691075454203; Thu, 03 Aug 2023 08:10:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691075454; cv=none; d=google.com; s=arc-20160816; b=iYfQGpwD5N4FTofe2rVC8A/vxuqv3syz7WWxZ+VR/sES392XAY3+QKRT9gPu4/VXYh 6WxjFF2IVdGxhWguVkwn3rj2RCe3//C7ZmE7wRQt/rpGty8gqKQzcgXCAh4hY4y6Ysqi 0i1NMCeRu33/yYAeoddczdplC+7V4mzDTY7RXdekfYrAUfT/LHGJe2oX/OpoENeCERvT 5Sg1ZoryJ4R1yeyY/NniVLQq3VM7zp/hCjihawbloysDn2dCokEboJWS88JYULQ6hLb9 5MXONw6NaTdIawck6WMnwJDVzDy57hxEHZu8buQtzkTq4zovIExmAmUzRlWgd1G/O1rN IgrQ== 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=6FR/eVAzjxGjaZUWm6CkIVep02MM8UIuNYwYaldY4Hk=; fh=25kVo4cotgMzE250R6E3K5ES7E7C2JawiavlW0h5mKU=; b=ySKo0qgDhy8TnkUizXDPa+Ke0KWgBKv7JAPKZwC2FMzn4dmGNSpGLeNgiMCeme58wJ ym7PPMLmvtula3aiwfxo2YIfhmEfphzXxOxGJ15Eo4RzpFPYuzJbMXN5e6tjdVnVemmS i/16L8IWo6tyOmmyW195CGKnSHoXpWLNCL38e++j6V05tC14GWpvUrZ4J70DZW+G6uaF eYPj7AmzD8skqT3//NbF3zF7CNSCbu6YRin696gj3frXiVk81q7Gyz4lOmJWlxbtNglP hsf2jEVtd5xtUADPv7t/gm35MvFkUk4tLGySvF19YSnIg9+B6ejTS/TRW57asvZPmU00 +ymA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="dJr8Sl/H"; 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 fb39-20020a056a002da700b0068736a4c1f9si7694114pfb.228.2023.08.03.08.10.20; Thu, 03 Aug 2023 08:10:54 -0700 (PDT) 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="dJr8Sl/H"; 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 S236337AbjHCOiY (ORCPT + 99 others); Thu, 3 Aug 2023 10:38:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44768 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236424AbjHCOhv (ORCPT ); Thu, 3 Aug 2023 10:37:51 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.24]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F259649CC; Thu, 3 Aug 2023 07:36:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691073411; x=1722609411; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=FrwNPceh10Tu5Pr0DfPIpYCG71l2vETJOJy+lU/84gg=; b=dJr8Sl/H5I/91NygrgnbdqpZ1TNa3uZeqJ3KWKhbL+T/jCyNZYM9PR5S 7BwkQfpAjzL1RndjZnZex27oIo5tI4EvsxR34R5wfLsOr4y8aj+l8bDcF QC3PsUABD3gmjmx1qkgHxpkt/YHjrKbh/UV53NSUhdjmSars7Iuk/zfSj oa1laxcTdwlQMiQCp0786ouD5huYFr1P4MW9YK/AZW7AtqzEks3aQB1Nv 49Ckycch9Ev0lQR2En1Y7HZK5HdCPgPhTuEEaFSsSpxmegSfJdY2ewMdn jCQJsG4BN8/68CqFnjb5pFZGr0cnLOaG/fNc2n/GgDNL5HiQPeU4Fmafh w==; X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="372643396" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="372643396" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2023 07:31:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10791"; a="759153202" X-IronPort-AV: E=Sophos;i="6.01,252,1684825200"; d="scan'208";a="759153202" Received: from 984fee00a4c6.jf.intel.com ([10.165.58.231]) by orsmga008.jf.intel.com with ESMTP; 03 Aug 2023 07:31:49 -0700 From: Yi Liu To: joro@8bytes.org, alex.williamson@redhat.com, jgg@nvidia.com, kevin.tian@intel.com, robin.murphy@arm.com, baolu.lu@linux.intel.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, zhenzhong.duan@intel.com Subject: [PATCH v5 4/4] iommufd/selftest: Add coverage for IOMMU_GET_HW_INFO ioctl Date: Thu, 3 Aug 2023 07:31:44 -0700 Message-Id: <20230803143144.200945-5-yi.l.liu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230803143144.200945-1-yi.l.liu@intel.com> References: <20230803143144.200945-1-yi.l.liu@intel.com> MIME-Version: 1.0 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, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE, T_SCC_BODY_TEXT_LINE 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: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1773221135429158045 X-GMAIL-MSGID: 1773221135429158045 From: Nicolin Chen Add a mock_domain_hw_info function and an iommu_test_hw_info data structure. This allows to test the IOMMU_GET_HW_INFO ioctl passing the test_reg value for the mock_dev. Signed-off-by: Nicolin Chen Signed-off-by: Yi Liu --- drivers/iommu/iommufd/iommufd_test.h | 9 +++++++ drivers/iommu/iommufd/selftest.c | 16 ++++++++++++ tools/testing/selftests/iommu/iommufd.c | 17 +++++++++++- tools/testing/selftests/iommu/iommufd_utils.h | 26 +++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/iommufd/iommufd_test.h b/drivers/iommu/iommufd/iommufd_test.h index 258de2253b61..3f3644375bf1 100644 --- a/drivers/iommu/iommufd/iommufd_test.h +++ b/drivers/iommu/iommufd/iommufd_test.h @@ -100,4 +100,13 @@ struct iommu_test_cmd { }; #define IOMMU_TEST_CMD _IO(IOMMUFD_TYPE, IOMMUFD_CMD_BASE + 32) +/* Mock structs for IOMMU_DEVICE_GET_HW_INFO ioctl */ +#define IOMMU_HW_INFO_TYPE_SELFTEST 0xfeedbeef +#define IOMMU_HW_INFO_SELFTEST_REGVAL 0xdeadbeef + +struct iommu_test_hw_info { + __u32 flags; + __u32 test_reg; +}; + #endif diff --git a/drivers/iommu/iommufd/selftest.c b/drivers/iommu/iommufd/selftest.c index bb2cd54ca7b6..ab4011e3a7c6 100644 --- a/drivers/iommu/iommufd/selftest.c +++ b/drivers/iommu/iommufd/selftest.c @@ -128,6 +128,21 @@ static struct iommu_domain mock_blocking_domain = { .ops = &mock_blocking_ops, }; +static void *mock_domain_hw_info(struct device *dev, u32 *length, u32 *type) +{ + struct iommu_test_hw_info *info; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return ERR_PTR(-ENOMEM); + + info->test_reg = IOMMU_HW_INFO_SELFTEST_REGVAL; + *length = sizeof(*info); + *type = IOMMU_HW_INFO_TYPE_SELFTEST; + + return info; +} + static struct iommu_domain *mock_domain_alloc(unsigned int iommu_domain_type) { struct mock_iommu_domain *mock; @@ -279,6 +294,7 @@ static void mock_domain_set_plaform_dma_ops(struct device *dev) static const struct iommu_ops mock_ops = { .owner = THIS_MODULE, .pgsize_bitmap = MOCK_IO_PAGE_SIZE, + .hw_info = mock_domain_hw_info, .domain_alloc = mock_domain_alloc, .capable = mock_domain_capable, .set_platform_dma_ops = mock_domain_set_plaform_dma_ops, diff --git a/tools/testing/selftests/iommu/iommufd.c b/tools/testing/selftests/iommu/iommufd.c index 8acd0af37aa5..6b075a68b928 100644 --- a/tools/testing/selftests/iommu/iommufd.c +++ b/tools/testing/selftests/iommu/iommufd.c @@ -113,6 +113,7 @@ TEST_F(iommufd, cmd_length) } TEST_LENGTH(iommu_destroy, IOMMU_DESTROY); + TEST_LENGTH(iommu_hw_info, IOMMU_GET_HW_INFO); TEST_LENGTH(iommu_ioas_alloc, IOMMU_IOAS_ALLOC); TEST_LENGTH(iommu_ioas_iova_ranges, IOMMU_IOAS_IOVA_RANGES); TEST_LENGTH(iommu_ioas_allow_iovas, IOMMU_IOAS_ALLOW_IOVAS); @@ -185,6 +186,7 @@ FIXTURE(iommufd_ioas) uint32_t ioas_id; uint32_t stdev_id; uint32_t hwpt_id; + uint32_t device_id; uint64_t base_iova; }; @@ -211,7 +213,7 @@ FIXTURE_SETUP(iommufd_ioas) for (i = 0; i != variant->mock_domains; i++) { test_cmd_mock_domain(self->ioas_id, &self->stdev_id, - &self->hwpt_id, NULL); + &self->hwpt_id, &self->device_id); self->base_iova = MOCK_APERTURE_START; } } @@ -290,6 +292,19 @@ TEST_F(iommufd_ioas, ioas_area_auto_destroy) } } +TEST_F(iommufd_ioas, get_hw_info) +{ + struct iommu_test_hw_info info; + + if (self->device_id) { + test_cmd_get_hw_info(self->device_id, sizeof(info), &info); + assert(info.test_reg == IOMMU_HW_INFO_SELFTEST_REGVAL); + } else { + test_err_get_hw_info(ENOENT, self->device_id, + sizeof(info), &info); + } +} + TEST_F(iommufd_ioas, area) { int i; diff --git a/tools/testing/selftests/iommu/iommufd_utils.h b/tools/testing/selftests/iommu/iommufd_utils.h index 70353e68e599..d6d223435881 100644 --- a/tools/testing/selftests/iommu/iommufd_utils.h +++ b/tools/testing/selftests/iommu/iommufd_utils.h @@ -348,3 +348,29 @@ static void teardown_iommufd(int fd, struct __test_metadata *_metadata) }) #endif + +static int _test_cmd_get_hw_info(int fd, __u32 device_id, + void *data, size_t data_len) +{ + struct iommu_hw_info cmd = { + .size = sizeof(cmd), + .dev_id = device_id, + .data_len = data_len, + .data_ptr = (uint64_t)data, + }; + int ret; + + ret = ioctl(fd, IOMMU_GET_HW_INFO, &cmd); + if (ret) + return ret; + return 0; +} + +#define test_cmd_get_hw_info(device_id, data_len, data) \ + ASSERT_EQ(0, _test_cmd_get_hw_info(self->fd, device_id, \ + data, data_len)) + +#define test_err_get_hw_info(_errno, device_id, data_len, data) \ + EXPECT_ERRNO(_errno, \ + _test_cmd_get_hw_info(self->fd, device_id, \ + data, data_len))