diff options
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/nx/nx-842-pseries.c | 10 | ||||
-rw-r--r-- | drivers/crypto/nx/nx-842.c | 38 | ||||
-rw-r--r-- | drivers/crypto/nx/nx-842.h | 2 |
3 files changed, 50 insertions, 0 deletions
diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c index 9b83c9e7fd73..cb481d81df06 100644 --- a/drivers/crypto/nx/nx-842-pseries.c +++ b/drivers/crypto/nx/nx-842-pseries.c | |||
@@ -40,6 +40,13 @@ MODULE_DESCRIPTION("842 H/W Compression driver for IBM Power processors"); | |||
40 | /* IO buffer must be 128 byte aligned */ | 40 | /* IO buffer must be 128 byte aligned */ |
41 | #define IO_BUFFER_ALIGN 128 | 41 | #define IO_BUFFER_ALIGN 128 |
42 | 42 | ||
43 | static struct nx842_constraints nx842_pseries_constraints = { | ||
44 | .alignment = IO_BUFFER_ALIGN, | ||
45 | .multiple = DDE_BUFFER_LAST_MULT, | ||
46 | .minimum = IO_BUFFER_ALIGN, | ||
47 | .maximum = PAGE_SIZE, /* dynamic, max_sync_size */ | ||
48 | }; | ||
49 | |||
43 | struct nx842_header { | 50 | struct nx842_header { |
44 | int blocks_nr; /* number of compressed blocks */ | 51 | int blocks_nr; /* number of compressed blocks */ |
45 | int offset; /* offset of the first block (from beginning of header) */ | 52 | int offset; /* offset of the first block (from beginning of header) */ |
@@ -842,6 +849,8 @@ static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, | |||
842 | goto out; | 849 | goto out; |
843 | } | 850 | } |
844 | 851 | ||
852 | nx842_pseries_constraints.maximum = devdata->max_sync_size; | ||
853 | |||
845 | devdata->max_sync_sg = (unsigned int)min(maxsynccop->comp_sg_limit, | 854 | devdata->max_sync_sg = (unsigned int)min(maxsynccop->comp_sg_limit, |
846 | maxsynccop->decomp_sg_limit); | 855 | maxsynccop->decomp_sg_limit); |
847 | if (devdata->max_sync_sg < 1) { | 856 | if (devdata->max_sync_sg < 1) { |
@@ -1115,6 +1124,7 @@ static struct attribute_group nx842_attribute_group = { | |||
1115 | 1124 | ||
1116 | static struct nx842_driver nx842_pseries_driver = { | 1125 | static struct nx842_driver nx842_pseries_driver = { |
1117 | .owner = THIS_MODULE, | 1126 | .owner = THIS_MODULE, |
1127 | .constraints = &nx842_pseries_constraints, | ||
1118 | .compress = nx842_pseries_compress, | 1128 | .compress = nx842_pseries_compress, |
1119 | .decompress = nx842_pseries_decompress, | 1129 | .decompress = nx842_pseries_decompress, |
1120 | }; | 1130 | }; |
diff --git a/drivers/crypto/nx/nx-842.c b/drivers/crypto/nx/nx-842.c index f1f378eef373..160fe2d97336 100644 --- a/drivers/crypto/nx/nx-842.c +++ b/drivers/crypto/nx/nx-842.c | |||
@@ -86,6 +86,44 @@ static void put_driver(struct nx842_driver *driver) | |||
86 | module_put(driver->owner); | 86 | module_put(driver->owner); |
87 | } | 87 | } |
88 | 88 | ||
89 | /** | ||
90 | * nx842_constraints | ||
91 | * | ||
92 | * This provides the driver's constraints. Different nx842 implementations | ||
93 | * may have varying requirements. The constraints are: | ||
94 | * @alignment: All buffers should be aligned to this | ||
95 | * @multiple: All buffer lengths should be a multiple of this | ||
96 | * @minimum: Buffer lengths must not be less than this amount | ||
97 | * @maximum: Buffer lengths must not be more than this amount | ||
98 | * | ||
99 | * The constraints apply to all buffers and lengths, both input and output, | ||
100 | * for both compression and decompression, except for the minimum which | ||
101 | * only applies to compression input and decompression output; the | ||
102 | * compressed data can be less than the minimum constraint. It can be | ||
103 | * assumed that compressed data will always adhere to the multiple | ||
104 | * constraint. | ||
105 | * | ||
106 | * The driver may succeed even if these constraints are violated; | ||
107 | * however the driver can return failure or suffer reduced performance | ||
108 | * if any constraint is not met. | ||
109 | */ | ||
110 | int nx842_constraints(struct nx842_constraints *c) | ||
111 | { | ||
112 | struct nx842_driver *driver = get_driver(); | ||
113 | int ret = 0; | ||
114 | |||
115 | if (!driver) | ||
116 | return -ENODEV; | ||
117 | |||
118 | BUG_ON(!c); | ||
119 | memcpy(c, driver->constraints, sizeof(*c)); | ||
120 | |||
121 | put_driver(driver); | ||
122 | |||
123 | return ret; | ||
124 | } | ||
125 | EXPORT_SYMBOL_GPL(nx842_constraints); | ||
126 | |||
89 | int nx842_compress(const unsigned char *in, unsigned int in_len, | 127 | int nx842_compress(const unsigned char *in, unsigned int in_len, |
90 | unsigned char *out, unsigned int *out_len, | 128 | unsigned char *out, unsigned int *out_len, |
91 | void *wrkmem) | 129 | void *wrkmem) |
diff --git a/drivers/crypto/nx/nx-842.h b/drivers/crypto/nx/nx-842.h index 2a5d4e197c72..c6ceb0f1d04c 100644 --- a/drivers/crypto/nx/nx-842.h +++ b/drivers/crypto/nx/nx-842.h | |||
@@ -12,6 +12,8 @@ | |||
12 | struct nx842_driver { | 12 | struct nx842_driver { |
13 | struct module *owner; | 13 | struct module *owner; |
14 | 14 | ||
15 | struct nx842_constraints *constraints; | ||
16 | |||
15 | int (*compress)(const unsigned char *in, unsigned int in_len, | 17 | int (*compress)(const unsigned char *in, unsigned int in_len, |
16 | unsigned char *out, unsigned int *out_len, | 18 | unsigned char *out, unsigned int *out_len, |
17 | void *wrkmem); | 19 | void *wrkmem); |