-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
powerpc: Add support for using doorbells for SMP IPI
The e500mc supports the new msgsnd/doorbell mechanisms that were added in the Power ISA 2.05 architecture. We use the normal level doorbell for doing SMP IPIs at this point. Signed-off-by: Kumar Gala <galak@kernel.crashing.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
- Loading branch information
Kumar Gala
authored and
Benjamin Herrenschmidt
committed
Feb 23, 2009
1 parent
6ed8d12
commit 620165f
Showing
6 changed files
with
117 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
/* | ||
* Copyright 2009 Freescale Semicondutor, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
* | ||
* provides masks and opcode images for use by code generation, emulation | ||
* and for instructions that older assemblers might not know about | ||
*/ | ||
#ifndef _ASM_POWERPC_DBELL_H | ||
#define _ASM_POWERPC_DBELL_H | ||
|
||
#include <linux/smp.h> | ||
#include <linux/threads.h> | ||
|
||
#include <asm/ppc-opcode.h> | ||
|
||
#define PPC_DBELL_MSG_BRDCAST (0x04000000) | ||
#define PPC_DBELL_TYPE(x) (((x) & 0xf) << 28) | ||
enum ppc_dbell { | ||
PPC_DBELL = 0, /* doorbell */ | ||
PPC_DBELL_CRIT = 1, /* critical doorbell */ | ||
PPC_G_DBELL = 2, /* guest doorbell */ | ||
PPC_G_DBELL_CRIT = 3, /* guest critical doorbell */ | ||
PPC_G_DBELL_MC = 4, /* guest mcheck doorbell */ | ||
}; | ||
|
||
#ifdef CONFIG_SMP | ||
extern unsigned long dbell_smp_message[NR_CPUS]; | ||
extern void smp_dbell_message_pass(int target, int msg); | ||
#endif | ||
|
||
static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag) | ||
{ | ||
u32 msg = PPC_DBELL_TYPE(type) | (flags & PPC_DBELL_MSG_BRDCAST) | | ||
(tag & 0x07ffffff); | ||
|
||
__asm__ __volatile__ (PPC_MSGSND(%0) : : "r" (msg)); | ||
} | ||
|
||
#endif /* _ASM_POWERPC_DBELL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* | ||
* Author: Kumar Gala <galak@kernel.crashing.org> | ||
* | ||
* Copyright 2009 Freescale Semiconductor Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License as published by the | ||
* Free Software Foundation; either version 2 of the License, or (at your | ||
* option) any later version. | ||
*/ | ||
|
||
#include <linux/stddef.h> | ||
#include <linux/kernel.h> | ||
#include <linux/smp.h> | ||
#include <linux/threads.h> | ||
|
||
#include <asm/dbell.h> | ||
|
||
#ifdef CONFIG_SMP | ||
unsigned long dbell_smp_message[NR_CPUS]; | ||
|
||
void smp_dbell_message_pass(int target, int msg) | ||
{ | ||
int i; | ||
|
||
if(target < NR_CPUS) { | ||
set_bit(msg, &dbell_smp_message[target]); | ||
ppc_msgsnd(PPC_DBELL, 0, target); | ||
} | ||
else if(target == MSG_ALL_BUT_SELF) { | ||
for_each_online_cpu(i) { | ||
if (i == smp_processor_id()) | ||
continue; | ||
set_bit(msg, &dbell_smp_message[i]); | ||
ppc_msgsnd(PPC_DBELL, 0, i); | ||
} | ||
} | ||
else { /* target == MSG_ALL */ | ||
for_each_online_cpu(i) | ||
set_bit(msg, &dbell_smp_message[i]); | ||
ppc_msgsnd(PPC_DBELL, PPC_DBELL_MSG_BRDCAST, 0); | ||
} | ||
} | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters