From patchwork Tue Jul 19 13:02:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 9237269 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 93F5260574 for ; Tue, 19 Jul 2016 13:12:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8152A26A4D for ; Tue, 19 Jul 2016 13:12:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 744FE26D08; Tue, 19 Jul 2016 13:12:32 +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=unavailable 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 E804326A4D for ; Tue, 19 Jul 2016 13:12:31 +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 1bPUnZ-0008Vy-Qa; Tue, 19 Jul 2016 13:10:57 +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 1bPUgS-0000Dt-Sc for linux-arm-kernel@lists.infradead.org; Tue, 19 Jul 2016 13:03:44 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (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 DD3B5C05AA5D; Tue, 19 Jul 2016 13:03:17 +0000 (UTC) Received: from localhost.redhat.com (vpn1-4-201.ams2.redhat.com [10.36.4.201]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u6JD2omT022501; Tue, 19 Jul 2016 09:03:12 -0400 From: Eric Auger To: eric.auger@redhat.com, eric.auger.pro@gmail.com, marc.zyngier@arm.com, christoffer.dall@linaro.org, andre.przywara@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 v11 04/10] genirq/msi-doorbell: allow MSI doorbell (un)registration Date: Tue, 19 Jul 2016 13:02:41 +0000 Message-Id: <1468933367-23159-5-git-send-email-eric.auger@redhat.com> In-Reply-To: <1468933367-23159-1-git-send-email-eric.auger@redhat.com> References: <1468933367-23159-1-git-send-email-eric.auger@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 19 Jul 2016 13:03:18 +0000 (UTC) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160719_060337_428935_93D4C595 X-CRM114-Status: GOOD ( 19.93 ) 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, pbonzini@redhat.com, kvmarm@lists.cs.columbia.edu, 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. Signed-off-by: Eric Auger --- 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 | 52 +++++++++++++++++++++++++++++++++++++ kernel/irq/Kconfig | 4 +++ kernel/irq/Makefile | 1 + kernel/irq/msi-doorbell.c | 62 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 120 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..c455e33 --- /dev/null +++ b/include/linux/msi-doorbell.h @@ -0,0 +1,52 @@ +/* + * 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 + * returns the newly allocated doorbell info handle + */ +struct irq_chip_msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping); + +/** + * msi_doorbell_unregister: remove a doorbell from the list of registered + * doorbells and deallocates its + * @db: doorbell info to unregister + */ +void msi_doorbell_unregister_global(struct irq_chip_msi_doorbell_info *db); + +#else + +static inline struct irq_chip_msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping) +{ + return ERR_PTR(-ENOENT); +} + +static inline void +msi_doorbell_unregister_global(struct irq_chip_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..0ff541e --- /dev/null +++ b/kernel/irq/msi-doorbell.c @@ -0,0 +1,62 @@ +/* + * 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 irqchip_doorbell { + struct irq_chip_msi_doorbell_info info; + struct list_head next; +}; + +static LIST_HEAD(irqchip_doorbell_list); +static DEFINE_MUTEX(irqchip_doorbell_mutex); + +struct irq_chip_msi_doorbell_info * +msi_doorbell_register_global(phys_addr_t base, size_t size, + int prot, bool irq_remapping) +{ + struct irqchip_doorbell *db; + + db = kmalloc(sizeof(*db), GFP_KERNEL); + if (!db) + return ERR_PTR(-ENOMEM); + + db->info.doorbell_is_percpu = false; + db->info.global_doorbell = base; + db->info.size = size; + db->info.prot = prot; + db->info.irq_remapping = irq_remapping; + + mutex_lock(&irqchip_doorbell_mutex); + list_add(&db->next, &irqchip_doorbell_list); + mutex_unlock(&irqchip_doorbell_mutex); + return &db->info; +} +EXPORT_SYMBOL_GPL(msi_doorbell_register_global); + +void msi_doorbell_unregister_global(struct irq_chip_msi_doorbell_info *dbinfo) +{ + struct irqchip_doorbell *db, *tmp; + + mutex_lock(&irqchip_doorbell_mutex); + list_for_each_entry_safe(db, tmp, &irqchip_doorbell_list, next) { + if (dbinfo == &db->info) { + list_del(&db->next); + kfree(db); + break; + } + } + mutex_unlock(&irqchip_doorbell_mutex); +} +EXPORT_SYMBOL_GPL(msi_doorbell_unregister_global);