video: rockchip: mpp: fix dec err for rk356x

Add rkvdec link info for rk356x version.

Signed-off-by: Yandong Lin <yandong.lin@rock-chips.com>
Change-Id: Ib130c3b8bb15174c48b8afaaec5031eee0149503
This commit is contained in:
Yandong Lin
2022-07-19 14:21:24 +08:00
committed by Tao Huang
parent 0f478f308f
commit 8a69331606
4 changed files with 105 additions and 36 deletions

View File

@@ -245,6 +245,7 @@ struct mpp_hw_info {
u32 reg_end;
/* register of enable hardware */
int reg_en;
void *link_info;
};
struct mpp_trans_info {

View File

@@ -26,6 +26,16 @@ static struct mpp_hw_info rkvdec_v2_hw_info = {
.reg_start = RKVDEC_REG_START_INDEX,
.reg_end = RKVDEC_REG_END_INDEX,
.reg_en = RKVDEC_REG_START_EN_INDEX,
.link_info = &rkvdec_link_v2_hw_info,
};
static struct mpp_hw_info rkvdec_rk356x_hw_info = {
.reg_num = RKVDEC_REG_NUM,
.reg_id = RKVDEC_REG_HW_ID_INDEX,
.reg_start = RKVDEC_REG_START_INDEX,
.reg_end = RKVDEC_REG_END_INDEX,
.reg_en = RKVDEC_REG_START_EN_INDEX,
.link_info = &rkvdec_link_rk356x_hw_info,
};
/*
@@ -899,7 +909,7 @@ static const struct mpp_dev_var rkvdec_v2_data = {
static const struct mpp_dev_var rkvdec_rk3568_data = {
.device_type = MPP_DEVICE_RKVDEC,
.hw_info = &rkvdec_v2_hw_info,
.hw_info = &rkvdec_rk356x_hw_info,
.trans_info = rkvdec_v2_trans,
.hw_ops = &rkvdec_rk3568_hw_ops,
.dev_ops = &rkvdec_rk3568_dev_ops,

View File

@@ -21,39 +21,8 @@
#define WORK_TIMEOUT_MS (200)
#define WAIT_TIMEOUT_MS (500)
#define RKVDEC_MAX_WRITE_PART 6
#define RKVDEC_MAX_READ_PART 2
struct rkvdec_link_part {
/* register offset of table buffer */
u32 tb_reg_off;
/* start idx of task register */
u32 reg_start;
/* number of task register */
u32 reg_num;
};
struct rkvdec_link_info {
dma_addr_t iova;
/* total register for link table buffer */
u32 tb_reg_num;
/* next link table addr in table buffer */
u32 tb_reg_next;
/* current read back addr in table buffer */
u32 tb_reg_r;
/* secondary enable in table buffer */
u32 tb_reg_second_en;
u32 part_w_num;
u32 part_r_num;
struct rkvdec_link_part part_w[RKVDEC_MAX_WRITE_PART];
struct rkvdec_link_part part_r[RKVDEC_MAX_READ_PART];
/* interrupt read back in table buffer */
u32 tb_reg_int;
};
static struct rkvdec_link_info rkvdec_link_v2_hw_info = {
/* vdpu381 link hw info for rk3588 */
struct rkvdec_link_info rkvdec_link_v2_hw_info = {
.tb_reg_num = 218,
.tb_reg_next = 0,
.tb_reg_r = 1,
@@ -104,6 +73,58 @@ static struct rkvdec_link_info rkvdec_link_v2_hw_info = {
.tb_reg_int = 180,
};
/* vdpu34x link hw info for rk356x */
struct rkvdec_link_info rkvdec_link_rk356x_hw_info = {
.tb_reg_num = 202,
.tb_reg_next = 0,
.tb_reg_r = 1,
.tb_reg_second_en = 8,
.part_w_num = 6,
.part_r_num = 2,
.part_w[0] = {
.tb_reg_off = 4,
.reg_start = 8,
.reg_num = 20,
},
.part_w[1] = {
.tb_reg_off = 24,
.reg_start = 64,
.reg_num = 52,
},
.part_w[2] = {
.tb_reg_off = 76,
.reg_start = 128,
.reg_num = 16,
},
.part_w[3] = {
.tb_reg_off = 92,
.reg_start = 160,
.reg_num = 40,
},
.part_w[4] = {
.tb_reg_off = 132,
.reg_start = 224,
.reg_num = 16,
},
.part_w[5] = {
.tb_reg_off = 148,
.reg_start = 256,
.reg_num = 16,
},
.part_r[0] = {
.tb_reg_off = 164,
.reg_start = 224,
.reg_num = 10,
},
.part_r[1] = {
.tb_reg_off = 174,
.reg_start = 258,
.reg_num = 28,
},
.tb_reg_int = 164,
};
static void rkvdec_link_status_update(struct rkvdec_link_dev *dev)
{
void __iomem *reg_base = dev->reg_base;
@@ -461,6 +482,8 @@ static int rkvdec_link_send_task_to_hw(struct rkvdec_link_dev *dev,
/* start config before all registers are set */
wmb();
mpp_iommu_flush_tlb(dev->mpp->iommu_info);
/* configure done */
writel(RKVDEC_LINK_BIT_CFG_DONE, reg_base + RKVDEC_LINK_CFG_CTRL_BASE);
@@ -913,7 +936,7 @@ int rkvdec2_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec)
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "link");
if (res)
link_dec->info = &rkvdec_link_v2_hw_info;
link_dec->info = mpp->var->hw_info->link_info;
else {
dev_err(dev, "link mode resource not found\n");
ret = -ENOMEM;
@@ -1534,7 +1557,7 @@ int rkvdec2_ccu_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec)
if (!res)
return -ENOMEM;
link_dec->info = &rkvdec_link_v2_hw_info;
link_dec->info = dec->mpp.var->hw_info->link_info;
link_dec->reg_base = devm_ioremap(dev, res->start, resource_size(res));
if (!link_dec->reg_base) {
dev_err(dev, "ioremap failed for resource %pR\n", res);

View File

@@ -82,6 +82,38 @@
#define RKVDEC_CCU_CORE_RW_MASK 0x30000
#define RKVDEC_MAX_WRITE_PART 6
#define RKVDEC_MAX_READ_PART 2
struct rkvdec_link_part {
/* register offset of table buffer */
u32 tb_reg_off;
/* start idx of task register */
u32 reg_start;
/* number of task register */
u32 reg_num;
};
struct rkvdec_link_info {
dma_addr_t iova;
/* total register for link table buffer */
u32 tb_reg_num;
/* next link table addr in table buffer */
u32 tb_reg_next;
/* current read back addr in table buffer */
u32 tb_reg_r;
/* secondary enable in table buffer */
u32 tb_reg_second_en;
u32 part_w_num;
u32 part_r_num;
struct rkvdec_link_part part_w[RKVDEC_MAX_WRITE_PART];
struct rkvdec_link_part part_r[RKVDEC_MAX_READ_PART];
/* interrupt read back in table buffer */
u32 tb_reg_int;
};
struct rkvdec_link_dev {
struct device *dev;
struct mpp_dev *mpp;
@@ -153,6 +185,9 @@ struct rkvdec2_ccu {
struct reset_control *rst_a;
};
extern struct rkvdec_link_info rkvdec_link_rk356x_hw_info;
extern struct rkvdec_link_info rkvdec_link_v2_hw_info;
int rkvdec_link_dump(struct mpp_dev *mpp);
int rkvdec2_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec);