MTK Linux DRM分析(七)- KMS drm_plane.c

一、简介

在 Linux DRM(Direct Rendering Manager)子系统中,Plane(平面)代表了一个图像源,可以在扫描输出过程中与 CRTC 混合或叠加显示。每个 Plane 从 drm_framebuffer 中获取输入数据,并负责图像的裁剪、缩放、旋转等变换,最终显示在 CRTC 代表的显示区域上。

Plane 分为三种类型:

  • Primary Plane:主平面,通常用于显示主内容,每个 CRTC 必须有一个主平面。

  • Cursor Plane:光标平面,用于显示硬件光标。

  • Overlay Plane:覆盖平面,用于额外的叠加层(如视频播放)。

二、代码分析

1. drm_plane.c

这是 DRM 核心中 Plane 的主要实现文件,包含了 Plane 的创建、初始化、销毁、属性管理等核心功能。

主要函数及作用:
函数名 作用
drm_universal_plane_init 初始化一个通用 Plane 对象
__drm_universal_plane_init 内部函数,实际执行 Plane 初始化
drmm_universal_plane_alloc 分配并初始化一个受 DRM 管理的 Plane
drm_plane_cleanup 清理 Plane 资源,不释放结构体本身
drm_plane_force_disable 强制禁用 Plane(非原子模式)
drm_mode_setplane 处理 DRM_IOCTL_MODE_SETPLANE ioctl
drm_mode_cursor_ioctl 处理光标设置 ioctl
drm_mode_page_flip_ioctl 处理页面翻转 ioctl
drm_plane_enable_fb_damage_clips 启用 Framebuffer 损伤区域属性
drm_plane_create_scaling_filter_property 创建缩放滤波器属性

2. drm_plane_helper.c

这个文件提供了一些过渡性的辅助函数,主要用于传统(非原子)模式下的 Plane 操作,帮助驱动逐步迁移到原子模式。

主要函数及作用:
函数名 作用
drm_primary_helper_update 用于主 Plane 的更新操作(传统模式)
drm_primary_helper_disable 用于主 Plane 的禁用操作(传统模式)
drm_primary_helper_destroy 用于主 Plane 的销毁操作
drm_plane_helper_check_update 检查 Plane 更新参数是否有效
drm_universal_plane_init()
  -> __drm_universal_plane_init()
      -> drm_mode_object_add()
      -> create_in_format_blob()
      -> drm_object_attach_property() [多次]

drm_mode_setplane()
  -> drm_plane_find()
  -> drm_framebuffer_lookup()
  -> setplane_internal()
      -> __setplane_internal() 或 __setplane_atomic()

drm_mode_cursor_ioctl()
  -> drm_mode_cursor_common()
      -> drm_mode_cursor_universal()
          -> __setplane_internal() 或 __setplane_atomic()

drm_mode_page_flip_ioctl()
  -> drm_crtc_find()
  -> drm_framebuffer_lookup()
  -> crtc->funcs->page_flip() 或 crtc->funcs->page_flip_target()

drm_primary_helper_update()
  -> drm_plane_helper_check_update()
  -> crtc->funcs->set_config()

drm_primary_helper_disable()
  -> 返回 -EINVAL(表示需驱动自己实现)

drm_primary_helper_destroy()
  -> drm_plane_cleanup()
  -> kfree(plane)
  • drm_plane.c 是 Plane 的核心实现,包含生命周期管理、属性控制、IOCTL 处理等。

  • drm_plane_helper.c 提供传统模式下的辅助函数,主要用于过渡期。

  • 现代 DRM 驱动应优先使用原子模式,逐步弃用传统辅助函数。

  • Plane 的类型、格式、修饰符、损伤区域、缩放滤波等属性都由这些函数管理。

drm_plane_helper.c 和 drm_plane.c 代码分析

这两个文件是 Linux 内核 DRM (Direct Rendering Manager) 子系统中与平面 (Plane) 管理相关的核心组件。平面是 DRM KMS (Kernel Mode Setting) 框架中的关键抽象,用于表示图像源,可以在扫描输出过程中与 CRTC (Cathode Ray Tube Controller) 混合或叠加。它们与 GPU 的显示硬件密切相关,支持裁剪、缩放、旋转和 Z 位置等属性。

  • drm_plane_helper.c:这是一个辅助库文件,提供主平面 (Primary Plane) 的实现支持,以及从遗留接口向原子 (Atomic) 接口的过渡函数。文件强调驱动应逐步迁移到原子接口,而这些辅助函数是过渡性的。它处理主平面的更新、禁用和销毁,并与 CRTC 和连接器交互。版权从 2014 年 Intel 开始,主要用于简化驱动开发,但注释警告新驱动不应依赖这些过渡性辅助。
  • drm_plane.c:这是平面管理的核心文件,实现平面的初始化、属性管理、损伤跟踪 (Damage Tracking) 和用户空间接口 (如 ioctl)。它定义了平面的类型 (主平面、覆盖平面、游标平面),支持修改器 (Modifiers) 和原子模式设置。文件处理平面与帧缓冲区 (Framebuffer) 的关联、标准属性 (如 IN_FORMATS、type) 和遗留 ioctl(如光标和页面翻转)。版权从 2016 年 Intel 开始,强调驱动必须为所有平面设置修改器支持。

这些文件紧密协作:drm_plane_helper.c 依赖 drm_plane.c 中的平面结构和函数(如 drm_plane_cleanup),而 drm_plane.c 提供更底层的平面管理。它们与 GPU 相关,因为平面操作直接映射到 GPU 的硬件平面(如 Intel 的 Universal Planes 或 AMD 的 Overlay),涉及缓冲区格式、修改器和原子更新。

关键函数分析

以下列出两个文件中需要注意和熟悉的关键函数。这些函数是导出的(EXPORT_SYMBOL),常用于驱动实现钩子、初始化或用户空间交互。重点关注:

  • 初始化和清理函数:用于设置平面对象。
  • 更新和检查函数:处理平面状态变化,与原子模式设置相关。
  • 属性管理函数:暴露给用户空间的属性,如损伤剪辑或缩放过滤。
  • ioctl 和遗留支持:处理用户空间请求,如光标移动或页面翻转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值