msm: vidc: Add VP9 profile/level query support

VP9 profile/levels are not defined in driver. Define them
and add support to query supported profile/level for VP9.

CRs-Fixed: 2086655
Change-Id: I528679a9e20601772f444d77a0ffb4ef5597d1a3
Signed-off-by: Vaibhav Deshu Venkatesh <vdeshuve@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index f17f3da..aa20a07 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -61,6 +61,26 @@
 	"3.0",
 };
 
+static const char *const vp9_profile[] = {
+	"Unused",
+	"0",
+	"2_10",
+};
+
+static const char *const vp9_level[] = {
+	"Unused",
+	"1.0",
+	"1.1",
+	"2.0",
+	"2.1",
+	"3.0",
+	"3.1",
+	"4.0",
+	"4.1",
+	"5.0",
+	"5.1",
+};
+
 static const char *const mpeg2_profile[] = {
 	"Simple",
 	"Main",
@@ -231,6 +251,28 @@
 		.flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
 	},
 	{
+		.id = V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE,
+		.name = "VP9 Profile",
+		.type = V4L2_CTRL_TYPE_MENU,
+		.minimum = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED,
+		.maximum = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10,
+		.default_value = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0,
+		.menu_skip_mask = 0,
+		.qmenu = vp9_profile,
+		.flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
+	},
+	{
+		.id = V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL,
+		.name = "VP9 Level",
+		.type = V4L2_CTRL_TYPE_MENU,
+		.minimum = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED,
+		.maximum = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51,
+		.default_value = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51,
+		.menu_skip_mask = 0,
+		.qmenu = vp9_level,
+		.flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
+	},
+	{
 		.id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE,
 		.name = "MPEG2 Profile",
 		.type = V4L2_CTRL_TYPE_MENU,
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index d08d40f..5f372c7 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -182,6 +182,7 @@
 	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
 	case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE:
 	case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE:
+	case V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE:
 	{
 		prof_level_supported = &inst->capability.profile_level;
 		for (i = 0; i < prof_level_supported->profile_count; i++) {
@@ -200,6 +201,7 @@
 	case V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL:
 	case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL:
 	case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_LEVEL:
+	case V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL:
 	{
 		prof_level_supported = &inst->capability.profile_level;
 		for (i = 0; i < prof_level_supported->profile_count; i++) {
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index f9972c1..6e8e1ed 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -297,6 +297,44 @@
 		default:
 			goto unknown_value;
 		}
+	case V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE:
+		switch (value) {
+		case HAL_VP9_PROFILE_P0:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0;
+		case HAL_VP9_PROFILE_P2_10:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10;
+		case HAL_VP9_PROFILE_UNUSED:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED;
+		default:
+			goto unknown_value;
+		}
+	case V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL:
+		switch (value) {
+		case HAL_VP9_LEVEL_1:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_1;
+		case HAL_VP9_LEVEL_11:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_11;
+		case HAL_VP9_LEVEL_2:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_2;
+		case HAL_VP9_LEVEL_21:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_21;
+		case HAL_VP9_LEVEL_3:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_3;
+		case HAL_VP9_LEVEL_31:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_31;
+		case HAL_VP9_LEVEL_4:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_4;
+		case HAL_VP9_LEVEL_41:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_41;
+		case HAL_VP9_LEVEL_5:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_5;
+		case HAL_VP9_LEVEL_51:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51;
+		case HAL_VP9_LEVEL_UNUSED:
+			return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED;
+		default:
+			goto unknown_value;
+		}
 	case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE:
 		switch (value) {
 		case HAL_MPEG2_PROFILE_SIMPLE:
diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
index d2a59dc..a4b7276 100644
--- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h
+++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
@@ -390,6 +390,26 @@
 	HAL_TME_LEVEL_INTEGER = 0x00000001,
 };
 
+enum hal_vp9_profile {
+	HAL_VP9_PROFILE_UNUSED = 0x00000000,
+	HAL_VP9_PROFILE_P0     = 0x00000001,
+	HAL_VP9_PROFILE_P2_10  = 0x00000002,
+};
+
+enum hal_vp9_level {
+	HAL_VP9_LEVEL_UNUSED = 0x00000000,
+	HAL_VP9_LEVEL_1  = 0x00000001,
+	HAL_VP9_LEVEL_11 = 0x00000002,
+	HAL_VP9_LEVEL_2  = 0x00000004,
+	HAL_VP9_LEVEL_21 = 0x00000008,
+	HAL_VP9_LEVEL_3  = 0x00000010,
+	HAL_VP9_LEVEL_31 = 0x00000020,
+	HAL_VP9_LEVEL_4  = 0x00000040,
+	HAL_VP9_LEVEL_41 = 0x00000080,
+	HAL_VP9_LEVEL_5  = 0x00000100,
+	HAL_VP9_LEVEL_51 = 0x00000200,
+};
+
 struct hal_frame_rate {
 	enum hal_buffer buffer_type;
 	u32 frame_rate;
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 5183111..24e93a6 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1046,6 +1046,30 @@
 #define V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID \
 		(V4L2_CID_MPEG_MSM_VIDC_BASE + 65)
 
+#define V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE \
+		(V4L2_CID_MPEG_MSM_VIDC_BASE + 66)
+enum v4l2_mpeg_vidc_video_vp9_profile {
+	V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED = 0,
+	V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0 = 1,
+	V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10 = 2,
+};
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL \
+	(V4L2_CID_MPEG_MSM_VIDC_BASE + 67)
+enum v4l2_mpeg_vidc_video_vp9_level {
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED = 0,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_1 = 1,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_11 = 2,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_2 = 3,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_21 = 4,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_3 = 5,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_31 = 6,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_4 = 7,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_41 = 8,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_5 = 9,
+	V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51 = 10,
+};
+
 #define V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP \
 		(V4L2_CID_MPEG_MSM_VIDC_BASE + 99)
 #define V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP \