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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 9E663C433F5 for ; Wed, 11 May 2022 06:49:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=8GvL8fjFEa+9+H3QubROk7b9oQL1BFuaDRFIT2U4XNM=; b=xC8rRa+dKMPuXJ Ynrp9LYLnZGTDW/t8F5LFP/i2R7u+mHmJ0DSCTOMXxlnu9tXS7S5KJjRbNRr93WmzpV1Zj7uR1mYS mlz5muJTVyH9xffGlTMvkFLtBtrkCJGKAupPwtRaQTTADwRHtG5b844Txnrkd8JzIgzQ2O27rQdlT cH9f3FJ1FSd4gk8eiAOsCrLBhACL9SSR8KmkDCJ37et1nOJrBLbAAQTV8soJ7GXzZWOujjcoHhnc5 3MrQrvRbX5LGC2WWE8O1uAND3g6LoORU1H7ELE1UIkSKPp76iIXbyR+0B2OJeJzePwSKbgy0LlGKX /7+jalpuLafLIxOyLkow==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nog8c-005XYU-W7; Wed, 11 May 2022 06:47:59 +0000 Received: from mail-wm1-f49.google.com ([209.85.128.49]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nog8a-005XVG-4m for linux-arm-kernel@lists.infradead.org; Wed, 11 May 2022 06:47:57 +0000 Received: by mail-wm1-f49.google.com with SMTP id bd25-20020a05600c1f1900b0039485220e16so2233794wmb.0 for ; Tue, 10 May 2022 23:47:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=d0+VSEkVTN5UKp/1tlZfodLf5D5A+zx04J2EOUOCF00=; b=fvkJXsce8KZoM5xLDVk1gh1How6+6euYBlJA/T/t20iAObhY5RWo+nnT9WsFsGVrzg L3w1zPEtPc+KKMHgESQbcgJARl2x4CfS5HUIc6SWtYz89VO5KUrZC+KOlIIydY6ZEr+l FN2zY+z18Ukj2cbFjdcS4Z7acW/EeJwMw6Jzf8E0SvT6xY1afl5xvjck9DLykM+lDLBW AROlG9avBEh/Y3NI8zxWRjef/YDVD64r0JddNFs1TQxfl0D10re+T/9XW6/S4uaWeWAH uqNk49pTlE6UhKm0hWbfKKhgbzb7jcwyOGTnBCxZLPmCZ0CXfB5JYCcLdj3P4o/43xRe cqDQ== X-Gm-Message-State: AOAM531yLQ0StnHR1I87P1S088/bOmO9v0FgU/LTU8REyl3eP59ldOtp pCKkZf6hZSi2O+WGeTYK/OA= X-Google-Smtp-Source: ABdhPJzpnoc2OQxaCLNzOlLY2Q6PMGILiG41ZK3gGqRANQoSQNuIjjpR7zhzwOg/QpERIZ7XiCnJ5Q== X-Received: by 2002:a05:600c:6021:b0:394:56be:18e with SMTP id az33-20020a05600c602100b0039456be018emr3207844wmb.86.1652251672631; Tue, 10 May 2022 23:47:52 -0700 (PDT) Received: from ?IPV6:2a0b:e7c0:0:107::70f? ([2a0b:e7c0:0:107::70f]) by smtp.gmail.com with ESMTPSA id m36-20020a05600c3b2400b003942a244edbsm1446971wms.32.2022.05.10.23.47.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 10 May 2022 23:47:52 -0700 (PDT) Message-ID: <48cfa0b3-0424-81bd-ac6a-d631184b71b7@kernel.org> Date: Wed, 11 May 2022 08:47:50 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.8.1 Subject: Re: [PATCH v4 1/1] soc: fujitsu: Add A64FX diagnostic interrupt driver Content-Language: en-US To: Hitomi Hasegawa , linux-arm-kernel@lists.infradead.org, soc@kernel.org, linux-serial@vger.kernel.org, sumit.garg@linaro.org Cc: arnd@arndb.de, olof@lixom.net, catalin.marinas@arm.com, will@kernel.org, gregkh@linuxfoundation.org, jason.wessel@windriver.com, daniel.thompson@linaro.org, dianders@chromium.org, linux-kernel@vger.kernel.org, kgdb-bugreport@lists.sourceforge.net, peterz@infradead.org References: <20220511062113.2645747-1-hasegawa-hitomi@fujitsu.com> <20220511062113.2645747-2-hasegawa-hitomi@fujitsu.com> From: Jiri Slaby In-Reply-To: <20220511062113.2645747-2-hasegawa-hitomi@fujitsu.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220510_234756_231734_D3B99B49 X-CRM114-Status: GOOD ( 27.08 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On 11. 05. 22, 8:21, Hitomi Hasegawa wrote: > Enable diagnostic interrupts for the Fujitsu A64FX. > > Register the NMI/IRQ corresponding to the A64FX's device definition > dedicated to diagnostic interrupts, so that when this interrupt is > sent using the BMC, it causes a panic. This can be used to obtain > a kernel dump. > > Signed-off-by: Hitomi Hasegawa Hi, I'm not sure why you cc linux-serial, but anyway, comments below :). > --- /dev/null > +++ b/drivers/soc/fujitsu/a64fx-diag.c > @@ -0,0 +1,155 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * A64FX diag driver. > + * Copyright (c) 2022 Fujitsu Ltd. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +#define A64FX_DIAG_IRQ 1 > +#define BMC_DIAG_INTERRUPT_STATUS_OFFSET (0x0044) > +#define BMC_DIAG_INTERRUPT_ENABLE_OFFSET (0x0040) > +#define BMC_DIAG_INTERRUPT_MASK BIT(31) > + > +struct a64fx_diag_priv { > + int irq; > + void __iomem *mmsc_reg_base; > + bool has_nmi; There are unnecessary holes in the struct. If you reorder it, you drop some alignment. Like: pointer, int, bool. > +}; > + > +static irqreturn_t a64fx_diag_handler_nmi(int irq, void *dev_id) > +{ > + nmi_panic(NULL, "a64fx_diag: interrupt received\n"); > + > + return IRQ_HANDLED; > +} > + > +static irqreturn_t a64fx_diag_handler_irq(int irq, void *dev_id) > +{ > + panic("a64fx_diag: interrupt received\n"); > + > + return IRQ_HANDLED; > +} > + > +static void a64fx_diag_interrupt_clear(struct a64fx_diag_priv *priv) > +{ > + u32 mmsc; > + void __iomem *diag_status_reg_addr; I'm not sure what soc/ maintainers prefer, but inverted xmas tree would look/read better. > + > + diag_status_reg_addr = priv->mmsc_reg_base + BMC_DIAG_INTERRUPT_STATUS_OFFSET; > + mmsc = readl(diag_status_reg_addr); > + if (mmsc & BMC_DIAG_INTERRUPT_MASK) > + writel(BMC_DIAG_INTERRUPT_MASK, diag_status_reg_addr); > +} > + > +static void a64fx_diag_interrupt_enable(struct a64fx_diag_priv *priv) > +{ > + u32 mmsc; > + void __iomem *diag_enable_reg_addr; > + > + diag_enable_reg_addr = priv->mmsc_reg_base + BMC_DIAG_INTERRUPT_ENABLE_OFFSET; > + mmsc = readl(diag_enable_reg_addr); > + if (!(mmsc & BMC_DIAG_INTERRUPT_MASK)) { > + mmsc |= BMC_DIAG_INTERRUPT_MASK; > + writel(mmsc, diag_enable_reg_addr); > + } > +} > + > +static void a64fx_diag_interrupt_disable(struct a64fx_diag_priv *priv) > +{ > + u32 mmsc; > + void __iomem *diag_enable_reg_addr; > + > + diag_enable_reg_addr = priv->mmsc_reg_base + BMC_DIAG_INTERRUPT_ENABLE_OFFSET; > + mmsc = readl(diag_enable_reg_addr); > + if (mmsc & BMC_DIAG_INTERRUPT_MASK) { > + mmsc &= ~BMC_DIAG_INTERRUPT_MASK; > + writel(mmsc, diag_enable_reg_addr); > + } > +} > + > +static int a64fx_diag_probe(struct platform_device *pdev) > +{ > + int ret; > + unsigned long irq_flags; > + struct device *dev = &pdev->dev; > + struct a64fx_diag_priv *priv; > + > + priv = devm_kzalloc(dev, sizeof(struct a64fx_diag_priv), GFP_KERNEL); Don't we prefer sizeof(*priv)? > + if (priv == NULL) > + return -ENOMEM; > + > + priv->mmsc_reg_base = devm_platform_ioremap_resource(pdev, 0); > + if (IS_ERR(priv->mmsc_reg_base)) > + return PTR_ERR(priv->mmsc_reg_base); > + > + priv->irq = platform_get_irq(pdev, A64FX_DIAG_IRQ); > + if (priv->irq < 0) > + return priv->irq; > + > + platform_set_drvdata(pdev, priv); > + > + a64fx_diag_interrupt_clear(priv); > + a64fx_diag_interrupt_enable(priv); > + > + irq_flags = IRQF_PERCPU | IRQF_NOBALANCING | IRQF_NO_AUTOEN | > + IRQF_NO_THREAD; > + ret = request_nmi(priv->irq, &a64fx_diag_handler_nmi, irq_flags, > + "a64fx_diag_nmi", NULL); > + if (ret) { > + ret = request_irq(priv->irq, &a64fx_diag_handler_irq, > + irq_flags, "a64fx_diag_irq", NULL); > + if (ret) { > + dev_err(dev, "cannot register IRQ %d\n", ret); No a64fx_diag_interrupt_disable()? > + return ret; > + } > + enable_irq(priv->irq); Hmm... > + priv->has_nmi = false; No need to set zeroed priv member to zero. > + } else { > + enable_nmi(priv->irq); Provided the above, I don't immediatelly see, what's the purpose of IRQF_NO_AUTOEN then? > + priv->has_nmi = true; > + } > + > + return 0; > +} > + > +static int __exit a64fx_diag_remove(struct platform_device *pdev) Is __exit appropriate here at all -- I doubt that. > +{ > + struct a64fx_diag_priv *priv = platform_get_drvdata(pdev); > + > + a64fx_diag_interrupt_disable(priv); > + a64fx_diag_interrupt_clear(priv); > + > + if (priv->has_nmi) > + free_nmi(priv->irq, NULL); > + else > + free_irq(priv->irq, NULL); > + > + return 0; > +} > + > +static const struct acpi_device_id a64fx_diag_acpi_match[] = { > + { "FUJI2007", 0 }, > + { }, > +}; > +MODULE_DEVICE_TABLE(acpi, a64fx_diag_acpi_match); > + > + > +static struct platform_driver a64fx_diag_driver = { > + .driver = { > + .name = "a64fx_diag_driver", > + .acpi_match_table = ACPI_PTR(a64fx_diag_acpi_match), > + }, > + .probe = a64fx_diag_probe, > + .remove = a64fx_diag_remove, > +}; > + > +module_platform_driver(a64fx_diag_driver); > + > +MODULE_LICENSE("GPL v2"); > +MODULE_AUTHOR("Hitomi Hasegawa "); > +MODULE_DESCRIPTION("A64FX diag driver"); -- js suse labs _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel