feat(tc): enable MCN non-secure access to pmu counters on TC3
MCN PMU counters are by default non-accesible from non-secure world, so
enable the non-secure access to those PMU counters so that linux perf
driver can read them. FVP has a different address space size.
Change-Id: I2a3758faca5f7cab6d3146a1beb7b289eec0294d
Signed-off-by: Jagdish Gediya <jagdish.gediya@arm.com>
Signed-off-by: Leo Yan <leo.yan@arm.com>
diff --git a/plat/arm/board/tc/include/platform_def.h b/plat/arm/board/tc/include/platform_def.h
index 0cf7500..be9efae 100644
--- a/plat/arm/board/tc/include/platform_def.h
+++ b/plat/arm/board/tc/include/platform_def.h
@@ -413,4 +413,20 @@
#define PLAT_ARM_BOOT_UART_CLK_IN_HZ TC_UARTCLK
#define PLAT_ARM_RUN_UART_CLK_IN_HZ TC_UARTCLK
+#if TARGET_PLATFORM == 3
+#define NCI_BASE_ADDR UL(0x4F000000)
+#ifdef TARGET_FLAVOUR_FPGA
+#define MCN_ADDRESS_SPACE_SIZE 0x00120000
+#else
+#define MCN_ADDRESS_SPACE_SIZE 0x00130000
+#endif /* TARGET_FLAVOUR_FPGA */
+#define MCN_OFFSET_IN_NCI 0x00C90000
+#define MCN_BASE_ADDR (NCI_BASE_ADDR + MCN_OFFSET_IN_NCI)
+#define MCN_MICROARCH_OFFSET 0x000E4000
+#define MCN_MICROARCH_BASE_ADDR (MCN_BASE_ADDR + MCN_MICROARCH_OFFSET)
+#define MCN_SCR_OFFSET 0x4
+#define MCN_SCR_PMU_BIT 10
+#define MCN_INSTANCES 4
+#endif /* TARGET_PLATFORM == 3 */
+
#endif /* PLATFORM_DEF_H */
diff --git a/plat/arm/board/tc/tc_bl31_setup.c b/plat/arm/board/tc/tc_bl31_setup.c
index d6b0311..a5c931c 100644
--- a/plat/arm/board/tc/tc_bl31_setup.c
+++ b/plat/arm/board/tc/tc_bl31_setup.c
@@ -66,11 +66,26 @@
.db_modify_mask = 0x1,
.ring_doorbell = &mhu_ring_doorbell,
};
+
+static void enable_ns_mcn_pmu(void)
+{
+ /*
+ * Enable non-secure access to MCN PMU registers
+ */
+ for (int i = 0; i < MCN_INSTANCES; i++) {
+ uintptr_t mcn_scr = MCN_MICROARCH_BASE_ADDR + MCN_SCR_OFFSET +
+ (i * MCN_ADDRESS_SPACE_SIZE);
+ mmio_setbits_32(mcn_scr, 1 << MCN_SCR_PMU_BIT);
+ }
+}
#endif
void bl31_platform_setup(void)
{
tc_bl31_common_platform_setup();
+#if TARGET_PLATFORM == 3
+ enable_ns_mcn_pmu();
+#endif
}
scmi_channel_plat_info_t *plat_css_get_scmi_info(unsigned int channel_id __unused)