diff mbox series

[V3,02/16] powerpc/vas: Move VAS API to common book3s platform

Message ID 163867b893124434dfe3e13c6ba2f081c309e96f.camel@linux.ibm.com
State New
Headers show
Series Enable VAS and NX-GZIP support on powerVM | expand

Commit Message

Haren Myneni April 17, 2021, 9:02 p.m. UTC
Using the same /dev/crypto/nx-gzip interface for both powerNV and
pseries. 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.

Signed-off-by: Haren Myneni <haren@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 +
 .../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%)

Comments

Nicholas Piggin May 10, 2021, 5:19 a.m. UTC | #1
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 <haren@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

> 

> 

>
Haren Myneni May 10, 2021, 5:12 p.m. UTC | #2
On Mon, 2021-05-10 at 15:19 +1000, Nicholas Piggin wrote:
> 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 ?

Yes, both powerNV and pseries drivers use same 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?


Sure, I will create separate patches. 

> 

> > Signed-off-by: Haren Myneni <haren@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.


It was recommended to create book3s and move common vas-api code. 

> 

> >  .../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

> > 

> > 

> >
Michael Ellerman May 11, 2021, 1:50 a.m. UTC | #3
Nicholas Piggin <npiggin@gmail.com> writes:
> 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 <haren@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.


You're right that is the usual place, but is it a good place? :)

Using platforms/book3s was my suggestion:

  https://lore.kernel.org/linuxppc-dev/87k0p6s5lo.fsf@mpe.ellerman.id.au/


But I don't feel that strongly about it, maybe just dumping things in
sysdev is easier.

cheers
diff mbox series

Patch

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);