|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 2/3] xen/arm: Check for PMU platform support
Hi Julien,
On 11.10.2021 12:17, Julien Grall wrote:
> Hi Michal,
>
> On 11/10/2021 10:00, Michal Orzel wrote:
>> ID_AA64DFR0_EL1/ID_DFR0_EL1 registers provide
>> information about PMU support. Replace structure
>> dbg64/dbg32 with a union and fill in all the
>> register fields according to document:
>> ARM Architecture Registers(DDI 0595, 2021-06).
>>
>> Add macros boot_dbg_feature64/boot_dbg_feature32
>> to check for a debug feature. Add macro
>> cpu_has_pmu to check for PMU support.
>>
>> Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
>> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>> Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>> ---
>> Changes since v3:
>> -none
>> Changes since v2:
>> -none
>> Changes since v1:
>> -new in v2
>> ---
>> xen/include/asm-arm/cpufeature.h | 49 ++++++++++++++++++++++++++++++--
>> 1 file changed, 47 insertions(+), 2 deletions(-)
>>
>> diff --git a/xen/include/asm-arm/cpufeature.h
>> b/xen/include/asm-arm/cpufeature.h
>> index 5ca09b0bff..4fce23844d 100644
>> --- a/xen/include/asm-arm/cpufeature.h
>> +++ b/xen/include/asm-arm/cpufeature.h
>> @@ -4,6 +4,7 @@
>> #ifdef CONFIG_ARM_64
>> #define cpu_feature64(c, feat) ((c)->pfr64.feat)
>> #define boot_cpu_feature64(feat) (system_cpuinfo.pfr64.feat)
>> +#define boot_dbg_feature64(feat) (system_cpuinfo.dbg64.feat)
>> #define cpu_feature64_has_el0_32(c) (cpu_feature64(c, el0) == 2)
>> @@ -22,6 +23,7 @@
>> #define cpu_feature32(c, feat) ((c)->pfr32.feat)
>> #define boot_cpu_feature32(feat) (system_cpuinfo.pfr32.feat)
>> +#define boot_dbg_feature32(feat) (system_cpuinfo.dbg32.feat)
>> #define cpu_has_arm (boot_cpu_feature32(arm) == 1)
>> #define cpu_has_thumb (boot_cpu_feature32(thumb) >= 1)
>> @@ -32,8 +34,10 @@
>> #ifdef CONFIG_ARM_32
>> #define cpu_has_gentimer (boot_cpu_feature32(gentimer) == 1)
>> +#define cpu_has_pmu (boot_dbg_feature32(perfmon) >= 1)
>
> From my understanding, on Armv7, perfmon == 0 only means PMUv2 is not
> present. IOW, it doesn't say whether PMUv1 is supported.
>
> I think it is OK to treat as the PMU is not supported (ARMv8 treat it like
> that too), but I would like a comment in the code so it is clear this is a
> deliberate choice.
>
We are checking if any version of PMU is supported meaning perfmon is >=1.
On ARMv8 any value higher than 0 means that PMU is present. 0 means not
supported.
On ARMv7 the above is not really true. Any value higher than 0 and lower than
15 means the PMU is supported.
So I think I should do:
#define cpu_has_pmu ((boot_dbg_feature32(perfmon) >= 1) && \
(boot_dbg_feature32(perfmon) < 15))
Do you agree?
>> #else
>> #define cpu_has_gentimer (1)
>> +#define cpu_has_pmu (boot_dbg_feature64(pmu_ver) >= 1)
>> #endif
>> #define cpu_has_security (boot_cpu_feature32(security) > 0)
>> @@ -181,8 +185,28 @@ struct cpuinfo_arm {
>> };
>> } pfr64;
>> - struct {
>> + union {
>> register_t bits[2];
>> + struct {
>> + /* DFR0 */
>> + unsigned long debug_ver:4;
>> + unsigned long trace_ver:4;
>> + unsigned long pmu_ver:4;
>> + unsigned long brps:4;
>> + unsigned long __res0:4;
>> + unsigned long wrps:4;
>> + unsigned long __res1:4;
>> + unsigned long ctx_cmps:4;
>> + unsigned long pms_ver:4;
>> + unsigned long double_lock:4;
>> + unsigned long trace_filt:4;
>> + unsigned long __res2:4;
>> + unsigned long mtpmu:4;
>> + unsigned long __res3:12;
>> +
>> + /* DFR1 */
>> + unsigned long __res4:64;
>> + };
>> } dbg64;
>> struct {
>> @@ -321,8 +345,29 @@ struct cpuinfo_arm {
>> };
>> } pfr32;
>> - struct {
>> + union {
>> register_t bits[2];
>> + struct {
>> + /* DFR0 */
>> + unsigned long copdbg:4;
>> + unsigned long copsdbg:4;
>> + unsigned long mmapdbg:4;
>> + unsigned long coptrc:4;
>> + unsigned long mmaptrc:4;
>> + unsigned long mprofdbg:4;
>> + unsigned long perfmon:4;
>> + unsigned long tracefilt:4;
>> +#ifdef CONFIG_ARM_64
>> + unsigned long __res0:32;
>> +#endif
>> +
>> + /* DFR1 */
>> + unsigned long mtpmu:4;
>> + unsigned long __res1:28;
>> +#ifdef CONFIG_ARM_64
>> + unsigned long __res2:32;
>> +#endif
>> + };
>> } dbg32;
>> struct {
>>
>
> Cheers,
>
Cheers,
Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |