From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754710AbbG2WbO (ORCPT ); Wed, 29 Jul 2015 18:31:14 -0400 Received: from terminus.zytor.com ([198.137.202.10]:37228 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752406AbbG2WbM (ORCPT ); Wed, 29 Jul 2015 18:31:12 -0400 Date: Wed, 29 Jul 2015 15:30:30 -0700 From: tip-bot for Marc Zyngier Message-ID: Cc: tglx@linutronix.de, lorenzo.pieralisi@arm.com, majun258@huawei.com, hpa@zytor.com, dhdang@apm.com, marc.zyngier@arm.com, wangyijing@huawei.com, bhelgaas@google.com, linux-kernel@vger.kernel.org, hanjun.guo@linaro.org, mingo@kernel.org, jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org, jiang.liu@linux.intel.com Reply-To: tglx@linutronix.de, majun258@huawei.com, hpa@zytor.com, lorenzo.pieralisi@arm.com, dhdang@apm.com, bhelgaas@google.com, marc.zyngier@arm.com, wangyijing@huawei.com, linux-kernel@vger.kernel.org, mingo@kernel.org, hanjun.guo@linaro.org, jason@lakedaemon.net, jiang.liu@linux.intel.com, linux-arm-kernel@lists.infradead.org In-Reply-To: <1438091186-10244-18-git-send-email-marc.zyngier@arm.com> References: <1438091186-10244-18-git-send-email-marc.zyngier@arm.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:irq/core] irqchip/GICv2m: Add platform MSI support Git-Commit-ID: ef50645aa32c6b55fe1445b5d06c73bfdf65019f X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: ef50645aa32c6b55fe1445b5d06c73bfdf65019f Gitweb: http://git.kernel.org/tip/ef50645aa32c6b55fe1445b5d06c73bfdf65019f Author: Marc Zyngier AuthorDate: Tue, 28 Jul 2015 14:46:24 +0100 Committer: Thomas Gleixner CommitDate: Thu, 30 Jul 2015 00:14:39 +0200 irqchip/GICv2m: Add platform MSI support In order to support non-PCI MSI with GICv2m, add the minimal required entry points for the MSI domain, which is actually almost nothing (we just use the defaults provided by the core code). Signed-off-by: Marc Zyngier Cc: Cc: Yijing Wang Cc: Ma Jun Cc: Lorenzo Pieralisi Cc: Duc Dang Cc: Hanjun Guo Cc: Bjorn Helgaas Cc: Jiang Liu Cc: Jason Cooper Link: http://lkml.kernel.org/r/1438091186-10244-18-git-send-email-marc.zyngier@arm.com Signed-off-by: Thomas Gleixner --- drivers/irqchip/irq-gic-v2m.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/drivers/irqchip/irq-gic-v2m.c b/drivers/irqchip/irq-gic-v2m.c index ec9c376..db04fc1 100644 --- a/drivers/irqchip/irq-gic-v2m.c +++ b/drivers/irqchip/irq-gic-v2m.c @@ -50,7 +50,6 @@ struct v2m_data { u32 spi_start; /* The SPI number that MSIs start */ u32 nr_spis; /* The number of SPIs for MSIs */ unsigned long *bm; /* MSI vector bitmap */ - struct irq_domain *domain; }; static void gicv2m_mask_msi_irq(struct irq_data *d) @@ -212,12 +211,25 @@ static bool is_msi_spi_valid(u32 base, u32 num) return true; } +static struct irq_chip gicv2m_pmsi_irq_chip = { + .name = "pMSI", +}; + +static struct msi_domain_ops gicv2m_pmsi_ops = { +}; + +static struct msi_domain_info gicv2m_pmsi_domain_info = { + .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS), + .ops = &gicv2m_pmsi_ops, + .chip = &gicv2m_pmsi_irq_chip, +}; + static int __init gicv2m_init_one(struct device_node *node, struct irq_domain *parent) { int ret; struct v2m_data *v2m; - struct irq_domain *inner_domain; + struct irq_domain *inner_domain, *pci_domain, *plat_domain; v2m = kzalloc(sizeof(struct v2m_data), GFP_KERNEL); if (!v2m) { @@ -270,10 +282,13 @@ static int __init gicv2m_init_one(struct device_node *node, inner_domain->bus_token = DOMAIN_BUS_NEXUS; inner_domain->parent = parent; - v2m->domain = pci_msi_create_irq_domain(node, &gicv2m_msi_domain_info, - inner_domain); - if (!v2m->domain) { - pr_err("Failed to create MSI domain\n"); + pci_domain = pci_msi_create_irq_domain(node, &gicv2m_msi_domain_info, + inner_domain); + plat_domain = platform_msi_create_irq_domain(node, + &gicv2m_pmsi_domain_info, + inner_domain); + if (!pci_domain || !plat_domain) { + pr_err("Failed to create MSI domains\n"); ret = -ENOMEM; goto err_free_domains; } @@ -287,8 +302,10 @@ static int __init gicv2m_init_one(struct device_node *node, return 0; err_free_domains: - if (v2m->domain) - irq_domain_remove(v2m->domain); + if (plat_domain) + irq_domain_remove(plat_domain); + if (pci_domain) + irq_domain_remove(pci_domain); if (inner_domain) irq_domain_remove(inner_domain); err_free_bm: