Excerpts from Haren Myneni's message of April 18, 2021 7:02 am:
> 
> Using the same /dev/crypto/nx-gzip interface for both powerNV and
> pseries.

The pseries NX driver will use the powernv VAS API ?

> So this patch creates platforms/book3s/ and moves VAS API
> to that directory. The actual functionality is not changed.
> 
> Common interface functions such as open, window open ioctl, mmap
> and close are moved to arch/powerpc/platforms/book3s/vas-api.c
> Added hooks to call platform specific code, but the underline
> powerNV code in these functions is not changed.

Even so, could you do one patch that just moves, and another that
adds the ops struct?

> 
> Signed-off-by: Haren Myneni <ha...@linux.ibm.com>
> ---
>  arch/powerpc/include/asm/vas.h                | 22 ++++++-
>  arch/powerpc/platforms/Kconfig                |  1 +
>  arch/powerpc/platforms/Makefile               |  1 +
>  arch/powerpc/platforms/book3s/Kconfig         | 15 +++++
>  arch/powerpc/platforms/book3s/Makefile        |  2 +

The usual place for these would be arch/powerpc/sysdev/vas. E.g., see
arch/powerpc/sysdev/xive.

>  .../platforms/{powernv => book3s}/vas-api.c   | 64 ++++++++++--------
>  arch/powerpc/platforms/powernv/Kconfig        | 14 ----
>  arch/powerpc/platforms/powernv/Makefile       |  2 +-
>  arch/powerpc/platforms/powernv/vas-window.c   | 66 +++++++++++++++++++
>  9 files changed, 143 insertions(+), 44 deletions(-)
>  create mode 100644 arch/powerpc/platforms/book3s/Kconfig
>  create mode 100644 arch/powerpc/platforms/book3s/Makefile
>  rename arch/powerpc/platforms/{powernv => book3s}/vas-api.c (83%)
> 
> diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h
> index 41f73fae7ab8..6bbade60d8f4 100644
> --- a/arch/powerpc/include/asm/vas.h
> +++ b/arch/powerpc/include/asm/vas.h
> @@ -5,6 +5,8 @@
>  
>  #ifndef _ASM_POWERPC_VAS_H
>  #define _ASM_POWERPC_VAS_H
> +#include <uapi/asm/vas-api.h>
> +
>  
>  struct vas_window;
>  
> @@ -48,6 +50,16 @@ enum vas_cop_type {
>       VAS_COP_TYPE_MAX,
>  };
>  
> +/*
> + * User space window operations used for powernv and powerVM
> + */
> +struct vas_user_win_ops {
> +     struct vas_window * (*open_win)(struct vas_tx_win_open_attr *,
> +                             enum vas_cop_type);
> +     u64 (*paste_addr)(void *);
> +     int (*close_win)(void *);
> +};
> +
>  /*
>   * Receive window attributes specified by the (in-kernel) owner of window.
>   */
> @@ -161,6 +173,9 @@ int vas_copy_crb(void *crb, int offset);
>   * assumed to be true for NX windows.
>   */
>  int vas_paste_crb(struct vas_window *win, int offset, bool re);
> +int vas_register_api_powernv(struct module *mod, enum vas_cop_type cop_type,
> +                          const char *name);
> +void vas_unregister_api_powernv(void);
>  
>  /*
>   * Register / unregister coprocessor type to VAS API which will be exported
> @@ -170,8 +185,9 @@ int vas_paste_crb(struct vas_window *win, int offset, 
> bool re);
>   * Only NX GZIP coprocessor type is supported now, but this API can be
>   * used for others in future.
>   */
> -int vas_register_api_powernv(struct module *mod, enum vas_cop_type cop_type,
> -                          const char *name);
> -void vas_unregister_api_powernv(void);
> +int vas_register_coproc_api(struct module *mod, enum vas_cop_type cop_type,
> +                         const char *name,
> +                         struct vas_user_win_ops *vops);
> +void vas_unregister_coproc_api(void);
>  
>  #endif /* __ASM_POWERPC_VAS_H */
> diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
> index 7a5e8f4541e3..594544a65b02 100644
> --- a/arch/powerpc/platforms/Kconfig
> +++ b/arch/powerpc/platforms/Kconfig
> @@ -20,6 +20,7 @@ source "arch/powerpc/platforms/embedded6xx/Kconfig"
>  source "arch/powerpc/platforms/44x/Kconfig"
>  source "arch/powerpc/platforms/40x/Kconfig"
>  source "arch/powerpc/platforms/amigaone/Kconfig"
> +source "arch/powerpc/platforms/book3s/Kconfig"
>  
>  config KVM_GUEST
>       bool "KVM Guest support"
> diff --git a/arch/powerpc/platforms/Makefile b/arch/powerpc/platforms/Makefile
> index 143d4417f6cc..0e75d7df387b 100644
> --- a/arch/powerpc/platforms/Makefile
> +++ b/arch/powerpc/platforms/Makefile
> @@ -22,3 +22,4 @@ obj-$(CONFIG_PPC_CELL)              += cell/
>  obj-$(CONFIG_PPC_PS3)                += ps3/
>  obj-$(CONFIG_EMBEDDED6xx)    += embedded6xx/
>  obj-$(CONFIG_AMIGAONE)               += amigaone/
> +obj-$(CONFIG_PPC_BOOK3S)     += book3s/
> diff --git a/arch/powerpc/platforms/book3s/Kconfig 
> b/arch/powerpc/platforms/book3s/Kconfig
> new file mode 100644
> index 000000000000..51e14db83a79
> --- /dev/null
> +++ b/arch/powerpc/platforms/book3s/Kconfig
> @@ -0,0 +1,15 @@
> +# SPDX-License-Identifier: GPL-2.0
> +config PPC_VAS
> +     bool "IBM Virtual Accelerator Switchboard (VAS)"
> +     depends on PPC_POWERNV && PPC_64K_PAGES
> +     default y
> +     help
> +       This enables support for IBM Virtual Accelerator Switchboard (VAS).
> +
> +       VAS allows accelerators in co-processors like NX-GZIP and NX-842
> +       to be accessible to kernel subsystems and user processes.
> +       VAS adapters are found in POWER9 and later based systems.
> +       The user mode NX-GZIP support is added on P9 for powerNV and on
> +       P10 for powerVM.
> +
> +       If unsure, say "N".
> diff --git a/arch/powerpc/platforms/book3s/Makefile 
> b/arch/powerpc/platforms/book3s/Makefile
> new file mode 100644
> index 000000000000..e790f1910f61
> --- /dev/null
> +++ b/arch/powerpc/platforms/book3s/Makefile
> @@ -0,0 +1,2 @@
> +# SPDX-License-Identifier: GPL-2.0-only
> +obj-$(CONFIG_PPC_VAS)        += vas-api.o
> diff --git a/arch/powerpc/platforms/powernv/vas-api.c 
> b/arch/powerpc/platforms/book3s/vas-api.c
> similarity index 83%
> rename from arch/powerpc/platforms/powernv/vas-api.c
> rename to arch/powerpc/platforms/book3s/vas-api.c
> index 72d8ce39e56c..05d7b99acf41 100644
> --- a/arch/powerpc/platforms/powernv/vas-api.c
> +++ b/arch/powerpc/platforms/book3s/vas-api.c
> @@ -4,15 +4,20 @@
>   * Copyright (C) 2019 Haren Myneni, IBM Corp
>   */
>  
> +#include <linux/module.h>
>  #include <linux/kernel.h>
>  #include <linux/device.h>
>  #include <linux/cdev.h>
>  #include <linux/fs.h>
>  #include <linux/slab.h>
>  #include <linux/uaccess.h>
> +#include <linux/kthread.h>
> +#include <linux/sched/signal.h>
> +#include <linux/sched/mm.h>
> +#include <linux/mmu_context.h>
>  #include <asm/vas.h>
> +#include <asm/icswx.h>
>  #include <uapi/asm/vas-api.h>
> -#include "vas.h"
>  
>  /*
>   * The driver creates the device node that can be used as follows:
> @@ -42,6 +47,7 @@ static struct coproc_dev {
>       dev_t devt;
>       struct class *class;
>       enum vas_cop_type cop_type;
> +     struct vas_user_win_ops *vops;
>  } coproc_device;
>  
>  struct coproc_instance {
> @@ -72,11 +78,10 @@ static int coproc_open(struct inode *inode, struct file 
> *fp)
>  static int coproc_ioc_tx_win_open(struct file *fp, unsigned long arg)
>  {
>       void __user *uptr = (void __user *)arg;
> -     struct vas_tx_win_attr txattr = {};
>       struct vas_tx_win_open_attr uattr;
>       struct coproc_instance *cp_inst;
>       struct vas_window *txwin;
> -     int rc, vasid;
> +     int rc;
>  
>       cp_inst = fp->private_data;
>  
> @@ -93,27 +98,20 @@ static int coproc_ioc_tx_win_open(struct file *fp, 
> unsigned long arg)
>       }
>  
>       if (uattr.version != 1) {
> -             pr_err("Invalid version\n");
> +             pr_err("Invalid window open API version\n");
>               return -EINVAL;
>       }
>  
> -     vasid = uattr.vas_id;
> -
> -     vas_init_tx_win_attr(&txattr, cp_inst->coproc->cop_type);
> -
> -     txattr.lpid = mfspr(SPRN_LPID);
> -     txattr.pidr = mfspr(SPRN_PID);
> -     txattr.user_win = true;
> -     txattr.rsvd_txbuf_count = false;
> -     txattr.pswid = false;
> -
> -     pr_devel("Pid %d: Opening txwin, PIDR %ld\n", txattr.pidr,
> -                             mfspr(SPRN_PID));
> +     if (!cp_inst->coproc->vops && !cp_inst->coproc->vops->open_win) {
> +             pr_err("VAS API is not registered\n");
> +             return -EACCES;
> +     }
>  
> -     txwin = vas_tx_win_open(vasid, cp_inst->coproc->cop_type, &txattr);
> +     txwin = cp_inst->coproc->vops->open_win(&uattr,
> +                                     cp_inst->coproc->cop_type);
>       if (IS_ERR(txwin)) {
> -             pr_err("%s() vas_tx_win_open() failed, %ld\n", __func__,
> -                                     PTR_ERR(txwin));
> +             pr_err("%s() VAS window open failed, %ld\n", __func__,
> +                             PTR_ERR(txwin));
>               return PTR_ERR(txwin);
>       }
>  
> @@ -125,9 +123,14 @@ static int coproc_ioc_tx_win_open(struct file *fp, 
> unsigned long arg)
>  static int coproc_release(struct inode *inode, struct file *fp)
>  {
>       struct coproc_instance *cp_inst = fp->private_data;
> +     int rc = 0;
>  
>       if (cp_inst->txwin) {
> -             vas_win_close(cp_inst->txwin);
> +             if (cp_inst->coproc->vops && cp_inst->coproc->vops->close_win) {
> +                     rc = cp_inst->coproc->vops->close_win(cp_inst->txwin);
> +                     if (rc)
> +                             return rc;
> +             }
>               cp_inst->txwin = NULL;
>       }
>  
> @@ -168,7 +171,17 @@ static int coproc_mmap(struct file *fp, struct 
> vm_area_struct *vma)
>               return -EINVAL;
>       }
>  
> -     vas_win_paste_addr(txwin, &paste_addr, NULL);
> +     if (!cp_inst->coproc->vops && !cp_inst->coproc->vops->paste_addr) {
> +             pr_err("%s(): VAS API is not registered\n", __func__);
> +             return -EACCES;
> +     }
> +
> +     paste_addr = cp_inst->coproc->vops->paste_addr(txwin);
> +     if (!paste_addr) {
> +             pr_err("%s(): Window paste address failed\n", __func__);
> +             return -EINVAL;
> +     }
> +
>       pfn = paste_addr >> PAGE_SHIFT;
>  
>       /* flags, page_prot from cxl_mmap(), except we want cachable */
> @@ -207,8 +220,8 @@ static struct file_operations coproc_fops = {
>   * Supporting only nx-gzip coprocessor type now, but this API code
>   * extended to other coprocessor types later.
>   */
> -int vas_register_api_powernv(struct module *mod, enum vas_cop_type cop_type,
> -                          const char *name)
> +int vas_register_coproc_api(struct module *mod, enum vas_cop_type cop_type,
> +                     const char *name, struct vas_user_win_ops *vops)
>  {
>       int rc = -EINVAL;
>       dev_t devno;
> @@ -230,6 +243,7 @@ int vas_register_api_powernv(struct module *mod, enum 
> vas_cop_type cop_type,
>       }
>       coproc_device.class->devnode = coproc_devnode;
>       coproc_device.cop_type = cop_type;
> +     coproc_device.vops = vops;
>  
>       coproc_fops.owner = mod;
>       cdev_init(&coproc_device.cdev, &coproc_fops);
> @@ -262,9 +276,8 @@ int vas_register_api_powernv(struct module *mod, enum 
> vas_cop_type cop_type,
>       unregister_chrdev_region(coproc_device.devt, 1);
>       return rc;
>  }
> -EXPORT_SYMBOL_GPL(vas_register_api_powernv);
>  
> -void vas_unregister_api_powernv(void)
> +void vas_unregister_coproc_api(void)
>  {
>       dev_t devno;
>  
> @@ -275,4 +288,3 @@ void vas_unregister_api_powernv(void)
>       class_destroy(coproc_device.class);
>       unregister_chrdev_region(coproc_device.devt, 1);
>  }
> -EXPORT_SYMBOL_GPL(vas_unregister_api_powernv);
> diff --git a/arch/powerpc/platforms/powernv/Kconfig 
> b/arch/powerpc/platforms/powernv/Kconfig
> index 619b093a0657..043eefbbdd28 100644
> --- a/arch/powerpc/platforms/powernv/Kconfig
> +++ b/arch/powerpc/platforms/powernv/Kconfig
> @@ -33,20 +33,6 @@ config PPC_MEMTRACE
>         Enabling this option allows for runtime allocation of memory (RAM)
>         for hardware tracing.
>  
> -config PPC_VAS
> -     bool "IBM Virtual Accelerator Switchboard (VAS)"
> -     depends on PPC_POWERNV && PPC_64K_PAGES
> -     default y
> -     help
> -       This enables support for IBM Virtual Accelerator Switchboard (VAS).
> -
> -       VAS allows accelerators in co-processors like NX-GZIP and NX-842
> -       to be accessible to kernel subsystems and user processes.
> -
> -       VAS adapters are found in POWER9 based systems.
> -
> -       If unsure, say N.
> -
>  config SCOM_DEBUGFS
>       bool "Expose SCOM controllers via debugfs"
>       depends on DEBUG_FS
> diff --git a/arch/powerpc/platforms/powernv/Makefile 
> b/arch/powerpc/platforms/powernv/Makefile
> index 2eb6ae150d1f..c747a1f1d25b 100644
> --- a/arch/powerpc/platforms/powernv/Makefile
> +++ b/arch/powerpc/platforms/powernv/Makefile
> @@ -18,7 +18,7 @@ obj-$(CONFIG_MEMORY_FAILURE)        += opal-memory-errors.o
>  obj-$(CONFIG_OPAL_PRD)       += opal-prd.o
>  obj-$(CONFIG_PERF_EVENTS) += opal-imc.o
>  obj-$(CONFIG_PPC_MEMTRACE)   += memtrace.o
> -obj-$(CONFIG_PPC_VAS)        += vas.o vas-window.o vas-debug.o vas-fault.o 
> vas-api.o
> +obj-$(CONFIG_PPC_VAS)        += vas.o vas-window.o vas-debug.o vas-fault.o
>  obj-$(CONFIG_OCXL_BASE)      += ocxl.o
>  obj-$(CONFIG_SCOM_DEBUGFS) += opal-xscom.o
>  obj-$(CONFIG_PPC_SECURE_BOOT) += opal-secvar.o
> diff --git a/arch/powerpc/platforms/powernv/vas-window.c 
> b/arch/powerpc/platforms/powernv/vas-window.c
> index 5f5fe63a3d1c..b973dd574b47 100644
> --- a/arch/powerpc/platforms/powernv/vas-window.c
> +++ b/arch/powerpc/platforms/powernv/vas-window.c
> @@ -16,6 +16,8 @@
>  #include <linux/mmu_context.h>
>  #include <asm/switch_to.h>
>  #include <asm/ppc-opcode.h>
> +#include <asm/vas.h>
> +#include <uapi/asm/vas-api.h>
>  #include "vas.h"
>  #include "copy-paste.h"
>  
> @@ -1441,3 +1443,67 @@ struct vas_window *vas_pswid_to_window(struct 
> vas_instance *vinst,
>  
>       return window;
>  }
> +
> +static struct vas_window *vas_user_win_open(struct vas_tx_win_open_attr 
> *uattr,
> +                             enum vas_cop_type cop_type)
> +{
> +     struct vas_tx_win_attr txattr = {};
> +
> +     vas_init_tx_win_attr(&txattr, cop_type);
> +
> +     txattr.lpid = mfspr(SPRN_LPID);
> +     txattr.pidr = mfspr(SPRN_PID);
> +     txattr.user_win = true;
> +     txattr.rsvd_txbuf_count = false;
> +     txattr.pswid = false;
> +
> +     pr_devel("Pid %d: Opening txwin, PIDR %ld\n", txattr.pidr,
> +                             mfspr(SPRN_PID));
> +
> +     return vas_tx_win_open(uattr->vas_id, cop_type, &txattr);
> +}
> +
> +static u64 vas_user_win_paste_addr(void *addr)
> +{
> +     u64 paste_addr;
> +
> +     vas_win_paste_addr((struct vas_window *)addr, &paste_addr, NULL);
> +
> +     return paste_addr;
> +}
> +
> +static int vas_user_win_close(void *addr)
> +{
> +     struct vas_window *txwin = addr;
> +
> +     vas_win_close(txwin);
> +
> +     return 0;
> +}
> +
> +static struct vas_user_win_ops vops =  {
> +     .open_win       =       vas_user_win_open,
> +     .paste_addr     =       vas_user_win_paste_addr,
> +     .close_win      =       vas_user_win_close,
> +};
> +
> +/*
> + * Supporting only nx-gzip coprocessor type now, but this API code
> + * extended to other coprocessor types later.
> + */
> +int vas_register_api_powernv(struct module *mod, enum vas_cop_type cop_type,
> +                             const char *name)
> +{
> +     int rc;
> +
> +     rc = vas_register_coproc_api(mod, cop_type, name, &vops);
> +
> +     return rc;
> +}
> +EXPORT_SYMBOL_GPL(vas_register_api_powernv);
> +
> +void vas_unregister_api_powernv(void)
> +{
> +     vas_unregister_coproc_api();
> +}
> +EXPORT_SYMBOL_GPL(vas_unregister_api_powernv);
> -- 
> 2.18.2
> 
> 
> 

Reply via email to