DRM 렌더 노드 번호

DRM 렌더 노드 번호

디지털 권한 관리가 필요한 이유렌더 노드번호 매기기는 128부터 시작 /dev/dri/renderD<X>하고 권한 있는 인터페이스는 /dev/dri/card<X>0부터 시작합니까?

$ 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

답변1

권한 있는 DRI 인터페이스가 먼저 제공되었으며 처음에는 고정된 주 번호 226이 할당되었습니다.오직.

ARM 장치와 GPGPU 컴퓨팅 장치의 진화가 입증되면서 디스플레이 모드 설정과 렌더링은 별도의 장치로 액세스해야 하며,렌더 노드 개발. 128보다 큰 보조 장치 번호가 할당된 것 같지만 이를 명확하게 설명하는 문서를 빨리 ​​찾을 수는 없습니다.

장치 번호 할당 코드는 다음으로 시작됩니다.drm_dev_init()이 함수는 drivers/gpu/drm/drm_drv.c커널 소스 코드에 있습니다. 다음으로 시작됨631번 국도그것은이라고drm_minor_alloc동일한 파일의 기능:

if (drm_core_check_feature(dev, DRIVER_RENDER)) {
    ret = drm_minor_alloc(dev, DRM_MINOR_RENDER);
    if (ret)
        goto err;
}

ret = drm_minor_alloc(dev, DRM_MINOR_PRIMARY);
if (ret)
    goto err;

그것은이라고idr_alloc()존재하다 lib/idr.c:

r = idr_alloc(&drm_minors_idr,
          NULL,
          64 * type,
          64 * (type + 1),
          GFP_NOWAIT);

매개변수는 다음과 같습니다 idr_alloc().

* idr_alloc() - Allocate an ID.
* @idr: IDR handle.
* @ptr: Pointer to be associated with the new ID.
* @start: The minimum ID (inclusive).
* @end: The maximum ID (exclusive).
* @gfp: Memory allocation flags.

드라이버가 이 DRIVER_RENDER기능을 지원하여 렌더 노드를 지원하는 경우 idr_alloc먼저 렌더 노드를 할당한 다음 마스터 노드를 할당하기 위해 두 번 호출됩니다. 그렇지 않으면 기본 노드만 할당됩니다.

상수는 DRM_MINOR_*다음에 정의되어 있습니다.include/drm/drm_file.h:

/* Note that the order of this enum is ABI (it determines
 * /dev/dri/renderD* numbers).
 */
enum drm_minor_type {
    DRM_MINOR_PRIMARY,
    DRM_MINOR_CONTROL,
    DRM_MINOR_RENDER,
};

이것이 하나이므로 그 값은 각각 0, 1, 2 이다 enum.DRM_MINOR_PRIMARYDRM_MINOR_CONTROLDRM_MINOR_RENDER

이렇게 하면 0 <= x < 64 범위의 부 장치 번호가 기본 인터페이스 노드에 할당되고 64 <= x < 128이 DRM_MINOR_Control 노드에 할당됩니다(무엇이든 간에... 현재는 6.0.x에서 사용되지 않는 것 같습니다). 커널? ) 및 128 <= x < 192를 DRM_MINOR_RENDER 노드에 추가합니다.

그런 다음 장치의 sysfs 이름을drivers/gpu/drm/drm_sysfs.c함수에서 drm_sysfs_minor_alloc()이름의 일부로 부 번호를 사용하십시오.

if (minor->type == DRM_MINOR_RENDER)
    minor_str = "renderD%d";
else
    minor_str = "card%d";

[...]

r = dev_set_name(kdev, minor_str, minor->index);

그리고 udev기본 장치 이름을 수정하는 데 규칙을 사용하지 않는 한 sysfs 이름은 장치 노드의 이름도 됩니다.

기본적으로 이는 지금까지 렌더 노드인 경우 기본 장치 이름을 할당할 때 부 장치 노드 번호에서 128을 빼는 조건 절을 추가하는 데 신경을 쓴 사람이 아무도 없었기 때문입니다.

또한 주의사항이 2013년 DRM 개발 블로그 게시물설명하다:

렌더 노드를 이해하는 것도 중요합니다. 아니요특정 카드에 바인딩합니다. 내부적으로는 레거시 노드와 동일한 드라이버에 의해 생성되지만 사용자 공간은 렌더 노드와 레거시/모드 설정 노드 간의 연결을 가정해서는 안 됩니다. 반대로, 사용자 공간에 하드웨어 가속이 필요한 경우에는 켜져야 합니다. 어느 노드를 사용하고 있습니다.

[...]

"특정 카드에 대한 렌더 노드를 어떻게 찾나요?"와 같은 질문은 의미가 없습니다. 예, 드라이버별 사용자 공간은 어떤 렌더 노드가 어떤 드라이버에 의해 생성되었는지, 어떤 렌더 노드가 어떤 드라이버에 의해 생성되었는지 확인할 수 있지만 드라이버가 아닌 특정 사용자 공간에서는 이 작업을 수행해서는 안 됩니다.

이러한 의도를 염두에 두고 의도적으로 128부터 시작하여 렌더 노드 번호를 지정하는 것이 합리적일 수 있습니다( 동일 카드의 잠재적으로 잘못된 가정을 중단 card0하고 항상 참조하기 위해).renderD0

관련 정보