]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - arch/powerpc/include/asm/dbell.h
powerpc/powernv: POWER9 support for msgsnd/doorbell IPI
[mirror_ubuntu-zesty-kernel.git] / arch / powerpc / include / asm / dbell.h
index 378167377065a01b3f98df459d82e75277b1d6fe..f70cbfe0ec045d54b90fbbe121dd5c395ad233da 100644 (file)
@@ -35,33 +35,53 @@ enum ppc_dbell {
 #ifdef CONFIG_PPC_BOOK3S
 
 #define PPC_DBELL_MSGTYPE              PPC_DBELL_SERVER
-#define SPRN_DOORBELL_CPUTAG           SPRN_TIR
-#define PPC_DBELL_TAG_MASK             0x7f
 
 static inline void _ppc_msgsnd(u32 msg)
 {
-       if (cpu_has_feature(CPU_FTR_HVMODE))
-               __asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg));
-       else
-               __asm__ __volatile__ (PPC_MSGSNDP(%0) : : "r" (msg));
+       __asm__ __volatile__ (ASM_FTR_IFSET(PPC_MSGSND(%1), PPC_MSGSNDP(%1), %0)
+                               : : "i" (CPU_FTR_HVMODE), "r" (msg));
+}
+
+/* sync before sending message */
+static inline void ppc_msgsnd_sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+/* sync after taking message interrupt */
+static inline void ppc_msgsync(void)
+{
+       /* sync is not required when taking messages from the same core */
+       __asm__ __volatile__ (ASM_FTR_IFSET(PPC_MSGSYNC " ; lwsync", "", %0)
+                               : : "i" (CPU_FTR_HVMODE|CPU_FTR_ARCH_300));
 }
 
 #else /* CONFIG_PPC_BOOK3S */
 
 #define PPC_DBELL_MSGTYPE              PPC_DBELL
-#define SPRN_DOORBELL_CPUTAG           SPRN_PIR
-#define PPC_DBELL_TAG_MASK             0x3fff
 
 static inline void _ppc_msgsnd(u32 msg)
 {
        __asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg));
 }
 
+/* sync before sending message */
+static inline void ppc_msgsnd_sync(void)
+{
+       __asm__ __volatile__ ("sync" : : : "memory");
+}
+
+/* sync after taking message interrupt */
+static inline void ppc_msgsync(void)
+{
+}
+
 #endif /* CONFIG_PPC_BOOK3S */
 
-extern void doorbell_cause_ipi(int cpu, unsigned long data);
+extern void doorbell_global_ipi(int cpu);
+extern void doorbell_core_ipi(int cpu);
+extern int doorbell_try_core_ipi(int cpu);
 extern void doorbell_exception(struct pt_regs *regs);
-extern void doorbell_setup_this_cpu(void);
 
 static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag)
 {