From: Raphael Gault <raphael.gault@arm.com> To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: mingo@redhat.com, peterz@infradead.org, catalin.marinas@arm.com, will.deacon@arm.com, acme@kernel.org, mark.rutland@arm.com, raph.gault+kdev@gmail.com, Raphael Gault <raphael.gault@arm.com> Subject: [PATCH v4 3/7] arm64: cpufeature: Add feature to detect homogeneous systems Date: Thu, 22 Aug 2019 15:42:16 +0100 [thread overview] Message-ID: <20190822144220.27860-4-raphael.gault@arm.com> (raw) In-Reply-To: <20190822144220.27860-1-raphael.gault@arm.com> This feature is required in order to enable PMU counters direct access from userspace only when the system is homogeneous. This feature checks the model of each CPU brought online and compares it to the boot CPU. If it differs then it is heterogeneous. This CPU feature doesn't prevent different models of CPUs from being hotplugged on, however if such a scenario happens, it will turn off the feature. There is no possibility for the feature to be turned on again by hotplugging off CPUs though. Signed-off-by: Raphael Gault <raphael.gault@arm.com> --- arch/arm64/include/asm/cpucaps.h | 3 ++- arch/arm64/include/asm/cpufeature.h | 10 ++++++++++ arch/arm64/kernel/cpufeature.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h index f19fe4b9acc4..1cd73cf46116 100644 --- a/arch/arm64/include/asm/cpucaps.h +++ b/arch/arm64/include/asm/cpucaps.h @@ -52,7 +52,8 @@ #define ARM64_HAS_IRQ_PRIO_MASKING 42 #define ARM64_HAS_DCPODP 43 #define ARM64_WORKAROUND_1463225 44 +#define ARM64_HAS_HOMOGENEOUS_PMU 45 -#define ARM64_NCAPS 45 +#define ARM64_NCAPS 46 #endif /* __ASM_CPUCAPS_H */ diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index 407e2bf23676..c54a87896bbd 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h @@ -430,6 +430,16 @@ static inline void cpus_set_cap(unsigned int num) } } +static inline void cpus_unset_cap(unsigned int num) +{ + if (num >= ARM64_NCAPS) { + pr_warn("Attempt to unset an illegal CPU capability (%d >= %d)\n", + num, ARM64_NCAPS); + } else { + clear_bit(num, cpu_hwcaps); + } +} + static inline int __attribute_const__ cpuid_feature_extract_signed_field_width(u64 features, int field, int width) { diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index f29f36a65175..07be444c1e31 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -1248,6 +1248,23 @@ static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry, } #endif +static bool has_homogeneous_pmu(const struct arm64_cpu_capabilities *entry, + int scope) +{ + u32 model = read_cpuid_id() & MIDR_CPU_MODEL_MASK; + struct cpuinfo_arm64 *boot = get_boot_cpu_data(); + + return (boot->reg_midr & MIDR_CPU_MODEL_MASK) == model; +} + +static void disable_homogeneous_cap(const struct arm64_cpu_capabilities *entry) +{ + if (!has_homogeneous_pmu(entry, entry->type)) { + pr_info("Disabling Homogeneous PMU (%d)", entry->capability); + cpus_unset_cap(entry->capability); + } +} + static const struct arm64_cpu_capabilities arm64_features[] = { { .desc = "GIC system register CPU interface", @@ -1548,6 +1565,17 @@ static const struct arm64_cpu_capabilities arm64_features[] = { .min_field_value = 1, }, #endif + { + /* + * Detect whether the system is heterogeneous or + * homogeneous + */ + .desc = "Homogeneous CPUs", + .capability = ARM64_HAS_HOMOGENEOUS_PMU, + .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE, + .matches = has_homogeneous_pmu, + .cpu_enable = disable_homogeneous_cap, + }, {}, }; -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: Raphael Gault <raphael.gault@arm.com> To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Cc: mark.rutland@arm.com, raph.gault+kdev@gmail.com, peterz@infradead.org, catalin.marinas@arm.com, will.deacon@arm.com, acme@kernel.org, Raphael Gault <raphael.gault@arm.com>, mingo@redhat.com Subject: [PATCH v4 3/7] arm64: cpufeature: Add feature to detect homogeneous systems Date: Thu, 22 Aug 2019 15:42:16 +0100 [thread overview] Message-ID: <20190822144220.27860-4-raphael.gault@arm.com> (raw) In-Reply-To: <20190822144220.27860-1-raphael.gault@arm.com> This feature is required in order to enable PMU counters direct access from userspace only when the system is homogeneous. This feature checks the model of each CPU brought online and compares it to the boot CPU. If it differs then it is heterogeneous. This CPU feature doesn't prevent different models of CPUs from being hotplugged on, however if such a scenario happens, it will turn off the feature. There is no possibility for the feature to be turned on again by hotplugging off CPUs though. Signed-off-by: Raphael Gault <raphael.gault@arm.com> --- arch/arm64/include/asm/cpucaps.h | 3 ++- arch/arm64/include/asm/cpufeature.h | 10 ++++++++++ arch/arm64/kernel/cpufeature.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h index f19fe4b9acc4..1cd73cf46116 100644 --- a/arch/arm64/include/asm/cpucaps.h +++ b/arch/arm64/include/asm/cpucaps.h @@ -52,7 +52,8 @@ #define ARM64_HAS_IRQ_PRIO_MASKING 42 #define ARM64_HAS_DCPODP 43 #define ARM64_WORKAROUND_1463225 44 +#define ARM64_HAS_HOMOGENEOUS_PMU 45 -#define ARM64_NCAPS 45 +#define ARM64_NCAPS 46 #endif /* __ASM_CPUCAPS_H */ diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index 407e2bf23676..c54a87896bbd 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h @@ -430,6 +430,16 @@ static inline void cpus_set_cap(unsigned int num) } } +static inline void cpus_unset_cap(unsigned int num) +{ + if (num >= ARM64_NCAPS) { + pr_warn("Attempt to unset an illegal CPU capability (%d >= %d)\n", + num, ARM64_NCAPS); + } else { + clear_bit(num, cpu_hwcaps); + } +} + static inline int __attribute_const__ cpuid_feature_extract_signed_field_width(u64 features, int field, int width) { diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c index f29f36a65175..07be444c1e31 100644 --- a/arch/arm64/kernel/cpufeature.c +++ b/arch/arm64/kernel/cpufeature.c @@ -1248,6 +1248,23 @@ static bool can_use_gic_priorities(const struct arm64_cpu_capabilities *entry, } #endif +static bool has_homogeneous_pmu(const struct arm64_cpu_capabilities *entry, + int scope) +{ + u32 model = read_cpuid_id() & MIDR_CPU_MODEL_MASK; + struct cpuinfo_arm64 *boot = get_boot_cpu_data(); + + return (boot->reg_midr & MIDR_CPU_MODEL_MASK) == model; +} + +static void disable_homogeneous_cap(const struct arm64_cpu_capabilities *entry) +{ + if (!has_homogeneous_pmu(entry, entry->type)) { + pr_info("Disabling Homogeneous PMU (%d)", entry->capability); + cpus_unset_cap(entry->capability); + } +} + static const struct arm64_cpu_capabilities arm64_features[] = { { .desc = "GIC system register CPU interface", @@ -1548,6 +1565,17 @@ static const struct arm64_cpu_capabilities arm64_features[] = { .min_field_value = 1, }, #endif + { + /* + * Detect whether the system is heterogeneous or + * homogeneous + */ + .desc = "Homogeneous CPUs", + .capability = ARM64_HAS_HOMOGENEOUS_PMU, + .type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE, + .matches = has_homogeneous_pmu, + .cpu_enable = disable_homogeneous_cap, + }, {}, }; -- 2.17.1 _______________________________________________ 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:[~2019-08-22 14:42 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-22 14:42 [PATCH v4 0/7] arm64: Enable access to pmu registers by user-space Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-22 14:42 ` [PATCH v4 1/7] perf: arm64: Add test to check userspace access to hardware counters Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-27 11:17 ` Jonathan Cameron 2019-08-27 11:17 ` Jonathan Cameron 2020-06-03 16:19 ` Rob Herring 2020-06-03 16:19 ` Rob Herring 2019-08-22 14:42 ` [PATCH v4 2/7] arm64: cpu: Add accessor for boot_cpu_data Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-22 14:42 ` Raphael Gault [this message] 2019-08-22 14:42 ` [PATCH v4 3/7] arm64: cpufeature: Add feature to detect homogeneous systems Raphael Gault 2019-08-22 14:42 ` [PATCH v4 4/7] arm64: pmu: Add hook to handle pmu-related undefined instructions Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-22 14:42 ` [PATCH v4 5/7] arm64: pmu: Add function implementation to update event index in userpage Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-22 14:42 ` [PATCH v4 6/7] arm64: perf: Enable pmu counter direct access for perf event on armv8 Raphael Gault 2019-08-22 14:42 ` Raphael Gault 2019-08-22 16:39 ` Jonathan Cameron 2019-08-22 16:39 ` Jonathan Cameron 2019-08-22 14:42 ` [PATCH v4 7/7] Documentation: arm64: Document PMU counters access from userspace Raphael Gault 2019-08-22 14:42 ` Raphael Gault
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=20190822144220.27860-4-raphael.gault@arm.com \ --to=raphael.gault@arm.com \ --cc=acme@kernel.org \ --cc=catalin.marinas@arm.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mark.rutland@arm.com \ --cc=mingo@redhat.com \ --cc=peterz@infradead.org \ --cc=raph.gault+kdev@gmail.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.