--- zzzz-none-000/linux-4.4.60/drivers/crypto/qce/core.c 2017-04-08 07:53:53.000000000 +0000 +++ dragonfly-4020-701/linux-4.4.60/drivers/crypto/qce/core.c 2018-11-08 13:36:17.000000000 +0000 @@ -21,6 +21,7 @@ #include #include +#include #include "core.h" #include "cipher.h" #include "sha.h" @@ -28,6 +29,7 @@ #define QCE_MAJOR_VERSION5 0x05 #define QCE_QUEUE_LENGTH 1 + static const struct qce_algo_ops *qce_ops[] = { &ablkcipher_ops, &ahash_ops, @@ -139,12 +141,63 @@ static int qce_async_request_enqueue(struct qce_device *qce, struct crypto_async_request *req) { + struct qce_stat *pstat; + const char *cra_drv_name; + int ablk_flags = 0; + struct qce_cipher_reqctx *rctx; + + pstat = &qce->qce_stat; + if (req) { + cra_drv_name = crypto_tfm_alg_driver_name(req->tfm); + rctx = ablkcipher_request_ctx((void *)req); + if (rctx) + ablk_flags = rctx->flags; + + if (!strcmp(cra_drv_name, "sha1-qce")) + pstat->sha1_digest++; + else if (!strcmp(cra_drv_name, "sha256-qce")) + pstat->sha256_digest++; + else if (!strcmp(cra_drv_name, "hmac-sha256-qce")) + pstat->sha256_hmac_digest++; + else if (!strcmp(cra_drv_name, "hmac-sha1-qce")) + pstat->sha1_hmac_digest++; + else if (IS_AES(ablk_flags) && (ablk_flags & QCE_ENCRYPT)) + pstat->ablk_cipher_aes_enc++; + else if (IS_AES(ablk_flags) && (ablk_flags & QCE_DECRYPT)) + pstat->ablk_cipher_aes_dec++; + else if (IS_DES(ablk_flags) && (ablk_flags & QCE_ENCRYPT)) + pstat->ablk_cipher_des_enc++; + else if (IS_DES(ablk_flags) && (ablk_flags & QCE_DECRYPT)) + pstat->ablk_cipher_des_dec++; + else if (IS_3DES(ablk_flags) && (ablk_flags & QCE_ENCRYPT)) + pstat->ablk_cipher_3des_enc++; + else if (IS_3DES(ablk_flags) && (ablk_flags & QCE_DECRYPT)) + pstat->ablk_cipher_3des_dec++; + } + return qce_handle_queue(qce, req); } static void qce_async_request_done(struct qce_device *qce, int ret) { + u32 type; + struct qce_stat *pstat; + qce->result = ret; + pstat = &qce->qce_stat; + if (qce->req) { + type = crypto_tfm_alg_type(qce->req->tfm); + + if (ret && (type == CRYPTO_ALG_TYPE_AHASH)) + pstat->ahash_op_fail++; + if (!ret && (type == CRYPTO_ALG_TYPE_AHASH)) + pstat->ahash_op_success++; + + if (ret && (type == CRYPTO_ALG_TYPE_ABLKCIPHER)) + pstat->ablk_cipher_op_fail++; + if (!ret && (type == CRYPTO_ALG_TYPE_ABLKCIPHER)) + pstat->ablk_cipher_op_success++; + } tasklet_schedule(&qce->done_tasklet); } @@ -170,6 +223,205 @@ return 0; } +static int qce_disp_stats(struct qce_device *qce) +{ + struct qce_stat *pstat; + char *read_buf; + int len; + + pstat = &qce->qce_stat; + read_buf = qce->qce_debug_read_buf; + len = scnprintf(read_buf, DEBUG_MAX_RW_BUF - 1, + "\nQualcomm crypto accelerator Statistics\n"); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER AES encryption : %llu\n", + pstat->ablk_cipher_aes_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER AES decryption : %llu\n", + pstat->ablk_cipher_aes_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER DES encryption : %llu\n", + pstat->ablk_cipher_des_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER DES decryption : %llu\n", + pstat->ablk_cipher_des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER 3DES encryption : %llu\n", + pstat->ablk_cipher_3des_enc); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER 3DES decryption : %llu\n", + pstat->ablk_cipher_3des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER operation success : %llu\n", + pstat->ablk_cipher_op_success); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " ABLK CIPHER operation fail : %llu\n", + pstat->ablk_cipher_op_fail); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + "\n"); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-AES encryption : %llu\n", + pstat->aead_sha1_aes_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-AES decryption : %llu\n", + pstat->aead_sha1_aes_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-DES encryption : %llu\n", + pstat->aead_sha1_des_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-DES decryption : %llu\n", + pstat->aead_sha1_des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-3DES encryption : %llu\n", + pstat->aead_sha1_3des_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA1-3DES decryption : %llu\n", + pstat->aead_sha1_3des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-AES encryption : %llu\n", + pstat->aead_sha256_aes_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-AES decryption : %llu\n", + pstat->aead_sha256_aes_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-DES encryption : %llu\n", + pstat->aead_sha256_des_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-DES decryption : %llu\n", + pstat->aead_sha256_des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-3DES encryption : %llu\n", + pstat->aead_sha256_3des_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD SHA256-3DES decryption : %llu\n", + pstat->aead_sha256_3des_dec); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD CCM-AES encryption : %llu\n", + pstat->aead_ccm_aes_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD CCM-AES decryption : %llu\n", + pstat->aead_ccm_aes_dec); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD RFC4309-CCM-AES encryption : %llu\n", + pstat->aead_rfc4309_ccm_aes_enc); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD RFC4309-CCM-AES decryption : %llu\n", + pstat->aead_rfc4309_ccm_aes_dec); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD operation success : %llu\n", + pstat->aead_op_success); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD operation fail : %llu\n", + pstat->aead_op_fail); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AEAD bad message : %llu\n", + pstat->aead_bad_msg); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + "\n"); + + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH SHA1 digest : %llu\n", + pstat->sha1_digest); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH SHA256 digest : %llu\n", + pstat->sha256_digest); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH SHA1 HMAC digest : %llu\n", + pstat->sha1_hmac_digest); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH SHA256 HMAC digest : %llu\n", + pstat->sha256_hmac_digest); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH operation success : %llu\n", + pstat->ahash_op_success); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + " AHASH operation fail : %llu\n", + pstat->ahash_op_fail); + len += scnprintf(read_buf + len, DEBUG_MAX_RW_BUF - len - 1, + "\n"); + + return len; +} + +static int qce_debug_stats_open(struct inode *inode, struct file *file) +{ + file->private_data = inode->i_private; + return 0; +} + +static ssize_t qce_debug_stats_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + struct qce_device *qce = (struct qce_device *)file->private_data; + int len; + + if (!qce) + return 0; + len = qce_disp_stats(qce); + + return simple_read_from_buffer((void __user *)buf, count, + ppos, (void *)qce->qce_debug_read_buf, len); +} + +static ssize_t qce_debug_stats_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct qce_device *qce = (struct qce_device *)file->private_data; + + if (!qce) + return 0; + memset((char *)&qce->qce_stat, 0, sizeof(struct qce_stat)); + return count; +} + +static const struct file_operations qce_debug_stats_ops = { + .open = qce_debug_stats_open, + .read = qce_debug_stats_read, + .write = qce_debug_stats_write, +}; + +static int qce_debug_init(struct qce_device *qce) +{ + int rc; + char name[DEBUG_MAX_FNAME]; + struct dentry *qce_dent; + struct dentry *stats_dent; + + qce_dent = qce->qce_debug_dent; + qce_dent = debugfs_create_dir("qce", NULL); + if (IS_ERR(qce_dent)) { + pr_err("qce debugfs_create_dir fail, error %ld\n", + PTR_ERR(qce_dent)); + return PTR_ERR(qce_dent); + } + + snprintf(name, DEBUG_MAX_FNAME - 1, "stats"); + stats_dent = debugfs_create_file(name, 0644, qce_dent, + qce, &qce_debug_stats_ops); + if (stats_dent == NULL) { + pr_err("qce debugfs_create_file fail, error %ld\n", + PTR_ERR(stats_dent)); + rc = PTR_ERR(stats_dent); + goto err; + } + return 0; +err: + debugfs_remove_recursive(qce_dent); + return rc; +} + static int qce_crypto_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -237,6 +489,9 @@ if (ret) goto err_dma; + ret = qce_debug_init(qce); + if (ret) + goto err_dma; return 0; err_dma: