内核客户端

此库为内核中运行的客户端(如fbdev和bootsplash)提供支持。

支持提供具有虚拟地址的基于GEM的哑缓冲区的GEM驱动程序。

struct drm_client_funcs

DRM客户端回调

定义:

struct drm_client_funcs {
    struct module *owner;
    void (*unregister)(struct drm_client_dev *client);
    int (*restore)(struct drm_client_dev *client);
    int (*hotplug)(struct drm_client_dev *client);
    int (*suspend)(struct drm_client_dev *client, bool holds_console_lock);
    int (*resume)(struct drm_client_dev *client, bool holds_console_lock);
};

成员

owner

模块所有者

unregister

drm_device被注销时调用。客户端应通过使用drm_client_release()释放其资源来响应。

此回调是可选的。

restore

在drm_lastclose()上调用。列表中第一个返回零的客户端实例获得恢复的特权,并且不再调用其他客户端。在调用unregister之后,不会调用此回调。

请注意,核心不保证针对并发的drm_open()的排除。客户端需要自己确保这一点,例如通过使用drm_master_internal_acquire()和drm_master_internal_release()。

此回调是可选的。

hotplug

drm_kms_helper_hotplug_event()上调用。在调用unregister之后,不会调用此回调。

此回调是可选的。

suspend

在挂起设备时调用。

此回调是可选的。

FIXME:某些调用者在调用此函数时会持有控制台锁。

这会干扰fbdev仿真,后者也尝试获取该锁。将控制台锁推入回调并删除“holds_console_lock”。

resume

在从挂起状态恢复设备时调用。

此回调是可选的。

FIXME:某些调用者在调用此函数时会持有控制台锁。

这会干扰fbdev仿真,后者也尝试获取该锁。将控制台锁推入回调并删除“holds_console_lock”。

struct drm_client_dev

DRM客户端实例

定义:

struct drm_client_dev {
    struct drm_device *dev;
    const char *name;
    struct list_head list;
    const struct drm_client_funcs *funcs;
    struct drm_file *file;
    struct mutex modeset_mutex;
    struct drm_mode_set *modesets;
    bool suspended;
    bool hotplug_failed;
};

成员

dev

DRM设备

name

客户端的名称。

list

DRM设备的所有客户端的列表,链接到drm_device.clientlist中。受drm_device.clientlist_mutex保护。

funcs

DRM客户端函数(可选)

file

DRM文件

modeset_mutex

保护modesets

modesets

CRTC配置

suspended

客户端已被挂起。

hotplug_failed

如果热插拔之前失败,则由客户端热插拔助手设置。通常不会再次尝试。

struct drm_client_buffer

DRM客户端缓冲区

定义:

struct drm_client_buffer {
    struct drm_client_dev *client;
    u32 pitch;
    struct drm_gem_object *gem;
    struct iosys_map map;
    struct drm_framebuffer *fb;
};

成员

client

DRM客户端

pitch

缓冲区跨度

gem

支持此缓冲区的GEM对象

FIXME:此处对GEM的依赖不是必需的,我们可以将驱动程序句柄转换为dma-buf,并改用与后端无关的dma-buf vmap支持。这将要求重做handle2fd prime ioctl,以将fd_install步骤从驱动程序后端钩子中提取出来,从而使最后一步对于内部用户是可选的。

map

缓冲区的虚拟地址

fb

DRM帧缓冲

drm_client_for_each_modeset

drm_client_for_each_modeset (modeset, client)

迭代客户端模式集

参数

modeset

drm_mode_set循环光标

client

DRM客户端

drm_client_for_each_connector_iter

drm_client_for_each_connector_iter (connector, iter)

connector_list迭代器宏

参数

connector

用作光标的struct drm_connector指针

iter

struct drm_connector_list_iter

描述

这会迭代可用于内部客户端的连接器(不包括写回连接器)。

有关更多信息,请参见drm_for_each_connector_iter()

int drm_client_init(struct drm_device *dev, struct drm_client_dev *client, const char *name, const struct drm_client_funcs *funcs)

初始化DRM客户端

参数

struct drm_device *dev

DRM设备

struct drm_client_dev *client

DRM客户端

const char *name

客户端名称

const struct drm_client_funcs *funcs

DRM客户端函数(可选)

描述

这将初始化客户端并打开一个drm_file。使用drm_client_register()完成该过程。调用者需要在调用此函数之前持有对dev的引用。当注销drm_device时,会释放客户端。请参见drm_client_release()

返回

成功时返回零,失败时返回负错误代码。

void drm_client_register(struct drm_client_dev *client)

注册客户端

参数

struct drm_client_dev *client

DRM客户端

描述

将客户端添加到drm_device客户端列表以激活其回调。 client必须通过调用drm_client_init()进行初始化。在drm_client_register()之后,不再允许直接调用drm_client_release()(在unregister回调之外),而是在驱动程序卸载时自动进行清理。

注册客户端会生成一个热插拔事件,允许客户端从预先存在的输出设置其显示。客户端必须先初始化其状态,以便成功处理热插拔事件。

void drm_client_release(struct drm_client_dev *client)

释放 DRM 客户端资源

参数

struct drm_client_dev *client

DRM客户端

描述

通过关闭由 drm_client_init() 打开的 drm_file 来释放资源。如果 drm_client_funcs.unregister 回调函数 _未_ 设置,则会自动调用此函数。

此函数应仅从注销回调函数中调用。一个例外是 fbdev,如果用户空间有打开的文件描述符,则它无法释放缓冲区。

注意

客户端无法自行发起释放操作。这样做是为了保持代码的简洁。驱动程序必须先卸载,然后才能卸载客户端。

int drm_client_buffer_vmap_local(struct drm_client_buffer *buffer, struct iosys_map *map_copy)

将 DRM 客户端缓冲区映射到地址空间

参数

struct drm_client_buffer *buffer

DRM客户端缓冲区

struct iosys_map *map_copy

返回已映射内存的地址

描述

此函数将客户端缓冲区映射到内核地址空间。如果缓冲区已映射,则返回现有映射的地址。

客户端缓冲区映射不进行引用计数。每次调用 drm_client_buffer_vmap_local() 后,都应紧跟调用 drm_client_buffer_vunmap_local()。有关长期映射,请参阅 drm_client_buffer_vmap()

返回的地址是内部值的副本。与其他 vmap 接口不同,客户端的 vunmap 函数不需要它。因此,您可以在 blit 和绘制操作期间随意修改它。

返回

成功时返回 0,否则返回负的 errno 代码。

void drm_client_buffer_vunmap_local(struct drm_client_buffer *buffer)

取消映射 DRM 客户端缓冲区

参数

struct drm_client_buffer *buffer

DRM客户端缓冲区

描述

此函数删除使用 drm_client_buffer_vunmap_local() 建立的客户端缓冲区内存映射。只有自行管理缓冲区映射的客户端才需要调用此函数。

int drm_client_buffer_vmap(struct drm_client_buffer *buffer, struct iosys_map *map_copy)

将 DRM 客户端缓冲区映射到地址空间

参数

struct drm_client_buffer *buffer

DRM客户端缓冲区

struct iosys_map *map_copy

返回已映射内存的地址

描述

此函数将客户端缓冲区映射到内核地址空间。如果缓冲区已映射,则返回现有映射的地址。

客户端缓冲区映射不进行引用计数。每次调用 drm_client_buffer_vmap() 后,都应紧跟调用 drm_client_buffer_vunmap();或者,客户端缓冲区应在其整个生命周期内保持映射状态。

返回的地址是内部值的副本。与其他 vmap 接口不同,客户端的 vunmap 函数不需要它。因此,您可以在 blit 和绘制操作期间随意修改它。

返回

成功时返回 0,否则返回负的 errno 代码。

void drm_client_buffer_vunmap(struct drm_client_buffer *buffer)

取消映射 DRM 客户端缓冲区

参数

struct drm_client_buffer *buffer

DRM客户端缓冲区

描述

此函数删除客户端缓冲区的内存映射。只有自行管理缓冲区映射的客户端才需要调用此函数。

struct drm_client_buffer *drm_client_framebuffer_create(struct drm_client_dev *client, u32 width, u32 height, u32 format)

创建客户端帧缓冲区

参数

struct drm_client_dev *client

DRM客户端

u32 width

帧缓冲区宽度

u32 height

帧缓冲区高度

u32 format

缓冲区格式

描述

此函数创建一个 drm_client_buffer,它由一个由哑缓冲区支持的 drm_framebuffer 组成。调用 drm_client_framebuffer_delete() 来释放缓冲区。

返回

指向客户端缓冲区的指针,或失败时指向错误指针。

void drm_client_framebuffer_delete(struct drm_client_buffer *buffer)

删除客户端帧缓冲区

参数

struct drm_client_buffer *buffer

DRM 客户端缓冲区(可以为 NULL)

int drm_client_framebuffer_flush(struct drm_client_buffer *buffer, struct drm_rect *rect)

手动刷新客户端帧缓冲区

参数

struct drm_client_buffer *buffer

DRM 客户端缓冲区(可以为 NULL)

struct drm_rect *rect

损坏矩形(如果为 NULL,则刷新所有内容)

描述

这会调用 drm_framebuffer_funcs->dirty(如果存在),以刷新需要它的驱动程序的缓冲区更改。

返回

成功时返回零,失败时返回负错误代码。

int drm_client_modeset_probe(struct drm_client_dev *client, unsigned int width, unsigned int height)

探测显示器

参数

struct drm_client_dev *client

DRM客户端

unsigned int width

最大显示模式宽度(可选)

unsigned int height

最大显示模式高度(可选)

描述

此函数为启用的连接器设置显示管道,并将配置存储在客户端的模式设置数组中。

返回

成功时返回零,失败时返回负错误代码。

bool drm_client_rotation(struct drm_mode_set *modeset, unsigned int *rotation)

检查初始旋转值

参数

struct drm_mode_set *modeset

DRM 模式设置

unsigned int *rotation

返回的旋转值

描述

此函数检查 **modeset** 中的主平面是否可以硬件旋转以匹配其连接器上所需的旋转。

注意

目前仅支持 0 度和 180 度。

返回

如果平面可以旋转,则为 True,否则为 False。

int drm_client_modeset_check(struct drm_client_dev *client)

检查模式设置配置

参数

struct drm_client_dev *client

DRM客户端

描述

检查模式设置配置。

返回

成功时返回零,失败时返回负错误代码。

int drm_client_modeset_commit_locked(struct drm_client_dev *client)

强制提交 CRTC 配置

参数

struct drm_client_dev *client

DRM客户端

描述

将模式设置配置提交到 crtc,而不检查是否存在 DRM 主设备。假设调用者已经持有通过 drm_master_internal_acquire() 获取的内部 DRM 主设备引用。

返回

成功时返回零,失败时返回负错误代码。

int drm_client_modeset_commit(struct drm_client_dev *client)

提交 CRTC 配置

参数

struct drm_client_dev *client

DRM客户端

描述

将模式设置配置提交到 crtc。

返回

成功时返回零,失败时返回负错误代码。

int drm_client_modeset_dpms(struct drm_client_dev *client, int mode)

设置 DPMS 模式

参数

struct drm_client_dev *client

DRM客户端

int mode

DPMS 模式

注意

对于原子驱动程序,**mode** 简化为开/关。

返回

成功时返回零,失败时返回负错误代码。

void drm_client_dev_unregister(struct drm_device *dev)

注销客户端

参数

struct drm_device *dev

DRM设备

描述

此函数通过调用每个客户端的 drm_client_funcs.unregister 回调来释放所有客户端。回调函数负责释放所有资源,包括客户端本身。

辅助函数 drm_dev_unregister() 调用此函数。使用它的驱动程序不需要自己调用此函数。

void drm_client_dev_hotplug(struct drm_device *dev)

向客户端发送热插拔事件

参数

struct drm_device *dev

DRM设备

描述

此函数调用附加客户端上的 drm_client_funcs.hotplug 回调。

drm_kms_helper_hotplug_event() 调用此函数,因此使用它的驱动程序不需要自己调用此函数。