Received: by 2002:a25:e74b:0:0:0:0:0 with SMTP id e72csp223038ybh; Sun, 12 Jul 2020 04:19:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwS9g+v5NDI2Nw34BPtDuzl2+v3RyI/KaIgGHBMxYy8/h3g1qN2Zkkgfj9asnTLcpa44jDO X-Received: by 2002:a17:906:a459:: with SMTP id cb25mr68364798ejb.234.1594552787439; Sun, 12 Jul 2020 04:19:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594552787; cv=none; d=google.com; s=arc-20160816; b=dz55Bidfr0VTM366uN1MLXbHC25cckro4C3RP3N3/iu/P/JwFt5Y709S/EEWl6hr7N RLPs4GCfMJu2wqQe2y1K629TTW8J3ldlynDZlLw6qqwkTeMTOxOn6Y01T2ZTR549lzH0 /U5oEVNCe8O6otNJBM+0TVochEiXDMW15P7YP0uyBwnfvQsL/7RrY9B7gEYhzEGqsMq+ he3NTf6724iIrhMw9h4z6GbKjk3n6kRae0P0g/bc/KtooUz8sYwa936NgTccnbEDAdPb ez7fNxKAFxKAeTtzb5v+renDfGZRXNRLic76cW8euV35j0+NwgsK82ujeijakyhb1Zen jLmg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:ironport-sdr:ironport-sdr; bh=trLAQGgXai3WDKZZ2EaxZm4yYrP1A9SIjHBOsjuvt1I=; b=LT0DTr6DhYqd/4ZFXEhJM+/g3/URAC4tqZ7QGbrs6ROuZdazxteTXtNSW3xSs4bHPu y0Hu1TEZviP19x77/TwqUiEJWCSSjbz71rrpqeJj/ykAGbM42K/fiIyjmjQZRpJzU9r1 DeKkKM2/lZmusBjw629nVbclmULmwVQ1ZOmMO5pxwYM55WRzhkytIQpf3Bq/soeYnHJt arJYY9PLeDyRECIsxv1IYWqvRmya+5qU+N2mc2S0EFSJ5WF23gnlCcN1pbc0hsMY9l8r wzOms7tdO0SSip1d69c8YCi5nDG9Elntke96S3+uE6CoPzu8vIVsEdLIMuRY+xCeTQrh T42Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id yj19si6933815ejb.410.2020.07.12.04.19.25; Sun, 12 Jul 2020 04:19:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729021AbgGLLQ3 (ORCPT + 99 others); Sun, 12 Jul 2020 07:16:29 -0400 Received: from mga09.intel.com ([134.134.136.24]:45844 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728715AbgGLLOc (ORCPT ); Sun, 12 Jul 2020 07:14:32 -0400 IronPort-SDR: I5XG32ytbg+oGRB9E2/FRa1RrQZqLkZ+xV6OwMf8nPIB3WweT9lZ89Kq9wui7eCHEKDx/STm0D G17QopTWE/KA== X-IronPort-AV: E=McAfee;i="6000,8403,9679"; a="149952681" X-IronPort-AV: E=Sophos;i="5.75,343,1589266800"; d="scan'208";a="149952681" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jul 2020 04:14:29 -0700 IronPort-SDR: lWWf3JX2TzCNYiIJJmYl0EDW/NAMcUl5e9mgT/VNlObDICYY3QqEZcboxM/ErFtCORjjLduN2D W+RSshX42inw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,343,1589266800"; d="scan'208";a="315788555" Received: from jacob-builder.jf.intel.com ([10.7.199.155]) by orsmga008.jf.intel.com with ESMTP; 12 Jul 2020 04:14:29 -0700 From: Liu Yi L To: alex.williamson@redhat.com, eric.auger@redhat.com, baolu.lu@linux.intel.com, joro@8bytes.org Cc: kevin.tian@intel.com, jacob.jun.pan@linux.intel.com, ashok.raj@intel.com, yi.l.liu@intel.com, jun.j.tian@intel.com, yi.y.sun@intel.com, jean-philippe@linaro.org, peterx@redhat.com, hao.wu@intel.com, stefanha@gmail.com, iommu@lists.linux-foundation.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v5 02/15] iommu: Report domain nesting info Date: Sun, 12 Jul 2020 04:20:57 -0700 Message-Id: <1594552870-55687-3-git-send-email-yi.l.liu@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1594552870-55687-1-git-send-email-yi.l.liu@intel.com> References: <1594552870-55687-1-git-send-email-yi.l.liu@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org IOMMUs that support nesting translation needs report the capability info to userspace, e.g. the format of first level/stage paging structures. This patch reports nesting info by DOMAIN_ATTR_NESTING. Caller can get nesting info after setting DOMAIN_ATTR_NESTING. Cc: Kevin Tian CC: Jacob Pan Cc: Alex Williamson Cc: Eric Auger Cc: Jean-Philippe Brucker Cc: Joerg Roedel Cc: Lu Baolu Signed-off-by: Liu Yi L Signed-off-by: Jacob Pan --- v4 -> v5: *) address comments from Eric Auger. v3 -> v4: *) split the SMMU driver changes to be a separate patch *) move the @addr_width and @pasid_bits from vendor specific part to generic part. *) tweak the description for the @features field of struct iommu_nesting_info. *) add description on the @data[] field of struct iommu_nesting_info v2 -> v3: *) remvoe cap/ecap_mask in iommu_nesting_info. *) reuse DOMAIN_ATTR_NESTING to get nesting info. *) return an empty iommu_nesting_info for SMMU drivers per Jean' suggestion. --- include/uapi/linux/iommu.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/include/uapi/linux/iommu.h b/include/uapi/linux/iommu.h index 1afc661..d2a47c4 100644 --- a/include/uapi/linux/iommu.h +++ b/include/uapi/linux/iommu.h @@ -332,4 +332,81 @@ struct iommu_gpasid_bind_data { } vendor; }; +/* + * struct iommu_nesting_info - Information for nesting-capable IOMMU. + * user space should check it before using + * nesting capability. + * + * @size: size of the whole structure + * @format: PASID table entry format, the same definition as struct + * iommu_gpasid_bind_data @format. + * @features: supported nesting features. + * @flags: currently reserved for future extension. + * @addr_width: The output addr width of first level/stage translation + * @pasid_bits: Maximum supported PASID bits, 0 represents no PASID + * support. + * @data: vendor specific cap info. data[] structure type can be deduced + * from @format field. + * + * +===============+======================================================+ + * | feature | Notes | + * +===============+======================================================+ + * | SYSWIDE_PASID | PASIDs are managed in system-wide, instead of per | + * | | device. When a device is assigned to userspace or | + * | | VM, proper uAPI (userspace driver framework uAPI, | + * | | e.g. VFIO) must be used to allocate/free PASIDs for | + * | | the assigned device. | + * +---------------+------------------------------------------------------+ + * | BIND_PGTBL | The owner of the first level/stage page table must | + * | | explicitly bind the page table to associated PASID | + * | | (either the one specified in bind request or the | + * | | default PASID of iommu domain), through userspace | + * | | driver framework uAPI (e.g. VFIO_IOMMU_NESTING_OP). | + * +---------------+------------------------------------------------------+ + * | CACHE_INVLD | The owner of the first level/stage page table must | + * | | explicitly invalidate the IOMMU cache through uAPI | + * | | provided by userspace driver framework (e.g. VFIO) | + * | | according to vendor-specific requirement when | + * | | changing the page table. | + * +---------------+------------------------------------------------------+ + * + * @data[] types defined for @format: + * +================================+=====================================+ + * | @format | @data[] | + * +================================+=====================================+ + * | IOMMU_PASID_FORMAT_INTEL_VTD | struct iommu_nesting_info_vtd | + * +--------------------------------+-------------------------------------+ + * + */ +struct iommu_nesting_info { + __u32 size; + __u32 format; +#define IOMMU_NESTING_FEAT_SYSWIDE_PASID (1 << 0) +#define IOMMU_NESTING_FEAT_BIND_PGTBL (1 << 1) +#define IOMMU_NESTING_FEAT_CACHE_INVLD (1 << 2) + __u32 features; + __u32 flags; + __u16 addr_width; + __u16 pasid_bits; + __u32 padding; + __u8 data[]; +}; + +/* + * struct iommu_nesting_info_vtd - Intel VT-d specific nesting info + * + * @flags: VT-d specific flags. Currently reserved for future + * extension. + * @cap_reg: Describe basic capabilities as defined in VT-d capability + * register. + * @ecap_reg: Describe the extended capabilities as defined in VT-d + * extended capability register. + */ +struct iommu_nesting_info_vtd { + __u32 flags; + __u32 padding; + __u64 cap_reg; + __u64 ecap_reg; +}; + #endif /* _UAPI_IOMMU_H */ -- 2.7.4