diff options
-rwxr-xr-x | arch/arm64/boot/dts/freescale/imx8qm-mek.dts | 1 | ||||
-rwxr-xr-x | arch/arm64/boot/dts/freescale/imx8qxp-mek.dts | 1 | ||||
-rw-r--r-- | drivers/mxc/vpu_windsor/vpu_encoder_b0.c | 135 | ||||
-rw-r--r-- | drivers/mxc/vpu_windsor/vpu_encoder_b0.h | 1 | ||||
-rw-r--r-- | drivers/mxc/vpu_windsor/vpu_encoder_config.h | 3 |
5 files changed, 63 insertions, 78 deletions
diff --git a/arch/arm64/boot/dts/freescale/imx8qm-mek.dts b/arch/arm64/boot/dts/freescale/imx8qm-mek.dts index f189b96d4eae..cf4bd110bc56 100755 --- a/arch/arm64/boot/dts/freescale/imx8qm-mek.dts +++ b/arch/arm64/boot/dts/freescale/imx8qm-mek.dts @@ -1685,7 +1685,6 @@ reserved-region = <&encoder_reserved>; reg-rpc-system = <0x40000000>; resolution-max = <1920 1080>; - fps-max = <120>; power-domains = <&pd IMX_SC_R_VPU_ENC_0>, <&pd IMX_SC_R_VPU_ENC_1>, <&pd IMX_SC_R_VPU>; power-domain-names = "vpuenc1", "vpuenc2", "vpu"; diff --git a/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts b/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts index a40d116288ea..779fcd75b163 100755 --- a/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts +++ b/arch/arm64/boot/dts/freescale/imx8qxp-mek.dts @@ -949,7 +949,6 @@ reserved-region = <&encoder_reserved>; reg-rpc-system = <0x40000000>; resolution-max = <1920 1080>; - fps-max = <120>; mbox-names = "enc1_tx0", "enc1_tx1", "enc1_rx"; mboxes = <&mu1_m0 0 0 &mu1_m0 0 1 diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c index c5a25d91e37b..cd3344b65418 100644 --- a/drivers/mxc/vpu_windsor/vpu_encoder_b0.c +++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.c @@ -412,25 +412,24 @@ static int vpu_enc_v4l2_ioctl_enum_framesizes(struct file *file, void *fh, static int vpu_enc_v4l2_ioctl_enum_frameintervals(struct file *file, void *fh, struct v4l2_frmivalenum *fival) { - u32 framerate; struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh); struct vpu_dev *vdev = ctx->dev; - if (!fival) + if (!fival || fival->index) return -EINVAL; if (!vdev) return -EINVAL; vpu_log_func(); - framerate = vdev->supported_fps.min + - fival->index * vdev->supported_fps.step; - if (framerate > vdev->supported_fps.max) - return -EINVAL; - fival->type = V4L2_FRMIVAL_TYPE_DISCRETE; - fival->discrete.numerator = 1; - fival->discrete.denominator = framerate; + fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; + fival->stepwise.min.numerator = 1; + fival->stepwise.min.denominator = 65535; + fival->stepwise.max.numerator = 65535; + fival->stepwise.max.denominator = 1; + fival->stepwise.step.numerator = 1; + fival->stepwise.step.denominator = 1; return 0; } @@ -503,7 +502,6 @@ static int initialize_enc_param(struct vpu_ctx *ctx) pMEDIAIP_ENC_PARAM param = &attr->param; mutex_lock(&ctx->instance_mutex); - param->eCodecMode = MEDIAIP_ENC_FMT_H264; param->tEncMemDesc.uMemPhysAddr = 0; param->tEncMemDesc.uMemVirtAddr = 0; @@ -517,9 +515,12 @@ static int initialize_enc_param(struct vpu_ctx *ctx) param->uSrcCropHeight = VPU_ENC_HEIGHT_DEFAULT; param->uOutWidth = VPU_ENC_WIDTH_DEFAULT; param->uOutHeight = VPU_ENC_HEIGHT_DEFAULT; - param->uFrameRate = VPU_ENC_FRAMERATE_DEFAULT; param->uMinBitRate = BITRATE_LOW_THRESHOLD; + attr->fival.numerator = 1; + attr->fival.denominator = VPU_ENC_FRAMERATE_DEFAULT; + param->uFrameRate = VPU_ENC_FRAMERATE_DEFAULT; + mutex_unlock(&ctx->instance_mutex); return 0; @@ -773,55 +774,42 @@ static int vpu_enc_v4l2_ioctl_g_parm(struct file *file, void *fh, vpu_log_func(); parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; parm->parm.capture.capturemode = V4L2_CAP_TIMEPERFRAME; - parm->parm.capture.timeperframe.numerator = 1; - parm->parm.capture.timeperframe.denominator = param->uFrameRate; + parm->parm.capture.timeperframe.numerator = attr->fival.numerator; + parm->parm.capture.timeperframe.denominator = attr->fival.denominator; parm->parm.capture.readbuffers = 0; return 0; } -static int find_proper_framerate(struct vpu_dev *dev, struct v4l2_fract *fival) +static u32 __calc_coprime(u32 *a, u32 *b) { - u32 min_delta = INT_MAX; - struct v4l2_fract target_fival = {0, 0}; - u32 framerate; - - if (!fival || !dev) - return -EINVAL; + int m = *a; + int n = *b; - framerate = dev->supported_fps.min; + if (m == 0) + return n; + if (n == 0) + return m; - while (framerate <= dev->supported_fps.max) { - u32 delta; + while (n != 0) { + int tmp = m % n; - delta = abs(fival->numerator * framerate - - fival->denominator); - if (!delta) - return 0; - if (delta < min_delta) { - target_fival.numerator = 1; - target_fival.denominator = framerate; - min_delta = delta; - } - - framerate += dev->supported_fps.step; + m = n; + n = tmp; } - if (!target_fival.numerator || !target_fival.denominator) - return -EINVAL; - - fival->numerator = target_fival.numerator; - fival->denominator = target_fival.denominator; + *a = (*a) / m; + *b = (*b) / m; - return 0; + return m; } + static int vpu_enc_v4l2_ioctl_s_parm(struct file *file, void *fh, struct v4l2_streamparm *parm) { struct vpu_ctx *ctx = v4l2_fh_to_ctx(fh); struct vpu_attr *attr = NULL; struct v4l2_fract fival; - int ret; if (!parm || !ctx) return -EINVAL; @@ -834,20 +822,14 @@ static int vpu_enc_v4l2_ioctl_s_parm(struct file *file, void *fh, if (!fival.numerator || !fival.denominator) return -EINVAL; - ret = find_proper_framerate(ctx->dev, &fival); - if (ret) { - vpu_err("Unsupported FPS : %d / %d\n", - fival.numerator, fival.denominator); - return ret; - } - + __calc_coprime(&fival.numerator, &fival.denominator); mutex_lock(&ctx->instance_mutex); - attr->param.uFrameRate = fival.denominator / fival.numerator; + attr->fival.numerator = fival.numerator; + attr->fival.denominator = fival.denominator; + attr->param.uFrameRate = + DIV_ROUND_CLOSEST(fival.denominator, fival.numerator); mutex_unlock(&ctx->instance_mutex); - parm->parm.capture.timeperframe.numerator = fival.numerator; - parm->parm.capture.timeperframe.denominator = fival.denominator; - return 0; } @@ -1671,7 +1653,8 @@ static int process_core_hang(struct core_device *core) return 0; } -static void show_codec_configure(pMEDIAIP_ENC_PARAM param) +static void show_codec_configure(pMEDIAIP_ENC_PARAM param, + pMEDIAIP_ENC_EXPERT_MODE_PARAM pEncExpertModeParam) { if (!param) return; @@ -1689,8 +1672,10 @@ static void show_codec_configure(pMEDIAIP_ENC_PARAM param) "Mem Virt Addr", param->tEncMemDesc.uMemVirtAddr); vpu_dbg(LVL_INFO, "\t%20s:%16d\n", "Mem Size", param->tEncMemDesc.uMemSize); - vpu_dbg(LVL_INFO, "\t%20s:%16d\n", - "Frame Rate", param->uFrameRate); + vpu_dbg(LVL_INFO, "\t%20s:%16d(%d / %d)\n", + "Frame Rate", param->uFrameRate, + pEncExpertModeParam->Config.frame_rate_num, + pEncExpertModeParam->Config.frame_rate_den); vpu_dbg(LVL_INFO, "\t%20s:%16d\n", "Source Stride", param->uSrcStride); vpu_dbg(LVL_INFO, "\t%20s:%16d\n", @@ -1893,7 +1878,7 @@ static int do_configure_codec(struct vpu_ctx *ctx) memcpy(enc_param, &attr->param, sizeof(attr->param)); vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_CONFIGURE_CODEC, 0, NULL); - show_codec_configure(enc_param); + show_codec_configure(enc_param, pEncExpertModeParam); return 0; } @@ -2661,6 +2646,8 @@ static int handle_event_start_done(struct vpu_ctx *ctx) static int handle_event_mem_request(struct vpu_ctx *ctx, MEDIAIP_ENC_MEM_REQ_DATA *req_data) { + pMEDIAIP_ENC_EXPERT_MODE_PARAM pEncExpertModeParam = NULL; + struct vpu_attr *attr = NULL; int ret; if (!ctx || !req_data) @@ -2671,6 +2658,10 @@ static int handle_event_mem_request(struct vpu_ctx *ctx, vpu_err("fail to alloc encoder memory\n"); return ret; } + pEncExpertModeParam = get_rpc_expert_mode_param(ctx); + attr = get_vpu_ctx_attr(ctx); + pEncExpertModeParam->Config.frame_rate_num = attr->fival.numerator; + pEncExpertModeParam->Config.frame_rate_den = attr->fival.denominator; vpu_ctx_send_cmd(ctx, GTB_ENC_CMD_STREAM_START, 0, NULL); set_bit(VPU_ENC_STATUS_START_SEND, &ctx->status); @@ -3703,8 +3694,11 @@ static int init_vpu_ctx(struct vpu_ctx *ctx) static int show_encoder_param(struct vpu_attr *attr, pMEDIAIP_ENC_PARAM param, char *buf, u32 size) { + pMEDIAIP_ENC_EXPERT_MODE_PARAM pEncExpertModeParam = NULL; int num = 0; + pEncExpertModeParam = rpc_get_expert_mode_param(&attr->core->shared_mem, + attr->index); num += scnprintf(buf + num, size - num, "encoder param:[setting/take effect]\n"); num += scnprintf(buf + num, size - num, @@ -3717,8 +3711,14 @@ static int show_encoder_param(struct vpu_attr *attr, "\t%-18s:%10d;%10d\n", "Level", attr->param.uLevel, param->uLevel); num += scnprintf(buf + num, size - num, - "\t%-18s:%10d;%10d\n", "Frame Rate", - attr->param.uFrameRate, param->uFrameRate); + "\t%-18s:%2d(%d / %d);%2d(%d / %d)\n", + "Frame Rate", + attr->param.uFrameRate, + attr->fival.numerator, + attr->fival.denominator, + param->uFrameRate, + pEncExpertModeParam->Config.frame_rate_num, + pEncExpertModeParam->Config.frame_rate_den); num += scnprintf(buf + num, size - num, "\t%-18s:%10d;%10d\n", "Source Stride", attr->param.uSrcStride, param->uSrcStride); @@ -4367,8 +4367,10 @@ static ssize_t show_fpsinfo(struct device *dev, num += scnprintf(buf + num, PAGE_SIZE - num, "\t[%d]", j); num += scnprintf(buf + num, PAGE_SIZE - num, - " %3d(setting) ", - attr->param.uFrameRate); + " %3d(%d / %d)(setting) ", + attr->param.uFrameRate, + attr->fival.numerator, + attr->fival.denominator); num += show_fps_info(attr->statistic.fps, ARRAY_SIZE(attr->statistic.fps), buf + num, PAGE_SIZE - num); @@ -4409,11 +4411,6 @@ static ssize_t show_vpuinfo(struct device *dev, num += scnprintf(buf + num, PAGE_SIZE - num, " %dx%d(max)\n", vdev->supported_size.max_width, vdev->supported_size.max_height); - num += scnprintf(buf + num, PAGE_SIZE - num, - "supported frame rate : %d(min); %d(step); %d(max)\n", - vdev->supported_fps.min, - vdev->supported_fps.step, - vdev->supported_fps.max); return num; } @@ -4940,10 +4937,6 @@ static int parse_dt_info(struct vpu_dev *dev, struct device_node *np) dev->supported_size.max_height = VPU_ENC_HEIGHT_MAX; dev->supported_size.step_height = VPU_ENC_HEIGHT_STEP; - dev->supported_fps.min = VPU_ENC_FRAMERATE_MIN; - dev->supported_fps.max = VPU_ENC_FRAMERATE_MAX; - dev->supported_fps.step = VPU_ENC_FRAMERATE_STEP; - ret = of_property_read_u32_index(np, "resolution-max", 0, &val); if (!ret) dev->supported_size.max_width = val; @@ -4952,10 +4945,6 @@ static int parse_dt_info(struct vpu_dev *dev, struct device_node *np) if (!ret) dev->supported_size.max_height = val; - ret = of_property_read_u32_index(np, "fps-max", 0, &val); - if (!ret) - dev->supported_fps.max = val; - return 0; } diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_b0.h b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h index 7e6169bd793f..881a1944a17b 100644 --- a/drivers/mxc/vpu_windsor/vpu_encoder_b0.h +++ b/drivers/mxc/vpu_windsor/vpu_encoder_b0.h @@ -260,6 +260,7 @@ struct vpu_attr { struct vpu_statistic statistic; MEDIAIP_ENC_PARAM param; + struct v4l2_fract fival; unsigned long ts_start[2]; unsigned long msg_count; diff --git a/drivers/mxc/vpu_windsor/vpu_encoder_config.h b/drivers/mxc/vpu_windsor/vpu_encoder_config.h index d83da319313d..f632c1dfb682 100644 --- a/drivers/mxc/vpu_windsor/vpu_encoder_config.h +++ b/drivers/mxc/vpu_windsor/vpu_encoder_config.h @@ -20,9 +20,6 @@ #define VPU_ENC_HEIGHT_MIN 48 #define VPU_ENC_WIDTH_STEP 16 #define VPU_ENC_HEIGHT_STEP 2 -#define VPU_ENC_FRAMERATE_MAX 120 -#define VPU_ENC_FRAMERATE_MIN 1 -#define VPU_ENC_FRAMERATE_STEP 1 #define VPU_ENC_WIDTH_DEFAULT 1920 #define VPU_ENC_HEIGHT_DEFAULT 1080 |