[POWERPC] PS3: Move chip mask defs up
This just moves the definitions of the PS3 chip_mask routines up above the irq setup routines. This change is needed for the kexec updates that follow. Also adds some inline documentation to the routines. Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
dc23fba706
commit
743c1bb074
1 changed files with 86 additions and 61 deletions
|
@ -90,6 +90,92 @@ struct ps3_private {
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct ps3_private, ps3_private);
|
static DEFINE_PER_CPU(struct ps3_private, ps3_private);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ps3_chip_mask - Set an interrupt mask bit in ps3_bmp.
|
||||||
|
* @virq: The assigned Linux virq.
|
||||||
|
*
|
||||||
|
* Sets ps3_bmp.mask and calls lv1_did_update_interrupt_mask().
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void ps3_chip_mask(unsigned int virq)
|
||||||
|
{
|
||||||
|
struct ps3_private *pd = get_irq_chip_data(virq);
|
||||||
|
u64 bit = 0x8000000000000000UL >> virq;
|
||||||
|
u64 *p = &pd->bmp.mask;
|
||||||
|
u64 old;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
asm volatile(
|
||||||
|
"1: ldarx %0,0,%3\n"
|
||||||
|
"andc %0,%0,%2\n"
|
||||||
|
"stdcx. %0,0,%3\n"
|
||||||
|
"bne- 1b"
|
||||||
|
: "=&r" (old), "+m" (*p)
|
||||||
|
: "r" (bit), "r" (p)
|
||||||
|
: "cc" );
|
||||||
|
|
||||||
|
lv1_did_update_interrupt_mask(pd->node, pd->cpu);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ps3_chip_unmask - Clear an interrupt mask bit in ps3_bmp.
|
||||||
|
* @virq: The assigned Linux virq.
|
||||||
|
*
|
||||||
|
* Clears ps3_bmp.mask and calls lv1_did_update_interrupt_mask().
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void ps3_chip_unmask(unsigned int virq)
|
||||||
|
{
|
||||||
|
struct ps3_private *pd = get_irq_chip_data(virq);
|
||||||
|
u64 bit = 0x8000000000000000UL >> virq;
|
||||||
|
u64 *p = &pd->bmp.mask;
|
||||||
|
u64 old;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
|
||||||
|
|
||||||
|
local_irq_save(flags);
|
||||||
|
asm volatile(
|
||||||
|
"1: ldarx %0,0,%3\n"
|
||||||
|
"or %0,%0,%2\n"
|
||||||
|
"stdcx. %0,0,%3\n"
|
||||||
|
"bne- 1b"
|
||||||
|
: "=&r" (old), "+m" (*p)
|
||||||
|
: "r" (bit), "r" (p)
|
||||||
|
: "cc" );
|
||||||
|
|
||||||
|
lv1_did_update_interrupt_mask(pd->node, pd->cpu);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ps3_chip_eoi - HV end-of-interrupt.
|
||||||
|
* @virq: The assigned Linux virq.
|
||||||
|
*
|
||||||
|
* Calls lv1_end_of_interrupt_ext().
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void ps3_chip_eoi(unsigned int virq)
|
||||||
|
{
|
||||||
|
const struct ps3_private *pd = get_irq_chip_data(virq);
|
||||||
|
lv1_end_of_interrupt_ext(pd->node, pd->cpu, virq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ps3_irq_chip - Represents the ps3_bmp as a Linux struct irq_chip.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct irq_chip ps3_irq_chip = {
|
||||||
|
.typename = "ps3",
|
||||||
|
.mask = ps3_chip_mask,
|
||||||
|
.unmask = ps3_chip_unmask,
|
||||||
|
.eoi = ps3_chip_eoi,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ps3_virq_setup - virq related setup.
|
* ps3_virq_setup - virq related setup.
|
||||||
* @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
|
* @cpu: enum ps3_cpu_binding indicating the cpu the interrupt should be
|
||||||
|
@ -565,67 +651,6 @@ static void __maybe_unused _dump_mask(struct ps3_private *pd,
|
||||||
static void dump_bmp(struct ps3_private* pd) {};
|
static void dump_bmp(struct ps3_private* pd) {};
|
||||||
#endif /* defined(DEBUG) */
|
#endif /* defined(DEBUG) */
|
||||||
|
|
||||||
static void ps3_chip_mask(unsigned int virq)
|
|
||||||
{
|
|
||||||
struct ps3_private *pd = get_irq_chip_data(virq);
|
|
||||||
u64 bit = 0x8000000000000000UL >> virq;
|
|
||||||
u64 *p = &pd->bmp.mask;
|
|
||||||
u64 old;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
asm volatile(
|
|
||||||
"1: ldarx %0,0,%3\n"
|
|
||||||
"andc %0,%0,%2\n"
|
|
||||||
"stdcx. %0,0,%3\n"
|
|
||||||
"bne- 1b"
|
|
||||||
: "=&r" (old), "+m" (*p)
|
|
||||||
: "r" (bit), "r" (p)
|
|
||||||
: "cc" );
|
|
||||||
|
|
||||||
lv1_did_update_interrupt_mask(pd->node, pd->cpu);
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ps3_chip_unmask(unsigned int virq)
|
|
||||||
{
|
|
||||||
struct ps3_private *pd = get_irq_chip_data(virq);
|
|
||||||
u64 bit = 0x8000000000000000UL >> virq;
|
|
||||||
u64 *p = &pd->bmp.mask;
|
|
||||||
u64 old;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
pr_debug("%s:%d: cpu %u, virq %d\n", __func__, __LINE__, pd->cpu, virq);
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
asm volatile(
|
|
||||||
"1: ldarx %0,0,%3\n"
|
|
||||||
"or %0,%0,%2\n"
|
|
||||||
"stdcx. %0,0,%3\n"
|
|
||||||
"bne- 1b"
|
|
||||||
: "=&r" (old), "+m" (*p)
|
|
||||||
: "r" (bit), "r" (p)
|
|
||||||
: "cc" );
|
|
||||||
|
|
||||||
lv1_did_update_interrupt_mask(pd->node, pd->cpu);
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ps3_chip_eoi(unsigned int virq)
|
|
||||||
{
|
|
||||||
const struct ps3_private *pd = get_irq_chip_data(virq);
|
|
||||||
lv1_end_of_interrupt_ext(pd->node, pd->cpu, virq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct irq_chip irq_chip = {
|
|
||||||
.typename = "ps3",
|
|
||||||
.mask = ps3_chip_mask,
|
|
||||||
.unmask = ps3_chip_unmask,
|
|
||||||
.eoi = ps3_chip_eoi,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ps3_host_unmap(struct irq_host *h, unsigned int virq)
|
static void ps3_host_unmap(struct irq_host *h, unsigned int virq)
|
||||||
{
|
{
|
||||||
set_irq_chip_data(virq, NULL);
|
set_irq_chip_data(virq, NULL);
|
||||||
|
|
Loading…
Add table
Reference in a new issue