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