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

hns3 udma: Modify qpn alloc function when share jfr is disabled.

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


CVE: NA

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

This patch fixes the following problems:
1、Adaptation of the chip logic.
2、Modify the process of querying JFR context in DFX.
3、Modify qpn alloc function when share jfr is disabled.
4、Change the number of Jetty creation times to the maximum.

Fixes: 6c461811 ("hns3 udma: modify the process of create qp")
Signed-off-by: default avatarQi Xu <xuqi54@hisilicon.com>
Signed-off-by: default avatarJie Lei <leijie31@huawei.com>
Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
parent f0cb6285
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ struct udma_create_jfr_ucmd {
	uint32_t sqe_shift;
	uint32_t sge_cnt;
	uint32_t sge_shift;
	bool     share_jfr;
};

enum udma_jfr_cap_flags {
+1 −1
Original line number Diff line number Diff line
@@ -254,7 +254,7 @@ static void init_dca_ctx_debugfs(struct udma_dca_ctx_debugfs *dbgfs,
	if (IS_ERR_OR_NULL(parent))
		return;

	snprintf(name, DCA_CTX_PID_LEN, "%d", current->pid);
	snprintf(name, DCA_CTX_PID_LEN, "%u", current->pid);
	dbgfs->root = debugfs_create_dir(name, parent);
	if (IS_ERR_OR_NULL(dbgfs->root))
		return;
+4 −3
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@
/* The minimum page size is 4K for hardware */
#define UDMA_HW_PAGE_SHIFT			12
#define UDMA_PAGE_SIZE				(1 << UDMA_HW_PAGE_SHIFT)
#define udma_hw_page_align(x)		ALIGN(x, 1 << UDMA_HW_PAGE_SHIFT)
#define UDMA_HW_PAGE_ALIGN(x)		ALIGN(x, 1 << UDMA_HW_PAGE_SHIFT)

#define UDMA_DWQE_SIZE				65536

@@ -862,6 +862,7 @@ struct udma_dev {
	struct udma_dev_debugfs		*dbgfs;
	uint64_t			notify_addr;
	bool				rm_support;
	struct udma_bank		bank[UDMA_QP_BANK_NUM];
};

struct udma_seg {
@@ -922,7 +923,7 @@ static inline struct udma_seg *to_udma_seg(struct ubcore_target_seg *seg)
static inline uint32_t to_udma_hem_entries_size(uint32_t count,
						uint32_t buf_shift)
{
	return udma_hw_page_align(count << buf_shift);
	return UDMA_HW_PAGE_ALIGN(count << buf_shift);
}

static inline uint32_t to_udma_hw_page_shift(uint32_t page_shift)
@@ -933,7 +934,7 @@ static inline uint32_t to_udma_hw_page_shift(uint32_t page_shift)
static inline uint32_t to_udma_hem_entries_count(uint32_t count,
						 uint32_t buf_shift)
{
	return udma_hw_page_align(count << buf_shift) >> buf_shift;
	return UDMA_HW_PAGE_ALIGN(count << buf_shift) >> buf_shift;
}

static inline uint32_t to_udma_hem_entries_shift(uint32_t count,
+51 −22
Original line number Diff line number Diff line
@@ -243,12 +243,16 @@ static int udma_dfx_jfr_store(const char *p_buf, struct udma_dfx_info *udma_dfx)
	struct udma_dev *udma_dev = (struct udma_dev *)udma_dfx->priv;
	struct udma_jfr_context jfr_context;
	char str[UDMA_DFX_STR_LEN_MAX];
	struct jfr_list *jfr_now;
	bool flag = false;
	uint32_t jfrn;
	uint32_t srqn;
	int ret;
	int i;

	ret = udma_dfx_read_buf(str, p_buf);
	if (ret) {
		dev_info(udma_dev->dev, "the inputing is invalid\n");
		dev_info(udma_dev->dev, "the inputing is invalid.\n");
		return ret;
	}

@@ -257,10 +261,29 @@ static int udma_dfx_jfr_store(const char *p_buf, struct udma_dfx_info *udma_dfx)
		return -EINVAL;
	}

	ret = udma_dfx_query_context(udma_dev, jfrn, &jfr_context,
	ret = udma_find_dfx_dev(udma_dev, &i);
	if (ret)
		return ret;

	list_for_each_entry(jfr_now,
			    &g_udma_dfx_list[i].dfx->jfr_list->node, node) {
		if (jfr_now->jfr_id == jfrn) {
			srqn = jfr_now->srqn;
			flag = true;
			break;
		}
	}
	read_unlock(&g_udma_dfx_list[i].rwlock);

	if (!flag) {
		dev_err(udma_dev->dev, "failed to find jfr, jfrn = %u.\n", jfrn);
		return -EINVAL;
	}

	ret = udma_dfx_query_context(udma_dev, srqn, &jfr_context,
				     sizeof(jfr_context), UDMA_CMD_QUERY_SRQC);
	if (ret) {
		dev_err(udma_dev->dev, "query jfr context failed, ret = %d\n", ret);
		dev_err(udma_dev->dev, "query jfr context failed, ret = %d.\n", ret);
		return ret;
	}

@@ -420,25 +443,18 @@ static int udma_query_res_jfr(struct udma_dev *udma_dev,
	struct ubcore_res_jfr_val *jfr = (struct ubcore_res_jfr_val *)val->addr;
	struct udma_jfr_context jfr_context;
	struct jfr_list *jfr_now;
	bool flag = false;
	uint32_t srqn;
	int ret;
	int i;

	if (val->len < sizeof(struct ubcore_res_jfr_val)) {
		dev_err(udma_dev->dev,
			 "Failed to check len, type: %u, val->len: %u.\n",
		dev_err(udma_dev->dev, "failed to check len, type: %u, val->len: %u.\n",
			(uint32_t)key->type, val->len);
		val->len = sizeof(struct ubcore_res_jfr_val);
		return -EINVAL;
	}

	ret = udma_dfx_query_context(udma_dev, key->key, &jfr_context,
				     sizeof(jfr_context), UDMA_CMD_QUERY_SRQC);
	if (ret) {
		dev_err(udma_dev->dev,
			"query jfr context failed, ret = %d\n", ret);
		return ret;
	}

	ret = udma_find_dfx_dev(udma_dev, &i);
	if (ret)
		return ret;
@@ -447,20 +463,33 @@ static int udma_query_res_jfr(struct udma_dev *udma_dev,
			    &g_udma_dfx_list[i].dfx->jfr_list->node, node) {
		if (jfr_now->jfr_id == key->key) {
			jfr->jfc_id = jfr_now->jfc_id;
			read_unlock(&g_udma_dfx_list[i].rwlock);
			jfr->jfr_id = key->key;
			jfr->state = udma_reg_read(&jfr_context, SRQC_SRQ_ST);
			jfr->depth = 1U << udma_reg_read(&jfr_context, SRQC_SHIFT);
			val->len = sizeof(struct ubcore_res_jfr_val);
			return 0;
			srqn = jfr_now->srqn;
			flag = true;
			break;
		}
	}
	read_unlock(&g_udma_dfx_list[i].rwlock);

	dev_err(udma_dev->dev, "failed to find jfr!\n");
	if (!flag) {
		dev_err(udma_dev->dev, "failed to find jfr, jfrn = %u.\n", key->key);
		return -EINVAL;
	}

	ret = udma_dfx_query_context(udma_dev, srqn, &jfr_context,
				     sizeof(jfr_context), UDMA_CMD_QUERY_SRQC);
	if (ret) {
		dev_err(udma_dev->dev,
			"query jfr context failed, ret = %d\n", ret);
		return ret;
	}

	jfr->jfr_id = key->key;
	jfr->state = udma_reg_read(&jfr_context, SRQC_SRQ_ST);
	jfr->depth = 1U << udma_reg_read(&jfr_context, SRQC_SHIFT);

	return 0;
}

static int udma_query_res_jetty(struct udma_dev *udma_dev,
				struct ubcore_res_key *key,
				struct ubcore_res_val *val)
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ struct jfs_list {
struct jfr_list {
	uint32_t		jfr_id;
	uint32_t		jfc_id;
	uint32_t		srqn;
	struct list_head	node;
	spinlock_t		node_lock;
};
Loading