Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aadd9757 authored by Praneeth Paladugu's avatar Praneeth Paladugu
Browse files

msm: vidc: Add support for FW version check



Encoder VPE and decoder DS features need to be supported
on targets which are using Venus 1.4 FW. FW sends version
as part of system property message. Driver needs to process
the version and reject VPE and DS features accordingly.

Change-Id: I600d402f36aa9bb484fc8dca76fce7d8f9120521
Signed-off-by: default avatarPraneeth Paladugu <ppaladug@codeaurora.org>
parent 61a09d4a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1209,7 +1209,7 @@ void hfi_process_sys_property_info(
				version[i] = ' ';
		}
		version[i] = '\0';
		dprintk(VIDC_INFO, "F/W version: %s\n", version);
		dprintk(VIDC_DBG, "F/W version: %s\n", version);
	}

	smem_table_ptr = smem_get_entry(SMEM_IMAGE_VERSION_TABLE,
+1 −10
Original line number Diff line number Diff line
@@ -919,8 +919,6 @@ static int msm_venc_queue_setup(struct vb2_queue *q,
				"Failed to get buffer requirements: %d\n", rc);
			break;
		}
		inst->capability.pixelprocess_capabilities =
			call_hfi_op(hdev, get_core_capabilities);
		*num_planes = 1;
		mutex_lock(&inst->lock);
		*num_buffers = inst->buff_req.buffer[0].buffer_count_actual =
@@ -2044,12 +2042,11 @@ static int msm_venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
{

	int rc = 0, c = 0;
	struct hfi_device *hdev;

	struct msm_vidc_inst *inst = container_of(ctrl->handler,
					struct msm_vidc_inst, ctrl_handler);

	if (!inst || !inst->core || !inst->core->device) {
	if (!inst) {
		dprintk(VIDC_ERR, "%s invalid parameters", __func__);
		return -EINVAL;
	}
@@ -2062,10 +2059,6 @@ static int msm_venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
		goto failed_open_done;
	}

	hdev = inst->core->device;
	inst->capability.pixelprocess_capabilities =
		call_hfi_op(hdev, get_core_capabilities);

	for (c = 0; c < ctrl->ncontrols; ++c) {
		if (ctrl->cluster[c]->is_new) {
			struct v4l2_ctrl *temp = ctrl->cluster[c];
@@ -2403,8 +2396,6 @@ int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
				dprintk(VIDC_ERR, "Failed to open instance\n");
				goto exit;
			}
			inst->capability.pixelprocess_capabilities =
				call_hfi_op(hdev, get_core_capabilities);
			frame_sz.width = inst->prop.width[CAPTURE_PORT];
			frame_sz.height = inst->prop.height[CAPTURE_PORT];
			frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
+9 −3
Original line number Diff line number Diff line
@@ -426,16 +426,20 @@ static void handle_session_init_done(enum command_response cmd, void *data)
{
	struct msm_vidc_cb_cmd_done *response = data;
	struct msm_vidc_inst *inst = NULL;
	struct hfi_device *hdev;

	if (response) {
		struct vidc_hal_session_init_done *session_init_done =
			(struct vidc_hal_session_init_done *)
			response->data;
		inst = (struct msm_vidc_inst *)response->session_id;
		if (!inst) {
			dprintk(VIDC_ERR, "%s: invalid input parameters",
				__func__);
		if (!inst || !inst->core || !inst->core->device) {
			dprintk(VIDC_ERR, "%s invalid parameters", __func__);
			return;
		}

		hdev = inst->core->device;

		if (!response->status && session_init_done) {
			inst->capability.width = session_init_done->width;
			inst->capability.height = session_init_done->height;
@@ -443,6 +447,8 @@ static void handle_session_init_done(enum command_response cmd, void *data)
				session_init_done->frame_rate;
			inst->capability.scale_x = session_init_done->scale_x;
			inst->capability.scale_y = session_init_done->scale_y;
			inst->capability.pixelprocess_capabilities =
				call_hfi_op(hdev, get_core_capabilities);
			inst->capability.capability_set = true;
			inst->capability.buffer_mode[CAPTURE_PORT] =
				session_init_done->alloc_mode_out;
+31 −4
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <mach/ocmem.h>
#include <mach/scm.h>
#include <mach/subsystem_restart.h>
#include <mach/msm_smem.h>
#include <asm/memory.h>
#include "hfi_packetization.h"
#include "venus_hfi.h"
@@ -3526,10 +3527,36 @@ int venus_hfi_get_stride_scanline(int color_fmt,

int venus_hfi_get_core_capabilities(void)
{
	return HAL_VIDEO_ENCODER_ROTATION_CAPABILITY |
	int i = 0, rc = 0, j = 0, venus_version_length = 0;
	u32 smem_block_size = 0;
	u8 *smem_table_ptr;
	char version[256];
	char venus_version[] = "VIDEO.VE.1.4";
	u8 version_info[256];
	const u32 smem_image_index_venus = 14 * 128;

	smem_table_ptr = smem_get_entry(SMEM_IMAGE_VERSION_TABLE,
			&smem_block_size);
	if (smem_table_ptr &&
			((smem_image_index_venus + 128) <= smem_block_size))
		memcpy(version_info, smem_table_ptr + smem_image_index_venus,
				128);

	while (version_info[i++] != 'V' && i < 128)
		;

	venus_version_length = strlen(venus_version);
	for (i--, j = 0; i < 128 && j < venus_version_length; i++)
		version[j++] = version_info[i];
	version[venus_version_length] = '\0';
	dprintk(VIDC_DBG, "F/W version retrieved : %s\n", version);

	if (strcmp((const char *)version, (const char *)venus_version) == 0)
		rc = HAL_VIDEO_ENCODER_ROTATION_CAPABILITY |
			HAL_VIDEO_ENCODER_SCALING_CAPABILITY |
			HAL_VIDEO_ENCODER_DEINTERLACE_CAPABILITY |
			HAL_VIDEO_DECODER_MULTI_STREAM_CAPABILITY;
	return rc;
}

int venus_hfi_capability_check(u32 fourcc, u32 width,