Commit 78061f84 authored by Jie Lei's avatar Jie Lei Committed by JangShui Yang
Browse files

hns3 udma: modifying the sge address offset in RC Mode.

driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8V1IQ


CVE: NA

--------------------------------------------------------

This patch is modify the extended sge address offset in RC mode.
Modify the number of jetty creations to the expected
maximum number.

Fixes: e94ccb1b ("hns3 udma: add register and unregister segment")
Signed-off-by: default avatarJinyong An <anjinyong@huawei.com>
Signed-off-by: default avatarJie Lei <leijie31@huawei.com>
Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
parent 85d27173
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@
enum {
	UDMA_MMAP_UAR_PAGE,
	UDMA_MMAP_DWQE_PAGE,
	UDMA_MMAP_DCA_PAGE,
	UDMA_MMAP_RESET_PAGE,
	UDMA_MMAP_TYPE_DCA
};
@@ -117,6 +116,7 @@ struct udma_create_tp_ucmd {
struct udma_create_jetty_ucmd {
	struct udma_create_tp_ucmd	create_tp_ucmd;
	uint32_t			jfr_id;
	uint32_t			srqn;
	uint64_t			buf_addr;
	uint64_t			sdb_addr;
};
@@ -139,8 +139,8 @@ struct udma_create_tp_resp {
	uint64_t		cap_flags;
	uint32_t		qpn;
	uint32_t		path_mtu;
	uint8_t			priority;
	struct udp_srcport	um_srcport;
	uint8_t			priority;
};

struct udma_create_jetty_resp {
+20 −9
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@
#include "hns3_udma_cmd.h"

static int debug_switch = 1;
static int cnt_mailbox = 1;

int udma_cmd_init(struct udma_dev *udma_dev)
{
	sema_init(&udma_dev->cmd.poll_sem, 1);
@@ -268,24 +270,30 @@ void udma_cmq_setup_basic_desc(struct udma_cmq_desc *desc,
static void dump_desc(struct udma_dev *dev,
		      struct udma_cmq_desc *desc)
{
	if (desc->opcode == UDMA_OPC_QUERY_MB_ST)
	static int num_mailbox;

	if (desc->opcode == UDMA_OPC_QUERY_MB_ST ||
	    desc->opcode == UDMA_OPC_CFG_GMV_BT)
		return;

	if (desc->opcode == UDMA_OPC_POST_MB && cnt_mailbox)
		++num_mailbox;

	if (((desc->data[SUB_OPCODE_IDX] & 0xFF) ==
	     UDMA_CMD_WRITE_QPC_TIMER_BT0) ||
	    ((desc->data[SUB_OPCODE_IDX] & 0xFF) ==
	     UDMA_CMD_WRITE_CQC_TIMER_BT0))
		dev_err_ratelimited(dev->dev,
			"Send cmd opcode:0x%4x, data: %08x %08x %08x %08x %08x %08x\n",
			desc->opcode, desc->data[0],
			desc->data[1], desc->data[2],
			desc->data[3], desc->data[4], desc->data[5]);
			"Send cmd opcode:0x%4x, data: %08x %08x %08x %08x %08x %08x, mlbox: %08x\n",
			desc->opcode, desc->data[0], desc->data[1],
			desc->data[2], desc->data[3], desc->data[4],
			desc->data[5], num_mailbox);
	else
		dev_info_ratelimited(dev->dev,
			"Send cmd opcode:0x%4x, data: %08x %08x %08x %08x %08x %08x\n",
			desc->opcode, desc->data[0],
			desc->data[1], desc->data[2],
			desc->data[3], desc->data[4], desc->data[5]);
			"Send cmd opcode:0x%4x, data: %08x %08x %08x %08x %08x %08x, mlbox: %08x\n",
			desc->opcode, desc->data[0], desc->data[1],
			desc->data[2], desc->data[3], desc->data[4],
			desc->data[5], num_mailbox);
}

static int __udma_cmq_send(struct udma_dev *dev, struct udma_cmq_desc *desc,
@@ -609,3 +617,6 @@ int udma_cmd_mbox(struct udma_dev *dev, struct udma_cmq_desc *desc,

module_param(debug_switch, int, 0444);
MODULE_PARM_DESC(debug_switch, "set debug print ON, default: 1");

module_param(cnt_mailbox, int, 0444);
MODULE_PARM_DESC(cnt_mailbox, "Count the number of mailbox, default: 1");
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#ifndef _UDMA_COMMON_H
#define _UDMA_COMMON_H
#include <linux/bitfield.h>
#include <linux/types.h>

#define ub_write(dev, reg, val)	writel((val), (dev)->reg_base + (reg))
#define ub_read(dev, reg)	readl((dev)->reg_base + (reg))
+3 −2
Original line number Diff line number Diff line
@@ -321,6 +321,7 @@ static uint32_t alloc_dca_num(struct udma_dca_ctx *ctx)

	stop_free_dca_buf(ctx, ret);
	update_dca_buf_status(ctx, ret, false);

	return ret;
}

@@ -548,8 +549,7 @@ static void udca_mem_aging_work(struct work_struct *work)
						aging_dwork.work);
	struct udma_ucontext *ucontext = container_of(ctx, struct udma_ucontext,
						      dca_ctx);
	struct udma_dev *udma_dev = container_of(ucontext->uctx.ub_dev,
						 struct udma_dev, ub_dev);
	struct udma_dev *udma_dev = to_udma_dev(ucontext->uctx.ub_dev);

	cancel_delayed_work(&ctx->aging_dwork);
	process_aging_dca_mem(udma_dev, ctx);
@@ -863,6 +863,7 @@ static uint32_t assign_dca_pages(struct udma_dca_ctx *ctx, uint32_t buf_id,
	attr.unit = unit;
	attr.max = count;
	travel_dca_pages(ctx, &attr, assign_dca_pages_proc);

	return attr.total;
}

+3 −4
Original line number Diff line number Diff line
@@ -42,7 +42,6 @@
#define UDMA_DCA_TAG_MASK GENMASK(28, 22)
#define UDMA_DCA_OWN_MASK GENMASK(21, 0)

#define UDMA_DCA_BUF_ID_TO_TAG(buf_id) (((buf_id) & UDMA_DCA_TAG_MASK) >> 22)
#define UDMA_DCA_BUF_ID_TO_QPN(buf_id) ((buf_id) & UDMA_DCA_OWN_MASK)
#define UDMA_DCA_TO_BUF_ID(qpn, tag) (((qpn) & UDMA_DCA_OWN_MASK) | \
				      (((tag) << 22) & UDMA_DCA_TAG_MASK))
@@ -56,7 +55,7 @@ struct dca_page_state {
};

struct dca_mem {
	uint32_t		flags;
	uint32_t		flags; /* dca mem usages status */
	struct list_head	list; /* link to mem list in dca context */
	spinlock_t		lock; /* protect the @flags and @list */
	uint32_t		page_count; /* page count in this mem obj */
@@ -214,4 +213,4 @@ void udma_unregister_udca(struct udma_dev *udma_dev,

void udma_enum_dca_pool(struct udma_dca_ctx *dca_ctx, void *param,
			udma_dca_enum_callback cb);
#endif
#endif /* _UDMA_DCA_H */
Loading