ARC: [plat-eznps] Use dedicated identity auxiliary register.
authorNoam Camus <noamc@ezchip.com>
Mon, 3 Jun 2013 12:17:25 +0000 (15:17 +0300)
committerVineet Gupta <vgupta@synopsys.com>
Mon, 9 May 2016 04:02:33 +0000 (09:32 +0530)
With generic "identity" num of CPUs is limited to 256 (8 bit).
We use our alternative AUX register GLOBAL_ID (12 bit).
Now we can support up to 4096 CPUs.

Signed-off-by: Noam Camus <noamc@ezchip.com>
arch/arc/include/asm/entry-compact.h
arch/arc/kernel/ctx_sw.c
arch/arc/plat-eznps/include/plat/ctop.h

index 1d8f57cd605773a106cbf03fd6836ae4fa8eeff0..e0e1faf03c50177f69232f2990dd5e4a4ac19b6b 100644 (file)
 #include <asm/irqflags-compact.h>
 #include <asm/thread_info.h>   /* For THREAD_SIZE */
 
+#ifdef CONFIG_ARC_PLAT_EZNPS
+#include <plat/ctop.h>
+#endif
+
 /*--------------------------------------------------------------
  * Switch to Kernel Mode stack if SP points to User Mode stack
  *
        bic \reg, sp, (THREAD_SIZE - 1)
 .endm
 
+#ifndef CONFIG_ARC_PLAT_EZNPS
 /* Get CPU-ID of this core */
 .macro  GET_CPU_ID  reg
        lr  \reg, [identity]
        lsr \reg, \reg, 8
        bmsk \reg, \reg, 7
 .endm
+#endif
 
 #endif  /* __ASM_ARC_ENTRY_COMPACT_H */
index 5d446df2c41353a15edfc5a5f7b05abd24b16df3..6f4cb0dab1b9452dda4f459fb5a99263d149ef66 100644 (file)
@@ -16,6 +16,9 @@
 
 #include <asm/asm-offsets.h>
 #include <linux/sched.h>
+#ifdef CONFIG_ARC_PLAT_EZNPS
+#include <plat/ctop.h>
+#endif
 
 #define KSP_WORD_OFF   ((TASK_THREAD + THREAD_KSP) / 4)
 
@@ -66,10 +69,17 @@ __switch_to(struct task_struct *prev_task, struct task_struct *next_task)
                 */
 #ifndef CONFIG_SMP
                "st  %2, [@_current_task]       \n\t"
+#else
+#ifdef CONFIG_ARC_PLAT_EZNPS
+               "lr   r24, [%4]         \n\t"
+#ifndef CONFIG_EZNPS_MTM_EXT
+               "lsr  r24, r24, 4               \n\t"
+#endif
 #else
                "lr   r24, [identity]           \n\t"
                "lsr  r24, r24, 8               \n\t"
                "bmsk r24, r24, 7               \n\t"
+#endif
                "add2 r24, @_current_task, r24  \n\t"
                "st   %2,  [r24]                \n\t"
 #endif
@@ -107,6 +117,9 @@ __switch_to(struct task_struct *prev_task, struct task_struct *next_task)
 
                : "=r"(tmp)
                : "n"(KSP_WORD_OFF), "r"(next), "r"(prev)
+#ifdef CONFIG_ARC_PLAT_EZNPS
+               , "i"(CTOP_AUX_LOGIC_GLOBAL_ID)
+#endif
                : "blink"
        );
 
index 91b25f3dd39a1bc77ef96e0a758c9735daf8e86f..9d6718c1a19984c4d75e49bdf8f35d1140d90d66 100644 (file)
@@ -195,6 +195,15 @@ struct nps_host_reg_aux_lpc {
 #define REG_GIM_P_INT_DST_25    nps_host_reg_non_cl(NPS_GIM_BLKID, 0x149)
 #define REG_GIM_P_INT_DST_26    nps_host_reg_non_cl(NPS_GIM_BLKID, 0x14A)
 
+#else
+
+.macro  GET_CPU_ID  reg
+       lr  \reg, [CTOP_AUX_LOGIC_GLOBAL_ID]
+#ifndef CONFIG_EZNPS_MTM_EXT
+       lsr \reg, \reg, 4
+#endif
+.endm
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _PLAT_EZNPS_CTOP_H */