一、代码分析
(1) mtk_drm_ddp.h (头文件)
- 总体内容:这是一个显示数据路径(DDP:Display Data Path)的核心头文件,定义了MediaTek DRM驱动中与显示互斥量(mutex)、组件(comp)和路径相关的结构和函数。主要用于管理显示管道的同步和组件连接。
- 关键结构:
- struct mtk_disp_mutex:表示显示互斥量,用于同步显示组件。
- struct mtk_disp_ddp_data:包含互斥量模块、SOF(Start of Frame)等配置数据。
- struct mtk_ddp:核心DDP结构,包含设备、时钟、寄存器、互斥量数组等。
- struct dummy_mapping:用于虚拟寄存器映射。
- 关键宏和常量:
- 定义互斥量总数(DISP_MUTEX_TOTAL = 16)、DDP组件ID范围等。
- 函数声明:
- 互斥量管理:mtk_disp_mutex_get、mtk_disp_mutex_prepare、mtk_disp_mutex_add_comp、mtk_disp_mutex_enable 等,用于获取、准备、添加组件、启用/禁用互斥量。
- 路径管理:mtk_ddp_add_comp_to_path、mtk_ddp_remove_comp_from_path 等,用于动态添加/移除显示路径中的组件。
- 转储和调试:mutex_dump_reg_*、mmsys_config_dump_reg_* 等函数,用于寄存器转储和分析(针对不同芯片如MT6885、MT6983等)。
- 特定功能:如插入/移除DSC(Display Stream Compression)组件、mtk_ddp_connect_dual_pipe_path 等,支持双管道路径。
- 特点:高度芯片特定(e.g., MT6983、MT6879),支持CMDQ(Command Queue)扩展,用于异步命令执行。依赖于其他头文件如mtk_drm_ddp_comp.h、mtk_drm_crtc.h、mtk-cmdq-ext.h。
(2) mtk_drm_ddp_addon.h (头文件)
- 总体内容:这是一个扩展头文件,专注于DDP的"附加"(addon)功能,用于处理显示路径的额外模块配置,如缩放(RSZ)、PQ(Picture Quality)、WDMA(Write DMA)等。引入了附加场景和模块的概念,支持动态路径配置。
- 关键结构:
- enum addon_scenario:定义场景,如NONE、ONE_SCALING、GAME_PQ、MML_WITH_PQ(MML:MediaTek Multimedia Layer,支持PQ和旋转)。
- enum addon_module:定义模块,如DISP_RSZ、DISP_WDMA0、DISP_MML_IR_PQ 等。
- enum addon_type:类型,如ADDON_BETWEEN(插入路径中)、ADDON_BEFORE(插入前)、ADDON_CONNECT(连接)等。
- struct mtk_addon_path_data:路径数据,包括路径数组和长度。
- struct mtk_addon_module_data:模块数据,包括模块、类型和附加组件。
- struct mtk_addon_scenario_data:场景数据,包括模块数量、模块数据和HRT类型(High Resolution Timer?)。
- 配置结构:struct mtk_addon_rsz_config(RSZ配置)、struct mtk_addon_wdma_config(WDMA配置)、struct mtk_addon_mml_config(MML配置),以及联合体union mtk_addon_config。
- 函数声明:
- 获取路径/场景:mtk_addon_module_get_path、mtk_addon_get_scenario_data、mtk_addon_get_scenario_data_dual、mtk_addon_scenario_support。
- 配置路径:mtk_addon_path_config。
- 连接/断开:mtk_addon_connect_between、mtk_addon_disconnect_between、mtk_addon_connect_before 等,支持不同类型(between、before、after、external、embed)。
- 特点:依赖于DRM CRTC(Cathode Ray Tube Controller)和CMDQ。支持双管道(dual pipe)和MML集成,用于高级显示处理如PQ增强、旋转和直接链接(DL)。
(3) mtk_drm_ddp_addon.c (源文件) - 重点分析
- 总体内容:这是mtk_drm_ddp_addon.h的实现文件,负责实际配置显示附加路径和模块。文件定义了各种路径数组(e.g., disp_rsz_path、disp_mml_rsz_path),并实现了路径连接、断开、配置等逻辑。核心是动态管理显示管道中的附加组件,支持芯片特定场景(如MML PQ、RSZ缩放、WDMA写回)。
- 关键路径数组:
- 定义了多种附加路径,如disp_rsz_path(RSZ路径)、disp_wdma0_path(WDMA路径)、disp_mml_rsz_path(MML RSZ路径,包括HDR、AAL、TDSHP、COLOR等PQ组件)。
- 这些路径是DDP组件ID的数组,用于构建子路径(subpath)。
- 全局数组addon_module_path:映射每个附加模块到其路径数据。
- 主要函数实现:
- 获取函数:
- mtk_addon_module_get_path:返回模块的路径数据。
- mtk_addon_get_scenario_data / mtk_addon_get_scenario_data_dual:从CRTC的路径数据中获取场景数据,支持错误检查。
- mtk_addon_scenario_support:检查CRTC是否支持特定场景。
- 配置函数:
- mtk_addon_path_config:遍历路径,调用mtk_ddp_comp_addon_config配置每个组件(传入前后组件ID和配置联合体)。
- 路径启动/停止:
- mtk_addon_path_start:遍历路径,启动非虚拟组件(调用mtk_ddp_comp_start)。
- mtk_addon_path_stop:遍历路径,停止组件(调用mtk_ddp_comp_stop),并在断开时额外配置MML IR PQ模块。
- 互斥量和路径管理(内部函数):
- mtk_addon_path_connect_and_add_mutex:连接路径组件(mtk_ddp_add_comp_to_path_with_cmdq),添加互斥量(mtk_disp_mutex_add_comp_with_cmdq)。
- mtk_addon_path_disconnect_and_remove_mutex:反向操作,移除组件和互斥量。
- 连接/断开函数(核心API):
- mtk_addon_connect_between / mtk_addon_disconnect_between:在路径中间插入/移除子路径,支持附加组件的动态调整。
- mtk_addon_connect_before / mtk_addon_disconnect_before:在附加组件前插入/移除。
- mtk_addon_connect_after / mtk_addon_disconnect_after:在附加组件后插入/移除。
- mtk_addon_connect_external / mtk_addon_disconnect_external:外部连接/断开(可能用于独立路径)。
- mtk_addon_connect_embed / mtk_addon_disconnect_embed:嵌入式连接/断开(将子路径嵌入附加组件中)。
- 这些函数的逻辑类似:(1) 附加/分离CRTC组件;(2) 连接/断开子路径并管理互斥量;(3) 添加/移除主路径中的组件;(4) 配置组件(多次调用mtk_ddp_comp_addon_config);(5) 启动/停止路径。
- 特点和注意点:
- CMDQ集成:所有操作使用struct cmdq_