From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.2 required=3.0 tests=BAYES_00,DATE_IN_PAST_06_12, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71C78C433F5 for ; Wed, 22 Sep 2021 05:13:20 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2D2536105A for ; Wed, 22 Sep 2021 05:13:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2D2536105A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 04A8D83E82; Wed, 22 Sep 2021 05:13:20 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Qy35dbRKxzLM; Wed, 22 Sep 2021 05:13:19 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp1.osuosl.org (Postfix) with ESMTPS id ED48F83EAD; Wed, 22 Sep 2021 05:13:18 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B72DDC0028; Wed, 22 Sep 2021 05:13:18 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 04B69C000F for ; Wed, 22 Sep 2021 05:13:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 107C14047C for ; Wed, 22 Sep 2021 05:13:16 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ounYueObOzej for ; Wed, 22 Sep 2021 05:13:15 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by smtp2.osuosl.org (Postfix) with ESMTPS id 1CB3D4047D for ; Wed, 22 Sep 2021 05:13:15 +0000 (UTC) X-IronPort-AV: E=McAfee;i="6200,9189,10114"; a="287187658" X-IronPort-AV: E=Sophos;i="5.85,312,1624345200"; d="scan'208";a="287187658" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Sep 2021 22:13:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,312,1624345200"; d="scan'208";a="550107698" Received: from otc-wp-03.jf.intel.com ([10.54.39.79]) by FMSMGA003.fm.intel.com with ESMTP; 21 Sep 2021 22:13:14 -0700 From: Jacob Pan To: iommu@lists.linux-foundation.org, LKML , Joerg Roedel , Jason Gunthorpe , "Christoph Hellwig" Subject: [RFC 6/7] iommu: Add KVA map API Date: Tue, 21 Sep 2021 13:29:40 -0700 Message-Id: <1632256181-36071-7-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1632256181-36071-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1632256181-36071-1-git-send-email-jacob.jun.pan@linux.intel.com> MIME-Version: 1.0 Cc: "Tian, Kevin" , Tony Luck , Dave Jiang , Raj Ashok , "Kumar, Sanjay K" , mike.campin@intel.com X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" VGhpcyBwYXRjaCBhZGRzIEtWQSBtYXAgQVBJLiBJdCBlbmZvcmNlcyBLVkEgYWRkcmVzcyByYW5n ZSBjaGVja2luZyBhbmQKb3RoZXIgcG90ZW50aWFsIHNhbml0eSBjaGVja3MuIEN1cnJlbnRseSwg b25seSB0aGUgZGlyZWN0IG1hcCByYW5nZSBpcwpjaGVja2VkLgpGb3IgdHJ1c3RlZCBkZXZpY2Vz LCB0aGlzIEFQSSByZXR1cm5zIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhYm92ZSBzYW5pdHkKY2hl Y2suIEZvciB1bnRydXN0ZWQgZGV2aWNlcywgdGhpcyBBUEkgc2VydmVzIGFzIGEgc2ltcGxlIHdy YXBwZXIgYXJvdW5kCklPTU1VIG1hcC91bm1hcCBBUElzLsKgCk9QRU46IEFsaWdubWVudCBhdCB0 aGUgbWluaW11bSBwYWdlIHNpemUgaXMgcmVxdWlyZWQsIG5vdCBhcyByaWNoIGFuZApmbGV4aWJs ZSBhcyBETUEtQVBJcy4KClNpZ25lZC1vZmYtYnk6IEphY29iIFBhbiA8amFjb2IuanVuLnBhbkBs aW51eC5pbnRlbC5jb20+Ci0tLQogZHJpdmVycy9pb21tdS9pb21tdS5jIHwgNTcgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogaW5jbHVkZS9saW51eC9pb21tdS5o IHwgIDUgKysrKwogMiBmaWxlcyBjaGFuZ2VkLCA2MiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9pb21tdS9pb21tdS5jIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCmluZGV4IGFj ZmRjZDdlYmQ2YS4uNDViYTU1OTQxMjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2lvbW11 LmMKKysrIGIvZHJpdmVycy9pb21tdS9pb21tdS5jCkBAIC0yNDkwLDYgKzI0OTAsNjMgQEAgaW50 IGlvbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92 YSwKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvbW11X21hcCk7CiAKKy8qCisgKiBSRVZJU0lUOiBU aGlzIG1pZ2h0IG5vdCBiZSBzdWZmaWNpZW50LiBDb3VsZCBhbHNvIGNoZWNrIHBlcm1pc3Npb24g bWF0Y2gsCisgKiBleGNsdWRlIGtlcm5lbCB0ZXh0LCBldGMuCisgKi8KK3N0YXRpYyBpbmxpbmUg Ym9vbCBpc19rZXJuZWxfZGlyZWN0X21hcCh1bnNpZ25lZCBsb25nIHN0YXJ0LCBwaHlzX2FkZHJf dCBzaXplKQoreworCXJldHVybiAoc3RhcnQgPj0gUEFHRV9PRkZTRVQpICYmICgoc3RhcnQgKyBz aXplKSA8PSBWTUFMTE9DX1NUQVJUKTsKK30KKworLyoqCisgKiBAYnJpZWYgTWFwIGtlcm5lbCB2 aXJ0dWFsIGFkZHJlc3MgZm9yIERNQSByZW1hcC4gRE1BIHJlcXVlc3Qgd2l0aAorICoJZG9tYWlu J3MgZGVmYXVsdCBQQVNJRCB3aWxsIHRhcmdldCBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIHNwYWNl LgorICoKKyAqIEBwYXJhbSBkb21haW4JRG9tYWluIGNvbnRhaW5zIHRoZSBQQVNJRAorICogQHBh cmFtIHBhZ2UJCUtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MKKyAqIEBwYXJhbSBzaXplCQlTaXplIHRv IG1hcAorICogQHBhcmFtIHByb3QJCVBlcm1pc3Npb25zCisgKiBAcmV0dXJuIGludAkJMCBvbiBz dWNjZXNzIG9yIGVycm9yIGNvZGUKKyAqLworaW50IGlvbW11X21hcF9rdmEoc3RydWN0IGlvbW11 X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJICBzaXplX3Qgc2l6ZSwgaW50 IHByb3QpCit7CisJcGh5c19hZGRyX3QgcGh5cyA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKKwl2b2lk ICprdmEgPSBwaHlzX3RvX3ZpcnQocGh5cyk7CisKKwkvKgorCSAqIFRPRE86IExpbWl0IERNQSB0 byBrZXJuZWwgZGlyZWN0IG1hcHBpbmcgb25seSwgYXZvaWQgZHluYW1pYyByYW5nZQorCSAqIHVu dGlsIHdlIGhhdmUgbW11X25vdGlmaWVyIGZvciBtYWtpbmcgSU9UTEIgY29oZXJlbnQgd2l0aCBD UFUuCisJICovCisJaWYgKCFpc19rZXJuZWxfZGlyZWN0X21hcCgodW5zaWduZWQgbG9uZylrdmEs IHNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBLVkEgZG9tYWluIHR5cGUgaW5kaWNhdGVz IHNoYXJlZCBDUFUgcGFnZSB0YWJsZSwgc2tpcCBidWlsZGluZworCSAqIElPTU1VIHBhZ2UgdGFi bGVzLiBUaGlzIGlzIHRoZSBmYXN0IG1vZGUgd2hlcmUgb25seSBzYW5pdHkgY2hlY2sKKwkgKiBp cyBwZXJmb3JtZWQuCisJICovCisJaWYgKGRvbWFpbi0+dHlwZSA9PSBJT01NVV9ET01BSU5fS1ZB KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBpb21tdV9tYXAoZG9tYWluLCAodW5zaWduZWQgbG9u ZylrdmEsIHBoeXMsIHNpemUsIHByb3QpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tbXVfbWFw X2t2YSk7CisKK2ludCBpb21tdV91bm1hcF9rdmEoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWlu LCB2b2lkICprdmEsCisJCSAgICBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIWlzX2tlcm5lbF9kaXJl Y3RfbWFwKCh1bnNpZ25lZCBsb25nKWt2YSwgc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJ aWYgKGRvbWFpbi0+dHlwZSA9PSBJT01NVV9ET01BSU5fS1ZBKSB7CisJCXByX2RlYnVnX3JhdGVs aW1pdGVkKCJ1bm1hcCBrdmEgc2tpcHBlZCAlbGx4IiwgKHU2NClrdmEpOworCQlyZXR1cm4gMDsK Kwl9CisJLyogUkVWSVNJVDogZG8gd2UgbmVlZCBhIGZhc3QgdmVyc2lvbj8gKi8KKwlyZXR1cm4g aW9tbXVfdW5tYXAoZG9tYWluLCAodW5zaWduZWQgbG9uZylrdmEsIHNpemUpOworfQorRVhQT1JU X1NZTUJPTF9HUEwoaW9tbXVfdW5tYXBfa3ZhKTsKKwogaW50IGlvbW11X21hcF9hdG9taWMoc3Ry dWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBsb25nIGlvdmEsCiAJICAgICAgcGh5 c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplLCBpbnQgcHJvdCkKIHsKZGlmZiAtLWdpdCBhL2lu Y2x1ZGUvbGludXgvaW9tbXUuaCBiL2luY2x1ZGUvbGludXgvaW9tbXUuaAppbmRleCBjZDgyMjVm NmJjMjMuLmMwZmFjMDUwY2E1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb21tdS5oCisr KyBiL2luY2x1ZGUvbGludXgvaW9tbXUuaApAQCAtNDI3LDYgKzQyNywxMSBAQCBleHRlcm4gc2l6 ZV90IGlvbW11X21hcF9zZyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGxv bmcgaW92YSwKIGV4dGVybiBzaXplX3QgaW9tbXVfbWFwX3NnX2F0b21pYyhzdHJ1Y3QgaW9tbXVf ZG9tYWluICpkb21haW4sCiAJCQkJICB1bnNpZ25lZCBsb25nIGlvdmEsIHN0cnVjdCBzY2F0dGVy bGlzdCAqc2csCiAJCQkJICB1bnNpZ25lZCBpbnQgbmVudHMsIGludCBwcm90KTsKK2V4dGVybiBp bnQgaW9tbXVfbWFwX2t2YShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkgc3RydWN0 IHBhZ2UgKnBhZ2UsIHNpemVfdCBzaXplLCBpbnQgcHJvdCk7CitleHRlcm4gaW50IGlvbW11X3Vu bWFwX2t2YShzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCisJCQkgICB2b2lkICprdmEsIHNp emVfdCBzaXplKTsKKwogZXh0ZXJuIHBoeXNfYWRkcl90IGlvbW11X2lvdmFfdG9fcGh5cyhzdHJ1 Y3QgaW9tbXVfZG9tYWluICpkb21haW4sIGRtYV9hZGRyX3QgaW92YSk7CiBleHRlcm4gdm9pZCBp b21tdV9zZXRfZmF1bHRfaGFuZGxlcihzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4sCiAJCQlp b21tdV9mYXVsdF9oYW5kbGVyX3QgaGFuZGxlciwgdm9pZCAqdG9rZW4pOwotLSAKMi4yNS4xCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppb21tdSBtYWls aW5nIGxpc3QKaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5s aW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vaW9tbXU= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.2 required=3.0 tests=BAYES_00,DATE_IN_PAST_06_12, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F46AC433F5 for ; Wed, 22 Sep 2021 05:13:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6739D61207 for ; Wed, 22 Sep 2021 05:13:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232408AbhIVFO4 (ORCPT ); Wed, 22 Sep 2021 01:14:56 -0400 Received: from mga12.intel.com ([192.55.52.136]:29329 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231901AbhIVFOo (ORCPT ); Wed, 22 Sep 2021 01:14:44 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10114"; a="203012045" X-IronPort-AV: E=Sophos;i="5.85,312,1624345200"; d="scan'208";a="203012045" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Sep 2021 22:13:14 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.85,312,1624345200"; d="scan'208";a="550107698" Received: from otc-wp-03.jf.intel.com ([10.54.39.79]) by FMSMGA003.fm.intel.com with ESMTP; 21 Sep 2021 22:13:14 -0700 From: Jacob Pan To: iommu@lists.linux-foundation.org, LKML , Joerg Roedel , Jason Gunthorpe , "Christoph Hellwig" Cc: "Lu Baolu" , Raj Ashok , "Kumar, Sanjay K" , Dave Jiang , Tony Luck , mike.campin@intel.com, Yi Liu , "Tian, Kevin" Subject: [RFC 6/7] iommu: Add KVA map API Date: Tue, 21 Sep 2021 13:29:40 -0700 Message-Id: <1632256181-36071-7-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1632256181-36071-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1632256181-36071-1-git-send-email-jacob.jun.pan@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds KVA map API. It enforces KVA address range checking and other potential sanity checks. Currently, only the direct map range is checked. For trusted devices, this API returns immediately after the above sanity check. For untrusted devices, this API serves as a simple wrapper around IOMMU map/unmap APIs.  OPEN: Alignment at the minimum page size is required, not as rich and flexible as DMA-APIs. Signed-off-by: Jacob Pan --- drivers/iommu/iommu.c | 57 +++++++++++++++++++++++++++++++++++++++++++ include/linux/iommu.h | 5 ++++ 2 files changed, 62 insertions(+) diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index acfdcd7ebd6a..45ba55941209 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -2490,6 +2490,63 @@ int iommu_map(struct iommu_domain *domain, unsigned long iova, } EXPORT_SYMBOL_GPL(iommu_map); +/* + * REVISIT: This might not be sufficient. Could also check permission match, + * exclude kernel text, etc. + */ +static inline bool is_kernel_direct_map(unsigned long start, phys_addr_t size) +{ + return (start >= PAGE_OFFSET) && ((start + size) <= VMALLOC_START); +} + +/** + * @brief Map kernel virtual address for DMA remap. DMA request with + * domain's default PASID will target kernel virtual address space. + * + * @param domain Domain contains the PASID + * @param page Kernel virtual address + * @param size Size to map + * @param prot Permissions + * @return int 0 on success or error code + */ +int iommu_map_kva(struct iommu_domain *domain, struct page *page, + size_t size, int prot) +{ + phys_addr_t phys = page_to_phys(page); + void *kva = phys_to_virt(phys); + + /* + * TODO: Limit DMA to kernel direct mapping only, avoid dynamic range + * until we have mmu_notifier for making IOTLB coherent with CPU. + */ + if (!is_kernel_direct_map((unsigned long)kva, size)) + return -EINVAL; + /* KVA domain type indicates shared CPU page table, skip building + * IOMMU page tables. This is the fast mode where only sanity check + * is performed. + */ + if (domain->type == IOMMU_DOMAIN_KVA) + return 0; + + return iommu_map(domain, (unsigned long)kva, phys, size, prot); +} +EXPORT_SYMBOL_GPL(iommu_map_kva); + +int iommu_unmap_kva(struct iommu_domain *domain, void *kva, + size_t size) +{ + if (!is_kernel_direct_map((unsigned long)kva, size)) + return -EINVAL; + + if (domain->type == IOMMU_DOMAIN_KVA) { + pr_debug_ratelimited("unmap kva skipped %llx", (u64)kva); + return 0; + } + /* REVISIT: do we need a fast version? */ + return iommu_unmap(domain, (unsigned long)kva, size); +} +EXPORT_SYMBOL_GPL(iommu_unmap_kva); + int iommu_map_atomic(struct iommu_domain *domain, unsigned long iova, phys_addr_t paddr, size_t size, int prot) { diff --git a/include/linux/iommu.h b/include/linux/iommu.h index cd8225f6bc23..c0fac050ca57 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -427,6 +427,11 @@ extern size_t iommu_map_sg(struct iommu_domain *domain, unsigned long iova, extern size_t iommu_map_sg_atomic(struct iommu_domain *domain, unsigned long iova, struct scatterlist *sg, unsigned int nents, int prot); +extern int iommu_map_kva(struct iommu_domain *domain, + struct page *page, size_t size, int prot); +extern int iommu_unmap_kva(struct iommu_domain *domain, + void *kva, size_t size); + extern phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain, dma_addr_t iova); extern void iommu_set_fault_handler(struct iommu_domain *domain, iommu_fault_handler_t handler, void *token); -- 2.25.1