Por que os nós de renderização DRM começam /dev/dri/renderD<X>
sua numeração a partir de 128 enquanto as interfaces privilegiadas /dev/dri/card<X>
começam em zero?
$ 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
A interface DRI privilegiada veio primeiro, e um número de dispositivo principal fixo 226 foi inicialmente alocado exclusivamente para eles .
Como os dispositivos ARM e o desenvolvimento de dispositivos de computação GPGPU provaram que a configuração do modo de exibição e a renderização precisam ser acessíveis como dispositivos separados, nós de renderização foram desenvolvidos . Parece que os números de dispositivos menores de 128 para cima foram atribuídos a eles, embora eu não tenha encontrado rapidamente nenhuma documentação afirmando isso explicitamente.
O código que atribui os números dos dispositivos começa na
drm_dev_init()
função indrivers/gpu/drm/drm_drv.c
no código-fonte do kernel. A partir da linha 631 ele chama adrm_minor_alloc
função no mesmo arquivo:Ele chama o
idr_alloc()
inlib/idr.c
:Os parâmetros para
idr_alloc()
são:Se o driver oferecer suporte ao
DRIVER_RENDER
recurso e, portanto, nós de renderização,idr_alloc
será chamado duas vezes para alocar primeiro o nó de renderização e, em seguida, o nó primário. Caso contrário, apenas o nó primário é alocado.As
DRM_MINOR_*
constantes são definidas eminclude/drm/drm_file.h
:Como este é um
enum
,DRM_MINOR_PRIMARY
obtém um valor de 0,DRM_MINOR_CONTROL
tem um valor de 1 eDRM_MINOR_RENDER
2, respectivamente.Isso funciona para alocar números de dispositivos secundários no intervalo 0 <= x < 64 para nós de interface primários, 64 <= x < 128 para nós DRM_MINOR_CONTROL (o que quer que eles possam ser... parece atualmente não utilizado em kernels 6.0.x?) e 128 <= x < 192 para nós DRM_MINOR_RENDER.
O nome sysfs para o dispositivo é atribuído na
drivers/gpu/drm/drm_sysfs.c
funçãodrm_sysfs_minor_alloc()
, simplesmente usando o número do dispositivo secundário como parte do nome:E, a menos que
udev
regras sejam usadas para modificar o nome do dispositivo padrão, o nome sysfs também se torna o nome do nó do dispositivo.Então, basicamente, é porque ninguém até agora se preocupou em adicionar uma cláusula de condição que subtrairia 128 do número do nó do dispositivo secundário ao atribuir o nome do dispositivo padrão se for um nó de renderização.
Além disso, observe que este artigo de blog de desenvolvimento de DRM de 2013 diz:
Dada essa intenção, a escolha de iniciar deliberadamente a numeração dos nós de renderização a partir de 128 (para quebrar a suposição potencialmente falsa de que
card0
erenderD0
sempre se referiria ao mesmo cartão) pode fazer sentido.