[PATCH v5 07/17] powerpc/vas: Define and use common vas_window struct

Nicholas Piggin npiggin at gmail.com
Mon Jun 14 12:28:57 AEST 2021


Excerpts from Haren Myneni's message of June 13, 2021 8:58 pm:
> 
> Many elements in vas_struct are used on PowerNV and PowerVM
> platforms. vas_window is used for both TX and RX windows on
> PowerNV and for TX windows on PowerVM. So some elements are
> specific to these platforms.
> 
> So this patch defines common vas_window and platform
> specific window structs (pnv_vas_window on PowerNV). Also adds
> the corresponding changes in PowerNV vas code.
> 
> Signed-off-by: Haren Myneni <haren at linux.ibm.com>

Thanks for making this change, it must have been a lot of churn. Again, 
apologies for not picking up on it earlier. I think the end result is
nicer.

Reviewed-by: Nicholas Piggin <npiggin at gmail.com>

Thanks,
Nick

> ---
>  arch/powerpc/include/asm/vas.h              |  14 +-
>  arch/powerpc/platforms/powernv/vas-debug.c  |  27 ++--
>  arch/powerpc/platforms/powernv/vas-fault.c  |  20 +--
>  arch/powerpc/platforms/powernv/vas-trace.h  |   4 +-
>  arch/powerpc/platforms/powernv/vas-window.c | 161 +++++++++++---------
>  arch/powerpc/platforms/powernv/vas.h        |  44 +++---
>  6 files changed, 144 insertions(+), 126 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h
> index c1daab4cc205..1acf2b18c2d1 100644
> --- a/arch/powerpc/include/asm/vas.h
> +++ b/arch/powerpc/include/asm/vas.h
> @@ -10,8 +10,6 @@
>  #include <asm/icswx.h>
>  #include <uapi/asm/vas-api.h>
>  
> -struct vas_window;
> -
>  /*
>   * Min and max FIFO sizes are based on Version 1.05 Section 3.1.4.25
>   * (Local FIFO Size Register) of the VAS workbook.
> @@ -63,6 +61,18 @@ struct vas_user_win_ref {
>  	struct mm_struct *mm;	/* Linux process mm_struct */
>  };
>  
> +/*
> + * Common VAS window struct on PowerNV and PowerVM
> + */
> +struct vas_window {
> +	u32 winid;
> +	u32 wcreds_max;	/* Window credits */
> +	enum vas_cop_type cop;
> +	struct vas_user_win_ref task_ref;
> +	char *dbgname;
> +	struct dentry *dbgdir;
> +};
> +
>  /*
>   * User space window operations used for powernv and powerVM
>   */
> diff --git a/arch/powerpc/platforms/powernv/vas-debug.c b/arch/powerpc/platforms/powernv/vas-debug.c
> index 41fa90d2f4ab..3ce89a4b54be 100644
> --- a/arch/powerpc/platforms/powernv/vas-debug.c
> +++ b/arch/powerpc/platforms/powernv/vas-debug.c
> @@ -9,6 +9,7 @@
>  #include <linux/slab.h>
>  #include <linux/debugfs.h>
>  #include <linux/seq_file.h>
> +#include <asm/vas.h>
>  #include "vas.h"
>  
>  static struct dentry *vas_debugfs;
> @@ -28,7 +29,7 @@ static char *cop_to_str(int cop)
>  
>  static int info_show(struct seq_file *s, void *private)
>  {
> -	struct vas_window *window = s->private;
> +	struct pnv_vas_window *window = s->private;
>  
>  	mutex_lock(&vas_mutex);
>  
> @@ -36,9 +37,9 @@ static int info_show(struct seq_file *s, void *private)
>  	if (!window->hvwc_map)
>  		goto unlock;
>  
> -	seq_printf(s, "Type: %s, %s\n", cop_to_str(window->cop),
> +	seq_printf(s, "Type: %s, %s\n", cop_to_str(window->vas_win.cop),
>  					window->tx_win ? "Send" : "Receive");
> -	seq_printf(s, "Pid : %d\n", vas_window_pid(window));
> +	seq_printf(s, "Pid : %d\n", vas_window_pid(&window->vas_win));
>  
>  unlock:
>  	mutex_unlock(&vas_mutex);
> @@ -47,7 +48,7 @@ static int info_show(struct seq_file *s, void *private)
>  
>  DEFINE_SHOW_ATTRIBUTE(info);
>  
> -static inline void print_reg(struct seq_file *s, struct vas_window *win,
> +static inline void print_reg(struct seq_file *s, struct pnv_vas_window *win,
>  			char *name, u32 reg)
>  {
>  	seq_printf(s, "0x%016llx %s\n", read_hvwc_reg(win, name, reg), name);
> @@ -55,7 +56,7 @@ static inline void print_reg(struct seq_file *s, struct vas_window *win,
>  
>  static int hvwc_show(struct seq_file *s, void *private)
>  {
> -	struct vas_window *window = s->private;
> +	struct pnv_vas_window *window = s->private;
>  
>  	mutex_lock(&vas_mutex);
>  
> @@ -103,8 +104,10 @@ static int hvwc_show(struct seq_file *s, void *private)
>  
>  DEFINE_SHOW_ATTRIBUTE(hvwc);
>  
> -void vas_window_free_dbgdir(struct vas_window *window)
> +void vas_window_free_dbgdir(struct pnv_vas_window *pnv_win)
>  {
> +	struct vas_window *window =  &pnv_win->vas_win;
> +
>  	if (window->dbgdir) {
>  		debugfs_remove_recursive(window->dbgdir);
>  		kfree(window->dbgname);
> @@ -113,21 +116,21 @@ void vas_window_free_dbgdir(struct vas_window *window)
>  	}
>  }
>  
> -void vas_window_init_dbgdir(struct vas_window *window)
> +void vas_window_init_dbgdir(struct pnv_vas_window *window)
>  {
>  	struct dentry *d;
>  
>  	if (!window->vinst->dbgdir)
>  		return;
>  
> -	window->dbgname = kzalloc(16, GFP_KERNEL);
> -	if (!window->dbgname)
> +	window->vas_win.dbgname = kzalloc(16, GFP_KERNEL);
> +	if (!window->vas_win.dbgname)
>  		return;
>  
> -	snprintf(window->dbgname, 16, "w%d", window->winid);
> +	snprintf(window->vas_win.dbgname, 16, "w%d", window->vas_win.winid);
>  
> -	d = debugfs_create_dir(window->dbgname, window->vinst->dbgdir);
> -	window->dbgdir = d;
> +	d = debugfs_create_dir(window->vas_win.dbgname, window->vinst->dbgdir);
> +	window->vas_win.dbgdir = d;
>  
>  	debugfs_create_file("info", 0444, d, window, &info_fops);
>  	debugfs_create_file("hvwc", 0444, d, window, &hvwc_fops);
> diff --git a/arch/powerpc/platforms/powernv/vas-fault.c b/arch/powerpc/platforms/powernv/vas-fault.c
> index 2729ac541fb3..a7aabc18039e 100644
> --- a/arch/powerpc/platforms/powernv/vas-fault.c
> +++ b/arch/powerpc/platforms/powernv/vas-fault.c
> @@ -68,7 +68,7 @@ irqreturn_t vas_fault_thread_fn(int irq, void *data)
>  	struct vas_instance *vinst = data;
>  	struct coprocessor_request_block *crb, *entry;
>  	struct coprocessor_request_block buf;
> -	struct vas_window *window;
> +	struct pnv_vas_window *window;
>  	unsigned long flags;
>  	void *fifo;
>  
> @@ -153,7 +153,7 @@ irqreturn_t vas_fault_thread_fn(int irq, void *data)
>  			 * NX sees faults only with user space windows.
>  			 */
>  			if (window->user_win)
> -				vas_update_csb(crb, &window->task_ref);
> +				vas_update_csb(crb, &window->vas_win.task_ref);
>  			else
>  				WARN_ON_ONCE(!window->user_win);
>  
> @@ -199,6 +199,7 @@ irqreturn_t vas_fault_handler(int irq, void *dev_id)
>  int vas_setup_fault_window(struct vas_instance *vinst)
>  {
>  	struct vas_rx_win_attr attr;
> +	struct vas_window *win;
>  
>  	vinst->fault_fifo_size = VAS_FAULT_WIN_FIFO_SIZE;
>  	vinst->fault_fifo = kzalloc(vinst->fault_fifo_size, GFP_KERNEL);
> @@ -227,18 +228,17 @@ int vas_setup_fault_window(struct vas_instance *vinst)
>  	attr.lnotify_pid = mfspr(SPRN_PID);
>  	attr.lnotify_tid = mfspr(SPRN_PID);
>  
> -	vinst->fault_win = vas_rx_win_open(vinst->vas_id, VAS_COP_TYPE_FAULT,
> -					&attr);
> -
> -	if (IS_ERR(vinst->fault_win)) {
> -		pr_err("VAS: Error %ld opening FaultWin\n",
> -			PTR_ERR(vinst->fault_win));
> +	win = vas_rx_win_open(vinst->vas_id, VAS_COP_TYPE_FAULT, &attr);
> +	if (IS_ERR(win)) {
> +		pr_err("VAS: Error %ld opening FaultWin\n", PTR_ERR(win));
>  		kfree(vinst->fault_fifo);
> -		return PTR_ERR(vinst->fault_win);
> +		return PTR_ERR(win);
>  	}
>  
> +	vinst->fault_win = container_of(win, struct pnv_vas_window, vas_win);
> +
>  	pr_devel("VAS: Created FaultWin %d, LPID/PID/TID [%d/%d/%d]\n",
> -			vinst->fault_win->winid, attr.lnotify_lpid,
> +			vinst->fault_win->vas_win.winid, attr.lnotify_lpid,
>  			attr.lnotify_pid, attr.lnotify_tid);
>  
>  	return 0;
> diff --git a/arch/powerpc/platforms/powernv/vas-trace.h b/arch/powerpc/platforms/powernv/vas-trace.h
> index a449b9f0c12e..ca2e08f2ddc0 100644
> --- a/arch/powerpc/platforms/powernv/vas-trace.h
> +++ b/arch/powerpc/platforms/powernv/vas-trace.h
> @@ -80,7 +80,7 @@ TRACE_EVENT(	vas_tx_win_open,
>  TRACE_EVENT(	vas_paste_crb,
>  
>  		TP_PROTO(struct task_struct *tsk,
> -			struct vas_window *win),
> +			struct pnv_vas_window *win),
>  
>  		TP_ARGS(tsk, win),
>  
> @@ -96,7 +96,7 @@ TRACE_EVENT(	vas_paste_crb,
>  		TP_fast_assign(
>  			__entry->pid = tsk->pid;
>  			__entry->vasid = win->vinst->vas_id;
> -			__entry->winid = win->winid;
> +			__entry->winid = win->vas_win.winid;
>  			__entry->paste_kaddr = (unsigned long)win->paste_kaddr
>  		),
>  
> diff --git a/arch/powerpc/platforms/powernv/vas-window.c b/arch/powerpc/platforms/powernv/vas-window.c
> index 4222c9bdb8fe..95ee13f81bdc 100644
> --- a/arch/powerpc/platforms/powernv/vas-window.c
> +++ b/arch/powerpc/platforms/powernv/vas-window.c
> @@ -27,14 +27,14 @@
>   * Compute the paste address region for the window @window using the
>   * ->paste_base_addr and ->paste_win_id_shift we got from device tree.
>   */
> -void vas_win_paste_addr(struct vas_window *window, u64 *addr, int *len)
> +void vas_win_paste_addr(struct pnv_vas_window *window, u64 *addr, int *len)
>  {
>  	int winid;
>  	u64 base, shift;
>  
>  	base = window->vinst->paste_base_addr;
>  	shift = window->vinst->paste_win_id_shift;
> -	winid = window->winid;
> +	winid = window->vas_win.winid;
>  
>  	*addr  = base + (winid << shift);
>  	if (len)
> @@ -43,23 +43,23 @@ void vas_win_paste_addr(struct vas_window *window, u64 *addr, int *len)
>  	pr_debug("Txwin #%d: Paste addr 0x%llx\n", winid, *addr);
>  }
>  
> -static inline void get_hvwc_mmio_bar(struct vas_window *window,
> +static inline void get_hvwc_mmio_bar(struct pnv_vas_window *window,
>  			u64 *start, int *len)
>  {
>  	u64 pbaddr;
>  
>  	pbaddr = window->vinst->hvwc_bar_start;
> -	*start = pbaddr + window->winid * VAS_HVWC_SIZE;
> +	*start = pbaddr + window->vas_win.winid * VAS_HVWC_SIZE;
>  	*len = VAS_HVWC_SIZE;
>  }
>  
> -static inline void get_uwc_mmio_bar(struct vas_window *window,
> +static inline void get_uwc_mmio_bar(struct pnv_vas_window *window,
>  			u64 *start, int *len)
>  {
>  	u64 pbaddr;
>  
>  	pbaddr = window->vinst->uwc_bar_start;
> -	*start = pbaddr + window->winid * VAS_UWC_SIZE;
> +	*start = pbaddr + window->vas_win.winid * VAS_UWC_SIZE;
>  	*len = VAS_UWC_SIZE;
>  }
>  
> @@ -68,7 +68,7 @@ static inline void get_uwc_mmio_bar(struct vas_window *window,
>   * space. Unlike MMIO regions (map_mmio_region() below), paste region must
>   * be mapped cache-able and is only applicable to send windows.
>   */
> -static void *map_paste_region(struct vas_window *txwin)
> +static void *map_paste_region(struct pnv_vas_window *txwin)
>  {
>  	int len;
>  	void *map;
> @@ -76,7 +76,7 @@ static void *map_paste_region(struct vas_window *txwin)
>  	u64 start;
>  
>  	name = kasprintf(GFP_KERNEL, "window-v%d-w%d", txwin->vinst->vas_id,
> -				txwin->winid);
> +				txwin->vas_win.winid);
>  	if (!name)
>  		goto free_name;
>  
> @@ -133,7 +133,7 @@ static void unmap_region(void *addr, u64 start, int len)
>  /*
>   * Unmap the paste address region for a window.
>   */
> -static void unmap_paste_region(struct vas_window *window)
> +static void unmap_paste_region(struct pnv_vas_window *window)
>  {
>  	int len;
>  	u64 busaddr_start;
> @@ -154,7 +154,7 @@ static void unmap_paste_region(struct vas_window *window)
>   * path, just minimize the time we hold the mutex for now. We can add
>   * a per-instance mutex later if necessary.
>   */
> -static void unmap_winctx_mmio_bars(struct vas_window *window)
> +static void unmap_winctx_mmio_bars(struct pnv_vas_window *window)
>  {
>  	int len;
>  	void *uwc_map;
> @@ -187,7 +187,7 @@ static void unmap_winctx_mmio_bars(struct vas_window *window)
>   * OS/User Window Context (UWC) MMIO Base Address Region for the given window.
>   * Map these bus addresses and save the mapped kernel addresses in @window.
>   */
> -static int map_winctx_mmio_bars(struct vas_window *window)
> +static int map_winctx_mmio_bars(struct pnv_vas_window *window)
>  {
>  	int len;
>  	u64 start;
> @@ -215,7 +215,7 @@ static int map_winctx_mmio_bars(struct vas_window *window)
>   *	 registers are not sequential. And, we can only write to offsets
>   *	 with valid registers.
>   */
> -static void reset_window_regs(struct vas_window *window)
> +static void reset_window_regs(struct pnv_vas_window *window)
>  {
>  	write_hvwc_reg(window, VREG(LPID), 0ULL);
>  	write_hvwc_reg(window, VREG(PID), 0ULL);
> @@ -271,7 +271,7 @@ static void reset_window_regs(struct vas_window *window)
>   * want to add fields to vas_winctx and move the initialization to
>   * init_vas_winctx_regs().
>   */
> -static void init_xlate_regs(struct vas_window *window, bool user_win)
> +static void init_xlate_regs(struct pnv_vas_window *window, bool user_win)
>  {
>  	u64 lpcr, val;
>  
> @@ -336,7 +336,7 @@ static void init_xlate_regs(struct vas_window *window, bool user_win)
>   *
>   * TODO: Reserved (aka dedicated) send buffers are not supported yet.
>   */
> -static void init_rsvd_tx_buf_count(struct vas_window *txwin,
> +static void init_rsvd_tx_buf_count(struct pnv_vas_window *txwin,
>  				struct vas_winctx *winctx)
>  {
>  	write_hvwc_reg(txwin, VREG(TX_RSVD_BUF_COUNT), 0ULL);
> @@ -358,7 +358,7 @@ static void init_rsvd_tx_buf_count(struct vas_window *txwin,
>   *	as a one-time task? That could work for NX but what about other
>   *	receivers?  Let the receivers tell us the rx-fifo buffers for now.
>   */
> -static void init_winctx_regs(struct vas_window *window,
> +static void init_winctx_regs(struct pnv_vas_window *window,
>  			     struct vas_winctx *winctx)
>  {
>  	u64 val;
> @@ -520,10 +520,10 @@ static int vas_assign_window_id(struct ida *ida)
>  	return winid;
>  }
>  
> -static void vas_window_free(struct vas_window *window)
> +static void vas_window_free(struct pnv_vas_window *window)
>  {
> -	int winid = window->winid;
>  	struct vas_instance *vinst = window->vinst;
> +	int winid = window->vas_win.winid;
>  
>  	unmap_winctx_mmio_bars(window);
>  
> @@ -534,10 +534,10 @@ static void vas_window_free(struct vas_window *window)
>  	vas_release_window_id(&vinst->ida, winid);
>  }
>  
> -static struct vas_window *vas_window_alloc(struct vas_instance *vinst)
> +static struct pnv_vas_window *vas_window_alloc(struct vas_instance *vinst)
>  {
>  	int winid;
> -	struct vas_window *window;
> +	struct pnv_vas_window *window;
>  
>  	winid = vas_assign_window_id(&vinst->ida);
>  	if (winid < 0)
> @@ -548,7 +548,7 @@ static struct vas_window *vas_window_alloc(struct vas_instance *vinst)
>  		goto out_free;
>  
>  	window->vinst = vinst;
> -	window->winid = winid;
> +	window->vas_win.winid = winid;
>  
>  	if (map_winctx_mmio_bars(window))
>  		goto out_free;
> @@ -563,7 +563,7 @@ static struct vas_window *vas_window_alloc(struct vas_instance *vinst)
>  	return ERR_PTR(-ENOMEM);
>  }
>  
> -static void put_rx_win(struct vas_window *rxwin)
> +static void put_rx_win(struct pnv_vas_window *rxwin)
>  {
>  	/* Better not be a send window! */
>  	WARN_ON_ONCE(rxwin->tx_win);
> @@ -579,10 +579,11 @@ static void put_rx_win(struct vas_window *rxwin)
>   *
>   * NOTE: We access ->windows[] table and assume that vinst->mutex is held.
>   */
> -static struct vas_window *get_user_rxwin(struct vas_instance *vinst, u32 pswid)
> +static struct pnv_vas_window *get_user_rxwin(struct vas_instance *vinst,
> +					     u32 pswid)
>  {
>  	int vasid, winid;
> -	struct vas_window *rxwin;
> +	struct pnv_vas_window *rxwin;
>  
>  	decode_pswid(pswid, &vasid, &winid);
>  
> @@ -591,7 +592,7 @@ static struct vas_window *get_user_rxwin(struct vas_instance *vinst, u32 pswid)
>  
>  	rxwin = vinst->windows[winid];
>  
> -	if (!rxwin || rxwin->tx_win || rxwin->cop != VAS_COP_TYPE_FTW)
> +	if (!rxwin || rxwin->tx_win || rxwin->vas_win.cop != VAS_COP_TYPE_FTW)
>  		return ERR_PTR(-EINVAL);
>  
>  	return rxwin;
> @@ -603,10 +604,10 @@ static struct vas_window *get_user_rxwin(struct vas_instance *vinst, u32 pswid)
>   *
>   * See also function header of set_vinst_win().
>   */
> -static struct vas_window *get_vinst_rxwin(struct vas_instance *vinst,
> +static struct pnv_vas_window *get_vinst_rxwin(struct vas_instance *vinst,
>  			enum vas_cop_type cop, u32 pswid)
>  {
> -	struct vas_window *rxwin;
> +	struct pnv_vas_window *rxwin;
>  
>  	mutex_lock(&vinst->mutex);
>  
> @@ -639,9 +640,9 @@ static struct vas_window *get_vinst_rxwin(struct vas_instance *vinst,
>   * window, we also save the window in the ->rxwin[] table.
>   */
>  static void set_vinst_win(struct vas_instance *vinst,
> -			struct vas_window *window)
> +			struct pnv_vas_window *window)
>  {
> -	int id = window->winid;
> +	int id = window->vas_win.winid;
>  
>  	mutex_lock(&vinst->mutex);
>  
> @@ -650,8 +651,8 @@ static void set_vinst_win(struct vas_instance *vinst,
>  	 * unless its a user (FTW) window.
>  	 */
>  	if (!window->user_win && !window->tx_win) {
> -		WARN_ON_ONCE(vinst->rxwin[window->cop]);
> -		vinst->rxwin[window->cop] = window;
> +		WARN_ON_ONCE(vinst->rxwin[window->vas_win.cop]);
> +		vinst->rxwin[window->vas_win.cop] = window;
>  	}
>  
>  	WARN_ON_ONCE(vinst->windows[id] != NULL);
> @@ -664,16 +665,16 @@ static void set_vinst_win(struct vas_instance *vinst,
>   * Clear this window from the table(s) of windows for this VAS instance.
>   * See also function header of set_vinst_win().
>   */
> -static void clear_vinst_win(struct vas_window *window)
> +static void clear_vinst_win(struct pnv_vas_window *window)
>  {
> -	int id = window->winid;
> +	int id = window->vas_win.winid;
>  	struct vas_instance *vinst = window->vinst;
>  
>  	mutex_lock(&vinst->mutex);
>  
>  	if (!window->user_win && !window->tx_win) {
> -		WARN_ON_ONCE(!vinst->rxwin[window->cop]);
> -		vinst->rxwin[window->cop] = NULL;
> +		WARN_ON_ONCE(!vinst->rxwin[window->vas_win.cop]);
> +		vinst->rxwin[window->vas_win.cop] = NULL;
>  	}
>  
>  	WARN_ON_ONCE(vinst->windows[id] != window);
> @@ -682,7 +683,7 @@ static void clear_vinst_win(struct vas_window *window)
>  	mutex_unlock(&vinst->mutex);
>  }
>  
> -static void init_winctx_for_rxwin(struct vas_window *rxwin,
> +static void init_winctx_for_rxwin(struct pnv_vas_window *rxwin,
>  			struct vas_rx_win_attr *rxattr,
>  			struct vas_winctx *winctx)
>  {
> @@ -703,7 +704,7 @@ static void init_winctx_for_rxwin(struct vas_window *rxwin,
>  
>  	winctx->rx_fifo = rxattr->rx_fifo;
>  	winctx->rx_fifo_size = rxattr->rx_fifo_size;
> -	winctx->wcreds_max = rxwin->wcreds_max;
> +	winctx->wcreds_max = rxwin->vas_win.wcreds_max;
>  	winctx->pin_win = rxattr->pin_win;
>  
>  	winctx->nx_win = rxattr->nx_win;
> @@ -852,7 +853,7 @@ EXPORT_SYMBOL_GPL(vas_init_rx_win_attr);
>  struct vas_window *vas_rx_win_open(int vasid, enum vas_cop_type cop,
>  			struct vas_rx_win_attr *rxattr)
>  {
> -	struct vas_window *rxwin;
> +	struct pnv_vas_window *rxwin;
>  	struct vas_winctx winctx;
>  	struct vas_instance *vinst;
>  
> @@ -871,21 +872,21 @@ struct vas_window *vas_rx_win_open(int vasid, enum vas_cop_type cop,
>  	rxwin = vas_window_alloc(vinst);
>  	if (IS_ERR(rxwin)) {
>  		pr_devel("Unable to allocate memory for Rx window\n");
> -		return rxwin;
> +		return (struct vas_window *)rxwin;
>  	}
>  
>  	rxwin->tx_win = false;
>  	rxwin->nx_win = rxattr->nx_win;
>  	rxwin->user_win = rxattr->user_win;
> -	rxwin->cop = cop;
> -	rxwin->wcreds_max = rxattr->wcreds_max;
> +	rxwin->vas_win.cop = cop;
> +	rxwin->vas_win.wcreds_max = rxattr->wcreds_max;
>  
>  	init_winctx_for_rxwin(rxwin, rxattr, &winctx);
>  	init_winctx_regs(rxwin, &winctx);
>  
>  	set_vinst_win(vinst, rxwin);
>  
> -	return rxwin;
> +	return &rxwin->vas_win;
>  }
>  EXPORT_SYMBOL_GPL(vas_rx_win_open);
>  
> @@ -906,7 +907,7 @@ void vas_init_tx_win_attr(struct vas_tx_win_attr *txattr, enum vas_cop_type cop)
>  }
>  EXPORT_SYMBOL_GPL(vas_init_tx_win_attr);
>  
> -static void init_winctx_for_txwin(struct vas_window *txwin,
> +static void init_winctx_for_txwin(struct pnv_vas_window *txwin,
>  			struct vas_tx_win_attr *txattr,
>  			struct vas_winctx *winctx)
>  {
> @@ -927,7 +928,7 @@ static void init_winctx_for_txwin(struct vas_window *txwin,
>  	 */
>  	memset(winctx, 0, sizeof(struct vas_winctx));
>  
> -	winctx->wcreds_max = txwin->wcreds_max;
> +	winctx->wcreds_max = txwin->vas_win.wcreds_max;
>  
>  	winctx->user_win = txattr->user_win;
>  	winctx->nx_win = txwin->rxwin->nx_win;
> @@ -947,13 +948,13 @@ static void init_winctx_for_txwin(struct vas_window *txwin,
>  
>  	winctx->lpid = txattr->lpid;
>  	winctx->pidr = txattr->pidr;
> -	winctx->rx_win_id = txwin->rxwin->winid;
> +	winctx->rx_win_id = txwin->rxwin->vas_win.winid;
>  	/*
>  	 * IRQ and fault window setup is successful. Set fault window
>  	 * for the send window so that ready to handle faults.
>  	 */
>  	if (txwin->vinst->virq)
> -		winctx->fault_win_id = txwin->vinst->fault_win->winid;
> +		winctx->fault_win_id = txwin->vinst->fault_win->vas_win.winid;
>  
>  	winctx->dma_type = VAS_DMA_TYPE_INJECT;
>  	winctx->tc_mode = txattr->tc_mode;
> @@ -963,7 +964,8 @@ static void init_winctx_for_txwin(struct vas_window *txwin,
>  		winctx->irq_port = txwin->vinst->irq_port;
>  
>  	winctx->pswid = txattr->pswid ? txattr->pswid :
> -			encode_pswid(txwin->vinst->vas_id, txwin->winid);
> +			encode_pswid(txwin->vinst->vas_id,
> +			txwin->vas_win.winid);
>  }
>  
>  static bool tx_win_args_valid(enum vas_cop_type cop,
> @@ -994,8 +996,8 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
>  			struct vas_tx_win_attr *attr)
>  {
>  	int rc;
> -	struct vas_window *txwin;
> -	struct vas_window *rxwin;
> +	struct pnv_vas_window *txwin;
> +	struct pnv_vas_window *rxwin;
>  	struct vas_winctx winctx;
>  	struct vas_instance *vinst;
>  
> @@ -1021,7 +1023,7 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
>  	rxwin = get_vinst_rxwin(vinst, cop, attr->pswid);
>  	if (IS_ERR(rxwin)) {
>  		pr_devel("No RxWin for vasid %d, cop %d\n", vasid, cop);
> -		return rxwin;
> +		return (struct vas_window *)rxwin;
>  	}
>  
>  	txwin = vas_window_alloc(vinst);
> @@ -1030,12 +1032,12 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
>  		goto put_rxwin;
>  	}
>  
> -	txwin->cop = cop;
> +	txwin->vas_win.cop = cop;
>  	txwin->tx_win = 1;
>  	txwin->rxwin = rxwin;
>  	txwin->nx_win = txwin->rxwin->nx_win;
>  	txwin->user_win = attr->user_win;
> -	txwin->wcreds_max = attr->wcreds_max ?: VAS_WCREDS_DEFAULT;
> +	txwin->vas_win.wcreds_max = attr->wcreds_max ?: VAS_WCREDS_DEFAULT;
>  
>  	init_winctx_for_txwin(txwin, attr, &winctx);
>  
> @@ -1065,16 +1067,16 @@ struct vas_window *vas_tx_win_open(int vasid, enum vas_cop_type cop,
>  			rc = -ENODEV;
>  			goto free_window;
>  		}
> -		rc = get_vas_user_win_ref(&txwin->task_ref);
> +		rc = get_vas_user_win_ref(&txwin->vas_win.task_ref);
>  		if (rc)
>  			goto free_window;
>  
> -		vas_user_win_add_mm_context(&txwin->task_ref);
> +		vas_user_win_add_mm_context(&txwin->vas_win.task_ref);
>  	}
>  
>  	set_vinst_win(vinst, txwin);
>  
> -	return txwin;
> +	return &txwin->vas_win;
>  
>  free_window:
>  	vas_window_free(txwin);
> @@ -1093,12 +1095,14 @@ int vas_copy_crb(void *crb, int offset)
>  EXPORT_SYMBOL_GPL(vas_copy_crb);
>  
>  #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 *vwin, int offset, bool re)
>  {
> +	struct pnv_vas_window *txwin;
>  	int rc;
>  	void *addr;
>  	uint64_t val;
>  
> +	txwin = container_of(vwin, struct pnv_vas_window, vas_win);
>  	trace_vas_paste_crb(current, txwin);
>  
>  	/*
> @@ -1128,7 +1132,7 @@ int vas_paste_crb(struct vas_window *txwin, int offset, bool re)
>  	else
>  		rc = -EINVAL;
>  
> -	pr_debug("Txwin #%d: Msg count %llu\n", txwin->winid,
> +	pr_debug("Txwin #%d: Msg count %llu\n", txwin->vas_win.winid,
>  			read_hvwc_reg(txwin, VREG(LRFIFO_PUSH)));
>  
>  	return rc;
> @@ -1148,7 +1152,7 @@ EXPORT_SYMBOL_GPL(vas_paste_crb);
>   *	user space. (NX-842 driver waits for CSB and Fast thread-wakeup
>   *	doesn't use credit checking).
>   */
> -static void poll_window_credits(struct vas_window *window)
> +static void poll_window_credits(struct pnv_vas_window *window)
>  {
>  	u64 val;
>  	int creds, mode;
> @@ -1178,7 +1182,7 @@ static void poll_window_credits(struct vas_window *window)
>  	 *       and issue CRB Kill to stop all pending requests. Need only
>  	 *       if there is a bug in NX or fault handling in kernel.
>  	 */
> -	if (creds < window->wcreds_max) {
> +	if (creds < window->vas_win.wcreds_max) {
>  		val = 0;
>  		set_current_state(TASK_UNINTERRUPTIBLE);
>  		schedule_timeout(msecs_to_jiffies(10));
> @@ -1189,7 +1193,8 @@ static void poll_window_credits(struct vas_window *window)
>  		 */
>  		if (!(count % 1000))
>  			pr_warn_ratelimited("VAS: pid %d stuck. Waiting for credits returned for Window(%d). creds %d, Retries %d\n",
> -				vas_window_pid(window), window->winid,
> +				vas_window_pid(&window->vas_win),
> +				window->vas_win.winid,
>  				creds, count);
>  
>  		goto retry;
> @@ -1201,7 +1206,7 @@ static void poll_window_credits(struct vas_window *window)
>   * short time to queue a CRB, so window should not be busy for too long.
>   * Trying 5ms intervals.
>   */
> -static void poll_window_busy_state(struct vas_window *window)
> +static void poll_window_busy_state(struct pnv_vas_window *window)
>  {
>  	int busy;
>  	u64 val;
> @@ -1221,7 +1226,8 @@ static void poll_window_busy_state(struct vas_window *window)
>  		 */
>  		if (!(count % 1000))
>  			pr_warn_ratelimited("VAS: pid %d stuck. Window (ID=%d) is in busy state. Retries %d\n",
> -				vas_window_pid(window), window->winid, count);
> +				vas_window_pid(&window->vas_win),
> +				window->vas_win.winid, count);
>  
>  		goto retry;
>  	}
> @@ -1243,7 +1249,7 @@ static void poll_window_busy_state(struct vas_window *window)
>   *	casting out becomes necessary we should consider offloading the
>   *	job to a worker thread, so the window close can proceed quickly.
>   */
> -static void poll_window_castout(struct vas_window *window)
> +static void poll_window_castout(struct pnv_vas_window *window)
>  {
>  	/* stub for now */
>  }
> @@ -1252,7 +1258,7 @@ static void poll_window_castout(struct vas_window *window)
>   * Unpin and close a window so no new requests are accepted and the
>   * hardware can evict this window from cache if necessary.
>   */
> -static void unpin_close_window(struct vas_window *window)
> +static void unpin_close_window(struct pnv_vas_window *window)
>  {
>  	u64 val;
>  
> @@ -1274,11 +1280,15 @@ static void unpin_close_window(struct vas_window *window)
>   *
>   * Besides the hardware, kernel has some bookkeeping of course.
>   */
> -int vas_win_close(struct vas_window *window)
> +int vas_win_close(struct vas_window *vwin)
>  {
> -	if (!window)
> +	struct pnv_vas_window *window;
> +
> +	if (!vwin)
>  		return 0;
>  
> +	window = container_of(vwin, struct pnv_vas_window, vas_win);
> +
>  	if (!window->tx_win && atomic_read(&window->num_txwins) != 0) {
>  		pr_devel("Attempting to close an active Rx window!\n");
>  		WARN_ON_ONCE(1);
> @@ -1300,8 +1310,8 @@ int vas_win_close(struct vas_window *window)
>  	/* if send window, drop reference to matching receive window */
>  	if (window->tx_win) {
>  		if (window->user_win) {
> -			put_vas_user_win_ref(&window->task_ref);
> -			mm_context_remove_vas_window(window->task_ref.mm);
> +			put_vas_user_win_ref(&vwin->task_ref);
> +			mm_context_remove_vas_window(vwin->task_ref.mm);
>  		}
>  		put_rx_win(window->rxwin);
>  	}
> @@ -1334,7 +1344,7 @@ EXPORT_SYMBOL_GPL(vas_win_close);
>   * - The kernel with return credit on fault window after reading entry
>   *   from fault FIFO.
>   */
> -void vas_return_credit(struct vas_window *window, bool tx)
> +void vas_return_credit(struct pnv_vas_window *window, bool tx)
>  {
>  	uint64_t val;
>  
> @@ -1348,10 +1358,10 @@ void vas_return_credit(struct vas_window *window, bool tx)
>  	}
>  }
>  
> -struct vas_window *vas_pswid_to_window(struct vas_instance *vinst,
> +struct pnv_vas_window *vas_pswid_to_window(struct vas_instance *vinst,
>  		uint32_t pswid)
>  {
> -	struct vas_window *window;
> +	struct pnv_vas_window *window;
>  	int winid;
>  
>  	if (!pswid) {
> @@ -1388,11 +1398,11 @@ struct vas_window *vas_pswid_to_window(struct vas_instance *vinst,
>  	 * by NX).
>  	 */
>  	if (!window->tx_win || !window->user_win || !window->nx_win ||
> -			window->cop == VAS_COP_TYPE_FAULT ||
> -			window->cop == VAS_COP_TYPE_FTW) {
> +			window->vas_win.cop == VAS_COP_TYPE_FAULT ||
> +			window->vas_win.cop == VAS_COP_TYPE_FTW) {
>  		pr_err("PSWID decode: id %d, tx %d, user %d, nx %d, cop %d\n",
>  			winid, window->tx_win, window->user_win,
> -			window->nx_win, window->cop);
> +			window->nx_win, window->vas_win.cop);
>  		WARN_ON(1);
>  	}
>  
> @@ -1418,10 +1428,12 @@ static struct vas_window *vas_user_win_open(struct vas_tx_win_open_attr *uattr,
>  	return vas_tx_win_open(uattr->vas_id, cop_type, &txattr);
>  }
>  
> -static u64 vas_user_win_paste_addr(struct vas_window *win)
> +static u64 vas_user_win_paste_addr(struct vas_window *txwin)
>  {
> +	struct pnv_vas_window *win;
>  	u64 paste_addr;
>  
> +	win = container_of(txwin, struct pnv_vas_window, vas_win);
>  	vas_win_paste_addr(win, &paste_addr, NULL);
>  
>  	return paste_addr;
> @@ -1429,7 +1441,6 @@ static u64 vas_user_win_paste_addr(struct vas_window *win)
>  
>  static int vas_user_win_close(struct vas_window *txwin)
>  {
> -
>  	vas_win_close(txwin);
>  
>  	return 0;
> diff --git a/arch/powerpc/platforms/powernv/vas.h b/arch/powerpc/platforms/powernv/vas.h
> index f354dd5c51bd..e7f54007dbd0 100644
> --- a/arch/powerpc/platforms/powernv/vas.h
> +++ b/arch/powerpc/platforms/powernv/vas.h
> @@ -334,11 +334,11 @@ struct vas_instance {
>  	int fifo_in_progress;	/* To wake up thread or return IRQ_HANDLED */
>  	spinlock_t fault_lock;	/* Protects fifo_in_progress update */
>  	void *fault_fifo;
> -	struct vas_window *fault_win; /* Fault window */
> +	struct pnv_vas_window *fault_win; /* Fault window */
>  
>  	struct mutex mutex;
> -	struct vas_window *rxwin[VAS_COP_TYPE_MAX];
> -	struct vas_window *windows[VAS_WINDOWS_PER_CHIP];
> +	struct pnv_vas_window *rxwin[VAS_COP_TYPE_MAX];
> +	struct pnv_vas_window *windows[VAS_WINDOWS_PER_CHIP];
>  
>  	char *name;
>  	char *dbgname;
> @@ -346,30 +346,24 @@ struct vas_instance {
>  };
>  
>  /*
> - * In-kernel state a VAS window. One per window.
> + * In-kernel state a VAS window on PowerNV. One per window.
>   */
> -struct vas_window {
> +struct pnv_vas_window {
> +	struct vas_window vas_win;
>  	/* Fields common to send and receive windows */
>  	struct vas_instance *vinst;
> -	int winid;
>  	bool tx_win;		/* True if send window */
>  	bool nx_win;		/* True if NX window */
>  	bool user_win;		/* True if user space window */
>  	void *hvwc_map;		/* HV window context */
>  	void *uwc_map;		/* OS/User window context */
> -	int wcreds_max;		/* Window credits */
> -
> -	struct vas_user_win_ref task_ref;
> -	char *dbgname;
> -	struct dentry *dbgdir;
>  
>  	/* Fields applicable only to send windows */
>  	void *paste_kaddr;
>  	char *paste_addr_name;
> -	struct vas_window *rxwin;
> +	struct pnv_vas_window *rxwin;
>  
> -	/* Feilds applicable only to receive windows */
> -	enum vas_cop_type cop;
> +	/* Fields applicable only to receive windows */
>  	atomic_t num_txwins;
>  };
>  
> @@ -428,15 +422,15 @@ extern struct mutex vas_mutex;
>  extern struct vas_instance *find_vas_instance(int vasid);
>  extern void vas_init_dbgdir(void);
>  extern void vas_instance_init_dbgdir(struct vas_instance *vinst);
> -extern void vas_window_init_dbgdir(struct vas_window *win);
> -extern void vas_window_free_dbgdir(struct vas_window *win);
> +extern void vas_window_init_dbgdir(struct pnv_vas_window *win);
> +extern void vas_window_free_dbgdir(struct pnv_vas_window *win);
>  extern int vas_setup_fault_window(struct vas_instance *vinst);
>  extern irqreturn_t vas_fault_thread_fn(int irq, void *data);
>  extern irqreturn_t vas_fault_handler(int irq, void *dev_id);
> -extern void vas_return_credit(struct vas_window *window, bool tx);
> -extern struct vas_window *vas_pswid_to_window(struct vas_instance *vinst,
> +extern void vas_return_credit(struct pnv_vas_window *window, bool tx);
> +extern struct pnv_vas_window *vas_pswid_to_window(struct vas_instance *vinst,
>  						uint32_t pswid);
> -extern void vas_win_paste_addr(struct vas_window *window, u64 *addr,
> +extern void vas_win_paste_addr(struct pnv_vas_window *window, u64 *addr,
>  					int *len);
>  
>  static inline int vas_window_pid(struct vas_window *window)
> @@ -444,16 +438,16 @@ static inline int vas_window_pid(struct vas_window *window)
>  	return pid_vnr(window->task_ref.pid);
>  }
>  
> -static inline void vas_log_write(struct vas_window *win, char *name,
> +static inline void vas_log_write(struct pnv_vas_window *win, char *name,
>  			void *regptr, u64 val)
>  {
>  	if (val)
>  		pr_debug("%swin #%d: %s reg %p, val 0x%016llx\n",
> -				win->tx_win ? "Tx" : "Rx", win->winid, name,
> -				regptr, val);
> +				win->tx_win ? "Tx" : "Rx", win->vas_win.winid,
> +				name, regptr, val);
>  }
>  
> -static inline void write_uwc_reg(struct vas_window *win, char *name,
> +static inline void write_uwc_reg(struct pnv_vas_window *win, char *name,
>  			s32 reg, u64 val)
>  {
>  	void *regptr;
> @@ -464,7 +458,7 @@ static inline void write_uwc_reg(struct vas_window *win, char *name,
>  	out_be64(regptr, val);
>  }
>  
> -static inline void write_hvwc_reg(struct vas_window *win, char *name,
> +static inline void write_hvwc_reg(struct pnv_vas_window *win, char *name,
>  			s32 reg, u64 val)
>  {
>  	void *regptr;
> @@ -475,7 +469,7 @@ static inline void write_hvwc_reg(struct vas_window *win, char *name,
>  	out_be64(regptr, val);
>  }
>  
> -static inline u64 read_hvwc_reg(struct vas_window *win,
> +static inline u64 read_hvwc_reg(struct pnv_vas_window *win,
>  			char *name __maybe_unused, s32 reg)
>  {
>  	return in_be64(win->hvwc_map+reg);
> -- 
> 2.18.2
> 
> 
> 


More information about the Linuxppc-dev mailing list