Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 289750d1 authored by Robin Holt's avatar Robin Holt Committed by Linus Torvalds
Browse files

X86: uv: implement a gru_read_gpa kernel function



The BIOS has decided to store a pointer to the partition reserved page in
a scratch MMR.  The GRU is only able to read an MMR using a vload
instruction.  The gru_read_gpa() function will implemented.

Signed-off-by: default avatarRobin Holt <holt@sgi.com>
Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fae419f2
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -340,6 +340,19 @@ static inline void gru_start_instruction(struct gru_instruction *ins, int op32)
 *     	- nelem and stride are in elements
 *     	- tri0/tri1 is in bytes for the beginning of the data segment.
 */
static inline void gru_vload_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->tri0 = tri0;
	ins->op1_stride = 1;
	gru_start_instruction(ins, __opword(OP_VLOAD, 0, XTYPE_DW, iaa, 0,
					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)
+23 −0
Original line number Diff line number Diff line
@@ -857,6 +857,29 @@ EXPORT_SYMBOL_GPL(gru_get_next_message);

/* ---------------------- GRU DATA COPY FUNCTIONS ---------------------------*/

/*
 * Load a DW from a global GPA. The GPA can be a memory or MMR address.
 */
int gru_read_gpa(unsigned long *value, unsigned long gpa)
{
	void *cb;
	void *dsr;
	int ret, iaa;

	STAT(read_gpa);
	if (gru_get_cpu_resources(GRU_NUM_KERNEL_DSR_BYTES, &cb, &dsr))
		return MQE_BUG_NO_RESOURCES;
	iaa = gpa >> 62;
	gru_vload_phys(cb, gpa, gru_get_tri(dsr), iaa, IMA);
	ret = gru_wait(cb);
	if (ret == CBS_IDLE)
		*value = *(unsigned long *)dsr;
	gru_free_cpu_resources(cb, dsr);
	return ret;
}
EXPORT_SYMBOL_GPL(gru_read_gpa);


/*
 * Copy a block of data using the GRU resources
 */
+14 −0
Original line number Diff line number Diff line
@@ -130,6 +130,20 @@ extern void gru_free_message(struct gru_message_queue_desc *mqd,
extern void *gru_get_next_message(struct gru_message_queue_desc *mqd);


/*
 * Read a GRU global GPA. Source can be located in a remote partition.
 *
 *    Input:
 *    	value		memory address where MMR value is returned
 *    	gpa		source numalink physical address of GPA
 *
 *    Output:
 *	0		OK
 *	>0		error
 */
int gru_read_gpa(unsigned long *value, unsigned long gpa);


/*
 * Copy data using the GRU. Source or destination can be located in a remote
 * partition.
+1 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ static int statistics_show(struct seq_file *s, void *p)
	printstat(s, flush_tlb_gru_tgh);
	printstat(s, flush_tlb_gru_zero_asid);
	printstat(s, copy_gpa);
	printstat(s, read_gpa);
	printstat(s, mesq_receive);
	printstat(s, mesq_receive_none);
	printstat(s, mesq_send);
+1 −0
Original line number Diff line number Diff line
@@ -224,6 +224,7 @@ struct gru_stats_s {
	atomic_long_t flush_tlb_gru_zero_asid;

	atomic_long_t copy_gpa;
	atomic_long_t read_gpa;

	atomic_long_t mesq_receive;
	atomic_long_t mesq_receive_none;