MTK Linux DRM分析(三十八)- MTK mtk_fenc.c mtk_sync.c

一、mtk_fence

mtk_fence.h 和 mtk_fence.c 是 MediaTek 平台的显示驱动程序的一部分,属于 Linux 内核的 DRM (Direct Rendering Manager) 子系统,用于管理 GPU 和显示硬件的同步机制。该驱动主要用于处理 显示缓冲区(buffer)同步对象(fence) 的管理,以确保在多层显示(overlay)场景下,缓冲区的渲染和显示操作能够正确同步,特别是在多会话(session)显示(如主显示、外部显示或内存显示)中。

具体来说,mtk_fence 驱动的主要功能包括:

  1. 显示缓冲区管理
    • 管理显示缓冲区的分配、更新和释放,特别是在多层显示(如 Overlay)场景中。
    • 通过 mtk_fence_buf_info 结构跟踪缓冲区的元数据,如索引、fence 文件描述符、内存虚拟地址 (MVA)、状态等。
  2. 同步机制
    • 使用 Linux 内核的 sync_timeline 和 sync_file 机制来创建和管理 fence 对象,确保缓冲区的渲染和显示操作按正确顺序执行。
    • 支持多条时间线(timeline),如主显示时间线、外部显示时间线、软件呈现时间线等,用于协调不同显示会话的同步。
  3. 会话管理
    • 支持多种会话类型(主显示、外部显示、内存显示、SP 会话等),通过 mtk_fence_session_sync_info 管理每个会话的同步信息。
    • 每个会话可以包含多个时间线(timeline),对应不同的显示层或输出。
  4. 与 DRM 框架的集成
    • 与 MediaTek 的 DRM 驱动(mediatek_drm.h)集成,处理缓冲区提交 (drm_mtk_gem_submit) 和硬件同步。
    • 支持缓存层配置 (FENCE_LAYER_INFO),用于存储和查询显示层的配置信息。
  5. 性能优化与调试
    • 提供日志记录功能(如 MTK_FENCE_LOG、DDPFENCE 等),用于调试和性能分析。
    • 使用 CRTC_MMP_MARK 和 drm_trace 进行性能跟踪和事件标记。

该驱动主要用于 MediaTek SoC 的显示子系统,特别是在 Android 设备中,用于协调 GPU 渲染、显示控制器(如 Overlay 引擎)和显示输出(如 HDMI 或内置屏幕)之间的操作,确保平滑的帧更新和同步。


主要函数分析

以下是对 mtk_fence.c 中主要函数的分析,涵盖其功能、参数和用途:

1. mtk_fence_init
  • 功能:初始化全局的 fence 上下文。
  • 实现
    • 清空 _mtk_fence_context 数组(存储会话同步信息的全局数组)。
    • 将所有会话的 session_id 设置为 0xffffffff,表示未分配。
  • 用途:在驱动加载时初始化 fence 管理模块,为后续会话和时间线分配做好准备。
  • 调用场景:通常在驱动模块初始化时调用。
2. _get_session_sync_info
  • 功能:根据 session_id 获取或分配一个会话的同步信息结构 (mtk_fence_session_sync_info)。
  • 实现
    • 检查 session_id 是否有效(支持主显示、外部显示、内存显示、SP 会话)。
    • 在 _mtk_fence_context 数组中查找匹配的 session_id,如果找到则返回对应的 session_info。
    • 如果未找到,则分配一个新的会话槽位,初始化时间线和层信息,并为每个时间线创建 sync_timeline。
  • 用途:为特定会话(如主显示或外部显示)获取同步上下文,确保后续操作能正确管理时间线和缓冲区。
  • 关键点
    • 使用互斥锁 _disp_fence_mutex 保护全局上下文访问。
    • 为每个时间线生成唯一的名称(如 P0_prepare、E1_setinput 等),用于调试和跟踪。
3. _disp_sync_get_sync_info
  • 功能:根据 session_id 和 timeline_id 获取特定时间线的 mtk_fence_info 结构。
  • 实现
    • 调用 _get_session_sync_info 获取会话信息。
    • 检查 timeline_id 是否有效,并返回对应的 layer_info。
  • 用途:用于获取特定时间线的同步信息(如某个显示层的 fence 和缓冲区列表)。
  • 关键点
    • 确保 layer_info 已初始化 (inited 标志),否则返回错误。
4. mtk_fence_prepare_buf
  • 功能:为提交的缓冲区 (drm_mtk_gem_submit) 创建 fence 对象并准备 mtk_fence_buf_info 结构。
  • 参数
    • dev:DRM 设备。
    • buf:包含缓冲区信息的提交结构(如 ion_fd、session_id、layer_id)。
    • is_implicit:是否创建共享 fence(用于跨进程同步)。
    • resv:DMA 保留对象,用于关联 fence。
  • 实现
    • 获取会话和时间线的同步信息。
    • 从缓冲池 (info_pool_head) 获取或分配 mtk_fence_buf_info。
    • 创建 fence 对象(通过 mtk_sync_fence_create 或 mtk_sync_share_fence_create)。
    • 将 ion_fd 导入为 dma_buf 句柄,存储到 buf_info。
    • 将 buf_info 添加到时间线的缓冲区列表。
  • 用途:为新的显示缓冲区创建同步点,确保渲染和显示操作按顺序执行。
  • 关键点
    • 使用互斥锁保护时间线和缓冲区列表操作。
    • 支持 ION 缓冲区(buf_hnd),并记录 fence 文件描述符和索引。
5. mtk_release_fence
  • 功能:释放指定会话和层的 fence 及其关联的缓冲区。
  • 参数
    • session_id:会话 ID。
    • layer_id:时间线 ID(通常对应显示层)。
    • fence:要释放的 fence 索引。
  • 实现
    • 获取时间线的 layer_info。
    • 计算需要释放的 fence 数量(fence - timeline_idx)。
    • 调用 mtk_sync_timeline_inc 增加时间线计数,触发 fence 信号。
    • 遍历缓冲区列表,释放索引小于或等于 fence 的缓冲区(包括释放 dma_buf 和将 buf_info 放回缓冲池)。
  • 用途:在显示帧完成时释放不再需要的 fence 和缓冲区,回收资源。
  • 关键点
    • 使用 fence_buffer_mutex 保护缓冲池操作。
    • 记录释放的 fence 和 ION 句柄数量,检测潜在错误。
6. mtk_release_layer_fence
  • 功能:释放指定会话和层的所有 fence。
  • 实现
    • 获取时间线的 layer_info,读取当前 fence_idx。
    • 调用 mtk_release_fence 释放所有 fence。
  • 用途:在显示层关闭或重置时,清理所有相关的同步资源。
7. mtk_release_present_fence 和 mtk_release_sf_present_fence
  • 功能:释放特定会话的呈现时间线(present timeline)或软件呈现时间线的 fence。
  • 参数
    • session_id:会话 ID。
    • fence_idx:要释放的 fence 索引。
    • time(仅 mtk_release_present_fence):fence 信号的时间戳。
  • 实现
    • 获取呈现时间线的 layer_info。
    • 计算需要增加的 fence 计数,调用 mtk_sync_timeline_inc 触发信号。
    • 记录性能标记(如 CRTC_MMP_MARK)和跟踪信息。
  • 用途:用于通知显示框架,当前帧已完成呈现,触发下一阶段的处理。
  • 关键点
    • 支持不同会话类型(如主显示、外部显示)的呈现时间线。
    • 记录警告日志,如果 fence 增量大于 2。
8. mtk_fence_query_buf_info
  • 功能:查询指定缓冲区的元数据(如 MVA、大小、虚拟地址)。
  • 参数
    • session_id 和 timeline_id:会话和时间线 ID。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值