一、mtk_fence
mtk_fence.h 和 mtk_fence.c 是 MediaTek 平台的显示驱动程序的一部分,属于 Linux 内核的 DRM (Direct Rendering Manager) 子系统,用于管理 GPU 和显示硬件的同步机制。该驱动主要用于处理 显示缓冲区(buffer) 和 同步对象(fence) 的管理,以确保在多层显示(overlay)场景下,缓冲区的渲染和显示操作能够正确同步,特别是在多会话(session)显示(如主显示、外部显示或内存显示)中。
具体来说,mtk_fence 驱动的主要功能包括:
- 显示缓冲区管理:
- 管理显示缓冲区的分配、更新和释放,特别是在多层显示(如 Overlay)场景中。
- 通过 mtk_fence_buf_info 结构跟踪缓冲区的元数据,如索引、fence 文件描述符、内存虚拟地址 (MVA)、状态等。
- 同步机制:
- 使用 Linux 内核的 sync_timeline 和 sync_file 机制来创建和管理 fence 对象,确保缓冲区的渲染和显示操作按正确顺序执行。
- 支持多条时间线(timeline),如主显示时间线、外部显示时间线、软件呈现时间线等,用于协调不同显示会话的同步。
- 会话管理:
- 支持多种会话类型(主显示、外部显示、内存显示、SP 会话等),通过 mtk_fence_session_sync_info 管理每个会话的同步信息。
- 每个会话可以包含多个时间线(timeline),对应不同的显示层或输出。
- 与 DRM 框架的集成:
- 与 MediaTek 的 DRM 驱动(mediatek_drm.h)集成,处理缓冲区提交 (drm_mtk_gem_submit) 和硬件同步。
- 支持缓存层配置 (FENCE_LAYER_INFO),用于存储和查询显示层的配置信息。
- 性能优化与调试:
- 提供日志记录功能(如 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。

- MTK mtk_fenc.c mtk_sync.c&spm=1001.2101.3001.5002&articleId=151189436&d=1&t=3&u=5e46add80d1248e7bb8c616a5036c0b5)
2888

被折叠的 条评论
为什么被折叠?



