blob: 5c4e3240441094d9accbae064c4a60f497abe478 [file] [edit]
/* SPDX-License-Identifier: GPL-2.0+ */
/*
*
* Copyright (C) 2019 Amlogic, Inc. All rights reserved.
*
*/
#ifndef __AML_LCD_TCON_H__
#define __AML_LCD_TCON_H__
#include <linux/dma-map-ops.h>
#include <linux/dma-mapping.h>
#include <linux/mm.h>
#include <linux/amlogic/media/vout/lcd/lcd_vout.h>
#include <linux/amlogic/media/vout/lcd/lcd_tcon_data.h>
#include <linux/amlogic/media/vout/lcd/lcd_tcon_fw.h>
#define AML_TCON_CLASS_NAME "aml_tcon"
#define AML_TCON_DEVICE_NAME "tcon"
#define REG_LCD_TCON_MAX 0xffff
#define TCON_INTR_MASKN_VAL 0x0 /* default mask all */
struct lcd_tcon_config_s {
unsigned char tcon_valid;
unsigned char tcon_is_busy;
unsigned int core_reg_ver;
unsigned int core_reg_width;
unsigned int reg_table_width;
unsigned int reg_table_len;
unsigned int core_reg_start;
unsigned int top_reg_base;
unsigned int reg_top_ctrl;
unsigned int bit_en;
unsigned int reg_core_od;
unsigned int bit_od_en;
unsigned int reg_ctrl_timing_base;
unsigned int ctrl_timing_offset;
unsigned int ctrl_timing_cnt;
unsigned int axi_bank;
unsigned int rsv_mem_size;
unsigned int axi_mem_size;
unsigned int bin_path_size;
unsigned int secure_cfg_size;
unsigned int vac_size;
unsigned int demura_set_size;
unsigned int demura_lut_size;
unsigned int acc_lut_size;
unsigned int *axi_reg;
void (*tcon_axi_mem_config)(void);
void (*tcon_axi_mem_secure)(void);
void (*tcon_axi_mem_update)(unsigned int *table);
void (*tcon_global_reset)(struct aml_lcd_drv_s *pdrv);
int (*tcon_reload_pre)(struct aml_lcd_drv_s *pdrv);
int (*tcon_reload)(struct aml_lcd_drv_s *pdrv);
int (*tcon_enable)(struct aml_lcd_drv_s *pdrv);
int (*tcon_disable)(struct aml_lcd_drv_s *pdrv);
void (*lut_dma_update)(struct aml_lcd_drv_s *pdrv);
void (*lut_dma_mif_set)(phys_addr_t paddr, unsigned int size);
void (*lut_dma_enable)(struct aml_lcd_drv_s *pdrv);
void (*lut_dma_disable)(struct aml_lcd_drv_s *pdrv);
};
struct tcon_rmem_config_s {
phys_addr_t mem_paddr;
unsigned char *mem_vaddr;
unsigned int mem_size;
};
struct tcon_sec_mem_config_s {
phys_addr_t mem_paddr;
unsigned char *mem_vaddr;
unsigned int mem_size;
unsigned int sec_handle;
unsigned int sec_protect;
};
struct tcon_rmem_s {
unsigned char flag;
unsigned int rsv_mem_size;
unsigned int axi_mem_size;
void *rsv_mem_vaddr;
phys_addr_t rsv_mem_paddr;
phys_addr_t axi_mem_paddr;
phys_addr_t sw_mem_paddr;
struct tcon_rmem_config_s *axi_rmem;
struct tcon_rmem_config_s bin_path_rmem;
struct tcon_rmem_config_s secure_cfg_rmem;
struct tcon_sec_mem_config_s secure_axi_rmem;
struct tcon_rmem_config_s vac_rmem;
struct tcon_rmem_config_s demura_set_rmem;
struct tcon_rmem_config_s demura_lut_rmem;
struct tcon_rmem_config_s acc_lut_rmem;
};
struct tcon_data_list_s {
unsigned int id;
unsigned int ctrl_method;
unsigned int max;
unsigned int min;
unsigned int ctrl_data_cnt;
unsigned int *ctrl_data;
char *block_name;
unsigned char *block_vaddr;
phys_addr_t block_paddr;
struct tcon_data_list_s *next;
};
struct tcon_data_multi_s {
unsigned int block_type;
unsigned int list_cnt;
unsigned int bypass_flag;
unsigned int switch_flag;
struct tcon_data_list_s *list_header;
struct tcon_data_list_s *list_cur;
struct tcon_data_list_s *list_update;
struct tcon_data_list_s *list_remove;
char dbg_str[64];
};
struct tcon_data_init_s {
unsigned int block_type;
unsigned int priority;
unsigned int flag;
struct tcon_data_list_s *list_header;
};
struct tcon_data_priority_s {
unsigned int index;
unsigned int priority;
};
struct tcon_mem_map_table_s {
/*header*/
unsigned int version;
unsigned char tcon_data_flag;
unsigned int data_load_level;
unsigned int block_cnt;
unsigned char init_load;
unsigned int valid_flag;
unsigned char demura_cnt;
unsigned int block_bit_flag;
unsigned int frame_rate;
unsigned int core_reg_table_size;
struct lcd_tcon_init_block_header_s *core_reg_header;
unsigned char *core_reg_table;
struct tcon_data_priority_s *data_priority;
unsigned int *data_size;
unsigned char **data_mem_vaddr;
dma_addr_t *data_mem_paddr;
unsigned int multi_lut_update;
unsigned int data_multi_cnt;
struct tcon_data_multi_s *data_multi;
struct tcon_data_init_s *data_init;
unsigned long long vsync_time[10];
unsigned long long list_trave_time[10];
};
#define TCON_BIN_VER_LEN 9
#define MEM_FLAG_MAX 2
struct lcd_tcon_local_cfg_s {
char bin_ver[TCON_BIN_VER_LEN];
spinlock_t multi_list_lock; /* for tcon multi lut list change */
struct list_head pdf_data_list; //for struct lcd_tcon_pdf_data_s
unsigned char pdf_list_load_flag;
struct cdev cdev;
struct device *dev;
dev_t devno;
struct class *clsp;
};
#if IS_ENABLED(CONFIG_AMLOGIC_TEE)
void lcd_tcon_mem_tee_get_status(void);
int lcd_tcon_mem_tee_protect(int protect_en);
#endif
struct lcd_tcon_config_s *get_lcd_tcon_config(void);
struct tcon_rmem_s *get_lcd_tcon_rmem(void);
struct tcon_mem_map_table_s *get_lcd_tcon_mm_table(void);
struct lcd_tcon_local_cfg_s *get_lcd_tcon_local_cfg(void);
void lcd_tcon_fw_prepare(struct aml_lcd_drv_s *pdrv, struct lcd_tcon_config_s *tcon_conf);
int lcd_tcon_fw_buf_table_generate(struct lcd_tcon_fw_s *tcon_fw);
void lcd_tcon_fw_base_timing_update(struct aml_lcd_drv_s *pdrv);
/* **********************************
* tcon config
* **********************************
*/
/* common */
#define TCON_VAC_SET_PARAM_NUM 3
#define TCON_VAC_LUT_PARAM_NUM 256
/* TL1 */
#define LCD_TCON_CORE_REG_WIDTH_TL1 8
#define LCD_TCON_TABLE_WIDTH_TL1 8
#define LCD_TCON_TABLE_LEN_TL1 24000
#define LCD_TCON_AXI_BANK_TL1 3
#define BIT_TOP_EN_TL1 4
#define TCON_CORE_REG_START_TL1 0x0000
#define REG_CORE_OD_TL1 0x247
#define BIT_OD_EN_TL1 0
#define REG_CORE_CTRL_TIMING_BASE_TL1 0x1b
#define CTRL_TIMING_OFFSET_TL1 12
#define CTRL_TIMING_CNT_TL1 0
/* T5 */
#define LCD_TCON_CORE_REG_WIDTH_T5 32
#define LCD_TCON_TABLE_WIDTH_T5 32
#define LCD_TCON_TABLE_LEN_T5 0x18d4 /* 0x635*4 */
#define LCD_TCON_AXI_BANK_T5 2
#define BIT_TOP_EN_T5 4
#define TCON_CORE_REG_START_T5 0x0100
#define REG_CORE_OD_T5 0x263
#define BIT_OD_EN_T5 31
#define REG_CORE_CTRL_TIMING_BASE_T5 0x1b
#define CTRL_TIMING_OFFSET_T5 12
#define CTRL_TIMING_CNT_T5 0
/* T5D */
#define LCD_TCON_CORE_REG_WIDTH_T5D 32
#define LCD_TCON_TABLE_WIDTH_T5D 32
#define LCD_TCON_TABLE_LEN_T5D 0x102c /* 0x40b*4 */
#define LCD_TCON_AXI_BANK_T5D 1
#define BIT_TOP_EN_T5D 4
#define TCON_CORE_REG_START_T5D 0x0100
#define REG_CORE_OD_T5D 0x263
#define BIT_OD_EN_T5D 31
#define REG_CTRL_TIMING_BASE_T5D 0x1b
#define CTRL_TIMING_OFFSET_T5D 12
#define CTRL_TIMING_CNT_T5D 0
/* T3X */
#define LCD_TCON_TABLE_LEN_T3X 0x1478 /* 0x51e*4 */
#define LCD_TCON_AXI_BANK_T3X 3
/* TXHD2 */
#define LCD_TCON_TABLE_LEN_TXHD2 0x1670 /* 0x59c*4 */
#define LCD_TCON_AXI_BANK_TXHD2 2
/* **********************************
* tcon api
* **********************************
*/
/* internal */
int lcd_tcon_get_dma_ref(void);
void lcd_tcon_set_dma_ref(int i);
void lcd_tcon_lut_dma_update(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_lut_dma_mif_set_t5m(phys_addr_t paddr, unsigned int size);
void lcd_tcon_lut_dma_enable_t5m(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_lut_dma_disable_t5m(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_od_pre_disable(unsigned char *table);
int lcd_tcon_valid_check(void);
struct tcon_rmem_s *get_lcd_tcon_rmem(void);
struct tcon_mem_map_table_s *get_lcd_tcon_mm_table(void);
void lcd_tcon_global_reset_t5(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_global_reset_t3(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_core_reg_set(struct aml_lcd_drv_s *pdrv,
struct lcd_tcon_config_s *tcon_conf,
struct tcon_mem_map_table_s *mm_table,
unsigned char *core_reg_table);
int lcd_tcon_enable_tl1(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_disable_tl1(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_enable_t5(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_disable_t5(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_enable_t3(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_disable_t3(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_enable_txhd2(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_reload_t3(struct aml_lcd_drv_s *pdrv);
int lcd_tcon_reload_pre_t3(struct aml_lcd_drv_s *pdrv);
/* common */
unsigned char *lcd_tcon_paddrtovaddr(unsigned long paddr, unsigned int mem_size);
int lcd_tcon_data_multi_match_find(struct aml_lcd_drv_s *pdrv, unsigned char *data_buf);
void lcd_tcon_data_multi_current_update(struct tcon_mem_map_table_s *mm_table,
struct lcd_tcon_data_block_header_s *block_header, unsigned int index);
void lcd_tcon_data_multi_bypass_set(struct tcon_mem_map_table_s *mm_table,
unsigned int block_type, int flag);
int lcd_tcon_data_common_parse_set(struct aml_lcd_drv_s *pdrv,
unsigned char *data_buf, phys_addr_t paddr, int init_flag);
void lcd_tcon_init_data_version_update(char *data_buf);
int lcd_tcon_data_load(struct aml_lcd_drv_s *pdrv, unsigned char *data_buf, int index);
int lcd_tcon_bin_load(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_reg_table_print(void);
void lcd_tcon_reg_readback_print(struct aml_lcd_drv_s *pdrv);
void lcd_tcon_multi_lut_print(void);
void lcd_tcon_axi_rmem_lut_load(unsigned int index, unsigned char *buf,
unsigned int size);
void lcd_tcon_dbg_trace_clear(void);
void lcd_tcon_dbg_trace_print(unsigned int flag);
void lcd_tcon_debug_file_add(struct aml_lcd_drv_s *pdrv, struct lcd_tcon_local_cfg_s *local_cfg);
void lcd_tcon_debug_file_remove(struct lcd_tcon_local_cfg_s *local_cfg);
#endif