Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp361909pxf; Wed, 7 Apr 2021 01:04:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyYHIqIeWnE9nusV2bjy5PSfc2uPBq1Z1kZiEhihiRVxNlenj8XPGI9XuOb2GNSZhe8dW16 X-Received: by 2002:a17:906:552:: with SMTP id k18mr2222416eja.508.1617782684992; Wed, 07 Apr 2021 01:04:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617782684; cv=none; d=google.com; s=arc-20160816; b=wp7Ng84JxQ8F7Kke1V8+RSHaCvj+9/QKyMaNZUfLblV7ygRFzeJ/BstkmpzPE+8mkm jbGmAilfhBcO5lpBNApLY29QE0Dod2ZzKhd5uioitp6QCXoPV9WK7JWQa4WjFynuqE12 pNjy9cksJAo39wmgEgVtcgnIObqXLNAoHAaLTXXFNG/ahgP9HSCuSrIi5Rmr2XBPeg6S RhMtSkVwS4MkRnVCeR+XI3ZKcq1JzFScvmw1Q3m3XJDN9CoBRTKzbNxS1BBvc3FQjJXv zDhSzBlSztJxNlIZcVoMzLRrFXpKo3yRLGR5CNdAjDgR6gWxP1rVnqGFCdpcWNYIN1hQ SG+w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:in-reply-to :subject:cc:to:from:message-id:date; bh=bcyLW+bBvV2UEFyBU+niBr09nq31e+FRniuFKbUIy9w=; b=NLUFI2isuUqcvHnGQnvrm0Hl8AO3ZcSZ28VKFrV79m1iCTid60XQ+qAUbtpQTy2wtb tNgXmew3INJnZWrDZbIbuj9nqsNCdQgm90iFw2ICCOUcygkTW71+0qS9gG2KWjzLRTw7 IRuw/VXc+vws6AqA2dBjRn2mJZ99MY352vFkJOsqAS6zAFn1z0APtSSPjJGnWPJrMQHM tiGxRxdsysm0HLat9XdbsMULMEEXqhLEgQsuZPm5jYXbVTSGfL6wKsBNMoOjcHEpzYSF 9YdE3ImGKBIReXacna+i3eiREiGYMEk1JZkB7AQhonufqb8w9wWQXoDPEY0WoFdkqUi5 1Bgw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dm10si19577933ejc.418.2021.04.07.01.04.21; Wed, 07 Apr 2021 01:04:44 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237231AbhDFSQb (ORCPT + 99 others); Tue, 6 Apr 2021 14:16:31 -0400 Received: from mail.kernel.org ([198.145.29.99]:44054 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236444AbhDFSQa (ORCPT ); Tue, 6 Apr 2021 14:16:30 -0400 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 20996613B3; Tue, 6 Apr 2021 18:16:22 +0000 (UTC) Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1lTqFQ-005uvp-1y; Tue, 06 Apr 2021 19:16:20 +0100 Date: Tue, 06 Apr 2021 19:16:18 +0100 Message-ID: <87ft03p9cd.wl-maz@kernel.org> From: Marc Zyngier To: Hector Martin Cc: linux-arm-kernel@lists.infradead.org, Rob Herring , Arnd Bergmann , Olof Johansson , Krzysztof Kozlowski , Mark Kettenis , Tony Lindgren , Mohamed Mediouni , Stan Skowronek , Alexander Graf , Will Deacon , Linus Walleij , Mark Rutland , Andy Shevchenko , Jonathan Corbet , Catalin Marinas , Christoph Hellwig , "David S. Miller" , devicetree@vger.kernel.org, linux-doc@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 15/18] irqchip/apple-aic: Add support for the Apple Interrupt Controller In-Reply-To: <20210402090542.131194-16-marcan@marcan.st> References: <20210402090542.131194-1-marcan@marcan.st> <20210402090542.131194-16-marcan@marcan.st> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: marcan@marcan.st, linux-arm-kernel@lists.infradead.org, robh@kernel.org, arnd@kernel.org, olof@lixom.net, krzk@kernel.org, mark.kettenis@xs4all.nl, tony@atomide.com, mohamed.mediouni@caramail.com, stan@corellium.com, graf@amazon.com, will@kernel.org, linus.walleij@linaro.org, mark.rutland@arm.com, andy.shevchenko@gmail.com, corbet@lwn.net, catalin.marinas@arm.com, hch@infradead.org, davem@davemloft.net, devicetree@vger.kernel.org, linux-doc@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Hector, On Fri, 02 Apr 2021 10:05:39 +0100, Hector Martin wrote: > > This is the root interrupt controller used on Apple ARM SoCs such as the > M1. This irqchip driver performs multiple functions: > > * Handles both IRQs and FIQs > > * Drives the AIC peripheral itself (which handles IRQs) > > * Dispatches FIQs to downstream hard-wired clients (currently the ARM > timer). > > * Implements a virtual IPI multiplexer to funnel multiple Linux IPIs > into a single hardware IPI > > Signed-off-by: Hector Martin > --- > MAINTAINERS | 2 + > drivers/irqchip/Kconfig | 8 + > drivers/irqchip/Makefile | 1 + > drivers/irqchip/irq-apple-aic.c | 837 ++++++++++++++++++++++++++++++++ > include/linux/cpuhotplug.h | 1 + > 5 files changed, 849 insertions(+) > create mode 100644 drivers/irqchip/irq-apple-aic.c [...] > +static int aic_irq_domain_translate(struct irq_domain *id, > + struct irq_fwspec *fwspec, > + unsigned long *hwirq, > + unsigned int *type) > +{ > + struct aic_irq_chip *ic = id->host_data; > + > + if (fwspec->param_count != 3 || !is_of_node(fwspec->fwnode)) > + return -EINVAL; > + > + switch (fwspec->param[0]) { > + case AIC_IRQ: > + if (fwspec->param[1] >= ic->nr_hw) > + return -EINVAL; > + *hwirq = fwspec->param[1]; > + break; > + case AIC_FIQ: > + if (fwspec->param[1] >= AIC_NR_FIQ) > + return -EINVAL; > + *hwirq = ic->nr_hw + fwspec->param[1]; > + > + /* > + * In EL1 the non-redirected registers are the guest's, > + * not EL2's, so remap the hwirqs to match. > + */ > + if (!is_kernel_in_hyp_mode()) { > + switch (fwspec->param[1]) { > + case AIC_TMR_GUEST_PHYS: > + *hwirq = ic->nr_hw + AIC_TMR_HV_PHYS; > + break; > + case AIC_TMR_GUEST_VIRT: > + *hwirq = ic->nr_hw + AIC_TMR_HV_VIRT; > + break; > + case AIC_TMR_HV_PHYS: > + case AIC_TMR_HV_VIRT: > + return -ENOENT; > + default: > + break; > + } > + } Urgh, this is nasty. You are internally remapping the hwirq from one timer to another in order to avoid accessing the enable register which happens to be an EL2 only register? The way we normally deal with this kind of things is by providing a different set of irq_chip callbacks. In this particular case, this would leave mask/unmask as empty stubs. Or you could move the FIQ handling to use handle_simple_irq(), because there isn't any callback that is actually applicable. It isn't a big deal for now, but that's something we should consider addressing in the future. With that in mind: Reviewed-by: Marc Zyngier Thanks, M. -- Without deviation from the norm, progress is not possible.