On Thu, 2021-06-03 at 14:38 +1000, Nicholas Piggin wrote:
> Excerpts from Haren Myneni's message of May 21, 2021 7:33 pm:
> > Same vas_window struct is used on powerNV and pseries. So this
> > patch
> > changes in struct vas_window to support both platforms and also the
> > corresponding modifications in powerNV vas code.
> > 
> > On powerNV, vas_window is used for both TX and RX windows, whereas
> > only for TX windows on powerVM. So some elements are specific to
> > these platforms.
> > 
> > Signed-off-by: Haren Myneni <ha...@linux.ibm.com>
> > ---
> >  arch/powerpc/include/asm/vas.h              |  50 +++++++-
> >  arch/powerpc/platforms/powernv/vas-debug.c  |  12 +-
> >  arch/powerpc/platforms/powernv/vas-fault.c  |   4 +-
> >  arch/powerpc/platforms/powernv/vas-trace.h  |   6 +-
> >  arch/powerpc/platforms/powernv/vas-window.c | 129 +++++++++++-----
> > ----
> >  arch/powerpc/platforms/powernv/vas.h        |  38 +-----
> >  6 files changed, 135 insertions(+), 104 deletions(-)
> > 
> > diff --git a/arch/powerpc/include/asm/vas.h
> > b/arch/powerpc/include/asm/vas.h
> > index 2c1040f399d9..49bfb5be896d 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,54 @@ struct vas_user_win_ref {
> >     struct mm_struct *mm;   /* Linux process mm_struct */
> >  };
> >  
> > +/*
> > + * In-kernel state a VAS window. One per window.
> > + * powerVM: Used only for Tx windows.
> > + * powerNV: Used for both Tx and Rx windows.
> > + */
> > +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;
> > +   union {
> > +           /* powerNV specific data */
> > +           struct {
> > +                   void *vinst;    /* points to VAS instance
> > */
> > +                   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
> > */
> > +
> > +                   /* Fields applicable only to send windows */
> > +                   void *paste_kaddr;
> > +                   char *paste_addr_name;
> > +                   struct vas_window *rxwin;
> > +
> > +                   atomic_t num_txwins;    /* Only for receive
> > windows */
> > +           } pnv;
> > +           struct {
> > +                   u64 win_addr;   /* Physical paste address
> > */
> > +                   u8 win_type;    /* QoS or Default window */
> > +                   u8 status;
> > +                   u32 complete_irq;       /* Completion interrupt */
> > +                   u32 fault_irq;  /* Fault interrupt */
> > +                   u64 domain[6];  /* Associativity domain Ids
> > */
> > +                                   /* this window is allocated */
> > +                   u64 util;
> > +
> > +                   /* List of windows opened which is used for LPM
> > */
> > +                   struct list_head win_list;
> > +                   u64 flags;
> > +                   char *name;
> > +                   int fault_virq;
> > +           } lpar;
> > +   };
> > +};
> 
> The more typical way to do code like this is have the common bit as
> its 
> own struct, and then have the users embed it into their own structs.
> 
> 
> 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;
> };
> 
> struct pnv_vas_window {
>       struct vas_window vas_window;
> 
>       void *vinst;    /* points to VAS instance */
>       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 */
> 
>       /* Fields applicable only to send windows */
>       void *paste_kaddr;
>       char *paste_addr_name;
>       struct vas_window *rxwin;
> 
>       atomic_t num_txwins;    /* Only for receive windows */
> };
> 
> Which helps reusability / avoids churn (don't have to update the
> same 
> structure to add new functionality), slightly helps naming and union 
> size mismatches, helps with type checking, etc.
> 
> Maybe not a great benefit for your code as is which may not grow more
> users, but unless there are some good reasons for the unions I would 
> really consider changing to this style.

Defined platform specific data as union for the following reasons:
- vas_window address is saved for each file descriptor (fp-
>private_data). If we define separate structs for PowerNV and PowerVM,
'struct vas_window' has to be the first element which can add
confusion.
- vas-window is also used in the PowerNV driver. since exposed this
struct to the driver, thought clean way of exposing common vas-window. 
- Not wasting much memory on PowerNV. Max may be around 20 bytes /
window. 

Thanks
Haren
> 
> Thanks,
> Nick
> 
> > +           struct {
> > +                   u64 win_addr;   /* Physical paste address
> > */
> > +                   u8 win_type;    /* QoS or Default window */
> > +                   u8 status;
> > +                   u32 complete_irq;       /* Completion interrupt */
> > +                   u32 fault_irq;  /* Fault interrupt */
> > +                   u64 domain[6];  /* Associativity domain Ids
> > */
> > +                                   /* this window is allocated */
> > +                   u64 util;
> > +
> > +                   /* List of windows opened which is used for LPM
> > */
> > +                   struct list_head win_list;
> > +                   u64 flags;
> > +                   char *name;
> > +                   int fault_virq;
> > +           } lpar;
> > +   };
> > +};
> > +
> >  /*
> >   * 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..80f735449ab8 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;
> > @@ -33,11 +34,11 @@ static int info_show(struct seq_file *s, void
> > *private)
> >     mutex_lock(&vas_mutex);
> >  
> >     /* ensure window is not unmapped */
> > -   if (!window->hvwc_map)
> > +   if (!window->pnv.hvwc_map)
> >             goto unlock;
> >  
> >     seq_printf(s, "Type: %s, %s\n", cop_to_str(window->cop),
> > -                                   window->tx_win ? "Send" :
> > "Receive");
> > +                           window->pnv.tx_win ? "Send" :
> > "Receive");
> >     seq_printf(s, "Pid : %d\n", vas_window_pid(window));
> >  
> >  unlock:
> > @@ -60,7 +61,7 @@ static int hvwc_show(struct seq_file *s, void
> > *private)
> >     mutex_lock(&vas_mutex);
> >  
> >     /* ensure window is not unmapped */
> > -   if (!window->hvwc_map)
> > +   if (!window->pnv.hvwc_map)
> >             goto unlock;
> >  
> >     print_reg(s, window, VREG(LPID));
> > @@ -115,9 +116,10 @@ void vas_window_free_dbgdir(struct vas_window
> > *window)
> >  
> >  void vas_window_init_dbgdir(struct vas_window *window)
> >  {
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >     struct dentry *d;
> >  
> > -   if (!window->vinst->dbgdir)
> > +   if (!vinst->dbgdir)
> >             return;
> >  
> >     window->dbgname = kzalloc(16, GFP_KERNEL);
> > @@ -126,7 +128,7 @@ void vas_window_init_dbgdir(struct vas_window
> > *window)
> >  
> >     snprintf(window->dbgname, 16, "w%d", window->winid);
> >  
> > -   d = debugfs_create_dir(window->dbgname, window->vinst->dbgdir);
> > +   d = debugfs_create_dir(window->dbgname, vinst->dbgdir);
> >     window->dbgdir = d;
> >  
> >     debugfs_create_file("info", 0444, d, window, &info_fops);
> > diff --git a/arch/powerpc/platforms/powernv/vas-fault.c
> > b/arch/powerpc/platforms/powernv/vas-fault.c
> > index 2729ac541fb3..faaf5b110645 100644
> > --- a/arch/powerpc/platforms/powernv/vas-fault.c
> > +++ b/arch/powerpc/platforms/powernv/vas-fault.c
> > @@ -152,10 +152,10 @@ irqreturn_t vas_fault_thread_fn(int irq, void
> > *data)
> >                     /*
> >                      * NX sees faults only with user space windows.
> >                      */
> > -                   if (window->user_win)
> > +                   if (window->pnv.user_win)
> >                             vas_update_csb(crb, &window->task_ref);
> >                     else
> > -                           WARN_ON_ONCE(!window->user_win);
> > +                           WARN_ON_ONCE(!window->pnv.user_win);
> >  
> >                     /*
> >                      * Return credit for send window after
> > processing
> > diff --git a/arch/powerpc/platforms/powernv/vas-trace.h
> > b/arch/powerpc/platforms/powernv/vas-trace.h
> > index a449b9f0c12e..843aae37c07a 100644
> > --- a/arch/powerpc/platforms/powernv/vas-trace.h
> > +++ b/arch/powerpc/platforms/powernv/vas-trace.h
> > @@ -95,9 +95,11 @@ TRACE_EVENT(     vas_paste_crb,
> >  
> >             TP_fast_assign(
> >                     __entry->pid = tsk->pid;
> > -                   __entry->vasid = win->vinst->vas_id;
> > +                   __entry->vasid =
> > +                           ((struct vas_instance *)win-
> > >pnv.vinst)->vas_id;
> >                     __entry->winid = win->winid;
> > -                   __entry->paste_kaddr = (unsigned long)win-
> > >paste_kaddr
> > +                   __entry->paste_kaddr =
> > +                           (unsigned long)win->pnv.paste_kaddr;
> >             ),
> >  
> >             TP_printk("pid=%d, vasid=%d, winid=%d,
> > paste_kaddr=0x%016lx\n",
> > diff --git a/arch/powerpc/platforms/powernv/vas-window.c
> > b/arch/powerpc/platforms/powernv/vas-window.c
> > index ffd619e5a218..6ce8ee4b3371 100644
> > --- a/arch/powerpc/platforms/powernv/vas-window.c
> > +++ b/arch/powerpc/platforms/powernv/vas-window.c
> > @@ -31,9 +31,10 @@ void vas_win_paste_addr(struct vas_window
> > *window, u64 *addr, int *len)
> >  {
> >     int winid;
> >     u64 base, shift;
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >  
> > -   base = window->vinst->paste_base_addr;
> > -   shift = window->vinst->paste_win_id_shift;
> > +   base = vinst->paste_base_addr;
> > +   shift = vinst->paste_win_id_shift;
> >     winid = window->winid;
> >  
> >     *addr  = base + (winid << shift);
> > @@ -46,9 +47,10 @@ void vas_win_paste_addr(struct vas_window
> > *window, u64 *addr, int *len)
> >  static inline void get_hvwc_mmio_bar(struct vas_window *window,
> >                     u64 *start, int *len)
> >  {
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >     u64 pbaddr;
> >  
> > -   pbaddr = window->vinst->hvwc_bar_start;
> > +   pbaddr = vinst->hvwc_bar_start;
> >     *start = pbaddr + window->winid * VAS_HVWC_SIZE;
> >     *len = VAS_HVWC_SIZE;
> >  }
> > @@ -56,9 +58,10 @@ static inline void get_hvwc_mmio_bar(struct
> > vas_window *window,
> >  static inline void get_uwc_mmio_bar(struct vas_window *window,
> >                     u64 *start, int *len)
> >  {
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >     u64 pbaddr;
> >  
> > -   pbaddr = window->vinst->uwc_bar_start;
> > +   pbaddr = vinst->uwc_bar_start;
> >     *start = pbaddr + window->winid * VAS_UWC_SIZE;
> >     *len = VAS_UWC_SIZE;
> >  }
> > @@ -74,13 +77,14 @@ static void *map_paste_region(struct vas_window
> > *txwin)
> >     void *map;
> >     char *name;
> >     u64 start;
> > +   struct vas_instance *vinst = txwin->pnv.vinst;
> >  
> > -   name = kasprintf(GFP_KERNEL, "window-v%d-w%d", txwin->vinst-
> > >vas_id,
> > +   name = kasprintf(GFP_KERNEL, "window-v%d-w%d", vinst->vas_id,
> >                             txwin->winid);
> >     if (!name)
> >             goto free_name;
> >  
> > -   txwin->paste_addr_name = name;
> > +   txwin->pnv.paste_addr_name = name;
> >     vas_win_paste_addr(txwin, &start, &len);
> >  
> >     if (!request_mem_region(start, len, name)) {
> > @@ -138,12 +142,12 @@ static void unmap_paste_region(struct
> > vas_window *window)
> >     int len;
> >     u64 busaddr_start;
> >  
> > -   if (window->paste_kaddr) {
> > +   if (window->pnv.paste_kaddr) {
> >             vas_win_paste_addr(window, &busaddr_start, &len);
> > -           unmap_region(window->paste_kaddr, busaddr_start, len);
> > -           window->paste_kaddr = NULL;
> > -           kfree(window->paste_addr_name);
> > -           window->paste_addr_name = NULL;
> > +           unmap_region(window->pnv.paste_kaddr, busaddr_start,
> > len);
> > +           window->pnv.paste_kaddr = NULL;
> > +           kfree(window->pnv.paste_addr_name);
> > +           window->pnv.paste_addr_name = NULL;
> >     }
> >  }
> >  
> > @@ -163,11 +167,11 @@ static void unmap_winctx_mmio_bars(struct
> > vas_window *window)
> >  
> >     mutex_lock(&vas_mutex);
> >  
> > -   hvwc_map = window->hvwc_map;
> > -   window->hvwc_map = NULL;
> > +   hvwc_map = window->pnv.hvwc_map;
> > +   window->pnv.hvwc_map = NULL;
> >  
> > -   uwc_map = window->uwc_map;
> > -   window->uwc_map = NULL;
> > +   uwc_map = window->pnv.uwc_map;
> > +   window->pnv.uwc_map = NULL;
> >  
> >     mutex_unlock(&vas_mutex);
> >  
> > @@ -193,12 +197,12 @@ static int map_winctx_mmio_bars(struct
> > vas_window *window)
> >     u64 start;
> >  
> >     get_hvwc_mmio_bar(window, &start, &len);
> > -   window->hvwc_map = map_mmio_region("HVWCM_Window", start, len);
> > +   window->pnv.hvwc_map = map_mmio_region("HVWCM_Window", start,
> > len);
> >  
> >     get_uwc_mmio_bar(window, &start, &len);
> > -   window->uwc_map = map_mmio_region("UWCM_Window", start, len);
> > +   window->pnv.uwc_map = map_mmio_region("UWCM_Window", start,
> > len);
> >  
> > -   if (!window->hvwc_map || !window->uwc_map) {
> > +   if (!window->pnv.hvwc_map || !window->pnv.uwc_map) {
> >             unmap_winctx_mmio_bars(window);
> >             return -1;
> >     }
> > @@ -523,7 +527,7 @@ static int vas_assign_window_id(struct ida
> > *ida)
> >  static void vas_window_free(struct vas_window *window)
> >  {
> >     int winid = window->winid;
> > -   struct vas_instance *vinst = window->vinst;
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >  
> >     unmap_winctx_mmio_bars(window);
> >  
> > @@ -547,7 +551,7 @@ static struct vas_window
> > *vas_window_alloc(struct vas_instance *vinst)
> >     if (!window)
> >             goto out_free;
> >  
> > -   window->vinst = vinst;
> > +   window->pnv.vinst = vinst;
> >     window->winid = winid;
> >  
> >     if (map_winctx_mmio_bars(window))
> > @@ -566,9 +570,9 @@ static struct vas_window
> > *vas_window_alloc(struct vas_instance *vinst)
> >  static void put_rx_win(struct vas_window *rxwin)
> >  {
> >     /* Better not be a send window! */
> > -   WARN_ON_ONCE(rxwin->tx_win);
> > +   WARN_ON_ONCE(rxwin->pnv.tx_win);
> >  
> > -   atomic_dec(&rxwin->num_txwins);
> > +   atomic_dec(&rxwin->pnv.num_txwins);
> >  }
> >  
> >  /*
> > @@ -591,7 +595,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->pnv.tx_win || rxwin->cop !=
> > VAS_COP_TYPE_FTW)
> >             return ERR_PTR(-EINVAL);
> >  
> >     return rxwin;
> > @@ -616,7 +620,7 @@ static struct vas_window
> > *get_vinst_rxwin(struct vas_instance *vinst,
> >             rxwin = vinst->rxwin[cop] ?: ERR_PTR(-EINVAL);
> >  
> >     if (!IS_ERR(rxwin))
> > -           atomic_inc(&rxwin->num_txwins);
> > +           atomic_inc(&rxwin->pnv.num_txwins);
> >  
> >     mutex_unlock(&vinst->mutex);
> >  
> > @@ -649,7 +653,7 @@ static void set_vinst_win(struct vas_instance
> > *vinst,
> >      * There should only be one receive window for a coprocessor
> > type
> >      * unless its a user (FTW) window.
> >      */
> > -   if (!window->user_win && !window->tx_win) {
> > +   if (!window->pnv.user_win && !window->pnv.tx_win) {
> >             WARN_ON_ONCE(vinst->rxwin[window->cop]);
> >             vinst->rxwin[window->cop] = window;
> >     }
> > @@ -667,11 +671,11 @@ static void set_vinst_win(struct vas_instance
> > *vinst,
> >  static void clear_vinst_win(struct vas_window *window)
> >  {
> >     int id = window->winid;
> > -   struct vas_instance *vinst = window->vinst;
> > +   struct vas_instance *vinst = window->pnv.vinst;
> >  
> >     mutex_lock(&vinst->mutex);
> >  
> > -   if (!window->user_win && !window->tx_win) {
> > +   if (!window->pnv.user_win && !window->pnv.tx_win) {
> >             WARN_ON_ONCE(!vinst->rxwin[window->cop]);
> >             vinst->rxwin[window->cop] = NULL;
> >     }
> > @@ -686,6 +690,8 @@ static void init_winctx_for_rxwin(struct
> > vas_window *rxwin,
> >                     struct vas_rx_win_attr *rxattr,
> >                     struct vas_winctx *winctx)
> >  {
> > +   struct vas_instance *vinst;
> > +
> >     /*
> >      * We first zero (memset()) all fields and only set non-zero
> > fields.
> >      * Following fields are 0/false but maybe deserve a comment:
> > @@ -750,8 +756,9 @@ static void init_winctx_for_rxwin(struct
> > vas_window *rxwin,
> >  
> >     winctx->min_scope = VAS_SCOPE_LOCAL;
> >     winctx->max_scope = VAS_SCOPE_VECTORED_GROUP;
> > -   if (rxwin->vinst->virq)
> > -           winctx->irq_port = rxwin->vinst->irq_port;
> > +   vinst = rxwin->pnv.vinst;
> > +   if (vinst->virq)
> > +           winctx->irq_port = vinst->irq_port;
> >  }
> >  
> >  static bool rx_win_args_valid(enum vas_cop_type cop,
> > @@ -874,9 +881,9 @@ struct vas_window *vas_rx_win_open(int vasid,
> > enum vas_cop_type cop,
> >             return rxwin;
> >     }
> >  
> > -   rxwin->tx_win = false;
> > -   rxwin->nx_win = rxattr->nx_win;
> > -   rxwin->user_win = rxattr->user_win;
> > +   rxwin->pnv.tx_win = false;
> > +   rxwin->pnv.nx_win = rxattr->nx_win;
> > +   rxwin->pnv.user_win = rxattr->user_win;
> >     rxwin->cop = cop;
> >     rxwin->wcreds_max = rxattr->wcreds_max;
> >  
> > @@ -910,6 +917,8 @@ static void init_winctx_for_txwin(struct
> > vas_window *txwin,
> >                     struct vas_tx_win_attr *txattr,
> >                     struct vas_winctx *winctx)
> >  {
> > +   struct vas_instance *vinst = txwin->pnv.vinst;
> > +
> >     /*
> >      * We first zero all fields and only set non-zero ones.
> > Following
> >      * are some fields set to 0/false for the stated reason:
> > @@ -930,7 +939,7 @@ static void init_winctx_for_txwin(struct
> > vas_window *txwin,
> >     winctx->wcreds_max = txwin->wcreds_max;
> >  
> >     winctx->user_win = txattr->user_win;
> > -   winctx->nx_win = txwin->rxwin->nx_win;
> > +   winctx->nx_win = txwin->pnv.rxwin->pnv.nx_win;
> >     winctx->pin_win = txattr->pin_win;
> >     winctx->rej_no_credit = txattr->rej_no_credit;
> >     winctx->rsvd_txbuf_enable = txattr->rsvd_txbuf_enable;
> > @@ -947,23 +956,23 @@ 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->pnv.rxwin->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;
> > +   if (vinst->virq)
> > +           winctx->fault_win_id = vinst->fault_win->winid;
> >  
> >     winctx->dma_type = VAS_DMA_TYPE_INJECT;
> >     winctx->tc_mode = txattr->tc_mode;
> >     winctx->min_scope = VAS_SCOPE_LOCAL;
> >     winctx->max_scope = VAS_SCOPE_VECTORED_GROUP;
> > -   if (txwin->vinst->virq)
> > -           winctx->irq_port = txwin->vinst->irq_port;
> > +   if (vinst->virq)
> > +           winctx->irq_port = vinst->irq_port;
> >  
> >     winctx->pswid = txattr->pswid ? txattr->pswid :
> > -                   encode_pswid(txwin->vinst->vas_id, txwin-
> > >winid);
> > +                   encode_pswid(vinst->vas_id, txwin->winid);
> >  }
> >  
> >  static bool tx_win_args_valid(enum vas_cop_type cop,
> > @@ -1031,10 +1040,10 @@ struct vas_window *vas_tx_win_open(int
> > vasid, enum vas_cop_type cop,
> >     }
> >  
> >     txwin->cop = cop;
> > -   txwin->tx_win = 1;
> > -   txwin->rxwin = rxwin;
> > -   txwin->nx_win = txwin->rxwin->nx_win;
> > -   txwin->user_win = attr->user_win;
> > +   txwin->pnv.tx_win = 1;
> > +   txwin->pnv.rxwin = rxwin;
> > +   txwin->pnv.nx_win = txwin->pnv.rxwin->pnv.nx_win;
> > +   txwin->pnv.user_win = attr->user_win;
> >     txwin->wcreds_max = attr->wcreds_max ?: VAS_WCREDS_DEFAULT;
> >  
> >     init_winctx_for_txwin(txwin, attr, &winctx);
> > @@ -1049,10 +1058,10 @@ struct vas_window *vas_tx_win_open(int
> > vasid, enum vas_cop_type cop,
> >      * NOTE: If kernel ever resubmits a user CRB after handling a
> > page
> >      *       fault, we will need to map this into kernel as well.
> >      */
> > -   if (!txwin->user_win) {
> > -           txwin->paste_kaddr = map_paste_region(txwin);
> > -           if (IS_ERR(txwin->paste_kaddr)) {
> > -                   rc = PTR_ERR(txwin->paste_kaddr);
> > +   if (!txwin->pnv.user_win) {
> > +           txwin->pnv.paste_kaddr = map_paste_region(txwin);
> > +           if (IS_ERR(txwin->pnv.paste_kaddr)) {
> > +                   rc = PTR_ERR(txwin->pnv.paste_kaddr);
> >                     goto free_window;
> >             }
> >     } else {
> > @@ -1104,9 +1113,9 @@ int vas_paste_crb(struct vas_window *txwin,
> > int offset, bool re)
> >      * report-enable flag is set for NX windows. Ensure software
> >      * complies too.
> >      */
> > -   WARN_ON_ONCE(txwin->nx_win && !re);
> > +   WARN_ON_ONCE(txwin->pnv.nx_win && !re);
> >  
> > -   addr = txwin->paste_kaddr;
> > +   addr = txwin->pnv.paste_kaddr;
> >     if (re) {
> >             /*
> >              * Set the REPORT_ENABLE bit (equivalent to writing
> > @@ -1153,7 +1162,7 @@ static void poll_window_credits(struct
> > vas_window *window)
> >     int count = 0;
> >  
> >     val = read_hvwc_reg(window, VREG(WINCTL));
> > -   if (window->tx_win)
> > +   if (window->pnv.tx_win)
> >             mode = GET_FIELD(VAS_WINCTL_TX_WCRED_MODE, val);
> >     else
> >             mode = GET_FIELD(VAS_WINCTL_RX_WCRED_MODE, val);
> > @@ -1161,7 +1170,7 @@ static void poll_window_credits(struct
> > vas_window *window)
> >     if (!mode)
> >             return;
> >  retry:
> > -   if (window->tx_win) {
> > +   if (window->pnv.tx_win) {
> >             val = read_hvwc_reg(window, VREG(TX_WCRED));
> >             creds = GET_FIELD(VAS_TX_WCRED, val);
> >     } else {
> > @@ -1277,7 +1286,7 @@ int vas_win_close(struct vas_window *window)
> >     if (!window)
> >             return 0;
> >  
> > -   if (!window->tx_win && atomic_read(&window->num_txwins) != 0) {
> > +   if (!window->pnv.tx_win && atomic_read(&window->pnv.num_txwins) 
> > != 0) {
> >             pr_devel("Attempting to close an active Rx window!\n");
> >             WARN_ON_ONCE(1);
> >             return -EBUSY;
> > @@ -1296,11 +1305,11 @@ int vas_win_close(struct vas_window
> > *window)
> >     poll_window_castout(window);
> >  
> >     /* if send window, drop reference to matching receive window */
> > -   if (window->tx_win) {
> > -           if (window->user_win)
> > +   if (window->pnv.tx_win) {
> > +           if (window->pnv.user_win)
> >                     vas_drop_reference_pid_mm(&window->task_ref);
> >  
> > -           put_rx_win(window->rxwin);
> > +           put_rx_win(window->pnv.rxwin);
> >     }
> >  
> >     vas_window_free(window);
> > @@ -1384,12 +1393,12 @@ struct vas_window
> > *vas_pswid_to_window(struct vas_instance *vinst,
> >      * since their CRBs are ignored (not queued on FIFO or
> > processed
> >      * by NX).
> >      */
> > -   if (!window->tx_win || !window->user_win || !window->nx_win ||
> > -                   window->cop == VAS_COP_TYPE_FAULT ||
> > -                   window->cop == VAS_COP_TYPE_FTW) {
> > +   if (!window->pnv.tx_win || !window->pnv.user_win ||
> > +           !window->pnv.nx_win || window->cop ==
> > VAS_COP_TYPE_FAULT ||
> > +           window->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);
> > +                   winid, window->pnv.tx_win, window-
> > >pnv.user_win,
> > +                   window->pnv.nx_win, window->cop);
> >             WARN_ON(1);
> >     }
> >  
> > diff --git a/arch/powerpc/platforms/powernv/vas.h
> > b/arch/powerpc/platforms/powernv/vas.h
> > index f354dd5c51bd..f2d9daff3d82 100644
> > --- a/arch/powerpc/platforms/powernv/vas.h
> > +++ b/arch/powerpc/platforms/powernv/vas.h
> > @@ -345,34 +345,6 @@ struct vas_instance {
> >     struct dentry *dbgdir;
> >  };
> >  
> > -/*
> > - * In-kernel state a VAS window. One per window.
> > - */
> > -struct vas_window {
> > -   /* 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;
> > -
> > -   /* Feilds applicable only to receive windows */
> > -   enum vas_cop_type cop;
> > -   atomic_t num_txwins;
> > -};
> > -
> >  /*
> >   * Container for the hardware state of a window. One per-window.
> >   *
> > @@ -449,8 +421,8 @@ static inline void vas_log_write(struct
> > vas_window *win, char *name,
> >  {
> >     if (val)
> >             pr_debug("%swin #%d: %s reg %p, val 0x%016llx\n",
> > -                           win->tx_win ? "Tx" : "Rx", win->winid,
> > name,
> > -                           regptr, val);
> > +                           win->pnv.tx_win ? "Tx" : "Rx", win-
> > >winid,
> > +                           name, regptr, val);
> >  }
> >  
> >  static inline void write_uwc_reg(struct vas_window *win, char
> > *name,
> > @@ -458,7 +430,7 @@ static inline void write_uwc_reg(struct
> > vas_window *win, char *name,
> >  {
> >     void *regptr;
> >  
> > -   regptr = win->uwc_map + reg;
> > +   regptr = win->pnv.uwc_map + reg;
> >     vas_log_write(win, name, regptr, val);
> >  
> >     out_be64(regptr, val);
> > @@ -469,7 +441,7 @@ static inline void write_hvwc_reg(struct
> > vas_window *win, char *name,
> >  {
> >     void *regptr;
> >  
> > -   regptr = win->hvwc_map + reg;
> > +   regptr = win->pnv.hvwc_map + reg;
> >     vas_log_write(win, name, regptr, val);
> >  
> >     out_be64(regptr, val);
> > @@ -478,7 +450,7 @@ static inline void write_hvwc_reg(struct
> > vas_window *win, char *name,
> >  static inline u64 read_hvwc_reg(struct vas_window *win,
> >                     char *name __maybe_unused, s32 reg)
> >  {
> > -   return in_be64(win->hvwc_map+reg);
> > +   return in_be64(win->pnv.hvwc_map + reg);
> >  }
> >  
> >  /*
> > -- 
> > 2.18.2
> > 
> > 
> > 

Reply via email to