Skip to content

Commit

Permalink
crypto: nx - merge nx-compress and nx-compress-crypto
Browse files Browse the repository at this point in the history
Merge the nx-842.c code into nx-842-crypto.c.

This allows later patches to remove the 'platform' driver, and instead
allow each platform driver to directly register with the crypto
compression api.

Signed-off-by: Dan Streetman <ddstreet@ieee.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Dan Streetman authored and Herbert Xu committed Jul 23, 2015
1 parent 20fc311 commit d31581a
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 162 deletions.
17 changes: 5 additions & 12 deletions drivers/crypto/nx/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,14 @@ config CRYPTO_DEV_NX_ENCRYPT
config CRYPTO_DEV_NX_COMPRESS
tristate "Compression acceleration support"
default y
select CRYPTO_ALGAPI
select 842_DECOMPRESS
help
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.
algorithm using the cryptographic API. 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

Expand All @@ -42,14 +45,4 @@ config CRYPTO_DEV_NX_COMPRESS_POWERNV
algorithm. This supports NX hardware on the PowerNV platform.
If you choose 'M' here, this module will be called nx_compress_powernv.

config CRYPTO_DEV_NX_COMPRESS_CRYPTO
tristate "Compression acceleration cryptographic interface"
select CRYPTO_ALGAPI
select 842_DECOMPRESS
default y
help
Support for PowerPC Nest (NX) accelerators using the cryptographic
API. If you choose 'M' here, this module will be called
nx_compress_crypto.

endif
4 changes: 1 addition & 3 deletions drivers/crypto/nx/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ nx-crypto-objs := nx.o \
obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS) += nx-compress.o nx-compress-platform.o
obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS_PSERIES) += nx-compress-pseries.o
obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS_POWERNV) += nx-compress-powernv.o
obj-$(CONFIG_CRYPTO_DEV_NX_COMPRESS_CRYPTO) += nx-compress-crypto.o
nx-compress-objs := nx-842.o
nx-compress-objs := nx-842-crypto.o
nx-compress-platform-objs := nx-842-platform.o
nx-compress-pseries-objs := nx-842-pseries.o
nx-compress-powernv-objs := nx-842-powernv.o
nx-compress-crypto-objs := nx-842-crypto.o
70 changes: 35 additions & 35 deletions drivers/crypto/nx/nx-842-crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
*
* Copyright (C) IBM Corporation, 2011-2015
*
* Designer of the Power data compression engine:
* Bulent Abali <abali@us.ibm.com>
*
* Original Authors: Robert Jennings <rcj@linux.vnet.ibm.com>
* Seth Jennings <sjenning@linux.vnet.ibm.com>
*
Expand Down Expand Up @@ -162,24 +165,11 @@ static void nx842_crypto_exit(struct crypto_tfm *tfm)
free_page((unsigned long)ctx->dbounce);
}

static int read_constraints(struct nx842_constraints *c)
static void check_constraints(struct nx842_constraints *c)
{
int ret;

ret = nx842_constraints(c);
if (ret) {
pr_err_ratelimited("could not get nx842 constraints : %d\n",
ret);
return ret;
}

/* limit maximum, to always have enough bounce buffer to decompress */
if (c->maximum > BOUNCE_BUFFER_SIZE) {
if (c->maximum > BOUNCE_BUFFER_SIZE)
c->maximum = BOUNCE_BUFFER_SIZE;
pr_info_once("limiting nx842 maximum to %x\n", c->maximum);
}

return 0;
}

static int nx842_crypto_add_header(struct nx842_crypto_header *hdr, u8 *buf)
Expand Down Expand Up @@ -260,7 +250,9 @@ static int compress(struct nx842_crypto_ctx *ctx,
timeout = ktime_add_ms(ktime_get(), COMP_BUSY_TIMEOUT);
do {
dlen = tmplen; /* reset dlen, if we're retrying */
ret = nx842_compress(src, slen, dst, &dlen, ctx->wmem);
ret = nx842_platform_driver()->compress(src, slen,
dst, &dlen,
ctx->wmem);
/* possibly we should reduce the slen here, instead of
* retrying with the dbounce buffer?
*/
Expand Down Expand Up @@ -297,12 +289,14 @@ static int nx842_crypto_compress(struct crypto_tfm *tfm,
struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
struct nx842_crypto_header *hdr = &ctx->header;
struct nx842_crypto_param p;
struct nx842_constraints c;
struct nx842_constraints c = *nx842_platform_driver()->constraints;
unsigned int groups, hdrsize, h;
int ret, n;
bool add_header;
u16 ignore = 0;

check_constraints(&c);

p.in = (u8 *)src;
p.iremain = slen;
p.out = dst;
Expand All @@ -311,10 +305,6 @@ static int nx842_crypto_compress(struct crypto_tfm *tfm,

*dlen = 0;

ret = read_constraints(&c);
if (ret)
return ret;

groups = min_t(unsigned int, NX842_CRYPTO_GROUP_MAX,
DIV_ROUND_UP(p.iremain, c.maximum));
hdrsize = NX842_CRYPTO_HEADER_SIZE(groups);
Expand Down Expand Up @@ -381,8 +371,7 @@ static int decompress(struct nx842_crypto_ctx *ctx,
struct nx842_crypto_param *p,
struct nx842_crypto_header_group *g,
struct nx842_constraints *c,
u16 ignore,
bool usehw)
u16 ignore)
{
unsigned int slen = be32_to_cpu(g->compressed_length);
unsigned int required_len = be32_to_cpu(g->uncompressed_length);
Expand All @@ -404,9 +393,6 @@ static int decompress(struct nx842_crypto_ctx *ctx,

src += padding;

if (!usehw)
goto usesw;

if (slen % c->multiple)
adj_slen = round_up(slen, c->multiple);
if (slen < c->minimum)
Expand Down Expand Up @@ -443,7 +429,9 @@ static int decompress(struct nx842_crypto_ctx *ctx,
timeout = ktime_add_ms(ktime_get(), DECOMP_BUSY_TIMEOUT);
do {
dlen = tmplen; /* reset dlen, if we're retrying */
ret = nx842_decompress(src, slen, dst, &dlen, ctx->wmem);
ret = nx842_platform_driver()->decompress(src, slen,
dst, &dlen,
ctx->wmem);
} while (ret == -EBUSY && ktime_before(ktime_get(), timeout));
if (ret) {
usesw:
Expand Down Expand Up @@ -486,10 +474,11 @@ static int nx842_crypto_decompress(struct crypto_tfm *tfm,
struct nx842_crypto_ctx *ctx = crypto_tfm_ctx(tfm);
struct nx842_crypto_header *hdr;
struct nx842_crypto_param p;
struct nx842_constraints c;
struct nx842_constraints c = *nx842_platform_driver()->constraints;
int n, ret, hdr_len;
u16 ignore = 0;
bool usehw = true;

check_constraints(&c);

p.in = (u8 *)src;
p.iremain = slen;
Expand All @@ -499,9 +488,6 @@ static int nx842_crypto_decompress(struct crypto_tfm *tfm,

*dlen = 0;

if (read_constraints(&c))
usehw = false;

hdr = (struct nx842_crypto_header *)src;

spin_lock_bh(&ctx->lock);
Expand All @@ -516,7 +502,7 @@ static int nx842_crypto_decompress(struct crypto_tfm *tfm,
.uncompressed_length = cpu_to_be32(p.oremain),
};

ret = decompress(ctx, &p, &g, &c, 0, usehw);
ret = decompress(ctx, &p, &g, &c, 0);
if (ret)
goto unlock;

Expand Down Expand Up @@ -549,7 +535,7 @@ static int nx842_crypto_decompress(struct crypto_tfm *tfm,
if (n + 1 == hdr->groups)
ignore = be16_to_cpu(hdr->ignore);

ret = decompress(ctx, &p, &hdr->group[n], &c, ignore, usehw);
ret = decompress(ctx, &p, &hdr->group[n], &c, ignore);
if (ret)
goto unlock;
}
Expand Down Expand Up @@ -583,18 +569,32 @@ static struct crypto_alg alg = {

static int __init nx842_crypto_mod_init(void)
{
request_module("nx-compress-powernv");
request_module("nx-compress-pseries");

/* we prevent loading/registering if there's no platform driver,
* and we get the platform module that set it so it won't unload,
* so we don't need to check if it's set in any of our functions
*/
if (!nx842_platform_driver_get()) {
pr_err("no nx842 platform driver found.\n");
return -ENODEV;
}

return crypto_register_alg(&alg);
}
module_init(nx842_crypto_mod_init);

static void __exit nx842_crypto_mod_exit(void)
{
crypto_unregister_alg(&alg);

nx842_platform_driver_put();
}
module_exit(nx842_crypto_mod_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("IBM PowerPC Nest (NX) 842 Hardware Compression Interface");
MODULE_DESCRIPTION("IBM PowerPC Nest (NX) 842 Hardware Compression Driver");
MODULE_ALIAS_CRYPTO("842");
MODULE_ALIAS_CRYPTO("842-nx");
MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>");
103 changes: 0 additions & 103 deletions drivers/crypto/nx/nx-842.c

This file was deleted.

28 changes: 19 additions & 9 deletions drivers/crypto/nx/nx-842.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,25 @@ static inline unsigned long nx842_get_pa(void *addr)
#define GET_FIELD(v, m) (((v) & (m)) >> MASK_LSH(m))
#define SET_FIELD(v, m, val) (((v) & ~(m)) | (((val) << MASK_LSH(m)) & (m)))

/**
* This provides the driver's constraints. Different nx842 implementations
* may have varying requirements. The constraints are:
* @alignment: All buffers should be aligned to this
* @multiple: All buffer lengths should be a multiple of this
* @minimum: Buffer lengths must not be less than this amount
* @maximum: Buffer lengths must not be more than this amount
*
* The constraints apply to all buffers and lengths, both input and output,
* for both compression and decompression, except for the minimum which
* only applies to compression input and decompression output; the
* compressed data can be less than the minimum constraint. It can be
* assumed that compressed data will always adhere to the multiple
* constraint.
*
* The driver may succeed even if these constraints are violated;
* however the driver can return failure or suffer reduced performance
* if any constraint is not met.
*/
struct nx842_constraints {
int alignment;
int multiple;
Expand Down Expand Up @@ -132,13 +151,4 @@ void nx842_platform_driver_unset(struct nx842_driver *driver);
bool nx842_platform_driver_get(void);
void nx842_platform_driver_put(void);

size_t nx842_workmem_size(void);

int nx842_constraints(struct nx842_constraints *constraints);

int nx842_compress(const unsigned char *in, unsigned int in_len,
unsigned char *out, unsigned int *out_len, void *wrkmem);
int nx842_decompress(const unsigned char *in, unsigned int in_len,
unsigned char *out, unsigned int *out_len, void *wrkmem);

#endif /* __NX_842_H__ */

0 comments on commit d31581a

Please sign in to comment.