为什么 DRM呈现节点从/dev/dri/renderD<X>
128 开始编号,而特权接口/dev/dri/card<X>
从零开始编号?
$ ls -al /dev/dri/
total 0
drwxr-xr-x 3 root root 100 Nov 21 07:46 .
drwxr-xr-x 23 root root 6040 Nov 22 11:09 ..
drwxr-xr-x 2 root root 80 Nov 21 07:46 by-path
crw-rw----+ 1 root video 226, 0 Nov 21 07:46 card0
crw-rw----+ 1 root render 226, 128 Nov 21 07:46 renderD128
特权DRI接口排在第一位,最初专门为它们分配了一个固定的主设备号226 。
随着 ARM 设备和 GPGPU 计算设备的发展证明显示模式设置和渲染需要作为单独的设备进行访问,因此开发了渲染节点。看起来从 128 开始的次要设备编号是为它们分配的,尽管我无法快速找到任何明确说明的文档。
分配设备号的代码从内核源代码中的
drm_dev_init()
函数开始。drivers/gpu/drm/drm_drv.c
从第 631 行开始,它调用drm_minor_alloc
同一文件中的函数:它调用
idr_alloc()
inlib/idr.c
:的参数
idr_alloc()
是:如果驱动程序支持该
DRIVER_RENDER
功能并因此支持idr_alloc
渲染节点,则会调用两次以首先分配渲染节点,然后分配主节点。否则只分配主节点。DRM_MINOR_*
常量定义在include/drm/drm_file.h
:由于这是一个
enum
,所以DRM_MINOR_PRIMARY
得到的值为 0,分别DRM_MINOR_CONTROL
具有 1 和DRM_MINOR_RENDER
2 的值。这可以将 0 <= x < 64 范围内的次要设备编号分配给主接口节点,将 64 <= x < 128 分配给 DRM_MINOR_CONTROL 节点(无论它们可能是什么......目前似乎在 6.0.x 内核中未使用?)和 128 <= x < 192 到 DRM_MINOR_RENDER 节点。
然后
drivers/gpu/drm/drm_sysfs.c
在函数中分配设备的 sysfs 名称drm_sysfs_minor_alloc()
,只需使用次设备号作为名称的一部分:除非
udev
使用规则修改默认设备名称,否则 sysfs 名称也会成为设备节点的名称。所以基本上,这是因为到目前为止还没有人费心添加一个条件子句,如果它是渲染节点,则在分配默认设备名称时会从次要设备节点号中减去 128。
另外,请注意2013 年的这篇 DRM 开发博客文章说:
考虑到这一意图,故意从 128 开始对渲染节点进行编号(以打破
card0
和renderD0
总是指同一张卡的潜在错误假设)可能是有意义的。