misc: tegra-profiler: add instruction barriers
Igor Nabirushkin [Wed, 29 Mar 2017 08:35:04 +0000 (12:35 +0400)]
Add missing instruction synchronization barriers:
- After writing to the performance counter selection register.
- Before writing to the performance monitors control register.

Bug 1896853

Change-Id: Id63f73ef26eb0c99277339936f06cda109f6afe8
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/1330552
(cherry picked from commit 3775cd2936a345405143c7d71f100d88136986c6)

drivers/misc/tegra-profiler/armv7_pmu.c
drivers/misc/tegra-profiler/armv8_pmu.c

index 4385e19..98bea24 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/misc/tegra-profiler/armv7_pmu.c
  *
- * Copyright (c) 2014-2016, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2014-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -117,6 +117,8 @@ armv7_pmu_pmnc_read(void)
 static inline void
 armv7_pmu_pmnc_write(u32 val)
 {
+       isb();
+
        /* Write Performance MoNitor Control (PMNC) register */
        asm volatile("mcr p15, 0, %0, c9, c12, 0" : :
                     "r"(val & QUADD_ARMV7_PMNC_MASK));
@@ -149,9 +151,10 @@ armv7_pmu_cntenc_write(u32 val)
 static inline void
 armv7_pmu_pmnxsel_write(u32 val)
 {
-       /* Read Performance Counter SELection (PMNXSEL) register */
+       /* Write Performance Counter SELection (PMNXSEL) register */
        asm volatile("mcr p15, 0, %0, c9, c12, 5" : :
                     "r" (val & QUADD_ARMV7_SELECT_MASK));
+       isb();
 }
 
 static inline u32
index fa378b2..f4645a2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * drivers/misc/tegra-profiler/armv8_pmu.c
  *
- * Copyright (c) 2014-2016, NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2014-2017, NVIDIA CORPORATION.  All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU General Public License,
@@ -144,6 +144,9 @@ armv8_pmu_pmcr_read(void)
 static inline void
 armv8_pmu_pmcr_write(u32 val)
 {
+       isb();
+
+       /* Write Performance Monitors Control Register */
        asm volatile("msr pmcr_el0, %0" : :
                     "r" (val & QUADD_ARMV8_PMCR_WR_MASK));
 }
@@ -188,6 +191,7 @@ armv8_pmu_pmselr_write(u32 val)
        /* Write Performance Monitors Event Counter Selection Register */
        asm volatile("msr pmselr_el0, %0" : :
                     "r" (val & QUADD_ARMV8_SELECT_MASK));
+       isb();
 }
 
 static inline u64