Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7011a122 authored by Dan Streetman's avatar Dan Streetman Committed by Herbert Xu
Browse files

crypto: nx - add NX-842 platform frontend driver



Add NX-842 frontend that allows using either the pSeries platform or
PowerNV platform driver (to be added by later patch) for the NX-842
hardware.  Update the MAINTAINERS file to include the new filenames.
Update Kconfig files to clarify titles and descriptions, and correct
dependencies.

Signed-off-by: default avatarDan Streetman <ddstreet@ieee.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent fdd05e4b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -4861,7 +4861,7 @@ F: drivers/crypto/nx/
IBM Power 842 compression accelerator
M:	Dan Streetman <ddstreet@us.ibm.com>
S:	Supported
F:	drivers/crypto/nx/nx-842.c
F:	drivers/crypto/nx/nx-842*
F:	include/linux/nx842.h
F:	include/linux/sw842.h
F:	crypto/842.c
+6 −4
Original line number Diff line number Diff line
@@ -330,11 +330,13 @@ config CRYPTO_DEV_S5P
	  algorithms execution.

config CRYPTO_DEV_NX
	bool "Support for IBM Power7+ in-Nest cryptographic acceleration"
	depends on PPC64 && IBMVIO && !CPU_LITTLE_ENDIAN
	default n
	bool "Support for IBM PowerPC Nest (NX) cryptographic acceleration"
	depends on PPC64
	help
	  Support for Power7+ in-Nest cryptographic acceleration.
	  This enables support for the NX hardware cryptographic accelerator
	  coprocessor that is in IBM PowerPC P7+ or later processors.  This
	  does not actually enable any drivers, it only allows you to select
	  which acceleration type (encryption and/or compression) to enable.

if CRYPTO_DEV_NX
	source "drivers/crypto/nx/Kconfig"
+26 −9
Original line number Diff line number Diff line

config CRYPTO_DEV_NX_ENCRYPT
	tristate "Encryption acceleration support"
	depends on PPC64 && IBMVIO
	tristate "Encryption acceleration support on pSeries platform"
	depends on PPC_PSERIES && IBMVIO && !CPU_LITTLE_ENDIAN
	default y
	select CRYPTO_ALGAPI
	select CRYPTO_AES
	select CRYPTO_CBC
	select CRYPTO_ECB
@@ -12,15 +14,30 @@ config CRYPTO_DEV_NX_ENCRYPT
	select CRYPTO_SHA256
	select CRYPTO_SHA512
	help
	  Support for Power7+ in-Nest encryption acceleration. This
	  module supports acceleration for AES and SHA2 algorithms. If you
	  choose 'M' here, this module will be called nx_crypto.
	  Support for PowerPC Nest (NX) encryption acceleration. This
	  module supports acceleration for AES and SHA2 algorithms on
	  the pSeries platform.  If you choose 'M' here, this module
	  will be called nx_crypto.

config CRYPTO_DEV_NX_COMPRESS
	tristate "Compression acceleration support"
	depends on PPC64 && IBMVIO
	default y
	help
	  Support for Power7+ in-Nest compression acceleration. This
	  module supports acceleration for AES and SHA2 algorithms. If you
	  choose 'M' here, this module will be called nx_compress.
	  Support for PowerPC Nest (NX) compression acceleration. This
	  module supports acceleration for compressing memory with the 842
	  algorithm.  One of the platform drivers must be selected also.
	  If you choose 'M' here, this module will be called nx_compress.

if CRYPTO_DEV_NX_COMPRESS

config CRYPTO_DEV_NX_COMPRESS_PSERIES
	tristate "Compression acceleration support on pSeries platform"
	depends on PPC_PSERIES && IBMVIO && !CPU_LITTLE_ENDIAN
	default y
	help
	  Support for PowerPC Nest (NX) compression acceleration. This
	  module supports acceleration for compressing memory with the 842
	  algorithm.  This supports NX hardware on the pSeries platform.
	  If you choose 'M' here, this module will be called nx_compress_pseries.

endif
+3 −1
Original line number Diff line number Diff line
@@ -11,4 +11,6 @@ nx-crypto-objs := nx.o \
		  nx-sha512.o

obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS) += nx-compress.o
nx-compress-objs := nx-842-pseries.o
obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS_PSERIES) += nx-compress-pseries.o
nx-compress-objs := nx-842.o
nx-compress-pseries-objs := nx-842-pseries.o
+27 −30
Original line number Diff line number Diff line
@@ -21,18 +21,13 @@
 *          Seth Jennings <sjenning@linux.vnet.ibm.com>
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/nx842.h>
#include <linux/of.h>
#include <linux/slab.h>

#include <asm/page.h>
#include <asm/vio.h>

#include "nx-842.h"
#include "nx_csbcpb.h" /* struct nx_csbcpb */

#define MODULE_NAME "nx-compress"
#define MODULE_NAME NX842_PSERIES_MODULE_NAME
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Robert Jennings <rcj@linux.vnet.ibm.com>");
MODULE_DESCRIPTION("842 H/W Compression driver for IBM Power processors");
@@ -236,18 +231,6 @@ struct nx842_workmem {
	};
};

int nx842_get_workmem_size(void)
{
	return sizeof(struct nx842_workmem) + NX842_HW_PAGE_SIZE;
}
EXPORT_SYMBOL_GPL(nx842_get_workmem_size);

int nx842_get_workmem_size_aligned(void)
{
	return sizeof(struct nx842_workmem);
}
EXPORT_SYMBOL_GPL(nx842_get_workmem_size_aligned);

static int nx842_validate_result(struct device *dev,
	struct cop_status_block *csb)
{
@@ -300,7 +283,7 @@ static int nx842_validate_result(struct device *dev,
}

/**
 * nx842_compress - Compress data using the 842 algorithm
 * nx842_pseries_compress - Compress data using the 842 algorithm
 *
 * Compression provide by the NX842 coprocessor on IBM Power systems.
 * The input buffer is compressed and the result is stored in the
@@ -315,7 +298,7 @@ static int nx842_validate_result(struct device *dev,
 * @out: Pointer to output buffer
 * @outlen: Length of output buffer
 * @wrkmem: ptr to buffer for working memory, size determined by
 *          nx842_get_workmem_size()
 *          NX842_MEM_COMPRESS
 *
 * Returns:
 *   0		Success, output of length @outlen stored in the buffer at @out
@@ -325,8 +308,9 @@ static int nx842_validate_result(struct device *dev,
 *   -EIO	Internal error
 *   -ENODEV	Hardware unavailable
 */
int nx842_compress(const unsigned char *in, unsigned int inlen,
		       unsigned char *out, unsigned int *outlen, void *wmem)
static int nx842_pseries_compress(const unsigned char *in, unsigned int inlen,
				  unsigned char *out, unsigned int *outlen,
				  void *wmem)
{
	struct nx842_header *hdr;
	struct nx842_devdata *local_devdata;
@@ -493,13 +477,12 @@ int nx842_compress(const unsigned char *in, unsigned int inlen,
	rcu_read_unlock();
	return ret;
}
EXPORT_SYMBOL_GPL(nx842_compress);

static int sw842_decompress(const unsigned char *, int, unsigned char *, int *,
			const void *);

/**
 * nx842_decompress - Decompress data using the 842 algorithm
 * nx842_pseries_decompress - Decompress data using the 842 algorithm
 *
 * Decompression provide by the NX842 coprocessor on IBM Power systems.
 * The input buffer is decompressed and the result is stored in the
@@ -515,7 +498,7 @@ static int sw842_decompress(const unsigned char *, int, unsigned char *, int *,
 * @out: Pointer to output buffer, must be page aligned
 * @outlen: Length of output buffer, must be PAGE_SIZE
 * @wrkmem: ptr to buffer for working memory, size determined by
 *          nx842_get_workmem_size()
 *          NX842_MEM_COMPRESS
 *
 * Returns:
 *   0		Success, output of length @outlen stored in the buffer at @out
@@ -525,8 +508,9 @@ static int sw842_decompress(const unsigned char *, int, unsigned char *, int *,
 *   -EINVAL	Bad input data encountered when attempting decompress
 *   -EIO	Internal error
 */
int nx842_decompress(const unsigned char *in, unsigned int inlen,
			 unsigned char *out, unsigned int *outlen, void *wmem)
static int nx842_pseries_decompress(const unsigned char *in, unsigned int inlen,
				    unsigned char *out, unsigned int *outlen,
				    void *wmem)
{
	struct nx842_header *hdr;
	struct nx842_devdata *local_devdata;
@@ -694,7 +678,6 @@ int nx842_decompress(const unsigned char *in, unsigned int inlen,
	rcu_read_unlock();
	return ret;
}
EXPORT_SYMBOL_GPL(nx842_decompress);

/**
 * nx842_OF_set_defaults -- Set default (disabled) values for devdata
@@ -1130,6 +1113,12 @@ static struct attribute_group nx842_attribute_group = {
	.attrs = nx842_sysfs_entries,
};

static struct nx842_driver nx842_pseries_driver = {
	.owner =	THIS_MODULE,
	.compress =	nx842_pseries_compress,
	.decompress =	nx842_pseries_decompress,
};

static int __init nx842_probe(struct vio_dev *viodev,
				  const struct vio_device_id *id)
{
@@ -1192,6 +1181,8 @@ static int __init nx842_probe(struct vio_dev *viodev,
		goto error;
	}

	nx842_register_driver(&nx842_pseries_driver);

	return 0;

error_unlock:
@@ -1222,11 +1213,14 @@ static int __exit nx842_remove(struct vio_dev *viodev)
	if (old_devdata)
		kfree(old_devdata->counters);
	kfree(old_devdata);

	nx842_unregister_driver(&nx842_pseries_driver);

	return 0;
}

static struct vio_device_id nx842_driver_ids[] = {
	{"ibm,compression-v1", "ibm,compression"},
	{NX842_PSERIES_COMPAT_NAME "-v1", NX842_PSERIES_COMPAT_NAME},
	{"", ""},
};

@@ -1243,6 +1237,8 @@ static int __init nx842_init(void)
	struct nx842_devdata *new_devdata;
	pr_info("Registering IBM Power 842 compression driver\n");

	BUILD_BUG_ON(sizeof(struct nx842_workmem) > NX842_MEM_COMPRESS);

	RCU_INIT_POINTER(devdata, NULL);
	new_devdata = kzalloc(sizeof(*new_devdata), GFP_KERNEL);
	if (!new_devdata) {
@@ -1272,6 +1268,7 @@ static void __exit nx842_exit(void)
	if (old_devdata)
		dev_set_drvdata(old_devdata->dev, NULL);
	kfree(old_devdata);
	nx842_unregister_driver(&nx842_pseries_driver);
	vio_unregister_driver(&nx842_driver);
}

Loading