Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp2933257ybb; Mon, 30 Mar 2020 16:23:18 -0700 (PDT) X-Google-Smtp-Source: ADFU+vt0Le/6x72N6uCr9MSXxauHt7nsQfR4oLbM9ioWraqdCMijxbvQXLfCzNVfyb+lGE7CUNvH X-Received: by 2002:a05:6830:1e93:: with SMTP id n19mr11671965otr.153.1585610598046; Mon, 30 Mar 2020 16:23:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585610598; cv=none; d=google.com; s=arc-20160816; b=j2XFbUj+B0OMzFr3f7VmR1up9eUN+tdvody6bXFK762ED8V1G0XT91hObab1RGYtwL ka8GjoX113L8OCaVCJIoC3vn7LYXJlKyBfxZZVXi/UYfhScjZzawgXp1F+ZjCuyWIyIf pyaf20JTjzWAmQsHkOjizsXukB5wvDN6z7Ep7MhIOpxtQDDn8JPrXtZij5FygI833vnG T5ZysVm5v4k6Lvmf/f7DWENsqur7S0w19JuVNIPRjhtCK2yRnZgWv9X01I8u9Taeyp/S NDpHqMkkzSBVHneyfbvPEESImDNqnLKqM0qxQ4vwTmYbPwBr/X9sQzjFa+WSfJ85/s3U XwgA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :date:ironport-sdr:ironport-sdr; bh=AHO/vfq9o/bPqh6V88zZUSBgOcy6q9TKTnyBJ7E50GI=; b=YoIRIhclMeFPCFvjMLuFod4rYcJoJgHqgGODyJyJczaXA8+LISCxwo6i/++wGF3J8E gPXEJH5J1BpiUpei0P7AWB6x75u2o762s1fHx7ZxZXl318MgZY6xz2b6H3E59/9QTWi9 i9RgC3lQ/kaut8r3eZOXVXZuALStkWnQcgCxTN7f3+v83ArO3UkiHB/ZN5VeATMtAVH4 WsMk/LB42d8dq+qzXHDLEtiTD0Eb8hpJPP2opPizbkWum9UD65j8CGbSZ9oiVqBEeVve oS7dUa5TkqZIlPoI5UCPZgRw+j76ZBhlsHAw9enXFNCNzs4nZRrPgF8FdJy0p6Aa0Ves sgIQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id t19si7799121oth.194.2020.03.30.16.23.06; Mon, 30 Mar 2020 16:23:18 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1729416AbgC3XWt (ORCPT + 99 others); Mon, 30 Mar 2020 19:22:49 -0400 Received: from mga14.intel.com ([192.55.52.115]:8519 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728880AbgC3XWs (ORCPT ); Mon, 30 Mar 2020 19:22:48 -0400 IronPort-SDR: CYsMc6xNSzUJP6BcYO+OLqFhmKM2adzN/8T7+KtOchMbrmFNJucRQap2I9GACQjwVxAyue0kQ7 aXI//N/hJPgA== X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Mar 2020 16:22:48 -0700 IronPort-SDR: sh7yWEKxwhMvfS4P1lxwEYQpxpI2vgEI9iX8UiORLi4Zxd3gfRJsmpeZvwMn5Ysg3kDeRSyUeF WuDqodOgyBtw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.72,326,1580803200"; d="scan'208";a="272542078" Received: from jacob-builder.jf.intel.com (HELO jacob-builder) ([10.7.199.155]) by fmsmga004.fm.intel.com with ESMTP; 30 Mar 2020 16:22:47 -0700 Date: Mon, 30 Mar 2020 16:28:34 -0700 From: Jacob Pan To: Auger Eric Cc: Lu Baolu , iommu@lists.linux-foundation.org, LKML , Joerg Roedel , David Woodhouse , Alex Williamson , Jean-Philippe Brucker , Yi Liu , "Tian, Kevin" , Raj Ashok , Christoph Hellwig , Jonathan Cameron , jacob.jun.pan@linux.intel.com Subject: Re: [PATCH V10 07/11] iommu/vt-d: Support flushing more translation cache types Message-ID: <20200330162834.5ef42700@jacob-builder> In-Reply-To: References: <1584746861-76386-1-git-send-email-jacob.jun.pan@linux.intel.com> <1584746861-76386-8-git-send-email-jacob.jun.pan@linux.intel.com> Organization: OTC X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 27 Mar 2020 15:46:23 +0100 Auger Eric wrote: > Hi Jacob, > > On 3/21/20 12:27 AM, Jacob Pan wrote: > > When Shared Virtual Memory is exposed to a guest via vIOMMU, > > scalable IOTLB invalidation may be passed down from outside IOMMU > > subsystems. This patch adds invalidation functions that can be used > > for additional translation cache types. > > > > Signed-off-by: Jacob Pan > > > > --- > > v9 -> v10: > > Fix off by 1 in pasid device iotlb flush > > > > Address v7 missed review from Eric > > > > --- > > --- > > drivers/iommu/dmar.c | 36 > > ++++++++++++++++++++++++++++++++++++ drivers/iommu/intel-pasid.c | > > 3 ++- include/linux/intel-iommu.h | 20 ++++++++++++++++---- > > 3 files changed, 54 insertions(+), 5 deletions(-) > > > > diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c > > index f77dae7ba7d4..4d6b7b5b37ee 100644 > > --- a/drivers/iommu/dmar.c > > +++ b/drivers/iommu/dmar.c > > @@ -1421,6 +1421,42 @@ void qi_flush_piotlb(struct intel_iommu > > *iommu, u16 did, u32 pasid, u64 addr, qi_submit_sync(&desc, iommu); > > } > > > > +/* PASID-based device IOTLB Invalidate */ > > +void qi_flush_dev_iotlb_pasid(struct intel_iommu *iommu, u16 sid, > > u16 pfsid, > > + u32 pasid, u16 qdep, u64 addr, unsigned > > size_order, u64 granu) +{ > > + unsigned long mask = 1UL << (VTD_PAGE_SHIFT + size_order - > > 1); > > + struct qi_desc desc = {.qw2 = 0, .qw3 = 0}; > > + > > + desc.qw0 = QI_DEV_EIOTLB_PASID(pasid) | > > QI_DEV_EIOTLB_SID(sid) | > > + QI_DEV_EIOTLB_QDEP(qdep) | QI_DEIOTLB_TYPE | > > + QI_DEV_IOTLB_PFSID(pfsid); > > + desc.qw1 = QI_DEV_EIOTLB_GLOB(granu); > > + > > + /* > > + * If S bit is 0, we only flush a single page. If S bit is > > set, > > + * The least significant zero bit indicates the > > invalidation address > > + * range. VT-d spec 6.5.2.6. > > + * e.g. address bit 12[0] indicates 8KB, 13[0] indicates > > 16KB. > > + * size order = 0 is PAGE_SIZE 4KB > > + * Max Invs Pending (MIP) is set to 0 for now until we > > have DIT in > > + * ECAP. > > + */ > > + desc.qw1 |= addr & ~mask; > > + if (size_order) > > + desc.qw1 |= QI_DEV_EIOTLB_SIZE; > > + > > + qi_submit_sync(&desc, iommu); > > +} > > + > > +void qi_flush_pasid_cache(struct intel_iommu *iommu, u16 did, u64 > > granu, int pasid) +{ > > + struct qi_desc desc = {.qw1 = 0, .qw2 = 0, .qw3 = 0}; > > + > > + desc.qw0 = QI_PC_PASID(pasid) | QI_PC_DID(did) | > > QI_PC_GRAN(granu) | QI_PC_TYPE; > > + qi_submit_sync(&desc, iommu); > > +} > > + > > /* > > * Disable Queued Invalidation interface. > > */ > > diff --git a/drivers/iommu/intel-pasid.c > > b/drivers/iommu/intel-pasid.c index 10c7856afc6b..9f6d07410722 > > 100644 --- a/drivers/iommu/intel-pasid.c > > +++ b/drivers/iommu/intel-pasid.c > > @@ -435,7 +435,8 @@ pasid_cache_invalidation_with_pasid(struct > > intel_iommu *iommu, { > > struct qi_desc desc; > > > > - desc.qw0 = QI_PC_DID(did) | QI_PC_PASID_SEL | > > QI_PC_PASID(pasid); > > + desc.qw0 = QI_PC_DID(did) | QI_PC_GRAN(QI_PC_PASID_SEL) | > > + QI_PC_PASID(pasid) | QI_PC_TYPE; > Just a nit, this fix is not documented in the commit message. > Thanks, I just sent out this fix separately. Will remove this from the set. https://lkml.org/lkml/2020/3/30/1065 > Besides > Reviewed-by: Eric Auger > > Thanks > > Eric > > > desc.qw1 = 0; > > desc.qw2 = 0; > > desc.qw3 = 0; > > diff --git a/include/linux/intel-iommu.h > > b/include/linux/intel-iommu.h index 85b05120940e..43539713b3b3 > > 100644 --- a/include/linux/intel-iommu.h > > +++ b/include/linux/intel-iommu.h > > @@ -334,7 +334,7 @@ enum { > > #define QI_IOTLB_GRAN(gran) (((u64)gran) >> > > (DMA_TLB_FLUSH_GRANU_OFFSET-4)) #define QI_IOTLB_ADDR(addr) > > (((u64)addr) & VTD_PAGE_MASK) #define > > QI_IOTLB_IH(ih) (((u64)ih) << 6) -#define > > QI_IOTLB_AM(am) (((u8)am)) +#define > > QI_IOTLB_AM(am) (((u8)am) & 0x3f) > > #define QI_CC_FM(fm) (((u64)fm) << 48) > > #define QI_CC_SID(sid) (((u64)sid) << 32) > > @@ -353,16 +353,21 @@ enum { > > #define QI_PC_DID(did) (((u64)did) << 16) > > #define QI_PC_GRAN(gran) (((u64)gran) << 4) > > > > -#define QI_PC_ALL_PASIDS (QI_PC_TYPE | QI_PC_GRAN(0)) > > -#define QI_PC_PASID_SEL (QI_PC_TYPE | QI_PC_GRAN(1)) > > +/* PASID cache invalidation granu */ > > +#define QI_PC_ALL_PASIDS 0 > > +#define QI_PC_PASID_SEL 1 > > > > #define QI_EIOTLB_ADDR(addr) ((u64)(addr) & VTD_PAGE_MASK) > > #define QI_EIOTLB_IH(ih) (((u64)ih) << 6) > > -#define QI_EIOTLB_AM(am) (((u64)am)) > > +#define QI_EIOTLB_AM(am) (((u64)am) & 0x3f) > > #define QI_EIOTLB_PASID(pasid) (((u64)pasid) << 32) > > #define QI_EIOTLB_DID(did) (((u64)did) << 16) > > #define QI_EIOTLB_GRAN(gran) (((u64)gran) << 4) > > > > +/* QI Dev-IOTLB inv granu */ > > +#define QI_DEV_IOTLB_GRAN_ALL 1 > > +#define QI_DEV_IOTLB_GRAN_PASID_SEL 0> + > > #define QI_DEV_EIOTLB_ADDR(a) ((u64)(a) & VTD_PAGE_MASK) > > #define QI_DEV_EIOTLB_SIZE (((u64)1) << 11) > > #define QI_DEV_EIOTLB_GLOB(g) ((u64)g) > > @@ -662,8 +667,15 @@ extern void qi_flush_iotlb(struct intel_iommu > > *iommu, u16 did, u64 addr, unsigned int size_order, u64 type); > > extern void qi_flush_dev_iotlb(struct intel_iommu *iommu, u16 sid, > > u16 pfsid, u16 qdep, u64 addr, unsigned mask); > > + > > void qi_flush_piotlb(struct intel_iommu *iommu, u16 did, u32 > > pasid, u64 addr, unsigned long npages, bool ih); > > + > > +extern void qi_flush_dev_iotlb_pasid(struct intel_iommu *iommu, > > u16 sid, u16 pfsid, > > + u32 pasid, u16 qdep, u64 addr, unsigned > > size_order, u64 granu); + > > +extern void qi_flush_pasid_cache(struct intel_iommu *iommu, u16 > > did, u64 granu, int pasid); + > > extern int qi_submit_sync(struct qi_desc *desc, struct intel_iommu > > *iommu); > > extern int dmar_ir_support(void); > > > [Jacob Pan]