xref: /linux/drivers/crypto/nx/nx-common-powernv.c (revision 917bda9ab155032a02be1a57ebd4d949ae9e1528)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Driver for IBM PowerNV compression accelerator
4  *
5  * Copyright (C) 2015 Dan Streetman, IBM Corp
6  */
7 
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 
10 #include "nx-842.h"
11 
12 #include <linux/timer.h>
13 
14 #include <asm/prom.h>
15 #include <asm/icswx.h>
16 #include <asm/vas.h>
17 #include <asm/reg.h>
18 #include <asm/opal-api.h>
19 #include <asm/opal.h>
20 
21 MODULE_LICENSE("GPL");
22 MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>");
23 MODULE_DESCRIPTION("H/W Compression driver for IBM PowerNV processors");
24 MODULE_ALIAS_CRYPTO("842");
25 MODULE_ALIAS_CRYPTO("842-nx");
26 
27 #define WORKMEM_ALIGN	(CRB_ALIGN)
28 #define CSB_WAIT_MAX	(5000) /* ms */
29 #define VAS_RETRIES	(10)
30 
31 struct nx842_workmem {
32 	/* Below fields must be properly aligned */
33 	struct coprocessor_request_block crb; /* CRB_ALIGN align */
34 	struct data_descriptor_entry ddl_in[DDL_LEN_MAX]; /* DDE_ALIGN align */
35 	struct data_descriptor_entry ddl_out[DDL_LEN_MAX]; /* DDE_ALIGN align */
36 	/* Above fields must be properly aligned */
37 
38 	ktime_t start;
39 
40 	char padding[WORKMEM_ALIGN]; /* unused, to allow alignment */
41 } __packed __aligned(WORKMEM_ALIGN);
42 
43 struct nx_coproc {
44 	unsigned int chip_id;
45 	unsigned int ct;	/* Can be 842 or GZIP high/normal*/
46 	unsigned int ci;	/* Coprocessor instance, used with icswx */
47 	struct {
48 		struct vas_window *rxwin;
49 		int id;
50 	} vas;
51 	struct list_head list;
52 };
53 
54 /*
55  * Send the request to NX engine on the chip for the corresponding CPU
56  * where the process is executing. Use with VAS function.
57  */
58 static DEFINE_PER_CPU(struct vas_window *, cpu_txwin);
59 
60 /* no cpu hotplug on powernv, so this list never changes after init */
61 static LIST_HEAD(nx_coprocs);
62 static unsigned int nx842_ct;	/* used in icswx function */
63 
64 /*
65  * Using same values as in skiboot or coprocessor type representing
66  * in NX workbook.
67  */
68 #define NX_CT_GZIP	(2)	/* on P9 and later */
69 #define NX_CT_842	(3)
70 
71 static int (*nx842_powernv_exec)(const unsigned char *in,
72 				unsigned int inlen, unsigned char *out,
73 				unsigned int *outlenp, void *workmem, int fc);
74 
75 /**
76  * setup_indirect_dde - Setup an indirect DDE
77  *
78  * The DDE is setup with the DDE count, byte count, and address of
79  * first direct DDE in the list.
80  */
81 static void setup_indirect_dde(struct data_descriptor_entry *dde,
82 			       struct data_descriptor_entry *ddl,
83 			       unsigned int dde_count, unsigned int byte_count)
84 {
85 	dde->flags = 0;
86 	dde->count = dde_count;
87 	dde->index = 0;
88 	dde->length = cpu_to_be32(byte_count);
89 	dde->address = cpu_to_be64(nx842_get_pa(ddl));
90 }
91 
92 /**
93  * setup_direct_dde - Setup single DDE from buffer
94  *
95  * The DDE is setup with the buffer and length.  The buffer must be properly
96  * aligned.  The used length is returned.
97  * Returns:
98  *   N    Successfully set up DDE with N bytes
99  */
100 static unsigned int setup_direct_dde(struct data_descriptor_entry *dde,
101 				     unsigned long pa, unsigned int len)
102 {
103 	unsigned int l = min_t(unsigned int, len, LEN_ON_PAGE(pa));
104 
105 	dde->flags = 0;
106 	dde->count = 0;
107 	dde->index = 0;
108 	dde->length = cpu_to_be32(l);
109 	dde->address = cpu_to_be64(pa);
110 
111 	return l;
112 }
113 
114 /**
115  * setup_ddl - Setup DDL from buffer
116  *
117  * Returns:
118  *   0		Successfully set up DDL
119  */
120 static int setup_ddl(struct data_descriptor_entry *dde,
121 		     struct data_descriptor_entry *ddl,
122 		     unsigned char *buf, unsigned int len,
123 		     bool in)
124 {
125 	unsigned long pa = nx842_get_pa(buf);
126 	int i, ret, total_len = len;
127 
128 	if (!IS_ALIGNED(pa, DDE_BUFFER_ALIGN)) {
129 		pr_debug("%s buffer pa 0x%lx not 0x%x-byte aligned\n",
130 			 in ? "input" : "output", pa, DDE_BUFFER_ALIGN);
131 		return -EINVAL;
132 	}
133 
134 	/* only need to check last mult; since buffer must be
135 	 * DDE_BUFFER_ALIGN aligned, and that is a multiple of
136 	 * DDE_BUFFER_SIZE_MULT, and pre-last page DDE buffers
137 	 * are guaranteed a multiple of DDE_BUFFER_SIZE_MULT.
138 	 */
139 	if (len % DDE_BUFFER_LAST_MULT) {
140 		pr_debug("%s buffer len 0x%x not a multiple of 0x%x\n",
141 			 in ? "input" : "output", len, DDE_BUFFER_LAST_MULT);
142 		if (in)
143 			return -EINVAL;
144 		len = round_down(len, DDE_BUFFER_LAST_MULT);
145 	}
146 
147 	/* use a single direct DDE */
148 	if (len <= LEN_ON_PAGE(pa)) {
149 		ret = setup_direct_dde(dde, pa, len);
150 		WARN_ON(ret < len);
151 		return 0;
152 	}
153 
154 	/* use the DDL */
155 	for (i = 0; i < DDL_LEN_MAX && len > 0; i++) {
156 		ret = setup_direct_dde(&ddl[i], pa, len);
157 		buf += ret;
158 		len -= ret;
159 		pa = nx842_get_pa(buf);
160 	}
161 
162 	if (len > 0) {
163 		pr_debug("0x%x total %s bytes 0x%x too many for DDL.\n",
164 			 total_len, in ? "input" : "output", len);
165 		if (in)
166 			return -EMSGSIZE;
167 		total_len -= len;
168 	}
169 	setup_indirect_dde(dde, ddl, i, total_len);
170 
171 	return 0;
172 }
173 
174 #define CSB_ERR(csb, msg, ...)					\
175 	pr_err("ERROR: " msg " : %02x %02x %02x %02x %08x\n",	\
176 	       ##__VA_ARGS__, (csb)->flags,			\
177 	       (csb)->cs, (csb)->cc, (csb)->ce,			\
178 	       be32_to_cpu((csb)->count))
179 
180 #define CSB_ERR_ADDR(csb, msg, ...)				\
181 	CSB_ERR(csb, msg " at %lx", ##__VA_ARGS__,		\
182 		(unsigned long)be64_to_cpu((csb)->address))
183 
184 /**
185  * wait_for_csb
186  */
187 static int wait_for_csb(struct nx842_workmem *wmem,
188 			struct coprocessor_status_block *csb)
189 {
190 	ktime_t start = wmem->start, now = ktime_get();
191 	ktime_t timeout = ktime_add_ms(start, CSB_WAIT_MAX);
192 
193 	while (!(READ_ONCE(csb->flags) & CSB_V)) {
194 		cpu_relax();
195 		now = ktime_get();
196 		if (ktime_after(now, timeout))
197 			break;
198 	}
199 
200 	/* hw has updated csb and output buffer */
201 	barrier();
202 
203 	/* check CSB flags */
204 	if (!(csb->flags & CSB_V)) {
205 		CSB_ERR(csb, "CSB still not valid after %ld us, giving up",
206 			(long)ktime_us_delta(now, start));
207 		return -ETIMEDOUT;
208 	}
209 	if (csb->flags & CSB_F) {
210 		CSB_ERR(csb, "Invalid CSB format");
211 		return -EPROTO;
212 	}
213 	if (csb->flags & CSB_CH) {
214 		CSB_ERR(csb, "Invalid CSB chaining state");
215 		return -EPROTO;
216 	}
217 
218 	/* verify CSB completion sequence is 0 */
219 	if (csb->cs) {
220 		CSB_ERR(csb, "Invalid CSB completion sequence");
221 		return -EPROTO;
222 	}
223 
224 	/* check CSB Completion Code */
225 	switch (csb->cc) {
226 	/* no error */
227 	case CSB_CC_SUCCESS:
228 		break;
229 	case CSB_CC_TPBC_GT_SPBC:
230 		/* not an error, but the compressed data is
231 		 * larger than the uncompressed data :(
232 		 */
233 		break;
234 
235 	/* input data errors */
236 	case CSB_CC_OPERAND_OVERLAP:
237 		/* input and output buffers overlap */
238 		CSB_ERR(csb, "Operand Overlap error");
239 		return -EINVAL;
240 	case CSB_CC_INVALID_OPERAND:
241 		CSB_ERR(csb, "Invalid operand");
242 		return -EINVAL;
243 	case CSB_CC_NOSPC:
244 		/* output buffer too small */
245 		return -ENOSPC;
246 	case CSB_CC_ABORT:
247 		CSB_ERR(csb, "Function aborted");
248 		return -EINTR;
249 	case CSB_CC_CRC_MISMATCH:
250 		CSB_ERR(csb, "CRC mismatch");
251 		return -EINVAL;
252 	case CSB_CC_TEMPL_INVALID:
253 		CSB_ERR(csb, "Compressed data template invalid");
254 		return -EINVAL;
255 	case CSB_CC_TEMPL_OVERFLOW:
256 		CSB_ERR(csb, "Compressed data template shows data past end");
257 		return -EINVAL;
258 	case CSB_CC_EXCEED_BYTE_COUNT:	/* P9 or later */
259 		/*
260 		 * DDE byte count exceeds the limit specified in Maximum
261 		 * byte count register.
262 		 */
263 		CSB_ERR(csb, "DDE byte count exceeds the limit");
264 		return -EINVAL;
265 
266 	/* these should not happen */
267 	case CSB_CC_INVALID_ALIGN:
268 		/* setup_ddl should have detected this */
269 		CSB_ERR_ADDR(csb, "Invalid alignment");
270 		return -EINVAL;
271 	case CSB_CC_DATA_LENGTH:
272 		/* setup_ddl should have detected this */
273 		CSB_ERR(csb, "Invalid data length");
274 		return -EINVAL;
275 	case CSB_CC_WR_TRANSLATION:
276 	case CSB_CC_TRANSLATION:
277 	case CSB_CC_TRANSLATION_DUP1:
278 	case CSB_CC_TRANSLATION_DUP2:
279 	case CSB_CC_TRANSLATION_DUP3:
280 	case CSB_CC_TRANSLATION_DUP4:
281 	case CSB_CC_TRANSLATION_DUP5:
282 	case CSB_CC_TRANSLATION_DUP6:
283 		/* should not happen, we use physical addrs */
284 		CSB_ERR_ADDR(csb, "Translation error");
285 		return -EPROTO;
286 	case CSB_CC_WR_PROTECTION:
287 	case CSB_CC_PROTECTION:
288 	case CSB_CC_PROTECTION_DUP1:
289 	case CSB_CC_PROTECTION_DUP2:
290 	case CSB_CC_PROTECTION_DUP3:
291 	case CSB_CC_PROTECTION_DUP4:
292 	case CSB_CC_PROTECTION_DUP5:
293 	case CSB_CC_PROTECTION_DUP6:
294 		/* should not happen, we use physical addrs */
295 		CSB_ERR_ADDR(csb, "Protection error");
296 		return -EPROTO;
297 	case CSB_CC_PRIVILEGE:
298 		/* shouldn't happen, we're in HYP mode */
299 		CSB_ERR(csb, "Insufficient Privilege error");
300 		return -EPROTO;
301 	case CSB_CC_EXCESSIVE_DDE:
302 		/* shouldn't happen, setup_ddl doesn't use many dde's */
303 		CSB_ERR(csb, "Too many DDEs in DDL");
304 		return -EINVAL;
305 	case CSB_CC_TRANSPORT:
306 	case CSB_CC_INVALID_CRB:	/* P9 or later */
307 		/* shouldn't happen, we setup CRB correctly */
308 		CSB_ERR(csb, "Invalid CRB");
309 		return -EINVAL;
310 	case CSB_CC_INVALID_DDE:	/* P9 or later */
311 		/*
312 		 * shouldn't happen, setup_direct/indirect_dde creates
313 		 * DDE right
314 		 */
315 		CSB_ERR(csb, "Invalid DDE");
316 		return -EINVAL;
317 	case CSB_CC_SEGMENTED_DDL:
318 		/* shouldn't happen, setup_ddl creates DDL right */
319 		CSB_ERR(csb, "Segmented DDL error");
320 		return -EINVAL;
321 	case CSB_CC_DDE_OVERFLOW:
322 		/* shouldn't happen, setup_ddl creates DDL right */
323 		CSB_ERR(csb, "DDE overflow error");
324 		return -EINVAL;
325 	case CSB_CC_SESSION:
326 		/* should not happen with ICSWX */
327 		CSB_ERR(csb, "Session violation error");
328 		return -EPROTO;
329 	case CSB_CC_CHAIN:
330 		/* should not happen, we don't use chained CRBs */
331 		CSB_ERR(csb, "Chained CRB error");
332 		return -EPROTO;
333 	case CSB_CC_SEQUENCE:
334 		/* should not happen, we don't use chained CRBs */
335 		CSB_ERR(csb, "CRB sequence number error");
336 		return -EPROTO;
337 	case CSB_CC_UNKNOWN_CODE:
338 		CSB_ERR(csb, "Unknown subfunction code");
339 		return -EPROTO;
340 
341 	/* hardware errors */
342 	case CSB_CC_RD_EXTERNAL:
343 	case CSB_CC_RD_EXTERNAL_DUP1:
344 	case CSB_CC_RD_EXTERNAL_DUP2:
345 	case CSB_CC_RD_EXTERNAL_DUP3:
346 		CSB_ERR_ADDR(csb, "Read error outside coprocessor");
347 		return -EPROTO;
348 	case CSB_CC_WR_EXTERNAL:
349 		CSB_ERR_ADDR(csb, "Write error outside coprocessor");
350 		return -EPROTO;
351 	case CSB_CC_INTERNAL:
352 		CSB_ERR(csb, "Internal error in coprocessor");
353 		return -EPROTO;
354 	case CSB_CC_PROVISION:
355 		CSB_ERR(csb, "Storage provision error");
356 		return -EPROTO;
357 	case CSB_CC_HW:
358 		CSB_ERR(csb, "Correctable hardware error");
359 		return -EPROTO;
360 	case CSB_CC_HW_EXPIRED_TIMER:	/* P9 or later */
361 		CSB_ERR(csb, "Job did not finish within allowed time");
362 		return -EPROTO;
363 
364 	default:
365 		CSB_ERR(csb, "Invalid CC %d", csb->cc);
366 		return -EPROTO;
367 	}
368 
369 	/* check Completion Extension state */
370 	if (csb->ce & CSB_CE_TERMINATION) {
371 		CSB_ERR(csb, "CSB request was terminated");
372 		return -EPROTO;
373 	}
374 	if (csb->ce & CSB_CE_INCOMPLETE) {
375 		CSB_ERR(csb, "CSB request not complete");
376 		return -EPROTO;
377 	}
378 	if (!(csb->ce & CSB_CE_TPBC)) {
379 		CSB_ERR(csb, "TPBC not provided, unknown target length");
380 		return -EPROTO;
381 	}
382 
383 	/* successful completion */
384 	pr_debug_ratelimited("Processed %u bytes in %lu us\n",
385 			     be32_to_cpu(csb->count),
386 			     (unsigned long)ktime_us_delta(now, start));
387 
388 	return 0;
389 }
390 
391 static int nx842_config_crb(const unsigned char *in, unsigned int inlen,
392 			unsigned char *out, unsigned int outlen,
393 			struct nx842_workmem *wmem)
394 {
395 	struct coprocessor_request_block *crb;
396 	struct coprocessor_status_block *csb;
397 	u64 csb_addr;
398 	int ret;
399 
400 	crb = &wmem->crb;
401 	csb = &crb->csb;
402 
403 	/* Clear any previous values */
404 	memset(crb, 0, sizeof(*crb));
405 
406 	/* set up DDLs */
407 	ret = setup_ddl(&crb->source, wmem->ddl_in,
408 			(unsigned char *)in, inlen, true);
409 	if (ret)
410 		return ret;
411 
412 	ret = setup_ddl(&crb->target, wmem->ddl_out,
413 			out, outlen, false);
414 	if (ret)
415 		return ret;
416 
417 	/* set up CRB's CSB addr */
418 	csb_addr = nx842_get_pa(csb) & CRB_CSB_ADDRESS;
419 	csb_addr |= CRB_CSB_AT; /* Addrs are phys */
420 	crb->csb_addr = cpu_to_be64(csb_addr);
421 
422 	return 0;
423 }
424 
425 /**
426  * nx842_exec_icswx - compress/decompress data using the 842 algorithm
427  *
428  * (De)compression provided by the NX842 coprocessor on IBM PowerNV systems.
429  * This compresses or decompresses the provided input buffer into the provided
430  * output buffer.
431  *
432  * Upon return from this function @outlen contains the length of the
433  * output data.  If there is an error then @outlen will be 0 and an
434  * error will be specified by the return code from this function.
435  *
436  * The @workmem buffer should only be used by one function call at a time.
437  *
438  * @in: input buffer pointer
439  * @inlen: input buffer size
440  * @out: output buffer pointer
441  * @outlenp: output buffer size pointer
442  * @workmem: working memory buffer pointer, size determined by
443  *           nx842_powernv_driver.workmem_size
444  * @fc: function code, see CCW Function Codes in nx-842.h
445  *
446  * Returns:
447  *   0		Success, output of length @outlenp stored in the buffer at @out
448  *   -ENODEV	Hardware unavailable
449  *   -ENOSPC	Output buffer is to small
450  *   -EMSGSIZE	Input buffer too large
451  *   -EINVAL	buffer constraints do not fix nx842_constraints
452  *   -EPROTO	hardware error during operation
453  *   -ETIMEDOUT	hardware did not complete operation in reasonable time
454  *   -EINTR	operation was aborted
455  */
456 static int nx842_exec_icswx(const unsigned char *in, unsigned int inlen,
457 				  unsigned char *out, unsigned int *outlenp,
458 				  void *workmem, int fc)
459 {
460 	struct coprocessor_request_block *crb;
461 	struct coprocessor_status_block *csb;
462 	struct nx842_workmem *wmem;
463 	int ret;
464 	u32 ccw;
465 	unsigned int outlen = *outlenp;
466 
467 	wmem = PTR_ALIGN(workmem, WORKMEM_ALIGN);
468 
469 	*outlenp = 0;
470 
471 	/* shoudn't happen, we don't load without a coproc */
472 	if (!nx842_ct) {
473 		pr_err_ratelimited("coprocessor CT is 0");
474 		return -ENODEV;
475 	}
476 
477 	ret = nx842_config_crb(in, inlen, out, outlen, wmem);
478 	if (ret)
479 		return ret;
480 
481 	crb = &wmem->crb;
482 	csb = &crb->csb;
483 
484 	/* set up CCW */
485 	ccw = 0;
486 	ccw = SET_FIELD(CCW_CT, ccw, nx842_ct);
487 	ccw = SET_FIELD(CCW_CI_842, ccw, 0); /* use 0 for hw auto-selection */
488 	ccw = SET_FIELD(CCW_FC_842, ccw, fc);
489 
490 	wmem->start = ktime_get();
491 
492 	/* do ICSWX */
493 	ret = icswx(cpu_to_be32(ccw), crb);
494 
495 	pr_debug_ratelimited("icswx CR %x ccw %x crb->ccw %x\n", ret,
496 			     (unsigned int)ccw,
497 			     (unsigned int)be32_to_cpu(crb->ccw));
498 
499 	/*
500 	 * NX842 coprocessor sets 3rd bit in CR register with XER[S0].
501 	 * XER[S0] is the integer summary overflow bit which is nothing
502 	 * to do NX. Since this bit can be set with other return values,
503 	 * mask this bit.
504 	 */
505 	ret &= ~ICSWX_XERS0;
506 
507 	switch (ret) {
508 	case ICSWX_INITIATED:
509 		ret = wait_for_csb(wmem, csb);
510 		break;
511 	case ICSWX_BUSY:
512 		pr_debug_ratelimited("842 Coprocessor busy\n");
513 		ret = -EBUSY;
514 		break;
515 	case ICSWX_REJECTED:
516 		pr_err_ratelimited("ICSWX rejected\n");
517 		ret = -EPROTO;
518 		break;
519 	}
520 
521 	if (!ret)
522 		*outlenp = be32_to_cpu(csb->count);
523 
524 	return ret;
525 }
526 
527 /**
528  * nx842_exec_vas - compress/decompress data using the 842 algorithm
529  *
530  * (De)compression provided by the NX842 coprocessor on IBM PowerNV systems.
531  * This compresses or decompresses the provided input buffer into the provided
532  * output buffer.
533  *
534  * Upon return from this function @outlen contains the length of the
535  * output data.  If there is an error then @outlen will be 0 and an
536  * error will be specified by the return code from this function.
537  *
538  * The @workmem buffer should only be used by one function call at a time.
539  *
540  * @in: input buffer pointer
541  * @inlen: input buffer size
542  * @out: output buffer pointer
543  * @outlenp: output buffer size pointer
544  * @workmem: working memory buffer pointer, size determined by
545  *           nx842_powernv_driver.workmem_size
546  * @fc: function code, see CCW Function Codes in nx-842.h
547  *
548  * Returns:
549  *   0		Success, output of length @outlenp stored in the buffer
550  *		at @out
551  *   -ENODEV	Hardware unavailable
552  *   -ENOSPC	Output buffer is to small
553  *   -EMSGSIZE	Input buffer too large
554  *   -EINVAL	buffer constraints do not fix nx842_constraints
555  *   -EPROTO	hardware error during operation
556  *   -ETIMEDOUT	hardware did not complete operation in reasonable time
557  *   -EINTR	operation was aborted
558  */
559 static int nx842_exec_vas(const unsigned char *in, unsigned int inlen,
560 				  unsigned char *out, unsigned int *outlenp,
561 				  void *workmem, int fc)
562 {
563 	struct coprocessor_request_block *crb;
564 	struct coprocessor_status_block *csb;
565 	struct nx842_workmem *wmem;
566 	struct vas_window *txwin;
567 	int ret, i = 0;
568 	u32 ccw;
569 	unsigned int outlen = *outlenp;
570 
571 	wmem = PTR_ALIGN(workmem, WORKMEM_ALIGN);
572 
573 	*outlenp = 0;
574 
575 	crb = &wmem->crb;
576 	csb = &crb->csb;
577 
578 	ret = nx842_config_crb(in, inlen, out, outlen, wmem);
579 	if (ret)
580 		return ret;
581 
582 	ccw = 0;
583 	ccw = SET_FIELD(CCW_FC_842, ccw, fc);
584 	crb->ccw = cpu_to_be32(ccw);
585 
586 	do {
587 		wmem->start = ktime_get();
588 		preempt_disable();
589 		txwin = this_cpu_read(cpu_txwin);
590 
591 		/*
592 		 * VAS copy CRB into L2 cache. Refer <asm/vas.h>.
593 		 * @crb and @offset.
594 		 */
595 		vas_copy_crb(crb, 0);
596 
597 		/*
598 		 * VAS paste previously copied CRB to NX.
599 		 * @txwin, @offset and @last (must be true).
600 		 */
601 		ret = vas_paste_crb(txwin, 0, 1);
602 		preempt_enable();
603 		/*
604 		 * Retry copy/paste function for VAS failures.
605 		 */
606 	} while (ret && (i++ < VAS_RETRIES));
607 
608 	if (ret) {
609 		pr_err_ratelimited("VAS copy/paste failed\n");
610 		return ret;
611 	}
612 
613 	ret = wait_for_csb(wmem, csb);
614 	if (!ret)
615 		*outlenp = be32_to_cpu(csb->count);
616 
617 	return ret;
618 }
619 
620 /**
621  * nx842_powernv_compress - Compress data using the 842 algorithm
622  *
623  * Compression provided by the NX842 coprocessor on IBM PowerNV systems.
624  * The input buffer is compressed and the result is stored in the
625  * provided output buffer.
626  *
627  * Upon return from this function @outlen contains the length of the
628  * compressed data.  If there is an error then @outlen will be 0 and an
629  * error will be specified by the return code from this function.
630  *
631  * @in: input buffer pointer
632  * @inlen: input buffer size
633  * @out: output buffer pointer
634  * @outlenp: output buffer size pointer
635  * @workmem: working memory buffer pointer, size determined by
636  *           nx842_powernv_driver.workmem_size
637  *
638  * Returns: see @nx842_powernv_exec()
639  */
640 static int nx842_powernv_compress(const unsigned char *in, unsigned int inlen,
641 				  unsigned char *out, unsigned int *outlenp,
642 				  void *wmem)
643 {
644 	return nx842_powernv_exec(in, inlen, out, outlenp,
645 				      wmem, CCW_FC_842_COMP_CRC);
646 }
647 
648 /**
649  * nx842_powernv_decompress - Decompress data using the 842 algorithm
650  *
651  * Decompression provided by the NX842 coprocessor on IBM PowerNV systems.
652  * The input buffer is decompressed and the result is stored in the
653  * provided output buffer.
654  *
655  * Upon return from this function @outlen contains the length of the
656  * decompressed data.  If there is an error then @outlen will be 0 and an
657  * error will be specified by the return code from this function.
658  *
659  * @in: input buffer pointer
660  * @inlen: input buffer size
661  * @out: output buffer pointer
662  * @outlenp: output buffer size pointer
663  * @wmem: working memory buffer pointer, size determined by
664  *        nx842_powernv_driver.workmem_size
665  *
666  * Returns: see @nx842_powernv_exec()
667  */
668 static int nx842_powernv_decompress(const unsigned char *in, unsigned int inlen,
669 				    unsigned char *out, unsigned int *outlenp,
670 				    void *wmem)
671 {
672 	return nx842_powernv_exec(in, inlen, out, outlenp,
673 				      wmem, CCW_FC_842_DECOMP_CRC);
674 }
675 
676 static inline void nx_add_coprocs_list(struct nx_coproc *coproc,
677 					int chipid)
678 {
679 	coproc->chip_id = chipid;
680 	INIT_LIST_HEAD(&coproc->list);
681 	list_add(&coproc->list, &nx_coprocs);
682 }
683 
684 static struct vas_window *nx_alloc_txwin(struct nx_coproc *coproc)
685 {
686 	struct vas_window *txwin = NULL;
687 	struct vas_tx_win_attr txattr;
688 
689 	/*
690 	 * Kernel requests will be high priority. So open send
691 	 * windows only for high priority RxFIFO entries.
692 	 */
693 	vas_init_tx_win_attr(&txattr, coproc->ct);
694 	txattr.lpid = 0;	/* lpid is 0 for kernel requests */
695 
696 	/*
697 	 * Open a VAS send window which is used to send request to NX.
698 	 */
699 	txwin = vas_tx_win_open(coproc->vas.id, coproc->ct, &txattr);
700 	if (IS_ERR(txwin))
701 		pr_err("ibm,nx-842: Can not open TX window: %ld\n",
702 				PTR_ERR(txwin));
703 
704 	return txwin;
705 }
706 
707 /*
708  * Identify chip ID for each CPU, open send wndow for the corresponding NX
709  * engine and save txwin in percpu cpu_txwin.
710  * cpu_txwin is used in copy/paste operation for each compression /
711  * decompression request.
712  */
713 static int nx_open_percpu_txwins(void)
714 {
715 	struct nx_coproc *coproc, *n;
716 	unsigned int i, chip_id;
717 
718 	for_each_possible_cpu(i) {
719 		struct vas_window *txwin = NULL;
720 
721 		chip_id = cpu_to_chip_id(i);
722 
723 		list_for_each_entry_safe(coproc, n, &nx_coprocs, list) {
724 			/*
725 			 * Kernel requests use only high priority FIFOs. So
726 			 * open send windows for these FIFOs.
727 			 * GZIP is not supported in kernel right now.
728 			 */
729 
730 			if (coproc->ct != VAS_COP_TYPE_842_HIPRI)
731 				continue;
732 
733 			if (coproc->chip_id == chip_id) {
734 				txwin = nx_alloc_txwin(coproc);
735 				if (IS_ERR(txwin))
736 					return PTR_ERR(txwin);
737 
738 				per_cpu(cpu_txwin, i) = txwin;
739 				break;
740 			}
741 		}
742 
743 		if (!per_cpu(cpu_txwin, i)) {
744 			/* shouldn't happen, Each chip will have NX engine */
745 			pr_err("NX engine is not available for CPU %d\n", i);
746 			return -EINVAL;
747 		}
748 	}
749 
750 	return 0;
751 }
752 
753 static int __init nx_set_ct(struct nx_coproc *coproc, const char *priority,
754 				int high, int normal)
755 {
756 	if (!strcmp(priority, "High"))
757 		coproc->ct = high;
758 	else if (!strcmp(priority, "Normal"))
759 		coproc->ct = normal;
760 	else {
761 		pr_err("Invalid RxFIFO priority value\n");
762 		return -EINVAL;
763 	}
764 
765 	return 0;
766 }
767 
768 static int __init vas_cfg_coproc_info(struct device_node *dn, int chip_id,
769 					int vasid, int type, int *ct)
770 {
771 	struct vas_window *rxwin = NULL;
772 	struct vas_rx_win_attr rxattr;
773 	u32 lpid, pid, tid, fifo_size;
774 	struct nx_coproc *coproc;
775 	u64 rx_fifo;
776 	const char *priority;
777 	int ret;
778 
779 	ret = of_property_read_u64(dn, "rx-fifo-address", &rx_fifo);
780 	if (ret) {
781 		pr_err("Missing rx-fifo-address property\n");
782 		return ret;
783 	}
784 
785 	ret = of_property_read_u32(dn, "rx-fifo-size", &fifo_size);
786 	if (ret) {
787 		pr_err("Missing rx-fifo-size property\n");
788 		return ret;
789 	}
790 
791 	ret = of_property_read_u32(dn, "lpid", &lpid);
792 	if (ret) {
793 		pr_err("Missing lpid property\n");
794 		return ret;
795 	}
796 
797 	ret = of_property_read_u32(dn, "pid", &pid);
798 	if (ret) {
799 		pr_err("Missing pid property\n");
800 		return ret;
801 	}
802 
803 	ret = of_property_read_u32(dn, "tid", &tid);
804 	if (ret) {
805 		pr_err("Missing tid property\n");
806 		return ret;
807 	}
808 
809 	ret = of_property_read_string(dn, "priority", &priority);
810 	if (ret) {
811 		pr_err("Missing priority property\n");
812 		return ret;
813 	}
814 
815 	coproc = kzalloc(sizeof(*coproc), GFP_KERNEL);
816 	if (!coproc)
817 		return -ENOMEM;
818 
819 	if (type == NX_CT_842)
820 		ret = nx_set_ct(coproc, priority, VAS_COP_TYPE_842_HIPRI,
821 			VAS_COP_TYPE_842);
822 	else if (type == NX_CT_GZIP)
823 		ret = nx_set_ct(coproc, priority, VAS_COP_TYPE_GZIP_HIPRI,
824 				VAS_COP_TYPE_GZIP);
825 
826 	if (ret)
827 		goto err_out;
828 
829 	vas_init_rx_win_attr(&rxattr, coproc->ct);
830 	rxattr.rx_fifo = rx_fifo;
831 	rxattr.rx_fifo_size = fifo_size;
832 	rxattr.lnotify_lpid = lpid;
833 	rxattr.lnotify_pid = pid;
834 	rxattr.lnotify_tid = tid;
835 	/*
836 	 * Maximum RX window credits can not be more than #CRBs in
837 	 * RxFIFO. Otherwise, can get checkstop if RxFIFO overruns.
838 	 */
839 	rxattr.wcreds_max = fifo_size / CRB_SIZE;
840 
841 	/*
842 	 * Open a VAS receice window which is used to configure RxFIFO
843 	 * for NX.
844 	 */
845 	rxwin = vas_rx_win_open(vasid, coproc->ct, &rxattr);
846 	if (IS_ERR(rxwin)) {
847 		ret = PTR_ERR(rxwin);
848 		pr_err("setting RxFIFO with VAS failed: %d\n",
849 			ret);
850 		goto err_out;
851 	}
852 
853 	coproc->vas.rxwin = rxwin;
854 	coproc->vas.id = vasid;
855 	nx_add_coprocs_list(coproc, chip_id);
856 
857 	/*
858 	 * (lpid, pid, tid) combination has to be unique for each
859 	 * coprocessor instance in the system. So to make it
860 	 * unique, skiboot uses coprocessor type such as 842 or
861 	 * GZIP for pid and provides this value to kernel in pid
862 	 * device-tree property.
863 	 */
864 	*ct = pid;
865 
866 	return 0;
867 
868 err_out:
869 	kfree(coproc);
870 	return ret;
871 }
872 
873 static int __init nx_coproc_init(int chip_id, int ct_842, int ct_gzip)
874 {
875 	int ret = 0;
876 
877 	if (opal_check_token(OPAL_NX_COPROC_INIT)) {
878 		ret = opal_nx_coproc_init(chip_id, ct_842);
879 
880 		if (!ret)
881 			ret = opal_nx_coproc_init(chip_id, ct_gzip);
882 
883 		if (ret) {
884 			ret = opal_error_code(ret);
885 			pr_err("Failed to initialize NX for chip(%d): %d\n",
886 				chip_id, ret);
887 		}
888 	} else
889 		pr_warn("Firmware doesn't support NX initialization\n");
890 
891 	return ret;
892 }
893 
894 static int __init find_nx_device_tree(struct device_node *dn, int chip_id,
895 					int vasid, int type, char *devname,
896 					int *ct)
897 {
898 	int ret = 0;
899 
900 	if (of_device_is_compatible(dn, devname)) {
901 		ret  = vas_cfg_coproc_info(dn, chip_id, vasid, type, ct);
902 		if (ret)
903 			of_node_put(dn);
904 	}
905 
906 	return ret;
907 }
908 
909 static int __init nx_powernv_probe_vas(struct device_node *pn)
910 {
911 	int chip_id, vasid, ret = 0;
912 	int ct_842 = 0, ct_gzip = 0;
913 	struct device_node *dn;
914 
915 	chip_id = of_get_ibm_chip_id(pn);
916 	if (chip_id < 0) {
917 		pr_err("ibm,chip-id missing\n");
918 		return -EINVAL;
919 	}
920 
921 	vasid = chip_to_vas_id(chip_id);
922 	if (vasid < 0) {
923 		pr_err("Unable to map chip_id %d to vasid\n", chip_id);
924 		return -EINVAL;
925 	}
926 
927 	for_each_child_of_node(pn, dn) {
928 		ret = find_nx_device_tree(dn, chip_id, vasid, NX_CT_842,
929 					"ibm,p9-nx-842", &ct_842);
930 
931 		if (!ret)
932 			ret = find_nx_device_tree(dn, chip_id, vasid,
933 				NX_CT_GZIP, "ibm,p9-nx-gzip", &ct_gzip);
934 
935 		if (ret) {
936 			of_node_put(dn);
937 			return ret;
938 		}
939 	}
940 
941 	if (!ct_842 || !ct_gzip) {
942 		pr_err("NX FIFO nodes are missing\n");
943 		return -EINVAL;
944 	}
945 
946 	/*
947 	 * Initialize NX instance for both high and normal priority FIFOs.
948 	 */
949 	ret = nx_coproc_init(chip_id, ct_842, ct_gzip);
950 
951 	return ret;
952 }
953 
954 static int __init nx842_powernv_probe(struct device_node *dn)
955 {
956 	struct nx_coproc *coproc;
957 	unsigned int ct, ci;
958 	int chip_id;
959 
960 	chip_id = of_get_ibm_chip_id(dn);
961 	if (chip_id < 0) {
962 		pr_err("ibm,chip-id missing\n");
963 		return -EINVAL;
964 	}
965 
966 	if (of_property_read_u32(dn, "ibm,842-coprocessor-type", &ct)) {
967 		pr_err("ibm,842-coprocessor-type missing\n");
968 		return -EINVAL;
969 	}
970 
971 	if (of_property_read_u32(dn, "ibm,842-coprocessor-instance", &ci)) {
972 		pr_err("ibm,842-coprocessor-instance missing\n");
973 		return -EINVAL;
974 	}
975 
976 	coproc = kzalloc(sizeof(*coproc), GFP_KERNEL);
977 	if (!coproc)
978 		return -ENOMEM;
979 
980 	coproc->ct = ct;
981 	coproc->ci = ci;
982 	nx_add_coprocs_list(coproc, chip_id);
983 
984 	pr_info("coprocessor found on chip %d, CT %d CI %d\n", chip_id, ct, ci);
985 
986 	if (!nx842_ct)
987 		nx842_ct = ct;
988 	else if (nx842_ct != ct)
989 		pr_err("NX842 chip %d, CT %d != first found CT %d\n",
990 		       chip_id, ct, nx842_ct);
991 
992 	return 0;
993 }
994 
995 static void nx_delete_coprocs(void)
996 {
997 	struct nx_coproc *coproc, *n;
998 	struct vas_window *txwin;
999 	int i;
1000 
1001 	/*
1002 	 * close percpu txwins that are opened for the corresponding coproc.
1003 	 */
1004 	for_each_possible_cpu(i) {
1005 		txwin = per_cpu(cpu_txwin, i);
1006 		if (txwin)
1007 			vas_win_close(txwin);
1008 
1009 		per_cpu(cpu_txwin, i) = NULL;
1010 	}
1011 
1012 	list_for_each_entry_safe(coproc, n, &nx_coprocs, list) {
1013 		if (coproc->vas.rxwin)
1014 			vas_win_close(coproc->vas.rxwin);
1015 
1016 		list_del(&coproc->list);
1017 		kfree(coproc);
1018 	}
1019 }
1020 
1021 static struct nx842_constraints nx842_powernv_constraints = {
1022 	.alignment =	DDE_BUFFER_ALIGN,
1023 	.multiple =	DDE_BUFFER_LAST_MULT,
1024 	.minimum =	DDE_BUFFER_LAST_MULT,
1025 	.maximum =	(DDL_LEN_MAX - 1) * PAGE_SIZE,
1026 };
1027 
1028 static struct nx842_driver nx842_powernv_driver = {
1029 	.name =		KBUILD_MODNAME,
1030 	.owner =	THIS_MODULE,
1031 	.workmem_size =	sizeof(struct nx842_workmem),
1032 	.constraints =	&nx842_powernv_constraints,
1033 	.compress =	nx842_powernv_compress,
1034 	.decompress =	nx842_powernv_decompress,
1035 };
1036 
1037 static int nx842_powernv_crypto_init(struct crypto_tfm *tfm)
1038 {
1039 	return nx842_crypto_init(tfm, &nx842_powernv_driver);
1040 }
1041 
1042 static struct crypto_alg nx842_powernv_alg = {
1043 	.cra_name		= "842",
1044 	.cra_driver_name	= "842-nx",
1045 	.cra_priority		= 300,
1046 	.cra_flags		= CRYPTO_ALG_TYPE_COMPRESS,
1047 	.cra_ctxsize		= sizeof(struct nx842_crypto_ctx),
1048 	.cra_module		= THIS_MODULE,
1049 	.cra_init		= nx842_powernv_crypto_init,
1050 	.cra_exit		= nx842_crypto_exit,
1051 	.cra_u			= { .compress = {
1052 	.coa_compress		= nx842_crypto_compress,
1053 	.coa_decompress		= nx842_crypto_decompress } }
1054 };
1055 
1056 static __init int nx_compress_powernv_init(void)
1057 {
1058 	struct device_node *dn;
1059 	int ret;
1060 
1061 	/* verify workmem size/align restrictions */
1062 	BUILD_BUG_ON(WORKMEM_ALIGN % CRB_ALIGN);
1063 	BUILD_BUG_ON(CRB_ALIGN % DDE_ALIGN);
1064 	BUILD_BUG_ON(CRB_SIZE % DDE_ALIGN);
1065 	/* verify buffer size/align restrictions */
1066 	BUILD_BUG_ON(PAGE_SIZE % DDE_BUFFER_ALIGN);
1067 	BUILD_BUG_ON(DDE_BUFFER_ALIGN % DDE_BUFFER_SIZE_MULT);
1068 	BUILD_BUG_ON(DDE_BUFFER_SIZE_MULT % DDE_BUFFER_LAST_MULT);
1069 
1070 	for_each_compatible_node(dn, NULL, "ibm,power9-nx") {
1071 		ret = nx_powernv_probe_vas(dn);
1072 		if (ret) {
1073 			nx_delete_coprocs();
1074 			of_node_put(dn);
1075 			return ret;
1076 		}
1077 	}
1078 
1079 	if (list_empty(&nx_coprocs)) {
1080 		for_each_compatible_node(dn, NULL, "ibm,power-nx")
1081 			nx842_powernv_probe(dn);
1082 
1083 		if (!nx842_ct)
1084 			return -ENODEV;
1085 
1086 		nx842_powernv_exec = nx842_exec_icswx;
1087 	} else {
1088 		/*
1089 		 * Register VAS user space API for NX GZIP so
1090 		 * that user space can use GZIP engine.
1091 		 * Using high FIFO priority for kernel requests and
1092 		 * normal FIFO priority is assigned for userspace.
1093 		 * 842 compression is supported only in kernel.
1094 		 */
1095 		ret = vas_register_api_powernv(THIS_MODULE, VAS_COP_TYPE_GZIP,
1096 					       "nx-gzip");
1097 
1098 		/*
1099 		 * GZIP is not supported in kernel right now.
1100 		 * So open tx windows only for 842.
1101 		 */
1102 		if (!ret)
1103 			ret = nx_open_percpu_txwins();
1104 
1105 		if (ret) {
1106 			nx_delete_coprocs();
1107 			return ret;
1108 		}
1109 
1110 		nx842_powernv_exec = nx842_exec_vas;
1111 	}
1112 
1113 	ret = crypto_register_alg(&nx842_powernv_alg);
1114 	if (ret) {
1115 		nx_delete_coprocs();
1116 		return ret;
1117 	}
1118 
1119 	return 0;
1120 }
1121 module_init(nx_compress_powernv_init);
1122 
1123 static void __exit nx_compress_powernv_exit(void)
1124 {
1125 	/*
1126 	 * GZIP engine is supported only in power9 or later and nx842_ct
1127 	 * is used on power8 (icswx).
1128 	 * VAS API for NX GZIP is registered during init for user space
1129 	 * use. So delete this API use for GZIP engine.
1130 	 */
1131 	if (!nx842_ct)
1132 		vas_unregister_api_powernv();
1133 
1134 	crypto_unregister_alg(&nx842_powernv_alg);
1135 
1136 	nx_delete_coprocs();
1137 }
1138 module_exit(nx_compress_powernv_exit);
1139