Excerpts from Haren Myneni's message of June 18, 2021 6:38 am: > > The hypervisor provides different NX capabilities that it > supports. These capabilities such as recommended minimum > compression / decompression lengths and the maximum request > buffer size in bytes are used to define the user space NX > request. > > NX will reject the request if the buffer size is more than > the maximum buffer size. Whereas compression / decompression > lengths are recommended values for better performance. > > Changes to get NX overall capabilities which points to the > specific features that the hypervisor supports. Then retrieve > the capabilities for the specific feature (available only > for NXGZIP). > > Signed-off-by: Haren Myneni <haren@xxxxxxxxxxxxx> > Acked-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx> Acked-by: Nicholas Piggin <npiggin@xxxxxxxxx> > --- > drivers/crypto/nx/nx-common-pseries.c | 87 +++++++++++++++++++++++++++ > 1 file changed, 87 insertions(+) > > diff --git a/drivers/crypto/nx/nx-common-pseries.c b/drivers/crypto/nx/nx-common-pseries.c > index cc8dd3072b8b..9fc2abb56019 100644 > --- a/drivers/crypto/nx/nx-common-pseries.c > +++ b/drivers/crypto/nx/nx-common-pseries.c > @@ -9,6 +9,8 @@ > */ > > #include <asm/vio.h> > +#include <asm/hvcall.h> > +#include <asm/vas.h> > > #include "nx-842.h" > #include "nx_csbcpb.h" /* struct nx_csbcpb */ > @@ -19,6 +21,29 @@ MODULE_DESCRIPTION("842 H/W Compression driver for IBM Power processors"); > MODULE_ALIAS_CRYPTO("842"); > MODULE_ALIAS_CRYPTO("842-nx"); > > +/* > + * Coprocessor type specific capabilities from the hypervisor. > + */ > +struct hv_nx_cop_caps { > + __be64 descriptor; > + __be64 req_max_processed_len; /* Max bytes in one GZIP request */ > + __be64 min_compress_len; /* Min compression size in bytes */ > + __be64 min_decompress_len; /* Min decompression size in bytes */ > +} __packed __aligned(0x1000); > + > +/* > + * Coprocessor type specific capabilities. > + */ > +struct nx_cop_caps { > + u64 descriptor; > + u64 req_max_processed_len; /* Max bytes in one GZIP request */ > + u64 min_compress_len; /* Min compression in bytes */ > + u64 min_decompress_len; /* Min decompression in bytes */ > +}; > + > +static u64 caps_feat; > +static struct nx_cop_caps nx_cop_caps; > + > static struct nx842_constraints nx842_pseries_constraints = { > .alignment = DDE_BUFFER_ALIGN, > .multiple = DDE_BUFFER_LAST_MULT, > @@ -1065,6 +1090,64 @@ static void nx842_remove(struct vio_dev *viodev) > kfree(old_devdata); > } > > +/* > + * Get NX capabilities from the hypervisor. > + * Only NXGZIP capabilities are provided by the hypersvisor right > + * now and these values are available to user space with sysfs. > + */ > +static void __init nxcop_get_capabilities(void) > +{ > + struct hv_vas_all_caps *hv_caps; > + struct hv_nx_cop_caps *hv_nxc; > + int rc; > + > + hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL); > + if (!hv_caps) > + return; > + /* > + * Get NX overall capabilities with feature type=0 > + */ > + rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES, 0, > + (u64)virt_to_phys(hv_caps)); > + if (rc) > + goto out; > + > + caps_feat = be64_to_cpu(hv_caps->feat_type); > + /* > + * NX-GZIP feature available > + */ > + if (caps_feat & VAS_NX_GZIP_FEAT_BIT) { > + hv_nxc = kmalloc(sizeof(*hv_nxc), GFP_KERNEL); > + if (!hv_nxc) > + goto out; > + /* > + * Get capabilities for NX-GZIP feature > + */ > + rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES, > + VAS_NX_GZIP_FEAT, > + (u64)virt_to_phys(hv_nxc)); > + } else { > + pr_err("NX-GZIP feature is not available\n"); > + rc = -EINVAL; > + } > + > + if (!rc) { > + nx_cop_caps.descriptor = be64_to_cpu(hv_nxc->descriptor); > + nx_cop_caps.req_max_processed_len = > + be64_to_cpu(hv_nxc->req_max_processed_len); > + nx_cop_caps.min_compress_len = > + be64_to_cpu(hv_nxc->min_compress_len); > + nx_cop_caps.min_decompress_len = > + be64_to_cpu(hv_nxc->min_decompress_len); > + } else { > + caps_feat = 0; > + } > + > + kfree(hv_nxc); > +out: > + kfree(hv_caps); > +} > + > static const struct vio_device_id nx842_vio_driver_ids[] = { > {"ibm,compression-v1", "ibm,compression"}, > {"", ""}, > @@ -1092,6 +1175,10 @@ static int __init nx842_pseries_init(void) > return -ENOMEM; > > RCU_INIT_POINTER(devdata, new_devdata); > + /* > + * Get NX capabilities from the hypervisor. > + */ > + nxcop_get_capabilities(); > > ret = vio_register_driver(&nx842_vio_driver); > if (ret) { > -- > 2.18.2 > > >