一、MTK Plane实现分析
这个代码模块是 MediaTek DRM (Direct Rendering Manager) 驱动程序的一部分,主要负责处理 DRM plane(显示层)的相关功能。Plane 是 DRM 框架中的核心概念,用于表示显示叠加层(overlay),可以叠加在 CRTC(Controller)上,支持多层合成、缩放、格式转换等操作。该模块针对 MediaTek SoC(如 MT6885、MT6983 等)优化,支持特定硬件特性,如 MML(Multi-Media Layer,用于多媒体处理)、secure buffer(安全缓冲区,用于 DRM 内容保护)、双管道缩放(dual pipe scaling)和低功耗模式(如 AOD)。代码结合了 DRM 核心框架的接口(如 drm_plane_funcs 和 drm_plane_helper_funcs),并扩展了 MediaTek 特定的属性和状态管理。
下面我将代码分为几个主要部分,分析其实现内容和作用。分析基于提供的 mtk_drm_plane.c 和 mtk_drm_plane.h 文件。
1. 头文件和常量定义(mtk_drm_plane.h 中的主要部分)
实现:
定义了枚举类型,如 DISP_ORIENTATION(旋转方向)、DISP_FORMAT(像素格式,如 RGB565、ARGB8888)、DISP_LAYER_TYPE(2D/3D 层类型)、DISP_BUFFER_TYPE(缓冲区类型,如 normal/secure)、DISP_ALPHA_TYPE(alpha 模式)、DISP_YUV_RANGE_ENUM(YUV 范围,如 BT601/BT709)。定义了 MTK_FMT_MODIFIER(格式修饰符,如 premultiplied/secure)。定义了 MTK_PLANE_PROP(plane 属性枚举,如 NEXT_BUFF_IDX、ALPHA_CON、DATASPACE 等)。结构定义:
mtk_crtc_ovl_csc_config:OVL 的 CSC(Color Space Conversion)配置,包括亮度和颜色变换。mtk_drm_plane:扩展 drm_plane,支持自定义属性数组。mtk_plane_pending_state:待处理状态,包含配置、地址、格式、坐标等。mtk_plane_input_config:输入配置,包含源地址、格式、旋转、alpha 等。mtk_plane_comp_state:组件状态,包含组件 ID、LYE ID 等。mtk_plane_state:扩展 drm_plane_state,包含 pending 状态、组件状态和自定义属性。
宏定义:如 MAKE_DISP_FORMAT_ID(生成格式 ID)、to_mtk_plane(容器转换)、to_mtk_plane_state 等。
作用:
提供 MediaTek 特定的枚举和结构,用于 plane 配置和硬件交互。支持 YUV、RGB 等多种格式,确保兼容性(formats 数组列出了支持的 DRM_FORMAT_*)。扩展 DRM 状态管理,支持 MML 模式和自定义属性(如 ALPHA_CON、COMPRESS)。辅助函数声明:mtk_plane_init、mtk_get_format_bpp、mtk_get_format_name、mtk_plane_get_comp_state、to_crtc_plane_index。
2. 辅助函数(mtk_get_format_bpp、mtk_get_format_name、to_crtc_plane_index)
实现:
mtk_get_format_bpp:根据格式返回字节深度(bpp),如 RGB565 返回 2,ARGB8888 返回 4,支持 YUV 等。mtk_get_format_name:根据格式返回字符串名称,如 ARGB8888 返回 “ARGB8888″。to_crtc_plane_index:将全局 plane 索引转换为 CRTC 内部索引,支持多 CRTC 分区(OVL_LAYER_NR 等常量定义层数)。
作用:
处理像素格式相关计算,用于缓冲区大小、pitch 计算和调试日志。确保格式兼容性和硬件配置正确(如在 atomic_update 中使用)。
3. Plane 属性管理(mtk_plane_property、mtk_plane_attach_property)
实现:
mtk_plane_property:静态数组,定义自定义属性(如 “NEXT_BUFF_IDX”、”ALPHA_CON”),包括 flags、name、min/max 值。mtk_plane_attach_property:创建 DRM 属性(drm_property_create_range),并附加到 plane 对象(drm_object_attach_property)。使用静态数组避免重复创建。
作用:
支持用户空间设置/获取 MediaTek 特定属性,如 alpha 控制、压缩、DIM_COLOR、MML_SUBMIT 等。用于扩展 DRM 属性系统,支持原子操作中的自定义配置(如在 mtk_plane_atomic_set_property 中使用)。
4. Plane 状态管理回调(mtk_plane_reset、mtk_plane_duplicate_state、mtk_drm_plane_destroy_state)
实现:
mtk_plane_reset:重置 plane 状态,清理 drm_plane_state,并初始化 MediaTek 扩展字段(如 alpha 默认值)。mtk_plane_duplicate_state:复制状态,分配新 mtk_plane_state,复制 prop_val、pending 等。mtk_drm_plane_destroy_state:销毁状态,调用 DRM 核心清理后释放 mtk_plane_state。
作用:
管理 plane 状态生命周期,支持原子模式设置(atomic mode setting)。确保状态一致性(如在 duplicate 时检查 plane 指针有效性)。
5. Plane 属性设置/获取(mtk_plane_atomic_set_property、mtk_plane_atomic_get_property)
实现:
遍历属性数组,匹配 drm_property,并设置/获取 mtk_plane_state 中的 prop_val。如果不匹配,返回 -EINVAL。
作用:
处理用户空间通过 DRM ioctl 设置/获取自定义属性,支持原子操作。记录日志(DDPDBG、DDPINFO)用于调试。
6. Plane 函数集(mtk_plane_funcs)
实现:
关联 DRM 核心回调:update_plane、disable_plane、destroy、reset、duplicate_state、destroy_state、set/get_property。
作用:
注册到 DRM 框架的 drm_plane_funcs,用于 plane 的基本操作(如更新、禁用、销毁)。桥接到原子 helper 函数(如 drm_atomic_helper_update_plane)。
7. Plane 辅助函数集(mtk_plane_helper_funcs)
实现:
prepare_fb 和 cleanup_fb:dummy 函数(返回 0),用于 framebuffer 准备/清理(MediaTek 不需额外处理)。mtk_plane_atomic_check:检查 plane 配置:
如果 fb 为空或无效,返回错误。获取 crtc_state,处理分辨率切换(res_switch)。调用 drm_atomic_helper_check_plane_state,检查缩放范围(MTK_DRM_PLANE_SCALING_MIN/MAX 或 NO_SCALING,根据 RPO 选项)。
mtk_plane_atomic_update:更新 plane:
计算 src/dst 坐标和尺寸,支持缩放。更新 pending 状态(enable、pitch、format、addr 等)。处理 MML 模式(设置 sram 地址等)。支持 secure buffer 和自定义属性。调用 mtk_drm_crtc_plane_update 应用到硬件。记录 fence 和日志(DDPFENCE)。
mtk_plane_atomic_disable:禁用 plane:
设置 pending.enable = false。调用 mtk_drm_crtc_plane_disable(在 MTK_DRM_ADVANCE 下)。
作用:
扩展 DRM helper 函数,支持原子检查/更新/禁用。集成 MediaTek 硬件逻辑,如 MML、secure、双管道、fence 同步。
8. 高级功能(MTK_DRM_ADVANCE 下的 mtk_plane_get_comp_state)
实现:
遍历 lyeblob 链表,匹配 lye_idx,复制 comp_state(comp_id、lye_id 等)。使用互斥锁保护链表。
作用:
获取 plane 的组件状态,支持 LYE(Layer Engine?)blob 和 SPHRT(可能为硬件优化选项)。
9. Plane 初始化入口(mtk_plane_init)
实现:
调用 drm_universal_plane_init 初始化 DRM plane,支持 formats 数组。添加 helper funcs(drm_plane_helper_add)。调用 mtk_plane_attach_property 附加自定义属性。
作用:
入口函数,用于创建和初始化 mtk_drm_plane,支持多 CRTC(possible_crtcs)和类型(PRIMARY/OVERLAY/CURSOR)。
总体作用
核心作用:实现 MediaTek DRM plane 的完整生命周期管理,支持原子模式设置、自定义属性和硬件优化(如 MML、secure buffer、CSC 配置)。与驱动集成:plane 与 CRTC 紧密协作(通过 mtk_drm_crtc* 函数),用于多层合成和显示管道配置。支持 OPLUS 特定特性(如 IS_BT2020)。优化点:处理缩放(scaling)、格式转换、fence 同步,确保高效显示更新。日志和 fence 机制便于调试和同步。依赖:依赖 DRM 核心(如 drm_atomic_helper)、mtk_drm_crtc.h、mtk_drm_gem.h 等模块。
二、函数调用图
mtk_plane_init (入口函数:初始化 plane)
-> drm_universal_plane_init (DRM 核心:初始化通用 plane,支持 formats)
-> drm_plane_helper_add (DRM 核心:添加 helper funcs)
-> mtk_plane_attach_property (附加自定义属性)
-> drm_property_create_range (DRM 核心:创建属性)
-> drm_object_attach_property (DRM 核心:附加属性到 plane)
mtk_plane_funcs (回调集:注册到 DRM plane 的基本操作)
-> update_plane
-> drm_atomic_helper_update_plane (DRM 核心:原子更新 plane)
-> disable_plane
-> drm_atomic_helper_disable_plane (DRM 核心:原子禁用 plane)
-> destroy
-> drm_plane_cleanup (DRM 核心:清理 plane)
-> reset
-> mtk_plane_reset (重置状态)
-> __drm_atomic_helper_plane_destroy_state (DRM 核心:销毁状态)
-> atomic_duplicate_state
-> mtk_plane_duplicate_state (复制状态)
-> __drm_atomic_helper_plane_duplicate_state (DRM 核心:复制 DRM 状态)
-> atomic_destroy_state
-> mtk_drm_plane_destroy_state (销毁状态)
-> __drm_atomic_helper_plane_destroy_state (DRM 核心:销毁 DRM 状态)
-> atomic_set_property
-> mtk_plane_atomic_set_property (设置自定义属性)
-> atomic_get_property
-> mtk_plane_atomic_get_property (获取自定义属性)
mtk_plane_helper_funcs (回调集:注册到 DRM plane helper 的原子操作)
-> prepare_fb
-> dummy_helper_prepare_fb (dummy:返回 0,无操作)
-> cleanup_fb
-> dummy_plane_helper_cleanup_fb (dummy:无操作)
-> atomic_check
-> mtk_plane_atomic_check (原子检查)
-> drm_atomic_get_new_plane_state (DRM 核心:获取新状态)
-> drm_atomic_get_crtc_state (DRM 核心:获取 CRTC 状态)
-> mtk_drm_crtc_avail_disp_mode (MediaTek:获取可用模式)
-> drm_atomic_helper_check_plane_state (DRM 核心:检查状态,包含缩放验证)
-> atomic_update
-> mtk_plane_atomic_update (原子更新)
-> drm_rect_width/height (DRM 核心:计算矩形尺寸)
-> mtk_fb_get_dma/size (MediaTek:获取 DMA 地址/大小)
-> mtk_drm_fb_is_secure (MediaTek:检查 secure buffer)
-> mtk_drm_crtc_plane_update (MediaTek:应用到 CRTC 硬件)
-> mtk_crtc_pkt_create (MediaTek:创建 CMDQ 包,硬件配置)
-> atomic_disable
-> mtk_plane_atomic_disable (原子禁用)
-> drm_atomic_get_old_plane_state (DRM 核心:获取旧状态)
-> mtk_drm_crtc_plane_disable (MediaTek:禁用 CRTC plane)
mtk_plane_get_comp_state (高级:获取组件状态,MTK_DRM_ADVANCE 下)
-> _mtk_plane_get_comp_state (内部:复制 blob 数据)
-> drm_property_lookup_blob (DRM 核心:查找 blob)
-> drm_property_blob_put (DRM 核心:释放 blob)
辅助函数 (独立调用,无固定层次)
-> mtk_get_format_bpp (计算 bpp)
-> mtk_get_format_name (获取格式名)
-> to_crtc_plane_index (转换 plane 索引)
说明:
图中顶层函数(如 mtk_plane_init)是入口,其他是回调(由 DRM 框架在 ioctl 或 atomic commit 时调用)。箭头表示直接调用;间接依赖(如属性遍历)未展开。DRM 核心函数(如 drm_atomic_)是外部依赖,MediaTek 函数(如 mtk_drm_crtc_)是驱动内部协作。



















暂无评论内容