diff options
author | Dan Streetman <ddstreet@ieee.org> | 2015-06-18 12:05:30 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-06-19 02:49:18 -0400 |
commit | c47d63020c03659e584673f78f24f2e5de3e6b9b (patch) | |
tree | 819736bc1e06a911c4ee9da39efb33625c27b921 | |
parent | 7793bda8fe372fe2e71f16d0619b630d6e41c8ba (diff) |
crypto: nx - add LE support to pSeries platform driver
Add support to the nx-842-pseries.c driver for running in little endian
mode.
The pSeries platform NX 842 driver currently only works as big endian.
This adds cpu_to_be*() and be*_to_cpu() in the appropriate places to
work in LE mode also.
Signed-off-by: Dan Streetman <ddstreet@ieee.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/nx/Kconfig | 2 | ||||
-rw-r--r-- | drivers/crypto/nx/nx-842-pseries.c | 83 | ||||
-rw-r--r-- | drivers/crypto/nx/nx-842.h | 3 |
3 files changed, 45 insertions, 43 deletions
diff --git a/drivers/crypto/nx/Kconfig b/drivers/crypto/nx/Kconfig index b1addf6223db..e421c96c763a 100644 --- a/drivers/crypto/nx/Kconfig +++ b/drivers/crypto/nx/Kconfig | |||
@@ -24,7 +24,7 @@ if CRYPTO_DEV_NX_COMPRESS | |||
24 | 24 | ||
25 | config CRYPTO_DEV_NX_COMPRESS_PSERIES | 25 | config CRYPTO_DEV_NX_COMPRESS_PSERIES |
26 | tristate "Compression acceleration support on pSeries platform" | 26 | tristate "Compression acceleration support on pSeries platform" |
27 | depends on PPC_PSERIES && IBMVIO && !CPU_LITTLE_ENDIAN | 27 | depends on PPC_PSERIES && IBMVIO |
28 | default y | 28 | default y |
29 | help | 29 | help |
30 | Support for PowerPC Nest (NX) compression acceleration. This | 30 | Support for PowerPC Nest (NX) compression acceleration. This |
diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c index da52d8edefb3..3040a6091bf2 100644 --- a/drivers/crypto/nx/nx-842-pseries.c +++ b/drivers/crypto/nx/nx-842-pseries.c | |||
@@ -166,8 +166,8 @@ static unsigned long nx842_get_desired_dma(struct vio_dev *viodev) | |||
166 | } | 166 | } |
167 | 167 | ||
168 | struct nx842_slentry { | 168 | struct nx842_slentry { |
169 | unsigned long ptr; /* Real address (use __pa()) */ | 169 | __be64 ptr; /* Real address (use __pa()) */ |
170 | unsigned long len; | 170 | __be64 len; |
171 | }; | 171 | }; |
172 | 172 | ||
173 | /* pHyp scatterlist entry */ | 173 | /* pHyp scatterlist entry */ |
@@ -186,30 +186,21 @@ static inline unsigned long nx842_get_scatterlist_size( | |||
186 | static int nx842_build_scatterlist(unsigned long buf, int len, | 186 | static int nx842_build_scatterlist(unsigned long buf, int len, |
187 | struct nx842_scatterlist *sl) | 187 | struct nx842_scatterlist *sl) |
188 | { | 188 | { |
189 | unsigned long nextpage; | 189 | unsigned long entrylen; |
190 | struct nx842_slentry *entry; | 190 | struct nx842_slentry *entry; |
191 | 191 | ||
192 | sl->entry_nr = 0; | 192 | sl->entry_nr = 0; |
193 | 193 | ||
194 | entry = sl->entries; | 194 | entry = sl->entries; |
195 | while (len) { | 195 | while (len) { |
196 | entry->ptr = nx842_get_pa((void *)buf); | 196 | entry->ptr = cpu_to_be64(nx842_get_pa((void *)buf)); |
197 | nextpage = ALIGN(buf + 1, NX842_HW_PAGE_SIZE); | 197 | entrylen = min_t(int, len, |
198 | if (nextpage < buf + len) { | 198 | LEN_ON_SIZE(buf, NX842_HW_PAGE_SIZE)); |
199 | /* we aren't at the end yet */ | 199 | entry->len = cpu_to_be64(entrylen); |
200 | if (IS_ALIGNED(buf, NX842_HW_PAGE_SIZE)) | 200 | |
201 | /* we are in the middle (or beginning) */ | 201 | len -= entrylen; |
202 | entry->len = NX842_HW_PAGE_SIZE; | 202 | buf += entrylen; |
203 | else | 203 | |
204 | /* we are at the beginning */ | ||
205 | entry->len = nextpage - buf; | ||
206 | } else { | ||
207 | /* at the end */ | ||
208 | entry->len = len; | ||
209 | } | ||
210 | |||
211 | len -= entry->len; | ||
212 | buf += entry->len; | ||
213 | sl->entry_nr++; | 204 | sl->entry_nr++; |
214 | entry++; | 205 | entry++; |
215 | } | 206 | } |
@@ -230,8 +221,8 @@ static int nx842_validate_result(struct device *dev, | |||
230 | csb->completion_code, | 221 | csb->completion_code, |
231 | csb->completion_extension); | 222 | csb->completion_extension); |
232 | dev_dbg(dev, "processed_bytes:%d address:0x%016lx\n", | 223 | dev_dbg(dev, "processed_bytes:%d address:0x%016lx\n", |
233 | csb->processed_byte_count, | 224 | be32_to_cpu(csb->processed_byte_count), |
234 | (unsigned long)csb->address); | 225 | (unsigned long)be64_to_cpu(csb->address)); |
235 | return -EIO; | 226 | return -EIO; |
236 | } | 227 | } |
237 | 228 | ||
@@ -338,7 +329,6 @@ static int nx842_pseries_compress(const unsigned char *in, unsigned int inlen, | |||
338 | csbcpb = &workmem->csbcpb; | 329 | csbcpb = &workmem->csbcpb; |
339 | memset(csbcpb, 0, sizeof(*csbcpb)); | 330 | memset(csbcpb, 0, sizeof(*csbcpb)); |
340 | op.csbcpb = nx842_get_pa(csbcpb); | 331 | op.csbcpb = nx842_get_pa(csbcpb); |
341 | op.out = nx842_get_pa(slout.entries); | ||
342 | 332 | ||
343 | if ((inbuf & NX842_HW_PAGE_MASK) == | 333 | if ((inbuf & NX842_HW_PAGE_MASK) == |
344 | ((inbuf + inlen - 1) & NX842_HW_PAGE_MASK)) { | 334 | ((inbuf + inlen - 1) & NX842_HW_PAGE_MASK)) { |
@@ -364,6 +354,10 @@ static int nx842_pseries_compress(const unsigned char *in, unsigned int inlen, | |||
364 | op.outlen = -nx842_get_scatterlist_size(&slout); | 354 | op.outlen = -nx842_get_scatterlist_size(&slout); |
365 | } | 355 | } |
366 | 356 | ||
357 | dev_dbg(dev, "%s: op.in %lx op.inlen %ld op.out %lx op.outlen %ld\n", | ||
358 | __func__, (unsigned long)op.in, (long)op.inlen, | ||
359 | (unsigned long)op.out, (long)op.outlen); | ||
360 | |||
367 | /* Send request to pHyp */ | 361 | /* Send request to pHyp */ |
368 | ret = vio_h_cop_sync(local_devdata->vdev, &op); | 362 | ret = vio_h_cop_sync(local_devdata->vdev, &op); |
369 | 363 | ||
@@ -380,7 +374,7 @@ static int nx842_pseries_compress(const unsigned char *in, unsigned int inlen, | |||
380 | if (ret) | 374 | if (ret) |
381 | goto unlock; | 375 | goto unlock; |
382 | 376 | ||
383 | *outlen = csbcpb->csb.processed_byte_count; | 377 | *outlen = be32_to_cpu(csbcpb->csb.processed_byte_count); |
384 | dev_dbg(dev, "%s: processed_bytes=%d\n", __func__, *outlen); | 378 | dev_dbg(dev, "%s: processed_bytes=%d\n", __func__, *outlen); |
385 | 379 | ||
386 | unlock: | 380 | unlock: |
@@ -493,6 +487,10 @@ static int nx842_pseries_decompress(const unsigned char *in, unsigned int inlen, | |||
493 | op.outlen = -nx842_get_scatterlist_size(&slout); | 487 | op.outlen = -nx842_get_scatterlist_size(&slout); |
494 | } | 488 | } |
495 | 489 | ||
490 | dev_dbg(dev, "%s: op.in %lx op.inlen %ld op.out %lx op.outlen %ld\n", | ||
491 | __func__, (unsigned long)op.in, (long)op.inlen, | ||
492 | (unsigned long)op.out, (long)op.outlen); | ||
493 | |||
496 | /* Send request to pHyp */ | 494 | /* Send request to pHyp */ |
497 | ret = vio_h_cop_sync(local_devdata->vdev, &op); | 495 | ret = vio_h_cop_sync(local_devdata->vdev, &op); |
498 | 496 | ||
@@ -508,7 +506,7 @@ static int nx842_pseries_decompress(const unsigned char *in, unsigned int inlen, | |||
508 | if (ret) | 506 | if (ret) |
509 | goto unlock; | 507 | goto unlock; |
510 | 508 | ||
511 | *outlen = csbcpb->csb.processed_byte_count; | 509 | *outlen = be32_to_cpu(csbcpb->csb.processed_byte_count); |
512 | 510 | ||
513 | unlock: | 511 | unlock: |
514 | if (ret) | 512 | if (ret) |
@@ -600,16 +598,16 @@ static int nx842_OF_upd_status(struct nx842_devdata *devdata, | |||
600 | static int nx842_OF_upd_maxsglen(struct nx842_devdata *devdata, | 598 | static int nx842_OF_upd_maxsglen(struct nx842_devdata *devdata, |
601 | struct property *prop) { | 599 | struct property *prop) { |
602 | int ret = 0; | 600 | int ret = 0; |
603 | const int *maxsglen = prop->value; | 601 | const unsigned int maxsglen = of_read_number(prop->value, 1); |
604 | 602 | ||
605 | if (prop->length != sizeof(*maxsglen)) { | 603 | if (prop->length != sizeof(maxsglen)) { |
606 | dev_err(devdata->dev, "%s: unexpected format for ibm,max-sg-len property\n", __func__); | 604 | dev_err(devdata->dev, "%s: unexpected format for ibm,max-sg-len property\n", __func__); |
607 | dev_dbg(devdata->dev, "%s: ibm,max-sg-len is %d bytes long, expected %lu bytes\n", __func__, | 605 | dev_dbg(devdata->dev, "%s: ibm,max-sg-len is %d bytes long, expected %lu bytes\n", __func__, |
608 | prop->length, sizeof(*maxsglen)); | 606 | prop->length, sizeof(maxsglen)); |
609 | ret = -EINVAL; | 607 | ret = -EINVAL; |
610 | } else { | 608 | } else { |
611 | devdata->max_sg_len = (unsigned int)min(*maxsglen, | 609 | devdata->max_sg_len = min_t(unsigned int, |
612 | (int)NX842_HW_PAGE_SIZE); | 610 | maxsglen, NX842_HW_PAGE_SIZE); |
613 | } | 611 | } |
614 | 612 | ||
615 | return ret; | 613 | return ret; |
@@ -648,13 +646,15 @@ static int nx842_OF_upd_maxsglen(struct nx842_devdata *devdata, | |||
648 | static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, | 646 | static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, |
649 | struct property *prop) { | 647 | struct property *prop) { |
650 | int ret = 0; | 648 | int ret = 0; |
649 | unsigned int comp_data_limit, decomp_data_limit; | ||
650 | unsigned int comp_sg_limit, decomp_sg_limit; | ||
651 | const struct maxsynccop_t { | 651 | const struct maxsynccop_t { |
652 | int comp_elements; | 652 | __be32 comp_elements; |
653 | int comp_data_limit; | 653 | __be32 comp_data_limit; |
654 | int comp_sg_limit; | 654 | __be32 comp_sg_limit; |
655 | int decomp_elements; | 655 | __be32 decomp_elements; |
656 | int decomp_data_limit; | 656 | __be32 decomp_data_limit; |
657 | int decomp_sg_limit; | 657 | __be32 decomp_sg_limit; |
658 | } *maxsynccop; | 658 | } *maxsynccop; |
659 | 659 | ||
660 | if (prop->length != sizeof(*maxsynccop)) { | 660 | if (prop->length != sizeof(*maxsynccop)) { |
@@ -666,14 +666,16 @@ static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, | |||
666 | } | 666 | } |
667 | 667 | ||
668 | maxsynccop = (const struct maxsynccop_t *)prop->value; | 668 | maxsynccop = (const struct maxsynccop_t *)prop->value; |
669 | comp_data_limit = be32_to_cpu(maxsynccop->comp_data_limit); | ||
670 | comp_sg_limit = be32_to_cpu(maxsynccop->comp_sg_limit); | ||
671 | decomp_data_limit = be32_to_cpu(maxsynccop->decomp_data_limit); | ||
672 | decomp_sg_limit = be32_to_cpu(maxsynccop->decomp_sg_limit); | ||
669 | 673 | ||
670 | /* Use one limit rather than separate limits for compression and | 674 | /* Use one limit rather than separate limits for compression and |
671 | * decompression. Set a maximum for this so as not to exceed the | 675 | * decompression. Set a maximum for this so as not to exceed the |
672 | * size that the header can support and round the value down to | 676 | * size that the header can support and round the value down to |
673 | * the hardware page size (4K) */ | 677 | * the hardware page size (4K) */ |
674 | devdata->max_sync_size = | 678 | devdata->max_sync_size = min(comp_data_limit, decomp_data_limit); |
675 | (unsigned int)min(maxsynccop->comp_data_limit, | ||
676 | maxsynccop->decomp_data_limit); | ||
677 | 679 | ||
678 | devdata->max_sync_size = min_t(unsigned int, devdata->max_sync_size, | 680 | devdata->max_sync_size = min_t(unsigned int, devdata->max_sync_size, |
679 | 65536); | 681 | 65536); |
@@ -689,8 +691,7 @@ static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, | |||
689 | 691 | ||
690 | nx842_pseries_constraints.maximum = devdata->max_sync_size; | 692 | nx842_pseries_constraints.maximum = devdata->max_sync_size; |
691 | 693 | ||
692 | devdata->max_sync_sg = (unsigned int)min(maxsynccop->comp_sg_limit, | 694 | devdata->max_sync_sg = min(comp_sg_limit, decomp_sg_limit); |
693 | maxsynccop->decomp_sg_limit); | ||
694 | if (devdata->max_sync_sg < 1) { | 695 | if (devdata->max_sync_sg < 1) { |
695 | dev_err(devdata->dev, "%s: hardware max sg size (%u) is " | 696 | dev_err(devdata->dev, "%s: hardware max sg size (%u) is " |
696 | "less than the driver minimum, unable to use " | 697 | "less than the driver minimum, unable to use " |
diff --git a/drivers/crypto/nx/nx-842.h b/drivers/crypto/nx/nx-842.h index f6821b65b7ce..ac0ea79d0f8b 100644 --- a/drivers/crypto/nx/nx-842.h +++ b/drivers/crypto/nx/nx-842.h | |||
@@ -88,7 +88,8 @@ | |||
88 | #define CCB_CM_EXTRA_WRITE (CCB_CM0_ALL_COMPLETIONS & CCB_CM12_STORE) | 88 | #define CCB_CM_EXTRA_WRITE (CCB_CM0_ALL_COMPLETIONS & CCB_CM12_STORE) |
89 | #define CCB_CM_INTERRUPT (CCB_CM0_ALL_COMPLETIONS & CCB_CM12_INTERRUPT) | 89 | #define CCB_CM_INTERRUPT (CCB_CM0_ALL_COMPLETIONS & CCB_CM12_INTERRUPT) |
90 | 90 | ||
91 | #define LEN_ON_PAGE(pa) (PAGE_SIZE - ((pa) & ~PAGE_MASK)) | 91 | #define LEN_ON_SIZE(pa, size) ((size) - ((pa) & ((size) - 1))) |
92 | #define LEN_ON_PAGE(pa) LEN_ON_SIZE(pa, PAGE_SIZE) | ||
92 | 93 | ||
93 | static inline unsigned long nx842_get_pa(void *addr) | 94 | static inline unsigned long nx842_get_pa(void *addr) |
94 | { | 95 | { |