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=-4.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,UNWANTED_LANGUAGE_BODY,URIBL_BLOCKED autolearn=unavailable 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 63222C43381 for ; Mon, 1 Apr 2019 02:15:44 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 31B8120872 for ; Mon, 1 Apr 2019 02:15:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="QftT66b5" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 31B8120872 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Subject:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EccwqiTn0NRXeesRVh1qQEAvwF/VRhaTaCslwyz8fwo=; b=QftT66b5q7SXNj viaBjDOqIkxi3gSY4nUrrPu1Hb4qpBl2x0YkE3P9AgxuLjekiJloVuDrmNXVM8oYzv+O7wKPosxnN zg/UZmZkNLuHOzsypuJHkccPr5U5yyYGYg+R9MZzxr8E+3V3TE9nFtBoEsyGpqG/P4kwThmFGINM1 QwcHGQFO62GGkE08SPcm+C3m9x+t0O3rkwPQ4QfW0m1bUTWPVTgqunkW0uT/CXsBdm5pXfItyPxfT 38Om4Bu+ubIP0tCImCZwGCVWoZ6xQBd/1UdMEZ+ZSz9iovMyjqxYDqJThDGZcW0A9lRLtPXlZm28w 0ATH4PSSLBaat16zlCXQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hAmU5-0008Mx-3J; Mon, 01 Apr 2019 02:15:37 +0000 Received: from foss.arm.com ([217.140.101.70]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hAmU1-0008AM-Bx for linux-arm-kernel@lists.infradead.org; Mon, 01 Apr 2019 02:15:34 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id DB0DA374; Sun, 31 Mar 2019 19:15:30 -0700 (PDT) Received: from big-swifty.misterjones.org (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2658D3F690; Sun, 31 Mar 2019 19:15:22 -0700 (PDT) Date: Mon, 01 Apr 2019 03:15:19 +0100 Message-ID: <86pnq65v48.wl-marc.zyngier@arm.com> From: Marc Zyngier To: Hanna Hawa Subject: Re: [PATCH 7/7] irqchip/al-msi: Add ACPI support In-Reply-To: <1554035733-11827-3-git-send-email-hhhawa@amazon.com> References: <1554035733-11827-1-git-send-email-hhhawa@amazon.com> <1554035733-11827-3-git-send-email-hhhawa@amazon.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26 (aarch64-unknown-linux-gnu) MULE/6.0 (HANACHIRUSATO) Organization: ARM Ltd MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190331_191533_419867_C3B73E41 X-CRM114-Status: GOOD ( 24.20 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: catalin.marinas@arm.com, will.deacon@arm.com, jonnyc@amazon.com, ronenk@amazon.com, Lorenzo Pieralisi , vaerov@amazon.com, linux@armlinux.org.uk, talel@amazon.com, linux-acpi@vger.kernel.org, alisaidi@amazon.com, lenb@kernel.org, jason@lakedaemon.net, antoine.tenart@bootlin.com, zeev@amazon.com, tglx@linutronix.de, hanochu@amazon.com, linux-arm-kernel@lists.infradead.org, barakw@amazon.com, rjw@rjwysocki.net, linux-kernel@vger.kernel.org, tsahee@annapurnalabs.com, dwmw@amazon.co.uk Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Sun, 31 Mar 2019 13:35:33 +0100, Hanna Hawa wrote: > > This patch adds ACPI support for AL-MSIx driver. > > The AL-MSIx controller is not standard, is not included in the UEFI > specification, and will not be added. The driver ACPI binding is > performed when the following conditions are true: > - OEM ID is AMAZON > - MADT table type is 0x80 (part of the OEM reserved range). > > Signed-off-by: Hanna Hawa > Co-developed-by: Vladimir Aerov > Signed-off-by: Vladimir Aerov > --- > drivers/irqchip/irq-al-msi.c | 118 ++++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 111 insertions(+), 7 deletions(-) > > diff --git a/drivers/irqchip/irq-al-msi.c b/drivers/irqchip/irq-al-msi.c > index ec27455..cb80c1e 100644 > --- a/drivers/irqchip/irq-al-msi.c > +++ b/drivers/irqchip/irq-al-msi.c > @@ -9,6 +9,7 @@ > > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > > +#include > #include > #include > #include > @@ -126,14 +127,20 @@ static int al_msix_gic_domain_alloc(struct irq_domain *domain, > struct irq_data *d; > int ret; > > - if (!is_of_node(domain->parent->fwnode)) > + if (is_of_node(domain->parent->fwnode)) { > + fwspec.fwnode = domain->parent->fwnode; > + fwspec.param_count = 3; > + fwspec.param[0] = 0; > + fwspec.param[1] = spi; > + fwspec.param[2] = IRQ_TYPE_EDGE_RISING; > + } else if (is_fwnode_irqchip(domain->parent->fwnode)) { > + fwspec.fwnode = domain->parent->fwnode; > + fwspec.param_count = 2; > + fwspec.param[0] = spi + 32; > + fwspec.param[1] = IRQ_TYPE_EDGE_RISING; > + } else { > return -EINVAL; > - > - fwspec.fwnode = domain->parent->fwnode; > - fwspec.param_count = 3; > - fwspec.param[0] = 0; > - fwspec.param[1] = spi; > - fwspec.param[2] = IRQ_TYPE_EDGE_RISING; > + } > > ret = irq_domain_alloc_irqs_parent(domain, virq, 1, &fwspec); > if (ret) > @@ -304,3 +311,100 @@ static int al_msix_init(struct device_node *node, struct device_node *parent) > } > IRQCHIP_DECLARE(alpine_msix, "al,alpine-msix", al_msix_init); > IRQCHIP_DECLARE(al_msix, "amazon,al-msix", al_msix_init); > + > +#ifdef CONFIG_ACPI > +static struct al_msix_data *priv; > + > +#define ACPI_AMZN_MADT_OEM_TYPE 0x80 > +#define ACPI_AMZN_OEM_ID "AMAZON" > + > +struct acpi_madt_msix_oem_frame { > + struct acpi_subtable_header header; > + u64 base_address; > + u32 base_address_len; > + u16 spi_count; > + u16 spi_base; > +}; > + > +static struct fwnode_handle *al_msi_get_fwnode(struct device *dev) > +{ > + return priv->msi_domain_handle; > +} > + > +static int __init al_msix_acpi_probe(struct acpi_subtable_header *header, > + const unsigned long end) > +{ > + struct irq_domain *gic_domain; > + struct fwnode_handle *gic_domain_handle; > + struct acpi_madt_msix_oem_frame *m; > + int ret; > + > + m = container_of(header, struct acpi_madt_msix_oem_frame, header); > + if (BAD_MADT_ENTRY(m, end)) > + return -EINVAL; > + > + gic_domain_handle = acpi_get_gsi_domain_id(); > + if (!gic_domain_handle) { > + pr_err("Failed to find the GIC domain handle\n"); > + return -ENXIO; > + } > + > + gic_domain = irq_find_matching_fwnode(gic_domain_handle, > + DOMAIN_BUS_ANY); > + if (!gic_domain) { > + pr_err("Failed to find the GIC domain\n"); > + return -ENXIO; > + } Why do you do this in the iterator? It won't change over time, right? > + > + priv = kzalloc(sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + priv->spi_first = m->spi_base; > + priv->num_spis = m->spi_count; > + > + priv->msi_domain_handle = irq_domain_alloc_fwnode((void *) > + m->base_address); > + if (!priv->msi_domain_handle) { > + pr_err("Unable to allocate msi domain token\n"); > + ret = -EINVAL; > + goto err_acpi_priv; > + } > + > + ret = al_msix_init_common(priv, m->base_address); > + if (ret) > + goto err_acpi_priv; > + > + ret = al_msix_init_domains(priv, gic_domain); > + if (ret) > + goto err_acpi_map; > + > + pci_msi_register_fwnode_provider(&al_msi_get_fwnode); > + > + return 0; > + > +err_acpi_map: > + kfree(priv->msi_map); > +err_acpi_priv: > + kfree(priv); > + return ret; > +} > + > +static int __init al_msix_acpi_init(void) > +{ > + static struct acpi_table_madt *madt; > + acpi_status status; > + > + /* if ACPI MADT table is not Amazon defined return */ > + status = acpi_get_table(ACPI_SIG_MADT, 0, > + (struct acpi_table_header **)&madt); > + if (ACPI_FAILURE(status) || (madt && memcmp(madt->header.oem_id, > + ACPI_AMZN_OEM_ID, > + ACPI_OEM_ID_SIZE))) > + return -ENODEV; > + > + return acpi_table_parse_madt(ACPI_AMZN_MADT_OEM_TYPE, > + al_msix_acpi_probe, 0); > +} > +early_initcall(al_msix_acpi_init); These initcalls are not maintainable in the long run. Either this is part of the core ACPI discovery (IRQCHIP_ACPI_DECLARE), or it should use another probing method. If you need to express dependencies, make it an actual device driver (I suspect you're in complete control of the FW anyway), which would make a lot more sense. Thanks, M. -- Jazz is not dead, it just smell funny. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel