From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
patches@lists.linux.dev, Kai Ye <yekai13@huawei.com>,
Herbert Xu <herbert@gondor.apana.org.au>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH 6.1 212/379] crypto: hisilicon/qm - split a debugfs.c from qm
Date: Wed, 15 Nov 2023 14:24:47 -0500 [thread overview]
Message-ID: <20231115192657.646943057@linuxfoundation.org> (raw)
In-Reply-To: <20231115192645.143643130@linuxfoundation.org>
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai Ye <yekai13@huawei.com>
[ Upstream commit 94476b2b6d60bc926a585ae62e1bf69bd22c1dff ]
Considering that the qm feature and debugfs feature are independent.
The code related to debugfs is getting larger and larger. It should be
separate as a debugfs file. So move some debugfs code to new file from
qm file. The qm code logic is not modified. And maintainability is
enhanced.
Signed-off-by: Kai Ye <yekai13@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Stable-dep-of: 5831fc1fd4a5 ("crypto: hisilicon/qm - fix PF queue parameter issue")
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/crypto/hisilicon/Makefile | 2 +-
drivers/crypto/hisilicon/debugfs.c | 1097 +++++++++++++++++++++
drivers/crypto/hisilicon/qm.c | 1348 ++------------------------
drivers/crypto/hisilicon/qm_common.h | 87 ++
4 files changed, 1277 insertions(+), 1257 deletions(-)
create mode 100644 drivers/crypto/hisilicon/debugfs.c
create mode 100644 drivers/crypto/hisilicon/qm_common.h
diff --git a/drivers/crypto/hisilicon/Makefile b/drivers/crypto/hisilicon/Makefile
index 1e89269a2e4b0..8595a5a5d2288 100644
--- a/drivers/crypto/hisilicon/Makefile
+++ b/drivers/crypto/hisilicon/Makefile
@@ -3,6 +3,6 @@ obj-$(CONFIG_CRYPTO_DEV_HISI_HPRE) += hpre/
obj-$(CONFIG_CRYPTO_DEV_HISI_SEC) += sec/
obj-$(CONFIG_CRYPTO_DEV_HISI_SEC2) += sec2/
obj-$(CONFIG_CRYPTO_DEV_HISI_QM) += hisi_qm.o
-hisi_qm-objs = qm.o sgl.o
+hisi_qm-objs = qm.o sgl.o debugfs.o
obj-$(CONFIG_CRYPTO_DEV_HISI_ZIP) += zip/
obj-$(CONFIG_CRYPTO_DEV_HISI_TRNG) += trng/
diff --git a/drivers/crypto/hisilicon/debugfs.c b/drivers/crypto/hisilicon/debugfs.c
new file mode 100644
index 0000000000000..13bec8b2d7237
--- /dev/null
+++ b/drivers/crypto/hisilicon/debugfs.c
@@ -0,0 +1,1097 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2022 HiSilicon Limited. */
+#include <linux/hisi_acc_qm.h>
+#include "qm_common.h"
+
+#define QM_DFX_BASE 0x0100000
+#define QM_DFX_STATE1 0x0104000
+#define QM_DFX_STATE2 0x01040C8
+#define QM_DFX_COMMON 0x0000
+#define QM_DFX_BASE_LEN 0x5A
+#define QM_DFX_STATE1_LEN 0x2E
+#define QM_DFX_STATE2_LEN 0x11
+#define QM_DFX_COMMON_LEN 0xC3
+#define QM_DFX_REGS_LEN 4UL
+#define QM_DBG_TMP_BUF_LEN 22
+#define CURRENT_FUN_MASK GENMASK(5, 0)
+#define CURRENT_Q_MASK GENMASK(31, 16)
+#define QM_SQE_ADDR_MASK GENMASK(7, 0)
+
+#define QM_DFX_MB_CNT_VF 0x104010
+#define QM_DFX_DB_CNT_VF 0x104020
+#define QM_DFX_SQE_CNT_VF_SQN 0x104030
+#define QM_DFX_CQE_CNT_VF_CQN 0x104040
+#define QM_DFX_QN_SHIFT 16
+#define QM_DFX_CNT_CLR_CE 0x100118
+#define QM_DBG_WRITE_LEN 1024
+
+static const char * const qm_debug_file_name[] = {
+ [CURRENT_QM] = "current_qm",
+ [CURRENT_Q] = "current_q",
+ [CLEAR_ENABLE] = "clear_enable",
+};
+
+struct qm_dfx_item {
+ const char *name;
+ u32 offset;
+};
+
+static struct qm_dfx_item qm_dfx_files[] = {
+ {"err_irq", offsetof(struct qm_dfx, err_irq_cnt)},
+ {"aeq_irq", offsetof(struct qm_dfx, aeq_irq_cnt)},
+ {"abnormal_irq", offsetof(struct qm_dfx, abnormal_irq_cnt)},
+ {"create_qp_err", offsetof(struct qm_dfx, create_qp_err_cnt)},
+ {"mb_err", offsetof(struct qm_dfx, mb_err_cnt)},
+};
+
+#define CNT_CYC_REGS_NUM 10
+static const struct debugfs_reg32 qm_dfx_regs[] = {
+ /* XXX_CNT are reading clear register */
+ {"QM_ECC_1BIT_CNT ", 0x104000ull},
+ {"QM_ECC_MBIT_CNT ", 0x104008ull},
+ {"QM_DFX_MB_CNT ", 0x104018ull},
+ {"QM_DFX_DB_CNT ", 0x104028ull},
+ {"QM_DFX_SQE_CNT ", 0x104038ull},
+ {"QM_DFX_CQE_CNT ", 0x104048ull},
+ {"QM_DFX_SEND_SQE_TO_ACC_CNT ", 0x104050ull},
+ {"QM_DFX_WB_SQE_FROM_ACC_CNT ", 0x104058ull},
+ {"QM_DFX_ACC_FINISH_CNT ", 0x104060ull},
+ {"QM_DFX_CQE_ERR_CNT ", 0x1040b4ull},
+ {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull},
+ {"QM_ECC_1BIT_INF ", 0x104004ull},
+ {"QM_ECC_MBIT_INF ", 0x10400cull},
+ {"QM_DFX_ACC_RDY_VLD0 ", 0x1040a0ull},
+ {"QM_DFX_ACC_RDY_VLD1 ", 0x1040a4ull},
+ {"QM_DFX_AXI_RDY_VLD ", 0x1040a8ull},
+ {"QM_DFX_FF_ST0 ", 0x1040c8ull},
+ {"QM_DFX_FF_ST1 ", 0x1040ccull},
+ {"QM_DFX_FF_ST2 ", 0x1040d0ull},
+ {"QM_DFX_FF_ST3 ", 0x1040d4ull},
+ {"QM_DFX_FF_ST4 ", 0x1040d8ull},
+ {"QM_DFX_FF_ST5 ", 0x1040dcull},
+ {"QM_DFX_FF_ST6 ", 0x1040e0ull},
+ {"QM_IN_IDLE_ST ", 0x1040e4ull},
+};
+
+static const struct debugfs_reg32 qm_vf_dfx_regs[] = {
+ {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull},
+};
+
+/* define the QM's dfx regs region and region length */
+static struct dfx_diff_registers qm_diff_regs[] = {
+ {
+ .reg_offset = QM_DFX_BASE,
+ .reg_len = QM_DFX_BASE_LEN,
+ }, {
+ .reg_offset = QM_DFX_STATE1,
+ .reg_len = QM_DFX_STATE1_LEN,
+ }, {
+ .reg_offset = QM_DFX_STATE2,
+ .reg_len = QM_DFX_STATE2_LEN,
+ }, {
+ .reg_offset = QM_DFX_COMMON,
+ .reg_len = QM_DFX_COMMON_LEN,
+ },
+};
+
+static struct hisi_qm *file_to_qm(struct debugfs_file *file)
+{
+ struct qm_debug *debug = file->debug;
+
+ return container_of(debug, struct hisi_qm, debug);
+}
+
+static ssize_t qm_cmd_read(struct file *filp, char __user *buffer,
+ size_t count, loff_t *pos)
+{
+ char buf[QM_DBG_READ_LEN];
+ int len;
+
+ len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n",
+ "Please echo help to cmd to get help information");
+
+ return simple_read_from_buffer(buffer, count, pos, buf, len);
+}
+
+static void dump_show(struct hisi_qm *qm, void *info,
+ unsigned int info_size, char *info_name)
+{
+ struct device *dev = &qm->pdev->dev;
+ u8 *info_curr = info;
+ u32 i;
+#define BYTE_PER_DW 4
+
+ dev_info(dev, "%s DUMP\n", info_name);
+ for (i = 0; i < info_size; i += BYTE_PER_DW, info_curr += BYTE_PER_DW) {
+ pr_info("DW%u: %02X%02X %02X%02X\n", i / BYTE_PER_DW,
+ *(info_curr + 3), *(info_curr + 2), *(info_curr + 1), *(info_curr));
+ }
+}
+
+static int qm_sqc_dump(struct hisi_qm *qm, const char *s)
+{
+ struct device *dev = &qm->pdev->dev;
+ struct qm_sqc *sqc, *sqc_curr;
+ dma_addr_t sqc_dma;
+ u32 qp_id;
+ int ret;
+
+ if (!s)
+ return -EINVAL;
+
+ ret = kstrtou32(s, 0, &qp_id);
+ if (ret || qp_id >= qm->qp_num) {
+ dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1);
+ return -EINVAL;
+ }
+
+ sqc = hisi_qm_ctx_alloc(qm, sizeof(*sqc), &sqc_dma);
+ if (IS_ERR(sqc))
+ return PTR_ERR(sqc);
+
+ ret = hisi_qm_mb(qm, QM_MB_CMD_SQC, sqc_dma, qp_id, 1);
+ if (ret) {
+ down_read(&qm->qps_lock);
+ if (qm->sqc) {
+ sqc_curr = qm->sqc + qp_id;
+
+ dump_show(qm, sqc_curr, sizeof(*sqc), "SOFT SQC");
+ }
+ up_read(&qm->qps_lock);
+
+ goto free_ctx;
+ }
+
+ dump_show(qm, sqc, sizeof(*sqc), "SQC");
+
+free_ctx:
+ hisi_qm_ctx_free(qm, sizeof(*sqc), sqc, &sqc_dma);
+ return 0;
+}
+
+static int qm_cqc_dump(struct hisi_qm *qm, const char *s)
+{
+ struct device *dev = &qm->pdev->dev;
+ struct qm_cqc *cqc, *cqc_curr;
+ dma_addr_t cqc_dma;
+ u32 qp_id;
+ int ret;
+
+ if (!s)
+ return -EINVAL;
+
+ ret = kstrtou32(s, 0, &qp_id);
+ if (ret || qp_id >= qm->qp_num) {
+ dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1);
+ return -EINVAL;
+ }
+
+ cqc = hisi_qm_ctx_alloc(qm, sizeof(*cqc), &cqc_dma);
+ if (IS_ERR(cqc))
+ return PTR_ERR(cqc);
+
+ ret = hisi_qm_mb(qm, QM_MB_CMD_CQC, cqc_dma, qp_id, 1);
+ if (ret) {
+ down_read(&qm->qps_lock);
+ if (qm->cqc) {
+ cqc_curr = qm->cqc + qp_id;
+
+ dump_show(qm, cqc_curr, sizeof(*cqc), "SOFT CQC");
+ }
+ up_read(&qm->qps_lock);
+
+ goto free_ctx;
+ }
+
+ dump_show(qm, cqc, sizeof(*cqc), "CQC");
+
+free_ctx:
+ hisi_qm_ctx_free(qm, sizeof(*cqc), cqc, &cqc_dma);
+ return 0;
+}
+
+static int qm_eqc_aeqc_dump(struct hisi_qm *qm, char *s, size_t size,
+ int cmd, char *name)
+{
+ struct device *dev = &qm->pdev->dev;
+ dma_addr_t xeqc_dma;
+ void *xeqc;
+ int ret;
+
+ if (strsep(&s, " ")) {
+ dev_err(dev, "Please do not input extra characters!\n");
+ return -EINVAL;
+ }
+
+ xeqc = hisi_qm_ctx_alloc(qm, size, &xeqc_dma);
+ if (IS_ERR(xeqc))
+ return PTR_ERR(xeqc);
+
+ ret = hisi_qm_mb(qm, cmd, xeqc_dma, 0, 1);
+ if (ret)
+ goto err_free_ctx;
+
+ dump_show(qm, xeqc, size, name);
+
+err_free_ctx:
+ hisi_qm_ctx_free(qm, size, xeqc, &xeqc_dma);
+ return ret;
+}
+
+static int q_dump_param_parse(struct hisi_qm *qm, char *s,
+ u32 *e_id, u32 *q_id, u16 q_depth)
+{
+ struct device *dev = &qm->pdev->dev;
+ unsigned int qp_num = qm->qp_num;
+ char *presult;
+ int ret;
+
+ presult = strsep(&s, " ");
+ if (!presult) {
+ dev_err(dev, "Please input qp number!\n");
+ return -EINVAL;
+ }
+
+ ret = kstrtou32(presult, 0, q_id);
+ if (ret || *q_id >= qp_num) {
+ dev_err(dev, "Please input qp num (0-%u)", qp_num - 1);
+ return -EINVAL;
+ }
+
+ presult = strsep(&s, " ");
+ if (!presult) {
+ dev_err(dev, "Please input sqe number!\n");
+ return -EINVAL;
+ }
+
+ ret = kstrtou32(presult, 0, e_id);
+ if (ret || *e_id >= q_depth) {
+ dev_err(dev, "Please input sqe num (0-%u)", q_depth - 1);
+ return -EINVAL;
+ }
+
+ if (strsep(&s, " ")) {
+ dev_err(dev, "Please do not input extra characters!\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int qm_sq_dump(struct hisi_qm *qm, char *s)
+{
+ u16 sq_depth = qm->qp_array->cq_depth;
+ void *sqe, *sqe_curr;
+ struct hisi_qp *qp;
+ u32 qp_id, sqe_id;
+ int ret;
+
+ ret = q_dump_param_parse(qm, s, &sqe_id, &qp_id, sq_depth);
+ if (ret)
+ return ret;
+
+ sqe = kzalloc(qm->sqe_size * sq_depth, GFP_KERNEL);
+ if (!sqe)
+ return -ENOMEM;
+
+ qp = &qm->qp_array[qp_id];
+ memcpy(sqe, qp->sqe, qm->sqe_size * sq_depth);
+ sqe_curr = sqe + (u32)(sqe_id * qm->sqe_size);
+ memset(sqe_curr + qm->debug.sqe_mask_offset, QM_SQE_ADDR_MASK,
+ qm->debug.sqe_mask_len);
+
+ dump_show(qm, sqe_curr, qm->sqe_size, "SQE");
+
+ kfree(sqe);
+
+ return 0;
+}
+
+static int qm_cq_dump(struct hisi_qm *qm, char *s)
+{
+ struct qm_cqe *cqe_curr;
+ struct hisi_qp *qp;
+ u32 qp_id, cqe_id;
+ int ret;
+
+ ret = q_dump_param_parse(qm, s, &cqe_id, &qp_id, qm->qp_array->cq_depth);
+ if (ret)
+ return ret;
+
+ qp = &qm->qp_array[qp_id];
+ cqe_curr = qp->cqe + cqe_id;
+ dump_show(qm, cqe_curr, sizeof(struct qm_cqe), "CQE");
+
+ return 0;
+}
+
+static int qm_eq_aeq_dump(struct hisi_qm *qm, const char *s,
+ size_t size, char *name)
+{
+ struct device *dev = &qm->pdev->dev;
+ void *xeqe;
+ u32 xeqe_id;
+ int ret;
+
+ if (!s)
+ return -EINVAL;
+
+ ret = kstrtou32(s, 0, &xeqe_id);
+ if (ret)
+ return -EINVAL;
+
+ if (!strcmp(name, "EQE") && xeqe_id >= qm->eq_depth) {
+ dev_err(dev, "Please input eqe num (0-%u)", qm->eq_depth - 1);
+ return -EINVAL;
+ } else if (!strcmp(name, "AEQE") && xeqe_id >= qm->aeq_depth) {
+ dev_err(dev, "Please input aeqe num (0-%u)", qm->eq_depth - 1);
+ return -EINVAL;
+ }
+
+ down_read(&qm->qps_lock);
+
+ if (qm->eqe && !strcmp(name, "EQE")) {
+ xeqe = qm->eqe + xeqe_id;
+ } else if (qm->aeqe && !strcmp(name, "AEQE")) {
+ xeqe = qm->aeqe + xeqe_id;
+ } else {
+ ret = -EINVAL;
+ goto err_unlock;
+ }
+
+ dump_show(qm, xeqe, size, name);
+
+err_unlock:
+ up_read(&qm->qps_lock);
+ return ret;
+}
+
+static int qm_dbg_help(struct hisi_qm *qm, char *s)
+{
+ struct device *dev = &qm->pdev->dev;
+
+ if (strsep(&s, " ")) {
+ dev_err(dev, "Please do not input extra characters!\n");
+ return -EINVAL;
+ }
+
+ dev_info(dev, "available commands:\n");
+ dev_info(dev, "sqc <num>\n");
+ dev_info(dev, "cqc <num>\n");
+ dev_info(dev, "eqc\n");
+ dev_info(dev, "aeqc\n");
+ dev_info(dev, "sq <num> <e>\n");
+ dev_info(dev, "cq <num> <e>\n");
+ dev_info(dev, "eq <e>\n");
+ dev_info(dev, "aeq <e>\n");
+
+ return 0;
+}
+
+static int qm_cmd_write_dump(struct hisi_qm *qm, const char *cmd_buf)
+{
+ struct device *dev = &qm->pdev->dev;
+ char *presult, *s, *s_tmp;
+ int ret;
+
+ s = kstrdup(cmd_buf, GFP_KERNEL);
+ if (!s)
+ return -ENOMEM;
+
+ s_tmp = s;
+ presult = strsep(&s, " ");
+ if (!presult) {
+ ret = -EINVAL;
+ goto err_buffer_free;
+ }
+
+ if (!strcmp(presult, "sqc"))
+ ret = qm_sqc_dump(qm, s);
+ else if (!strcmp(presult, "cqc"))
+ ret = qm_cqc_dump(qm, s);
+ else if (!strcmp(presult, "eqc"))
+ ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_eqc),
+ QM_MB_CMD_EQC, "EQC");
+ else if (!strcmp(presult, "aeqc"))
+ ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_aeqc),
+ QM_MB_CMD_AEQC, "AEQC");
+ else if (!strcmp(presult, "sq"))
+ ret = qm_sq_dump(qm, s);
+ else if (!strcmp(presult, "cq"))
+ ret = qm_cq_dump(qm, s);
+ else if (!strcmp(presult, "eq"))
+ ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_eqe), "EQE");
+ else if (!strcmp(presult, "aeq"))
+ ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_aeqe), "AEQE");
+ else if (!strcmp(presult, "help"))
+ ret = qm_dbg_help(qm, s);
+ else
+ ret = -EINVAL;
+
+ if (ret)
+ dev_info(dev, "Please echo help\n");
+
+err_buffer_free:
+ kfree(s_tmp);
+
+ return ret;
+}
+
+static ssize_t qm_cmd_write(struct file *filp, const char __user *buffer,
+ size_t count, loff_t *pos)
+{
+ struct hisi_qm *qm = filp->private_data;
+ char *cmd_buf, *cmd_buf_tmp;
+ int ret;
+
+ if (*pos)
+ return 0;
+
+ ret = hisi_qm_get_dfx_access(qm);
+ if (ret)
+ return ret;
+
+ /* Judge if the instance is being reset. */
+ if (unlikely(atomic_read(&qm->status.flags) == QM_STOP)) {
+ ret = 0;
+ goto put_dfx_access;
+ }
+
+ if (count > QM_DBG_WRITE_LEN) {
+ ret = -ENOSPC;
+ goto put_dfx_access;
+ }
+
+ cmd_buf = memdup_user_nul(buffer, count);
+ if (IS_ERR(cmd_buf)) {
+ ret = PTR_ERR(cmd_buf);
+ goto put_dfx_access;
+ }
+
+ cmd_buf_tmp = strchr(cmd_buf, '\n');
+ if (cmd_buf_tmp) {
+ *cmd_buf_tmp = '\0';
+ count = cmd_buf_tmp - cmd_buf + 1;
+ }
+
+ ret = qm_cmd_write_dump(qm, cmd_buf);
+ if (ret) {
+ kfree(cmd_buf);
+ goto put_dfx_access;
+ }
+
+ kfree(cmd_buf);
+
+ ret = count;
+
+put_dfx_access:
+ hisi_qm_put_dfx_access(qm);
+ return ret;
+}
+
+static const struct file_operations qm_cmd_fops = {
+ .owner = THIS_MODULE,
+ .open = simple_open,
+ .read = qm_cmd_read,
+ .write = qm_cmd_write,
+};
+
+/**
+ * hisi_qm_regs_dump() - Dump registers's value.
+ * @s: debugfs file handle.
+ * @regset: accelerator registers information.
+ *
+ * Dump accelerator registers.
+ */
+void hisi_qm_regs_dump(struct seq_file *s, struct debugfs_regset32 *regset)
+{
+ struct pci_dev *pdev = to_pci_dev(regset->dev);
+ struct hisi_qm *qm = pci_get_drvdata(pdev);
+ const struct debugfs_reg32 *regs = regset->regs;
+ int regs_len = regset->nregs;
+ int i, ret;
+ u32 val;
+
+ ret = hisi_qm_get_dfx_access(qm);
+ if (ret)
+ return;
+
+ for (i = 0; i < regs_len; i++) {
+ val = readl(regset->base + regs[i].offset);
+ seq_printf(s, "%s= 0x%08x\n", regs[i].name, val);
+ }
+
+ hisi_qm_put_dfx_access(qm);
+}
+EXPORT_SYMBOL_GPL(hisi_qm_regs_dump);
+
+static int qm_regs_show(struct seq_file *s, void *unused)
+{
+ struct hisi_qm *qm = s->private;
+ struct debugfs_regset32 regset;
+
+ if (qm->fun_type == QM_HW_PF) {
+ regset.regs = qm_dfx_regs;
+ regset.nregs = ARRAY_SIZE(qm_dfx_regs);
+ } else {
+ regset.regs = qm_vf_dfx_regs;
+ regset.nregs = ARRAY_SIZE(qm_vf_dfx_regs);
+ }
+
+ regset.base = qm->io_base;
+ regset.dev = &qm->pdev->dev;
+
+ hisi_qm_regs_dump(s, ®set);
+
+ return 0;
+}
+
+DEFINE_SHOW_ATTRIBUTE(qm_regs);
+
+static u32 current_q_read(struct hisi_qm *qm)
+{
+ return readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) >> QM_DFX_QN_SHIFT;
+}
+
+static int current_q_write(struct hisi_qm *qm, u32 val)
+{
+ u32 tmp;
+
+ if (val >= qm->debug.curr_qm_qp_num)
+ return -EINVAL;
+
+ tmp = val << QM_DFX_QN_SHIFT |
+ (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_FUN_MASK);
+ writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
+
+ tmp = val << QM_DFX_QN_SHIFT |
+ (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_FUN_MASK);
+ writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
+
+ return 0;
+}
+
+static u32 clear_enable_read(struct hisi_qm *qm)
+{
+ return readl(qm->io_base + QM_DFX_CNT_CLR_CE);
+}
+
+/* rd_clr_ctrl 1 enable read clear, otherwise 0 disable it */
+static int clear_enable_write(struct hisi_qm *qm, u32 rd_clr_ctrl)
+{
+ if (rd_clr_ctrl > 1)
+ return -EINVAL;
+
+ writel(rd_clr_ctrl, qm->io_base + QM_DFX_CNT_CLR_CE);
+
+ return 0;
+}
+
+static u32 current_qm_read(struct hisi_qm *qm)
+{
+ return readl(qm->io_base + QM_DFX_MB_CNT_VF);
+}
+
+static int qm_get_vf_qp_num(struct hisi_qm *qm, u32 fun_num)
+{
+ u32 remain_q_num, vfq_num;
+ u32 num_vfs = qm->vfs_num;
+
+ vfq_num = (qm->ctrl_qp_num - qm->qp_num) / num_vfs;
+ if (vfq_num >= qm->max_qp_num)
+ return qm->max_qp_num;
+
+ remain_q_num = (qm->ctrl_qp_num - qm->qp_num) % num_vfs;
+ if (vfq_num + remain_q_num <= qm->max_qp_num)
+ return fun_num == num_vfs ? vfq_num + remain_q_num : vfq_num;
+
+ /*
+ * if vfq_num + remain_q_num > max_qp_num, the last VFs,
+ * each with one more queue.
+ */
+ return fun_num + remain_q_num > num_vfs ? vfq_num + 1 : vfq_num;
+}
+
+static int current_qm_write(struct hisi_qm *qm, u32 val)
+{
+ u32 tmp;
+
+ if (val > qm->vfs_num)
+ return -EINVAL;
+
+ /* According PF or VF Dev ID to calculation curr_qm_qp_num and store */
+ if (!val)
+ qm->debug.curr_qm_qp_num = qm->qp_num;
+ else
+ qm->debug.curr_qm_qp_num = qm_get_vf_qp_num(qm, val);
+
+ writel(val, qm->io_base + QM_DFX_MB_CNT_VF);
+ writel(val, qm->io_base + QM_DFX_DB_CNT_VF);
+
+ tmp = val |
+ (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_Q_MASK);
+ writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
+
+ tmp = val |
+ (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_Q_MASK);
+ writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
+
+ return 0;
+}
+
+static ssize_t qm_debug_read(struct file *filp, char __user *buf,
+ size_t count, loff_t *pos)
+{
+ struct debugfs_file *file = filp->private_data;
+ enum qm_debug_file index = file->index;
+ struct hisi_qm *qm = file_to_qm(file);
+ char tbuf[QM_DBG_TMP_BUF_LEN];
+ u32 val;
+ int ret;
+
+ ret = hisi_qm_get_dfx_access(qm);
+ if (ret)
+ return ret;
+
+ mutex_lock(&file->lock);
+ switch (index) {
+ case CURRENT_QM:
+ val = current_qm_read(qm);
+ break;
+ case CURRENT_Q:
+ val = current_q_read(qm);
+ break;
+ case CLEAR_ENABLE:
+ val = clear_enable_read(qm);
+ break;
+ default:
+ goto err_input;
+ }
+ mutex_unlock(&file->lock);
+
+ hisi_qm_put_dfx_access(qm);
+ ret = scnprintf(tbuf, QM_DBG_TMP_BUF_LEN, "%u\n", val);
+ return simple_read_from_buffer(buf, count, pos, tbuf, ret);
+
+err_input:
+ mutex_unlock(&file->lock);
+ hisi_qm_put_dfx_access(qm);
+ return -EINVAL;
+}
+
+static ssize_t qm_debug_write(struct file *filp, const char __user *buf,
+ size_t count, loff_t *pos)
+{
+ struct debugfs_file *file = filp->private_data;
+ enum qm_debug_file index = file->index;
+ struct hisi_qm *qm = file_to_qm(file);
+ unsigned long val;
+ char tbuf[QM_DBG_TMP_BUF_LEN];
+ int len, ret;
+
+ if (*pos != 0)
+ return 0;
+
+ if (count >= QM_DBG_TMP_BUF_LEN)
+ return -ENOSPC;
+
+ len = simple_write_to_buffer(tbuf, QM_DBG_TMP_BUF_LEN - 1, pos, buf,
+ count);
+ if (len < 0)
+ return len;
+
+ tbuf[len] = '\0';
+ if (kstrtoul(tbuf, 0, &val))
+ return -EFAULT;
+
+ ret = hisi_qm_get_dfx_access(qm);
+ if (ret)
+ return ret;
+
+ mutex_lock(&file->lock);
+ switch (index) {
+ case CURRENT_QM:
+ ret = current_qm_write(qm, val);
+ break;
+ case CURRENT_Q:
+ ret = current_q_write(qm, val);
+ break;
+ case CLEAR_ENABLE:
+ ret = clear_enable_write(qm, val);
+ break;
+ default:
+ ret = -EINVAL;
+ }
+ mutex_unlock(&file->lock);
+
+ hisi_qm_put_dfx_access(qm);
+
+ if (ret)
+ return ret;
+
+ return count;
+}
+
+static const struct file_operations qm_debug_fops = {
+ .owner = THIS_MODULE,
+ .open = simple_open,
+ .read = qm_debug_read,
+ .write = qm_debug_write,
+};
+
+static void dfx_regs_uninit(struct hisi_qm *qm,
+ struct dfx_diff_registers *dregs, int reg_len)
+{
+ int i;
+
+ /* Setting the pointer is NULL to prevent double free */
+ for (i = 0; i < reg_len; i++) {
+ kfree(dregs[i].regs);
+ dregs[i].regs = NULL;
+ }
+ kfree(dregs);
+}
+
+static struct dfx_diff_registers *dfx_regs_init(struct hisi_qm *qm,
+ const struct dfx_diff_registers *cregs, u32 reg_len)
+{
+ struct dfx_diff_registers *diff_regs;
+ u32 j, base_offset;
+ int i;
+
+ diff_regs = kcalloc(reg_len, sizeof(*diff_regs), GFP_KERNEL);
+ if (!diff_regs)
+ return ERR_PTR(-ENOMEM);
+
+ for (i = 0; i < reg_len; i++) {
+ if (!cregs[i].reg_len)
+ continue;
+
+ diff_regs[i].reg_offset = cregs[i].reg_offset;
+ diff_regs[i].reg_len = cregs[i].reg_len;
+ diff_regs[i].regs = kcalloc(QM_DFX_REGS_LEN, cregs[i].reg_len,
+ GFP_KERNEL);
+ if (!diff_regs[i].regs)
+ goto alloc_error;
+
+ for (j = 0; j < diff_regs[i].reg_len; j++) {
+ base_offset = diff_regs[i].reg_offset +
+ j * QM_DFX_REGS_LEN;
+ diff_regs[i].regs[j] = readl(qm->io_base + base_offset);
+ }
+ }
+
+ return diff_regs;
+
+alloc_error:
+ while (i > 0) {
+ i--;
+ kfree(diff_regs[i].regs);
+ }
+ kfree(diff_regs);
+ return ERR_PTR(-ENOMEM);
+}
+
+static int qm_diff_regs_init(struct hisi_qm *qm,
+ struct dfx_diff_registers *dregs, u32 reg_len)
+{
+ qm->debug.qm_diff_regs = dfx_regs_init(qm, qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
+ if (IS_ERR(qm->debug.qm_diff_regs))
+ return PTR_ERR(qm->debug.qm_diff_regs);
+
+ qm->debug.acc_diff_regs = dfx_regs_init(qm, dregs, reg_len);
+ if (IS_ERR(qm->debug.acc_diff_regs)) {
+ dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
+ return PTR_ERR(qm->debug.acc_diff_regs);
+ }
+
+ return 0;
+}
+
+static void qm_last_regs_uninit(struct hisi_qm *qm)
+{
+ struct qm_debug *debug = &qm->debug;
+
+ if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
+ return;
+
+ kfree(debug->qm_last_words);
+ debug->qm_last_words = NULL;
+}
+
+static int qm_last_regs_init(struct hisi_qm *qm)
+{
+ int dfx_regs_num = ARRAY_SIZE(qm_dfx_regs);
+ struct qm_debug *debug = &qm->debug;
+ int i;
+
+ if (qm->fun_type == QM_HW_VF)
+ return 0;
+
+ debug->qm_last_words = kcalloc(dfx_regs_num, sizeof(unsigned int), GFP_KERNEL);
+ if (!debug->qm_last_words)
+ return -ENOMEM;
+
+ for (i = 0; i < dfx_regs_num; i++) {
+ debug->qm_last_words[i] = readl_relaxed(qm->io_base +
+ qm_dfx_regs[i].offset);
+ }
+
+ return 0;
+}
+
+static void qm_diff_regs_uninit(struct hisi_qm *qm, u32 reg_len)
+{
+ dfx_regs_uninit(qm, qm->debug.acc_diff_regs, reg_len);
+ dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
+}
+
+/**
+ * hisi_qm_regs_debugfs_init() - Allocate memory for registers.
+ * @qm: device qm handle.
+ * @dregs: diff registers handle.
+ * @reg_len: diff registers region length.
+ */
+int hisi_qm_regs_debugfs_init(struct hisi_qm *qm,
+ struct dfx_diff_registers *dregs, u32 reg_len)
+{
+ int ret;
+
+ if (!qm || !dregs)
+ return -EINVAL;
+
+ if (qm->fun_type != QM_HW_PF)
+ return 0;
+
+ ret = qm_last_regs_init(qm);
+ if (ret) {
+ dev_info(&qm->pdev->dev, "failed to init qm words memory!\n");
+ return ret;
+ }
+
+ ret = qm_diff_regs_init(qm, dregs, reg_len);
+ if (ret) {
+ qm_last_regs_uninit(qm);
+ return ret;
+ }
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(hisi_qm_regs_debugfs_init);
+
+/**
+ * hisi_qm_regs_debugfs_uninit() - Free memory for registers.
+ * @qm: device qm handle.
+ * @reg_len: diff registers region length.
+ */
+void hisi_qm_regs_debugfs_uninit(struct hisi_qm *qm, u32 reg_len)
+{
+ if (!qm || qm->fun_type != QM_HW_PF)
+ return;
+
+ qm_diff_regs_uninit(qm, reg_len);
+ qm_last_regs_uninit(qm);
+}
+EXPORT_SYMBOL_GPL(hisi_qm_regs_debugfs_uninit);
+
+/**
+ * hisi_qm_acc_diff_regs_dump() - Dump registers's value.
+ * @qm: device qm handle.
+ * @s: Debugfs file handle.
+ * @dregs: diff registers handle.
+ * @regs_len: diff registers region length.
+ */
+void hisi_qm_acc_diff_regs_dump(struct hisi_qm *qm, struct seq_file *s,
+ struct dfx_diff_registers *dregs, u32 regs_len)
+{
+ u32 j, val, base_offset;
+ int i, ret;
+
+ if (!qm || !s || !dregs)
+ return;
+
+ ret = hisi_qm_get_dfx_access(qm);
+ if (ret)
+ return;
+
+ down_read(&qm->qps_lock);
+ for (i = 0; i < regs_len; i++) {
+ if (!dregs[i].reg_len)
+ continue;
+
+ for (j = 0; j < dregs[i].reg_len; j++) {
+ base_offset = dregs[i].reg_offset + j * QM_DFX_REGS_LEN;
+ val = readl(qm->io_base + base_offset);
+ if (val != dregs[i].regs[j])
+ seq_printf(s, "0x%08x = 0x%08x ---> 0x%08x\n",
+ base_offset, dregs[i].regs[j], val);
+ }
+ }
+ up_read(&qm->qps_lock);
+
+ hisi_qm_put_dfx_access(qm);
+}
+EXPORT_SYMBOL_GPL(hisi_qm_acc_diff_regs_dump);
+
+void hisi_qm_show_last_dfx_regs(struct hisi_qm *qm)
+{
+ struct qm_debug *debug = &qm->debug;
+ struct pci_dev *pdev = qm->pdev;
+ u32 val;
+ int i;
+
+ if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
+ return;
+
+ for (i = 0; i < ARRAY_SIZE(qm_dfx_regs); i++) {
+ val = readl_relaxed(qm->io_base + qm_dfx_regs[i].offset);
+ if (debug->qm_last_words[i] != val)
+ pci_info(pdev, "%s \t= 0x%08x => 0x%08x\n",
+ qm_dfx_regs[i].name, debug->qm_last_words[i], val);
+ }
+}
+
+static int qm_diff_regs_show(struct seq_file *s, void *unused)
+{
+ struct hisi_qm *qm = s->private;
+
+ hisi_qm_acc_diff_regs_dump(qm, s, qm->debug.qm_diff_regs,
+ ARRAY_SIZE(qm_diff_regs));
+
+ return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(qm_diff_regs);
+
+static ssize_t qm_status_read(struct file *filp, char __user *buffer,
+ size_t count, loff_t *pos)
+{
+ struct hisi_qm *qm = filp->private_data;
+ char buf[QM_DBG_READ_LEN];
+ int val, len;
+
+ val = atomic_read(&qm->status.flags);
+ len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n", qm_s[val]);
+
+ return simple_read_from_buffer(buffer, count, pos, buf, len);
+}
+
+static const struct file_operations qm_status_fops = {
+ .owner = THIS_MODULE,
+ .open = simple_open,
+ .read = qm_status_read,
+};
+
+static void qm_create_debugfs_file(struct hisi_qm *qm, struct dentry *dir,
+ enum qm_debug_file index)
+{
+ struct debugfs_file *file = qm->debug.files + index;
+
+ debugfs_create_file(qm_debug_file_name[index], 0600, dir, file,
+ &qm_debug_fops);
+
+ file->index = index;
+ mutex_init(&file->lock);
+ file->debug = &qm->debug;
+}
+
+static int qm_debugfs_atomic64_set(void *data, u64 val)
+{
+ if (val)
+ return -EINVAL;
+
+ atomic64_set((atomic64_t *)data, 0);
+
+ return 0;
+}
+
+static int qm_debugfs_atomic64_get(void *data, u64 *val)
+{
+ *val = atomic64_read((atomic64_t *)data);
+
+ return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(qm_atomic64_ops, qm_debugfs_atomic64_get,
+ qm_debugfs_atomic64_set, "%llu\n");
+
+/**
+ * hisi_qm_debug_init() - Initialize qm related debugfs files.
+ * @qm: The qm for which we want to add debugfs files.
+ *
+ * Create qm related debugfs files.
+ */
+void hisi_qm_debug_init(struct hisi_qm *qm)
+{
+ struct dfx_diff_registers *qm_regs = qm->debug.qm_diff_regs;
+ struct qm_dfx *dfx = &qm->debug.dfx;
+ struct dentry *qm_d;
+ void *data;
+ int i;
+
+ qm_d = debugfs_create_dir("qm", qm->debug.debug_root);
+ qm->debug.qm_d = qm_d;
+
+ /* only show this in PF */
+ if (qm->fun_type == QM_HW_PF) {
+ qm_create_debugfs_file(qm, qm->debug.debug_root, CURRENT_QM);
+ for (i = CURRENT_Q; i < DEBUG_FILE_NUM; i++)
+ qm_create_debugfs_file(qm, qm->debug.qm_d, i);
+ }
+
+ if (qm_regs)
+ debugfs_create_file("diff_regs", 0444, qm->debug.qm_d,
+ qm, &qm_diff_regs_fops);
+
+ debugfs_create_file("regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops);
+
+ debugfs_create_file("cmd", 0600, qm->debug.qm_d, qm, &qm_cmd_fops);
+
+ debugfs_create_file("status", 0444, qm->debug.qm_d, qm,
+ &qm_status_fops);
+ for (i = 0; i < ARRAY_SIZE(qm_dfx_files); i++) {
+ data = (atomic64_t *)((uintptr_t)dfx + qm_dfx_files[i].offset);
+ debugfs_create_file(qm_dfx_files[i].name,
+ 0644,
+ qm_d,
+ data,
+ &qm_atomic64_ops);
+ }
+
+ if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps))
+ hisi_qm_set_algqos_init(qm);
+}
+EXPORT_SYMBOL_GPL(hisi_qm_debug_init);
+
+/**
+ * hisi_qm_debug_regs_clear() - clear qm debug related registers.
+ * @qm: The qm for which we want to clear its debug registers.
+ */
+void hisi_qm_debug_regs_clear(struct hisi_qm *qm)
+{
+ const struct debugfs_reg32 *regs;
+ int i;
+
+ /* clear current_qm */
+ writel(0x0, qm->io_base + QM_DFX_MB_CNT_VF);
+ writel(0x0, qm->io_base + QM_DFX_DB_CNT_VF);
+
+ /* clear current_q */
+ writel(0x0, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
+ writel(0x0, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
+
+ /*
+ * these registers are reading and clearing, so clear them after
+ * reading them.
+ */
+ writel(0x1, qm->io_base + QM_DFX_CNT_CLR_CE);
+
+ regs = qm_dfx_regs;
+ for (i = 0; i < CNT_CYC_REGS_NUM; i++) {
+ readl(qm->io_base + regs->offset);
+ regs++;
+ }
+
+ /* clear clear_enable */
+ writel(0x0, qm->io_base + QM_DFX_CNT_CLR_CE);
+}
+EXPORT_SYMBOL_GPL(hisi_qm_debug_regs_clear);
diff --git a/drivers/crypto/hisilicon/qm.c b/drivers/crypto/hisilicon/qm.c
index 0a5056108b94f..35c59818b3e7f 100644
--- a/drivers/crypto/hisilicon/qm.c
+++ b/drivers/crypto/hisilicon/qm.c
@@ -16,6 +16,7 @@
#include <linux/uaccess.h>
#include <uapi/misc/uacce/hisi_qm.h>
#include <linux/hisi_acc_qm.h>
+#include "qm_common.h"
/* eq/aeq irq enable */
#define QM_VF_AEQ_INT_SOURCE 0x0
@@ -119,8 +120,6 @@
#define QM_SQC_VFT_NUM_SHIFT_V2 45
#define QM_SQC_VFT_NUM_MASK_v2 GENMASK(9, 0)
-#define QM_DFX_CNT_CLR_CE 0x100118
-
#define QM_ABNORMAL_INT_SOURCE 0x100000
#define QM_ABNORMAL_INT_MASK 0x100004
#define QM_ABNORMAL_INT_MASK_VALUE 0x7fff
@@ -187,14 +186,6 @@
#define QM_VF_RESET_WAIT_TIMEOUT_US \
(QM_VF_RESET_WAIT_US * QM_VF_RESET_WAIT_CNT)
-#define QM_DFX_MB_CNT_VF 0x104010
-#define QM_DFX_DB_CNT_VF 0x104020
-#define QM_DFX_SQE_CNT_VF_SQN 0x104030
-#define QM_DFX_CQE_CNT_VF_CQN 0x104040
-#define QM_DFX_QN_SHIFT 16
-#define CURRENT_FUN_MASK GENMASK(5, 0)
-#define CURRENT_Q_MASK GENMASK(31, 16)
-
#define POLL_PERIOD 10
#define POLL_TIMEOUT 1000
#define WAIT_PERIOD_US_MAX 200
@@ -211,19 +202,15 @@
#define QMC_ALIGN(sz) ALIGN(sz, 32)
#define QM_DBG_READ_LEN 256
-#define QM_DBG_WRITE_LEN 1024
-#define QM_DBG_TMP_BUF_LEN 22
#define QM_PCI_COMMAND_INVALID ~0
#define QM_RESET_STOP_TX_OFFSET 1
#define QM_RESET_STOP_RX_OFFSET 2
#define WAIT_PERIOD 20
#define REMOVE_WAIT_DELAY 10
-#define QM_SQE_ADDR_MASK GENMASK(7, 0)
#define QM_DRIVER_REMOVING 0
#define QM_RST_SCHED 1
-#define QM_RESETTING 2
#define QM_QOS_PARAM_NUM 2
#define QM_QOS_VAL_NUM 1
#define QM_QOS_BDF_PARAM_NUM 4
@@ -250,15 +237,6 @@
#define QM_QOS_MIN_CIR_B 100
#define QM_QOS_MAX_CIR_U 6
#define QM_QOS_MAX_CIR_S 11
-#define QM_DFX_BASE 0x0100000
-#define QM_DFX_STATE1 0x0104000
-#define QM_DFX_STATE2 0x01040C8
-#define QM_DFX_COMMON 0x0000
-#define QM_DFX_BASE_LEN 0x5A
-#define QM_DFX_STATE1_LEN 0x2E
-#define QM_DFX_STATE2_LEN 0x11
-#define QM_DFX_COMMON_LEN 0xC3
-#define QM_DFX_REGS_LEN 4UL
#define QM_AUTOSUSPEND_DELAY 3000
#define QM_MK_CQC_DW3_V1(hop_num, pg_sz, buf_sz, cqe_sz) \
@@ -368,73 +346,6 @@ static const struct hisi_qm_cap_info qm_basic_info[] = {
{QM_VF_IRQ_NUM_CAP, 0x311c, 0, GENMASK(15, 0), 0x1, 0x2, 0x3},
};
-struct qm_cqe {
- __le32 rsvd0;
- __le16 cmd_id;
- __le16 rsvd1;
- __le16 sq_head;
- __le16 sq_num;
- __le16 rsvd2;
- __le16 w7;
-};
-
-struct qm_eqe {
- __le32 dw0;
-};
-
-struct qm_aeqe {
- __le32 dw0;
-};
-
-struct qm_sqc {
- __le16 head;
- __le16 tail;
- __le32 base_l;
- __le32 base_h;
- __le32 dw3;
- __le16 w8;
- __le16 rsvd0;
- __le16 pasid;
- __le16 w11;
- __le16 cq_num;
- __le16 w13;
- __le32 rsvd1;
-};
-
-struct qm_cqc {
- __le16 head;
- __le16 tail;
- __le32 base_l;
- __le32 base_h;
- __le32 dw3;
- __le16 w8;
- __le16 rsvd0;
- __le16 pasid;
- __le16 w11;
- __le32 dw6;
- __le32 rsvd1;
-};
-
-struct qm_eqc {
- __le16 head;
- __le16 tail;
- __le32 base_l;
- __le32 base_h;
- __le32 dw3;
- __le32 rsvd[2];
- __le32 dw6;
-};
-
-struct qm_aeqc {
- __le16 head;
- __le16 tail;
- __le32 base_l;
- __le32 base_h;
- __le32 dw3;
- __le32 rsvd[2];
- __le32 dw6;
-};
-
struct qm_mailbox {
__le16 w0;
__le16 queue_num;
@@ -467,25 +378,6 @@ struct hisi_qm_hw_ops {
int (*set_msi)(struct hisi_qm *qm, bool set);
};
-struct qm_dfx_item {
- const char *name;
- u32 offset;
-};
-
-static struct qm_dfx_item qm_dfx_files[] = {
- {"err_irq", offsetof(struct qm_dfx, err_irq_cnt)},
- {"aeq_irq", offsetof(struct qm_dfx, aeq_irq_cnt)},
- {"abnormal_irq", offsetof(struct qm_dfx, abnormal_irq_cnt)},
- {"create_qp_err", offsetof(struct qm_dfx, create_qp_err_cnt)},
- {"mb_err", offsetof(struct qm_dfx, mb_err_cnt)},
-};
-
-static const char * const qm_debug_file_name[] = {
- [CURRENT_QM] = "current_qm",
- [CURRENT_Q] = "current_q",
- [CLEAR_ENABLE] = "clear_enable",
-};
-
struct hisi_qm_hw_error {
u32 int_msk;
const char *msg;
@@ -510,23 +402,6 @@ static const struct hisi_qm_hw_error qm_hw_error[] = {
{ /* sentinel */ }
};
-/* define the QM's dfx regs region and region length */
-static struct dfx_diff_registers qm_diff_regs[] = {
- {
- .reg_offset = QM_DFX_BASE,
- .reg_len = QM_DFX_BASE_LEN,
- }, {
- .reg_offset = QM_DFX_STATE1,
- .reg_len = QM_DFX_STATE1_LEN,
- }, {
- .reg_offset = QM_DFX_STATE2,
- .reg_len = QM_DFX_STATE2_LEN,
- }, {
- .reg_offset = QM_DFX_COMMON,
- .reg_len = QM_DFX_COMMON_LEN,
- },
-};
-
static const char * const qm_db_timeout[] = {
"sq", "cq", "eq", "aeq",
};
@@ -535,10 +410,6 @@ static const char * const qm_fifo_overflow[] = {
"cq", "eq", "aeq",
};
-static const char * const qm_s[] = {
- "init", "start", "close", "stop",
-};
-
static const char * const qp_s[] = {
"none", "init", "start", "stop", "close",
};
@@ -1332,1046 +1203,150 @@ static void qm_vft_data_cfg(struct hisi_qm *qm, enum vft_type type, u32 base,
(QM_SHAPER_CBS_B << QM_SHAPER_FACTOR_CBS_B_SHIFT) |
(factor->cbs_s << QM_SHAPER_FACTOR_CBS_S_SHIFT);
}
- break;
- }
- }
-
- writel(lower_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_L);
- writel(upper_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_H);
-}
-
-static int qm_set_vft_common(struct hisi_qm *qm, enum vft_type type,
- u32 fun_num, u32 base, u32 number)
-{
- struct qm_shaper_factor *factor = NULL;
- unsigned int val;
- int ret;
-
- if (type == SHAPER_VFT && test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps))
- factor = &qm->factor[fun_num];
-
- ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
- val & BIT(0), POLL_PERIOD,
- POLL_TIMEOUT);
- if (ret)
- return ret;
-
- writel(0x0, qm->io_base + QM_VFT_CFG_OP_WR);
- writel(type, qm->io_base + QM_VFT_CFG_TYPE);
- if (type == SHAPER_VFT)
- fun_num |= base << QM_SHAPER_VFT_OFFSET;
-
- writel(fun_num, qm->io_base + QM_VFT_CFG);
-
- qm_vft_data_cfg(qm, type, base, number, factor);
-
- writel(0x0, qm->io_base + QM_VFT_CFG_RDY);
- writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE);
-
- return readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
- val & BIT(0), POLL_PERIOD,
- POLL_TIMEOUT);
-}
-
-static int qm_shaper_init_vft(struct hisi_qm *qm, u32 fun_num)
-{
- u32 qos = qm->factor[fun_num].func_qos;
- int ret, i;
-
- ret = qm_get_shaper_para(qos * QM_QOS_RATE, &qm->factor[fun_num]);
- if (ret) {
- dev_err(&qm->pdev->dev, "failed to calculate shaper parameter!\n");
- return ret;
- }
- writel(qm->type_rate, qm->io_base + QM_SHAPER_CFG);
- for (i = ALG_TYPE_0; i <= ALG_TYPE_1; i++) {
- /* The base number of queue reuse for different alg type */
- ret = qm_set_vft_common(qm, SHAPER_VFT, fun_num, i, 1);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
-/* The config should be conducted after qm_dev_mem_reset() */
-static int qm_set_sqc_cqc_vft(struct hisi_qm *qm, u32 fun_num, u32 base,
- u32 number)
-{
- int ret, i;
-
- for (i = SQC_VFT; i <= CQC_VFT; i++) {
- ret = qm_set_vft_common(qm, i, fun_num, base, number);
- if (ret)
- return ret;
- }
-
- /* init default shaper qos val */
- if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) {
- ret = qm_shaper_init_vft(qm, fun_num);
- if (ret)
- goto back_sqc_cqc;
- }
-
- return 0;
-back_sqc_cqc:
- for (i = SQC_VFT; i <= CQC_VFT; i++)
- qm_set_vft_common(qm, i, fun_num, 0, 0);
-
- return ret;
-}
-
-static int qm_get_vft_v2(struct hisi_qm *qm, u32 *base, u32 *number)
-{
- u64 sqc_vft;
- int ret;
-
- ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_VFT_V2, 0, 0, 1);
- if (ret)
- return ret;
-
- sqc_vft = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) |
- ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) << 32);
- *base = QM_SQC_VFT_BASE_MASK_V2 & (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2);
- *number = (QM_SQC_VFT_NUM_MASK_v2 &
- (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1;
-
- return 0;
-}
-
-static int qm_get_vf_qp_num(struct hisi_qm *qm, u32 fun_num)
-{
- u32 remain_q_num, vfq_num;
- u32 num_vfs = qm->vfs_num;
-
- vfq_num = (qm->ctrl_qp_num - qm->qp_num) / num_vfs;
- if (vfq_num >= qm->max_qp_num)
- return qm->max_qp_num;
-
- remain_q_num = (qm->ctrl_qp_num - qm->qp_num) % num_vfs;
- if (vfq_num + remain_q_num <= qm->max_qp_num)
- return fun_num == num_vfs ? vfq_num + remain_q_num : vfq_num;
-
- /*
- * if vfq_num + remain_q_num > max_qp_num, the last VFs,
- * each with one more queue.
- */
- return fun_num + remain_q_num > num_vfs ? vfq_num + 1 : vfq_num;
-}
-
-static struct hisi_qm *file_to_qm(struct debugfs_file *file)
-{
- struct qm_debug *debug = file->debug;
-
- return container_of(debug, struct hisi_qm, debug);
-}
-
-static u32 current_q_read(struct hisi_qm *qm)
-{
- return readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) >> QM_DFX_QN_SHIFT;
-}
-
-static int current_q_write(struct hisi_qm *qm, u32 val)
-{
- u32 tmp;
-
- if (val >= qm->debug.curr_qm_qp_num)
- return -EINVAL;
-
- tmp = val << QM_DFX_QN_SHIFT |
- (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_FUN_MASK);
- writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
-
- tmp = val << QM_DFX_QN_SHIFT |
- (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_FUN_MASK);
- writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
-
- return 0;
-}
-
-static u32 clear_enable_read(struct hisi_qm *qm)
-{
- return readl(qm->io_base + QM_DFX_CNT_CLR_CE);
-}
-
-/* rd_clr_ctrl 1 enable read clear, otherwise 0 disable it */
-static int clear_enable_write(struct hisi_qm *qm, u32 rd_clr_ctrl)
-{
- if (rd_clr_ctrl > 1)
- return -EINVAL;
-
- writel(rd_clr_ctrl, qm->io_base + QM_DFX_CNT_CLR_CE);
-
- return 0;
-}
-
-static u32 current_qm_read(struct hisi_qm *qm)
-{
- return readl(qm->io_base + QM_DFX_MB_CNT_VF);
-}
-
-static int current_qm_write(struct hisi_qm *qm, u32 val)
-{
- u32 tmp;
-
- if (val > qm->vfs_num)
- return -EINVAL;
-
- /* According PF or VF Dev ID to calculation curr_qm_qp_num and store */
- if (!val)
- qm->debug.curr_qm_qp_num = qm->qp_num;
- else
- qm->debug.curr_qm_qp_num = qm_get_vf_qp_num(qm, val);
-
- writel(val, qm->io_base + QM_DFX_MB_CNT_VF);
- writel(val, qm->io_base + QM_DFX_DB_CNT_VF);
-
- tmp = val |
- (readl(qm->io_base + QM_DFX_SQE_CNT_VF_SQN) & CURRENT_Q_MASK);
- writel(tmp, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
-
- tmp = val |
- (readl(qm->io_base + QM_DFX_CQE_CNT_VF_CQN) & CURRENT_Q_MASK);
- writel(tmp, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
-
- return 0;
-}
-
-static ssize_t qm_debug_read(struct file *filp, char __user *buf,
- size_t count, loff_t *pos)
-{
- struct debugfs_file *file = filp->private_data;
- enum qm_debug_file index = file->index;
- struct hisi_qm *qm = file_to_qm(file);
- char tbuf[QM_DBG_TMP_BUF_LEN];
- u32 val;
- int ret;
-
- ret = hisi_qm_get_dfx_access(qm);
- if (ret)
- return ret;
-
- mutex_lock(&file->lock);
- switch (index) {
- case CURRENT_QM:
- val = current_qm_read(qm);
- break;
- case CURRENT_Q:
- val = current_q_read(qm);
- break;
- case CLEAR_ENABLE:
- val = clear_enable_read(qm);
- break;
- default:
- goto err_input;
- }
- mutex_unlock(&file->lock);
-
- hisi_qm_put_dfx_access(qm);
- ret = scnprintf(tbuf, QM_DBG_TMP_BUF_LEN, "%u\n", val);
- return simple_read_from_buffer(buf, count, pos, tbuf, ret);
-
-err_input:
- mutex_unlock(&file->lock);
- hisi_qm_put_dfx_access(qm);
- return -EINVAL;
-}
-
-static ssize_t qm_debug_write(struct file *filp, const char __user *buf,
- size_t count, loff_t *pos)
-{
- struct debugfs_file *file = filp->private_data;
- enum qm_debug_file index = file->index;
- struct hisi_qm *qm = file_to_qm(file);
- unsigned long val;
- char tbuf[QM_DBG_TMP_BUF_LEN];
- int len, ret;
-
- if (*pos != 0)
- return 0;
-
- if (count >= QM_DBG_TMP_BUF_LEN)
- return -ENOSPC;
-
- len = simple_write_to_buffer(tbuf, QM_DBG_TMP_BUF_LEN - 1, pos, buf,
- count);
- if (len < 0)
- return len;
-
- tbuf[len] = '\0';
- if (kstrtoul(tbuf, 0, &val))
- return -EFAULT;
-
- ret = hisi_qm_get_dfx_access(qm);
- if (ret)
- return ret;
-
- mutex_lock(&file->lock);
- switch (index) {
- case CURRENT_QM:
- ret = current_qm_write(qm, val);
- break;
- case CURRENT_Q:
- ret = current_q_write(qm, val);
- break;
- case CLEAR_ENABLE:
- ret = clear_enable_write(qm, val);
- break;
- default:
- ret = -EINVAL;
- }
- mutex_unlock(&file->lock);
-
- hisi_qm_put_dfx_access(qm);
-
- if (ret)
- return ret;
-
- return count;
-}
-
-static const struct file_operations qm_debug_fops = {
- .owner = THIS_MODULE,
- .open = simple_open,
- .read = qm_debug_read,
- .write = qm_debug_write,
-};
-
-#define CNT_CYC_REGS_NUM 10
-static const struct debugfs_reg32 qm_dfx_regs[] = {
- /* XXX_CNT are reading clear register */
- {"QM_ECC_1BIT_CNT ", 0x104000ull},
- {"QM_ECC_MBIT_CNT ", 0x104008ull},
- {"QM_DFX_MB_CNT ", 0x104018ull},
- {"QM_DFX_DB_CNT ", 0x104028ull},
- {"QM_DFX_SQE_CNT ", 0x104038ull},
- {"QM_DFX_CQE_CNT ", 0x104048ull},
- {"QM_DFX_SEND_SQE_TO_ACC_CNT ", 0x104050ull},
- {"QM_DFX_WB_SQE_FROM_ACC_CNT ", 0x104058ull},
- {"QM_DFX_ACC_FINISH_CNT ", 0x104060ull},
- {"QM_DFX_CQE_ERR_CNT ", 0x1040b4ull},
- {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull},
- {"QM_ECC_1BIT_INF ", 0x104004ull},
- {"QM_ECC_MBIT_INF ", 0x10400cull},
- {"QM_DFX_ACC_RDY_VLD0 ", 0x1040a0ull},
- {"QM_DFX_ACC_RDY_VLD1 ", 0x1040a4ull},
- {"QM_DFX_AXI_RDY_VLD ", 0x1040a8ull},
- {"QM_DFX_FF_ST0 ", 0x1040c8ull},
- {"QM_DFX_FF_ST1 ", 0x1040ccull},
- {"QM_DFX_FF_ST2 ", 0x1040d0ull},
- {"QM_DFX_FF_ST3 ", 0x1040d4ull},
- {"QM_DFX_FF_ST4 ", 0x1040d8ull},
- {"QM_DFX_FF_ST5 ", 0x1040dcull},
- {"QM_DFX_FF_ST6 ", 0x1040e0ull},
- {"QM_IN_IDLE_ST ", 0x1040e4ull},
-};
-
-static const struct debugfs_reg32 qm_vf_dfx_regs[] = {
- {"QM_DFX_FUNS_ACTIVE_ST ", 0x200ull},
-};
-
-/**
- * hisi_qm_regs_dump() - Dump registers's value.
- * @s: debugfs file handle.
- * @regset: accelerator registers information.
- *
- * Dump accelerator registers.
- */
-void hisi_qm_regs_dump(struct seq_file *s, struct debugfs_regset32 *regset)
-{
- struct pci_dev *pdev = to_pci_dev(regset->dev);
- struct hisi_qm *qm = pci_get_drvdata(pdev);
- const struct debugfs_reg32 *regs = regset->regs;
- int regs_len = regset->nregs;
- int i, ret;
- u32 val;
-
- ret = hisi_qm_get_dfx_access(qm);
- if (ret)
- return;
-
- for (i = 0; i < regs_len; i++) {
- val = readl(regset->base + regs[i].offset);
- seq_printf(s, "%s= 0x%08x\n", regs[i].name, val);
- }
-
- hisi_qm_put_dfx_access(qm);
-}
-EXPORT_SYMBOL_GPL(hisi_qm_regs_dump);
-
-static int qm_regs_show(struct seq_file *s, void *unused)
-{
- struct hisi_qm *qm = s->private;
- struct debugfs_regset32 regset;
-
- if (qm->fun_type == QM_HW_PF) {
- regset.regs = qm_dfx_regs;
- regset.nregs = ARRAY_SIZE(qm_dfx_regs);
- } else {
- regset.regs = qm_vf_dfx_regs;
- regset.nregs = ARRAY_SIZE(qm_vf_dfx_regs);
- }
-
- regset.base = qm->io_base;
- regset.dev = &qm->pdev->dev;
-
- hisi_qm_regs_dump(s, ®set);
-
- return 0;
-}
-
-DEFINE_SHOW_ATTRIBUTE(qm_regs);
-
-static void dfx_regs_uninit(struct hisi_qm *qm,
- struct dfx_diff_registers *dregs, int reg_len)
-{
- int i;
-
- /* Setting the pointer is NULL to prevent double free */
- for (i = 0; i < reg_len; i++) {
- kfree(dregs[i].regs);
- dregs[i].regs = NULL;
- }
- kfree(dregs);
-}
-
-static struct dfx_diff_registers *dfx_regs_init(struct hisi_qm *qm,
- const struct dfx_diff_registers *cregs, u32 reg_len)
-{
- struct dfx_diff_registers *diff_regs;
- u32 j, base_offset;
- int i;
-
- diff_regs = kcalloc(reg_len, sizeof(*diff_regs), GFP_KERNEL);
- if (!diff_regs)
- return ERR_PTR(-ENOMEM);
-
- for (i = 0; i < reg_len; i++) {
- if (!cregs[i].reg_len)
- continue;
-
- diff_regs[i].reg_offset = cregs[i].reg_offset;
- diff_regs[i].reg_len = cregs[i].reg_len;
- diff_regs[i].regs = kcalloc(QM_DFX_REGS_LEN, cregs[i].reg_len,
- GFP_KERNEL);
- if (!diff_regs[i].regs)
- goto alloc_error;
-
- for (j = 0; j < diff_regs[i].reg_len; j++) {
- base_offset = diff_regs[i].reg_offset +
- j * QM_DFX_REGS_LEN;
- diff_regs[i].regs[j] = readl(qm->io_base + base_offset);
- }
- }
-
- return diff_regs;
-
-alloc_error:
- while (i > 0) {
- i--;
- kfree(diff_regs[i].regs);
- }
- kfree(diff_regs);
- return ERR_PTR(-ENOMEM);
-}
-
-static int qm_diff_regs_init(struct hisi_qm *qm,
- struct dfx_diff_registers *dregs, u32 reg_len)
-{
- qm->debug.qm_diff_regs = dfx_regs_init(qm, qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
- if (IS_ERR(qm->debug.qm_diff_regs))
- return PTR_ERR(qm->debug.qm_diff_regs);
-
- qm->debug.acc_diff_regs = dfx_regs_init(qm, dregs, reg_len);
- if (IS_ERR(qm->debug.acc_diff_regs)) {
- dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
- return PTR_ERR(qm->debug.acc_diff_regs);
- }
-
- return 0;
-}
-
-static void qm_last_regs_uninit(struct hisi_qm *qm)
-{
- struct qm_debug *debug = &qm->debug;
-
- if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
- return;
-
- kfree(debug->qm_last_words);
- debug->qm_last_words = NULL;
-}
-
-static int qm_last_regs_init(struct hisi_qm *qm)
-{
- int dfx_regs_num = ARRAY_SIZE(qm_dfx_regs);
- struct qm_debug *debug = &qm->debug;
- int i;
-
- if (qm->fun_type == QM_HW_VF)
- return 0;
-
- debug->qm_last_words = kcalloc(dfx_regs_num, sizeof(unsigned int), GFP_KERNEL);
- if (!debug->qm_last_words)
- return -ENOMEM;
-
- for (i = 0; i < dfx_regs_num; i++) {
- debug->qm_last_words[i] = readl_relaxed(qm->io_base +
- qm_dfx_regs[i].offset);
- }
-
- return 0;
-}
-
-static void qm_diff_regs_uninit(struct hisi_qm *qm, u32 reg_len)
-{
- dfx_regs_uninit(qm, qm->debug.acc_diff_regs, reg_len);
- dfx_regs_uninit(qm, qm->debug.qm_diff_regs, ARRAY_SIZE(qm_diff_regs));
-}
-
-/**
- * hisi_qm_regs_debugfs_init() - Allocate memory for registers.
- * @qm: device qm handle.
- * @dregs: diff registers handle.
- * @reg_len: diff registers region length.
- */
-int hisi_qm_regs_debugfs_init(struct hisi_qm *qm,
- struct dfx_diff_registers *dregs, u32 reg_len)
-{
- int ret;
-
- if (!qm || !dregs)
- return -EINVAL;
-
- if (qm->fun_type != QM_HW_PF)
- return 0;
-
- ret = qm_last_regs_init(qm);
- if (ret) {
- dev_info(&qm->pdev->dev, "failed to init qm words memory!\n");
- return ret;
- }
-
- ret = qm_diff_regs_init(qm, dregs, reg_len);
- if (ret) {
- qm_last_regs_uninit(qm);
- return ret;
- }
-
- return 0;
-}
-EXPORT_SYMBOL_GPL(hisi_qm_regs_debugfs_init);
-
-/**
- * hisi_qm_regs_debugfs_uninit() - Free memory for registers.
- * @qm: device qm handle.
- * @reg_len: diff registers region length.
- */
-void hisi_qm_regs_debugfs_uninit(struct hisi_qm *qm, u32 reg_len)
-{
- if (!qm || qm->fun_type != QM_HW_PF)
- return;
-
- qm_diff_regs_uninit(qm, reg_len);
- qm_last_regs_uninit(qm);
-}
-EXPORT_SYMBOL_GPL(hisi_qm_regs_debugfs_uninit);
-
-/**
- * hisi_qm_acc_diff_regs_dump() - Dump registers's value.
- * @qm: device qm handle.
- * @s: Debugfs file handle.
- * @dregs: diff registers handle.
- * @regs_len: diff registers region length.
- */
-void hisi_qm_acc_diff_regs_dump(struct hisi_qm *qm, struct seq_file *s,
- struct dfx_diff_registers *dregs, u32 regs_len)
-{
- u32 j, val, base_offset;
- int i, ret;
-
- if (!qm || !s || !dregs)
- return;
-
- ret = hisi_qm_get_dfx_access(qm);
- if (ret)
- return;
-
- down_read(&qm->qps_lock);
- for (i = 0; i < regs_len; i++) {
- if (!dregs[i].reg_len)
- continue;
-
- for (j = 0; j < dregs[i].reg_len; j++) {
- base_offset = dregs[i].reg_offset + j * QM_DFX_REGS_LEN;
- val = readl(qm->io_base + base_offset);
- if (val != dregs[i].regs[j])
- seq_printf(s, "0x%08x = 0x%08x ---> 0x%08x\n",
- base_offset, dregs[i].regs[j], val);
- }
- }
- up_read(&qm->qps_lock);
-
- hisi_qm_put_dfx_access(qm);
-}
-EXPORT_SYMBOL_GPL(hisi_qm_acc_diff_regs_dump);
-
-static int qm_diff_regs_show(struct seq_file *s, void *unused)
-{
- struct hisi_qm *qm = s->private;
-
- hisi_qm_acc_diff_regs_dump(qm, s, qm->debug.qm_diff_regs,
- ARRAY_SIZE(qm_diff_regs));
-
- return 0;
-}
-DEFINE_SHOW_ATTRIBUTE(qm_diff_regs);
-
-static ssize_t qm_cmd_read(struct file *filp, char __user *buffer,
- size_t count, loff_t *pos)
-{
- char buf[QM_DBG_READ_LEN];
- int len;
-
- len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n",
- "Please echo help to cmd to get help information");
-
- return simple_read_from_buffer(buffer, count, pos, buf, len);
-}
-
-static void *qm_ctx_alloc(struct hisi_qm *qm, size_t ctx_size,
- dma_addr_t *dma_addr)
-{
- struct device *dev = &qm->pdev->dev;
- void *ctx_addr;
-
- ctx_addr = kzalloc(ctx_size, GFP_KERNEL);
- if (!ctx_addr)
- return ERR_PTR(-ENOMEM);
-
- *dma_addr = dma_map_single(dev, ctx_addr, ctx_size, DMA_FROM_DEVICE);
- if (dma_mapping_error(dev, *dma_addr)) {
- dev_err(dev, "DMA mapping error!\n");
- kfree(ctx_addr);
- return ERR_PTR(-ENOMEM);
- }
-
- return ctx_addr;
-}
-
-static void qm_ctx_free(struct hisi_qm *qm, size_t ctx_size,
- const void *ctx_addr, dma_addr_t *dma_addr)
-{
- struct device *dev = &qm->pdev->dev;
-
- dma_unmap_single(dev, *dma_addr, ctx_size, DMA_FROM_DEVICE);
- kfree(ctx_addr);
-}
-
-static void dump_show(struct hisi_qm *qm, void *info,
- unsigned int info_size, char *info_name)
-{
- struct device *dev = &qm->pdev->dev;
- u8 *info_curr = info;
- u32 i;
-#define BYTE_PER_DW 4
-
- dev_info(dev, "%s DUMP\n", info_name);
- for (i = 0; i < info_size; i += BYTE_PER_DW, info_curr += BYTE_PER_DW) {
- pr_info("DW%u: %02X%02X %02X%02X\n", i / BYTE_PER_DW,
- *(info_curr + 3), *(info_curr + 2), *(info_curr + 1), *(info_curr));
- }
-}
-
-static int qm_dump_sqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id)
-{
- return hisi_qm_mb(qm, QM_MB_CMD_SQC, dma_addr, qp_id, 1);
-}
-
-static int qm_dump_cqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id)
-{
- return hisi_qm_mb(qm, QM_MB_CMD_CQC, dma_addr, qp_id, 1);
-}
-
-static int qm_sqc_dump(struct hisi_qm *qm, const char *s)
-{
- struct device *dev = &qm->pdev->dev;
- struct qm_sqc *sqc, *sqc_curr;
- dma_addr_t sqc_dma;
- u32 qp_id;
- int ret;
-
- if (!s)
- return -EINVAL;
-
- ret = kstrtou32(s, 0, &qp_id);
- if (ret || qp_id >= qm->qp_num) {
- dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1);
- return -EINVAL;
- }
-
- sqc = qm_ctx_alloc(qm, sizeof(*sqc), &sqc_dma);
- if (IS_ERR(sqc))
- return PTR_ERR(sqc);
-
- ret = qm_dump_sqc_raw(qm, sqc_dma, qp_id);
- if (ret) {
- down_read(&qm->qps_lock);
- if (qm->sqc) {
- sqc_curr = qm->sqc + qp_id;
-
- dump_show(qm, sqc_curr, sizeof(*sqc), "SOFT SQC");
- }
- up_read(&qm->qps_lock);
-
- goto free_ctx;
- }
-
- dump_show(qm, sqc, sizeof(*sqc), "SQC");
-
-free_ctx:
- qm_ctx_free(qm, sizeof(*sqc), sqc, &sqc_dma);
- return 0;
-}
-
-static int qm_cqc_dump(struct hisi_qm *qm, const char *s)
-{
- struct device *dev = &qm->pdev->dev;
- struct qm_cqc *cqc, *cqc_curr;
- dma_addr_t cqc_dma;
- u32 qp_id;
- int ret;
-
- if (!s)
- return -EINVAL;
-
- ret = kstrtou32(s, 0, &qp_id);
- if (ret || qp_id >= qm->qp_num) {
- dev_err(dev, "Please input qp num (0-%u)", qm->qp_num - 1);
- return -EINVAL;
- }
-
- cqc = qm_ctx_alloc(qm, sizeof(*cqc), &cqc_dma);
- if (IS_ERR(cqc))
- return PTR_ERR(cqc);
-
- ret = qm_dump_cqc_raw(qm, cqc_dma, qp_id);
- if (ret) {
- down_read(&qm->qps_lock);
- if (qm->cqc) {
- cqc_curr = qm->cqc + qp_id;
-
- dump_show(qm, cqc_curr, sizeof(*cqc), "SOFT CQC");
+ break;
}
- up_read(&qm->qps_lock);
-
- goto free_ctx;
}
- dump_show(qm, cqc, sizeof(*cqc), "CQC");
-
-free_ctx:
- qm_ctx_free(qm, sizeof(*cqc), cqc, &cqc_dma);
- return 0;
+ writel(lower_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_L);
+ writel(upper_32_bits(tmp), qm->io_base + QM_VFT_CFG_DATA_H);
}
-static int qm_eqc_aeqc_dump(struct hisi_qm *qm, char *s, size_t size,
- int cmd, char *name)
+static int qm_set_vft_common(struct hisi_qm *qm, enum vft_type type,
+ u32 fun_num, u32 base, u32 number)
{
- struct device *dev = &qm->pdev->dev;
- dma_addr_t xeqc_dma;
- void *xeqc;
+ struct qm_shaper_factor *factor = NULL;
+ unsigned int val;
int ret;
- if (strsep(&s, " ")) {
- dev_err(dev, "Please do not input extra characters!\n");
- return -EINVAL;
- }
-
- xeqc = qm_ctx_alloc(qm, size, &xeqc_dma);
- if (IS_ERR(xeqc))
- return PTR_ERR(xeqc);
+ if (type == SHAPER_VFT && test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps))
+ factor = &qm->factor[fun_num];
- ret = hisi_qm_mb(qm, cmd, xeqc_dma, 0, 1);
+ ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
+ val & BIT(0), POLL_PERIOD,
+ POLL_TIMEOUT);
if (ret)
- goto err_free_ctx;
+ return ret;
- dump_show(qm, xeqc, size, name);
+ writel(0x0, qm->io_base + QM_VFT_CFG_OP_WR);
+ writel(type, qm->io_base + QM_VFT_CFG_TYPE);
+ if (type == SHAPER_VFT)
+ fun_num |= base << QM_SHAPER_VFT_OFFSET;
-err_free_ctx:
- qm_ctx_free(qm, size, xeqc, &xeqc_dma);
- return ret;
-}
+ writel(fun_num, qm->io_base + QM_VFT_CFG);
-static int q_dump_param_parse(struct hisi_qm *qm, char *s,
- u32 *e_id, u32 *q_id, u16 q_depth)
-{
- struct device *dev = &qm->pdev->dev;
- unsigned int qp_num = qm->qp_num;
- char *presult;
- int ret;
+ qm_vft_data_cfg(qm, type, base, number, factor);
- presult = strsep(&s, " ");
- if (!presult) {
- dev_err(dev, "Please input qp number!\n");
- return -EINVAL;
- }
+ writel(0x0, qm->io_base + QM_VFT_CFG_RDY);
+ writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE);
- ret = kstrtou32(presult, 0, q_id);
- if (ret || *q_id >= qp_num) {
- dev_err(dev, "Please input qp num (0-%u)", qp_num - 1);
- return -EINVAL;
- }
+ return readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
+ val & BIT(0), POLL_PERIOD,
+ POLL_TIMEOUT);
+}
- presult = strsep(&s, " ");
- if (!presult) {
- dev_err(dev, "Please input sqe number!\n");
- return -EINVAL;
- }
+static int qm_shaper_init_vft(struct hisi_qm *qm, u32 fun_num)
+{
+ u32 qos = qm->factor[fun_num].func_qos;
+ int ret, i;
- ret = kstrtou32(presult, 0, e_id);
- if (ret || *e_id >= q_depth) {
- dev_err(dev, "Please input sqe num (0-%u)", q_depth - 1);
- return -EINVAL;
+ ret = qm_get_shaper_para(qos * QM_QOS_RATE, &qm->factor[fun_num]);
+ if (ret) {
+ dev_err(&qm->pdev->dev, "failed to calculate shaper parameter!\n");
+ return ret;
}
-
- if (strsep(&s, " ")) {
- dev_err(dev, "Please do not input extra characters!\n");
- return -EINVAL;
+ writel(qm->type_rate, qm->io_base + QM_SHAPER_CFG);
+ for (i = ALG_TYPE_0; i <= ALG_TYPE_1; i++) {
+ /* The base number of queue reuse for different alg type */
+ ret = qm_set_vft_common(qm, SHAPER_VFT, fun_num, i, 1);
+ if (ret)
+ return ret;
}
return 0;
}
-static int qm_sq_dump(struct hisi_qm *qm, char *s)
+/* The config should be conducted after qm_dev_mem_reset() */
+static int qm_set_sqc_cqc_vft(struct hisi_qm *qm, u32 fun_num, u32 base,
+ u32 number)
{
- u16 sq_depth = qm->qp_array->cq_depth;
- void *sqe, *sqe_curr;
- struct hisi_qp *qp;
- u32 qp_id, sqe_id;
- int ret;
-
- ret = q_dump_param_parse(qm, s, &sqe_id, &qp_id, sq_depth);
- if (ret)
- return ret;
-
- sqe = kzalloc(qm->sqe_size * sq_depth, GFP_KERNEL);
- if (!sqe)
- return -ENOMEM;
-
- qp = &qm->qp_array[qp_id];
- memcpy(sqe, qp->sqe, qm->sqe_size * sq_depth);
- sqe_curr = sqe + (u32)(sqe_id * qm->sqe_size);
- memset(sqe_curr + qm->debug.sqe_mask_offset, QM_SQE_ADDR_MASK,
- qm->debug.sqe_mask_len);
+ int ret, i;
- dump_show(qm, sqe_curr, qm->sqe_size, "SQE");
+ for (i = SQC_VFT; i <= CQC_VFT; i++) {
+ ret = qm_set_vft_common(qm, i, fun_num, base, number);
+ if (ret)
+ return ret;
+ }
- kfree(sqe);
+ /* init default shaper qos val */
+ if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps)) {
+ ret = qm_shaper_init_vft(qm, fun_num);
+ if (ret)
+ goto back_sqc_cqc;
+ }
return 0;
+back_sqc_cqc:
+ for (i = SQC_VFT; i <= CQC_VFT; i++)
+ qm_set_vft_common(qm, i, fun_num, 0, 0);
+
+ return ret;
}
-static int qm_cq_dump(struct hisi_qm *qm, char *s)
+static int qm_get_vft_v2(struct hisi_qm *qm, u32 *base, u32 *number)
{
- struct qm_cqe *cqe_curr;
- struct hisi_qp *qp;
- u32 qp_id, cqe_id;
+ u64 sqc_vft;
int ret;
- ret = q_dump_param_parse(qm, s, &cqe_id, &qp_id, qm->qp_array->cq_depth);
+ ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_VFT_V2, 0, 0, 1);
if (ret)
return ret;
- qp = &qm->qp_array[qp_id];
- cqe_curr = qp->cqe + cqe_id;
- dump_show(qm, cqe_curr, sizeof(struct qm_cqe), "CQE");
+ sqc_vft = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) |
+ ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) << 32);
+ *base = QM_SQC_VFT_BASE_MASK_V2 & (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2);
+ *number = (QM_SQC_VFT_NUM_MASK_v2 &
+ (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1;
return 0;
}
-static int qm_eq_aeq_dump(struct hisi_qm *qm, const char *s,
- size_t size, char *name)
+void *hisi_qm_ctx_alloc(struct hisi_qm *qm, size_t ctx_size,
+ dma_addr_t *dma_addr)
{
struct device *dev = &qm->pdev->dev;
- void *xeqe;
- u32 xeqe_id;
- int ret;
-
- if (!s)
- return -EINVAL;
-
- ret = kstrtou32(s, 0, &xeqe_id);
- if (ret)
- return -EINVAL;
-
- if (!strcmp(name, "EQE") && xeqe_id >= qm->eq_depth) {
- dev_err(dev, "Please input eqe num (0-%u)", qm->eq_depth - 1);
- return -EINVAL;
- } else if (!strcmp(name, "AEQE") && xeqe_id >= qm->aeq_depth) {
- dev_err(dev, "Please input aeqe num (0-%u)", qm->eq_depth - 1);
- return -EINVAL;
- }
-
- down_read(&qm->qps_lock);
-
- if (qm->eqe && !strcmp(name, "EQE")) {
- xeqe = qm->eqe + xeqe_id;
- } else if (qm->aeqe && !strcmp(name, "AEQE")) {
- xeqe = qm->aeqe + xeqe_id;
- } else {
- ret = -EINVAL;
- goto err_unlock;
- }
-
- dump_show(qm, xeqe, size, name);
-
-err_unlock:
- up_read(&qm->qps_lock);
- return ret;
-}
+ void *ctx_addr;
-static int qm_dbg_help(struct hisi_qm *qm, char *s)
-{
- struct device *dev = &qm->pdev->dev;
+ ctx_addr = kzalloc(ctx_size, GFP_KERNEL);
+ if (!ctx_addr)
+ return ERR_PTR(-ENOMEM);
- if (strsep(&s, " ")) {
- dev_err(dev, "Please do not input extra characters!\n");
- return -EINVAL;
+ *dma_addr = dma_map_single(dev, ctx_addr, ctx_size, DMA_FROM_DEVICE);
+ if (dma_mapping_error(dev, *dma_addr)) {
+ dev_err(dev, "DMA mapping error!\n");
+ kfree(ctx_addr);
+ return ERR_PTR(-ENOMEM);
}
- dev_info(dev, "available commands:\n");
- dev_info(dev, "sqc <num>\n");
- dev_info(dev, "cqc <num>\n");
- dev_info(dev, "eqc\n");
- dev_info(dev, "aeqc\n");
- dev_info(dev, "sq <num> <e>\n");
- dev_info(dev, "cq <num> <e>\n");
- dev_info(dev, "eq <e>\n");
- dev_info(dev, "aeq <e>\n");
-
- return 0;
+ return ctx_addr;
}
-static int qm_cmd_write_dump(struct hisi_qm *qm, const char *cmd_buf)
+void hisi_qm_ctx_free(struct hisi_qm *qm, size_t ctx_size,
+ const void *ctx_addr, dma_addr_t *dma_addr)
{
struct device *dev = &qm->pdev->dev;
- char *presult, *s, *s_tmp;
- int ret;
-
- s = kstrdup(cmd_buf, GFP_KERNEL);
- if (!s)
- return -ENOMEM;
-
- s_tmp = s;
- presult = strsep(&s, " ");
- if (!presult) {
- ret = -EINVAL;
- goto err_buffer_free;
- }
-
- if (!strcmp(presult, "sqc"))
- ret = qm_sqc_dump(qm, s);
- else if (!strcmp(presult, "cqc"))
- ret = qm_cqc_dump(qm, s);
- else if (!strcmp(presult, "eqc"))
- ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_eqc),
- QM_MB_CMD_EQC, "EQC");
- else if (!strcmp(presult, "aeqc"))
- ret = qm_eqc_aeqc_dump(qm, s, sizeof(struct qm_aeqc),
- QM_MB_CMD_AEQC, "AEQC");
- else if (!strcmp(presult, "sq"))
- ret = qm_sq_dump(qm, s);
- else if (!strcmp(presult, "cq"))
- ret = qm_cq_dump(qm, s);
- else if (!strcmp(presult, "eq"))
- ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_eqe), "EQE");
- else if (!strcmp(presult, "aeq"))
- ret = qm_eq_aeq_dump(qm, s, sizeof(struct qm_aeqe), "AEQE");
- else if (!strcmp(presult, "help"))
- ret = qm_dbg_help(qm, s);
- else
- ret = -EINVAL;
-
- if (ret)
- dev_info(dev, "Please echo help\n");
-
-err_buffer_free:
- kfree(s_tmp);
- return ret;
+ dma_unmap_single(dev, *dma_addr, ctx_size, DMA_FROM_DEVICE);
+ kfree(ctx_addr);
}
-static ssize_t qm_cmd_write(struct file *filp, const char __user *buffer,
- size_t count, loff_t *pos)
+static int qm_dump_sqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id)
{
- struct hisi_qm *qm = filp->private_data;
- char *cmd_buf, *cmd_buf_tmp;
- int ret;
-
- if (*pos)
- return 0;
-
- ret = hisi_qm_get_dfx_access(qm);
- if (ret)
- return ret;
-
- /* Judge if the instance is being reset. */
- if (unlikely(atomic_read(&qm->status.flags) == QM_STOP)) {
- ret = 0;
- goto put_dfx_access;
- }
-
- if (count > QM_DBG_WRITE_LEN) {
- ret = -ENOSPC;
- goto put_dfx_access;
- }
-
- cmd_buf = memdup_user_nul(buffer, count);
- if (IS_ERR(cmd_buf)) {
- ret = PTR_ERR(cmd_buf);
- goto put_dfx_access;
- }
-
- cmd_buf_tmp = strchr(cmd_buf, '\n');
- if (cmd_buf_tmp) {
- *cmd_buf_tmp = '\0';
- count = cmd_buf_tmp - cmd_buf + 1;
- }
-
- ret = qm_cmd_write_dump(qm, cmd_buf);
- if (ret) {
- kfree(cmd_buf);
- goto put_dfx_access;
- }
-
- kfree(cmd_buf);
-
- ret = count;
-
-put_dfx_access:
- hisi_qm_put_dfx_access(qm);
- return ret;
+ return hisi_qm_mb(qm, QM_MB_CMD_SQC, dma_addr, qp_id, 1);
}
-static const struct file_operations qm_cmd_fops = {
- .owner = THIS_MODULE,
- .open = simple_open,
- .read = qm_cmd_read,
- .write = qm_cmd_write,
-};
-
-static void qm_create_debugfs_file(struct hisi_qm *qm, struct dentry *dir,
- enum qm_debug_file index)
+static int qm_dump_cqc_raw(struct hisi_qm *qm, dma_addr_t dma_addr, u16 qp_id)
{
- struct debugfs_file *file = qm->debug.files + index;
-
- debugfs_create_file(qm_debug_file_name[index], 0600, dir, file,
- &qm_debug_fops);
-
- file->index = index;
- mutex_init(&file->lock);
- file->debug = &qm->debug;
+ return hisi_qm_mb(qm, QM_MB_CMD_CQC, dma_addr, qp_id, 1);
}
static void qm_hw_error_init_v1(struct hisi_qm *qm)
@@ -3155,7 +2130,7 @@ static int qm_drain_qp(struct hisi_qp *qp)
return ret;
}
- addr = qm_ctx_alloc(qm, size, &dma_addr);
+ addr = hisi_qm_ctx_alloc(qm, size, &dma_addr);
if (IS_ERR(addr)) {
dev_err(dev, "Failed to alloc ctx for sqc and cqc!\n");
return -ENOMEM;
@@ -3190,7 +2165,7 @@ static int qm_drain_qp(struct hisi_qp *qp)
usleep_range(WAIT_PERIOD_US_MIN, WAIT_PERIOD_US_MAX);
}
- qm_ctx_free(qm, size, addr, &dma_addr);
+ hisi_qm_ctx_free(qm, size, addr, &dma_addr);
return ret;
}
@@ -4173,45 +3148,6 @@ int hisi_qm_stop(struct hisi_qm *qm, enum qm_stop_reason r)
}
EXPORT_SYMBOL_GPL(hisi_qm_stop);
-static ssize_t qm_status_read(struct file *filp, char __user *buffer,
- size_t count, loff_t *pos)
-{
- struct hisi_qm *qm = filp->private_data;
- char buf[QM_DBG_READ_LEN];
- int val, len;
-
- val = atomic_read(&qm->status.flags);
- len = scnprintf(buf, QM_DBG_READ_LEN, "%s\n", qm_s[val]);
-
- return simple_read_from_buffer(buffer, count, pos, buf, len);
-}
-
-static const struct file_operations qm_status_fops = {
- .owner = THIS_MODULE,
- .open = simple_open,
- .read = qm_status_read,
-};
-
-static int qm_debugfs_atomic64_set(void *data, u64 val)
-{
- if (val)
- return -EINVAL;
-
- atomic64_set((atomic64_t *)data, 0);
-
- return 0;
-}
-
-static int qm_debugfs_atomic64_get(void *data, u64 *val)
-{
- *val = atomic64_read((atomic64_t *)data);
-
- return 0;
-}
-
-DEFINE_DEBUGFS_ATTRIBUTE(qm_atomic64_ops, qm_debugfs_atomic64_get,
- qm_debugfs_atomic64_set, "%llu\n");
-
static void qm_hw_error_init(struct hisi_qm *qm)
{
if (!qm->ops->hw_error_init) {
@@ -4750,7 +3686,7 @@ static const struct file_operations qm_algqos_fops = {
*
* Create function qos debugfs files, VF ping PF to get function qos.
*/
-static void hisi_qm_set_algqos_init(struct hisi_qm *qm)
+void hisi_qm_set_algqos_init(struct hisi_qm *qm)
{
if (qm->fun_type == QM_HW_PF)
debugfs_create_file("alg_qos", 0644, qm->debug.debug_root,
@@ -4760,88 +3696,6 @@ static void hisi_qm_set_algqos_init(struct hisi_qm *qm)
qm, &qm_algqos_fops);
}
-/**
- * hisi_qm_debug_init() - Initialize qm related debugfs files.
- * @qm: The qm for which we want to add debugfs files.
- *
- * Create qm related debugfs files.
- */
-void hisi_qm_debug_init(struct hisi_qm *qm)
-{
- struct dfx_diff_registers *qm_regs = qm->debug.qm_diff_regs;
- struct qm_dfx *dfx = &qm->debug.dfx;
- struct dentry *qm_d;
- void *data;
- int i;
-
- qm_d = debugfs_create_dir("qm", qm->debug.debug_root);
- qm->debug.qm_d = qm_d;
-
- /* only show this in PF */
- if (qm->fun_type == QM_HW_PF) {
- qm_create_debugfs_file(qm, qm->debug.debug_root, CURRENT_QM);
- for (i = CURRENT_Q; i < DEBUG_FILE_NUM; i++)
- qm_create_debugfs_file(qm, qm->debug.qm_d, i);
- }
-
- if (qm_regs)
- debugfs_create_file("diff_regs", 0444, qm->debug.qm_d,
- qm, &qm_diff_regs_fops);
-
- debugfs_create_file("regs", 0444, qm->debug.qm_d, qm, &qm_regs_fops);
-
- debugfs_create_file("cmd", 0600, qm->debug.qm_d, qm, &qm_cmd_fops);
-
- debugfs_create_file("status", 0444, qm->debug.qm_d, qm,
- &qm_status_fops);
- for (i = 0; i < ARRAY_SIZE(qm_dfx_files); i++) {
- data = (atomic64_t *)((uintptr_t)dfx + qm_dfx_files[i].offset);
- debugfs_create_file(qm_dfx_files[i].name,
- 0644,
- qm_d,
- data,
- &qm_atomic64_ops);
- }
-
- if (test_bit(QM_SUPPORT_FUNC_QOS, &qm->caps))
- hisi_qm_set_algqos_init(qm);
-}
-EXPORT_SYMBOL_GPL(hisi_qm_debug_init);
-
-/**
- * hisi_qm_debug_regs_clear() - clear qm debug related registers.
- * @qm: The qm for which we want to clear its debug registers.
- */
-void hisi_qm_debug_regs_clear(struct hisi_qm *qm)
-{
- const struct debugfs_reg32 *regs;
- int i;
-
- /* clear current_qm */
- writel(0x0, qm->io_base + QM_DFX_MB_CNT_VF);
- writel(0x0, qm->io_base + QM_DFX_DB_CNT_VF);
-
- /* clear current_q */
- writel(0x0, qm->io_base + QM_DFX_SQE_CNT_VF_SQN);
- writel(0x0, qm->io_base + QM_DFX_CQE_CNT_VF_CQN);
-
- /*
- * these registers are reading and clearing, so clear them after
- * reading them.
- */
- writel(0x1, qm->io_base + QM_DFX_CNT_CLR_CE);
-
- regs = qm_dfx_regs;
- for (i = 0; i < CNT_CYC_REGS_NUM; i++) {
- readl(qm->io_base + regs->offset);
- regs++;
- }
-
- /* clear clear_enable */
- writel(0x0, qm->io_base + QM_DFX_CNT_CLR_CE);
-}
-EXPORT_SYMBOL_GPL(hisi_qm_debug_regs_clear);
-
static void hisi_qm_init_vf_qos(struct hisi_qm *qm, int total_func)
{
int i;
@@ -5480,24 +4334,6 @@ static int qm_controller_reset_done(struct hisi_qm *qm)
return 0;
}
-static void qm_show_last_dfx_regs(struct hisi_qm *qm)
-{
- struct qm_debug *debug = &qm->debug;
- struct pci_dev *pdev = qm->pdev;
- u32 val;
- int i;
-
- if (qm->fun_type == QM_HW_VF || !debug->qm_last_words)
- return;
-
- for (i = 0; i < ARRAY_SIZE(qm_dfx_regs); i++) {
- val = readl_relaxed(qm->io_base + qm_dfx_regs[i].offset);
- if (debug->qm_last_words[i] != val)
- pci_info(pdev, "%s \t= 0x%08x => 0x%08x\n",
- qm_dfx_regs[i].name, debug->qm_last_words[i], val);
- }
-}
-
static int qm_controller_reset(struct hisi_qm *qm)
{
struct pci_dev *pdev = qm->pdev;
@@ -5513,7 +4349,7 @@ static int qm_controller_reset(struct hisi_qm *qm)
return ret;
}
- qm_show_last_dfx_regs(qm);
+ hisi_qm_show_last_dfx_regs(qm);
if (qm->err_ini->show_last_dfx_regs)
qm->err_ini->show_last_dfx_regs(qm);
diff --git a/drivers/crypto/hisilicon/qm_common.h b/drivers/crypto/hisilicon/qm_common.h
new file mode 100644
index 0000000000000..1406a422d4551
--- /dev/null
+++ b/drivers/crypto/hisilicon/qm_common.h
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (c) 2022 HiSilicon Limited. */
+#ifndef QM_COMMON_H
+#define QM_COMMON_H
+
+#define QM_DBG_READ_LEN 256
+#define QM_RESETTING 2
+
+struct qm_cqe {
+ __le32 rsvd0;
+ __le16 cmd_id;
+ __le16 rsvd1;
+ __le16 sq_head;
+ __le16 sq_num;
+ __le16 rsvd2;
+ __le16 w7;
+};
+
+struct qm_eqe {
+ __le32 dw0;
+};
+
+struct qm_aeqe {
+ __le32 dw0;
+};
+
+struct qm_sqc {
+ __le16 head;
+ __le16 tail;
+ __le32 base_l;
+ __le32 base_h;
+ __le32 dw3;
+ __le16 w8;
+ __le16 rsvd0;
+ __le16 pasid;
+ __le16 w11;
+ __le16 cq_num;
+ __le16 w13;
+ __le32 rsvd1;
+};
+
+struct qm_cqc {
+ __le16 head;
+ __le16 tail;
+ __le32 base_l;
+ __le32 base_h;
+ __le32 dw3;
+ __le16 w8;
+ __le16 rsvd0;
+ __le16 pasid;
+ __le16 w11;
+ __le32 dw6;
+ __le32 rsvd1;
+};
+
+struct qm_eqc {
+ __le16 head;
+ __le16 tail;
+ __le32 base_l;
+ __le32 base_h;
+ __le32 dw3;
+ __le32 rsvd[2];
+ __le32 dw6;
+};
+
+struct qm_aeqc {
+ __le16 head;
+ __le16 tail;
+ __le32 base_l;
+ __le32 base_h;
+ __le32 dw3;
+ __le32 rsvd[2];
+ __le32 dw6;
+};
+
+static const char * const qm_s[] = {
+ "init", "start", "close", "stop",
+};
+
+void *hisi_qm_ctx_alloc(struct hisi_qm *qm, size_t ctx_size,
+ dma_addr_t *dma_addr);
+void hisi_qm_ctx_free(struct hisi_qm *qm, size_t ctx_size,
+ const void *ctx_addr, dma_addr_t *dma_addr);
+void hisi_qm_show_last_dfx_regs(struct hisi_qm *qm);
+void hisi_qm_set_algqos_init(struct hisi_qm *qm);
+
+#endif
--
2.42.0
next prev parent reply other threads:[~2023-11-15 19:57 UTC|newest]
Thread overview: 388+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-15 19:21 [PATCH 6.1 000/379] 6.1.63-rc1 review Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 001/379] hwmon: (nct6775) Fix incorrect variable reuse in fan_div calculation Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 002/379] sched/fair: Fix cfs_rq_is_decayed() on !SMP Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 003/379] iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 004/379] sched/uclamp: Set max_spare_cap_cpu even if max_spare_cap is 0 Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 005/379] sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0 Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 006/379] objtool: Propagate early errors Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 007/379] sched: Fix stop_one_cpu_nowait() vs hotplug Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 008/379] vfs: fix readahead(2) on block devices Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 009/379] writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 010/379] x86/srso: Fix SBPB enablement for (possible) future fixed HW Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 011/379] futex: Dont include process MM in futex key on no-MMU Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 012/379] x86/numa: Introduce numa_fill_memblks() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 013/379] ACPI/NUMA: Apply SRAT proximity domain to entire CFMWS window Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 014/379] x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 015/379] x86/boot: Fix incorrect startup_gdt_descr.size Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 016/379] drivers/clocksource/timer-ti-dm: Dont call clk_get_rate() in stop function Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 017/379] pstore/platform: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 018/379] string: Adjust strtomem() logic to allow for smaller sources Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 019/379] genirq/matrix: Exclude managed interrupts in irq_matrix_allocated() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 020/379] wifi: cfg80211: add flush functions for wiphy work Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 021/379] wifi: mac80211: move radar detect work to " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 022/379] wifi: mac80211: move scan " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 023/379] wifi: mac80211: move offchannel works " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 024/379] wifi: mac80211: move sched-scan stop work " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 025/379] wifi: mac80211: fix # of MSDU in A-MSDU calculation Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 026/379] wifi: iwlwifi: honor the enable_ini value Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 027/379] i40e: fix potential memory leaks in i40e_remove() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 028/379] iavf: Fix promiscuous mode configuration flow messages Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 029/379] selftests/bpf: Correct map_fd to data_fd in tailcalls Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 030/379] wifi: iwlwifi: Use FW rate for non-data frames Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 031/379] udp: add missing WRITE_ONCE() around up->encap_rcv Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 032/379] tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 033/379] gve: Use size_add() in call to struct_size() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 034/379] mlxsw: Use size_mul() " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 035/379] tls: Only use data field in crypto completion function Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 036/379] tls: Use size_add() in call to struct_size() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 037/379] tipc: Use size_add() in calls " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 038/379] net: spider_net: Use size_add() in call " Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 039/379] net: ethernet: mtk_wed: fix EXT_INT_STATUS_RX_FBUF definitions for MT7986 SoC Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 040/379] wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file() Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 041/379] wifi: ath11k: fix boot failure with one MSI vector Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 042/379] wifi: mt76: mt7603: rework/fix rx pse hang check Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 043/379] wifi: mt76: mt7603: improve watchdog reset reliablity Greg Kroah-Hartman
2023-11-15 19:21 ` [PATCH 6.1 044/379] wifi: mt76: mt7603: improve stuck beacon handling Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 045/379] wifi: mt76: mt7915: fix beamforming availability check Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 046/379] wifi: ath: dfs_pattern_detector: Fix a memory initialization issue Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 047/379] tcp_metrics: add missing barriers on delete Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 048/379] tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 049/379] tcp_metrics: do not create an entry from tcp_init_metrics() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 050/379] wifi: rtlwifi: fix EDCA limit set by BT coexistence Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 051/379] ACPI: property: Allow _DSD buffer data only for byte accessors Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 052/379] =?UTF-8?q?ACPI:=20video:=20Add=20acpi=5Fbacklight=3Dvendor=20quir?= =?UTF-8?q?k=20for=20Toshiba=20Port=C3=A9g=C3=A9=20R100?= Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 053/379] wifi: ath11k: fix Tx power value during active CAC Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 054/379] can: dev: can_restart(): dont crash kernel if carrier is OK Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 055/379] can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 056/379] can: dev: can_put_echo_skb(): dont crash kernel if can_priv::echo_skb is accessed out of bounds Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 057/379] PM / devfreq: rockchip-dfi: Make pmu regmap mandatory Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 058/379] wifi: wfx: fix case where rates are out of order Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 059/379] netfilter: nf_tables: Drop pointless memset when dumping rules Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 060/379] thermal: core: prevent potential string overflow Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 061/379] r8169: use tp_to_dev instead of open code Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 062/379] r8169: fix rare issue with broken rx after link-down on RTL8125 Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 063/379] selftests: netfilter: test for sctp collision processing in nf_conntrack Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 064/379] net: skb_find_text: Ignore patterns extending past to Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 065/379] chtls: fix tp->rcv_tstamp initialization Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 066/379] tcp: fix cookie_init_timestamp() overflows Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 067/379] wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 068/379] wifi: iwlwifi: pcie: synchronize IRQs before NAPI Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 069/379] wifi: iwlwifi: empty overflow queue during flush Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 070/379] Bluetooth: hci_sync: Fix Opcode prints in bt_dev_dbg/err Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 071/379] bpf: Fix unnecessary -EBUSY from htab_lock_bucket Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 072/379] ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 073/379] ipv6: avoid atomic fragment on GSO packets Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 074/379] net: add DEV_STATS_READ() helper Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 075/379] ipvlan: properly track tx_errors Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 076/379] regmap: debugfs: Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 077/379] spi: tegra: Fix missing IRQ check in tegra_slink_probe() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 078/379] clk: qcom: gcc-msm8996: Remove RPM bus clocks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 079/379] clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 080/379] clk: qcom: mmcc-msm8998: Dont check halt bit on some branch clks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 081/379] clk: qcom: mmcc-msm8998: Fix the SMMU GDSC Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 082/379] clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 083/379] regulator: mt6358: Fail probe on unknown chip ID Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 084/379] clk: imx: Select MXC_CLK for CLK_IMX8QXP Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 085/379] clk: imx: imx8mq: correct error handling path Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 086/379] clk: imx: imx8qxp: Fix elcdif_pll clock Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 087/379] clk: renesas: rcar-gen3: Extend SDnH divider table Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 088/379] clk: renesas: rzg2l: Wait for status bit of SD mux before continuing Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 089/379] clk: renesas: rzg2l: Lock around writes to mux register Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 090/379] clk: renesas: rzg2l: Trust value returned by hardware Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 091/379] clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 092/379] clk: renesas: rzg2l: Fix computation formula Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 093/379] clk: linux/clk-provider.h: fix kernel-doc warnings and typos Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 094/379] spi: nxp-fspi: use the correct ioremap function Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 095/379] clk: keystone: pll: fix a couple NULL vs IS_ERR() checks Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 096/379] clk: ti: change ti_clk_register[_omap_hw]() API Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 097/379] clk: ti: fix double free in of_ti_divider_clk_setup() Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 098/379] clk: npcm7xx: Fix incorrect kfree Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 099/379] clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 100/379] clk: mediatek: clk-mt6779: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 101/379] clk: mediatek: clk-mt6797: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 102/379] clk: mediatek: clk-mt7629-eth: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 103/379] clk: mediatek: clk-mt7629: " Greg Kroah-Hartman
2023-11-15 19:22 ` [PATCH 6.1 104/379] clk: mediatek: clk-mt2701: " Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 105/379] clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 106/379] platform/x86: wmi: Fix probe failure when failing to register WMI devices Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 107/379] platform/x86: wmi: Fix opening of char device Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 108/379] hwmon: (axi-fan-control) Fix possible NULL pointer dereference Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 109/379] hwmon: (coretemp) Fix potentially truncated sysfs attribute name Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 110/379] Revert "hwmon: (sch56xx-common) Add DMI override table" Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 111/379] Revert "hwmon: (sch56xx-common) Add automatic module loading on supported devices" Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 112/379] hwmon: (sch5627) Use bit macros when accessing the control register Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 113/379] hwmon: (sch5627) Disallow write access if virtual registers are locked Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 114/379] hte: tegra: Fix missing error code in tegra_hte_test_probe() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 115/379] drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 116/379] drm/rockchip: vop: Fix call to crtc reset helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 117/379] drm/rockchip: vop2: Dont crash for invalid duplicate_state Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 118/379] drm/rockchip: vop2: Add missing call to crtc reset helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 119/379] drm/radeon: possible buffer overflow Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 120/379] drm: bridge: it66121: Fix invalid connector dereference Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 121/379] drm/bridge: lt8912b: Add hot plug detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 122/379] drm/bridge: lt8912b: Fix bridge_detach Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 123/379] drm/bridge: lt8912b: Fix crash on bridge detach Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 124/379] drm/bridge: lt8912b: Manually disable HPD only if it was enabled Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 125/379] drm/bridge: lt8912b: Add missing drm_bridge_attach call Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 126/379] drm/bridge: tc358768: Fix use of uninitialized variable Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 127/379] drm/bridge: tc358768: Fix bit updates Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 128/379] drm/bridge: tc358768: remove unused variable Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 129/379] drm/bridge: tc358768: Use struct videomode Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 130/379] drm/bridge: tc358768: Print logical values, not raw register values Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 131/379] drm/bridge: tc358768: Use dev for dbg prints, not priv->dev Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 132/379] drm/bridge: tc358768: Rename dsibclk to hsbyteclk Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 133/379] drm/bridge: tc358768: Clean up clock period code Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 134/379] drm/bridge: tc358768: Fix tc358768_ns_to_cnt() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 135/379] drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 136/379] drm/amd/display: Check all enabled planes in dm_check_crtc_cursor Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 137/379] drm/amd/display: Refactor dm_get_plane_scale helper Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 138/379] drm/amd/display: Bail from dm_check_crtc_cursor if no relevant change Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 139/379] io_uring/kbuf: Fix check of BID wrapping in provided buffers Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 140/379] io_uring/kbuf: Allow the full buffer id space for " Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 141/379] drm/mediatek: Fix iommu fault by swapping FBs after updating plane state Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 142/379] drm/mediatek: Fix iommu fault during crtc enabling Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 143/379] drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 144/379] gpu: host1x: Correct allocated size for contexts Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 145/379] drm/bridge: lt9611uxc: fix the race in the error path Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 146/379] arm64/arm: xen: enlighten: Fix KPTI checks Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 147/379] drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 148/379] xenbus: fix error exit in xenbus_init() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 149/379] xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 150/379] drm/msm/dsi: use msm_gem_kernel_put to free TX buffer Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 151/379] drm/msm/dsi: free TX buffer in unbind Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 152/379] clocksource/drivers/arm_arch_timer: limit XGene-1 workaround Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 153/379] drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 154/379] drivers/perf: hisi: use cpuhp_state_remove_instance_nocalls() for hisi_hns3_pmu uninit process Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 155/379] perf/arm-cmn: Revamp model detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 156/379] perf/arm-cmn: Fix DTC domain detection Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 157/379] drivers/perf: hisi_pcie: Check the type first in pmu::event_init() Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 158/379] perf: hisi: Fix use-after-free when register pmu fails Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 159/379] ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 160/379] arm64: dts: qcom: sdm845: cheza doesnt support LMh node Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 161/379] arm64: dts: qcom: sc7280: link usb3_phy_wrapper_gcc_usb30_pipe_clk Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 162/379] arm64: dts: qcom: msm8916: Fix iommu local address range Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 163/379] arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory Greg Kroah-Hartman
2023-11-15 19:23 ` [PATCH 6.1 164/379] arm64: dts: qcom: sc7280: Add missing LMH interrupts Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 165/379] arm64: dts: qcom: sm8150: add ref clock to PCIe PHYs Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 166/379] arm64: dts: qcom: sm8350: fix pinctrl for UART18 Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 167/379] arm64: dts: qcom: sdm845-mtp: fix WiFi configuration Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 168/379] ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 169/379] arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 170/379] ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 171/379] soc: qcom: llcc: Handle a second device without data corruption Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 172/379] kunit: Fix missed memory release in kunit_free_suite_set() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 173/379] firmware: ti_sci: Mark driver as non removable Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 174/379] arm64: dts: ti: k3-am62a7-sk: Drop i2c-1 to 100Khz Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 175/379] firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 176/379] firmware: arm_ffa: Allow the FF-A drivers to use 32bit mode of messaging Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 177/379] ARM: dts: am3517-evm: Fix LED3/4 pinmux Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 178/379] clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 179/379] arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 180/379] arm64: dts: imx8mm: Add sound-dai-cells to micfil node Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 181/379] arm64: dts: imx8mn: " Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 182/379] arm64: tegra: Use correct interrupts for Tegra234 TKE Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 183/379] selftests/pidfd: Fix ksft print formats Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 184/379] selftests/resctrl: Ensure the benchmark commands fits to its array Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 185/379] module/decompress: use vmalloc() for gzip decompression workspace Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 186/379] ASoC: cs35l41: Verify PM runtime resume errors in IRQ handler Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 187/379] ASoC: cs35l41: Undo runtime PM changes at driver exit time Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 188/379] ALSA: hda: cs35l41: Fix unbalanced pm_runtime_get() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 189/379] ALSA: hda: cs35l41: Undo runtime PM changes at driver exit time Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 190/379] KEYS: Include linux/errno.h in linux/verification.h Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 191/379] crypto: hisilicon/hpre - Fix a erroneous check after snprintf() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 192/379] hwrng: bcm2835 - Fix hwrng throughput regression Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 193/379] hwrng: geode - fix accessing registers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 194/379] RDMA/core: Use size_{add,sub,mul}() in calls to struct_size() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 195/379] crypto: qat - ignore subsequent state up commands Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 196/379] crypto: qat - relocate bufferlist logic Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 197/379] crypto: qat - rename bufferlist functions Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 198/379] crypto: qat - change bufferlist logic interface Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 199/379] crypto: qat - generalize crypto request buffers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 200/379] crypto: qat - extend buffer list interface Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 201/379] crypto: qat - fix unregistration of crypto algorithms Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 202/379] scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 203/379] libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 204/379] nd_btt: Make BTT lanes preemptible Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 205/379] crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 206/379] crypto: caam/jr " Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 207/379] crypto: qat - increase size of buffers Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 208/379] PCI: vmd: Correct PCI Header Type Registers multi-function check Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 209/379] hid: cp2112: Fix duplicate workqueue initialization Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 210/379] crypto: hisilicon/qm - delete redundant null assignment operations Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 211/379] crypto: hisilicon/qm - modify the process of regs dfx Greg Kroah-Hartman
2023-11-15 19:24 ` Greg Kroah-Hartman [this message]
2023-11-15 19:24 ` [PATCH 6.1 213/379] crypto: hisilicon/qm - fix PF queue parameter issue Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 214/379] ARM: 9321/1: memset: cast the constant byte to unsigned char Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 215/379] ext4: move ix sanity check to corrent position Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 216/379] ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 217/379] IB/mlx5: Fix rdma counter binding for RAW QP Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 218/379] RDMA/hns: Fix printing level of asynchronous events Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 219/379] RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common() Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 220/379] RDMA/hns: Fix signed-unsigned mixed comparisons Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 221/379] RDMA/hns: Add check for SL Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 222/379] RDMA/hns: The UD mode can only be configured with DCQCN Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 223/379] ASoC: SOF: core: Ensure sof_ops_free() is still called when probe never ran Greg Kroah-Hartman
2023-11-15 19:24 ` [PATCH 6.1 224/379] ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 225/379] scsi: ufs: core: Leave space for \0 in utf8 desc string Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 226/379] RDMA/hfi1: Workaround truncation compilation error Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 227/379] HID: cp2112: Make irq_chip immutable Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 228/379] hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 229/379] sh: bios: Revive earlyprintk support Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 230/379] Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures" Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 231/379] HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 232/379] HID: logitech-hidpp: Dont restart IO, instead defer hid_connect() only Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 233/379] HID: logitech-hidpp: Revert "Dont restart communication if not necessary" Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 234/379] HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 235/379] ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 236/379] padata: Fix refcnt handling in padata_free_shell() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 237/379] crypto: qat - fix deadlock in backlog processing Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 238/379] ASoC: ams-delta.c: use component after check Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 239/379] IB/mlx5: Fix init stage error handling to avoid double free of same QP and UAF Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 240/379] mfd: core: Un-constify mfd_cell.of_reg Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 241/379] mfd: core: Ensure disabled devices are skipped without aborting Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 242/379] mfd: dln2: Fix double put in dln2_probe Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 243/379] dt-bindings: mfd: mt6397: Add binding for MT6357 Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 244/379] dt-bindings: mfd: mt6397: Split out compatible for MediaTek MT6366 PMIC Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 245/379] mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 246/379] leds: turris-omnia: Drop unnecessary mutex locking Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 247/379] leds: turris-omnia: Do not use SMBUS calls Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 248/379] leds: pwm: Dont disable the PWM when the LED should be off Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 249/379] leds: trigger: ledtrig-cpu:: Fix output may be truncated issue for cpu Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 250/379] kunit: add macro to allow conditionally exposing static symbols to tests Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 251/379] apparmor: test: make static symbols visible during kunit testing Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 252/379] apparmor: fix invalid reference on profile->disconnected Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 253/379] perf stat: Fix aggr mode initialization Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 254/379] iio: frequency: adf4350: Use device managed functions and fix power down issue Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 255/379] perf kwork: Fix incorrect and missing free atom in work_push_atom() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 256/379] perf kwork: Add the supported subcommands to the document Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 257/379] perf kwork: Set ordered_events to true in struct perf_tool Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 258/379] filemap: add filemap_get_folios_tag() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 259/379] f2fs: convert f2fs_write_cache_pages() to use filemap_get_folios_tag() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 260/379] f2fs: compress: fix deadloop in f2fs_write_cache_pages() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 261/379] f2fs: compress: fix to avoid use-after-free on dic Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 262/379] f2fs: compress: fix to avoid redundant compress extension Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 263/379] tty: tty_jobctrl: fix pid memleak in disassociate_ctty() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 264/379] livepatch: Fix missing newline character in klp_resolve_symbols() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 265/379] pinctrl: renesas: rzg2l: Make reverse order of enable() for disable() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 266/379] perf record: Fix BTF type checks in the off-cpu profiling Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 267/379] dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 268/379] usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 269/379] usb: chipidea: Fix DMA overwrite for Tegra Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 270/379] usb: chipidea: Simplify Tegra DMA alignment code Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 271/379] dmaengine: ti: edma: handle irq_of_parse_and_map() errors Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 272/379] misc: st_core: Do not call kfree_skb() under spin_lock_irqsave() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 273/379] tools: iio: iio_generic_buffer ensure alignment Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 274/379] USB: usbip: fix stub_dev hub disconnect Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 275/379] dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 276/379] f2fs: fix to initialize map.m_pblk in f2fs_precache_extents() Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 277/379] interconnect: qcom: sc7180: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 278/379] interconnect: qcom: sc7180: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 279/379] interconnect: qcom: sc7280: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 280/379] interconnect: qcom: sc8180x: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 281/379] interconnect: qcom: sc8280xp: " Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 282/379] interconnect: qcom: sdm845: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 283/379] interconnect: qcom: sdm845: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:25 ` [PATCH 6.1 284/379] interconnect: qcom: sm6350: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 285/379] interconnect: qcom: sm6350: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 286/379] interconnect: move ignore_list out of of_count_icc_providers() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 287/379] interconnect: qcom: sm8150: Drop IP0 interconnects Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 288/379] interconnect: qcom: sm8150: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 289/379] interconnect: qcom: sm8150: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 290/379] interconnect: qcom: sm8350: Retire DEFINE_QBCM Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 291/379] interconnect: qcom: sm8350: Set ACV enable_mask Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 292/379] powerpc: Only define __parse_fpscr() when required Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 293/379] modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 294/379] modpost: fix ishtp " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 295/379] powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 296/379] powerpc/xive: Fix endian conversion size Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 297/379] powerpc/vas: Limit open window failure messages in log bufffer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 298/379] powerpc/imc-pmu: Use the correct spinlock initializer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 299/379] powerpc/pseries: fix potential memory leak in init_cpu_associativity() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 300/379] xhci: Loosen RPM as default policy to cover for AMD xHC 1.1 Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 301/379] usb: host: xhci-plat: fix possible kernel oops while resuming Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 302/379] perf machine: Avoid out of bounds LBR memory read Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 303/379] perf hist: Add missing puts to hist__account_cycles Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 304/379] 9p/net: fix possible memory leak in p9_check_errors() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 305/379] i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 306/379] cxl/mem: Fix shutdown order Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 307/379] crypto: ccp - Name -1 return value as SEV_RET_NO_FW_CALL Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 308/379] x86/sev: Change snp_guest_issue_request()s fw_err argument Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 309/379] virt: sevguest: Fix passing a stack buffer as a scatterlist target Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 310/379] rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 311/379] pcmcia: cs: fix possible hung task and memory leak pccardd() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 312/379] pcmcia: ds: fix refcount leak in pcmcia_device_add() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 313/379] pcmcia: ds: fix possible name leak in error path " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 314/379] media: hantro: Check whether reset op is defined before use Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 315/379] media: verisilicon: Do not enable G2 postproc downscale if source is narrower than destination Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 316/379] media: ov5640: Drop dead code using frame_interval Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 317/379] media: ov5640: fix vblank unchange issue when work at dvp mode Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 318/379] media: i2c: max9286: Fix some redundant of_node_put() calls Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 319/379] media: ov5640: Fix a memory leak when ov5640_probe fails Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 320/379] media: bttv: fix use after free error due to btv->timeout timer Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 321/379] media: amphion: handle firmware debug message Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 322/379] media: mtk-jpegenc: Fix bug in JPEG encode quality selection Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 323/379] media: s3c-camif: Avoid inappropriate kfree() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 324/379] media: vidtv: psi: Add check for kstrdup Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 325/379] media: vidtv: mux: Add check and kfree " Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 326/379] media: cedrus: Fix clock/reset sequence Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 327/379] media: cadence: csi2rx: Unregister v4l2 async notifier Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 328/379] media: dvb-usb-v2: af9035: fix missing unlock Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 329/379] media: cec: meson: always include meson sub-directory in Makefile Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 330/379] regmap: prevent noinc writes from clobbering cache Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 331/379] pwm: sti: Reduce number of allocations and drop usage of chip_data Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 332/379] pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 333/379] Input: synaptics-rmi4 - fix use after free in rmi_unregister_function() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 334/379] watchdog: ixp4xx: Make sure restart always works Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 335/379] llc: verify mac len before reading mac header Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 336/379] hsr: Prevent use after free in prp_create_tagged_frame() Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 337/379] tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 338/379] bpf: Check map->usercnt after timer->timer is assigned Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 339/379] inet: shrink struct flowi_common Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 340/379] octeontx2-pf: Fix error codes Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 341/379] octeontx2-pf: Fix holes in error code Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 342/379] net: page_pool: add missing free_percpu when page_pool_init fail Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 343/379] dccp: Call security_inet_conn_request() after setting IPv4 addresses Greg Kroah-Hartman
2023-11-15 19:26 ` [PATCH 6.1 344/379] dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 345/379] net: r8169: Disable multicast filter for RTL8168H and RTL8107E Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 346/379] Fix termination state for idr_for_each_entry_ul() Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 347/379] net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 348/379] selftests: pmtu.sh: fix result checking Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 349/379] octeontx2-pf: Rename tot_tx_queues to non_qos_queues Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 350/379] octeontx2-pf: qos send queues management Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 351/379] octeontx2-pf: Free pending and dropped SQEs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 352/379] net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 353/379] net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 354/379] net/smc: put sk reference if close work was canceled Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 355/379] nvme: fix error-handling for io_uring nvme-passthrough Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 356/379] tg3: power down device only on SYSTEM_POWER_OFF Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 357/379] nbd: fix uaf in nbd_open Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 358/379] blk-core: use pr_warn_ratelimited() in bio_check_ro() Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 359/379] virtio/vsock: replace virtio_vsock_pkt with sk_buff Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 360/379] vsock/virtio: remove socket from connected/bound list on shutdown Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 361/379] r8169: respect userspace disabling IFF_MULTICAST Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 362/379] i2c: iproc: handle invalid slave state Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 363/379] netfilter: xt_recent: fix (increase) ipv6 literal buffer length Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 364/379] netfilter: nft_redir: use `struct nf_nat_range2` throughout and deduplicate eval call-backs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 365/379] netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 366/379] RISC-V: Dont fail in riscv_of_parent_hartid() for disabled HARTs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 367/379] drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 368/379] ASoC: mediatek: mt8186_mt6366_rt1019_rt5682s: trivial: fix error messages Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 369/379] ASoC: hdmi-codec: register hpd callback on component probe Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 370/379] ASoC: dapm: fix clock get name Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 371/379] spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 372/379] fbdev: imsttfb: Fix error path of imsttfb_probe() Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 373/379] fbdev: imsttfb: fix a resource leak in probe Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 374/379] fbdev: fsl-diu-fb: mark wr_reg_wa() static Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 375/379] tracing/kprobes: Fix the order of argument descriptions Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 376/379] io_uring/net: ensure socket is marked connected on connect retry Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 377/379] x86/amd_nb: Use Family 19h Models 60h-7Fh Function 4 IDs Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 378/379] Revert "mmc: core: Capture correct oemid-bits for eMMC cards" Greg Kroah-Hartman
2023-11-15 19:27 ` [PATCH 6.1 379/379] btrfs: use u64 for buffer sizes in the tree search ioctls Greg Kroah-Hartman
2023-11-15 22:31 ` [PATCH 6.1 000/379] 6.1.63-rc1 review SeongJae Park
2023-11-15 23:26 ` Florian Fainelli
2023-11-16 18:23 ` Naresh Kamboju
2023-11-16 23:43 ` Guenter Roeck
2023-11-17 9:14 ` Ron Economos
2023-11-17 17:01 ` Pavel Machek
2023-11-17 19:27 ` Allen Pais
2023-11-17 19:57 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231115192657.646943057@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=herbert@gondor.apana.org.au \
--cc=patches@lists.linux.dev \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
--cc=yekai13@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox