mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Dave Martin <Dave.Martin@arm.com>
To: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, mark.rutland@arm.com,
	ckadabi@codeaurora.org, ard.biesheuvel@linaro.org,
	marc.zyngier@arm.com, catalin.marinas@arm.com,
	will.deacon@arm.com, linux-kernel@vger.kernel.org,
	jnair@caviumnetworks.com
Subject: Re: [PATCH 04/16] arm64: capabilities: Prepare for fine grained capabilities
Date: Thu, 25 Jan 2018 17:33:07 +0000	[thread overview]
Message-ID: <20180125173307.GJ5862@e103592.cambridge.arm.com> (raw)
In-Reply-To: <20180123122809.16269-5-suzuki.poulose@arm.com>

On Tue, Jan 23, 2018 at 12:27:57PM +0000, Suzuki K Poulose wrote:
> We use arm64_cpu_capabilities to represent CPU ELF HWCAPs exposed
> to the userspace and the CPU hwcaps used by the kernel, which
> include cpu features and CPU errata work arounds.
> 
> At the moment we have the following restricions:
> 
>  a) CPU feature hwcaps (arm64_features) and ELF HWCAPs (arm64_elf_hwcap)
>    - Detected mostly on system wide CPU feature register. But
>      there are some which really uses a local CPU's value to
>      decide the availability (e.g, availability of hardware
>      prefetch). So, we run the check only once, after all the
>      boot-time active CPUs are turned on.

[ARM64_HAS_NO_HW_PREFETCH is kinda broken, but we also get away with it
presumably because the only systems to which it applies are homogeneous,
and anyway it's only an optimisation IIUC.

This could be a separate category, but as a one-off that may be a bit
pointless.

.def_scope == SCOPE_SYSTEM appears anomalous there, but it's also
unused in that case.]

>    - Any late CPU which doesn't posses all the established features
>      is killed.

Does "established feature" above ...

>    - Any late CPU which possess a feature *not* already available
>      is allowed to boot.

mean the same as "feature already available" here?

> 
>  b) CPU Errata work arounds (arm64_errata)
>    - Detected mostly based on a local CPU's feature register.
>      The checks are run on each boot time activated CPUs.
>    - Any late CPU which doesn't have any of the established errata
>      work around capabilities is ignored and is allowed to boot.
>    - Any late CPU which has an errata work around not already available
>      is killed.
> 
> However there are some exceptions to the cases above.
> 
> 1) KPTI is a feature that we need to enable when at least one CPU needs it.
>    And any late CPU that has this "feature" should be killed.

Should that be "If KPTI is not enabled during system boot, then any late
CPU that has this "feature" should be killed."

> 2) Hardware DBM feature is a non-conflicting capability which could be
>    enabled on CPUs which has it without any issues, even if the CPU is

have

>    brought up late.
> 
> So this calls for a lot more fine grained behavior for each capability.
> And if we define all the attributes to control their behavior properly,
> we may be able to use a single table for the CPU hwcaps (not the
> ELF HWCAPs, which cover errata and features). This is a prepartory step
> to get there. We define type for a capability, which for now encodes the
> scope of the check. i.e, whether it should be checked system wide or on
> each local CPU. We define two types :
> 
>   1) ARM64_CPUCAP_BOOT_SYSTEM_FEATURE - Implies (a) as described above.
>   1) ARM64_CPUCAP_STRICT_CPU_LOCAL_ERRATUM - Implies (b) as described above.

2)

> As such there is no change in how the capabilities are treated.

OK, I think I finally have my head around this, more or less.

Mechanism (operations on architectural feature regs) and policy (kernel
runtime configuration) seem to be rather mixed together.  This works
fairly naturally for things like deriving the sanitised feature regs
seen by userspace and determining the ELF hwcaps; but not so naturally
for errata workarounds and other anomalous things like
ARM64_HAS_NO_HW_PREFETCH.

I'm not sure that there is a better approach though -- anyway, that
would be out of scope for this series.

> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
> ---
>  arch/arm64/include/asm/cpufeature.h | 24 +++++++++++++++++------
>  arch/arm64/kernel/cpu_errata.c      |  8 ++++----
>  arch/arm64/kernel/cpufeature.c      | 38 ++++++++++++++++++-------------------
>  3 files changed, 41 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
> index a23c0d4f27e9..4fd5de8ef33e 100644
> --- a/arch/arm64/include/asm/cpufeature.h
> +++ b/arch/arm64/include/asm/cpufeature.h
> @@ -86,16 +86,23 @@ struct arm64_ftr_reg {
>  
>  extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
>  
> -/* scope of capability check */
> -enum {
> -	SCOPE_SYSTEM,
> -	SCOPE_LOCAL_CPU,
> -};
> +
> +/* Decide how the capability is detected. On a local CPU vs System wide */
> +#define ARM64_CPUCAP_SCOPE_MASK			0x3
> +#define ARM64_CPUCAP_SCOPE_LOCAL_CPU		BIT(0)
> +#define ARM64_CPUCAP_SCOPE_SYSTEM		BIT(1)
> +#define SCOPE_SYSTEM				ARM64_CPUCAP_SCOPE_SYSTEM
> +#define SCOPE_LOCAL_CPU				ARM64_CPUCAP_SCOPE_LOCAL_CPU

Are these really orthogonal?  What would be meant by (LOCAL_CPU | SYSTEM)?

Otherwise, perhaps they should be 0 and 1, not BIT(0), BIT(1).

> +
> +/* CPU errata detected at boot time based on feature of one or more CPUs */
> +#define ARM64_CPUCAP_STRICT_CPU_LOCAL_ERRATUM	(ARM64_CPUCAP_SCOPE_LOCAL_CPU)

> +/* CPU feature detected at boot time based on system-wide value of a feature */

I'm still not overly keen on these names, but I do at least see where
they come from now.

Nit: redundant () in these two #defines btw.

[...]

Cheers
---Dave

  parent reply	other threads:[~2018-01-25 17:33 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-23 12:27 [PATCH 00/16] arm64: Rework cpu capabilities handling Suzuki K Poulose
2018-01-23 12:27 ` [PATCH 01/16] arm64: capabilities: Update prototype for enable call back Suzuki K Poulose
2018-01-23 14:52   ` Dave Martin
2018-01-23 15:38     ` Suzuki K Poulose
2018-01-25 15:36       ` Dave Martin
2018-01-25 16:57         ` Suzuki K Poulose
2018-01-29 16:35           ` Dave Martin
2018-01-23 12:27 ` [PATCH 02/16] arm64: Move errata work around check on boot CPU Suzuki K Poulose
2018-01-23 14:59   ` Dave Martin
2018-01-23 15:07     ` Suzuki K Poulose
2018-01-23 15:11       ` Dave Martin
2018-01-23 12:27 ` [PATCH 03/16] arm64: Move errata capability processing code Suzuki K Poulose
2018-01-23 12:27 ` [PATCH 04/16] arm64: capabilities: Prepare for fine grained capabilities Suzuki K Poulose
2018-01-23 17:33   ` Dave Martin
2018-01-24 18:45     ` Suzuki K Poulose
2018-01-25 13:43       ` Dave Martin
2018-01-25 17:08         ` Suzuki K Poulose
2018-01-25 17:38           ` Dave Martin
2018-01-25 17:33   ` Dave Martin [this message]
2018-01-25 17:56     ` Suzuki K Poulose
2018-01-26 10:00       ` Dave Martin
2018-01-26 12:13         ` Suzuki K Poulose
2018-01-23 12:27 ` [PATCH 05/16] arm64: Add flags to check the safety of a capability for late CPU Suzuki K Poulose
2018-01-26 10:10   ` Dave Martin
2018-01-30 11:17     ` Suzuki K Poulose
2018-01-30 14:56       ` Dave Martin
2018-01-30 15:06         ` Suzuki K Poulose
2018-01-23 12:27 ` [PATCH 06/16] arm64: capabilities: Unify the verification Suzuki K Poulose
2018-01-26 11:08   ` Dave Martin
2018-01-26 12:10     ` Suzuki K Poulose
2018-01-29 16:57       ` Dave Martin
2018-01-23 12:28 ` [PATCH 07/16] arm64: capabilities: Filter the entries based on a given type Suzuki K Poulose
2018-01-26 11:22   ` Dave Martin
2018-01-26 12:21     ` Suzuki K Poulose
2018-01-29 17:06       ` Dave Martin
2018-01-23 12:28 ` [PATCH 08/16] arm64: capabilities: Group handling of features and errata Suzuki K Poulose
2018-01-26 11:47   ` Dave Martin
2018-01-26 12:31     ` Suzuki K Poulose
2018-01-29 17:14       ` Dave Martin
2018-01-29 17:22         ` Suzuki K Poulose
2018-01-30 15:06           ` Dave Martin
2018-01-23 12:28 ` [PATCH 09/16] arm64: capabilities: Introduce strict features based on local CPU Suzuki K Poulose
2018-01-26 12:12   ` Dave Martin
2018-01-30 11:25     ` Suzuki K Poulose
2018-01-23 12:28 ` [PATCH 10/16] arm64: Make KPTI strict CPU local feature Suzuki K Poulose
2018-01-26 12:25   ` Dave Martin
2018-01-26 15:46     ` Suzuki K Poulose
2018-01-29 17:24       ` Dave Martin
2018-01-23 12:28 ` [PATCH 11/16] arm64: errata: Clean up midr range helpers Suzuki K Poulose
2018-01-26 13:50   ` Dave Martin
2018-01-23 12:28 ` [PATCH 12/16] arm64: Add helpers for checking CPU MIDR against a range Suzuki K Poulose
2018-01-26 14:08   ` Dave Martin
2018-01-23 12:28 ` [PATCH 13/16] arm64: Add support for checking errata based on a list of MIDRS Suzuki K Poulose
2018-01-26 14:16   ` Dave Martin
2018-01-26 15:57     ` Suzuki K Poulose
2018-01-30 15:16       ` Dave Martin
2018-01-30 15:38         ` Suzuki K Poulose
2018-01-30 15:58           ` Dave Martin
2018-01-23 12:28 ` [PATCH 14/16] arm64: Add MIDR encoding for Arm Cortex-A55 and Cortex-A35 Suzuki K Poulose
2018-01-23 12:28 ` [PATCH 15/16] arm64: Delay enabling hardware DBM feature Suzuki K Poulose
2018-01-26 14:41   ` Dave Martin
2018-01-26 16:05     ` Suzuki K Poulose
2018-01-30 15:22       ` Dave Martin
2018-01-23 12:28 ` [PATCH 16/16] arm64: Add work around for Arm Cortex-A55 Erratum 1024718 Suzuki K Poulose
2018-01-26 15:33   ` Dave Martin
2018-01-26 16:29     ` Suzuki K Poulose
2018-01-30 15:27       ` Dave Martin

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=20180125173307.GJ5862@e103592.cambridge.arm.com \
    --to=dave.martin@arm.com \
    --cc=ard.biesheuvel@linaro.org \
    --cc=catalin.marinas@arm.com \
    --cc=ckadabi@codeaurora.org \
    --cc=jnair@caviumnetworks.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=suzuki.poulose@arm.com \
    --cc=will.deacon@arm.com \
    /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

all inboxes | Powered by JetHome®