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