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@xxxxxxxxxxxxx> 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@xxxxxxxxx> 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 > > >