[hal_h265e_vepu580]: Use MppDev delimit

Use MppDev delimit function to send two tile ioctl at once.

Change-Id: I80c1e17ff609cfa1a70bc95c747db9a1d995229e
Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
Herman Chen
2022-01-25 16:00:21 +08:00
parent 407fce1272
commit 502bb4543e

View File

@@ -34,6 +34,8 @@
#include "hal_h265e_vepu580.h" #include "hal_h265e_vepu580.h"
#include "hal_h265e_vepu580_reg.h" #include "hal_h265e_vepu580_reg.h"
#include "mpp_service.h"
#define MAX_TILE_NUM 2 #define MAX_TILE_NUM 2
#define hal_h265e_err(fmt, ...) \ #define hal_h265e_err(fmt, ...) \
@@ -65,7 +67,7 @@ typedef struct vepu580_h265_fbk_t {
typedef struct H265eV580HalContext_t { typedef struct H265eV580HalContext_t {
MppEncHalApi api; MppEncHalApi api;
MppDev dev; MppDev dev;
void *regs; void *regs[MAX_TILE_NUM];
void *reg_out[MAX_TILE_NUM]; void *reg_out[MAX_TILE_NUM];
vepu580_h265_fbk feedback; vepu580_h265_fbk feedback;
@@ -1119,10 +1121,10 @@ MPP_RET hal_h265e_v580_init(void *hal, MppEncHalCfg *cfg)
hal_h265e_enter(); hal_h265e_enter();
for (i = 0; i < MAX_TILE_NUM; i++) { for (i = 0; i < MAX_TILE_NUM; i++) {
ctx->regs[i] = mpp_calloc(H265eV580RegSet, 1);
ctx->reg_out[i] = mpp_calloc(H265eV580StatusElem, 1); ctx->reg_out[i] = mpp_calloc(H265eV580StatusElem, 1);
} }
ctx->regs = mpp_calloc(H265eV580RegSet, 1);
ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1); ctx->input_fmt = mpp_calloc(VepuFmtCfg, 1);
ctx->cfg = cfg->cfg; ctx->cfg = cfg->cfg;
hal_bufs_init(&ctx->dpb_bufs); hal_bufs_init(&ctx->dpb_bufs);
@@ -1136,7 +1138,7 @@ MPP_RET hal_h265e_v580_init(void *hal, MppEncHalCfg *cfg)
mpp_err_f("mpp_dev_init failed. ret: %d\n", ret); mpp_err_f("mpp_dev_init failed. ret: %d\n", ret);
return ret; return ret;
} }
regs = (H265eV580RegSet *)ctx->regs; regs = (H265eV580RegSet *)ctx->regs[0];
ctx->dev = cfg->dev; ctx->dev = cfg->dev;
ctx->osd_cfg.reg_base = (void *)&regs->reg_osd_cfg; ctx->osd_cfg.reg_base = (void *)&regs->reg_osd_cfg;
ctx->osd_cfg.dev = ctx->dev; ctx->osd_cfg.dev = ctx->dev;
@@ -1160,7 +1162,12 @@ MPP_RET hal_h265e_v580_init(void *hal, MppEncHalCfg *cfg)
ctx->tune = vepu580_h265e_tune_init(ctx); ctx->tune = vepu580_h265e_tune_init(ctx);
ctx->tile_parall_en = 0; {
// check parall tile ability
const MppServiceCmdCap *cap = mpp_get_mpp_service_cmd_cap();
ctx->tile_parall_en = cap->send_cmd > MPP_CMD_SET_SESSION_FD;
}
hal_h265e_leave(); hal_h265e_leave();
return ret; return ret;
} }
@@ -1171,9 +1178,9 @@ MPP_RET hal_h265e_v580_deinit(void *hal)
RK_U32 i = 0; RK_U32 i = 0;
hal_h265e_enter(); hal_h265e_enter();
MPP_FREE(ctx->regs);
for (i = 0; i < MAX_TILE_NUM; i++) { for (i = 0; i < MAX_TILE_NUM; i++) {
MPP_FREE(ctx->regs[i]);
MPP_FREE(ctx->reg_out[i]); MPP_FREE(ctx->reg_out[i]);
} }
@@ -1897,7 +1904,7 @@ MPP_RET hal_h265e_v580_gen_regs(void *hal, HalEncTask *task)
H265eV580HalContext *ctx = (H265eV580HalContext *)hal; H265eV580HalContext *ctx = (H265eV580HalContext *)hal;
HalEncTask *enc_task = task; HalEncTask *enc_task = task;
H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data; H265eSyntax_new *syn = (H265eSyntax_new *)enc_task->syntax.data;
H265eV580RegSet *regs = ctx->regs; H265eV580RegSet *regs = (H265eV580RegSet *)ctx->regs[0];
RK_U32 pic_width_align8, pic_height_align8; RK_U32 pic_width_align8, pic_height_align8;
RK_S32 pic_wd64, pic_h64; RK_S32 pic_wd64, pic_h64;
VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt; VepuFmtCfg *fmt = (VepuFmtCfg *)ctx->input_fmt;
@@ -2104,10 +2111,13 @@ MPP_RET hal_h265e_v580_start(void *hal, HalEncTask *enc_task)
} }
for (k = 0; k < tile_num; k++) { for (k = 0; k < tile_num; k++) {
H265eV580RegSet *hw_regs = ctx->regs; H265eV580RegSet *hw_regs = (H265eV580RegSet *)ctx->regs[k];
hevc_vepu580_base *reg_base = &hw_regs->reg_base; hevc_vepu580_base *reg_base = &hw_regs->reg_base;
H265eV580StatusElem *reg_out = (H265eV580StatusElem *)ctx->reg_out[k]; H265eV580StatusElem *reg_out = (H265eV580StatusElem *)ctx->reg_out[k];
if (k)
memcpy(hw_regs, ctx->regs[0], sizeof(*hw_regs));
vepu580_h265_set_me_ram(syn, &hw_regs->reg_base, k); vepu580_h265_set_me_ram(syn, &hw_regs->reg_base, k);
/* set input info */ /* set input info */
@@ -2135,34 +2145,32 @@ MPP_RET hal_h265e_v580_start(void *hal, HalEncTask *enc_task)
mpp_dev_set_reg_offset(ctx->dev, 166, ctx->fbc_header_len); mpp_dev_set_reg_offset(ctx->dev, 166, ctx->fbc_header_len);
} }
hal_h265e_v580_send_regs(ctx->dev, hw_regs, reg_out); hal_h265e_v580_send_regs(ctx->dev, hw_regs, reg_out);
if (k < tile_num - 1) {
vepu580_h265_fbk *fb = &ctx->feedback;
ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
if (ret) {
mpp_err_f("send cmd failed %d\n", ret);
break;
}
if (k < tile_num - 1) {
if (!ctx->tile_parall_en) { if (!ctx->tile_parall_en) {
vepu580_h265_fbk *fb = &ctx->feedback;
ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_SEND, NULL);
if (ret) {
mpp_err_f("send cmd failed %d\n", ret);
}
ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL); ret = mpp_dev_ioctl(ctx->dev, MPP_DEV_CMD_POLL, NULL);
if (ret) { if (ret) {
mpp_err_f("poll cmd failed %d\n", ret); mpp_err_f("poll cmd failed %d\n", ret);
ret = MPP_ERR_VPUHW; ret = MPP_ERR_VPUHW;
} }
stream_len += reg_out->st.bs_lgth_l32; stream_len += reg_out->st.bs_lgth_l32;
fb->qp_sum += reg_out->st.qp_sum; fb->qp_sum += reg_out->st.qp_sum;
fb->out_strm_size += reg_out->st.bs_lgth_l32; fb->out_strm_size += reg_out->st.bs_lgth_l32;
fb->sse_sum += (RK_S64)(reg_out->st.sse_h32 << 16) + fb->sse_sum += (RK_S64)(reg_out->st.sse_h32 << 16) +
((reg_out->st.st_sse_bsl.sse_l16 >> 16) & 0xffff); ((reg_out->st.st_sse_bsl.sse_l16 >> 16) & 0xffff);
fb->st_madi += reg_out->st.madi; fb->st_madi += reg_out->st.madi;
fb->st_madp += reg_out->st.madp; fb->st_madp += reg_out->st.madp;
fb->st_mb_num += reg_out->st.st_bnum_b16.num_b16; fb->st_mb_num += reg_out->st.st_bnum_b16.num_b16;
fb->st_ctu_num += reg_out->st.st_bnum_cme.num_ctu; fb->st_ctu_num += reg_out->st.st_bnum_cme.num_ctu;
} } else
mpp_dev_ioctl(ctx->dev, MPP_DEV_DELIMIT, NULL);
} }
} }