summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xarch/arm64/boot/dts/freescale/imx8qm-mek.dts1
-rwxr-xr-xarch/arm64/boot/dts/freescale/imx8qxp-mek.dts1
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_b0.c135
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_b0.h1
-rw-r--r--drivers/mxc/vpu_windsor/vpu_encoder_config.h3
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