|
@@ -323,6 +323,21 @@ static void __naked tc2_pm_power_up_setup(unsigned int affinity_level)
|
|
" b cci_enable_port_for_self ");
|
|
" b cci_enable_port_for_self ");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void __init tc2_cache_off(void)
|
|
|
|
+{
|
|
|
|
+ pr_info("TC2: disabling cache during MCPM loopback test\n");
|
|
|
|
+ if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) {
|
|
|
|
+ /* disable L2 prefetching on the Cortex-A15 */
|
|
|
|
+ asm volatile(
|
|
|
|
+ "mcr p15, 1, %0, c15, c0, 3 \n\t"
|
|
|
|
+ "isb \n\t"
|
|
|
|
+ "dsb "
|
|
|
|
+ : : "r" (0x400) );
|
|
|
|
+ }
|
|
|
|
+ v7_exit_coherency_flush(all);
|
|
|
|
+ cci_disable_port_by_cpu(read_cpuid_mpidr());
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init tc2_pm_init(void)
|
|
static int __init tc2_pm_init(void)
|
|
{
|
|
{
|
|
int ret, irq;
|
|
int ret, irq;
|
|
@@ -370,6 +385,8 @@ static int __init tc2_pm_init(void)
|
|
ret = mcpm_platform_register(&tc2_pm_power_ops);
|
|
ret = mcpm_platform_register(&tc2_pm_power_ops);
|
|
if (!ret) {
|
|
if (!ret) {
|
|
mcpm_sync_init(tc2_pm_power_up_setup);
|
|
mcpm_sync_init(tc2_pm_power_up_setup);
|
|
|
|
+ /* test if we can (re)enable the CCI on our own */
|
|
|
|
+ BUG_ON(mcpm_loopback(tc2_cache_off) != 0);
|
|
pr_info("TC2 power management initialized\n");
|
|
pr_info("TC2 power management initialized\n");
|
|
}
|
|
}
|
|
return ret;
|
|
return ret;
|