From patchwork Tue Aug 2 17:23:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 9259383 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 839DF6077C for ; Tue, 2 Aug 2016 17:27:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7130328407 for ; Tue, 2 Aug 2016 17:27:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 65164284DE; Tue, 2 Aug 2016 17:27:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 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.wl.linuxfoundation.org (Postfix) with ESMTPS id 9A3E928407 for ; Tue, 2 Aug 2016 17:27:13 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUdRZ-00082C-93; Tue, 02 Aug 2016 17:25:29 +0000 Received: from mx1.redhat.com ([209.132.183.28]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUdQa-0006JF-UX for linux-arm-kernel@lists.infradead.org; Tue, 02 Aug 2016 17:24:35 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5608A4E023; Tue, 2 Aug 2016 17:24:08 +0000 (UTC) Received: from localhost.redhat.com (vpn1-7-179.ams2.redhat.com [10.36.7.179]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HNgIP017433; Tue, 2 Aug 2016 13:24:03 -0400 From: Eric Auger To: eric.auger@redhat.com, eric.auger.pro@gmail.com, christoffer.dall@linaro.org, marc.zyngier@arm.com, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org Subject: [PATCH v12 04/11] genirq/msi: Allow MSI doorbell (un)registration Date: Tue, 2 Aug 2016 17:23:30 +0000 Message-Id: <1470158617-7022-5-git-send-email-eric.auger@redhat.com> In-Reply-To: <1470158617-7022-1-git-send-email-eric.auger@redhat.com> References: <1470158617-7022-1-git-send-email-eric.auger@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 02 Aug 2016 17:24:08 +0000 (UTC) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160802_102429_155982_9B8D15FA X-CRM114-Status: GOOD ( 19.24 ) 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: drjones@redhat.com, kvm@vger.kernel.org, Jean-Philippe.Brucker@arm.com, 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, dennis.chen@arm.com, robert.richter@caviumnetworks.com, yehuday@marvell.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-Virus-Scanned: ClamAV using ClamSMTP This new API aims at allowing irqchips to allocate & register the MSI doorbells likely to be iommu mapped. Later on, other services will be added allowing the VFIO layer to query information based on all registered doorbells. We count the number of doorbells that do not implement IRQ remapping. They will be considered as unsafe with respect to MSI assignment. Signed-off-by: Eric Auger --- v11 -> v12: - rename irqchip_doorbell into msi_doorbell, irqchip_doorbell_list into msi_doorbell_list and irqchip_doorbell_mutex into msi_doorbell_mutex - fix style issues: align msi_doorbell struct members, kernel-doc comments - use kzalloc - use container_of in msi_doorbell_unregister_global - compute nb_unsafe_doorbells on registration/unregistration - registration simply returns NULL if allocation failed v10 -> v11: - remove void *chip_data argument from register/unregister function - remove lookup funtions since we restored the struct irq_chip msi_doorbell_info ops to realize this function - reword commit message and title --- drivers/iommu/Kconfig | 1 + include/linux/msi-doorbell.h | 55 +++++++++++++++++++++++++++++++++++ kernel/irq/Kconfig | 4 +++ kernel/irq/Makefile | 1 + kernel/irq/msi-doorbell.c | 68 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+) create mode 100644 include/linux/msi-doorbell.h create mode 100644 kernel/irq/msi-doorbell.c diff --git a/drivers/iommu/Kconfig b/drivers/iommu/Kconfig index 5ea1610..ba54146 100644 --- a/drivers/iommu/Kconfig +++ b/drivers/iommu/Kconfig @@ -78,6 +78,7 @@ config IOMMU_DMA config IOMMU_MSI bool select IOMMU_DMA + select MSI_DOORBELL config FSL_PAMU bool "Freescale IOMMU support" diff --git a/include/linux/msi-doorbell.h b/include/linux/msi-doorbell.h new file mode 100644 index 0000000..a2a033b --- /dev/null +++ b/include/linux/msi-doorbell.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2016 Eric Auger + * + * Eric Auger + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#ifndef _LINUX_MSI_DOORBELL_H +#define _LINUX_MSI_DOORBELL_H + +#include + +#ifdef CONFIG_MSI_DOORBELL + +/** + * msi_doorbell_register_global - allocate and register a global doorbell + * @base: physical base address of the global doorbell + * @size: size of the global doorbell + * @prot: protection/memory attributes + * @irq_remapping: is irq_remapping implemented for this doorbell + * + * Return: the newly allocated doorbell info handle or NULL if allocation + * failed + */ +struct msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping); + +/** + * msi_doorbell_unregister_global - unregister a global doorbell + * @db: doorbell info to unregister + * + * remove the doorbell descriptor from the list of registered doorbells + * and deallocates it + */ +void msi_doorbell_unregister_global(struct msi_doorbell_info *db); + +#else + +static inline struct msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping) +{ + return NULL; +} + +static inline void +msi_doorbell_unregister_global(struct msi_doorbell_info *db) {} + +#endif /* CONFIG_MSI_DOORBELL */ + +#endif diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig index 3bbfd6a..d4faaaa 100644 --- a/kernel/irq/Kconfig +++ b/kernel/irq/Kconfig @@ -72,6 +72,10 @@ config GENERIC_IRQ_IPI config GENERIC_MSI_IRQ bool +# MSI doorbell support (for doorbell IOMMU mapping) +config MSI_DOORBELL + bool + # Generic MSI hierarchical interrupt domain support config GENERIC_MSI_IRQ_DOMAIN bool diff --git a/kernel/irq/Makefile b/kernel/irq/Makefile index 2ee42e9..be02dfd 100644 --- a/kernel/irq/Makefile +++ b/kernel/irq/Makefile @@ -9,3 +9,4 @@ obj-$(CONFIG_GENERIC_IRQ_MIGRATION) += cpuhotplug.o obj-$(CONFIG_PM_SLEEP) += pm.o obj-$(CONFIG_GENERIC_MSI_IRQ) += msi.o obj-$(CONFIG_GENERIC_IRQ_IPI) += ipi.o +obj-$(CONFIG_MSI_DOORBELL) += msi-doorbell.o diff --git a/kernel/irq/msi-doorbell.c b/kernel/irq/msi-doorbell.c new file mode 100644 index 0000000..e3e0d95 --- /dev/null +++ b/kernel/irq/msi-doorbell.c @@ -0,0 +1,68 @@ +/* + * linux/kernel/irq/msi-doorbell.c + * + * Copyright (C) 2016 Linaro + * Author: Eric Auger + * + * This file is licensed under GPLv2. + * + * This file contains common code to manage MSI doorbells likely + * to be iommu mapped. Typically meaningful on ARM. + */ + +#include +#include +#include + +struct msi_doorbell { + struct msi_doorbell_info info; + struct list_head next; +}; + +/* list of registered MSI doorbells */ +static LIST_HEAD(msi_doorbell_list); + +/* counts the number of unsafe registered doorbells */ +static uint nb_unsafe_doorbells; + +/* protects the list and nb__unsafe_doorbells */ +static DEFINE_MUTEX(msi_doorbell_mutex); + +struct msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping) +{ + struct msi_doorbell *db; + + db = kzalloc(sizeof(*db), GFP_KERNEL); + if (!db) + return NULL; + + db->info.global_doorbell = base; + db->info.size = size; + db->info.prot = prot; + db->info.irq_remapping = irq_remapping; + + mutex_lock(&msi_doorbell_mutex); + list_add(&db->next, &msi_doorbell_list); + if (!db->info.irq_remapping) + nb_unsafe_doorbells++; + mutex_unlock(&msi_doorbell_mutex); + return &db->info; +} +EXPORT_SYMBOL_GPL(msi_doorbell_register_global); + +void msi_doorbell_unregister_global(struct msi_doorbell_info *dbinfo) +{ + struct msi_doorbell *db; + + db = container_of(dbinfo, struct msi_doorbell, info); + + mutex_lock(&msi_doorbell_mutex); + list_del(&db->next); + if (!db->info.irq_remapping) + nb_unsafe_doorbells--; + mutex_unlock(&msi_doorbell_mutex); + kfree(db); +} +EXPORT_SYMBOL_GPL(msi_doorbell_unregister_global);