diff options
author | Jack Steiner <steiner@sgi.com> | 2009-12-15 16:48:21 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-16 07:20:17 -0800 |
commit | 76148df19cbd5437dc5358408a58c7cc6366ecf4 (patch) | |
tree | d592f1c21d072d9cefbf18f27081dca05ea655db /drivers/misc/sgi-gru/gru_instructions.h | |
parent | 56abcf24ff993291b20efd6e3402cd3d12f5cee2 (diff) | |
download | linux-76148df19cbd5437dc5358408a58c7cc6366ecf4.tar.gz linux-76148df19cbd5437dc5358408a58c7cc6366ecf4.tar.bz2 linux-76148df19cbd5437dc5358408a58c7cc6366ecf4.zip |
gru: send cross partition interrupts using the gru
GRU Message queue instructions are used to deliver messages to other SSIs
within the numalink domain. In most cases, a single GRU mesq instruction
will deliver both the message AND an interrupt to notify the other SSI
that a messsage is present. In some cases, however, the interrupt must be
sent explicitly.
To improve resilency, the GRU driver should send these explicit interrupts
using the GRU to write the remote chipset register. Current code sends
the interrupt using a cpu instruction to write the chipset register.
Signed-off-by: Jack Steiner <steiner@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/misc/sgi-gru/gru_instructions.h')
-rw-r--r-- | drivers/misc/sgi-gru/gru_instructions.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/misc/sgi-gru/gru_instructions.h b/drivers/misc/sgi-gru/gru_instructions.h index 848c7a8f02be..d95587cc794c 100644 --- a/drivers/misc/sgi-gru/gru_instructions.h +++ b/drivers/misc/sgi-gru/gru_instructions.h @@ -367,6 +367,18 @@ static inline void gru_vload_phys(void *cb, unsigned long gpa, (unsigned long)tri0, CB_IMA(hints))); } +static inline void gru_vstore_phys(void *cb, unsigned long gpa, + unsigned int tri0, int iaa, unsigned long hints) +{ + struct gru_instruction *ins = (struct gru_instruction *)cb; + + ins->baddr0 = (long)gpa | ((unsigned long)iaa << 62); + ins->nelem = 1; + ins->op1_stride = 1; + gru_start_instruction(ins, __opdword(OP_VSTORE, 0, XTYPE_DW, iaa, 0, + (unsigned long)tri0, CB_IMA(hints))); +} + static inline void gru_vload(void *cb, unsigned long mem_addr, unsigned int tri0, unsigned char xtype, unsigned long nelem, unsigned long stride, unsigned long hints) |