xref: /openbmc/linux/drivers/crypto/nx/nx-842.c (revision 179dd8c0)
1 /*
2  * Driver frontend for IBM Power 842 compression accelerator
3  *
4  * Copyright (C) 2015 Dan Streetman, IBM Corp
5  *
6  * Designer of the Power data compression engine:
7  *   Bulent Abali <abali@us.ibm.com>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  */
19 
20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21 
22 #include "nx-842.h"
23 
24 MODULE_LICENSE("GPL");
25 MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>");
26 MODULE_DESCRIPTION("842 H/W Compression driver for IBM Power processors");
27 
28 /**
29  * nx842_constraints
30  *
31  * This provides the driver's constraints.  Different nx842 implementations
32  * may have varying requirements.  The constraints are:
33  *   @alignment:	All buffers should be aligned to this
34  *   @multiple:		All buffer lengths should be a multiple of this
35  *   @minimum:		Buffer lengths must not be less than this amount
36  *   @maximum:		Buffer lengths must not be more than this amount
37  *
38  * The constraints apply to all buffers and lengths, both input and output,
39  * for both compression and decompression, except for the minimum which
40  * only applies to compression input and decompression output; the
41  * compressed data can be less than the minimum constraint.  It can be
42  * assumed that compressed data will always adhere to the multiple
43  * constraint.
44  *
45  * The driver may succeed even if these constraints are violated;
46  * however the driver can return failure or suffer reduced performance
47  * if any constraint is not met.
48  */
49 int nx842_constraints(struct nx842_constraints *c)
50 {
51 	memcpy(c, nx842_platform_driver()->constraints, sizeof(*c));
52 	return 0;
53 }
54 EXPORT_SYMBOL_GPL(nx842_constraints);
55 
56 /**
57  * nx842_workmem_size
58  *
59  * Get the amount of working memory the driver requires.
60  */
61 size_t nx842_workmem_size(void)
62 {
63 	return nx842_platform_driver()->workmem_size;
64 }
65 EXPORT_SYMBOL_GPL(nx842_workmem_size);
66 
67 int nx842_compress(const unsigned char *in, unsigned int ilen,
68 		   unsigned char *out, unsigned int *olen, void *wmem)
69 {
70 	return nx842_platform_driver()->compress(in, ilen, out, olen, wmem);
71 }
72 EXPORT_SYMBOL_GPL(nx842_compress);
73 
74 int nx842_decompress(const unsigned char *in, unsigned int ilen,
75 		     unsigned char *out, unsigned int *olen, void *wmem)
76 {
77 	return nx842_platform_driver()->decompress(in, ilen, out, olen, wmem);
78 }
79 EXPORT_SYMBOL_GPL(nx842_decompress);
80 
81 static __init int nx842_init(void)
82 {
83 	request_module("nx-compress-powernv");
84 	request_module("nx-compress-pseries");
85 
86 	/* we prevent loading if there's no platform driver, and we get the
87 	 * module that set it so it won't unload, so we don't need to check
88 	 * if it's set in any of the above functions
89 	 */
90 	if (!nx842_platform_driver_get()) {
91 		pr_err("no nx842 driver found.\n");
92 		return -ENODEV;
93 	}
94 
95 	return 0;
96 }
97 module_init(nx842_init);
98 
99 static void __exit nx842_exit(void)
100 {
101 	nx842_platform_driver_put();
102 }
103 module_exit(nx842_exit);
104