170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang/* 270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Copyright@ Samsung Electronics Co. LTD 370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * you may not use this file except in compliance with the License. 670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * You may obtain a copy of the License at 770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * http://www.apache.org/licenses/LICENSE-2.0 970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * 1070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * Unless required by applicable law or agreed to in writing, software 1170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * See the License for the specific language governing permissions and 1470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang * limitations under the License. 1570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang*/ 1670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 1770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#ifndef EXYNOS_GSC_H_ 1870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define EXYNOS_GSC_H_ 1970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#ifdef __cplusplus 2170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changextern "C" { 2270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#endif 2370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang//#define LOG_NDEBUG 0 2570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define LOG_TAG "libexynosgscaler" 2670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <cutils/log.h> 2770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 2870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <sys/types.h> 2970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <sys/ioctl.h> 3070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <videodev2.h> 3170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <fcntl.h> 3270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <stdbool.h> 3370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <string.h> 3470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <unistd.h> 3570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <stdio.h> 3670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <stdlib.h> 3770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <time.h> 3870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include <system/graphics.h> 3970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "exynos_gscaler.h" 4070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 4170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "exynos_format.h" 4270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "ExynosMutex.h" 4370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#include "exynos_v4l2.h" 4470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 4570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang//#include "ExynosBuffer.h" 4670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 4770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NUM_OF_GSC_PLANES (3) 4870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define MAX_BUFFERS_GSCALER_OUT (3) 4970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSCALER_SUBDEV_PAD_SINK (0) 5070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSCALER_SUBDEV_PAD_SOURCE (1) 5170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define MIXER_V_SUBDEV_PAD_SINK (0) 52aad0a4c53f4bcea7c780530175b58469a12cb332Benoit Goby#define MIXER_V_SUBDEV_PAD_SOURCE (3) 5370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define FIMD_SUBDEV_PAD_SINK (0) 5470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define MAX_BUFFERS (6) 5570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 5670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NUM_OF_GSC_HW (4) 5770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NODE_NUM_GSC_0 (23) 5870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NODE_NUM_GSC_1 (26) 5970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NODE_NUM_GSC_2 (29) 6070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define NODE_NUM_GSC_3 (32) 6170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 6270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_NODE_GSC "/dev/video" 6370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_NODE_MEDIADEV "/dev/media" 6470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_MXR_ENTITY "s5p-mixer%d" 6570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_FIMD_ENTITY "s3c-fb-window%d" 6670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_GSC_VIDEODEV_ENTITY "exynos-gsc.%d.output" 6770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_GSC_SUBDEV_ENTITY "exynos-gsc-sd.%d" 6870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define PFX_SUB_DEV "/dev/v4l-subdev%d" 6970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_VD_PAD_SOURCE 0 7070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_SD_PAD_SINK 0 7170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_SD_PAD_SOURCE 1 7270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_OUT_PAD_SINK 0 73e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang//#define GSC_OUT_DMA_BLOCKING 74e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang//#define GSC_OUT_DELAYED_STREAMON 7570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 7670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_VERSION GSC_EVT1 7770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 7870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#if (GSC_VERSION == GSC_EVT0) 7970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_MIN_W_SIZE (64) 8070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_MIN_H_SIZE (32) 8170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#else 8270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_MIN_W_SIZE (32) 8370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_MIN_H_SIZE (8) 8470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#endif 8570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 8670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define MAX_GSC_WAITING_TIME_FOR_TRYLOCK (16000) // 16msec 8770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#define GSC_WAITING_TIME_FOR_TRYLOCK (8000) // 8msec 8870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 8970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstruct gsc_info { 9070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int width; 9170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int height; 9270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_left; 9370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_top; 9470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_width; 9570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int crop_height; 9670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int v4l2_colorformat; 9770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang unsigned int cacheable; 98e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang unsigned int mode_drm; 9970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 10070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int rotation; 10170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int flip_horizontal; 10270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int flip_vertical; 103bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann bool csc_range; 104e2426aa8c1247ff3369f9903e25b9a94503fca46Greg Hackmann bool dirty; 10570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 10670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *addr[NUM_OF_GSC_PLANES]; 1079f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby int acquireFenceFd; 1089f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby int releaseFenceFd; 10970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool stream_on; 11070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 11170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang enum v4l2_buf_type buf_type; 11270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_format format; 11370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_buffer buffer; 1149f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby bool buffer_queued; 11570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_plane planes[NUM_OF_GSC_PLANES]; 11670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct v4l2_crop crop; 11770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int src_buf_idx; 11870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int qbuf_cnt; 11970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}; 12070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 12170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Changstruct GSC_HANDLE { 12270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int gsc_fd; 12333aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin int gsc_id; 12470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct gsc_info src; 12570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct gsc_info dst; 126e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img src_img; 127e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Chang exynos_gsc_img dst_img; 12870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *op_mutex; 12970007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *obj_mutex[NUM_OF_GSC_HW]; 13070007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang void *cur_obj_mutex; 13170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool flag_local_path; 13270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang bool flag_exclusive_open; 13370007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_device *media0; 13470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *gsc_sd_entity; 13570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *gsc_vd_entity; 13670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang struct media_entity *sink_sd_entity; 13770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int gsc_mode; 13870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang int out_mode; 13933aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin bool allow_drm; 14033aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin bool protection_enabled; 14170007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang}; 14270007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 143e6a0625be3962fd12a9fbdb9f6dfb2c40a46b902Jiho Changextern int exynos_gsc_out_stop(void *handle); 14470007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#ifdef __cplusplus 14570007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang} 14670007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#endif 14770007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang 14870007c4e11bff0d255cdaddb753fddf8508ce08aJiho Chang#endif //__EXYNOS_MUTEX_H__ 149