Inter-revision diff: patch 10

Comparing v8 (message) to v3 (message)

--- v8
+++ v3
@@ -6,160 +6,182 @@
 Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
 
 ---
-Changelog[v8]:
-	- [Michael Ellerman] Drop vas_initialized() check; cleanup asm code,
-	  reuse existing macros, fix old references; add cr0 to clobbers
-
-Changelog[v4]
-	- Export symbols
 Changelog[v3]
 	- Map raw CR value from paste instruction into an error code.
+---
+ arch/powerpc/include/asm/vas.h  | 13 ++++++++
+ drivers/misc/vas/copy-paste.h   | 74 +++++++++++++++++++++++++++++++++++++++++
+ drivers/misc/vas/vas-internal.h | 14 ++++++++
+ drivers/misc/vas/vas-window.c   | 50 ++++++++++++++++++++++++++++
+ 4 files changed, 151 insertions(+)
+ create mode 100644 drivers/misc/vas/copy-paste.h
 
-Conflicts:
-	arch/powerpc/platforms/powernv/vas.h
----
- MAINTAINERS                                 |  1 +
- arch/powerpc/include/asm/ppc-opcode.h       |  2 ++
- arch/powerpc/include/asm/vas.h              | 12 ++++++++
- arch/powerpc/platforms/powernv/copy-paste.h | 46 ++++++++++++++++++++++++++++
- arch/powerpc/platforms/powernv/vas-window.c | 47 +++++++++++++++++++++++++++++
- arch/powerpc/platforms/powernv/vas.h        | 18 +++++++++--
- 6 files changed, 124 insertions(+), 2 deletions(-)
- create mode 100644 arch/powerpc/platforms/powernv/copy-paste.h
-
-diff --git a/MAINTAINERS b/MAINTAINERS
-index ec68732..624c67a 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -6442,6 +6442,7 @@ M:	Sukadev Bhattiprolu
- L:	linuxppc-dev@lists.ozlabs.org
- S:	Supported
- F:	arch/powerpc/platforms/powernv/vas*
-+F:	arch/powerpc/platforms/powernv/copy-paste.h
- F:	arch/powerpc/include/asm/vas.h
- F:	arch/powerpc/include/uapi/asm/vas.h
- 
-diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
-index fa9ebae..749336d 100644
---- a/arch/powerpc/include/asm/ppc-opcode.h
-+++ b/arch/powerpc/include/asm/ppc-opcode.h
-@@ -414,6 +414,8 @@
- 					___PPC_RB(b))
- #define PPC_MSGCLRP(b)		stringify_in_c(.long PPC_INST_MSGCLRP | \
- 					___PPC_RB(b))
-+#define PPC_PASTE(a, b)		stringify_in_c(.long PPC_INST_PASTE | \
-+					___PPC_RA(a) | ___PPC_RB(b))
- #define PPC_POPCNTB(a, s)	stringify_in_c(.long PPC_INST_POPCNTB | \
- 					__PPC_RA(a) | __PPC_RS(s))
- #define PPC_POPCNTD(a, s)	stringify_in_c(.long PPC_INST_POPCNTD | \
 diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h
-index efbdde5..dfc97f5 100644
+index ff8da98..1ef81ed 100644
 --- a/arch/powerpc/include/asm/vas.h
 +++ b/arch/powerpc/include/asm/vas.h
-@@ -145,4 +145,16 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
+@@ -132,6 +132,19 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
+ int vas_win_close(struct vas_window *win);
+ 
+ /*
++ * Copy the co-processor request block (CRB) @crb into the local L2 cache.
++ * For now, @offset must be 0 and @first must be true.
++ */
++extern int vas_copy_crb(void *crb, int offset, bool first);
++
++/*
++ * Paste a previously copied CRB (see vas_copy_crb()) from the L2 cache to
++ * the hardware address associated with the window @win. For now, @off must
++ * 0 and @last must be true. @re is expected/assumed to be true for NX windows.
++ */
++extern int vas_paste_crb(struct vas_window *win, int off, bool last, bool re);
++
++/*
+  * Get/Set bit fields
   */
- int vas_win_close(struct vas_window *win);
- 
-+/*
-+ * Copy the co-processor request block (CRB) @crb into the local L2 cache.
-+ */
-+extern int vas_copy_crb(void *crb, int offset);
-+
-+/*
-+ * Paste a previously copied CRB (see vas_copy_crb()) from the L2 cache to
-+ * the hardware address associated with the window @win. @re is expected/
-+ * assumed to be true for NX windows.
-+ */
-+extern int vas_paste_crb(struct vas_window *win, int offset, bool re);
-+
- #endif /* _MISC_VAS_H */
-diff --git a/arch/powerpc/platforms/powernv/copy-paste.h b/arch/powerpc/platforms/powernv/copy-paste.h
+ #define GET_FIELD(m, v)		(((v) & (m)) >> MASK_LSH(m))
+diff --git a/drivers/misc/vas/copy-paste.h b/drivers/misc/vas/copy-paste.h
 new file mode 100644
-index 0000000..c9a5036
+index 0000000..7783bb8
 --- /dev/null
-+++ b/arch/powerpc/platforms/powernv/copy-paste.h
-@@ -0,0 +1,46 @@
-+/*
-+ * Copyright 2016-17 IBM Corp.
++++ b/drivers/misc/vas/copy-paste.h
+@@ -0,0 +1,74 @@
++/*
++ * Copyright 2016 IBM Corp.
 + *
 + * 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 <asm/ppc-opcode.h>
-+
++
++/*
++ * Macros taken from tools/testing/selftests/powerpc/context_switch/cp_abort.c
++ */
++#define PASTE(RA, RB, L, RC) \
++	.long (0x7c00070c | (RA) << (31-15) | (RB) << (31-20) \
++			  | (L) << (31-10) | (RC) << (31-31))
++
++#define COPY(RA, RB, L) \
++	.long (0x7c00060c | (RA) << (31-15) | (RB) << (31-20) \
++			  | (L) << (31-10))
++
++#define CR0_FXM		"0x80"
 +#define CR0_SHIFT	28
 +#define CR0_MASK	0xF
 +/*
 + * Copy/paste instructions:
 + *
-+ *	copy RA,RB
++ *	copy RA,RB,L
 + *		Copy contents of address (RA) + effective_address(RB)
 + *		to internal copy-buffer.
 + *
-+ *	paste RA,RB
++ *		L == 1 indicates this is the first copy.
++ *
++ *		L == 0 indicates its a continuation of a prior first copy.
++ *
++ *	paste RA,RB,L
 + *		Paste contents of internal copy-buffer to the address
 + *		(RA) + effective_address(RB)
-+ */
-+static inline int vas_copy(void *crb, int offset)
-+{
-+	asm volatile(PPC_COPY(%0, %1)";"
++ *
++ *		L == 0 indicates its a continuation of a prior paste. i.e.
++ *		don't wait for the completion or update status.
++ *
++ *		L == 1 indicates this is the last paste in the group (i.e.
++ *		wait for the group to complete and update status in CR0).
++ *
++ *	For Power9, the L bit must be 'true' in both copy and paste.
++ */
++
++static inline int vas_copy(void *crb, int offset, int first)
++{
++	WARN_ON_ONCE(!first);
++
++	__asm__ __volatile(stringify_in_c(COPY(%0, %1, %2))";"
 +		:
-+		: "b" (offset), "b" (crb)
++		: "b" (offset), "b" (crb), "i" (1)
 +		: "memory");
 +
 +	return 0;
 +}
 +
-+static inline int vas_paste(void *paste_address, int offset)
-+{
-+	u32 cr;
++static inline int vas_paste(void *paste_address, int offset, int last)
++{
++	unsigned long long cr;
++
++	WARN_ON_ONCE(!last);
 +
 +	cr = 0;
-+	asm volatile(PPC_PASTE(%1, %2)";"
-+		"mfocrf %0, 0x80;"
++	__asm__ __volatile(stringify_in_c(PASTE(%1, %2, 1, 1))";"
++		"mfocrf %0," CR0_FXM ";"
 +		: "=r" (cr)
-+		: "b" (offset), "b" (paste_address)
-+		: "memory", "cr0");
-+
-+	return (cr >> CR0_SHIFT) & CR0_MASK;
-+}
-diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c
-index cd12e44..b02f26d 100644
---- a/arch/powerpc/platforms/powernv/vas-window.c
-+++ b/arch/powerpc/platforms/powernv/vas-window.c
-@@ -18,6 +18,7 @@
- #include <linux/cred.h>
- 
- #include "vas.h"
++		: "b" (paste_address), "b" (offset)
++		: "memory");
++
++	return cr;
++}
+diff --git a/drivers/misc/vas/vas-internal.h b/drivers/misc/vas/vas-internal.h
+index 1e5c94b..54e2a31 100644
+--- a/drivers/misc/vas/vas-internal.h
++++ b/drivers/misc/vas/vas-internal.h
+@@ -456,4 +456,18 @@ static inline uint64_t read_hvwc_reg(struct vas_window *win,
+ 	return in_be64(win->hvwc_map+reg);
+ }
+ 
++#ifdef vas_debug
++
++static void print_fifo_msg_count(struct vas_window *txwin)
++{
++	uint64_t read_hvwc_reg(struct vas_window *w, char *n, uint64_t o);
++	pr_devel("Winid %d, Msg count %llu\n", txwin->winid,
++			(uint64_t)read_hvwc_reg(txwin, VREG(LRFIFO_PUSH)));
++}
++#else	/* vas_debug */
++
++#define print_fifo_msg_count(window)
++
++#endif	/* vas_debug */
++
+ #endif
+diff --git a/drivers/misc/vas/vas-window.c b/drivers/misc/vas/vas-window.c
+index 9caf10b..fa2dd72 100644
+--- a/drivers/misc/vas/vas-window.c
++++ b/drivers/misc/vas/vas-window.c
+@@ -13,6 +13,7 @@
+ #include <linux/io.h>
+ #include <asm/vas.h>
+ #include "vas-internal.h"
 +#include "copy-paste.h"
  
- /*
-  * Compute the paste address region for the window @window using the
-@@ -997,6 +998,52 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
+ static int fault_winid;
+ 
+@@ -913,6 +914,55 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
+ 
  }
- EXPORT_SYMBOL_GPL(vas_tx_win_open);
- 
-+int vas_copy_crb(void *crb, int offset)
-+{
-+	return vas_copy(crb, offset);
-+}
-+EXPORT_SYMBOL_GPL(vas_copy_crb);
+ 
++int vas_copy_crb(void *crb, int offset, bool first)
++{
++	if (!vas_initialized)
++		return -1;
++
++	return vas_copy(crb, offset, first);
++}
 +
 +#define RMA_LSMP_REPORT_ENABLE PPC_BIT(53)
-+int vas_paste_crb(struct vas_window *txwin, int offset, bool re)
++int vas_paste_crb(struct vas_window *txwin, int offset, bool last, bool re)
 +{
 +	int rc;
++	uint64_t val;
 +	void *addr;
-+	uint64_t val;
-+
++
++	if (!vas_initialized)
++		return -1;
 +	/*
 +	 * Only NX windows are supported for now and hardware assumes
 +	 * report-enable flag is set for NX windows. Ensure software
 +	 * complies too.
 +	 */
-+	WARN_ON_ONCE(txwin->nx_win && !re);
++	WARN_ON_ONCE(!re);
 +
 +	addr = txwin->paste_kaddr;
 +	if (re) {
@@ -175,8 +197,8 @@
 +	 * Map the raw CR value from vas_paste() to an error code (there
 +	 * is just pass or fail for now though).
 +	 */
-+	rc = vas_paste(addr, offset);
-+	if (rc == 2)
++	rc = vas_paste(addr, offset, last);
++	if (rc == 0x20000000)
 +		rc = 0;
 +	else
 +		rc = -EINVAL;
@@ -185,47 +207,9 @@
 +
 +	return rc;
 +}
-+EXPORT_SYMBOL_GPL(vas_paste_crb);
 +
  static void poll_window_busy_state(struct vas_window *window)
  {
  	int busy;
-diff --git a/arch/powerpc/platforms/powernv/vas.h b/arch/powerpc/platforms/powernv/vas.h
-index d3e4f55..38dee5d 100644
---- a/arch/powerpc/platforms/powernv/vas.h
-+++ b/arch/powerpc/platforms/powernv/vas.h
-@@ -398,11 +398,11 @@ extern struct vas_instance *find_vas_instance(int vasid);
- #ifdef vas_debug
- static inline void dump_rx_win_attr(struct vas_rx_win_attr *attr)
- {
--	pr_err("VAS: fault %d, notify %d, intr %d early %d\n",
-+	pr_err("fault %d, notify %d, intr %d early %d\n",
- 			attr->fault_win, attr->notify_disable,
- 			attr->intr_disable, attr->notify_early);
- 
--	pr_err("VAS: rx_fifo_size %d, max value %d\n",
-+	pr_err("rx_fifo_size %d, max value %d\n",
- 				attr->rx_fifo_size, VAS_RX_FIFO_SIZE_MAX);
- }
- 
-@@ -450,4 +450,18 @@ static inline u64 read_hvwc_reg(struct vas_window *win,
- 	return in_be64(win->hvwc_map+reg);
- }
- 
-+#ifdef vas_debug
-+
-+static void print_fifo_msg_count(struct vas_window *txwin)
-+{
-+	uint64_t read_hvwc_reg(struct vas_window *w, char *n, uint64_t o);
-+	pr_devel("Winid %d, Msg count %llu\n", txwin->winid,
-+			(uint64_t)read_hvwc_reg(txwin, VREG(LRFIFO_PUSH)));
-+}
-+#else	/* vas_debug */
-+
-+#define print_fifo_msg_count(window)
-+
-+#endif	/* vas_debug */
-+
- #endif /* _VAS_H */
 -- 
 2.7.4
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help