Unverified Commit d2fe270b authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!7563 udma: fix a bug of segment

Merge Pull Request from: @zhaoweibo3 
 
driver inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I8V1IQ


CVE: NA

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

This patch fix the page size is automatically calculated when segs
are registered consecutively and the page size is not 4K aligned.

Fixes: 33e5598b ("hns3 udma: addressing stage adaptation")
Signed-off-by: default avatarJie Lei <leijie31@huawei.com>
Signed-off-by: default avatarWeibo Zhao <zhaoweibo3@huawei.com>
 
Link:https://gitee.com/openeuler/kernel/pulls/7563

 

Reviewed-by: default avatarChunzhi Hu <huchunzhi@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents aaa3557c 10cb4c23
Loading
Loading
Loading
Loading
+3 −13
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "hns3_udma_cmd.h"
#include "hns3_udma_dfx.h"
#include "hns3_udma_eid.h"
#include "hns3_udma_dca.h"
#include "hns3_udma_segment.h"

static uint32_t hw_index_to_key(int ind)
@@ -91,23 +92,13 @@ static int alloc_seg_key(struct udma_dev *udma_dev, struct udma_seg *seg)
	return err;
}

static uint64_t get_continuos_mem_size(uint64_t seg_addr)
{
#define HNS3_DOUBLE 2
	return seg_addr / HNS3_UDMA_KB * HNS3_DOUBLE;
}

static void get_pbl_addr_level(struct udma_seg *seg, struct udma_dev *udma_dev)
{
	uint64_t cont_mem_size;
	uint64_t seg_size;
	uint64_t page_num;

	if (seg->size <= SEG_MEM_SIZE_1G) {
	page_num = umem_cal_npages(seg->iova, seg->size);
	if (page_num <= UDMA_PAGE_SIZE_1G) {
		seg->pbl_hop_num = UDMA_PBL_HOP_NUM - 1U;
		seg_size = roundup_pow_of_two(seg->size);
		cont_mem_size = get_continuos_mem_size(seg_size);
		page_num = cont_mem_size / PAGE_SIZE;
		udma_dev->caps.pbl_ba_pg_sz = ilog2(roundup_pow_of_two(page_num));
	} else {
		seg->pbl_hop_num = udma_dev->caps.pbl_hop_num;
@@ -115,7 +106,6 @@ static void get_pbl_addr_level(struct udma_seg *seg, struct udma_dev *udma_dev)
	}
}


static int alloc_seg_pbl(struct udma_dev *udma_dev, struct udma_seg *seg,
			 bool is_user)
{
+1 −2
Original line number Diff line number Diff line
@@ -28,8 +28,7 @@
#define PA_PAGE_SHIFT		6
#define MPT_VA_H_SHIFT		32
#define MPT_LEN_H_SHIFT		32
#define HNS3_UDMA_KB		0x400
#define SEG_MEM_SIZE_1G		0X40000000 // 1GB
#define UDMA_PAGE_SIZE_1G	0x40000 // 1GB page size

enum {
	MPT_ST_VALID = 0x1,