Re: [PATCH v4 3/9] powerpc/vas: Add VAS user space API
On Tue, 2020-03-24 at 14:41 +1100, Michael Ellerman wrote: > Daniel Axtens writes: > > Michael Ellerman writes: > >> Daniel Axtens writes: > >>> Haren Myneni writes: > diff --git a/arch/powerpc/platforms/powernv/vas-api.c > b/arch/powerpc/platforms/powernv/vas-api.c > new file mode 100644 > index 000..7d049af > --- /dev/null > +++ b/arch/powerpc/platforms/powernv/vas-api.c > @@ -0,0 +1,257 @@ > >> ... > + > +static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) > +{ > +struct vas_window *txwin = fp->private_data; > +unsigned long pfn; > +u64 paste_addr; > +pgprot_t prot; > +int rc; > + > +if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) { > >>> > >>> I think you said this should be 4096 rather than 64k, regardless of what > >>> PAGE_SIZE you are compiled with? > >> > >> You can't mmap less than a page, a page is PAGE_SIZE bytes. > >> > >> So if that checked for 4K explicitly it would prevent mmap on 64K > >> kernels always, which seems like not what you want? > > > > Ah. My bad. Carry on then :) > > Well you were just quoting something from Haren, so I think it's over to > him. Sorry my mistake. I should change in documentation. vas_win_paste_addr() always returns 1 page. Restriction should be PAGE_SIZE. > > cheers
Re: [PATCH v4 3/9] powerpc/vas: Add VAS user space API
Daniel Axtens writes: > Michael Ellerman writes: >> Daniel Axtens writes: >>> Haren Myneni writes: diff --git a/arch/powerpc/platforms/powernv/vas-api.c b/arch/powerpc/platforms/powernv/vas-api.c new file mode 100644 index 000..7d049af --- /dev/null +++ b/arch/powerpc/platforms/powernv/vas-api.c @@ -0,0 +1,257 @@ >> ... + +static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) +{ + struct vas_window *txwin = fp->private_data; + unsigned long pfn; + u64 paste_addr; + pgprot_t prot; + int rc; + + if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) { >>> >>> I think you said this should be 4096 rather than 64k, regardless of what >>> PAGE_SIZE you are compiled with? >> >> You can't mmap less than a page, a page is PAGE_SIZE bytes. >> >> So if that checked for 4K explicitly it would prevent mmap on 64K >> kernels always, which seems like not what you want? > > Ah. My bad. Carry on then :) Well you were just quoting something from Haren, so I think it's over to him. cheers
Re: [PATCH v4 3/9] powerpc/vas: Add VAS user space API
Michael Ellerman writes: > Daniel Axtens writes: >> Haren Myneni writes: >> >>> On power9, userspace can send GZIP compression requests directly to NX >>> once kernel establishes NX channel / window with VAS. This patch provides >>> user space API which allows user space to establish channel using open >>> VAS_TX_WIN_OPEN ioctl, mmap and close operations. >>> >>> Each window corresponds to file descriptor and application can open >>> multiple windows. After the window is opened, VAS_TX_WIN_OPEN icoctl to >>> open a window on specific VAS instance, mmap() system call to map >>> the hardware address of engine's request queue into the application's >>> virtual address space. >>> >>> Then the application can then submit one or more requests to the the >>> engine by using the copy/paste instructions and pasting the CRBs to >>> the virtual address (aka paste_address) returned by mmap(). >>> >>> Only NX GZIP coprocessor type is supported right now and allow GZIP >>> engine access via /dev/crypto/nx-gzip device node. >>> >>> Signed-off-by: Sukadev Bhattiprolu >>> Signed-off-by: Haren Myneni >>> --- >>> arch/powerpc/include/asm/vas.h | 11 ++ >>> arch/powerpc/platforms/powernv/Makefile | 2 +- >>> arch/powerpc/platforms/powernv/vas-api.c| 257 >>> >>> arch/powerpc/platforms/powernv/vas-window.c | 6 +- >>> arch/powerpc/platforms/powernv/vas.h| 2 + >>> 5 files changed, 274 insertions(+), 4 deletions(-) >>> create mode 100644 arch/powerpc/platforms/powernv/vas-api.c >>> >>> diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h >>> index f93e6b0..e064953 100644 >>> --- a/arch/powerpc/include/asm/vas.h >>> +++ b/arch/powerpc/include/asm/vas.h >>> @@ -163,4 +163,15 @@ struct vas_window *vas_tx_win_open(int vasid, enum >>> vas_cop_type cop, >>> */ >>> int vas_paste_crb(struct vas_window *win, int offset, bool re); >>> >>> +/* >>> + * Register / unregister coprocessor type to VAS API which will be exported >>> + * to user space. Applications can use this API to open / close window >>> + * which can be used to send / receive requests directly to cooprcessor. >>> + * >>> + * Only NX GZIP coprocessor type is supported now, but this API can be >>> + * used for others in future. >>> + */ >>> +int vas_register_coproc_api(struct module *mod); >>> +void vas_unregister_coproc_api(void); >>> + >>> #endif /* __ASM_POWERPC_VAS_H */ >>> diff --git a/arch/powerpc/platforms/powernv/Makefile >>> b/arch/powerpc/platforms/powernv/Makefile >>> index 395789f..fe3f0fb 100644 >>> --- a/arch/powerpc/platforms/powernv/Makefile >>> +++ b/arch/powerpc/platforms/powernv/Makefile >>> @@ -17,7 +17,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 >>> +obj-$(CONFIG_PPC_VAS) += vas.o vas-window.o vas-debug.o vas-fault.o >>> vas-api.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-api.c >>> b/arch/powerpc/platforms/powernv/vas-api.c >>> new file mode 100644 >>> index 000..7d049af >>> --- /dev/null >>> +++ b/arch/powerpc/platforms/powernv/vas-api.c >>> @@ -0,0 +1,257 @@ > ... >>> + >>> +static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) >>> +{ >>> + struct vas_window *txwin = fp->private_data; >>> + unsigned long pfn; >>> + u64 paste_addr; >>> + pgprot_t prot; >>> + int rc; >>> + >>> + if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) { >> >> I think you said this should be 4096 rather than 64k, regardless of what >> PAGE_SIZE you are compiled with? > > You can't mmap less than a page, a page is PAGE_SIZE bytes. > > So if that checked for 4K explicitly it would prevent mmap on 64K > kernels always, which seems like not what you want? Ah. My bad. Carry on then :) Regards, Daniel > > cheers
Re: [PATCH v4 3/9] powerpc/vas: Add VAS user space API
Daniel Axtens writes: > Haren Myneni writes: > >> On power9, userspace can send GZIP compression requests directly to NX >> once kernel establishes NX channel / window with VAS. This patch provides >> user space API which allows user space to establish channel using open >> VAS_TX_WIN_OPEN ioctl, mmap and close operations. >> >> Each window corresponds to file descriptor and application can open >> multiple windows. After the window is opened, VAS_TX_WIN_OPEN icoctl to >> open a window on specific VAS instance, mmap() system call to map >> the hardware address of engine's request queue into the application's >> virtual address space. >> >> Then the application can then submit one or more requests to the the >> engine by using the copy/paste instructions and pasting the CRBs to >> the virtual address (aka paste_address) returned by mmap(). >> >> Only NX GZIP coprocessor type is supported right now and allow GZIP >> engine access via /dev/crypto/nx-gzip device node. >> >> Signed-off-by: Sukadev Bhattiprolu >> Signed-off-by: Haren Myneni >> --- >> arch/powerpc/include/asm/vas.h | 11 ++ >> arch/powerpc/platforms/powernv/Makefile | 2 +- >> arch/powerpc/platforms/powernv/vas-api.c| 257 >> >> arch/powerpc/platforms/powernv/vas-window.c | 6 +- >> arch/powerpc/platforms/powernv/vas.h| 2 + >> 5 files changed, 274 insertions(+), 4 deletions(-) >> create mode 100644 arch/powerpc/platforms/powernv/vas-api.c >> >> diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h >> index f93e6b0..e064953 100644 >> --- a/arch/powerpc/include/asm/vas.h >> +++ b/arch/powerpc/include/asm/vas.h >> @@ -163,4 +163,15 @@ struct vas_window *vas_tx_win_open(int vasid, enum >> vas_cop_type cop, >> */ >> int vas_paste_crb(struct vas_window *win, int offset, bool re); >> >> +/* >> + * Register / unregister coprocessor type to VAS API which will be exported >> + * to user space. Applications can use this API to open / close window >> + * which can be used to send / receive requests directly to cooprcessor. >> + * >> + * Only NX GZIP coprocessor type is supported now, but this API can be >> + * used for others in future. >> + */ >> +int vas_register_coproc_api(struct module *mod); >> +void vas_unregister_coproc_api(void); >> + >> #endif /* __ASM_POWERPC_VAS_H */ >> diff --git a/arch/powerpc/platforms/powernv/Makefile >> b/arch/powerpc/platforms/powernv/Makefile >> index 395789f..fe3f0fb 100644 >> --- a/arch/powerpc/platforms/powernv/Makefile >> +++ b/arch/powerpc/platforms/powernv/Makefile >> @@ -17,7 +17,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 >> +obj-$(CONFIG_PPC_VAS) += vas.o vas-window.o vas-debug.o vas-fault.o >> vas-api.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-api.c >> b/arch/powerpc/platforms/powernv/vas-api.c >> new file mode 100644 >> index 000..7d049af >> --- /dev/null >> +++ b/arch/powerpc/platforms/powernv/vas-api.c >> @@ -0,0 +1,257 @@ ... >> + >> +static int coproc_mmap(struct file *fp, struct vm_area_struct *vma) >> +{ >> +struct vas_window *txwin = fp->private_data; >> +unsigned long pfn; >> +u64 paste_addr; >> +pgprot_t prot; >> +int rc; >> + >> +if ((vma->vm_end - vma->vm_start) > PAGE_SIZE) { > > I think you said this should be 4096 rather than 64k, regardless of what > PAGE_SIZE you are compiled with? You can't mmap less than a page, a page is PAGE_SIZE bytes. So if that checked for 4K explicitly it would prevent mmap on 64K kernels always, which seems like not what you want? cheers
Re: [PATCH v4 3/9] powerpc/vas: Add VAS user space API
Haren Myneni writes: > On power9, userspace can send GZIP compression requests directly to NX > once kernel establishes NX channel / window with VAS. This patch provides > user space API which allows user space to establish channel using open > VAS_TX_WIN_OPEN ioctl, mmap and close operations. > > Each window corresponds to file descriptor and application can open > multiple windows. After the window is opened, VAS_TX_WIN_OPEN icoctl to > open a window on specific VAS instance, mmap() system call to map > the hardware address of engine's request queue into the application's > virtual address space. > > Then the application can then submit one or more requests to the the > engine by using the copy/paste instructions and pasting the CRBs to > the virtual address (aka paste_address) returned by mmap(). > > Only NX GZIP coprocessor type is supported right now and allow GZIP > engine access via /dev/crypto/nx-gzip device node. > > Signed-off-by: Sukadev Bhattiprolu > Signed-off-by: Haren Myneni > --- > arch/powerpc/include/asm/vas.h | 11 ++ > arch/powerpc/platforms/powernv/Makefile | 2 +- > arch/powerpc/platforms/powernv/vas-api.c| 257 > > arch/powerpc/platforms/powernv/vas-window.c | 6 +- > arch/powerpc/platforms/powernv/vas.h| 2 + > 5 files changed, 274 insertions(+), 4 deletions(-) > create mode 100644 arch/powerpc/platforms/powernv/vas-api.c > > diff --git a/arch/powerpc/include/asm/vas.h b/arch/powerpc/include/asm/vas.h > index f93e6b0..e064953 100644 > --- a/arch/powerpc/include/asm/vas.h > +++ b/arch/powerpc/include/asm/vas.h > @@ -163,4 +163,15 @@ struct vas_window *vas_tx_win_open(int vasid, enum > vas_cop_type cop, > */ > int vas_paste_crb(struct vas_window *win, int offset, bool re); > > +/* > + * Register / unregister coprocessor type to VAS API which will be exported > + * to user space. Applications can use this API to open / close window > + * which can be used to send / receive requests directly to cooprcessor. > + * > + * Only NX GZIP coprocessor type is supported now, but this API can be > + * used for others in future. > + */ > +int vas_register_coproc_api(struct module *mod); > +void vas_unregister_coproc_api(void); > + > #endif /* __ASM_POWERPC_VAS_H */ > diff --git a/arch/powerpc/platforms/powernv/Makefile > b/arch/powerpc/platforms/powernv/Makefile > index 395789f..fe3f0fb 100644 > --- a/arch/powerpc/platforms/powernv/Makefile > +++ b/arch/powerpc/platforms/powernv/Makefile > @@ -17,7 +17,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 > +obj-$(CONFIG_PPC_VAS)+= vas.o vas-window.o vas-debug.o vas-fault.o > vas-api.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-api.c > b/arch/powerpc/platforms/powernv/vas-api.c > new file mode 100644 > index 000..7d049af > --- /dev/null > +++ b/arch/powerpc/platforms/powernv/vas-api.c > @@ -0,0 +1,257 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * VAS user space API for its accelerators (Only NX-GZIP is supported now) > + * Copyright (C) 2019 Haren Myneni, IBM Corp > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include "vas.h" > + > +/* > + * The driver creates the device node that can be used as follows: > + * For NX-GZIP > + * > + * fd = open("/dev/crypto/nx-gzip", O_RDWR); > + * rc = ioctl(fd, VAS_TX_WIN_OPEN, ); > + * paste_addr = mmap(NULL, PAGE_SIZE, prot, MAP_SHARED, fd, 0ULL). > + * vas_copy(, 0, 1); > + * vas_paste(paste_addr, 0, 1); > + * close(fd) or exit process to close window. > + * > + * where "vas_copy" and "vas_paste" are defined in copy-paste.h. > + * copy/paste returns to the user space directly. So refer NX hardware > + * documententation for exact copy/paste usage and completion / error > + * conditions. > + */ > + > +static char *coproc_dev_name = "nx-gzip"; > + > +/* > + * Wrapper object for the nx-gzip device - there is just one instance of > + * this node for the whole system. > + */ > +static struct coproc_dev { > + struct cdev cdev; > + struct device *device; > + char *name; > + dev_t devt; > + struct class *class; > +} coproc_device; > + > +static char *coproc_devnode(struct device *dev, umode_t *mode) > +{ > + return kasprintf(GFP_KERNEL, "crypto/%s", dev_name(dev)); > +} > + > +static int coproc_open(struct inode *inode, struct file *fp) > +{ > + /* > + * vas_window is allocated and assigned to fp->private_data > + * in ioctl. Nothing to do here for NX GZIP. > + */ > + return 0; > +} > + > +static int