Lines Matching +full:use +full:- +full:case
1 // SPDX-License-Identifier: GPL-2.0-or-later
10 #include "nx-842.h"
19 #include <asm/opal-api.h>
26 MODULE_ALIAS_CRYPTO("842-nx");
57 * where the process is executing. Use with VAS function.
77 * setup_indirect_dde - Setup an indirect DDE
86 dde->flags = 0; in setup_indirect_dde()
87 dde->count = dde_count; in setup_indirect_dde()
88 dde->index = 0; in setup_indirect_dde()
89 dde->length = cpu_to_be32(byte_count); in setup_indirect_dde()
90 dde->address = cpu_to_be64(nx842_get_pa(ddl)); in setup_indirect_dde()
94 * setup_direct_dde - Setup single DDE from buffer
106 dde->flags = 0; in setup_direct_dde()
107 dde->count = 0; in setup_direct_dde()
108 dde->index = 0; in setup_direct_dde()
109 dde->length = cpu_to_be32(l); in setup_direct_dde()
110 dde->address = cpu_to_be64(pa); in setup_direct_dde()
116 * setup_ddl - Setup DDL from buffer
130 pr_debug("%s buffer pa 0x%lx not 0x%x-byte aligned\n", in setup_ddl()
132 return -EINVAL; in setup_ddl()
137 * DDE_BUFFER_SIZE_MULT, and pre-last page DDE buffers in setup_ddl()
144 return -EINVAL; in setup_ddl()
148 /* use a single direct DDE */ in setup_ddl()
155 /* use the DDL */ in setup_ddl()
159 len -= ret; in setup_ddl()
167 return -EMSGSIZE; in setup_ddl()
168 total_len -= len; in setup_ddl()
177 ##__VA_ARGS__, (csb)->flags, \
178 (csb)->cs, (csb)->cc, (csb)->ce, \
179 be32_to_cpu((csb)->count))
183 (unsigned long)be64_to_cpu((csb)->address))
188 ktime_t start = wmem->start, now = ktime_get(); in wait_for_csb()
191 while (!(READ_ONCE(csb->flags) & CSB_V)) { in wait_for_csb()
202 if (!(csb->flags & CSB_V)) { in wait_for_csb()
205 return -ETIMEDOUT; in wait_for_csb()
207 if (csb->flags & CSB_F) { in wait_for_csb()
209 return -EPROTO; in wait_for_csb()
211 if (csb->flags & CSB_CH) { in wait_for_csb()
213 return -EPROTO; in wait_for_csb()
217 if (csb->cs) { in wait_for_csb()
219 return -EPROTO; in wait_for_csb()
223 switch (csb->cc) { in wait_for_csb()
225 case CSB_CC_SUCCESS: in wait_for_csb()
227 case CSB_CC_TPBC_GT_SPBC: in wait_for_csb()
234 case CSB_CC_OPERAND_OVERLAP: in wait_for_csb()
237 return -EINVAL; in wait_for_csb()
238 case CSB_CC_INVALID_OPERAND: in wait_for_csb()
240 return -EINVAL; in wait_for_csb()
241 case CSB_CC_NOSPC: in wait_for_csb()
243 return -ENOSPC; in wait_for_csb()
244 case CSB_CC_ABORT: in wait_for_csb()
246 return -EINTR; in wait_for_csb()
247 case CSB_CC_CRC_MISMATCH: in wait_for_csb()
249 return -EINVAL; in wait_for_csb()
250 case CSB_CC_TEMPL_INVALID: in wait_for_csb()
252 return -EINVAL; in wait_for_csb()
253 case CSB_CC_TEMPL_OVERFLOW: in wait_for_csb()
255 return -EINVAL; in wait_for_csb()
256 case CSB_CC_EXCEED_BYTE_COUNT: /* P9 or later */ in wait_for_csb()
262 return -EINVAL; in wait_for_csb()
265 case CSB_CC_INVALID_ALIGN: in wait_for_csb()
268 return -EINVAL; in wait_for_csb()
269 case CSB_CC_DATA_LENGTH: in wait_for_csb()
272 return -EINVAL; in wait_for_csb()
273 case CSB_CC_WR_TRANSLATION: in wait_for_csb()
274 case CSB_CC_TRANSLATION: in wait_for_csb()
275 case CSB_CC_TRANSLATION_DUP1: in wait_for_csb()
276 case CSB_CC_TRANSLATION_DUP2: in wait_for_csb()
277 case CSB_CC_TRANSLATION_DUP3: in wait_for_csb()
278 case CSB_CC_TRANSLATION_DUP4: in wait_for_csb()
279 case CSB_CC_TRANSLATION_DUP5: in wait_for_csb()
280 case CSB_CC_TRANSLATION_DUP6: in wait_for_csb()
281 /* should not happen, we use physical addrs */ in wait_for_csb()
283 return -EPROTO; in wait_for_csb()
284 case CSB_CC_WR_PROTECTION: in wait_for_csb()
285 case CSB_CC_PROTECTION: in wait_for_csb()
286 case CSB_CC_PROTECTION_DUP1: in wait_for_csb()
287 case CSB_CC_PROTECTION_DUP2: in wait_for_csb()
288 case CSB_CC_PROTECTION_DUP3: in wait_for_csb()
289 case CSB_CC_PROTECTION_DUP4: in wait_for_csb()
290 case CSB_CC_PROTECTION_DUP5: in wait_for_csb()
291 case CSB_CC_PROTECTION_DUP6: in wait_for_csb()
292 /* should not happen, we use physical addrs */ in wait_for_csb()
294 return -EPROTO; in wait_for_csb()
295 case CSB_CC_PRIVILEGE: in wait_for_csb()
298 return -EPROTO; in wait_for_csb()
299 case CSB_CC_EXCESSIVE_DDE: in wait_for_csb()
300 /* shouldn't happen, setup_ddl doesn't use many dde's */ in wait_for_csb()
302 return -EINVAL; in wait_for_csb()
303 case CSB_CC_TRANSPORT: in wait_for_csb()
304 case CSB_CC_INVALID_CRB: /* P9 or later */ in wait_for_csb()
307 return -EINVAL; in wait_for_csb()
308 case CSB_CC_INVALID_DDE: /* P9 or later */ in wait_for_csb()
314 return -EINVAL; in wait_for_csb()
315 case CSB_CC_SEGMENTED_DDL: in wait_for_csb()
318 return -EINVAL; in wait_for_csb()
319 case CSB_CC_DDE_OVERFLOW: in wait_for_csb()
322 return -EINVAL; in wait_for_csb()
323 case CSB_CC_SESSION: in wait_for_csb()
326 return -EPROTO; in wait_for_csb()
327 case CSB_CC_CHAIN: in wait_for_csb()
328 /* should not happen, we don't use chained CRBs */ in wait_for_csb()
330 return -EPROTO; in wait_for_csb()
331 case CSB_CC_SEQUENCE: in wait_for_csb()
332 /* should not happen, we don't use chained CRBs */ in wait_for_csb()
334 return -EPROTO; in wait_for_csb()
335 case CSB_CC_UNKNOWN_CODE: in wait_for_csb()
337 return -EPROTO; in wait_for_csb()
340 case CSB_CC_RD_EXTERNAL: in wait_for_csb()
341 case CSB_CC_RD_EXTERNAL_DUP1: in wait_for_csb()
342 case CSB_CC_RD_EXTERNAL_DUP2: in wait_for_csb()
343 case CSB_CC_RD_EXTERNAL_DUP3: in wait_for_csb()
345 return -EPROTO; in wait_for_csb()
346 case CSB_CC_WR_EXTERNAL: in wait_for_csb()
348 return -EPROTO; in wait_for_csb()
349 case CSB_CC_INTERNAL: in wait_for_csb()
351 return -EPROTO; in wait_for_csb()
352 case CSB_CC_PROVISION: in wait_for_csb()
354 return -EPROTO; in wait_for_csb()
355 case CSB_CC_HW: in wait_for_csb()
357 return -EPROTO; in wait_for_csb()
358 case CSB_CC_HW_EXPIRED_TIMER: /* P9 or later */ in wait_for_csb()
360 return -EPROTO; in wait_for_csb()
363 CSB_ERR(csb, "Invalid CC %d", csb->cc); in wait_for_csb()
364 return -EPROTO; in wait_for_csb()
368 if (csb->ce & CSB_CE_TERMINATION) { in wait_for_csb()
370 return -EPROTO; in wait_for_csb()
372 if (csb->ce & CSB_CE_INCOMPLETE) { in wait_for_csb()
374 return -EPROTO; in wait_for_csb()
376 if (!(csb->ce & CSB_CE_TPBC)) { in wait_for_csb()
378 return -EPROTO; in wait_for_csb()
383 be32_to_cpu(csb->count), in wait_for_csb()
398 crb = &wmem->crb; in nx842_config_crb()
399 csb = &crb->csb; in nx842_config_crb()
405 ret = setup_ddl(&crb->source, wmem->ddl_in, in nx842_config_crb()
410 ret = setup_ddl(&crb->target, wmem->ddl_out, in nx842_config_crb()
418 crb->csb_addr = cpu_to_be64(csb_addr); in nx842_config_crb()
424 * nx842_exec_icswx - compress/decompress data using the 842 algorithm
442 * @fc: function code, see CCW Function Codes in nx-842.h
446 * -ENODEV Hardware unavailable
447 * -ENOSPC Output buffer is to small
448 * -EMSGSIZE Input buffer too large
449 * -EINVAL buffer constraints do not fix nx842_constraints
450 * -EPROTO hardware error during operation
451 * -ETIMEDOUT hardware did not complete operation in reasonable time
452 * -EINTR operation was aborted
472 return -ENODEV; in nx842_exec_icswx()
479 crb = &wmem->crb; in nx842_exec_icswx()
480 csb = &crb->csb; in nx842_exec_icswx()
485 ccw = SET_FIELD(CCW_CI_842, ccw, 0); /* use 0 for hw auto-selection */ in nx842_exec_icswx()
488 wmem->start = ktime_get(); in nx842_exec_icswx()
493 pr_debug_ratelimited("icswx CR %x ccw %x crb->ccw %x\n", ret, in nx842_exec_icswx()
495 (unsigned int)be32_to_cpu(crb->ccw)); in nx842_exec_icswx()
506 case ICSWX_INITIATED: in nx842_exec_icswx()
509 case ICSWX_BUSY: in nx842_exec_icswx()
511 ret = -EBUSY; in nx842_exec_icswx()
513 case ICSWX_REJECTED: in nx842_exec_icswx()
515 ret = -EPROTO; in nx842_exec_icswx()
520 *outlenp = be32_to_cpu(csb->count); in nx842_exec_icswx()
526 * nx842_exec_vas - compress/decompress data using the 842 algorithm
544 * @fc: function code, see CCW Function Codes in nx-842.h
549 * -ENODEV Hardware unavailable
550 * -ENOSPC Output buffer is to small
551 * -EMSGSIZE Input buffer too large
552 * -EINVAL buffer constraints do not fix nx842_constraints
553 * -EPROTO hardware error during operation
554 * -ETIMEDOUT hardware did not complete operation in reasonable time
555 * -EINTR operation was aborted
573 crb = &wmem->crb; in nx842_exec_vas()
574 csb = &crb->csb; in nx842_exec_vas()
582 crb->ccw = cpu_to_be32(ccw); in nx842_exec_vas()
585 wmem->start = ktime_get(); in nx842_exec_vas()
613 *outlenp = be32_to_cpu(csb->count); in nx842_exec_vas()
619 * nx842_powernv_compress - Compress data using the 842 algorithm
647 * nx842_powernv_decompress - Decompress data using the 842 algorithm
677 coproc->chip_id = chipid; in nx_add_coprocs_list()
678 INIT_LIST_HEAD(&coproc->list); in nx_add_coprocs_list()
679 list_add(&coproc->list, &nx_coprocs); in nx_add_coprocs_list()
691 vas_init_tx_win_attr(&txattr, coproc->ct); in nx_alloc_txwin()
697 txwin = vas_tx_win_open(coproc->vas.id, coproc->ct, &txattr); in nx_alloc_txwin()
699 pr_err("ibm,nx-842: Can not open TX window: %ld\n", in nx_alloc_txwin()
723 * Kernel requests use only high priority FIFOs. So in nx_open_percpu_txwins()
728 if (coproc->ct != VAS_COP_TYPE_842_HIPRI) in nx_open_percpu_txwins()
731 if (coproc->chip_id == chip_id) { in nx_open_percpu_txwins()
744 return -EINVAL; in nx_open_percpu_txwins()
755 coproc->ct = high; in nx_set_ct()
757 coproc->ct = normal; in nx_set_ct()
760 return -EINVAL; in nx_set_ct()
777 ret = of_property_read_u64(dn, "rx-fifo-address", &rx_fifo); in vas_cfg_coproc_info()
779 pr_err("Missing rx-fifo-address property\n"); in vas_cfg_coproc_info()
783 ret = of_property_read_u32(dn, "rx-fifo-size", &fifo_size); in vas_cfg_coproc_info()
785 pr_err("Missing rx-fifo-size property\n"); in vas_cfg_coproc_info()
815 return -ENOMEM; in vas_cfg_coproc_info()
827 vas_init_rx_win_attr(&rxattr, coproc->ct); in vas_cfg_coproc_info()
843 rxwin = vas_rx_win_open(vasid, coproc->ct, &rxattr); in vas_cfg_coproc_info()
851 coproc->vas.rxwin = rxwin; in vas_cfg_coproc_info()
852 coproc->vas.id = vasid; in vas_cfg_coproc_info()
860 * device-tree property. in vas_cfg_coproc_info()
915 pr_err("ibm,chip-id missing\n"); in nx_powernv_probe_vas()
916 return -EINVAL; in nx_powernv_probe_vas()
922 return -EINVAL; in nx_powernv_probe_vas()
927 "ibm,p9-nx-842", &ct_842); in nx_powernv_probe_vas()
931 NX_CT_GZIP, "ibm,p9-nx-gzip", &ct_gzip); in nx_powernv_probe_vas()
941 return -EINVAL; in nx_powernv_probe_vas()
960 pr_err("ibm,chip-id missing\n"); in nx842_powernv_probe()
961 return -EINVAL; in nx842_powernv_probe()
964 if (of_property_read_u32(dn, "ibm,842-coprocessor-type", &ct)) { in nx842_powernv_probe()
965 pr_err("ibm,842-coprocessor-type missing\n"); in nx842_powernv_probe()
966 return -EINVAL; in nx842_powernv_probe()
969 if (of_property_read_u32(dn, "ibm,842-coprocessor-instance", &ci)) { in nx842_powernv_probe()
970 pr_err("ibm,842-coprocessor-instance missing\n"); in nx842_powernv_probe()
971 return -EINVAL; in nx842_powernv_probe()
976 return -ENOMEM; in nx842_powernv_probe()
978 coproc->ct = ct; in nx842_powernv_probe()
979 coproc->ci = ci; in nx842_powernv_probe()
1011 if (coproc->vas.rxwin) in nx_delete_coprocs()
1012 vas_win_close(coproc->vas.rxwin); in nx_delete_coprocs()
1014 list_del(&coproc->list); in nx_delete_coprocs()
1023 .maximum = (DDL_LEN_MAX - 1) * PAGE_SIZE,
1042 .base.cra_driver_name = "842-nx",
1066 for_each_compatible_node(dn, NULL, "ibm,power9-nx") { in nx_compress_powernv_init()
1076 for_each_compatible_node(dn, NULL, "ibm,power-nx") in nx_compress_powernv_init()
1080 return -ENODEV; in nx_compress_powernv_init()
1086 * that user space can use GZIP engine. in nx_compress_powernv_init()
1092 "nx-gzip"); in nx_compress_powernv_init()
1125 * use. So delete this API use for GZIP engine. in nx_compress_powernv_exit()