MTK Linux DRM分析(二十四)- MTK mtk_drm_plane.c

一、代码分析

mtk_drm_plane.h 和 mtk_drm_plane.c 两个文件,并生成基于文本的函数调用图,我将首先解析文件中的主要函数及其功能,然后根据代码中的调用关系整理出调用图。由于文件内容较长,我会专注于关键函数及其相互调用关系,并以清晰的文本形式呈现。

文件分析

1. mtk_drm_plane.h

作用: 该头文件定义了 MediaTek DRM (Direct Rendering Manager) 平面相关的结构体、枚举和函数声明,主要用于管理显示平面(plane)的属性和状态。关键内容:
枚举:
DISP_ORIENTATION: 定义显示方向(如 0°、90°、180°、270°)。DISP_FORMAT: 定义支持的像素格式(如 RGB565、ARGB8888 等),并通过 MAKE_DISP_FORMAT_ID 宏生成格式 ID。DISP_LAYER_TYPE: 定义图层类型(2D、3D 侧-by-side、top-and-bottom 等)。DISP_BUFFER_TYPE: 定义缓冲区类型(普通、保护、加密)。DISP_BUFFER_SOURCE: 定义缓冲区来源(ION、MVA、Alpha)。DISP_ALPHA_TYPE: 定义 Alpha 混合类型。DISP_YUV_RANGE_ENUM: 定义 YUV 颜色范围(如 BT601、BT709)。MTK_FMT_MODIFIER: 定义格式修饰符(如预乘、加密)。MTK_PLANE_PROP: 定义平面属性(如 Alpha、数据空间、压缩等)。
结构体:
mtk_crtc_ovl_csc_config: 用于存储 CSC(颜色空间转换)配置。mtk_drm_plane: 扩展 DRM 平面结构体,包含自定义属性。mtk_plane_pending_state: 存储平面的待处理状态(如地址、格式、尺寸等)。mtk_plane_input_config: 定义平面输入配置(如缓冲区地址、格式、旋转等)。mtk_plane_comp_state: 存储平面组件状态(如组件 ID、图层能力)。mtk_plane_state: 扩展 DRM 平面状态,包含待处理状态、组件状态和属性值。
函数声明:
mtk_plane_init: 初始化 DRM 平面。mtk_get_format_bpp: 获取像素格式的每像素字节数。mtk_get_format_name: 获取像素格式的名称。mtk_plane_get_comp_state: 获取平面组件状态。to_crtc_plane_index: 将平面索引转换为 CRTC 平面索引。

2. mtk_drm_plane.c

作用: 该源文件实现了头文件中声明的功能,主要处理 DRM 平面的初始化、状态管理、属性设置/获取、以及原子更新等逻辑。关键函数:
to_crtc_plane_index: 将全局平面索引转换为 CRTC 相关的平面索引。mtk_get_format_bpp: 根据像素格式返回每像素字节数。mtk_get_format_name: 根据像素格式返回格式名称字符串。mtk_plane_reset: 重置平面状态,设置默认值(如格式为 RGB565)。mtk_plane_duplicate_state: 复制平面状态,保留旧状态的属性值。mtk_drm_plane_destroy_state: 销毁平面状态,释放内存。mtk_plane_atomic_set_property: 设置平面属性值。mtk_plane_atomic_get_property: 获取平面属性值。mtk_plane_atomic_check: 检查平面状态的有效性(如缓冲区、CRTC、分辨率等)。mtk_plane_get_comp_state: 获取平面组件状态(在 MTK_DRM_ADVANCE 宏下实现)。mtk_plane_atomic_update: 更新平面状态,配置缓冲区、尺寸、位置等。mtk_plane_atomic_disable: 禁用平面,设置待处理状态为禁用。dummy_helper_prepare_fb / dummy_plane_helper_cleanup_fb: 空实现的帧缓冲区准备和清理函数。mtk_plane_attach_property: 为平面附加自定义属性。mtk_plane_init: 初始化 DRM 平面,设置函数表和属性。

函数调用图

以下是基于 mtk_drm_plane.c 的函数调用关系,以文本形式表示。调用图展示了主要函数之间的直接调用关系,格式为 调用者 -> 被调用者,并附带简要说明。为了保持清晰,仅列出关键函数的调用关系,忽略次要或外部函数(如 DDP 系列日志函数)。



1. mtk_plane_init
   ├── drm_universal_plane_init
   │   └── 初始化 DRM 平面,设置平面类型、格式和可能的 CRTC
   └── mtk_plane_attach_property
       └── drm_property_create_range
           └── 创建 DRM 属性并附加到平面
 
2. mtk_plane_attach_property
   └── drm_property_create_range
       └── 创建范围属性(如 NEXT_BUFF_IDX、PLANE_PROP_ALPHA_CON 等)
 
3. mtk_plane_reset
   ├── __drm_atomic_helper_plane_destroy_state
   │   └── 销毁旧的平面状态
   └── kzalloc
       └── 分配新的平面状态内存
 
4. mtk_plane_duplicate_state
   ├── __drm_atomic_helper_plane_duplicate_state
   │   └── 复制 DRM 平面状态
   ├── kzalloc
   │   └── 分配新状态内存
   └── to_mtk_plane
       └── 将 DRM 平面转换为 MTK 平面结构体
 
5. mtk_drm_plane_destroy_state
   ├── __drm_atomic_helper_plane_destroy_state
   │   └── 销毁 DRM 平面状态
   └── kfree
       └── 释放平面状态内存
 
6. mtk_plane_atomic_set_property
   └── to_mtk_plane
       └── 将 DRM 平面转换为 MTK 平面以访问属性
 
7. mtk_plane_atomic_get_property
   └── to_mtk_plane
       └── 将 DRM 平面转换为 MTK 平面以获取属性
 
8. mtk_plane_atomic_check
   ├── drm_atomic_get_new_plane_state
   │   └── 获取新的平面状态
   ├── mtk_fb_get_gem_obj
   │   └── 获取帧缓冲区的 GEM 对象
   ├── drm_atomic_get_crtc_state
   │   └── 获取 CRTC 状态
   ├── to_mtk_crtc
   │   └── 将 DRM CRTC 转换为 MTK CRTC
   ├── mtk_drm_crtc_avail_disp_mode
   │   └── 获取可用显示模式
   ├── to_mtk_crtc_state
   │   └── 将 DRM CRTC 状态转换为 MTK CRTC 状态
   └── drm_atomic_helper_check_plane_state
       └── 检查平面状态(如缩放范围)
 
9. mtk_plane_get_comp_state (在 MTK_DRM_ADVANCE 宏下)
   ├── to_mtk_crtc_state
   │   └── 获取 MTK CRTC 状态
   ├── to_mtk_crtc
   │   └── 获取 MTK CRTC
   ├── mtk_drm_helper_get_opt
   │   └── 获取 DRM 选项(如 SPHRT)
   ├── drm_property_lookup_blob
   │   └── 查找属性 blob
   ├── drm_property_blob_put
   │   └── 释放 blob 引用
   └── _mtk_plane_get_comp_state
       └── 复制组件状态数据
 
10. mtk_plane_atomic_update
    ├── to_mtk_plane_state
    │   └── 获取 MTK 平面状态
    ├── to_mtk_crtc
    │   └── 获取 MTK CRTC
    ├── to_mtk_crtc_state
    │   └── 获取 MTK CRTC 状态
    ├── mtk_drm_fb_is_secure
    │   └── 检查帧缓冲区是否为加密缓冲区
    ├── mtk_fb_get_dma
    │   └── 获取帧缓冲区的 DMA 地址
    ├── mtk_fb_get_size
    │   └── 获取帧缓冲区大小
    ├── mtk_drm_crtc_plane_update
    │   └── 更新 CRTC 的平面配置
    └── atomic_set
        └── 设置 CRTC 的配置标志
 
11. mtk_plane_atomic_disable
    ├── to_mtk_plane_state
    │   └── 获取 MTK 平面状态
    ├── drm_atomic_get_old_plane_state
    │   └── 获取旧的平面状态
    └── mtk_drm_crtc_plane_disable
        └── 禁用 CRTC 的平面
 
12. mtk_get_format_bpp
    └── 无直接调用其他函数,仅通过 switch-case 返回字节数
 
13. mtk_get_format_name
    └── 无直接调用其他函数,仅通过 switch-case 返回格式名称
 
14. to_crtc_plane_index
    └── 无直接调用其他函数,仅通过条件判断返回索引

说明

调用关系:

mtk_plane_init 是入口函数,负责初始化平面并附加属性。mtk_plane_reset、mtk_plane_duplicate_state 和 mtk_drm_plane_destroy_state 管理平面状态的生命周期。mtk_plane_atomic_* 函数(如 set_property、get_property、check、update、disable)处理原子操作,与 DRM 框架的原子更新机制紧密相关。mtk_plane_get_comp_state 涉及高级功能(如 LYE blob),仅在 MTK_DRM_ADVANCE 宏启用时生效。to_mtk_plane 和 to_mtk_plane_state 是常用的类型转换宏,贯穿多个函数。
关键依赖:
DRM 框架函数(如 drm_universal_plane_init、drm_atomic_helper_*)。MediaTek 自定义函数(如 mtk_fb_get_*、mtk_drm_crtc_*)。内存管理函数(如 kzalloc、kfree)。
日志函数:
DDPINFO、DDPPR_ERR、DDPDBG 等用于调试和日志记录,未在调用图中详细列出。
条件编译:
部分功能(如 mtk_plane_get_comp_state 和 OPLUS_FEATURE_DISPLAY_PANELCHAPLIN)受宏控制,可能在特定场景下启用。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
葵葵也要吃饭饭的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容