unplugged-kernel/drivers/misc/mediatek/video/mt6739/dispsys/ddp_info.c

752 lines
11 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#define LOG_TAG "INFO"
#include "ddp_info.h"
#include "ddp_debug.h"
#include "ddp_log.h"
static const char reg_magic[] = "no_regs_info";
static struct ddp_module ddp_modules[DISP_MODULE_NUM] = {
/*
* {module_id,
* module_type,
* module_name,
* can_connect,
* module_driver,
*
* {reg_dt_name,
* reg_pa_check,
* reg_irq_check,
* irq_max_bit,
* reg_va,
* reg_irq}
* },
*/
{DISP_MODULE_OVL0,
DISP_T_OVL,
"ovl0",
1,
&ddp_driver_ovl,
{"mediatek,disp_ovl0",
0x1400a000,
233,
14,
0,
0}
},
{DISP_MODULE_OVL1,
DISP_T_OVL,
"ovl1",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_OVL0_2L,
DISP_T_OVL,
"ovl0_2l",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_OVL1_2L,
DISP_T_OVL,
"ovl1_2l",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_OVL0_VIRTUAL,
DISP_T_UNKNOWN,
"ovl0_virtual",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_OVL0_2L_VIRTUAL,
DISP_T_UNKNOWN,
"ovl0_2l_virtual",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_OVL1_2L_VIRTUAL,
DISP_T_UNKNOWN,
"ovl1_2l_virtual",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_RDMA0,
DISP_T_RDMA,
"rdma0",
1,
&ddp_driver_rdma,
{"mediatek,disp_rdma0",
0x1400b000,
234,
7,
0,
0}
},
{DISP_MODULE_RDMA1,
DISP_T_RDMA,
"rdma1",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_RDMA2,
DISP_T_RDMA,
"rdma2",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_WDMA0,
DISP_T_WDMA,
"wdma0",
1,
&ddp_driver_wdma,
{"mediatek,disp_wdma0",
0x1400c000,
235,
2,
0,
0}
},
{DISP_MODULE_WDMA1,
DISP_T_WDMA,
"wdma1",
0,
NULL,
{reg_magic,},
},
{DISP_MODULE_WDMA_VIRTUAL0,
DISP_T_UNKNOWN,
"wdma_virtual0",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_WDMA_VIRTUAL1,
DISP_T_UNKNOWN,
"wdma_virtual1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_COLOR0,
DISP_T_COLOR,
"color0",
1,
&ddp_driver_color,
{"mediatek,disp_color0",
0x1400d000,
236,
0,
0,
0}
},
{DISP_MODULE_COLOR1,
DISP_T_COLOR,
"color1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_CCORR0,
DISP_T_CCORR,
"ccorr0",
1,
&ddp_driver_ccorr,
{"mediatek,disp_ccorr0",
0x1400e000,
237,
1,
0,
0}
},
{DISP_MODULE_CCORR1,
DISP_T_CCORR,
"ccorr1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_AAL0,
DISP_T_AAL,
"aal0",
1,
&ddp_driver_aal,
{"mediatek,disp_aal0",
0x1400f000,
238,
1,
0,
0}
},
{DISP_MODULE_AAL1,
DISP_T_AAL,
"aal1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_GAMMA0,
DISP_T_GAMMA,
"gamma0",
1,
&ddp_driver_gamma,
{"mediatek,disp_gamma0",
0x14010000,
239,
0,
0,
0}
},
{DISP_MODULE_GAMMA1,
DISP_T_GAMMA,
"gamma1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_OD,
DISP_T_OD,
"od",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_DITHER0,
DISP_T_DITHER,
"dither0",
1,
&ddp_driver_dither,
{"mediatek,disp_dither0",
0x14011000,
240,
0,
0,
0}
},
{DISP_MODULE_DITHER1,
DISP_T_DITHER,
"dither1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_PATH0,
DISP_T_UNKNOWN,
"path0",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_PATH1,
DISP_T_UNKNOWN,
"path1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_UFOE,
DISP_T_UFOE,
"ufoe",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_UFOE_VIRTUAL,
DISP_T_UFOE,
"ufoe",
1,
NULL,
{reg_magic,}
},
{DISP_MODULE_DSC,
DISP_T_DSC,
"dsc",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_DSC_2ND,
DISP_T_DSC,
"dsc2",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_SPLIT0,
DISP_T_UNKNOWN,
"split0",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_DPI,
DISP_T_DPI,
"dpi0",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_DBI,
DISP_T_DBI,
"dbi0",
1,
NULL, /*TODO: will be filled later */
{"mediatek,dbi0",
0x14013000,
242,
15,
0,
0}
},
{DISP_MODULE_DSI0,
DISP_T_DSI,
"dsi0",
1,
&ddp_driver_dsi0,
{"mediatek,dsi0",
0x14012000,
241,
15,
0,
0}
},
{DISP_MODULE_DSI1,
DISP_T_DSI,
"dsi1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_DSIDUAL,
DISP_T_DSI,
"dsidual",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_PWM0,
DISP_T_PWM,
"pwm0",
0,
&ddp_driver_pwm,
{"mediatek,disp_pwm0",
0x1100e000,
158,
0,
0,
0}
},
{DISP_MODULE_PWM1,
DISP_T_PWM,
"pwm1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_CONFIG,
DISP_T_UNKNOWN,
"config",
0,
NULL,
{"mediatek,mmsys_config",
0x14000000,
0,
0,
0,
0}
},
{DISP_MODULE_MUTEX,
DISP_T_UNKNOWN,
"mutex",
0,
NULL,
{"mediatek,disp_mutex",
0x14001000,
226,
21,
0,
0}
},
{DISP_MODULE_SMI_COMMON,
DISP_T_UNKNOWN,
"sim_common",
0,
NULL,
{"mediatek,smi_common",
0x14002000,
0,
0,
0,
0}
},
{DISP_MODULE_SMI_LARB0,
DISP_T_UNKNOWN,
"smi_larb0",
0,
NULL,
{"mediatek,smi_larb0",
0x14003000,
261,
0,
0,
0}
},
{DISP_MODULE_SMI_LARB1,
DISP_T_UNKNOWN,
"smi_larb1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_MIPI0,
DISP_T_UNKNOWN,
"mipi0",
0,
NULL,
{"mediatek,mipi_tx0",
0x11c80000,
179,
0,
0,
0}
},
{DISP_MODULE_MIPI1,
DISP_T_UNKNOWN,
"mipi1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_RSZ0,
DISP_T_RSZ,
"rsz0",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_RSZ1,
DISP_T_RSZ,
"rsz1",
0,
NULL,
{reg_magic,}
},
{DISP_MODULE_UNKNOWN,
DISP_T_UNKNOWN,
"unknown",
0,
NULL,
{reg_magic,}
},
};
unsigned int is_ddp_module(enum DISP_MODULE_ENUM module)
{
if (module >= 0 && module < DISP_MODULE_NUM)
return 1;
return 0;
}
unsigned int is_ddp_module_has_reg_info(enum DISP_MODULE_ENUM module)
{
if (!is_ddp_module(module))
return 0;
if (strcmp(ddp_modules[module].reg_info.reg_dt_name, reg_magic))
return 1;
return 0;
}
const char *ddp_get_module_name(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module(module))
return ddp_modules[module].module_name;
DDPERR("%s: invalid module id=%d\n", __func__, module);
return "unknown";
}
unsigned int _can_connect(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module(module))
return ddp_modules[module].can_connect;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return 0;
}
struct DDP_MODULE_DRIVER *ddp_get_module_driver(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module(module))
return ddp_modules[module].module_driver;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return 0;
}
const char *ddp_get_module_dtname(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module(module))
return ddp_modules[module].reg_info.reg_dt_name;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return "unknown";
}
unsigned int ddp_get_module_checkirq(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module))
return ddp_modules[module].reg_info.reg_irq_check;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return 0;
}
unsigned long ddp_get_module_pa(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module))
return ddp_modules[module].reg_info.reg_pa_check;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return 0;
}
unsigned int ddp_get_module_max_irq_bit(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module))
return ddp_modules[module].reg_info.irq_max_bit;
DDPDBG("%s: invalid module id=%d\n", __func__, module);
return 0;
}
unsigned int ddp_is_irq_enable(enum DISP_MODULE_ENUM module)
{
if (ddp_get_module_max_irq_bit(module))
return 1;
return 0;
}
void ddp_module_irq_disable(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module)) {
ddp_modules[module].reg_info.irq_max_bit = 0;
return;
}
DDPDBG("%s: invalid module id=%d\n", __func__, module);
}
void ddp_set_module_va(enum DISP_MODULE_ENUM module, unsigned long va)
{
if (is_ddp_module_has_reg_info(module)) {
ddp_modules[module].reg_info.reg_va = va;
return;
}
DDPDBG("%s: invalid module id=%d\n", __func__, module);
}
void ddp_set_module_irq(enum DISP_MODULE_ENUM module, unsigned int irq)
{
if (is_ddp_module_has_reg_info(module)) {
ddp_modules[module].reg_info.reg_irq = irq;
return;
}
DDPDBG("%s: invalid module id=%d\n", __func__, module);
}
unsigned long ddp_get_module_va(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module))
return ddp_modules[module].reg_info.reg_va;
return 0;
}
unsigned int ddp_get_module_irq(enum DISP_MODULE_ENUM module)
{
if (is_ddp_module_has_reg_info(module))
return ddp_modules[module].reg_info.reg_irq;
/*("%s: invalid module id=%d\n", __func__, module);*/
return 0;
}
unsigned int is_reg_addr_valid(unsigned int isVa, unsigned long addr)
{
unsigned int i = 0;
for (i = 0; i < DISP_MODULE_NUM; i++) {
if ((isVa == 1) && (addr >= ddp_get_module_va(i)) &&
(addr < ddp_get_module_va(i) + 0x1000))
break;
if ((isVa == 0) && (addr >= ddp_get_module_pa(i)) &&
(addr < ddp_get_module_pa(i) + 0x1000))
break;
}
if (i < DISP_MODULE_NUM) {
DDPMSG("addr valid, isVa=0x%x, addr=0x%lx, module=%s!\n", isVa,
addr, ddp_get_module_name(i));
return i;
}
DDPERR("%s: return fail, isVa=0x%x, addr=0x%lx!\n",
__func__, isVa, addr);
return 0;
}
unsigned int ddp_get_module_num_by_t(enum DISP_MODULE_TYPE_ENUM module_t)
{
int i;
int cnt = 0;
for (i = 0; i < DISP_MODULE_NUM; i++) {
if (ddp_modules[i].module_type == module_t)
cnt++;
}
return cnt;
}
enum DISP_MODULE_ENUM
ddp_get_module_id_by_idx(enum DISP_MODULE_TYPE_ENUM module_t, unsigned int idx)
{
int i;
int index = 0;
for (i = 0; i < DISP_MODULE_NUM; i++) {
if (ddp_modules[i].module_type == module_t)
index++;
if (index == (idx + 1))
return i;
}
return DISP_MODULE_UNKNOWN;
}
enum DISP_MODULE_ENUM disp_irq_to_module(unsigned int irq)
{
int i;
if (irq == 0)
return DISP_MODULE_UNKNOWN;
for (i = 0; i < DISP_MODULE_NUM; i++) {
if (irq == ddp_get_module_irq(i))
return i;
}
DDPERR("cannot find module for irq %d\n", irq);
WARN_ON(1);
return DISP_MODULE_UNKNOWN;
}
const char *ddp_get_ioctl_name(enum DDP_IOCTL_NAME ioctl)
{
switch (ioctl) {
case DDP_SWITCH_DSI_MODE:
return "DDP_SWITCH_DSI_MODE";
case DDP_STOP_VIDEO_MODE:
return "DDP_STOP_VIDEO_MODE";
case DDP_BACK_LIGHT:
return "DDP_BACK_LIGHT";
case DDP_SWITCH_LCM_MODE:
return "DDP_SWITCH_LCM_MODE";
case DDP_DPI_FACTORY_TEST:
return "DDP_DPI_FACTORY_TEST";
case DDP_DSI_IDLE_CLK_CLOSED:
return "DDP_DSI_IDLE_CLK_CLOSED";
case DDP_DSI_IDLE_CLK_OPEN:
return "DDP_DSI_IDLE_CLK_OPEN";
case DDP_DSI_PORCH_CHANGE:
return "DDP_DSI_PORCH_CHANGE";
case DDP_PHY_CLK_CHANGE:
return "DDP_PHY_CLK_CHANGE";
case DDP_ENTER_ULPS:
return "DDP_ENTER_ULPS";
case DDP_EXIT_ULPS:
return "DDP_EXIT_ULPS";
case DDP_RDMA_GOLDEN_SETTING:
return "DDP_RDMA_GOLDEN_SETTING";
case DDP_OVL_GOLDEN_SETTING:
return "DDP_OVL_GOLDEN_SETTING";
case DDP_PARTIAL_UPDATE:
return "DDP_PARTIAL_UPDATE";
case DDP_UPDATE_PLL_CLK_ONLY:
return "DDP_UPDATE_PLL_CLK_ONLY";
case DDP_DSI_SW_INIT:
return "DDP_DSI_SW_INIT";
case DDP_DSI_MIPI_POWER_ON:
return "DDP_DSI_MIPI_POWER_ON";
default:
break;
}
return "unknown";
}