From: Marc Zyngier <maz@kernel.org>
To: Hector Martin <marcan@marcan.st>
Cc: Arnd Bergmann <arnd@kernel.org>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
soc@kernel.org, robh+dt@kernel.org,
Olof Johansson <olof@lixom.net>,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 08/18] arm64: cpufeature: Add a feature for FIQ support
Date: Sat, 06 Feb 2021 13:58:42 +0000 [thread overview]
Message-ID: <87im75l2lp.wl-maz@kernel.org> (raw)
In-Reply-To: <20210204203951.52105-9-marcan@marcan.st>
Hi Hector,
On Thu, 04 Feb 2021 20:39:41 +0000,
Hector Martin <marcan@marcan.st> wrote:
>
> Apple ARM SoCs (A11 and newer) have some interrupt sources hard-wired to
> the FIQ line. Introduce a cpufeature that can be used to enable FIQ
> unmasking and handling via alternatives.
>
> This is currently enabled for all Apple CPUs. If/when support is
> implemented for older (pre-A11) iPhone/iPad SoCs which do not need FIQs,
> or if newer SoCs are released without the FIQ requirement, we can
> revisit the condition.
>
> Signed-off-by: Hector Martin <marcan@marcan.st>
> ---
> arch/arm64/Kconfig | 10 +++++++++
> arch/arm64/include/asm/cpucaps.h | 3 ++-
> arch/arm64/include/asm/cpufeature.h | 6 ++++++
> arch/arm64/include/asm/cputype.h | 1 +
> arch/arm64/kernel/cpufeature.c | 32 +++++++++++++++++++++++++++++
> 5 files changed, 51 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
> index f39568b28ec1..11cfdc07404f 100644
> --- a/arch/arm64/Kconfig
> +++ b/arch/arm64/Kconfig
> @@ -1756,6 +1756,16 @@ config ARM64_DEBUG_PRIORITY_MASKING
> If unsure, say N
> endif
>
> +config ARM64_FIQ_SUPPORT
> + bool "Support for FIQ interrupts"
> + help
> + Adds support for handling FIQ interrupts as normal IRQs.
> + This is required on Apple platforms where some IRQ sources are
> + hardwired to the FIQ interrupt line.
> +
> + FIQs are only enabled at runtime on platforms that require them
> + via the CPU feature framework.
> +
This definitely should be selected by CONFIG_ARCH_APPLE. Otherwise,
you can easily end-up with a non-working system.
> config RELOCATABLE
> bool "Build a relocatable kernel image" if EXPERT
> select ARCH_HAS_RELR
> diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h
> index b77d997b173b..c36d926ad801 100644
> --- a/arch/arm64/include/asm/cpucaps.h
> +++ b/arch/arm64/include/asm/cpucaps.h
> @@ -66,7 +66,8 @@
> #define ARM64_WORKAROUND_1508412 58
> #define ARM64_HAS_LDAPR 59
> #define ARM64_KVM_PROTECTED_MODE 60
> +#define ARM64_NEEDS_FIQ 61
>
> -#define ARM64_NCAPS 61
> +#define ARM64_NCAPS 62
>
> #endif /* __ASM_CPUCAPS_H */
> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
> index 9a555809b89c..3a00cfb347c9 100644
> --- a/arch/arm64/include/asm/cpufeature.h
> +++ b/arch/arm64/include/asm/cpufeature.h
> @@ -716,6 +716,12 @@ static __always_inline bool system_uses_irq_prio_masking(void)
> cpus_have_const_cap(ARM64_HAS_IRQ_PRIO_MASKING);
> }
>
> +static __always_inline bool system_uses_fiqs(void)
nit: fiq, not fiqs.
> +{
> + return IS_ENABLED(CONFIG_ARM64_FIQ_SUPPORT) &&
> + cpus_have_const_cap(ARM64_NEEDS_FIQ);
> +}
> +
> static inline bool system_supports_mte(void)
> {
> return IS_ENABLED(CONFIG_ARM64_MTE) &&
> diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
> index ef5b040dee44..2084a0340d16 100644
> --- a/arch/arm64/include/asm/cputype.h
> +++ b/arch/arm64/include/asm/cputype.h
> @@ -59,6 +59,7 @@
> #define ARM_CPU_IMP_NVIDIA 0x4E
> #define ARM_CPU_IMP_FUJITSU 0x46
> #define ARM_CPU_IMP_HISI 0x48
> +#define ARM_CPU_IMP_APPLE 0x61
>
> #define ARM_CPU_PART_AEM_V8 0xD0F
> #define ARM_CPU_PART_FOUNDATION 0xD00
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index e99eddec0a46..0863cf7cf807 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -1237,6 +1237,29 @@ static bool has_cache_idc(const struct arm64_cpu_capabilities *entry,
> return ctr & BIT(CTR_IDC_SHIFT);
> }
>
> +static void cpu_sync_irq_to_fiq(struct arm64_cpu_capabilities const *cap)
> +{
> + u64 daif = read_sysreg(daif);
> +
> + /*
> + * By this point in the boot process IRQs are likely masked and FIOs
> + * aren't, so we need to sync things to avoid spurious early FIQs.
> + */
> +
> + if (daif & PSR_I_BIT)
> + daif |= PSR_F_BIT;
> + else
> + daif &= ~PSR_F_BIT;
> +
> + write_sysreg(daif, daif);
Could this happen too late? If, as explained above, we can get a FIQ
until we mask it here, what prevents something (a timer?) from kicking
and creating havoc just before the sync?
If the answer is "nothing", then it probably means that the default
behaviour should be to treat PSTATE.I and PSTATE.F as containing the
same value at all times, and not just as an afterthought when we
detect that we're on a CPU type or another.
This could expand into enabling Group-0 interrupts with GICv3 on
systems that have a single security state (such as virtual machines),
though I don't really see a good use case for it.
> +}
> +
> +static bool needs_fiq(const struct arm64_cpu_capabilities *entry, int __unused)
> +{
> + /* All supported Apple cores need this */
> + return read_cpuid_implementor() == ARM_CPU_IMP_APPLE;
> +}
> +
> static void cpu_emulate_effective_ctr(const struct arm64_cpu_capabilities *__unused)
> {
> /*
> @@ -2154,6 +2177,15 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
> .matches = has_cpuid_feature,
> .min_field_value = 1,
> },
> +#ifdef CONFIG_ARM64_FIQ_SUPPORT
> + {
> + .desc = "FIQs",
> + .capability = ARM64_NEEDS_FIQ,
> + .type = ARM64_CPUCAP_BOOT_CPU_FEATURE,
> + .matches = needs_fiq,
> + .cpu_enable = cpu_sync_irq_to_fiq,
> + },
> +#endif
> {},
> };
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-02-06 14:00 UTC|newest]
Thread overview: 118+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-04 20:39 [PATCH 00/18] Apple M1 SoC platform bring-up Hector Martin
2021-02-04 20:39 ` [PATCH 01/18] dt-bindings: vendor-prefixes: add AAPL prefix Hector Martin
2021-02-08 10:27 ` Krzysztof Kozlowski
2021-02-08 17:32 ` Rob Herring
2021-02-08 18:12 ` Krzysztof Kozlowski
2021-02-08 19:59 ` Arnd Bergmann
2021-02-08 23:17 ` Hector Martin
2021-02-04 20:39 ` [PATCH 02/18] dt-bindings: arm: cpus: Add AAPL, firestorm & icestorm compatibles Hector Martin
2021-02-04 20:39 ` [PATCH 03/18] dt-bindings: arm: AAPL: Add bindings for Apple ARM platforms Hector Martin
2021-02-04 20:39 ` [PATCH 04/18] arm64: Kconfig: Introduce CONFIG_ARCH_APPLE Hector Martin
2021-02-06 13:17 ` Marc Zyngier
2021-02-07 8:05 ` Hector Martin 'marcan'
2021-02-04 20:39 ` [PATCH 05/18] tty: serial: samsung_tty: add support for Apple UARTs Hector Martin
2021-02-04 23:55 ` kernel test robot
2021-02-05 9:44 ` Hector Martin 'marcan'
2021-02-05 2:19 ` kernel test robot
2021-02-06 13:15 ` Marc Zyngier
2021-02-07 9:12 ` Hector Martin 'marcan'
2021-02-07 9:26 ` Hector Martin 'marcan'
2021-02-08 9:36 ` Krzysztof Kozlowski
2021-02-08 16:14 ` Hector Martin
2021-02-08 10:34 ` Marc Zyngier
2021-02-08 16:18 ` Hector Martin
2021-02-08 16:46 ` Greg Kroah-Hartman
2021-02-08 23:22 ` Hector Martin
2021-02-08 10:54 ` Krzysztof Kozlowski
2021-02-08 16:10 ` Hector Martin
2021-02-08 18:37 ` Krzysztof Kozlowski
2021-02-08 23:23 ` Hector Martin
2021-02-04 20:39 ` [PATCH 06/18] dt-bindings: serial: samsung: Add AAPL, s5l-uart compatible Hector Martin
2021-02-04 20:39 ` [PATCH 07/18] tty: serial: samsung_tty: enable for ARCH_APPLE Hector Martin
2021-02-04 21:16 ` Arnd Bergmann
2021-02-04 21:27 ` Hector Martin 'marcan'
2021-02-04 20:39 ` [PATCH 08/18] arm64: cpufeature: Add a feature for FIQ support Hector Martin
2021-02-06 13:58 ` Marc Zyngier [this message]
2021-02-07 8:28 ` Hector Martin 'marcan'
2021-02-08 11:29 ` Marc Zyngier
2021-02-08 15:51 ` Hector Martin
2021-02-04 20:39 ` [PATCH 09/18] arm64: cputype: Add CPU types for the Apple M1 big/little cores Hector Martin
2021-02-04 20:39 ` [PATCH 10/18] arm64: Introduce FIQ support Hector Martin
2021-02-06 15:37 ` Marc Zyngier
2021-02-06 16:22 ` Arnd Bergmann
2021-02-07 8:36 ` Hector Martin 'marcan'
2021-02-07 12:25 ` Arnd Bergmann
2021-02-07 15:38 ` Hector Martin 'marcan'
2021-02-07 18:49 ` Arnd Bergmann
2021-02-08 23:34 ` Hector Martin
2021-02-07 8:47 ` Hector Martin 'marcan'
2021-02-08 11:30 ` Marc Zyngier
2021-02-04 20:39 ` [PATCH 11/18] arm64: Kconfig: Require FIQ support for ARCH_APPLE Hector Martin
2021-02-06 15:46 ` Marc Zyngier
2021-02-07 9:23 ` Hector Martin 'marcan'
2021-02-08 12:05 ` Marc Zyngier
2021-02-08 15:48 ` Hector Martin
2021-02-04 20:39 ` [PATCH 12/18] arm64: setup: Use nGnRnE IO mappings for fixmap on Apple platforms Hector Martin
2021-02-04 22:25 ` Arnd Bergmann
2021-02-04 20:39 ` [PATCH 13/18] arm64: ioremap: use nGnRnE mappings on platforms that require it Hector Martin
2021-02-04 22:21 ` Arnd Bergmann
2021-02-08 22:57 ` Arnd Bergmann
2021-02-08 23:20 ` Mark Kettenis
2021-02-09 0:25 ` Hector Martin
2021-02-09 9:15 ` Arnd Bergmann
2021-02-09 9:58 ` Mark Kettenis
2021-02-09 11:22 ` Hector Martin
2021-02-09 9:35 ` Arnd Bergmann
2021-02-10 12:24 ` Hector Martin
2021-02-10 13:40 ` Mark Kettenis
2021-02-04 20:39 ` [PATCH 14/18] dt-bindings: interrupt-controller: Add DT bindings for apple-aic Hector Martin
2021-02-09 23:07 ` Rob Herring
2021-02-04 20:39 ` [PATCH 15/18] irqchip/apple-aic: Add support for the Apple Interrupt Controller Hector Martin
2021-02-04 21:37 ` Arnd Bergmann
2021-02-04 22:04 ` Hector Martin 'marcan'
2021-02-04 23:04 ` Arnd Bergmann
2021-02-05 7:41 ` Hector Martin 'marcan'
2021-02-05 10:33 ` Arnd Bergmann
2021-02-05 2:27 ` kernel test robot
2021-02-05 9:45 ` Hector Martin 'marcan'
2021-02-08 9:25 ` Marc Zyngier
2021-02-08 10:29 ` Arnd Bergmann
2021-02-08 11:13 ` Hector Martin 'marcan'
2021-02-08 11:21 ` Arnd Bergmann
2021-02-08 11:36 ` Marc Zyngier
2021-02-08 12:17 ` Arnd Bergmann
2021-02-08 15:31 ` Hector Martin
2021-02-09 6:20 ` Hector Martin
2021-02-04 20:39 ` [PATCH 16/18] irqchip/apple-aic: Add SMP / IPI support Hector Martin
2021-02-04 20:39 ` [PATCH 17/18] dt-bindings: display: add AAPL,simple-framebuffer Hector Martin
2021-02-04 20:39 ` [PATCH 18/18] arm64: apple: Add initial Mac Mini 2020 (M1) devicetree Hector Martin
2021-02-04 21:29 ` Arnd Bergmann
2021-02-04 21:44 ` Hector Martin 'marcan'
2021-02-04 23:08 ` Arnd Bergmann
2021-02-05 7:11 ` Hector Martin 'marcan'
2021-02-05 12:43 ` Arnd Bergmann
2021-02-08 11:04 ` Krzysztof Kozlowski
2021-02-08 11:56 ` Hector Martin 'marcan'
2021-02-08 12:13 ` Krzysztof Kozlowski
2021-02-08 12:40 ` Arnd Bergmann
2021-02-08 14:12 ` Hector Martin
2021-02-08 17:58 ` Rob Herring
2021-02-09 0:32 ` Hector Martin
2021-02-08 19:14 ` Rob Herring
2021-02-09 0:49 ` Hector Martin
2021-02-09 2:05 ` Rob Herring
2021-02-10 10:19 ` Tony Lindgren
2021-02-10 11:07 ` Hector Martin
2021-02-10 11:34 ` Tony Lindgren
2021-02-10 11:43 ` Hector Martin
2021-02-10 12:24 ` Daniel Palmer
2021-02-10 12:54 ` Tony Lindgren
2021-02-10 12:56 ` Hector Martin
2021-02-10 12:55 ` Krzysztof Kozlowski
2021-02-10 13:19 ` Tony Lindgren
2021-02-10 13:25 ` Krzysztof Kozlowski
2021-02-08 12:27 ` Marc Zyngier
2021-02-08 14:53 ` Hector Martin
2021-02-08 15:36 ` Marc Zyngier
2021-02-04 22:43 ` [PATCH 00/18] Apple M1 SoC platform bring-up Arnd Bergmann
2021-02-05 11:35 ` Hector Martin 'marcan'
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87im75l2lp.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=arnd@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marcan@marcan.st \
--cc=olof@lixom.net \
--cc=robh+dt@kernel.org \
--cc=soc@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).