lkml.org 
[lkml]   [2018]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 17/22] arm64: Add helpers for checking CPU MIDR against a range
    Date
    Add helpers for checking if the given CPU midr falls in a range
    of variants/revisions for a given model.

    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
    Reviewed-by: Dave Martin <dave.martin@arm.com>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    ---
    arch/arm64/include/asm/cpufeature.h | 4 ++--
    arch/arm64/include/asm/cputype.h | 30 ++++++++++++++++++++++++++++++
    arch/arm64/kernel/cpu_errata.c | 16 +++++-----------
    3 files changed, 37 insertions(+), 13 deletions(-)

    diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
    index 6a1280493f57..cd245871b578 100644
    --- a/arch/arm64/include/asm/cpufeature.h
    +++ b/arch/arm64/include/asm/cpufeature.h
    @@ -10,6 +10,7 @@
    #define __ASM_CPUFEATURE_H

    #include <asm/cpucaps.h>
    +#include <asm/cputype.h>
    #include <asm/fpsimd.h>
    #include <asm/hwcap.h>
    #include <asm/sigcontext.h>
    @@ -306,8 +307,7 @@ struct arm64_cpu_capabilities {
    void (*cpu_enable)(const struct arm64_cpu_capabilities *cap);
    union {
    struct { /* To be used for erratum handling only */
    - u32 midr_model;
    - u32 midr_range_min, midr_range_max;
    + struct midr_range midr_range;
    const struct arm64_midr_revidr {
    u32 midr_rv; /* revision/variant */
    u32 revidr_mask;
    diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h
    index 350c76a1d15b..bf6cfdab743f 100644
    --- a/arch/arm64/include/asm/cputype.h
    +++ b/arch/arm64/include/asm/cputype.h
    @@ -117,6 +117,36 @@

    #define read_cpuid(reg) read_sysreg_s(SYS_ ## reg)

    +/*
    + * Represent a range of MIDR values for a given CPU model and a
    + * range of variant/revision values.
    + *
    + * @model - CPU model as defined by MIDR_CPU_MODEL
    + * @rv_min - Minimum value for the revision/variant as defined by
    + * MIDR_CPU_VAR_REV
    + * @rv_max - Maximum value for the variant/revision for the range.
    + */
    +struct midr_range {
    + u32 model;
    + u32 rv_min;
    + u32 rv_max;
    +};
    +
    +#define MIDR_RANGE(m, v_min, r_min, v_max, r_max) \
    + { \
    + .model = m, \
    + .rv_min = MIDR_CPU_VAR_REV(v_min, r_min), \
    + .rv_max = MIDR_CPU_VAR_REV(v_max, r_max), \
    + }
    +
    +#define MIDR_ALL_VERSIONS(m) MIDR_RANGE(m, 0, 0, 0xf, 0xf)
    +
    +static inline bool is_midr_in_range(u32 midr, struct midr_range const *range)
    +{
    + return MIDR_IS_CPU_MODEL_RANGE(midr, range->model,
    + range->rv_min, range->rv_max);
    +}
    +
    /*
    * The CPU ID never changes at run time, so we might as well tell the
    * compiler that it's constant. Use this function to read the CPU ID
    diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
    index 9ea14954972c..3c0bb6c4ed02 100644
    --- a/arch/arm64/kernel/cpu_errata.c
    +++ b/arch/arm64/kernel/cpu_errata.c
    @@ -28,9 +28,7 @@ is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
    u32 midr = read_cpuid_id(), revidr;

    WARN_ON(scope != SCOPE_LOCAL_CPU || preemptible());
    - if (!MIDR_IS_CPU_MODEL_RANGE(midr, entry->midr_model,
    - entry->midr_range_min,
    - entry->midr_range_max))
    + if (!is_midr_in_range(midr, &entry->midr_range))
    return false;

    midr &= MIDR_REVISION_MASK | MIDR_VARIANT_MASK;
    @@ -53,7 +51,7 @@ is_kryo_midr(const struct arm64_cpu_capabilities *entry, int scope)
    model &= MIDR_IMPLEMENTOR_MASK | (0xf00 << MIDR_PARTNUM_SHIFT) |
    MIDR_ARCHITECTURE_MASK;

    - return model == entry->midr_model;
    + return model == entry->midr_range.model;
    }

    static bool
    @@ -239,15 +237,11 @@ qcom_enable_link_stack_sanitization(const struct arm64_cpu_capabilities *entry)

    #define CAP_MIDR_RANGE(model, v_min, r_min, v_max, r_max) \
    .matches = is_affected_midr_range, \
    - .midr_model = model, \
    - .midr_range_min = MIDR_CPU_VAR_REV(v_min, r_min), \
    - .midr_range_max = MIDR_CPU_VAR_REV(v_max, r_max)
    + .midr_range = MIDR_RANGE(model, v_min, r_min, v_max, r_max)

    #define CAP_MIDR_ALL_VERSIONS(model) \
    .matches = is_affected_midr_range, \
    - .midr_model = model, \
    - .midr_range_min = MIDR_CPU_VAR_REV(0, 0), \
    - .midr_range_max = (MIDR_VARIANT_MASK | MIDR_REVISION_MASK)
    + .midr_range = MIDR_ALL_VERSIONS(model)

    #define MIDR_FIXED(rev, revidr_mask) \
    .fixed_revs = (struct arm64_midr_revidr[]){{ (rev), (revidr_mask) }, {}}
    @@ -390,7 +384,7 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
    .desc = "Qualcomm Technologies Kryo erratum 1003",
    .capability = ARM64_WORKAROUND_QCOM_FALKOR_E1003,
    .type = ARM64_CPUCAP_LOCAL_CPU_ERRATUM,
    - .midr_model = MIDR_QCOM_KRYO,
    + .midr_range.model = MIDR_QCOM_KRYO,
    .matches = is_kryo_midr,
    },
    #endif
    --
    2.14.3
    \
     
     \ /
      Last update: 2018-03-13 12:55    [W:5.029 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site