aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Streetman <ddstreet@ieee.org>2015-06-18 12:05:30 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-06-19 02:49:18 -0400
commitc47d63020c03659e584673f78f24f2e5de3e6b9b (patch)
tree819736bc1e06a911c4ee9da39efb33625c27b921
parent7793bda8fe372fe2e71f16d0619b630d6e41c8ba (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/Kconfig2
-rw-r--r--drivers/crypto/nx/nx-842-pseries.c83
-rw-r--r--drivers/crypto/nx/nx-842.h3
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
25config CRYPTO_DEV_NX_COMPRESS_PSERIES 25config 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
168struct nx842_slentry { 168struct 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(
186static int nx842_build_scatterlist(unsigned long buf, int len, 186static 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
386unlock: 380unlock:
@@ -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
513unlock: 511unlock:
514 if (ret) 512 if (ret)
@@ -600,16 +598,16 @@ static int nx842_OF_upd_status(struct nx842_devdata *devdata,
600static int nx842_OF_upd_maxsglen(struct nx842_devdata *devdata, 598static 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,
648static int nx842_OF_upd_maxsyncop(struct nx842_devdata *devdata, 646static 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
93static inline unsigned long nx842_get_pa(void *addr) 94static inline unsigned long nx842_get_pa(void *addr)
94{ 95{