MTK Linux DRM分析(二十三)- MTK mtk_drm_crtc.c(Part2)

发布于:2025-08-30 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、代码分析

mtk_drm_crtc2.c 中主要函数的基本作用分析,基于提供的代码片段。这些函数是 MediaTek DRM (Direct Rendering Manager) 驱动的一部分,主要用于管理显示控制器(CRTC)的触发循环、事件循环、硬件同步、调试输出等功能。以下按功能分组,简要说明每个函数的作用,保持清晰简洁,并避免过多技术细节。


1. CMDQ 回调函数

  • trig_done_cb
    • 作用: CMDQ 触发循环完成时的回调函数,记录触发循环完成事件。
    • 关键点: 使用 CRTC_MMP_MARK 和 drm_trace_tag_mark 记录日志,标记触发循环的完成状态,当前仅用于非低功耗视频模式。
  • event_done_cb
    • 作用: CMDQ 事件循环完成时的回调函数,记录事件循环完成事件。
    • 关键点: 使用 drm_trace_tag_mark 记录日志,标记事件循环的完成状态。
  • lcm_cmd_cmdq_cb
    • 作用: 处理 LCM(LCD Module)命令的 CMDQ 回调,记录特定事件(如自动模式、最小帧率等)的完成。
    • 关键点: 支持 OPLUS ADFR 特性,根据 misc 值记录不同事件(如 fftimer_end, automode_end),释放 CMDQ 句柄并清理回调数据。

2. 事件和触发循环管理

  • mtk_crtc_clear_wait_event
    • 作用: 清除 CRTC 的等待事件(如 EOF 信号),确保显示事件状态正确。
    • 关键点: 在触发模式下,创建 CMDQ 包,设置 EVENT_STREAM_EOF、EVENT_ESD_EOF 和 EVENT_CABC_EOF 事件,执行并销毁 CMDQ 包。
  • mtk_crtc_start_sodi_loop
    • 作用: 启动 SODI(Screen-Off Display Idle)循环,用于低功耗管理。
    • 关键点:
      • 仅对 CRTC ID 为 0 有效,创建 CMDQ 包并等待 EVENT_CMD_EOF 和 EVENT_SYNC_TOKEN_SODI 事件。
      • 写入 GCE 寄存器以启用 DDR,执行异步刷新,解决 GCE 硬件问题。
  • mtk_crtc_start_event_loop
    • 作用: 启动事件循环,管理显示时序(如 TE、DSI PLL、电源管理等)。
    • 关键点:
      • 配置显示时序参数(如 dsi_pll_check_off_offset, prefetch_te_offset),支持动态 FPS 和 OPLUS ADFR/MFR 模式。
      • 根据硬件选项(如 MTK_DRM_OPT_PREFETCH_TE)启用预取、合并触发等功能。
      • 使用 CMDQ 包设置事件、睡眠、条件跳转等,处理 DSI PLL 开关和电源管理。
      • 异步执行并绑定 event_done_cb 回调。
  • mtk_crtc_start_trig_loop
    • 作用: 启动触发循环,管理显示触发信号。
    • 关键点:
      • 如果 CMDQ 被禁用,直接返回并记录日志。
      • 创建 CMDQ 包,配置触发相关逻辑(代码未完整显示,但通常涉及触发信号的设置和刷新)。

3. 硬件重置和配置

  • mtk_crtc_rec_trig_cnt
    • 作用: 记录触发计数(未完全实现,标记为 IF_ZERO)。
    • 关键点: 使用 CMDQ 逻辑指令增加计数器并写入寄存器,记录触发次数,可能用于调试或监控。
  • cmdq_pkt_reset_ovl_by_crtc
    • 作用: 检查 OVL(Overlay)层计数并重置 OVL 组件。
    • 关键点:
      • 读取 OVL 层的 GREQ 计数,检查是否为 0。
      • 如果计数非零,重置组件并更新 GCE 备份槽,记录组件 ID 和计数。
  • cmdq_pkt_reset_ovl
    • 作用: 重置 CRTC 路径中的所有 OVL 组件。
    • 关键点: 遍历主路径和双管道路径,仅对 OVL 类型组件执行 cmdq_pkt_reset_ovl_by_crtc,支持多层重置(最多 OVL_RT_LOG_NR 层)。
  • cmdq_pkt_request_te
    • 作用: 配置 TE(Tearing Effect)信号请求逻辑。
    • 关键点:
      • 读取 TE 启用状态,基于条件跳转决定是否执行 TE 切换。
      • 调用 DSI_MSYNC_SWITCH_TE_LEVEL_GRP 设置 TE 级别,支持动态刷新率调整。
  • cmdq_pkt_wait_te
    • 作用: 等待 TE 信号,确保显示同步。
    • 关键点:
      • 检查 TE 启用状态,清除并等待 EVENT_TE 或 EVENT_GPIO_TE1 事件。
      • 支持 Msync2.0,通过 cmdq_pkt_request_te 请求 TE 信号,处理双 TE 场景。

4. Panel Master 相关

  • mtk_crtc_start_for_pm
    • 作用: 为 Panel Master 启动 CRTC,初始化触发循环和组件。
    • 关键点:
      • 启动触发循环(如果启用),创建 CMDQ 包。
      • 在非触发模式下启动 DSI 视