blob: 1bf7ae964758059fe47ad78c55925544636042d1 [file] [log] [blame]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* drivers/amlogic/media/vin/tvin/vdin/vdin_ctl.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 __TVIN_VDIN_CTL_H
#define __TVIN_VDIN_CTL_H
#include <linux/highmem.h>
#include <linux/page-flags.h>
#include <linux/vmalloc.h>
#include <linux/dma-mapping.h>
#include <linux/dma-contiguous.h>
#include "vdin_drv.h"
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
#define swap32(num) \
({typeof(num) num_ = num; \
(((num_) >> 24) & 0xff) | \
(((num_) << 8) & 0xff0000) | \
(((num_) >> 8) & 0xff00) | \
(((num_) << 24) & 0xff000000); })
#define DV_SWAP_EN (BIT(0))
#define DV_BUF_START_RESET (BIT(1))
#define DV_FRAME_BUF_START_RESET (BIT(2))
#define DV_UPDATE_DATA_MODE_DELBY_WORK (BIT(4))
#define DV_CLEAN_UP_MEM (BIT(5))
#define DV_READ_MODE_AXI (BIT(6))
#define DV_CRC_FORCE_TRUE (BIT(7))
#define DV_CRC_FORCE_FALSE (BIT(8))
#define MEM_ALLOC_DISCRETE (BIT(8))
#define MEM_ALLOC_FROM_CODEC (BIT(0))
enum vdin_output_mif_e {
VDIN_OUTPUT_TO_MIF = 0,
VDIN_OUTPUT_TO_AFBCE = 1,
};
enum wr_sel_vdin_e {
WR_SEL_DIS = 0,
WR_SEL_VDIN0_NOR = 1,
WR_SEL_VDIN0_SML = 2,
WR_SEL_VDIN1_NOR = 3,
WR_SEL_VDIN1_SML = 4,
};
enum vdin_mif_bits {
MIF_8BIT = 0,
MIF_10BIT = 1,
};
enum vdin_mif_fmt {
MIF_FMT_YUV422 = 0,
MIF_FMT_YUV444 = 1,
MIF_FMT_NV12_21 = 2,
MIF_FMT_YUV422_FULL_PACK = 3
};
/* *************************************************** */
/* *** structure definitions ************************* */
/* *************************************************** */
struct vdin_matrix_lup_s {
unsigned int pre_offset0_1;
unsigned int pre_offset2;
unsigned int coef00_01;
unsigned int coef02_10;
unsigned int coef11_12;
unsigned int coef20_21;
unsigned int coef22;
unsigned int post_offset0_1;
unsigned int post_offset2;
};
#ifdef CONFIG_AML_LOCAL_DIMMING
struct ldim_max_s {
/* general parameters */
int ld_pic_rowmax;
int ld_pic_colmax;
int ld_stamax_hidx[11]; /* U12* 9 */
int ld_stamax_vidx[11]; /* u12x 9 */
};
#endif
#define META_PKY_TYPE_SINGLE 0x00
#define META_PKY_TYPE_START 0x40
#define META_PKY_TYPE_MID 0x80
#define META_PKY_TYPE_TAIL 0xc0
#define DV_META_PACKET_SIZE 128
#define DV_META_HEADER_LEN 2
#define DV_META_TAIL_CRC_SIZE 4
#define DV_META_PACKET_TYPE_SIZE 3
#define DV_META_SINGLE_PKT_SIZE 119
#define DV_META_NORMAL_PKT_SIZE 121
struct dv_meta_pkt {
u8 head0;
u8 head1;
u8 head2;
u8 body[121];
u32 crc;
};
extern unsigned int game_mode;
extern unsigned int vdin_force_game_mode;
extern int vdin_dbg_en;
extern unsigned int vdin_pc_mode;
extern int irq_max_count;
/* ************************************************************************ */
/* ******** GLOBAL FUNCTION CLAIM ******** */
/* ************************************************************************ */
u8 *vdin_vmap(ulong addr, u32 size);
void vdin_unmap_phyaddr(u8 *vaddr);
void vdin_dma_flush(struct vdin_dev_s *devp, void *vaddr,
int size, enum dma_data_direction dir);
void vdin_set_vframe_prop_info(struct vframe_s *vf,
struct vdin_dev_s *devp);
void vdin_get_crc_val(struct vframe_s *vf, struct vdin_dev_s *devp);
void vdin_get_format_convert(struct vdin_dev_s *devp);
enum vdin_format_convert_e
vdin_get_format_convert_matrix0(struct vdin_dev_s *devp);
enum vdin_format_convert_e
vdin_get_format_convert_matrix1(struct vdin_dev_s *devp);
void vdin_set_prob_xy(unsigned int offset, unsigned int x,
unsigned int y, struct vdin_dev_s *devp);
void vdin_prob_get_rgb(unsigned int offset, unsigned int *r,
unsigned int *g, unsigned int *b);
void vdin_set_all_regs(struct vdin_dev_s *devp);
void vdin_set_double_write_regs(struct vdin_dev_s *devp);
void vdin_set_default_regmap(struct vdin_dev_s *devp);
void vdin_set_def_wr_canvas(struct vdin_dev_s *devp);
void vdin_hw_enable(struct vdin_dev_s *devp);
void vdin_hw_disable(struct vdin_dev_s *devp);
unsigned int vdin_get_field_type(unsigned int offset);
int vdin_vsync_reset_mif(int index);
bool vdin_check_vdi6_afifo_overflow(unsigned int offset);
void vdin_clear_vdi6_afifo_overflow_flg(unsigned int offset);
void vdin_set_cutwin(struct vdin_dev_s *devp);
void vdin_set_decimation(struct vdin_dev_s *devp);
void vdin_fix_nonstd_vsync(struct vdin_dev_s *devp);
unsigned int vdin_get_meas_hcnt64(unsigned int offset);
unsigned int vdin_get_meas_vstamp(unsigned int offset);
unsigned int vdin_get_active_h(unsigned int offset);
unsigned int vdin_get_active_v(unsigned int offset);
unsigned int vdin_get_total_v(unsigned int offset);
unsigned int vdin_get_canvas_id(unsigned int offset);
void vdin_set_canvas_id(struct vdin_dev_s *devp,
unsigned int rdma_enable,
struct vf_entry *vfe);
unsigned int vdin_get_chma_canvas_id(unsigned int offset);
void vdin_set_chma_canvas_id(struct vdin_dev_s *devp,
unsigned int rdma_enable,
struct vf_entry *vfe);
void vdin_set_crc_pulse(struct vdin_dev_s *devp);
void vdin_enable_module(struct vdin_dev_s *devp, bool enable);
void vdin_set_matrix(struct vdin_dev_s *devp);
void vdin_set_matrixs(struct vdin_dev_s *devp, unsigned char no,
enum vdin_format_convert_e csc);
bool vdin_check_cycle(struct vdin_dev_s *devp);
bool vdin_write_done_check(unsigned int offset,
struct vdin_dev_s *devp);
void vdin_calculate_duration(struct vdin_dev_s *devp);
void vdin_wr_reverse(unsigned int offset, bool hreverse,
bool vreverse);
void vdin_set_hvscale(struct vdin_dev_s *devp);
void vdin_set_bitdepth(struct vdin_dev_s *devp);
void vdin_set_cm2(unsigned int offset, unsigned int w,
unsigned int h, unsigned int *data);
void vdin_bypass_isp(unsigned int offset);
void vdin_set_mpegin(struct vdin_dev_s *devp);
void vdin_force_gofiled(struct vdin_dev_s *devp);
void vdin_adjust_tvafesnow_brightness(void);
void vdin_set_config(struct vdin_dev_s *devp);
void vdin_set_wr_mif(struct vdin_dev_s *devp);
void vdin_dolby_config(struct vdin_dev_s *devp);
void vdin_dolby_buffer_update(struct vdin_dev_s *devp,
unsigned int index);
void vdin_dolby_addr_update(struct vdin_dev_s *devp, unsigned int index);
void vdin_dolby_addr_alloc(struct vdin_dev_s *devp, unsigned int size);
void vdin_dolby_addr_release(struct vdin_dev_s *devp, unsigned int size);
int vdin_event_cb(int type, void *data, void *op_arg);
void vdin_hdmiin_patch(struct vdin_dev_s *devp);
void vdin_set_top(struct vdin_dev_s *devp, unsigned int offset,
enum tvin_port_e port,
enum tvin_color_fmt_e input_cfmt,
unsigned int h,
enum bt_path_e bt_path);
void vdin_set_wr_ctrl_vsync(struct vdin_dev_s *devp,
unsigned int offset,
enum vdin_format_convert_e format_convert,
unsigned int full_pack,
unsigned int source_bitdeth,
unsigned int rdma_enable);
void vdin_urgent_patch_resume(unsigned int offset);
int vdin_hdr_sei_error_check(struct vdin_dev_s *devp);
void vdin_set_drm_data(struct vdin_dev_s *devp,
struct vframe_s *vf);
u32 vdin_get_curr_field_type(struct vdin_dev_s *devp);
void vdin_set_source_type(struct vdin_dev_s *devp,
struct vframe_s *vf);
void vdin_set_source_mode(struct vdin_dev_s *devp, struct vframe_s *vf);
void vdin_set_source_bitdepth(struct vdin_dev_s *devp,
struct vframe_s *vf);
void vdin_set_pixel_aspect_ratio(struct vdin_dev_s *devp,
struct vframe_s *vf);
void vdin_set_display_ratio(struct vdin_dev_s *devp,
struct vframe_s *vf);
void vdin_source_bitdepth_reinit(struct vdin_dev_s *devp);
void set_invert_top_bot(bool invert_flag);
void vdin_clk_onoff(struct vdin_dev_s *devp, bool onoff);
extern enum tvin_force_color_range_e color_range_force;
//void vdin_vlock_input_sel(unsigned int type,
// enum vframe_source_type_e source_type);
void vdin_set_dolby_tunnel(struct vdin_dev_s *devp);
void vdin_check_hdmi_hdr(struct vdin_dev_s *devp);
void vdin_dobly_mdata_write_en(unsigned int offset, unsigned int en);
void vdin_prob_set_xy(unsigned int offset,
unsigned int x, unsigned int y, struct vdin_dev_s *devp);
void vdin_prob_set_before_or_after_mat(unsigned int offset,
unsigned int x,
struct vdin_dev_s *devp);
void vdin_prob_get_yuv(unsigned int offset,
unsigned int *rgb_yuv0, unsigned int *rgb_yuv1,
unsigned int *rgb_yuv2);
void vdin_prob_matrix_sel(unsigned int offset,
unsigned int sel, struct vdin_dev_s *devp);
void vdin_change_matrix(unsigned int offset,
unsigned int matrix_csc);
void vdin_dolby_desc_sc_enable(struct vdin_dev_s *devp,
unsigned int onoff);
bool vdin_is_dolby_tunnel_444_input(struct vdin_dev_s *devp);
bool vdin_is_dolby_signal_in(struct vdin_dev_s *devp);
void vdin_dolby_de_tunnel_to_12bit(struct vdin_dev_s *devp,
unsigned int onoff);
void vdin_wr_frame_en(unsigned int ch, unsigned int onoff);
void vdin_set_mif_onoff(struct vdin_dev_s *devp, unsigned int rdma_enable);
void vdin_vs_proc_monitor(struct vdin_dev_s *devp);
enum tvin_color_fmt_range_e
tvin_get_force_fmt_range(enum tvin_color_fmt_e color_fmt);
bool vdin_is_convert_to_444(u32 format_convert);
bool vdin_is_convert_to_422(u32 format_convert);
bool vdin_is_convert_to_nv21(u32 format_convert);
bool vdin_is_4k(struct vdin_dev_s *devp);
void vdin_set_matrix_color(struct vdin_dev_s *devp);
void vdin_set_bist_pattern(struct vdin_dev_s *devp, unsigned int onoff, unsigned int pat);
bool is_dolby_vision_enable(void);
bool is_dolby_vision_on(void);
bool is_dolby_vision_stb_mode(void);
bool for_dolby_vision_certification(void);
void vdin_change_matrix0(u32 offset, u32 matrix_csc);
void vdin_change_matrix1(u32 offset, u32 matrix_csc);
void vdin_change_matrixhdr(u32 offset, u32 matrix_csc);
void vdin_set_frame_mif_write_addr(struct vdin_dev_s *devp,
unsigned int rdma_enable, struct vf_entry *vfe);
void vdin_dolby_pr_meta_data(void *addr, unsigned int size);
bool vdin_is_dv_meta_data_case(struct vdin_dev_s *devp);
void vdin_dv_detunel_tunel_set(struct vdin_dev_s *devp);
void vdin_dolby_de_tunnel_to_44410bit(struct vdin_dev_s *devp,
unsigned int onoff);
void vdin_dolby_desc_to_4448bit(struct vdin_dev_s *devp,
unsigned int onoff);
void vdin_get_duration_by_fps(struct vdin_dev_s *devp);
void vdin_set_to_vpp_parm(struct vdin_dev_s *devp);
void vdin_dmc_ctrl(struct vdin_dev_s *devp, bool onoff);
#endif