Received: by 2002:a17:90a:88:0:0:0:0 with SMTP id a8csp4428400pja; Thu, 21 Nov 2019 19:12:07 -0800 (PST) X-Google-Smtp-Source: APXvYqxpFlsx29Cpgqp3r1mUa+mrmMSKJ+APOeSK0MaJBRKJqBTCEPfAxi7tkdDBSRHfhrbigRLO X-Received: by 2002:a17:906:970a:: with SMTP id k10mr18213430ejx.314.1574392327172; Thu, 21 Nov 2019 19:12:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574392327; cv=none; d=google.com; s=arc-20160816; b=ZiP37m2gzRzkoXDLIlAxSFOX/4MmmsjGRQpYM6h3Faqu0gtK+S4uIq/oy4NyndV3rU pAmoD0jc/eCybsMBj6kfzG8p/rJpi3n7WDm2JVRsxmGWeawO5m3NEIkfitgXI3NU6ivT g6gM8ZrNivNdlYGQ7Ud8LiKfbUY0PTPZvstsHyei4UWy9sPAX2KixlxD2PhpYLMFtyM+ BonosZEKd8JxFYh33kTmkr+Pry7B9bn19TRIMJRHhU2e/9cGgpKTSiOhkWxCocJ5IOJQ d40TQvss4mJdPue08mZ7NcqJuBX/daYqQXJH6UH+cwXQHv9BqPmmupO52TgqsS2z41LH 8gdw== 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; bh=dCJ5FnAWLLaqc7bGFEHy9BjrZ9MutZ1x8kf2XIf1cJM=; b=cQteBCkzyPsiQYpXgPf0wWBfZ3e+VwVHadNSQyv6q9abnjStJzH+u7v8oKA9aPOeWX dCiOE2npQfwHDPimcOZkXWAX0hAUp/vAul1ydkzV5Q/dty/AhVHnKnX/vFRdwdffw70I KtRHiiM6NAMh+Jlh50+5Yk5o5/Pf1cXiJ/R66Ndnk2MAdWWTOOr+9NbILjWfRLP7EZHu jf7s7u7L6Emw7eXs/EHc8APCDnV0CeyJ0F5XKZRz8uaqCT6mkHJVQ28Z/hwBIRUxBhTi dAwT0FPeJn7j0POA4kBSSD7Ob8xBGt/8EHExpasULGUO9SQyCoHzFflw9aZczuHObj65 sxHA== 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 e9si3357841ejb.380.2019.11.21.19.11.42; Thu, 21 Nov 2019 19:12:07 -0800 (PST) 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 S1726840AbfKVDIc (ORCPT + 99 others); Thu, 21 Nov 2019 22:08:32 -0500 Received: from mga14.intel.com ([192.55.52.115]:53721 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726830AbfKVDIa (ORCPT ); Thu, 21 Nov 2019 22:08:30 -0500 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/DHE-RSA-AES256-GCM-SHA384; 21 Nov 2019 19:08:30 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,228,1571727600"; d="scan'208";a="232540462" Received: from allen-box.sh.intel.com ([10.239.159.136]) by fmsmga004.fm.intel.com with ESMTP; 21 Nov 2019 19:08:28 -0800 From: Lu Baolu To: Joerg Roedel Cc: David Woodhouse , ashok.raj@intel.com, jacob.jun.pan@linux.intel.com, kevin.tian@intel.com, Eric Auger , iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org, Lu Baolu Subject: [PATCH 5/5] iommu/vt-d: Consolidate pasid-based device tlb invalidation Date: Fri, 22 Nov 2019 11:04:49 +0800 Message-Id: <20191122030449.28892-6-baolu.lu@linux.intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191122030449.28892-1-baolu.lu@linux.intel.com> References: <20191122030449.28892-1-baolu.lu@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Merge pasid-based device tlb invalidation into iommu->flush.p_dev_tlb_inv. Signed-off-by: Lu Baolu --- drivers/iommu/intel-iommu.c | 41 +++++++++++++++++++++++++++++++++++++ drivers/iommu/intel-svm.c | 33 ++++++----------------------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index fec78cc877c1..dd16d466320f 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3074,6 +3074,46 @@ qi_flush_piotlb(struct intel_iommu *iommu, u16 did, u32 pasid, u64 addr, qi_submit_sync(&desc, iommu); } +/* PASID-based device TLB invalidation */ +static void +qi_flush_dev_piotlb(struct intel_iommu *iommu, u16 sid, u16 pfsid, + u32 pasid, u16 qdep, u64 address, unsigned long npages) +{ + 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); + + /* + * npages == -1 means a PASID-selective invalidation, otherwise, + * a positive value for Page-selective-within-PASID invalidation. + * 0 is not a valid input. + */ + if (WARN_ON(!npages)) { + pr_err("Invalid input npages = %ld\n", npages); + return; + } + + if (npages == -1) { + desc.qw1 = QI_DEV_EIOTLB_ADDR(((u64)-1) >> 1) | + QI_DEV_EIOTLB_SIZE; + } else if (npages > 1) { + /* The least significant zero bit indicates the size. So, + * for example, an "address" value of 0x12345f000 will + * flush from 0x123440000 to 0x12347ffff (256KiB). */ + unsigned long last = address + ((unsigned long)(npages - 1) << VTD_PAGE_SHIFT); + unsigned long mask = __rounddown_pow_of_two(address ^ last); + + desc.qw1 = QI_DEV_EIOTLB_ADDR((address & ~mask) | + (mask - 1)) | QI_DEV_EIOTLB_SIZE; + } else { + desc.qw1 = QI_DEV_EIOTLB_ADDR(address); + } + + qi_submit_sync(&desc, iommu); +} + static void intel_iommu_init_qi(struct intel_iommu *iommu) { /* @@ -3108,6 +3148,7 @@ static void intel_iommu_init_qi(struct intel_iommu *iommu) iommu->flush.pc_inv = qi_flush_pasid; iommu->flush.dev_tlb_inv = qi_flush_dev_iotlb; iommu->flush.p_iotlb_inv = qi_flush_piotlb; + iommu->flush.p_dev_tlb_inv = qi_flush_dev_piotlb; pr_info("%s: Using Queued invalidation\n", iommu->name); } } diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c index 02c6b14f0568..b6b22989eb46 100644 --- a/drivers/iommu/intel-svm.c +++ b/drivers/iommu/intel-svm.c @@ -114,39 +114,18 @@ void intel_svm_check(struct intel_iommu *iommu) iommu->flags |= VTD_FLAG_SVM_CAPABLE; } -static void intel_flush_svm_range_dev (struct intel_svm *svm, struct intel_svm_dev *sdev, - unsigned long address, unsigned long pages, int ih) +static void +intel_flush_svm_range_dev(struct intel_svm *svm, struct intel_svm_dev *sdev, + unsigned long address, unsigned long pages, int ih) { - struct qi_desc desc; struct intel_iommu *iommu = svm->iommu; iommu->flush.p_iotlb_inv(iommu, sdev->did, svm->pasid, address, pages, ih); - if (sdev->dev_iotlb) { - desc.qw0 = QI_DEV_EIOTLB_PASID(svm->pasid) | - QI_DEV_EIOTLB_SID(sdev->sid) | - QI_DEV_EIOTLB_QDEP(sdev->qdep) | - QI_DEIOTLB_TYPE; - if (pages == -1) { - desc.qw1 = QI_DEV_EIOTLB_ADDR(-1ULL >> 1) | - QI_DEV_EIOTLB_SIZE; - } else if (pages > 1) { - /* The least significant zero bit indicates the size. So, - * for example, an "address" value of 0x12345f000 will - * flush from 0x123440000 to 0x12347ffff (256KiB). */ - unsigned long last = address + ((unsigned long)(pages - 1) << VTD_PAGE_SHIFT); - unsigned long mask = __rounddown_pow_of_two(address ^ last); - - desc.qw1 = QI_DEV_EIOTLB_ADDR((address & ~mask) | - (mask - 1)) | QI_DEV_EIOTLB_SIZE; - } else { - desc.qw1 = QI_DEV_EIOTLB_ADDR(address); - } - desc.qw2 = 0; - desc.qw3 = 0; - qi_submit_sync(&desc, svm->iommu); - } + if (sdev->dev_iotlb) + iommu->flush.p_dev_tlb_inv(iommu, sdev->sid, 0, svm->pasid, + sdev->qdep, address, pages); } static void intel_flush_svm_range(struct intel_svm *svm, unsigned long address, -- 2.17.1