一、mtk_drm_gem代码分析
mtk_drm_gem.c 和 mtk_drm_gem.h 代码分析
这个代码模块是 MediaTek DRM (Direct Rendering Manager) 驱动程序的 GEM (Graphics Execution Manager) 部分,主要负责管理图形缓冲区对象(GEM 对象)。GEM 是 DRM 框架用于处理用户空间缓冲区分配、映射和共享的核心机制,支持 DMA 缓冲区、IOMMU(通过 M4U)、secure buffer(用于内容保护)、PRIME(DMA-BUF 共享)和 MML(Multi-Media Layer,多媒体层处理)。该模块扩展了 DRM 的 GEM 功能,针对 MediaTek SoC(如 MT6885)优化,支持从 DMA heap 分配缓冲区、ION(Ion Memory Allocator)导入、fence 同步和 MML 提交。代码依赖 DRM 核心(如 drm_gem.h、drm_prime.h)和 MediaTek 特定模块(如 mtk_drm_drv.h、mtk_fence.h、mml/mtk-mml.h)。
下面我将代码分为几个主要部分,分析其实现内容和作用。分析基于提供的 mtk_drm_gem.h 和 mtk_drm_gem.c 文件。
1. 头文件定义和结构(mtk_drm_gem.h 中的主要部分)
- 实现:
- 定义 mtk_drm_gem_obj 结构:扩展 drm_gem_object,包含 cookie(DMA 分配的指针)、kvaddr(内核虚拟地址)、dma_addr(DMA 地址)、size(大小)、dma_attrs(DMA 属性,如 WRITE_COMBINE)、sg(scatter-gather 表)、sec(是否 secure)、is_dumb(是否 dumb buffer)。
- 宏定义:to_mtk_gem_obj(容器转换)。
- 函数声明:
- 创建/释放:mtk_drm_gem_create、mtk_drm_gem_create_from_heap、mtk_drm_gem_free_object。
- Dumb 操作:mtk_drm_gem_dumb_create、mtk_drm_gem_dumb_map_offset。
- mmap:mtk_drm_gem_mmap、mtk_drm_gem_mmap_buf。
- ION 操作:mtk_drm_gem_ion_free_handle、mtk_drm_gem_ion_import_handle。
- PRIME 操作:mtk_gem_prime_get_sg_table、mtk_gem_prime_import_sg_table。
- ioctl:mtk_gem_create_ioctl、mtk_gem_map_offset_ioctl、mtk_gem_submit_ioctl、mtk_drm_ioctl_mml_gem_submit。
- FB 操作:mtk_drm_fb_gem_insert、mtk_drm_fb_gem_release。
- 调试打印:print_mml_frame_buffer、print_mml_frame_info、print_mml_submit。
- 条件编译:IF_ZERO 下包含 IOMMU 和 pseudo_m4u(可能为测试或旧版本)。
- 作用:
- 提供 MediaTek GEM 对象的定义和接口声明,支持 DMA/ION 缓冲区管理。
- 确保与 DRM 核心兼容,同时扩展 secure、MML 和 heap 分配功能。
- 用于用户空间 ioctl(如创建/映射缓冲区)和内核内部缓冲区操作(如 FB 插入)。
2. GEM 对象初始化和分配辅助函数(mtk_drm_gem_init、mtk_gem_dma_alloc/free)
- 实现:
- mtk_drm_gem_init:分配 mtk_drm_gem_obj,调用 drm_gem_object_init 初始化基类。
- mtk_gem_dma