blob: ffbdcd20593cca4cfe8aebf8afd40028abfb7807 [file] [log] [blame]
/*
* include/linux/amlogic/media/amvecm/amvecm.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef AMVECM_H
#define AMVECM_H
#include "linux/amlogic/media/amvecm/ve.h"
#include "linux/amlogic/media/amvecm/cm.h"
#include <linux/amlogic/media/vfm/vframe.h>
#include <linux/amlogic/media/utils/amstream.h>
#include <linux/amlogic/cpu_version.h>
#include <drm/drmP.h>
/* struct ve_dnlp_s video_ve_dnlp; */
#define FLAG_RSV31 (1 << 31)
#define FLAG_VADJ1_COLOR (1 << 30)
#define FLAG_VE_DNLP (1 << 29)
#define FLAG_VE_NEW_DNLP (1 << 28)
#define FLAG_VE_LC_CURV (1 << 27)
#define FLAG_RSV26 (1 << 26)
#define FLAG_3D_BLACK_DIS (1 << 25)
#define FLAG_3D_BLACK_EN (1 << 24)
#define FLAG_3D_SYNC_DIS (1 << 23)
#define FLAG_3D_SYNC_EN (1 << 22)
#define FLAG_VLOCK_DIS (1 << 21)
#define FLAG_VLOCK_EN (1 << 20)
#define FLAG_VE_DNLP_EN (1 << 19)
#define FLAG_VE_DNLP_DIS (1 << 18)
#define FLAG_VADJ1_CON (1 << 17)
#define FLAG_VADJ1_BRI (1 << 16)
#define FLAG_GAMMA_TABLE_EN (1 << 15)
#define FLAG_GAMMA_TABLE_DIS (1 << 14)
#define FLAG_GAMMA_TABLE_R (1 << 13)
#define FLAG_GAMMA_TABLE_G (1 << 12)
#define FLAG_GAMMA_TABLE_B (1 << 11)
#define FLAG_RGB_OGO (1 << 10)
#define FLAG_RSV9 (1 << 9)
#define FLAG_MATRIX_UPDATE (1 << 8)
#define FLAG_BRI_CON (1 << 7)
#define FLAG_LVDS_FREQ_SW (1 << 6)
#define FLAG_REG_MAP5 (1 << 5)
#define FLAG_REG_MAP4 (1 << 4)
#define FLAG_REG_MAP3 (1 << 3)
#define FLAG_REG_MAP2 (1 << 2)
#define FLAG_REG_MAP1 (1 << 1)
#define FLAG_REG_MAP0 (1 << 0)
#define VPP_VADJ2_BLMINUS_EN (1 << 3)
#define VPP_VADJ2_EN (1 << 2)
#define VPP_VADJ1_BLMINUS_EN (1 << 1)
#define VPP_VADJ1_EN (1 << 0)
#define VPP_DEMO_DNLP_DIS (1 << 3)
#define VPP_DEMO_DNLP_EN (1 << 2)
#define VPP_DEMO_CM_DIS (1 << 1)
#define VPP_DEMO_CM_EN (1 << 0)
/*PQ USER LATCH*/
#define PQ_USER_SR1_DERECTION_DIS (1 << 19)
#define PQ_USER_SR1_DERECTION_EN (1 << 18)
#define PQ_USER_SR0_DERECTION_DIS (1 << 17)
#define PQ_USER_SR0_DERECTION_EN (1 << 16)
#define PQ_USER_SR1_DEJAGGY_DIS (1 << 15)
#define PQ_USER_SR1_DEJAGGY_EN (1 << 14)
#define PQ_USER_SR0_DEJAGGY_DIS (1 << 13)
#define PQ_USER_SR0_DEJAGGY_EN (1 << 12)
#define PQ_USER_SR1_DERING_DIS (1 << 11)
#define PQ_USER_SR1_DERING_EN (1 << 10)
#define PQ_USER_SR0_DERING_DIS (1 << 9)
#define PQ_USER_SR0_DERING_EN (1 << 8)
#define PQ_USER_SR1_PK_DIS (1 << 7)
#define PQ_USER_SR1_PK_EN (1 << 6)
#define PQ_USER_SR0_PK_DIS (1 << 5)
#define PQ_USER_SR0_PK_EN (1 << 4)
#define PQ_USER_BLK_SLOPE (1 << 3)
#define PQ_USER_BLK_START (1 << 2)
#define PQ_USER_BLK_DIS (1 << 1)
#define PQ_USER_BLK_EN (1 << 0)
/*white balance latch*/
#define MTX_BYPASS_RGB_OGO (1 << 0)
#define MTX_RGB2YUVL_RGB_OGO (1 << 1)
#define SDR_SOURCE (1 << 0)
#define HDR10_SOURCE (1 << 1)
#define HLG_SOURCE (1 << 2)
enum cm_hist_e {
CM_HUE_HIST = 0,
CM_SAT_HIST,
CM_MAX_HIST
};
enum pq_table_name_e {
TABLE_NAME_SHARPNESS0 = 0x1,/*in vpp*/
TABLE_NAME_SHARPNESS1 = 0x2,/*in vpp*/
TABLE_NAME_DNLP = 0x4, /*in vpp*/
TABLE_NAME_CM = 0x8, /*in vpp*/
TABLE_NAME_BLK_BLUE_EXT = 0x10,/*in vpp*/
TABLE_NAME_BRIGHTNESS = 0x20,/*in vpp*/
TABLE_NAME_CONTRAST = 0x40, /*in vpp*/
TABLE_NAME_SATURATION_HUE = 0x80,/*in vpp*/
TABLE_NAME_CVD2 = 0x100, /*in tvafe*/
TABLE_NAME_DI = 0x200, /*in di*/
TABLE_NAME_NR = 0x400, /*in di*/
TABLE_NAME_MCDI = 0x800, /*in di*/
TABLE_NAME_DEBLOCK = 0x1000, /*in di*/
TABLE_NAME_DEMOSQUITO = 0x2000,/*in di*/
TABLE_NAME_WB = 0X4000, /*in vpp*/
TABLE_NAME_GAMMA = 0X8000, /*in vpp*/
TABLE_NAME_XVYCC = 0x10000, /*in vpp*/
TABLE_NAME_HDR = 0x20000, /*in vpp*/
TABLE_NAME_DOLBY_VISION = 0x40000,/*in vpp*/
TABLE_NAME_OVERSCAN = 0x80000,
TABLE_NAME_RESERVED1 = 0x100000,
TABLE_NAME_RESERVED2 = 0x200000,
TABLE_NAME_RESERVED3 = 0x400000,
TABLE_NAME_RESERVED4 = 0x800000,
TABLE_NAME_MAX,
};
#define _VE_CM 'C'
#define AMVECM_IOC_G_HIST_AVG _IOW(_VE_CM, 0x22, struct ve_hist_s)
#define AMVECM_IOC_VE_DNLP_EN _IO(_VE_CM, 0x23)
#define AMVECM_IOC_VE_DNLP_DIS _IO(_VE_CM, 0x24)
#define AMVECM_IOC_VE_NEW_DNLP _IOW(_VE_CM, 0x25, struct ve_dnlp_curve_param_s)
#define AMVECM_IOC_G_HIST_BIN _IOW(_VE_CM, 0x26, struct vpp_hist_param_s)
#define AMVECM_IOC_G_HDR_METADATA _IOW(_VE_CM, 0x27, struct hdr_metadata_info_s)
/*vpp get color primary*/
#define AMVECM_IOC_G_COLOR_PRI _IOR(_VE_CM, 0x28, enum color_primary_e)
/* VPP.CM IOCTL command list */
#define AMVECM_IOC_LOAD_REG _IOW(_VE_CM, 0x30, struct am_regs_s)
/* VPP.GAMMA IOCTL command list */
#define AMVECM_IOC_GAMMA_TABLE_EN _IO(_VE_CM, 0x40)
#define AMVECM_IOC_GAMMA_TABLE_DIS _IO(_VE_CM, 0x41)
#define AMVECM_IOC_GAMMA_TABLE_R _IOW(_VE_CM, 0x42, struct tcon_gamma_table_s)
#define AMVECM_IOC_GAMMA_TABLE_G _IOW(_VE_CM, 0x43, struct tcon_gamma_table_s)
#define AMVECM_IOC_GAMMA_TABLE_B _IOW(_VE_CM, 0x44, struct tcon_gamma_table_s)
#define AMVECM_IOC_S_RGB_OGO _IOW(_VE_CM, 0x45, struct tcon_rgb_ogo_s)
#define AMVECM_IOC_G_RGB_OGO _IOR(_VE_CM, 0x46, struct tcon_rgb_ogo_s)
/*VPP.VLOCK IOCTL command list*/
#define AMVECM_IOC_VLOCK_EN _IO(_VE_CM, 0x47)
#define AMVECM_IOC_VLOCK_DIS _IO(_VE_CM, 0x48)
/*VPP.3D-SYNC IOCTL command list*/
#define AMVECM_IOC_3D_SYNC_EN _IO(_VE_CM, 0x49)
#define AMVECM_IOC_3D_SYNC_DIS _IO(_VE_CM, 0x50)
struct ve_pq_load_s {
enum pq_table_name_e param_id;
unsigned int length;
union {
void *param_ptr;
long long param_ptr_len;
};
union {
void *reserved;
long long reserved_len;
};
};
struct ve_pq_table_s {
unsigned int src_timing;
unsigned int value1;
unsigned int value2;
unsigned int reserved1;
unsigned int reserved2;
};
#define AMVECM_IOC_SET_OVERSCAN _IOW(_VE_CM, 0x52, struct ve_pq_load_s)
enum dnlp_state_e {
DNLP_OFF = 0,
DNLP_ON,
};
/*DNLP IOCTL command list*/
#define AMVECM_IOC_G_DNLP_STATE _IOR(_VE_CM, 0x53, enum dnlp_state_e)
#define AMVECM_IOC_S_DNLP_STATE _IOW(_VE_CM, 0x54, enum dnlp_state_e)
enum pc_mode_e {
PCMODE_OFF = 0,
PCMODE_ON,
};
/*PCMODE IOCTL command list*/
#define AMVECM_IOC_G_PQMODE _IOR(_VE_CM, 0x55, enum pc_mode_e)
#define AMVECM_IOC_S_PQMODE _IOW(_VE_CM, 0x56, enum pc_mode_e)
/*CUR_CSCTYPE IOCTL command list*/
#define AMVECM_IOC_G_CSCTYPE _IOR(_VE_CM, 0x57, enum vpp_matrix_csc_e)
#define AMVECM_IOC_S_CSCTYPE _IOW(_VE_CM, 0x58, enum vpp_matrix_csc_e)
/*PIC_MODE IOCTL command list*/
#define AMVECM_IOC_G_PIC_MODE _IOR(_VE_CM, 0x59, struct am_vdj_mode_s)
#define AMVECM_IOC_S_PIC_MODE _IOW(_VE_CM, 0x60, struct am_vdj_mode_s)
/*HDR TYPE command list*/
#define AMVECM_IOC_G_HDR_TYPE _IOR(_VE_CM, 0x61, enum hdr_type_e)
/*Local contrast command list*/
#define AMVECM_IOC_S_LC_CURVE _IOW(_VE_CM, 0x62, struct ve_lc_curve_parm_s)
struct am_vdj_mode_s {
int flag;
int brightness;
int brightness2;
int saturation_hue;
int saturation_hue_post;
int contrast;
int contrast2;
};
enum color_primary_e {
VPP_COLOR_PRI_NULL = 0,
VPP_COLOR_PRI_BT601,
VPP_COLOR_PRI_BT709,
VPP_COLOR_PRI_BT2020,
VPP_COLOR_PRI_MAX,
};
enum vpp_matrix_csc_e {
VPP_MATRIX_NULL = 0,
VPP_MATRIX_RGB_YUV601 = 0x1,
VPP_MATRIX_RGB_YUV601F = 0x2,
VPP_MATRIX_RGB_YUV709 = 0x3,
VPP_MATRIX_RGB_YUV709F = 0x4,
VPP_MATRIX_YUV601_RGB = 0x10,
VPP_MATRIX_YUV601_YUV601F = 0x11,
VPP_MATRIX_YUV601_YUV709 = 0x12,
VPP_MATRIX_YUV601_YUV709F = 0x13,
VPP_MATRIX_YUV601F_RGB = 0x14,
VPP_MATRIX_YUV601F_YUV601 = 0x15,
VPP_MATRIX_YUV601F_YUV709 = 0x16,
VPP_MATRIX_YUV601F_YUV709F = 0x17,
VPP_MATRIX_YUV709_RGB = 0x20,
VPP_MATRIX_YUV709_YUV601 = 0x21,
VPP_MATRIX_YUV709_YUV601F = 0x22,
VPP_MATRIX_YUV709_YUV709F = 0x23,
VPP_MATRIX_YUV709F_RGB = 0x24,
VPP_MATRIX_YUV709F_YUV601 = 0x25,
VPP_MATRIX_YUV709F_YUV709 = 0x26,
VPP_MATRIX_YUV601L_YUV709L = 0x27,
VPP_MATRIX_YUV709L_YUV601L = 0x28,
VPP_MATRIX_YUV709F_YUV601F = 0x29,
VPP_MATRIX_BT2020YUV_BT2020RGB = 0x40,
VPP_MATRIX_BT2020RGB_709RGB,
VPP_MATRIX_BT2020RGB_CUSRGB,
VPP_MATRIX_BT2020YUV_BT2020RGB_DYNAMIC = 0x50,
VPP_MATRIX_DEFAULT_CSCTYPE = 0xffff,
};
enum hdr_type_e {
HDRTYPE_NONE = 0,
HDRTYPE_SDR = 0x1,
HDRTYPE_HDR10 = 0x2,
HDRTYPE_HLG = 0x4,
HDRTYPE_MAX,
};
enum vpp_transfer_characteristic_e {
VPP_ST_NULL = 0,
VPP_ST709 = 0x1,
VPP_ST2084 = 0x2,
VPP_ST2094_40 = 0x4,
};
enum ve_source_input_e {
SOURCE_INVALID = -1,
SOURCE_TV = 0,
SOURCE_AV1,
SOURCE_AV2,
SOURCE_YPBPR1,
SOURCE_YPBPR2,
SOURCE_HDMI1,
SOURCE_HDMI2,
SOURCE_HDMI3,
SOURCE_HDMI4,
SOURCE_VGA,
SOURCE_MPEG,
SOURCE_DTV,
SOURCE_SVIDEO,
SOURCE_IPTV,
SOURCE_DUMMY,
SOURCE_SPDIF,
SOURCE_ADTV,
SOURCE_MAX,
};
/*pq_timing:
*SD/HD/FHD/UHD for DTV/MEPG,
*NTST_M/NTST_443/PAL_I/PAL_M/PAL_60/PAL_CN/SECAM/NTST_50 for AV/ATV
*/
enum ve_pq_timing_e {
TIMING_SD = 0,
TIMING_HD,
TIMING_FHD,
TIMING_UHD,
TIMING_NTST_M,
TIMING_NTST_443,
TIMING_PAL_I,
TIMING_PAL_M,
TIMING_PAL_60,
TIMING_PAL_CN,
TIMING_SECAM,
TIMING_NTSC_50,
TIMING_MAX,
};
enum vlock_hw_ver_e {
/*gxtvbb*/
vlock_hw_org,
/*
*txl
*txlx
*/
vlock_hw_ver1,
/* tl1 later
* fix bug:i problem
* fix bug:affect ss function
* add: phase lock
*/
vlock_hw_ver2,
};
struct vecm_match_data_s {
u32 vlk_support;
u32 vlk_new_fsm;
enum vlock_hw_ver_e vlk_hwver;
u32 vlk_phlock_en;
};
/*overscan:
*length 0~31bit :number of crop;
*src_timing: bit31: on: load/save all crop
bit31: off: load one according to timing*
bit30: AFD_enable: 1 -> on; 0 -> off*
screen mode: bit24~bit29*
source: bit16~bit23 -> source*
timing: bit0~bit15 -> sd/hd/fhd/uhd*
*value1: 0~15bit hs 16~31bit he*
*value2: 0~15bit vs 16~31bit ve*
*/
struct ve_pq_overscan_s {
unsigned int load_flag;
unsigned int afd_enable;
unsigned int screen_mode;
enum ve_source_input_e source;
enum ve_pq_timing_e timing;
unsigned int hs;
unsigned int he;
unsigned int vs;
unsigned int ve;
};
extern struct ve_pq_overscan_s overscan_table[TIMING_MAX];
#define _DI_ 'D'
struct am_pq_parm_s {
unsigned int table_name;
unsigned int table_len;
union {
void *table_ptr;
long long l_table;
};
union {
void *reserved;
long long l_reserved;
};
};
#define AMDI_IOC_SET_PQ_PARM _IOW(_DI_, 0x51, struct am_pq_parm_s)
/* #if (MESON_CPU_TYPE >= MESON_CPU_TYPE_MESON8) */
/* #define WRITE_VPP_REG(x,val)*/
/* WRITE_VCBUS_REG(x,val) */
/* #define WRITE_VPP_REG_BITS(x,val,start,length)*/
/* WRITE_VCBUS_REG_BITS(x,val,start,length) */
/* #define READ_VPP_REG(x)*/
/* READ_VCBUS_REG(x) */
/* #define READ_VPP_REG_BITS(x,start,length)*/
/* READ_VCBUS_REG_BITS(x,start,length) */
/* #else */
/* #define WRITE_VPP_REG(x,val)*/
/* WRITE_CBUS_REG(x,val) */
/* #define WRITE_VPP_REG_BITS(x,val,start,length)*/
/* WRITE_CBUS_REG_BITS(x,val,start,length) */
/* #define READ_VPP_REG(x)*/
/* READ_CBUS_REG(x) */
/* #define READ_VPP_REG_BITS(x,start,length)*/
/* READ_CBUS_REG_BITS(x,start,length) */
/* #endif */
static inline void WRITE_VPP_REG(uint32_t reg,
const uint32_t value)
{
aml_write_vcbus(reg, value);
}
static inline uint32_t READ_VPP_REG(uint32_t reg)
{
return aml_read_vcbus(reg);
}
static inline void WRITE_VPP_REG_BITS(uint32_t reg,
const uint32_t value,
const uint32_t start,
const uint32_t len)
{
WRITE_VPP_REG(reg, ((READ_VPP_REG(reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t READ_VPP_REG_BITS(uint32_t reg,
const uint32_t start,
const uint32_t len)
{
uint32_t val;
val = ((READ_VPP_REG(reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
extern signed int vd1_brightness, vd1_contrast;
extern bool gamma_en;
extern unsigned int atv_source_flg;
extern enum hdr_type_e hdr_source_type;
extern bool gamma_working;
#define CSC_FLAG_TOGGLE_FRAME 1
#define CSC_FLAG_CHECK_OUTPUT 2
extern int amvecm_on_vs(
struct vframe_s *display_vf,
struct vframe_s *toggle_vf,
int flags,
unsigned int sps_h_en,
unsigned int sps_v_en);
extern void refresh_on_vs(struct vframe_s *vf);
extern void pc_mode_process(void);
extern void pq_user_latch_process(void);
extern void vlock_process(struct vframe_s *vf);
/* master_display_info for display device */
struct hdr_metadata_info_s {
u32 primaries[3][2]; /* normalized 50000 in G,B,R order */
u32 white_point[2]; /* normalized 50000 */
u32 luminance[2]; /* max/min lumin, normalized 10000 */
};
extern void vpp_vd_adj1_saturation_hue(signed int sat_val,
signed int hue_val, struct vframe_s *vf);
extern void amvecm_sharpness_enable(int sel);
extern int metadata_read_u32(uint32_t *value);
extern int metadata_wait(struct vframe_s *vf);
extern int metadata_sync(uint32_t frame_id, uint64_t pts);
extern void amvecm_wakeup_queue(void);
extern int amvecm_drm_get_gamma_size(u32 index);
extern void amvecm_drm_init(u32 index);
extern int amvecm_drm_gamma_set(u32 index,
struct drm_color_lut *lut, int lut_size);
extern int amvecm_drm_gamma_get(u32 index, u16 *red, u16 *green, u16 *blue);
extern int amvecm_drm_gamma_enable(u32 index);
extern int amvecm_drm_gamma_disable(u32 index);
extern int am_meson_ctm_set(u32 index, struct drm_color_ctm *ctm);
extern int am_meson_ctm_disable(void);
extern void lc_load_curve(struct ve_lc_curve_parm_s *p);
#ifndef CONFIG_AMLOGIC_MEDIA_VSYNC_RDMA
#define VSYNC_WR_MPEG_REG(adr, val) WRITE_VPP_REG(adr, val)
#define VSYNC_RD_MPEG_REG(adr) READ_VPP_REG(adr)
#define VSYNC_WR_MPEG_REG_BITS(adr, val, start, len) \
WRITE_VPP_REG_BITS(adr, val, start, len)
#else
extern int VSYNC_WR_MPEG_REG_BITS(u32 adr, u32 val, u32 start, u32 len);
extern u32 VSYNC_RD_MPEG_REG(u32 adr);
extern int VSYNC_WR_MPEG_REG(u32 adr, u32 val);
#endif
extern int amvecm_drm_get_gamma_size(u32 index);
extern void amvecm_drm_init(u32 index);
extern int amvecm_drm_gamma_set(u32 index,
struct drm_color_lut *lut, int lut_size);
extern int amvecm_drm_gamma_get(u32 index, u16 *red, u16 *green, u16 *blue);
extern int amvecm_drm_gamma_enable(u32 index);
extern int amvecm_drm_gamma_disable(u32 index);
extern int am_meson_ctm_set(u32 index, struct drm_color_ctm *ctm);
extern int am_meson_ctm_disable(void);
#endif /* AMVECM_H */