Loading drivers/power/qcom/idle.h +6 −1 Original line number Diff line number Diff line Loading @@ -14,10 +14,15 @@ #ifndef _ARCH_ARM_MACH_MSM_IDLE_H_ #define _ARCH_ARM_MACH_MSM_IDLE_H_ #define MAX_CPUS_PER_CLUSTER 4 #define MAX_NUM_CLUSTER 4 #ifndef __ASSEMBLY__ #if defined(CONFIG_CPU_V7) || defined(CONFIG_ARM64) extern unsigned long msm_pm_boot_vector[NR_CPUS]; extern unsigned long msm_pm_boot_vector[MAX_NUM_CLUSTER * MAX_CPUS_PER_CLUSTER]; void msm_pm_boot_entry(void); #else static inline void msm_pm_boot_entry(void) {} #endif #endif #endif drivers/power/qcom/pm-boot.c +16 −5 Original line number Diff line number Diff line Loading @@ -15,9 +15,13 @@ #include <linux/init.h> #include <soc/qcom/scm-boot.h> #include <asm/cacheflush.h> #include <asm/cputype.h> #include <asm/smp_plat.h> #include "idle.h" #include "pm-boot.h" #define CPU_INDEX(cluster, cpu) (cluster * MAX_CPUS_PER_CLUSTER + cpu) static void (*msm_pm_boot_before_pc)(unsigned int cpu, unsigned long entry); static void (*msm_pm_boot_after_pc)(unsigned int cpu); Loading @@ -43,13 +47,20 @@ static int msm_pm_tz_boot_init(void) return scm_set_boot_addr(virt_to_phys(msm_pm_boot_entry), flag); } } static void msm_pm_write_boot_vector(unsigned int cpu, unsigned long address) { msm_pm_boot_vector[cpu] = address; dmac_clean_range((void *)&msm_pm_boot_vector[cpu], (void *)(&msm_pm_boot_vector[cpu] + sizeof(msm_pm_boot_vector[cpu]))); uint32_t clust_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1); uint32_t cpu_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0); unsigned long *start_address; unsigned long *end_address; if (clust_id >= MAX_NUM_CLUSTER || cpu_id >= MAX_CPUS_PER_CLUSTER) BUG(); msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)] = address; start_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)]; end_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id + 1)]; dmac_clean_range((void *)start_address, (void *)end_address); } static void msm_pm_config_tz_before_pc(unsigned int cpu, Loading drivers/soc/qcom/idle-v7.S +8 −4 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ THUMB( .thumb ) /* switch to Thumb now. */ THUMB(2: ) mrc p15, 0, r0, c0, c0, 5 /* MPIDR */ bic r0, #0xff000000 /* what CPU am I*/ bic r0, #0x00ff0000 /* clear bits 31-16 */ adr r3, 3f ldr r1, [r3] Loading @@ -46,8 +47,11 @@ THUMB(2: ) skip_pc_debug3: ldr r1, =msm_pm_boot_vector sub r1, r1, r3 /* translate virt to phys */ mov r2, r0, lsr #8 /* get cluster num */ add r1, r1, r2, lsl #4 /* Get offset for the cluster */ and r0, r0, #0xff /* cpu id */ add r1, r1, r0, lsl #2 /* Get offset for the cpu */ add r1, r1, r0, LSL #2 /* locate boot vector for our cpu */ ldr pc, [r1] /* jump */ ENDPROC(msm_pm_boot_entry) Loading @@ -57,7 +61,7 @@ ENDPROC(msm_pm_boot_entry) .globl msm_pm_boot_vector msm_pm_boot_vector: .space 4 * NR_CPUS .space 4 * 4 * 4 .globl msm_pc_debug_counters_phys msm_pc_debug_counters_phys: Loading drivers/soc/qcom/idle-v8.S +7 −4 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ ENTRY(msm_pm_boot_entry) mrs x0, mpidr_el1 and x0, x0, #15 /* what CPU am I */ and x0, x0, #0xffff /* what CPU/cluster affinity */ adr x3, align ldr x1, [x3] Loading @@ -41,8 +41,11 @@ ENTRY(msm_pm_boot_entry) skip_pc_debug3: ldr x1, =msm_pm_boot_vector sub x1, x1, x3 /* translate virt to phys */ lsr x2, x0, #0x8 /* Get cluster id and clear cpu id */ add x1, x1, x2, lsl #0x5 /* Get offset for this cluster */ and x0, x0, #0x03 /* Get cpu id and clear cluster id */ add x1, x1, x0, lsl #3 /* Get offset for this cpu */ add x1, x1, x0, LSL #3 /* locate boot vector for our cpu */ ldr x1, [x1] ret x1 /* jump */ ENDPROC(msm_pm_boot_entry) Loading @@ -52,7 +55,7 @@ align: .quad . .data .globl msm_pm_boot_vector msm_pm_boot_vector: .space 8 * NR_CPUS .space 8 * 4 * 4 .globl msm_pc_debug_counters_phys msm_pc_debug_counters_phys: Loading Loading
drivers/power/qcom/idle.h +6 −1 Original line number Diff line number Diff line Loading @@ -14,10 +14,15 @@ #ifndef _ARCH_ARM_MACH_MSM_IDLE_H_ #define _ARCH_ARM_MACH_MSM_IDLE_H_ #define MAX_CPUS_PER_CLUSTER 4 #define MAX_NUM_CLUSTER 4 #ifndef __ASSEMBLY__ #if defined(CONFIG_CPU_V7) || defined(CONFIG_ARM64) extern unsigned long msm_pm_boot_vector[NR_CPUS]; extern unsigned long msm_pm_boot_vector[MAX_NUM_CLUSTER * MAX_CPUS_PER_CLUSTER]; void msm_pm_boot_entry(void); #else static inline void msm_pm_boot_entry(void) {} #endif #endif #endif
drivers/power/qcom/pm-boot.c +16 −5 Original line number Diff line number Diff line Loading @@ -15,9 +15,13 @@ #include <linux/init.h> #include <soc/qcom/scm-boot.h> #include <asm/cacheflush.h> #include <asm/cputype.h> #include <asm/smp_plat.h> #include "idle.h" #include "pm-boot.h" #define CPU_INDEX(cluster, cpu) (cluster * MAX_CPUS_PER_CLUSTER + cpu) static void (*msm_pm_boot_before_pc)(unsigned int cpu, unsigned long entry); static void (*msm_pm_boot_after_pc)(unsigned int cpu); Loading @@ -43,13 +47,20 @@ static int msm_pm_tz_boot_init(void) return scm_set_boot_addr(virt_to_phys(msm_pm_boot_entry), flag); } } static void msm_pm_write_boot_vector(unsigned int cpu, unsigned long address) { msm_pm_boot_vector[cpu] = address; dmac_clean_range((void *)&msm_pm_boot_vector[cpu], (void *)(&msm_pm_boot_vector[cpu] + sizeof(msm_pm_boot_vector[cpu]))); uint32_t clust_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 1); uint32_t cpu_id = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0); unsigned long *start_address; unsigned long *end_address; if (clust_id >= MAX_NUM_CLUSTER || cpu_id >= MAX_CPUS_PER_CLUSTER) BUG(); msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)] = address; start_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id)]; end_address = &msm_pm_boot_vector[CPU_INDEX(clust_id, cpu_id + 1)]; dmac_clean_range((void *)start_address, (void *)end_address); } static void msm_pm_config_tz_before_pc(unsigned int cpu, Loading
drivers/soc/qcom/idle-v7.S +8 −4 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ THUMB( .thumb ) /* switch to Thumb now. */ THUMB(2: ) mrc p15, 0, r0, c0, c0, 5 /* MPIDR */ bic r0, #0xff000000 /* what CPU am I*/ bic r0, #0x00ff0000 /* clear bits 31-16 */ adr r3, 3f ldr r1, [r3] Loading @@ -46,8 +47,11 @@ THUMB(2: ) skip_pc_debug3: ldr r1, =msm_pm_boot_vector sub r1, r1, r3 /* translate virt to phys */ mov r2, r0, lsr #8 /* get cluster num */ add r1, r1, r2, lsl #4 /* Get offset for the cluster */ and r0, r0, #0xff /* cpu id */ add r1, r1, r0, lsl #2 /* Get offset for the cpu */ add r1, r1, r0, LSL #2 /* locate boot vector for our cpu */ ldr pc, [r1] /* jump */ ENDPROC(msm_pm_boot_entry) Loading @@ -57,7 +61,7 @@ ENDPROC(msm_pm_boot_entry) .globl msm_pm_boot_vector msm_pm_boot_vector: .space 4 * NR_CPUS .space 4 * 4 * 4 .globl msm_pc_debug_counters_phys msm_pc_debug_counters_phys: Loading
drivers/soc/qcom/idle-v8.S +7 −4 Original line number Diff line number Diff line Loading @@ -21,7 +21,7 @@ ENTRY(msm_pm_boot_entry) mrs x0, mpidr_el1 and x0, x0, #15 /* what CPU am I */ and x0, x0, #0xffff /* what CPU/cluster affinity */ adr x3, align ldr x1, [x3] Loading @@ -41,8 +41,11 @@ ENTRY(msm_pm_boot_entry) skip_pc_debug3: ldr x1, =msm_pm_boot_vector sub x1, x1, x3 /* translate virt to phys */ lsr x2, x0, #0x8 /* Get cluster id and clear cpu id */ add x1, x1, x2, lsl #0x5 /* Get offset for this cluster */ and x0, x0, #0x03 /* Get cpu id and clear cluster id */ add x1, x1, x0, lsl #3 /* Get offset for this cpu */ add x1, x1, x0, LSL #3 /* locate boot vector for our cpu */ ldr x1, [x1] ret x1 /* jump */ ENDPROC(msm_pm_boot_entry) Loading @@ -52,7 +55,7 @@ align: .quad . .data .globl msm_pm_boot_vector msm_pm_boot_vector: .space 8 * NR_CPUS .space 8 * 4 * 4 .globl msm_pc_debug_counters_phys msm_pc_debug_counters_phys: Loading