# @brief cmake file
# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.
#===============================================================================
+set(
+ gpu_mem_drv_list
+ ${CMAKE_CURRENT_SOURCE_DIR}/gpu_mem_config.c
+)
+set(GPU_SRC_LIST "${GPU_SRC_LIST}" "${gpu_mem_drv_list}" CACHE INTERNAL "platform src obj list" FORCE)
+
set(
drv_comm_header_list
${CMAKE_CURRENT_SOURCE_DIR}
--- /dev/null
+/*
+ * Copyright (c) @CompanyNameMagicTag 2024-2024. All rights reserved.
+ * Description : gpu sram config file
+ */
+
+#include "gpu_mem_config.h"
+
+td_u32 gpu_mem_get_cmd_size(td_void)
+{
+ return GPU_SRAM_CMD_SIZE;
+}
#ifndef COMM_GPU_MEM_CONFIG_H
#define COMM_GPU_MEM_CONFIG_H
+#include "td_base.h"
#include "psram.h"
#ifdef __cplusplus
#define GPU_REG_LUT_ADDR 0x603E0000
#define GPU_REG_LUT_SIZE 0x3FFF
+#ifdef SUPPORT_GPU_GMMU
#define GPU_SRAM_PRE_SIZE (1 * 1024) /* 1K for vau ip tmp dcmp */
#define GPU_SRAM_PRE_ADDR (GPU_SRAM_END + 1 - GPU_SRAM_PRE_SIZE) /* 0x6039FC00 ~ 0x6039FFFF */
#define GPU_PSRAM_SIZE (PSRAM_DISP_VAU_NODE_LENGTH)
#define GPU_PSRAM_ADDR (PSRAM_DISP_VAU_NODE_ADDR)
+#else
+#define GPU_SRAM_PRE_SIZE (1 * 1024) /* 1K for vau ip tmp dcmp */
+#define GPU_SRAM_PRE_ADDR (GPU_SRAM_END + 1 - GPU_SRAM_PRE_SIZE) /* 0x6039FC00 ~ 0x6039FFFF */
+
+#define GPU_SRAM_NODE_SIZE (57 * 1024) /* 57K for node/handle */
+#define GPU_SRAM_NODE_ADDR (GPU_SRAM_PRE_ADDR - GPU_SRAM_NODE_SIZE) /* 0x60391800 ~ 0x6039FC00 */
+
+#define GPU_SRAM_CMD_SIZE (GPU_SRAM_PRE_SIZE + GPU_SRAM_NODE_SIZE)
+
+#define GPU_SRAM_DRAW_SIZE (256 * 1024) /* 256K for cmd/data */
+#define GPU_SRAM_DRAW_ADDR (PSRAM_DISP_VAU_NODE_ADDR) /* PSRAM */
+
+#define GPU_PSRAM_SIZE (PSRAM_DISP_VAU_NODE_LENGTH - GPU_SRAM_DRAW_SIZE)
+#define GPU_PSRAM_ADDR (GPU_SRAM_DRAW_ADDR + GPU_SRAM_DRAW_SIZE)
+#endif
+
+td_u32 gpu_mem_get_cmd_size(td_void);
#ifdef __cplusplus
#if __cplusplus
#include "dpu_clock.h"\r
#include "lcd_bus.h"\r
\r
-#define DPU_VTHD_POS_SETTING 10\r
-#define DPU_VTHD_POS_FINISH 90\r
+#define DPU_VTHD_PERCENT_10 10\r
+#define DPU_VTHD_PERCENT_90 90\r
#define DPU_VTHD_PERCENT_100 100\r
\r
static dpu_disp_info g_dpu_disp_info = { 0 };\r
\r
static td_void disp_set_interrupt_thd(dpu_disp_timing *timing)\r
{\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ td_u32 vtotal = timing->vact + timing->vbb + timing->vfb;\r
+ td_u32 vthd_percent_90 = vtotal * DPU_VTHD_PERCENT_90 / DPU_VTHD_PERCENT_100;\r
+\r
+ dpu_hal_disp_set_int_thd(DPU_DISP_INT_TYPE_SETTING, vthd_percent_90);\r
+#else\r
td_u32 setting_thd;\r
td_u32 finish_thd;\r
td_u32 reserved_thd;\r
td_u32 vtotal = timing->vact + timing->vbb + timing->vfb;\r
\r
- setting_thd = vtotal * DPU_VTHD_POS_SETTING / DPU_VTHD_PERCENT_100;\r
+ setting_thd = vtotal * DPU_VTHD_PERCENT_10 / DPU_VTHD_PERCENT_100;\r
finish_thd = vtotal - 2; /* 2:line */\r
reserved_thd = timing->vbb + timing->vfb + 2; /* 2:line */\r
\r
dpu_hal_disp_set_int_thd(DPU_DISP_INT_TYPE_SETTING, setting_thd);\r
dpu_hal_disp_set_int_thd(DPU_DISP_INT_TYPE_FINISH, finish_thd);\r
dpu_hal_disp_set_int_thd(DPU_DISP_INT_TYPE_RESERVE, reserved_thd);\r
+#endif\r
}\r
\r
static td_s32 disp_config_timing(td_void)\r
\r
static td_void disp_set_isr_enable(td_bool enable)\r
{\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ dpu_hal_disp_set_dhd0_te_mode(0); /* set dpu work video mode */\r
+ dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_SETTING, enable);\r
+#else\r
dpu_hal_disp_set_dhd0_te_mode(enable); /* set dpu work te mode */\r
+#endif\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_LOWBAND, enable);\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_BUS_ERR, enable);\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_FRM_DONE, enable);\r
/* bit[26]:enable, bit[25:13]:div_denom, bit[12:0]:div_num */
volatile u_vedio_crg_mclk_div_ctl mclk_div_ctl;
uapi_reg_read(CRG_VEDIO_CRG_MCLK_DIV_CTL, mclk_div_ctl.u32);
+#ifdef GPU_SUPPORT_VIDEO_MODE
+ mclk_div_ctl.bits.dpu_mclk_div = 0x412600C; /* 147M * 12/147 = 12M */
+#else
mclk_div_ctl.bits.dpu_mclk_div = 0x4126014; /* 147M * 20/147 = 20M */
+#endif
mclk_div_ctl.bits.dpu_mclk_cken = mclk_cken;
uapi_reg_write(CRG_VEDIO_CRG_MCLK_DIV_CTL, mclk_div_ctl.u32);
}
if (ret != EXT_SUCCESS) {\r
dpu_disp_deinit();\r
dpu_isr_deinit();\r
- dpu_hal_init();\r
+ dpu_hal_deinit();\r
dpu_err("dpu_layer_init fail, ret=%#x!", ret);\r
return ret;\r
}\r
\r
ret = dpu_register_device();\r
if (ret != EXT_SUCCESS) {\r
- uapi_dpu_module_exit();\r
+ dpu_layer_deinit();\r
+ dpu_disp_deinit();\r
+ dpu_isr_deinit();\r
+ dpu_hal_deinit();\r
dpu_err("dpu_register_device failed, ret=%#x!", ret);\r
return ret;\r
}\r
if ((int_type & DPU_DISP_INT_TYPE_BUS_ERR) == DPU_DISP_INT_TYPE_BUS_ERR) {\r
dfx_info->bus_err_cnt++;\r
}\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ if ((int_type & DPU_DISP_INT_TYPE_SETTING) == DPU_DISP_INT_TYPE_SETTING) {\r
+ g_dpu_isr_info.finish_done = 1;\r
+ }\r
+#endif\r
if ((int_type & DPU_DISP_INT_TYPE_TE_INT) == DPU_DISP_INT_TYPE_TE_INT) {\r
dpu_dfx_get_time_us(&cur_time_us);\r
dfx_info->te_cost_us = (cur_time_us - dfx_info->last_te_time_us);\r
}\r
\r
if ((int_type & DPU_DISP_INT_TYPE_FRM_DONE) == DPU_DISP_INT_TYPE_FRM_DONE) {\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ g_dpu_isr_info.finish_done = 0;\r
+#else\r
g_dpu_isr_info.finish_done = 1;\r
+#endif\r
dfx_info->frm_done_cnt++;\r
dfx_info->frm_done_total++;\r
uapi_pm_remove_sleep_veto(PM_ID_DPU);\r
\r
td_s32 dpu_wait_all_finish(td_void)\r
{\r
+#ifndef GPU_SUPPORT_VIDEO_MODE\r
unsigned long flag = 0;\r
dpu_dfx_info *dfx_info = dpu_dfx_get_info();\r
const td_u32 wait_time = 200;\r
dpu_timeout_cnt++;\r
return EXT_FAILURE;\r
}\r
+#endif\r
return EXT_SUCCESS;\r
}\r
{\r
td_u32 screen_width = dpu_disp_get_srceen_width();\r
td_u32 screen_height = dpu_disp_get_srceen_height();\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ gp_region->x = 0;\r
+ gp_region->y = 0;\r
+ gp_region->width = (td_u32)screen_width;\r
+ gp_region->height = (td_u32)screen_height;\r
\r
+ return;\r
+#endif\r
td_s32 end_x = 0;\r
td_s32 end_y = 0;\r
td_s32 start_x = (td_s32)screen_width;\r
\r
static td_s32 dpu_check_update_rect(dpu_layer_run_info *run_info, const drv_dpu_surface *surface)\r
{\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ run_info->update_region.x = 0;\r
+ run_info->update_region.y = 0;\r
+ run_info->update_region.width = surface->width;\r
+ run_info->update_region.height = surface->height;\r
+#else\r
if (surface->update_rect == TD_NULL) {\r
run_info->update_region.x = 0;\r
run_info->update_region.y = 0;\r
run_info->update_region.width = run_info->width;\r
}\r
}\r
-\r
+#endif\r
return EXT_SUCCESS;\r
}\r
\r
\r
td_s32 dpu_layer_refresh(void)\r
{\r
+#ifdef GPU_SUPPORT_VIDEO_MODE\r
+ td_u32 layer_id;\r
+ unsigned long flag = 0;\r
+ ext_rect gp_region = { 0 };\r
+\r
+ td_u32 time_start = 0;\r
+ td_u32 time_end = 0;\r
+ dpu_dfx_info *dfx_info = dpu_dfx_get_info();\r
+\r
+ dfx_info->refresh_cnt++;\r
+ dfx_info->refresh_total++;\r
+ dpu_dfx_get_time_us(&time_start);\r
+\r
+ dpu_disp_wait_frame_done();\r
+ dpu_layer_calculate_gp_region(&gp_region);\r
+\r
+ for (layer_id = (td_u32)DRV_DPU_LAYER_ID1; layer_id <= (td_u32)DRV_DPU_MAX_LAYER_ID; layer_id++) {\r
+ if (g_dpu_layer_dev[layer_id] == TD_NULL) {\r
+ continue;\r
+ }\r
+\r
+ if ((g_dpu_layer_dev[layer_id]->is_create != TD_TRUE) ||\r
+ (g_dpu_layer_dev[layer_id]->update_flag != TD_TRUE)) {\r
+ continue;\r
+ }\r
+\r
+ osal_spin_lock_irqsave(&g_dpu_layer_dev[layer_id]->layer_lock, &flag);\r
+ dpu_layer_revise_update_region(g_dpu_layer_dev[layer_id], &gp_region);\r
+ dpu_layer_config_update(g_dpu_layer_dev[layer_id]);\r
+ g_dpu_layer_dev[layer_id]->update_flag = TD_FALSE;\r
+ osal_spin_unlock_irqrestore(&g_dpu_layer_dev[layer_id]->layer_lock, &flag);\r
+ }\r
+ dpu_disp_set_chnl_reg_up();\r
+\r
+ dpu_dfx_get_time_us(&time_end);\r
+ dfx_info->refresh_intf_cost = (td_float)(time_end - time_start);\r
+#else\r
td_u32 layer_id;\r
unsigned long flag = 0;\r
ext_rect gp_region = { 0 };\r
\r
dpu_dfx_get_time_us(&time_end);\r
dfx_info->refresh_intf_cost = (td_float)(time_end - time_start);\r
-\r
+#endif\r
return EXT_SUCCESS;\r
}\r
\r
#include "vau_list.h"\r
#include "vau_mem.h"\r
#include "drv_vau.h"\r
+#include "vau_hal_apb.h"\r
\r
/*-------------------------------- macro define -------------------------------------------*/\r
\r
vau_dfx_info g_vau_dfx_info = {0};\r
\r
/*-------------------------------- func release -------------------------------------------*/\r
+td_s32 vau_dfx_print(int argc, const char *argv[])\r
+{\r
+ if (argc < 1) {\r
+ vau_print("usage: vau_print 0/1\n");\r
+ return EXT_FAILURE;\r
+ }\r
+\r
+ g_vau_dfx_info.print_en = (td_bool)strtoul(argv[0], TD_NULL, 10); /* 10: index */\r
+\r
+ return EXT_SUCCESS;\r
+}\r
\r
static td_void vau_dfx_print_node_info(void)\r
{\r
vau_dfx_print_node_info();\r
vau_dfx_print_func_info();\r
vau_osi_list_proc();\r
+\r
+ if (g_vau_dfx_info.print_en != TD_TRUE) {\r
+ return EXT_SUCCESS;\r
+ }\r
+\r
+ vau_hal_apb_print_all_reg();\r
+\r
return EXT_SUCCESS;\r
}\r
\r
dfx_mem_info mem_info;\r
dfx_func_info func_info;\r
td_bool is_print_vau_api;\r
+ td_bool print_en;\r
} vau_dfx_info;\r
\r
/*-------------------------------- func declares ------------------------------------------*/\r
vau_dfx_info *vau_dfx_get_info(td_void);\r
td_bool vau_dfx_check_mask(td_u32 mask);\r
td_void vau_dfx_print_path(const td_u8 *cmds, const td_float *datas, td_u16 cmd_num, td_u16 data_num);\r
+td_s32 vau_dfx_print(int argc, const char *argv[]);\r
td_s32 vau_dfx_proc_read(int argc, const char *argv[]);\r
td_s32 vau_dfx_proc_write(int argc, const char *argv[]);\r
\r
return;\r
}\r
\r
-td_void vau_hal_apb_print_reg(td_u32 base, td_u32 start, td_u32 end)\r
+static td_void vau_print_reg(td_u32 base, td_u32 start, td_u32 end)\r
{\r
- volatile td_u32 value;\r
td_u32 size = end - start;\r
td_u32 *addr = (td_u32 *)(base + start);\r
\r
vau_print("%04x: %08x %08x %08x %08x\n", ((td_u32)addr + i * 16), /* 16:index */\r
addr[i * 4], addr[i * 4 + 1], addr[i * 4 + 2], addr[i * 4 + 3]); /* 2,3,4:index */\r
}\r
+}\r
+\r
+td_void vau_hal_apb_print_reg(td_u32 base, td_u32 start, td_u32 end)\r
+{\r
+ volatile td_u32 value;\r
\r
+ vau_print_reg(base, start, end);\r
uapi_reg_read(HAL_VAU_DRAW_PATH_CMD_ADDR, value);\r
td_u8 *cmds = (td_u8 *)(uintptr_t)value;\r
uapi_reg_read(HAL_VAU_DRAW_PATH_DATA_ADDR, value);\r
\r
td_void vau_hal_apb_print_all_reg(td_void)\r
{\r
- vau_hal_apb_print_reg(HAL_VAU_REG_BASEADDR, 0, 0x40AC);\r
+ vau_print_reg(HAL_VAU_REG_BASEADDR, 0, 0x164); /* reg:0~0x164 */\r
+ vau_print_reg(HAL_VAU_REG_BASEADDR, 0x200, 0x260); /* reg:0x200~0x260 */\r
+ vau_print_reg(HAL_VAU_REG_BASEADDR, 0x500, 0x534); /* reg:0x500~0x534 */\r
+ vau_print_reg(HAL_VAU_REG_BASEADDR, 0xA00, 0xA60); /* reg:0xA00~0xA60 */\r
+ vau_hal_apb_print_reg(HAL_VAU_REG_BASEADDR, 0x4000, 0x40AC); /* reg:0x4000~0x40AC */\r
+\r
return;\r
}\r
#include "vau_handle.h"\r
#include "drv_vau_struct.h"\r
#include "drv_gmmu_intf.h"\r
+#include "pmp_config.h"\r
\r
#define DRV_VAU_IOCTL_CMD_NUM 20\r
\r
vau_dbg("vau suspend ok");\r
\r
#ifdef SUPPORT_GPU_GMMU\r
- (td_void)drv_gmmu_suspend(NULL);\r
+ pmp_configure_gmmu_region(0);\r
+ (td_void)drv_gmmu_suspend(NULL);\r
#endif\r
\r
return ret;\r
vau_dbg("vau resume ok");\r
\r
#ifdef SUPPORT_GPU_GMMU\r
- (void)drv_gmmu_resume(NULL);\r
+ (void)drv_gmmu_resume(NULL);\r
+ pmp_configure_gmmu_region(1);\r
#endif\r
\r
return EXT_SUCCESS;\r
vau_err("drv_gmmu_module_init failed, ret=%#x!", ret);\r
return ret;\r
}\r
+ pmp_configure_gmmu_region(1);\r
#endif\r
vau_ip_dcmp_tmp();\r
\r
vau_unregister_device();\r
vau_list_deinit();\r
vau_mem_deinit();\r
+#ifdef SUPPORT_GPU_GMMU\r
+ pmp_configure_gmmu_region(0);\r
+#endif\r
}\r
(td_void *)DRV_VAU_TIMEOUT_DBG_ADDR, sizeof(g_vau_sw_job_list->dbg.timeout_reg)) != EOK) {
vau_err("memcpy_s failed");
}
- if (g_vau_sw_job_list->dbg.software_timeout < 10) { /* 10:index */
+ if (g_vau_sw_job_list->dbg.software_timeout < 4) { /* 4:index */
for (td_u32 i = 0; i < DRV_VAU_TIMEOUT_REG_SIZE / 4; i++) { /* 4:index */
vau_print("%04x: %08x %08x %08x %08x\n", (i * 16), /* 16:index */
g_vau_sw_job_list->dbg.timeout_reg[i * 4 + 0], /* 4:index */
g_vau_sw_job_list->dbg.timeout_reg[i * 4 + 2], /* 4,2:index */
g_vau_sw_job_list->dbg.timeout_reg[i * 4 + 3]); /* 4,3:index */
}
+ vau_mem_check_psram_addr();
+ vau_dfx_proc_read(0, TD_NULL);
}
- vau_mem_check_psram_addr();
- vau_dfx_proc_read(0, TD_NULL);
- vau_hal_apb_print_all_reg();
if (!g_vau_sw_job_list->dbg.no_reset) {
vau_hal_init();
} else {