From patchwork Fri Feb 26 17:35:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 8440401 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 924739F52D for ; Fri, 26 Feb 2016 17:42:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8EA9F203B6 for ; Fri, 26 Feb 2016 17:42:33 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 31C2F203AD for ; Fri, 26 Feb 2016 17:42:32 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1aZMNi-0006EG-Ke; Fri, 26 Feb 2016 17:40:46 +0000 Received: from mail-wm0-x22b.google.com ([2a00:1450:400c:c09::22b]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aZMJc-0001er-TW for linux-arm-kernel@lists.infradead.org; Fri, 26 Feb 2016 17:36:39 +0000 Received: by mail-wm0-x22b.google.com with SMTP id b205so80966112wmb.1 for ; Fri, 26 Feb 2016 09:36:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eSLP1oa548jZNbodAub50lOfvtMD29xBLqvLHOyTB+E=; b=LMn8qlOw52FVZP9Fbd47m5iMglGWazjAF2NvMKO5KDlKyBKgifeeUNhb2YFFwcGHrU 7lxlzW4wdsNmy8O6ZxCWGS0rzZzPqT6LQiI95yfHyaUp2VcUCx63Tlguq+xlKDfrxBdn JAsWjnwiaHLkyDYNH/m7CYaRmxEyaIy58xna0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=eSLP1oa548jZNbodAub50lOfvtMD29xBLqvLHOyTB+E=; b=Pym39XTWgBW4pru8Mi7poT3bxYClBPY0EkrBKTrENFbebiTDpyPOFw1dS6khyZ1w5d OjjreC1HWSsREKcgAaheaZ+vZpqa7I1pfoMb6xdWZsOJtfCoyWI8/hzoxPdOdH0j1GYe orJjiHIpeS2l94i+3iqN5rZmRWNs5ObZFG6WrBTOrzj9s14meGPBveb9qFScUAzp5agh 83GGPgtSq5BAfovS3I+c9lxebYzk+yLXo8Nl5giDa8oztlgvywVSySE4cFXcdwIF0t6L 6CNxi/Du1XZTXl0o+nZSq/S3s0i33pQy697IFmYTN48JOGovBL44YAm/DnTvbA9ZCStP 5FJw== X-Gm-Message-State: AD7BkJJmju4PFRk2RktoqAvESxW9in2F1Eldm9L6nYHkxF7nxk6wvlN7e1tRLVaESx9aj/CG X-Received: by 10.194.71.177 with SMTP id w17mr3387935wju.36.1456508171221; Fri, 26 Feb 2016 09:36:11 -0800 (PST) Received: from new-host-8.home (LMontsouris-657-1-37-90.w80-11.abo.wanadoo.fr. [80.11.198.90]) by smtp.gmail.com with ESMTPSA id 77sm3750373wmp.18.2016.02.26.09.36.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 26 Feb 2016 09:36:09 -0800 (PST) From: Eric Auger To: eric.auger@st.com, eric.auger@linaro.org, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, marc.zyngier@arm.com, christoffer.dall@linaro.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Subject: [RFC v4 03/14] dma-reserved-iommu: alloc/free_reserved_iova_domain Date: Fri, 26 Feb 2016 17:35:43 +0000 Message-Id: <1456508154-2253-4-git-send-email-eric.auger@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1456508154-2253-1-git-send-email-eric.auger@linaro.org> References: <1456508154-2253-1-git-send-email-eric.auger@linaro.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160226_093633_671020_D57CB248 X-CRM114-Status: GOOD ( 20.14 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: patches@linaro.org, Manish.Jaggi@caviumnetworks.com, p.fedin@samsung.com, linux-kernel@vger.kernel.org, Bharat.Bhushan@freescale.com, iommu@lists.linux-foundation.org, pranav.sawargaonkar@gmail.com, suravee.suthikulpanit@amd.com MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Introduce alloc/free_reserved_iova_domain in the IOMMU API. alloc_reserved_iova_domain initializes an iova domain at a given iova base address and with a given size. This iova domain will be used to allocate iova within that window. Those IOVAs will be reserved for special purpose, typically MSI frame binding. Allocation function within the reserved iova domain will be introduced in subsequent patches. Those functions are implemented and exposed if CONFIG_IOMMU_DMA_RESERVED is seta. Signed-off-by: Eric Auger --- v3 -> v4: - formerly in "iommu/arm-smmu: implement alloc/free_reserved_iova_domain" & "iommu: add alloc/free_reserved_iova_domain" v2 -> v3: - remove iommu_alloc_reserved_iova_domain & iommu_free_reserved_iova_domain static implementation in case CONFIG_IOMMU_API is not set v1 -> v2: - moved from vfio API to IOMMU API --- drivers/iommu/Kconfig | 8 +++++ drivers/iommu/Makefile | 1 + drivers/iommu/dma-reserved-iommu.c | 74 ++++++++++++++++++++++++++++++++++++++ include/linux/dma-reserved-iommu.h | 45 +++++++++++++++++++++++ 4 files changed, 128 insertions(+) create mode 100644 drivers/iommu/dma-reserved-iommu.c create mode 100644 include/linux/dma-reserved-iommu.h diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index a1e75cb..0775143 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -55,6 +55,12 @@ config IOMMU_DMA select IOMMU_API select IOMMU_IOVA +# IOMMU reserved IOVA mapping (MSI doorbell) +config IOMMU_DMA_RESERVED + bool + select IOMMU_API + select IOMMU_IOVA + config FSL_PAMU bool "Freescale IOMMU support" depends on PPC32 @@ -288,6 +294,7 @@ config SPAPR_TCE_IOMMU config ARM_SMMU bool "ARM Ltd. System MMU (SMMU) Support" depends on (ARM64 || ARM) && MMU + select IOMMU_DMA_RESERVED select IOMMU_API select IOMMU_IO_PGTABLE_LPAE select ARM_DMA_USE_IOMMU if ARM @@ -301,6 +308,7 @@ config ARM_SMMU config ARM_SMMU_V3 bool "ARM Ltd. System MMU Version 3 (SMMUv3) Support" depends on ARM64 && PCI + select IOMMU_DMA_RESERVED select IOMMU_API select IOMMU_IO_PGTABLE_LPAE select GENERIC_MSI_IRQ_DOMAIN diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index 42fc0c2..ea68d23 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_IOMMU_API) += iommu.o obj-$(CONFIG_IOMMU_API) += iommu-traces.o obj-$(CONFIG_IOMMU_API) += iommu-sysfs.o obj-$(CONFIG_IOMMU_DMA) += dma-iommu.o +obj-$(CONFIG_IOMMU_DMA_RESERVED) += dma-reserved-iommu.o obj-$(CONFIG_IOMMU_IO_PGTABLE) += io-pgtable.o obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o obj-$(CONFIG_IOMMU_IOVA) += iova.o diff --git a/drivers/iommu/dma-reserved-iommu.c b/drivers/iommu/dma-reserved-iommu.c new file mode 100644 index 0000000..41a1add --- /dev/null +++ b/drivers/iommu/dma-reserved-iommu.c @@ -0,0 +1,74 @@ +/* + * Reserved IOVA Management + * + * Copyright (c) 2015 Linaro Ltd. + * www.linaro.org + * + * Copyright (C) 2000-2004 Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include + +int iommu_alloc_reserved_iova_domain(struct iommu_domain *domain, + dma_addr_t iova, size_t size, + unsigned long order) +{ + unsigned long granule, mask; + struct iova_domain *iovad; + int ret = 0; + + granule = 1UL << order; + mask = granule - 1; + if (iova & mask || (!size) || (size & mask)) + return -EINVAL; + + mutex_lock(&domain->reserved_mutex); + + if (domain->reserved_iova_cookie) { + ret = -EEXIST; + goto unlock; + } + + iovad = kzalloc(sizeof(struct iova_domain), GFP_KERNEL); + if (!iovad) { + ret = -ENOMEM; + goto unlock; + } + + init_iova_domain(iovad, granule, + iova >> order, (iova + size - 1) >> order); + domain->reserved_iova_cookie = iovad; + +unlock: + mutex_unlock(&domain->reserved_mutex); + return ret; +} +EXPORT_SYMBOL_GPL(iommu_alloc_reserved_iova_domain); + +void iommu_free_reserved_iova_domain(struct iommu_domain *domain) +{ + struct iova_domain *iovad = + (struct iova_domain *)domain->reserved_iova_cookie; + + if (!iovad) + return; + + mutex_lock(&domain->reserved_mutex); + + put_iova_domain(iovad); + kfree(iovad); + + mutex_unlock(&domain->reserved_mutex); +} +EXPORT_SYMBOL_GPL(iommu_free_reserved_iova_domain); diff --git a/include/linux/dma-reserved-iommu.h b/include/linux/dma-reserved-iommu.h new file mode 100644 index 0000000..5bf863b --- /dev/null +++ b/include/linux/dma-reserved-iommu.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 Linaro Ltd. + * www.linaro.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#ifndef __DMA_RESERVED_IOMMU_H +#define __DMA_RESERVED_IOMMU_H + +#ifdef __KERNEL__ +#include + +#ifdef CONFIG_IOMMU_DMA_RESERVED +#include + +/** + * iommu_alloc_reserved_iova_domain: allocate the reserved iova domain + * + * @domain: iommu domain handle + * @iova: base iova address + * @size: iova window size + * @order: page order + */ +int iommu_alloc_reserved_iova_domain(struct iommu_domain *domain, + dma_addr_t iova, size_t size, + unsigned long order); + +/** + * iommu_free_reserved_iova_domain: free the reserved iova domain + * + * @domain: iommu domain handle + */ +void iommu_free_reserved_iova_domain(struct iommu_domain *domain); + +#endif /* CONFIG_IOMMU_DMA_RESERVED */ +#endif /* __KERNEL__ */ +#endif /* __DMA_RESERVED_IOMMU_H */