170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang/* 270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Copyright (C) 2008 The Android Open Source Project 370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Copyright@ Samsung Electronics Co. LTD 470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * you may not use this file except in compliance with the License. 770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * You may obtain a copy of the License at 870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 1170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Unless required by applicable law or agreed to in writing, software 1270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * See the License for the specific language governing permissions and 1570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * limitations under the License. 1670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang */ 1770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang/*! 1970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \file exynos_gscaler.c 2070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \brief header file for Gscaler HAL 2170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \author ShinWon Lee (shinwon.lee@samsung.com) 2270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * \date 2012/01/09 2370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 2470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * <b>Revision History: </b> 2570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.01.09 : ShinWon Lee(shinwon.lee@samsung.com) \n 2670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Create 2770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 2870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.07 : ShinWon Lee(shinwon.lee@samsung.com) \n 2970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Change file name to exynos_gscaler.h 3070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 3170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.09 : Sangwoo, Parkk(sw5771.park@samsung.com) \n 3270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Use Multiple Gscaler by Multiple Process 3370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 3470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.20 : Sangwoo, Park(sw5771.park@samsung.com) \n 3570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Add exynos_gsc_set_rotation() API 3670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 3770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * - 2012.02.20 : ShinWon Lee(shinwon.lee@samsung.com) \n 3870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Add size constrain 3970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 4070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang */ 4170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 4270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang//#define LOG_NDEBUG 0 4370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "exynos_gsc_utils.h" 4433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin#include "content_protect.h" 4570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 469f6d828714b4b232205235a1c75f24ec23f8b888Benoit Gobystatic int exynos_gsc_m2m_wait_frame_done(void *handle); 4733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavinstatic int exynos_gsc_m2m_stop(void *handle); 489f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 4970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_count( 5070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int v4l_pixel_format) 5170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 5270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int plane_count = 0; 5370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 5470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (v4l_pixel_format) { 5570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB32: 5670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_BGR32: 5770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB24: 5870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB565: 5970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB555X: 6070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB444: 6170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUYV: 6270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_UYVY: 6323dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang case V4L2_PIX_FMT_NV16: 6423dac69caf127d309df8157099f7a8a21102c830Sungjoong Kang case V4L2_PIX_FMT_NV61: 6570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_count = 1; 6670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 6770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV12M: 6870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV12MT_16X16: 692607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song case V4L2_PIX_FMT_NV12: 7070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV21: 7166e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang case V4L2_PIX_FMT_NV21M: 7270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_count = 2; 7370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 7470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YVU420M: 7570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUV422P: 764006f615bd7b5ad1f11120ad3172b5b4981e37b9Yongbae Song case V4L2_PIX_FMT_YUV420M: 7770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_count = 3; 7870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 7970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 806134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n", 8170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang __func__, v4l_pixel_format); 8270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_count = -1; 8370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 8470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 8570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 8670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return plane_count; 8770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 8870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 8970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic unsigned int m_gsc_get_plane_size( 9070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int *plane_size, 9170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int width, 9270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int height, 9370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int v4l_pixel_format) 9470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 9570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (v4l_pixel_format) { 9670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* 1 plane */ 9770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB32: 9870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_BGR32: 9970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[0] = width * height * 4; 10070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[1] = 0; 10170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = 0; 10270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 10370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB24: 10470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[0] = width * height * 3; 10570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[1] = 0; 10670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = 0; 10770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 10870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB565: 10970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB555X: 11070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB444: 11170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUYV: 11270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_UYVY: 11370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[0] = width * height * 2; 11470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[1] = 0; 11570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = 0; 11670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 11770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* 2 planes */ 11870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV12M: 1192607aa30bcae2244e1bc68cbc0a0fc5a2b4ef570Yongbae Song case V4L2_PIX_FMT_NV12: 12070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV21: 12166e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang case V4L2_PIX_FMT_NV21M: 122e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang plane_size[0] = width * height; 123e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang plane_size[1] = width * (height / 2); 124e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang plane_size[2] = 0; 125e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang break; 12670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV16: 12770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV61: 12835b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin plane_size[0] = width * height * 2; 12935b3cc218cb21f5d003e39cf15bb4c5bb01fe114Jiyoung Shin plane_size[1] = 0; 13070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = 0; 13170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 13270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV12MT_16X16: 13370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[0] = ALIGN(width, 16) * ALIGN(height, 16); 13470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[1] = ALIGN(width, 16) * ALIGN(height / 2, 8); 13570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = 0; 13670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 13770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* 3 planes */ 13870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YVU420M: 13970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUV422P: 14070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[0] = width * height; 14170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[1] = (width / 2) * (height / 2); 14270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_size[2] = (width / 2) * (height / 2); 14370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 14470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 1456134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::unmatched v4l_pixel_format color_space(0x%x)\n", 14670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang __func__, v4l_pixel_format); 14770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 14870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 14970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 15070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 15170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 15270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 15370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 154e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic int m_exynos_gsc_multiple_of_n( 155e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin int number, int N) 156e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{ 157e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin int result = number; 158e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin switch (N) { 159e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 1: 160e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 2: 161e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 4: 162e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 8: 163e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 16: 164e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 32: 165e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 64: 166e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 128: 167e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case 256: 168e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin result = (number - (number & (N-1))); 169e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 170e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin default: 171e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin result = number - (number % N); 172e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 173e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 174e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return result; 175e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin} 176e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 177e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_src_size( 178e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *w, unsigned int *h, 179e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *crop_x, unsigned int *crop_y, 180e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *crop_w, unsigned int *crop_h, 181e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin int v4l2_colorformat) 182e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{ 183e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) { 184e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", 185e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h); 186e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return false; 187e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 188e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 189e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) { 190e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", 191e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h); 192e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return false; 193e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 194e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 195e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin switch (v4l2_colorformat) { 196e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // YUV420 197e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUV420M: 198e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YVU420M: 199e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV12M: 200e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV12MT: 201e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV21: 202e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV21M: 203e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *w = (*w + 15) & ~15; 204e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *h = (*h + 15) & ~15; 205e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin //*w = m_exynos_gsc_multiple_of_n(*w, 16); 206e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin //*h = m_exynos_gsc_multiple_of_n(*h, 16); 207e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4); 208e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 4); 209e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 210e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // YUV422 211e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUYV: 212e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUV422P: 213e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_UYVY: 214e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV16: 215e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YVYU: 216e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_VYUY: 217e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *h = (*h + 7) & ~7; 218e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin //*h = m_exynos_gsc_multiple_of_n(*h, 8); 219e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 4); 220e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2); 221e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 222e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // RGB 223e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB32: 224e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB24: 225e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB565: 226e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_BGR32: 227e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB555X: 228e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB444: 229e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin default: 230e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *h = (*h + 7) & ~7; 231e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin //*h = m_exynos_gsc_multiple_of_n(*h, 8); 232e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_w = m_exynos_gsc_multiple_of_n(*crop_w, 2); 233e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *crop_h = m_exynos_gsc_multiple_of_n(*crop_h, 2); 234e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 235e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 236e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 237e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return true; 238e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin} 239e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 240e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavinstatic bool m_exynos_gsc_check_dst_size( 241e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *w, unsigned int *h, 242e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *crop_x, unsigned int *crop_y, 243e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *crop_w, unsigned int *crop_h, 244e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin int v4l2_colorformat, 245e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin int rotation) 246e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin{ 247e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *new_w; 248e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *new_h; 249e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *new_crop_w; 250e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin unsigned int *new_crop_h; 251e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 252e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin new_w = w; 253e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin new_h = h; 254e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin new_crop_w = crop_w; 255e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin new_crop_h = crop_h; 256e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 257e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (*w < GSC_MIN_W_SIZE || *h < GSC_MIN_H_SIZE) { 258e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", 259e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin __func__, GSC_MIN_W_SIZE, *w, GSC_MIN_H_SIZE, *h); 260e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return false; 261e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 262e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 263e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (*crop_w < GSC_MIN_W_SIZE || *crop_h < GSC_MIN_H_SIZE) { 264e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::too small size (w : %d < %d) (h : %d < %d)", 265e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin __func__, GSC_MIN_W_SIZE,* crop_w, GSC_MIN_H_SIZE, *crop_h); 266e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return false; 267e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 268e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 269e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin switch (v4l2_colorformat) { 270e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // YUV420 271e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV12M: 272e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV12MT: 273e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV21: 274e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV21M: 275e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUV420M: 276e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YVU420M: 277e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2); 278e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *new_h = m_exynos_gsc_multiple_of_n(*new_h, 2); 279e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 280e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // YUV422 281e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUYV: 282e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YUV422P: 283e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_UYVY: 284e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_NV16: 285e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_YVYU: 286e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_VYUY: 287e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin *new_w = m_exynos_gsc_multiple_of_n(*new_w, 2); 288e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 289e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin // RGB 290e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB32: 291e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB24: 292e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB565: 293e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_BGR32: 294e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB555X: 295e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin case V4L2_PIX_FMT_RGB444: 296e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin default: 297e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin break; 298e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 299e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 300e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return true; 301e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin} 302e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 30370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic int m_exynos_gsc_output_create( 30470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle, 30570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int dev_num, 30670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int out_mode) 30770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 308e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang struct media_device *media0; 30970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *gsc_sd_entity; 31070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *gsc_vd_entity; 31170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *sink_sd_entity; 31270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_link *links; 31370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char node[32]; 31470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char devname[32]; 31570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int cap; 31670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i; 31770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int fd = 0; 318e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 319e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 320e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 32170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((out_mode != GSC_OUT_FIMD) && 32270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang (out_mode != GSC_OUT_TV)) 32370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 32470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 32570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->out_mode = out_mode; 32670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* GSCX => FIMD_WINX : arbitrary linking is not allowed */ 32770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((out_mode == GSC_OUT_FIMD) && 32852cf3b06437639812b555d7a552ead7882bbddfcGreg Hackmann (dev_num > 2)) 32970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 33070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 33170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* media0 */ 33270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(node, "%s%d", PFX_NODE_MEDIADEV, 0); 33370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang media0 = exynos_media_open(node); 33470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (media0 == NULL) { 3356134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_media_open failed (node=%s)", __func__, node); 33670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 33770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 33870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 33970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* Get the sink subdev entity by name and make the node of sink subdev*/ 34070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (out_mode == GSC_OUT_FIMD) 34170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_FIMD_ENTITY, dev_num); 34270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang else 34370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_MXR_ENTITY, 0); 34470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 345e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang sink_sd_entity = exynos_media_get_entity_by_name(media0, devname, strlen(devname)); 34670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sink_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR); 34770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ( sink_sd_entity->fd < 0) { 3486134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:: failed to open sink subdev node", __func__); 34970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto gsc_output_err; 35070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 35170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 35270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* get GSC video dev & sub dev entity by name*/ 35370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num); 35470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_vd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname)); 35570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 35670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num); 35770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_sd_entity= exynos_media_get_entity_by_name(media0, devname, strlen(devname)); 35870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 35970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* gsc sub-dev open */ 36070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_GSC_SUBDEV_ENTITY, dev_num); 36170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_sd_entity->fd = exynos_subdev_open_devname(devname, O_RDWR); 36270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 36370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* setup link : GSC : video device --> sub device */ 36470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < (int) gsc_vd_entity->num_links; i++) { 36570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links = &gsc_vd_entity->links[i]; 36670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 36770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (links == NULL || 36870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links->source->entity != gsc_vd_entity || 36970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links->sink->entity != gsc_sd_entity) { 37070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang continue; 37170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } else if (exynos_media_setup_link(media0, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) { 3726134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed", 37370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang __func__, links->source->entity->info.id, links->sink->entity->info.id); 37470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 37570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 37670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 37770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 37870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* setup link : GSC: sub device --> sink device */ 37970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < (int) gsc_sd_entity->num_links; i++) { 38070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links = &gsc_sd_entity->links[i]; 38170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 38270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (links == NULL || links->source->entity != gsc_sd_entity || 38370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links->sink->entity != sink_sd_entity) { 38470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang continue; 38570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } else if (exynos_media_setup_link(media0, links->source, links->sink, MEDIA_LNK_FL_ENABLED) < 0) { 3866134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_media_setup_link [src.entity=%d->sink.entity=%d] failed", 38770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang __func__, links->source->entity->info.id, links->sink->entity->info.id); 38870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 38970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 39070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 39170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 39270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* gsc video-dev open */ 39370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(devname, PFX_GSC_VIDEODEV_ENTITY, dev_num); 39470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_vd_entity->fd = exynos_v4l2_open_devname(devname, O_RDWR); 39570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang cap = V4L2_CAP_STREAMING | 39670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang V4L2_CAP_VIDEO_OUTPUT_MPLANE; 39770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 39870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_querycap(gsc_vd_entity->fd, cap) == false) { 3996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_querycap() fail", __func__); 40070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto gsc_output_err; 40170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 40270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_sd_entity = gsc_sd_entity; 40370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_vd_entity = gsc_vd_entity; 40470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->sink_sd_entity = sink_sd_entity; 405e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->media0 = media0; 406e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 407e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 408e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 40970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 41070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 41170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changgsc_output_err: 41270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* to do */ 41370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 41470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 41570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 41670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 417e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic int m_exynos_gsc_m2m_create( 41870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int dev) 41970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 42070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int fd = 0; 42170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int video_node_num; 42270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int cap; 42370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char node[32]; 42470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 425e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 426e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 42770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch(dev) { 42870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 0: 42970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang video_node_num = NODE_NUM_GSC_0; 43070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 43170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 1: 43270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang video_node_num = NODE_NUM_GSC_1; 43370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 43470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 2: 43570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang video_node_num = NODE_NUM_GSC_2; 43670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 43770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 3: 43870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang video_node_num = NODE_NUM_GSC_3; 43970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 44070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 4416134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::unexpected dev(%d) fail", __func__, dev); 44270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 44370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 44470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 44570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 44670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(node, "%s%d", PFX_NODE_GSC, video_node_num); 44770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fd = exynos_v4l2_open(node, O_RDWR); 44870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (fd < 0) { 4496134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_open(%s) fail", __func__, node); 45070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 45170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 45270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 45370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang cap = V4L2_CAP_STREAMING | 45470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang V4L2_CAP_VIDEO_OUTPUT_MPLANE | 45570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang V4L2_CAP_VIDEO_CAPTURE_MPLANE; 45670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 45770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_querycap(fd, cap) == false) { 4586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_querycap() fail", __func__); 45970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (0 < fd) 46070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang close(fd); 46170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fd = 0; 46270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 46370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 464e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 465e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 466e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 46770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return fd; 46870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 46970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 47070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 471e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changstatic bool m_exynos_gsc_out_destroy(struct GSC_HANDLE *gsc_handle) 47270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 47370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_link * links; 47470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i; 47570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 476e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 477e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 47870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle == NULL) { 4796134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::gsc_handle is NULL", __func__); 48070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 48170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 48270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 48370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->src.stream_on == true) { 48470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_gsc_out_stop((void *)gsc_handle) < 0) 4856134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_gsc_out_stop() fail", __func__); 48670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 48770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.stream_on = false; 48870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 48970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 490e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang /* unlink : gscaler-out --> fimd */ 49170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < (int) gsc_handle->gsc_sd_entity->num_links; i++) { 49270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links = &gsc_handle->gsc_sd_entity->links[i]; 49370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 49470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (links == NULL || links->source->entity != gsc_handle->gsc_sd_entity || 49570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links->sink->entity != gsc_handle->sink_sd_entity) { 49670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang continue; 49770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } else if (exynos_media_setup_link(gsc_handle->media0, links->source, 49870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang links->sink, 0) < 0) { 4996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_media_setup_unlink [src.entity=%d->sink.entity=%d] failed", 50070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang __func__, links->source->entity->info.id, links->sink->entity->info.id); 50170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 50270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 50370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 50470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang close(gsc_handle->gsc_vd_entity->fd); 50570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang close(gsc_handle->gsc_sd_entity->fd); 50670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_vd_entity->fd = -1; 50770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_vd_entity->fd = -1; 50870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 509e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 510e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 51170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return true; 51270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 51370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 51470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 51570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_destroy( 51670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle) 51770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 518e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 519e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 52033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* just in case, we call stop here because we cannot afford to leave 52133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * secure side protection on if things failed. 52233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin */ 52333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin exynos_gsc_m2m_stop(gsc_handle); 52470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 52570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (0 < gsc_handle->gsc_fd) 52670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang close(gsc_handle->gsc_fd); 52770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_fd = 0; 52870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 529e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 530e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 53170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return true; 53270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 53370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 53470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changbool m_exynos_gsc_find_and_trylock_and_create( 53570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle) 53670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 53770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i = 0; 53870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool flag_find_new_gsc = false; 53970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int total_sleep_time = 0; 54070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 541e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 542e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 54370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang do { 54470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) { 54570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // HACK : HWComposer, HDMI uses gscaler with their own code. 54670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // So, This obj_mutex cannot defense their open() 547e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (i == 0 || i == 3) 54870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang continue; 54970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 55070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_trylock(gsc_handle->obj_mutex[i]) == true) { 55170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 55270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // destroy old one. 55370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang m_exynos_gsc_destroy(gsc_handle); 55470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 55570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // create new one. 55633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->gsc_id = i; 557e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(i); 55870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->gsc_fd < 0) { 55970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_fd = 0; 56070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->obj_mutex[i]); 56170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang continue; 56270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 56370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 564d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen /* Trade temporary object for one in the pool */ 565d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen if (gsc_handle->cur_obj_mutex) { 56670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 567d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen if (gsc_handle->destroy_cur_obj_mutex) 568d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen exynos_mutex_destroy(gsc_handle->cur_obj_mutex); 569d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen } 57070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 571d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen gsc_handle->destroy_cur_obj_mutex = false; 57270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = gsc_handle->obj_mutex[i]; 57370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 57470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang flag_find_new_gsc = true; 57570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 57670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 57770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 57870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 57970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // waiting for another process doesn't use gscaler. 58070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // we need to make decision how to do. 58170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (flag_find_new_gsc == false) { 58270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang usleep(GSC_WAITING_TIME_FOR_TRYLOCK); 58370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK; 5846134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGV("%s::waiting for anthere process doens't use gscaler", __func__); 58570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 58670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 58770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } while( flag_find_new_gsc == false 58870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang && total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK); 58970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 59070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (flag_find_new_gsc == false) 5916134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::we don't have no available gsc.. fail", __func__); 59270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 593e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 594e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 59570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return flag_find_new_gsc; 59670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 59770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 59870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_format( 59970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int fd, 6005f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim struct gsc_info *info) 60170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 602e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 603e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 60470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_requestbuffers req_buf; 60570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int plane_count; 60670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 60770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang plane_count = m_gsc_get_plane_count(info->v4l2_colorformat); 60870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (plane_count < 0) { 6096134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::not supported v4l2_colorformat", __func__); 61070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 61170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 61270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 61370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_ctrl(fd, V4L2_CID_ROTATE, info->rotation) < 0) { 6146134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_ROTATE) fail", __func__); 61570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 61670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 61770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 61870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_ctrl(fd, V4L2_CID_VFLIP, info->flip_horizontal) < 0) { 6196134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_VFLIP) fail", __func__); 62070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 62170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 62270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 62370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_ctrl(fd, V4L2_CID_HFLIP, info->flip_vertical) < 0) { 6246134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_HFLIP) fail", __func__); 62570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 62670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 627bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann 628bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CSC_RANGE, info->csc_range) < 0) { 629bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE) fail", __func__); 630bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann return false; 631bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann } 632e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang info->format.type = info->buf_type; 63370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->format.fmt.pix_mp.width = info->width; 63470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->format.fmt.pix_mp.height = info->height; 63570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->format.fmt.pix_mp.pixelformat = info->v4l2_colorformat; 63670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->format.fmt.pix_mp.field = V4L2_FIELD_ANY; 63770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->format.fmt.pix_mp.num_planes = plane_count; 63870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 63970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_fmt(fd, &info->format) < 0) { 6406134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_fmt() fail", __func__); 64170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 64270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 64370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 64470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->crop.type = info->buf_type; 64570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->crop.c.left = info->crop_left; 64670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->crop.c.top = info->crop_top; 64770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->crop.c.width = info->crop_width; 64870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->crop.c.height = info->crop_height; 64970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 65070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_crop(fd, &info->crop) < 0) { 6516134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_crop() fail", __func__); 65270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 65370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 65470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 65570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_ctrl(fd, V4L2_CID_CACHEABLE, info->cacheable) < 0) { 6566134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__); 65770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 65870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 65970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 66070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang req_buf.count = 1; 66170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang req_buf.type = info->buf_type; 662776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby req_buf.memory = V4L2_MEMORY_DMABUF; 66370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_reqbufs(fd, &req_buf) < 0) { 6646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_reqbufs() fail", __func__); 66570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 66670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 66770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 668e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 669e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 67070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return true; 67170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 67270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 67370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool m_exynos_gsc_set_addr( 67470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int fd, 67570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct gsc_info *info) 67670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 67770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int i; 67870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int plane_size[NUM_OF_GSC_PLANES]; 67970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 68070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang m_gsc_get_plane_size(plane_size, 68170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->width, 68270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->height, 68370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->v4l2_colorformat); 68470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 68570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.index = 0; 6869f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby info->buffer.flags = V4L2_BUF_FLAG_USE_SYNC; 68770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.type = info->buf_type; 688776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby info->buffer.memory = V4L2_MEMORY_DMABUF; 68970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.m.planes = info->planes; 69070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.length = info->format.fmt.pix_mp.num_planes; 6919f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby info->buffer.reserved = info->acquireFenceFd; 69270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 69370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < info->format.fmt.pix_mp.num_planes; i++) { 694776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby info->buffer.m.planes[i].m.fd = (int)info->addr[i]; 69570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.m.planes[i].length = plane_size[i]; 69670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang info->buffer.m.planes[i].bytesused = 0; 69770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 69870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 69970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_qbuf(fd, &info->buffer) < 0) { 7006134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_qbuf() fail", __func__); 70170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 70270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 7039f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby info->buffer_queued = true; 7049f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 7059f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby info->releaseFenceFd = info->buffer.reserved; 70670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 70770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return true; 70870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 70970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 71070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_create( 71170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void) 71270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 71370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i = 0; 71470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int op_id = 0; 71570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char mutex_name[32]; 71670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 717e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 718e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 71970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE)); 72070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle == NULL) { 7216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__); 72270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 72370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 72470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 72570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_fd = 0; 72670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang memset(&gsc_handle->src, 0, sizeof(struct gsc_info)); 72770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang memset(&gsc_handle->dst, 0, sizeof(struct gsc_info)); 72870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 72970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 73070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 73170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 73270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->op_mutex = NULL; 73370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) 73470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->obj_mutex[i] = NULL; 73570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 73670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = NULL; 737d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen gsc_handle->destroy_cur_obj_mutex = false; 73870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_local_path = false; 73970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_exclusive_open = false; 74070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 74170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang srand(time(NULL)); 74270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang op_id = rand() % 1000000; // just make random id 74370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id); 74470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name); 74570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->op_mutex == NULL) { 7466134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name); 74770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 74870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 74970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 75070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 75170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 75270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang // check if it is available 75370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) { 75470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(mutex_name, "%sObject%d", LOG_TAG, i); 75570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 75670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->obj_mutex[i] = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name); 75770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->obj_mutex[i] == NULL) { 7586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name); 75970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 76070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 76170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 76270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 76370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) { 7646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__); 76570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 76670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 76770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 76870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 76970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 77070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 77170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return (void *)gsc_handle; 77270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 77370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr: 77470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle) { 77570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang m_exynos_gsc_destroy(gsc_handle); 77670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 77770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->cur_obj_mutex) 77870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 77970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 78070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) { 78170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((gsc_handle->obj_mutex[i] != NULL) && 782e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) { 78370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false) 7846134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy() fail", __func__); 78570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 78670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 78770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 78870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->op_mutex) 78970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 79070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 79170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->op_mutex) == false) 7926134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__); 79370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 79470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang free(gsc_handle); 79570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 79670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 797e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 798e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 79970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 80070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 80170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 80270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_reserve(int dev_num) 80370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 80470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char mutex_name[32]; 80570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int total_sleep_time = 0; 80670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool gsc_flag = false; 80770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 80870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) { 8096134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num); 81070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 81170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 81270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 81370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE)); 81470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle == NULL) { 8156134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__); 81670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 81770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 81870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 81970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_fd = -1; 82070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->op_mutex = NULL; 82170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = NULL; 822d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen gsc_handle->destroy_cur_obj_mutex = true; 82370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 82470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(mutex_name, "%sObject%d", LOG_TAG, dev_num); 82570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name); 82670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->cur_obj_mutex == NULL) { 8276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name); 82870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 82970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 83070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 83170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang do { 83270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == true) { 83370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_flag = true; 83470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 83570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 83670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang usleep(GSC_WAITING_TIME_FOR_TRYLOCK); 83770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK; 8386134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGV("%s::waiting for another process to release the requested gscaler", __func__); 83970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } while(total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK); 84070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 84170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_flag == true) 84270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return (void *)gsc_handle; 84370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 84470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr: 84570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle) { 84670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang free(gsc_handle); 84770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 84870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 84970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 85070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 85170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 85270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid exynos_gsc_release(void *handle) 85370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 85470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)handle; 85570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 85670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 8576134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 85870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return; 85970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 86070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 86170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 86270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_destroy(gsc_handle->cur_obj_mutex); 86370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang free(gsc_handle); 86470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return; 86570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 86670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 86770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid *exynos_gsc_create_exclusive( 86870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int dev_num, 86970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int mode, 87033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin int out_mode, 87133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin int allow_drm) 87270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 87370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i = 0; 87470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int op_id = 0; 87570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang char mutex_name[32]; 87670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int total_sleep_time = 0; 87770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool gsc_flag = false; 87870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = 0; 879e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 880e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 881e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 88270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((dev_num < 0) || (dev_num >= NUM_OF_GSC_HW)) { 8836134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::fail:: dev_num is not valid(%d) ", __func__, dev_num); 88470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 88570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 88670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 88770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((mode < 0) || (mode >= NUM_OF_GSC_HW)) { 8886134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::fail:: mode is not valid(%d) ", __func__, mode); 88970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 89070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 89170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 89233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* currently only gscalers 0 and 3 are DRM capable */ 89333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (allow_drm && (dev_num != 0 && dev_num != 3)) { 89433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::fail:: gscaler %d does not support drm\n", __func__, 89533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin dev_num); 89633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return NULL; 89733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 89833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 89970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)malloc(sizeof(struct GSC_HANDLE)); 90070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle == NULL) { 9016134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::malloc(struct GSC_HANDLE) fail", __func__); 90270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 90370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 90470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang memset(gsc_handle, 0, sizeof(struct GSC_HANDLE)); 905e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->gsc_fd = -1; 90670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_mode = mode; 90733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->gsc_id = dev_num; 90833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->allow_drm = allow_drm; 90970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 91070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 91170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 91270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 91370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->op_mutex = NULL; 91470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) 91570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->obj_mutex[i] = NULL; 91670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 91770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = NULL; 918d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen gsc_handle->destroy_cur_obj_mutex = false; 91970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_local_path = false; 92070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_exclusive_open = true; 92170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 92270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang srand(time(NULL)); 92370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang op_id = rand() % 1000000; // just make random id 92470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(mutex_name, "%sOp%d", LOG_TAG, op_id); 92570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->op_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_PRIVATE, mutex_name); 92670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->op_mutex == NULL) { 9276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name); 92870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 92970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 93070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 93170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 93270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 93370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sprintf(mutex_name, "%sObject%d", LOG_TAG, dev_num); 93470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->cur_obj_mutex = exynos_mutex_create(EXYNOS_MUTEX_TYPE_SHARED, mutex_name); 93570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->cur_obj_mutex == NULL) { 9366134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_create(%s) fail", __func__, mutex_name); 93770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 93870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 939d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen gsc_handle->destroy_cur_obj_mutex = true; 94070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 94170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang do { 94270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == true) { 94370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (mode == GSC_M2M_MODE) { 944e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->gsc_fd = m_exynos_gsc_m2m_create(dev_num); 945e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (gsc_handle->gsc_fd < 0) { 946e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s::m_exynos_gsc_m2m_create(%i) fail", __func__, dev_num); 947e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang goto err; 948e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 94970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } else if (mode == GSC_OUTPUT_MODE) { 95070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = m_exynos_gsc_output_create(gsc_handle, dev_num, out_mode); 95170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (ret < 0) { 9526134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::m_exynos_gsc_output_create(%i) fail", __func__, dev_num); 95370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto err; 95470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 95570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 95670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /*else 95770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->gsc_fd = m_exynos_gsc_capture_create(dev_num);*/ 958e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 95970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_flag = true; 96070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 96170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 96270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang usleep(GSC_WAITING_TIME_FOR_TRYLOCK); 96370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang total_sleep_time += GSC_WAITING_TIME_FOR_TRYLOCK; 9646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGV("%s::waiting for anthere process doens't use gscaler", __func__); 96570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } while(total_sleep_time < MAX_GSC_WAITING_TIME_FOR_TRYLOCK); 96670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 96770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 968e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (gsc_flag == true) { 969e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 970e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return (void *)gsc_handle; 971e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 97270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 97370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changerr: 97470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle) { 97570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang m_exynos_gsc_destroy(gsc_handle); 97670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 977d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen if (gsc_handle->cur_obj_mutex) { 97870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 979d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen if (gsc_handle->destroy_cur_obj_mutex) 980d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen exynos_mutex_destroy(gsc_handle->cur_obj_mutex); 981d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen } 98270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 98370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) { 98470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((gsc_handle->obj_mutex[i] != NULL) && 985e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) { 98670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false) 9876134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy() fail", __func__); 98870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 98970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 99070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 99170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->op_mutex) 99270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 99370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 99470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->op_mutex) == false) 9956134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__); 99670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 99770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang free(gsc_handle); 99870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 99970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1000e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1001e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 100270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return NULL; 100370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 100470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 100570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changvoid exynos_gsc_destroy( 100670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle) 100770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 100870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i = 0; 100970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle = (struct GSC_HANDLE *)handle; 101070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1011e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1012e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 101370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 10146134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 101570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return; 101670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 101770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 101870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 101970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 102070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->flag_exclusive_open == false) 102170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->cur_obj_mutex); 102270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 102370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->gsc_mode == GSC_OUTPUT_MODE) 1024e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang m_exynos_gsc_out_destroy(gsc_handle); 1025e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang else 1026e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang m_exynos_gsc_destroy(gsc_handle); 102770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 102870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 102970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 103070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_HW; i++) { 103170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if ((gsc_handle->obj_mutex[i] != NULL) && 1032e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang (exynos_mutex_get_created_status(gsc_handle->obj_mutex[i]) == true)) { 103370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->obj_mutex[i]) == false) 10346134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy(obj_mutex) fail", __func__); 103570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 103670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 103770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1038d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen if (gsc_handle->destroy_cur_obj_mutex) 1039d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen exynos_mutex_destroy(gsc_handle->cur_obj_mutex); 1040d1fb36a4395f15f2be77f0af3844169c7a95ebb5Chien-Yu Chen 104170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 104270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 104370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_destroy(gsc_handle->op_mutex) == false) 10446134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_mutex_destroy(op_mutex) fail", __func__); 104570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 104670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle) 104770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang free(gsc_handle); 1048e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1049e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1050e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 105170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 105270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 105370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_format( 105470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 105570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int width, 105670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int height, 105770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_left, 105870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_top, 105970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_width, 106070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_height, 106170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int v4l2_colorformat, 1062e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int cacheable, 1063e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int mode_drm) 106470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 1065e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1066e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 106770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 106870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 106970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 107070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 10716134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 107270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 107370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 107470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 107570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 107670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 107770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.width = width; 107870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.height = height; 107970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.crop_left = crop_left; 108070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.crop_top = crop_top; 108170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.crop_width = crop_width; 108270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.crop_height = crop_height; 108370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.v4l2_colorformat = v4l2_colorformat; 108470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.cacheable = cacheable; 1085e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->src.mode_drm = mode_drm; 1086e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann gsc_handle->src.dirty = true; 108770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 108870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 108970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 109070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1091e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1092e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 109370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 109470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 109570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 109670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_format( 109770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 109870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int width, 109970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int height, 110070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_left, 110170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_top, 110270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_width, 110370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_height, 110470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int v4l2_colorformat, 1105e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int cacheable, 1106bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann unsigned int mode_drm, 1107bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann unsigned int narrowRgb) 110870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 1109e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1110e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 111170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 111270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 111370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 111470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 11156134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 111670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 111770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 111870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 111970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 112070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 112170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.width = width; 112270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.height = height; 112370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.crop_left = crop_left; 112470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.crop_top = crop_top; 112570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.crop_width = crop_width; 112670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.crop_height = crop_height; 112770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.v4l2_colorformat = v4l2_colorformat; 112870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.cacheable = cacheable; 1129e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle->dst.mode_drm = mode_drm; 1130e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann gsc_handle->dst.dirty = true; 1131bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann gsc_handle->dst.csc_range = !narrowRgb; 113270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 113370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 113470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1135e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1136e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return 0; 1137e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang} 1138e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 113970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_rotation( 114070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 114170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int rotation, 114270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int flip_horizontal, 114370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int flip_vertical) 114470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 114570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = -1; 114670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 114770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 114870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 114970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 11506134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 115170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 115270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 115370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 115470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 115570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 115670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int new_rotation = rotation % 360; 115770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 115870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (new_rotation % 90 != 0) { 11596134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::rotation(%d) cannot be acceptable fail", __func__, rotation); 116070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto done; 116170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 116270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 116370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if(new_rotation < 0) 116470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang new_rotation = -new_rotation; 116570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 116670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.rotation = new_rotation; 116770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.flip_horizontal = flip_horizontal; 116870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.flip_vertical = flip_vertical; 116970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 117070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = 0; 117170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone: 117270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 117370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 117470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 117570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 117670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 117770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_src_addr( 117870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 11799f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby void *addr[3], 11809f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby int acquireFenceFd) 118170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 118270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 118370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 118470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1185e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1186e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 118770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 11886134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 118970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 119070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 119170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 119270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 119370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 119470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.addr[0] = addr[0]; 119570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.addr[1] = addr[1]; 119670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.addr[2] = addr[2]; 11979f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->src.acquireFenceFd = acquireFenceFd; 119870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 119970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 120070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1201e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1202e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 120370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 120470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 120570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 120670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_set_dst_addr( 120770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 12089f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby void *addr[3], 12099f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby int acquireFenceFd) 121070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 121170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 121270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 1213994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann int ret = 0; 121470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1215e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1216e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 121770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 12186134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 121970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 122070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 122170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 122270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 122370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 122470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.addr[0] = addr[0]; 122570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.addr[1] = addr[1]; 122670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.addr[2] = addr[2]; 12279f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->dst.acquireFenceFd = acquireFenceFd; 122870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 122970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 123070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 123170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1232e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1233e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1234994ebe9bc7c3b1da00ab8d6c80075cce0da6e47cGreg Hackmann return ret; 123570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 123670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 123770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic void rotateValueHAL2GSC(unsigned int transform, 123870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int *rotate, 123970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int *hflip, 124070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int *vflip) 124170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 124270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int rotate_flag = transform & 0x7; 124370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 0; 124470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *hflip = 0; 124570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *vflip = 0; 124670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 124770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (rotate_flag) { 124870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_ROT_90: 124970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 90; 125070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 125170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_ROT_180: 125270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 180; 125370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 125470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_ROT_270: 125570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 270; 125670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 125770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90: 125870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 90; 125970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *vflip = 1; /* set vflip to compensate the rot & flip order. */ 126070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 126170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90: 126270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *rotate = 90; 126370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *hflip = 1; /* set hflip to compensate the rot & flip order. */ 126470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 126570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_FLIP_H: 126670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *hflip = 1; 126770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 126870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case HAL_TRANSFORM_FLIP_V: 126970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang *vflip = 1; 127070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 127170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 127270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 127370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 127470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 127570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 127670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstatic bool get_plane_size(int V4L2_PIX, 127770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int * size, 127870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int frame_size, 1279e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang int src_planes) 128070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 1281e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int frame_ratio = 1; 128270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int src_bpp = get_yuv_bpp(V4L2_PIX); 128370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 128470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_planes = (src_planes == -1) ? 1 : src_planes; 128570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang frame_ratio = 8 * (src_planes -1) / (src_bpp - 8); 128670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 128770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (src_planes) { 128870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 1: 128970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (V4L2_PIX) { 129070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_BGR32: 129170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB32: 129270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[0] = frame_size << 2; 129370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 129470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_RGB565X: 129570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV16: 129670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV61: 129770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUYV: 129870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_UYVY: 129970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_VYUY: 130070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YVYU: 130170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[0] = frame_size << 1; 130270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 130370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_YUV420: 130470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV12: 130570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case V4L2_PIX_FMT_NV21: 130666e91991f45bf7c56f4993a2c5c2356421017368Sungjoong Kang case V4L2_PIX_FMT_NV21M: 130770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[0] = (frame_size * 3) >> 1; 130870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 130970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 13106134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::invalid color type", __func__); 131170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 131270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 131370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 131470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[1] = 0; 131570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[2] = 0; 131670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 131770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 2: 131870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[0] = frame_size; 131970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[1] = frame_size / frame_ratio; 132070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[2] = 0; 132170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 132270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case 3: 132370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[0] = frame_size; 132470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[1] = frame_size / frame_ratio; 132570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang size[2] = frame_size / frame_ratio; 132670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 132770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 13286134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::invalid color foarmt", __func__); 132970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return false; 133070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 133170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 133270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 133370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return true; 133470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 133570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1336e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_config(void *handle, 1337e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *src_img, 1338e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *dst_img) 1339e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{ 1340e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang struct GSC_HANDLE *gsc_handle; 1341e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang int32_t src_color_space; 1342e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang int32_t dst_color_space; 1343e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang int ret; 1344e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int rotate; 1345e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int hflip; 1346e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int vflip; 1347e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1348e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1349e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1350e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 135133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle == NULL) { 1352e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s::gsc_handle == NULL() fail", __func__); 1353e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return -1; 1354e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 1355e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 135633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if ((src_img->drmMode && !gsc_handle->allow_drm) || 135733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin (src_img->drmMode != dst_img->drmMode)) { 135833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::invalid drm state request for gsc%d (s=%d d=%d)", 135933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin __func__, gsc_handle->gsc_id, 136033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin src_img->drmMode, dst_img->drmMode); 136133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 136233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 136333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 1364e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format); 1365e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format); 1366e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip); 1367e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_set_rotation(gsc_handle, rotate, hflip, vflip); 1368e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1369e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ret = exynos_gsc_set_src_format(gsc_handle, src_img->fw, src_img->fh, 1370e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang src_img->x, src_img->y, src_img->w, src_img->h, 1371e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang src_color_space, src_img->cacheable, src_img->drmMode); 1372e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (ret < 0) { 1373e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s: fail: exynos_gsc_set_src_format [fw %d fh %d x %d y %d w %d h %d f %x rot %d]", 1374e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang __func__, src_img->fw, src_img->fh, src_img->x, src_img->y, src_img->w, src_img->h, 1375e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang src_color_space, src_img->rot); 1376e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return -1; 1377e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 1378e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1379e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ret = exynos_gsc_set_dst_format(gsc_handle, dst_img->fw, dst_img->fh, 1380e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang dst_img->x, dst_img->y, dst_img->w, dst_img->h, 1381bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann dst_color_space, dst_img->cacheable, dst_img->drmMode, 1382bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann dst_img->narrowRgb); 1383e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (ret < 0) { 1384e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s: fail: exynos_gsc_set_dst_format [fw %d fh %d x %d y %d w %d h %d f %x rot %d]", 1385e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang __func__, dst_img->fw, dst_img->fh, dst_img->x, dst_img->y, dst_img->w, dst_img->h, 1386e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang src_color_space, dst_img->rot); 1387e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return -1; 1388e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 1389e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1390e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1391e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1392e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return 0; 1393e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang} 1394e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 139570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_config(void *handle, 1396e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *src_img, 1397e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *dst_img) 139870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 139970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 140070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_format fmt; 140170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_crop crop; 140270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_requestbuffers reqbuf; 140370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_subdev_format sd_fmt; 140470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_subdev_crop sd_crop; 140570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i; 140670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int rotate; 140770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int hflip; 140870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int vflip; 140970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int plane_size[NUM_OF_GSC_PLANES]; 1410cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann bool rgb; 1411bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann int csc_range = !dst_img->narrowRgb; 141270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 141370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_rect dst_rect; 141470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int32_t src_color_space; 141570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int32_t dst_color_space; 141670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int32_t src_planes; 1417e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 141870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 141970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle == NULL) { 14206134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::gsc_handle == NULL() fail", __func__); 142170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 142270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 142370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1424e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1425e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 142670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->src.stream_on != false) { 14276134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("Error: Src is already streamed on !!!!"); 142870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 142970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 143070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1431e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang memcpy(&gsc_handle->src_img, src_img, sizeof(exynos_gsc_img)); 1432e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang memcpy(&gsc_handle->dst_img, dst_img, sizeof(exynos_gsc_img)); 143370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(src_img->format); 143470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang dst_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(dst_img->format); 143570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_planes = get_yuv_planes(src_color_space); 1436ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby src_planes = (src_planes == -1) ? 1 : src_planes; 1437ba718a434c6a2ed414752043c933a4abcc821fc0Benoit Goby rgb = get_yuv_planes(dst_color_space) == -1; 143870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang rotateValueHAL2GSC(dst_img->rot, &rotate, &hflip, &vflip); 143970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1440e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (m_exynos_gsc_check_src_size(&gsc_handle->src_img.fw, &gsc_handle->src_img.fh, 1441e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->src_img.x, &gsc_handle->src_img.y, 1442e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->src_img.w, &gsc_handle->src_img.h, 1443e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin src_color_space) == false) { 1444e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__); 1445e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return -1; 1446e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 1447e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 1448e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (m_exynos_gsc_check_dst_size(&gsc_handle->dst_img.fw, &gsc_handle->dst_img.fh, 1449e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->dst_img.x, &gsc_handle->dst_img.y, 1450e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->dst_img.w, &gsc_handle->dst_img.h, 1451e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin dst_color_space, 1452e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin rotate) == false) { 1453e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__); 1454e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin return -1; 145570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 145670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 145770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /*set: src v4l2_buffer*/ 145870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.src_buf_idx = 0; 145970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.qbuf_cnt = 0; 146070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set format: src pad of GSC sub-dev*/ 146170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_fmt.pad = GSCALER_SUBDEV_PAD_SOURCE; 146270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1463aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (gsc_handle->out_mode == GSC_OUT_FIMD) { 1464aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.width = gsc_handle->dst_img.fw; 1465aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.height = gsc_handle->dst_img.fh; 1466aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } else { 1467aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.width = gsc_handle->dst_img.w; 1468aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.height = gsc_handle->dst_img.h; 1469aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 1470cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann sd_fmt.format.code = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE : 1471cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann V4L2_MBUS_FMT_YUV8_1X24; 147270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_subdev_s_fmt(gsc_handle->gsc_sd_entity->fd, &sd_fmt) < 0) { 14736134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::GSC subdev set format failed", __func__); 147470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 147570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 147670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 147770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set crop: src crop of GSC sub-dev*/ 147870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_crop.pad = GSCALER_SUBDEV_PAD_SOURCE; 147970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1480aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (gsc_handle->out_mode == GSC_OUT_FIMD) { 1481aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.left = gsc_handle->dst_img.x; 1482aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.top = gsc_handle->dst_img.y; 1483aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.width = gsc_handle->dst_img.w; 1484aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.height = gsc_handle->dst_img.h; 1485aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } else { 1486aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.left = 0; 1487aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.top = 0; 1488aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.width = gsc_handle->dst_img.w; 1489aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.height = gsc_handle->dst_img.h; 1490aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 149170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_subdev_s_crop(gsc_handle->gsc_sd_entity->fd, &sd_crop) < 0) { 14926134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::GSC subdev set crop failed", __func__); 149370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 149470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 149570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 149670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* sink pad is connected to GSC out */ 149770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set format: sink sub-dev */ 1498aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (gsc_handle->out_mode == GSC_OUT_FIMD) { 149970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_fmt.pad = FIMD_SUBDEV_PAD_SINK; 1500aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.width = gsc_handle->dst_img.w; 1501aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.height = gsc_handle->dst_img.h; 1502aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } else { 150370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_fmt.pad = MIXER_V_SUBDEV_PAD_SINK; 1504aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.width = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2; 1505aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2; 1506aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 1507e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 150870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1509cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann sd_fmt.format.code = rgb ? V4L2_MBUS_FMT_XRGB8888_4X8_LE : 1510cd63257f03af96d2efa5baaa0b97d9672a79f307Greg Hackmann V4L2_MBUS_FMT_YUV8_1X24; 151170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) { 15126134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad); 151370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 151470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 151570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 151670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set crop: sink sub-dev */ 151770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->out_mode == GSC_OUT_FIMD) 151870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_crop.pad = FIMD_SUBDEV_PAD_SINK; 151970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang else 152070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_crop.pad = MIXER_V_SUBDEV_PAD_SINK; 152170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 152270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1523aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (gsc_handle->out_mode == GSC_OUT_FIMD) { 1524aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.left = gsc_handle->dst_img.x; 1525aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.top = gsc_handle->dst_img.y; 1526aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.width = gsc_handle->dst_img.w; 1527aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.height = gsc_handle->dst_img.h; 1528aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } else { 1529aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.left = 0; 1530aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.top = 0; 1531aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.width = gsc_handle->dst_img.w; 1532aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.height = gsc_handle->dst_img.h; 1533aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 153470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) { 15356134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad); 153670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 153770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 153870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1539aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (gsc_handle->out_mode != GSC_OUT_FIMD) { 1540aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.pad = MIXER_V_SUBDEV_PAD_SOURCE; 1541aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1542aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.width = gsc_handle->dst_img.w + gsc_handle->dst_img.x*2; 1543aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.height = gsc_handle->dst_img.h + gsc_handle->dst_img.y*2; 1544aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.format.code = V4L2_MBUS_FMT_XRGB8888_4X8_LE; 1545aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (exynos_subdev_s_fmt(gsc_handle->sink_sd_entity->fd, &sd_fmt) < 0) { 1546aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby ALOGE("%s::sink:set format failed (PAD=%d)", __func__, sd_fmt.pad); 1547aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby return -1; 1548aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 1549aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby 1550aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_fmt.pad = MIXER_V_SUBDEV_PAD_SOURCE; 1551aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.which = V4L2_SUBDEV_FORMAT_ACTIVE; 1552aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.left = gsc_handle->dst_img.x; 1553aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.top = gsc_handle->dst_img.y; 1554aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.width = gsc_handle->dst_img.w; 1555aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby sd_crop.rect.height = gsc_handle->dst_img.h; 1556aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby if (exynos_subdev_s_crop(gsc_handle->sink_sd_entity->fd, &sd_crop) < 0) { 1557aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby ALOGE("%s::sink: subdev set crop failed(PAD=%d)", __func__, sd_crop.pad); 1558aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby return -1; 1559aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 1560aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby } 1561aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby 156270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /*set GSC ctrls */ 1563e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_ROTATE, rotate) < 0) { 15646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_ROTATE: %d) failed", __func__, rotate); 156570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 156670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 156770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1568e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_HFLIP, hflip) < 0) { 15696134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_HFLIP: %d) failed", __func__, hflip); 157070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 157170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 157270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1573e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_VFLIP, vflip) < 0) { 15746134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_VFLIP: %d) failed", __func__, vflip); 157570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 157670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 157770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1578e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_CACHEABLE, 1) < 0) { 15796134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:: exynos_v4l2_s_ctrl (V4L2_CID_CACHEABLE: 1) failed", __func__); 158070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 158170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 158270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 15830db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, 15840db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim V4L2_CID_CONTENT_PROTECTION, gsc_handle->src_img.drmMode) < 0) { 15850db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", __func__); 15860db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim return -1; 15870db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim } 15880db2e831e9e35fdb6b94fb0ad8454899865767cdSanghee Kim 1589bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann if (exynos_v4l2_s_ctrl(gsc_handle->gsc_vd_entity->fd, V4L2_CID_CSC_RANGE, 1590bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann csc_range)) { 1591bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CSC_RANGE: %d) fail", __func__, 1592bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann csc_range); 1593bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann return -1; 1594bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann } 1595bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann 159670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set src format :GSC video dev*/ 159770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 159870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.fmt.pix_mp.width = gsc_handle->src_img.fw; 159970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.fmt.pix_mp.height = gsc_handle->src_img.fh; 160070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.fmt.pix_mp.pixelformat = src_color_space; 160170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.fmt.pix_mp.field = V4L2_FIELD_NONE; 160270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang fmt.fmt.pix_mp.num_planes = src_planes; 1603e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 160470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_fmt(gsc_handle->gsc_vd_entity->fd, &fmt) < 0) { 16056134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::videodev set format failed", __func__); 160670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 160770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 160870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 160970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* set src crop info :GSC video dev*/ 161070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang crop.type = fmt.type; 161170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang crop.c.left = gsc_handle->src_img.x; 161270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang crop.c.top = gsc_handle->src_img.y; 161370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang crop.c.width = gsc_handle->src_img.w; 161470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang crop.c.height = gsc_handle->src_img.h; 161570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 161670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_s_crop(gsc_handle->gsc_vd_entity->fd, &crop) < 0) { 16176134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::videodev set crop failed", __func__); 161870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 161970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 1620e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 162170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang reqbuf.type = fmt.type; 1622776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby reqbuf.memory = V4L2_MEMORY_DMABUF; 162370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang reqbuf.count = MAX_BUFFERS_GSCALER_OUT; 162470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 162570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) { 16266134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::request buffers failed", __func__); 162770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 162870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 1629e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1630e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1631e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 163270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 163370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 163470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 16355f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Gobystatic int exynos_gsc_out_run(void *handle, 16365f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby exynos_gsc_img *src_img) 163770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 163870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 163970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_plane planes[NUM_OF_GSC_PLANES]; 164070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_buffer buf; 164170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int32_t src_color_space; 164270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int32_t src_planes; 164370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i; 164470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int plane_size[NUM_OF_GSC_PLANES]; 164570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 164670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 164770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 16486134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 164970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 165070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 165170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 16525f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby /* All buffers have been queued, dequeue one */ 16535f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby if (gsc_handle->src.qbuf_cnt == MAX_BUFFERS_GSCALER_OUT) { 16545f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby memset(&buf, 0, sizeof(struct v4l2_buffer)); 16555f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby for (i = 0; i < MAX_BUFFERS_GSCALER_OUT; i++) 16565f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby memset(&planes[i], 0, sizeof(struct v4l2_plane)); 16575f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby 16585f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 16595f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.memory = V4L2_MEMORY_DMABUF; 16605f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.length = src_planes; 16615f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.m.planes = planes; 16625f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby 16635f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby if (exynos_v4l2_dqbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) { 16645f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby ALOGE("%s::dequeue buffer failed (index=%d)(mSrcBufNum=%d)", __func__, 16655f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT); 16665f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby return -1; 16675f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby } 16685f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.qbuf_cnt--; 16695f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby } 16705f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby 167170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang memset(&buf, 0, sizeof(struct v4l2_buffer)); 167270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < NUM_OF_GSC_PLANES; i++) 167370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang memset(&planes[i], 0, sizeof(struct v4l2_plane)); 167470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 167570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_color_space = HAL_PIXEL_FORMAT_2_V4L2_PIX(gsc_handle->src_img.format); 167670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_planes = get_yuv_planes(src_color_space); 167770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang src_planes = (src_planes == -1) ? 1 : src_planes; 167870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 167970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1680776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby buf.memory = V4L2_MEMORY_DMABUF; 16815f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.flags = V4L2_BUF_FLAG_USE_SYNC; 168270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.length = src_planes; 168370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.index = gsc_handle->src.src_buf_idx; 168470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.m.planes = planes; 16855f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby buf.reserved = src_img->acquireFenceFd; 168670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 16875f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.addr[0] = src_img->yaddr; 16885f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.addr[1] = src_img->uaddr; 16895f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.addr[2] = src_img->vaddr; 169070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 169170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (get_plane_size(src_color_space, plane_size, 169270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src_img.fw * gsc_handle->src_img.fh, src_planes) != true) { 16936134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s:get_plane_size:fail", __func__); 169470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 169570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 169670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 169770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang for (i = 0; i < buf.length; i++) { 1698776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby buf.m.planes[i].m.fd = (int)gsc_handle->src.addr[i]; 169970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.m.planes[i].length = plane_size[i]; 170070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang buf.m.planes[i].bytesused = plane_size[i]; 170170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 170270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 170370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang /* Queue the buf */ 170470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_qbuf(gsc_handle->gsc_vd_entity->fd, &buf) < 0) { 17056134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::queue buffer failed (index=%d)(mSrcBufNum=%d)", __func__, 170670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.src_buf_idx, MAX_BUFFERS_GSCALER_OUT); 170770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 170870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 170970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.src_buf_idx++; 17105f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.src_buf_idx = gsc_handle->src.src_buf_idx % MAX_BUFFERS_GSCALER_OUT; 171170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.qbuf_cnt++; 171270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 171370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->src.stream_on == false) { 17145f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby if (exynos_v4l2_streamon(gsc_handle->gsc_vd_entity->fd, buf.type) < 0) { 17155f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby ALOGE("%s::stream on failed", __func__); 17165f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby return -1; 171770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 17185f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.stream_on = true; 171970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 1720e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 17215f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby src_img->releaseFenceFd = buf.reserved; 17225f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby return 0; 172370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 172470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 172570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_out_stop(void *handle) 172670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 172770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 172870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_requestbuffers reqbuf; 172970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_buffer buf; 173070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_plane planes[NUM_OF_GSC_PLANES]; 173170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int i; 173270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1733e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1734e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 173570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 173670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 17376134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 173870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 173970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 1740e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 17415f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby if (gsc_handle->src.stream_on == true) { 17425f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby if (exynos_v4l2_streamoff(gsc_handle->gsc_vd_entity->fd, 17435f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) < 0) { 17445f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby ALOGE("%s::stream off failed", __func__); 17455f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby return -1; 17465f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby } 17475f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby gsc_handle->src.stream_on = false; 174870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 17495f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby 175070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.src_buf_idx = 0; 175170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.qbuf_cnt = 0; 175270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 175370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1754776bd695a6ab0be71a3765a40f9dcec99b0f7f51Benoit Goby reqbuf.memory = V4L2_MEMORY_DMABUF; 175570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang reqbuf.count = 0; 175670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 175770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_reqbufs(gsc_handle->gsc_vd_entity->fd, &reqbuf) < 0) { 17586134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::request buffers failed", __func__); 175970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 176070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 1761e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 1762e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 1763e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 176470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 176570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 176670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 17677b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_run_core(void *handle) 176870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 176970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 177033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin bool is_dirty; 177133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin bool is_drm; 17727b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 177370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 177470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1775e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 1776e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 177770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 17786134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 177970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 178070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 178170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 178233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin is_dirty = gsc_handle->src.dirty || gsc_handle->dst.dirty; 178333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin is_drm = gsc_handle->src.mode_drm; 178433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 178533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (is_dirty && (gsc_handle->src.mode_drm != gsc_handle->dst.mode_drm)) { 178633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s: drm mode mismatch between src and dst, gsc%d (s=%d d=%d)", 178733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin __func__, gsc_handle->gsc_id, gsc_handle->src.mode_drm, 178833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->dst.mode_drm); 178933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 179033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } else if (is_drm && !gsc_handle->allow_drm) { 179133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s: drm mode is not supported on gsc%d", __func__, 179233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->gsc_id); 179333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 179433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 1795e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 1796e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (m_exynos_gsc_check_src_size(&gsc_handle->src.width, &gsc_handle->src.height, 1797e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->src.crop_left, &gsc_handle->src.crop_top, 1798e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->src.crop_width, &gsc_handle->src.crop_height, 1799e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin gsc_handle->src.v4l2_colorformat) == false) { 1800e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::m_exynos_gsc_check_src_size() fail", __func__); 180133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 1802e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin } 1803e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin 1804e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin if (m_exynos_gsc_check_dst_size(&gsc_handle->dst.width, &gsc_handle->dst.height, 1805e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->dst.crop_left, &gsc_handle->dst.crop_top, 1806e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin &gsc_handle->dst.crop_width, &gsc_handle->dst.crop_height, 1807e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin gsc_handle->dst.v4l2_colorformat, 1808e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin gsc_handle->dst.rotation) == false) { 1809e76fa9446516eb7526f66d760c7a77b8dad56739Rebecca Schultz Zavin ALOGE("%s::m_exynos_gsc_check_dst_size() fail", __func__); 181033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 18115f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim } 181270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 181333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* dequeue buffers from previous work if necessary */ 181433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->src.stream_on == true) { 181533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (exynos_gsc_m2m_wait_frame_done(handle) < 0) { 181633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::exynos_gsc_m2m_wait_frame_done fail", __func__); 181733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 181833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 181933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 182033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 182133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* 182233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * need to set the content protection flag before doing reqbufs 182333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * in set_format 182433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin */ 182533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (is_dirty && gsc_handle->allow_drm && is_drm) { 182633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (exynos_v4l2_s_ctrl(gsc_handle->gsc_fd, 182733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin V4L2_CID_CONTENT_PROTECTION, is_drm) < 0) { 182833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::exynos_v4l2_s_ctrl() fail", __func__); 182933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return -1; 183033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 183133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 183233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 183333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* 183433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * from this point on, we have to ensure to call stop to clean up whatever 183533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * state we have set. 183633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin */ 183733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 1838e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann if (gsc_handle->src.dirty) { 1839e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->src) == false) { 1840e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann ALOGE("%s::m_exynos_gsc_set_format(src) fail", __func__); 1841e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann goto done; 1842e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann } 1843e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann gsc_handle->src.dirty = false; 18445f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim } 184570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1846e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann if (gsc_handle->dst.dirty) { 1847e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann if (m_exynos_gsc_set_format(gsc_handle->gsc_fd, &gsc_handle->dst) == false) { 1848e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann ALOGE("%s::m_exynos_gsc_set_format(dst) fail", __func__); 1849e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann goto done; 1850e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann } 1851e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann gsc_handle->dst.dirty = false; 18525f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim } 185370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 185433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* if we are enabling drm, make sure to enable hw protection. 185533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * Need to do this before queuing buffers so that the mmu is reserved 185633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * and power domain is kept on. 185733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin */ 185833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (is_dirty && gsc_handle->allow_drm && is_drm) { 185933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin unsigned int protect_id = 0; 186033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 186133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->gsc_id == 0) { 186233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin protect_id = CP_PROTECT_GSC0; 186333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } else if (gsc_handle->gsc_id == 3) { 186433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin protect_id = CP_PROTECT_GSC3; 186533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } else { 186633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::invalid gscaler id %d for content protection", __func__, 186733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->gsc_id); 186833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin goto done; 186933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 187033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 187133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (CP_Enable_Path_Protection(protect_id) != 0) { 187233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::CP_Enable_Path_Protection failed", __func__); 18739f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby goto done; 18749f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 187533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->protection_enabled = true; 18769f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 18779f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 18785f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->src) == false) { 18795f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim ALOGE("%s::m_exynos_gsc_set_addr(src) fail", __func__); 18805f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim goto done; 18815f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim } 188270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 18835f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim if (m_exynos_gsc_set_addr(gsc_handle->gsc_fd, &gsc_handle->dst) == false) { 18845f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim ALOGE("%s::m_exynos_gsc_set_addr(dst) fail", __func__); 18855f18f78469508e24debe7c804094f963f99f4d20Sanghee Kim goto done; 188670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 188770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 188870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->src.stream_on == false) { 188970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) { 18906134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_streamon(src) fail", __func__); 189170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto done; 189270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 189370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->src.stream_on = true; 189470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 189570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 189670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->dst.stream_on == false) { 189770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_v4l2_streamon(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) { 18986134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::exynos_v4l2_streamon(dst) fail", __func__); 189970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto done; 190070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 190170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->dst.stream_on = true; 190270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 190370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 19047b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_Out(); 19057b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19067b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return 0; 19077b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19087b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songdone: 190933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin exynos_gsc_m2m_stop(handle); 19107b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 19117b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song} 19127b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19137b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songstatic int exynos_gsc_m2m_wait_frame_done(void *handle) 19147b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{ 19157b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song struct GSC_HANDLE *gsc_handle; 19167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song gsc_handle = (struct GSC_HANDLE *)handle; 19187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19197b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_In(); 19207b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19217b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (handle == NULL) { 19227b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::handle == NULL() fail", __func__); 19237b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 19247b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 19257b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if ((gsc_handle->src.stream_on == false) || (gsc_handle->dst.stream_on == false)) { 19277b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s:: src_strean_on or dst_stream_on are false", __func__); 19287b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 19297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 19307b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 19319f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (gsc_handle->src.buffer_queued) { 19329f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->src.buffer) < 0) { 19339f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby ALOGE("%s::exynos_v4l2_dqbuf(src) fail", __func__); 19349f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby return -1; 19359f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 19369f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->src.buffer_queued = false; 193770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 193870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 19399f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (gsc_handle->dst.buffer_queued) { 19409f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (exynos_v4l2_dqbuf(gsc_handle->gsc_fd, &gsc_handle->dst.buffer) < 0) { 19419f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby ALOGE("%s::exynos_v4l2_dqbuf(dst) fail", __func__); 19429f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby return -1; 19439f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 19449f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->dst.buffer_queued = false; 19457b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 19467b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 194743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann Exynos_gsc_Out(); 194843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 194943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann return 0; 195043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann} 195143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 195243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmannstatic int exynos_gsc_m2m_stop(void *handle) 195343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann{ 195443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann struct GSC_HANDLE *gsc_handle; 195543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann struct v4l2_requestbuffers req_buf; 195633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin int ret = 0; 195743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 195843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann gsc_handle = (struct GSC_HANDLE *)handle; 195943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 196043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann Exynos_gsc_In(); 196143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 196233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (!gsc_handle->src.stream_on && !gsc_handle->dst.stream_on) { 196333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* wasn't streaming, return success */ 196433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return 0; 196533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } else if (gsc_handle->src.stream_on != gsc_handle->dst.stream_on) { 196633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s: invalid state, queue stream state doesn't match (%d != %d)", 196733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin __func__, gsc_handle->src.stream_on, gsc_handle->dst.stream_on); 196833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 196933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 197033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 197133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* 197233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * we need to plow forward on errors below to make sure that if we had 197333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * turned on content protection on secure side, we turn it off. 197433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * 197533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * also, if we only failed to turn on one of the streams, we'll turn 197633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin * the other one off correctly. 197733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin */ 197833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->src.stream_on == true) { 197933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->src.buf_type) < 0) { 198033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::exynos_v4l2_streamoff(src) fail", __func__); 198133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 198233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 198333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->src.stream_on = false; 19847b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 19857b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 198633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 198733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->dst.stream_on == true) { 198833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (exynos_v4l2_streamoff(gsc_handle->gsc_fd, gsc_handle->dst.buf_type) < 0) { 198933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::exynos_v4l2_streamoff(dst) fail", __func__); 199033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 199133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 199233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->dst.stream_on = false; 199333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 199433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 199533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin /* if drm is enabled */ 199633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->allow_drm && gsc_handle->protection_enabled) { 199733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin unsigned int protect_id = 0; 199833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 199933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (gsc_handle->gsc_id == 0) 200033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin protect_id = CP_PROTECT_GSC0; 200133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin else if (gsc_handle->gsc_id == 3) 200233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin protect_id = CP_PROTECT_GSC3; 200333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 200433aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin CP_Disable_Path_Protection(protect_id); 200533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin gsc_handle->protection_enabled = false; 200633aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin } 200733aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin 200833aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin if (exynos_v4l2_s_ctrl(gsc_handle->gsc_fd, 200933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin V4L2_CID_CONTENT_PROTECTION, 0) < 0) { 201033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ALOGE("%s::exynos_v4l2_s_ctrl(V4L2_CID_CONTENT_PROTECTION) fail", 201133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin __func__); 201233aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 20137b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20147b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20157b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song /* src: clear_buf */ 20167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.count = 0; 20177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.type = gsc_handle->src.buf_type; 20187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.memory = V4L2_MEMORY_DMABUF; 20197b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) { 20207b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::exynos_v4l2_reqbufs():src: fail", __func__); 202133aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 20227b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20237b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20247b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song /* dst: clear_buf */ 20257b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.count = 0; 20267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.type = gsc_handle->dst.buf_type; 20277b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song req_buf.memory = V4L2_MEMORY_DMABUF; 20287b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (exynos_v4l2_reqbufs(gsc_handle->gsc_fd, &req_buf) < 0) { 20297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::exynos_v4l2_reqbufs():dst: fail", __func__); 203033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin ret = -1; 20317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20337b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_Out(); 20347b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 203533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin return ret; 20367b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song} 20377b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20387b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Songint exynos_gsc_convert( 20397b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song void *handle) 20407b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song{ 20417b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song struct GSC_HANDLE *gsc_handle; 20427b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song int ret = -1; 20437b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song gsc_handle = (struct GSC_HANDLE *)handle; 20447b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20457b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_In(); 20467b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20477b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (handle == NULL) { 20487b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::handle == NULL() fail", __func__); 20497b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 20507b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20517b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20527b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song exynos_mutex_lock(gsc_handle->op_mutex); 20537b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20547b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (gsc_handle->flag_local_path == true) { 20557b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::this exynos_gsc is connected by another hw internaly. So, don't call exynos_gsc_convert()", __func__); 20567b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song goto done; 20577b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20587b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20597b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (exynos_gsc_m2m_run_core(handle) < 0) { 20607b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::exynos_gsc_run_core fail", __func__); 20617b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song goto done; 20627b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song } 20637b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 20647b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song if (exynos_gsc_m2m_wait_frame_done(handle) < 0) { 20657b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::exynos_gsc_m2m_wait_frame_done", __func__); 206670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto done; 206770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 206870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 20699f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (gsc_handle->src.releaseFenceFd >= 0) { 20709f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby close(gsc_handle->src.releaseFenceFd); 20719f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->src.releaseFenceFd = -1; 20729f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 20739f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 20749f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby if (gsc_handle->dst.releaseFenceFd >= 0) { 20759f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby close(gsc_handle->dst.releaseFenceFd); 20769f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby gsc_handle->dst.releaseFenceFd = -1; 20779f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby } 20789f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 207943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann if (exynos_gsc_m2m_stop(handle) < 0) { 208043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann ALOGE("%s::exynos_gsc_m2m_stop", __func__); 208143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann goto done; 208243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann } 208343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 208470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = 0; 208570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 208670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone: 208770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->flag_exclusive_open == false) { 208870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (gsc_handle->flag_local_path == false) 208970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 209070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 209170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 209270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 209370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2094e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2095e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 209670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 209770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 209870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2099e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changint exynos_gsc_m2m_run(void *handle, 2100e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *src_img, 2101e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *dst_img) 2102e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang{ 21039f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby struct GSC_HANDLE *gsc_handle = handle; 2104e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang void *addr[3] = {NULL, NULL, NULL}; 2105e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang int ret = 0; 2106e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2107e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 2108e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2109e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[0] = (void *)src_img->yaddr; 2110e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[1] = (void *)src_img->uaddr; 2111e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[2] = (void *)src_img->vaddr; 21129f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby ret = exynos_gsc_set_src_addr(handle, addr, src_img->acquireFenceFd); 2113e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (ret < 0) { 2114e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s::fail: exynos_gsc_set_src_addr[%x %x %x]", __func__, 2115e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]); 21167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 2117e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 2118e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2119e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[0] = (void *)dst_img->yaddr; 2120e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[1] = (void *)dst_img->uaddr; 2121e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang addr[2] = (void *)dst_img->vaddr; 21229f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby ret = exynos_gsc_set_dst_addr(handle, addr, dst_img->acquireFenceFd); 2123e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (ret < 0) { 2124e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ALOGE("%s::fail: exynos_gsc_set_dst_addr[%x %x %x]", __func__, 2125e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang (unsigned int)addr[0], (unsigned int)addr[1], (unsigned int)addr[2]); 21267b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 2127e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 2128e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 21297b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ret = exynos_gsc_m2m_run_core(handle); 2130e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang if (ret < 0) { 21317b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song ALOGE("%s::fail: exynos_gsc_m2m_run_core", __func__); 21327b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song return -1; 2133e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang } 2134e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2135de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby if (src_img->acquireFenceFd >= 0) { 2136de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby close(src_img->acquireFenceFd); 2137de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby src_img->acquireFenceFd = -1; 2138de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby } 2139de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby 2140de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby if (dst_img->acquireFenceFd >= 0) { 2141de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby close(dst_img->acquireFenceFd); 2142de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby dst_img->acquireFenceFd = -1; 2143de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby } 2144de5fb8eea5a909f0b85d179d0e7336770c9c6c53Benoit Goby 21459f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby src_img->releaseFenceFd = gsc_handle->src.releaseFenceFd; 21469f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby dst_img->releaseFenceFd = gsc_handle->dst.releaseFenceFd; 21479f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby 2148e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2149e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2150e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang return 0; 2151e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang} 2152e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 215370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_config_exclusive(void *handle, 2154e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *src_img, 2155e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *dst_img) 215670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 2157e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2158e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 2159e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 216070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 216170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = 0; 216270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 216370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 21646134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 216570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 216670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 216770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 216870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (gsc_handle->gsc_mode) { 216970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_M2M_MODE: 2170e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ret = exynos_gsc_m2m_config(handle, src_img, dst_img); 217170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 217270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_OUTPUT_MODE: 217370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = exynos_gsc_out_config(handle, src_img, dst_img); 217470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 217570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_CAPTURE_MODE: 217670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang //to do 217770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 217870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 217970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 218070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 2181e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2182e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2183e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 218470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 218570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 218670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 218770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 218870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_run_exclusive(void *handle, 2189e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *src_img, 2190e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img *dst_img) 219170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 219270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 219370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = 0; 21947b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 21957b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_In(); 21967b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 219770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 219870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 21996134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 220070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 220170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 220270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 220370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (gsc_handle->gsc_mode) { 220470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_M2M_MODE: 2205e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang ret = exynos_gsc_m2m_run(handle, src_img, dst_img); 220670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 220770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_OUTPUT_MODE: 22085f54c51bb480c65fd99f56f0dbee3cf31188c91fBenoit Goby ret = exynos_gsc_out_run(handle, src_img); 220970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 221070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_CAPTURE_MODE: 221170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang //to do 221270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 221370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 221470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 221570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 22167b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 22177b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song Exynos_gsc_Out(); 22187b062be72289de0209a8d44e4a9f638539cc6e62Yongbae Song 221970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 222070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 222170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 222243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmannint exynos_gsc_wait_frame_done_exclusive(void *handle) 222343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann{ 222443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann struct GSC_HANDLE *gsc_handle; 222543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann int ret = 0; 222643b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann gsc_handle = (struct GSC_HANDLE *)handle; 222743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 222843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann Exynos_gsc_In(); 222943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 223043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann if (handle == NULL) { 223143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann ALOGE("%s::handle == NULL() fail", __func__); 223243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann return -1; 223343b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann } 223443b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 223543b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann if (gsc_handle->gsc_mode == GSC_M2M_MODE) 223643b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann ret = exynos_gsc_m2m_wait_frame_done(handle); 223743b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 223843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann Exynos_gsc_Out(); 223943b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 224043b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann return ret; 224143b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann} 224243b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann 224370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_stop_exclusive(void *handle) 224470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 224570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 224670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = 0; 224770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 2248e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2249e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 2250e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 225170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 22526134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 225370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 225470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 225570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 225670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang switch (gsc_handle->gsc_mode) { 225770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_M2M_MODE: 225843b5926cd6217d097b344acb1412feff1222e4d2Greg Hackmann ret = exynos_gsc_m2m_stop(handle); 225970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 226070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_OUTPUT_MODE: 226170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = exynos_gsc_out_stop(handle); 226270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 226370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang case GSC_CAPTURE_MODE: 226470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang //to do 226570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang break; 226670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang default: 2267e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang break; 226870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 2269e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 2270e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2271e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 227270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 227370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 227470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 227570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_connect( 227670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 227770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *hw) 227870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 227970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 228070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int ret = -1; 228170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 228270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2283e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 2284e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 228570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 22866134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 228770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 228870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 228970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 229070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 229170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 229270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_local_path = true; 229370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 229470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (exynos_mutex_trylock(gsc_handle->cur_obj_mutex) == false) { 229570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (m_exynos_gsc_find_and_trylock_and_create(gsc_handle) == false) { 22966134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::m_exynos_gsc_find_and_trylock_and_create() fail", __func__); 229770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang goto done; 229870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 229970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 230070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 230170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang ret = 0; 230270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2303e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2304e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 230570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changdone: 230670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 230770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 230870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return ret; 230970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 231070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 231170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changint exynos_gsc_disconnect( 231270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *handle, 231370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *hw) 231470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang{ 231570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct GSC_HANDLE *gsc_handle; 231670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle = (struct GSC_HANDLE *)handle; 231770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2318e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_In(); 2319e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 232070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang if (handle == NULL) { 23216134b8bbccf63f722120ad2ff24b5ab629b8e269Dima Zavin ALOGE("%s::handle == NULL() fail", __func__); 232270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return -1; 232370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang } 232470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 232570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_lock(gsc_handle->op_mutex); 232670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 232770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang gsc_handle->flag_local_path = false; 232870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 232970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->cur_obj_mutex); 233070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 233170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang exynos_mutex_unlock(gsc_handle->op_mutex); 233270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2333e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang Exynos_gsc_Out(); 2334e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang 233570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang return 0; 233670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 2337