glmark2 / glmark2

glmark2 is an OpenGL 2.0 and ES 2.0 benchmark
GNU General Public License v3.0
423 stars 177 forks source link

Failed to find a suitable DRM device #79

Open y2kenny opened 5 years ago

y2kenny commented 5 years ago

I am trying to run glmark2-es2-drm on Ubuntu 18 but I am getting the Failed to find a suitable DRM device. Per comment: here:https://github.com/glmark2/glmark2/blob/0f81f3c89768c4a6593ad59b09c82627f9ceaace/src/native-state-drm.cpp#L348 I am filing an issue.

Information:

$ uname -a
Linux 4.18.0-15-generic #16~18.04.1-Ubuntu SMP Thu Feb 7 14:06:04 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:    18.04
Codename:   bionic

From man page: glmark2-es2-drm 2014.03+git2015061March12014 (Perhaps my copy of glmark2-es2-drm is too old?)

Running glmark2 (non-EGL/ES2) is ok.

Info: =======================================================
Info:     glmark2 2014.03+git20150611.fa71af2d
Info: =======================================================
Info:     OpenGL Information
Info:     GL_VENDOR:     X.Org
Info:     GL_RENDERER:   AMD Radeon (TM) Pro WX Series (POLARIS11, DRM 3.26.0, 4.18.0-15-generic, LLVM 7.0.0)
Info:     GL_VERSION:    4.5 (Compatibility Profile) Mesa 18.3.3
Info: =======================================================
$ DRI_PRIME=1 glmark2-es2-drm -d
Debug: Failed to open DRM module 'i915'
Debug: Failed to open DRM module 'nouveau'
Debug: Failed to open DRM module 'radeon'
Debug: Failed to open DRM module 'vmgfx'
Debug: Failed to open DRM module 'omapdrm'
Debug: Failed to open DRM module 'exynos'
Error: Failed to find a suitable DRM device
Error: main: Could not initialize canvas
afrantzis commented 5 years ago

Hi! You should certainly try with the latest master as it includes many changes related to DRM node detection, compared to the older version included in Ubuntu.

Also, make sure you run glmark2-es2-drm in an unowned (i.e., not running X11 or wayland) Linux Virtual Terminal (e.g., by using Ctrl+Alt+F3 or similar), as the DRM backend requires ownership of the VT.

R3D9477 commented 5 years ago

@afrantzis Same troubles, my dist based on Ubuntu18.04-core without X11. I tried to run glxmark2 via command: setsid sh -c 'exec glmark2-es2-drm <> /dev/tty1 >&0 2>&1'

And I have same result with $ DRI_PRIME=1 glmark2-es2-drm -d as in the topic

afrantzis commented 5 years ago

@r3d9u11 Hi! Is this with the glmark2 ubuntu package? If so, any chance you can try with latest git?

R3D9477 commented 5 years ago

@afrantzis yes, I'll try to cross-compile from git and publish results

R3D9477 commented 5 years ago

@afrantzis something wrong with compilation:

configuration is OK:

$ ./waf configure --with-flavors=drm-glesv2 --prefix=$SDK_PATH_TARGET/usr
Setting top to                           : /home/imx6/Desktop/armcc/cache/glmark2 
Setting out to                           : /home/imx6/Desktop/armcc/cache/glmark2/build 
Checking for 'gcc' (C compiler)          : /home/imx6/Desktop/armcc/cache/gcc-linaro-7.4.1-2019.02-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc 
Checking for 'g++' (C++ compiler)        : /usr/bin/g++ 
Checking for header stdlib.h             : yes 
Checking for header string.h             : yes 
Checking for header stdint.h             : yes 
Checking for header stdio.h              : yes 
Checking for header dlfcn.h              : yes 
Checking for header unistd.h             : yes 
Checking for header jpeglib.h            : yes 
Checking for library m                   : yes 
Checking for library jpeg                : yes 
Checking for function memset             : yes 
Checking for function sqrt               : yes 
Checking for program 'pkg-config'        : /usr/bin/pkg-config 
Checking for 'libpng12'                  : not found 
Checking for 'libpng15'                  : not found 
Checking for 'libpng16'                  : yes 
Checking for 'x11'                       : not found 
Checking for 'libdrm'                    : yes 
Checking for 'gbm'                       : yes 
Checking for 'libudev'                   : yes 
Checking for 'mirclient'                 : not found 
Checking for 'wayland-client'            : yes 
Checking for 'wayland-egl'               : yes 
Prefix                                   : /home/imx6/Desktop/armcc/tmpmnt/sysroot/usr 
Data path                                : /home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/share/glmark2 
Including extras                         : No 
Building flavors                         : ['drm-glesv2'] 
'configure' finished successfully (0.744s)

building was failed:

$ ./waf
Waf: Entering directory `/home/imx6/Desktop/armcc/cache/glmark2/build'
[ 1/70] Compiling src/main.cpp
[ 2/70] Compiling src/canvas-generic.cpp
[ 3/70] Compiling src/native-state-drm.cpp
[ 4/70] Compiling src/gl-state-egl.cpp
In file included from /usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h:9:0,
                 from ../src/glad/include/KHR/khrplatform.h:141,
                 from ../src/glad/include/glad/gles2.h:483,
                 from ../src/gl-headers.h:33,
                 from ../src/main.cpp:25:
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/include/stdint.h:26:36: fatal error: bits/libc-header-start.h: No such file or directory
compilation terminated.

[ 5/70] Compiling src/glad/src/egl.c
In file included from /usr/lib/gcc/x86_64-linux-gnu/5/include/stdint.h:9:0,
                 from ../src/glad/include/KHR/khrplatform.h:141,
                 from ../src/glad/include/glad/gles2.h:483,
                 from ../src/gl-headers.h:33,
                 from ../src/canvas.h:28,
                 from ../src/canvas-generic.h:26,
                 from ../src/canvas-generic.cpp:23:
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/include/stdint.h:26:36: fatal error: bits/libc-header-start.h: No such file or directory
compilation terminated.

[ 6/70] Compiling src/glad/src/gles2.c
In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h:39:0,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:489,
                 from /usr/include/c++/5/csignal:41,
                 from ../src/native-state-drm.h:29,
                 from ../src/native-state-drm.cpp:25:
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/include/features.h:424:25: fatal error: sys/cdefs.h: No such file or directory
compilation terminated.

In file included from /usr/include/x86_64-linux-gnu/c++/5/bits/os_defines.h:39:0,
                 from /usr/include/x86_64-linux-gnu/c++/5/bits/c++config.h:489,
                 from /usr/include/c++/5/bits/stl_algobase.h:59,
                 from /usr/include/c++/5/vector:60,
                 from ../src/gl-state-egl.h:25,
                 from ../src/gl-state-egl.cpp:22:
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/include/features.h:424:25: fatal error: sys/cdefs.h: No such file or directory
compilation terminated.

Waf: Leaving directory `/home/imx6/Desktop/armcc/cache/glmark2/build'
Build failed
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 140635292642912: cxx main.cpp -> main.cpp.1.o}
['/usr/bin/g++', '-std=c++14', '-Wall', '-Wextra', '-Wnon-virtual-dtor', '-g', '-O2', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot', '-Isrc', '-I../src', '-Isrc/glad/include', '-I../src/glad/include', '-Isrc/libmatrix', '-I../src/libmatrix', '-I/usr/include/libpng16', '-I/usr/include/libdrm', '-DHAVE_STDLIB_H=1', '-DHAVE_STRING_H=1', '-DHAVE_STDINT_H=1', '-DHAVE_STDIO_H=1', '-DHAVE_DLFCN_H=1', '-DHAVE_UNISTD_H=1', '-DHAVE_JPEGLIB_H=1', '-DHAVE_MEMSET=1', '-DHAVE_SQRT=1', '-DHAVE_LIBPNG=1', '-DHAVE_DRM=1', '-DHAVE_GBM=1', '-DHAVE_UDEV=1', '-DHAVE_WAYLAND_CLIENT=1', '-DHAVE_WAYLAND_EGL=1', '-DGLMARK_DATA_PATH="/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/share/glmark2"', '-DGLMARK_VERSION="2017.07"', '-DUSE_EXCEPTIONS', '-DGLMARK2_USE_DRM', '-DGLMARK2_USE_GLESv2', '-DGLMARK2_USE_EGL', '-D__GBM__', '../src/main.cpp', '-c', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/main.cpp.1.o', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot']
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 140635292642992: cxx canvas-generic.cpp -> canvas-generic.cpp.1.o}
['/usr/bin/g++', '-std=c++14', '-Wall', '-Wextra', '-Wnon-virtual-dtor', '-g', '-O2', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot', '-Isrc', '-I../src', '-Isrc/glad/include', '-I../src/glad/include', '-Isrc/libmatrix', '-I../src/libmatrix', '-I/usr/include/libpng16', '-I/usr/include/libdrm', '-DHAVE_STDLIB_H=1', '-DHAVE_STRING_H=1', '-DHAVE_STDINT_H=1', '-DHAVE_STDIO_H=1', '-DHAVE_DLFCN_H=1', '-DHAVE_UNISTD_H=1', '-DHAVE_JPEGLIB_H=1', '-DHAVE_MEMSET=1', '-DHAVE_SQRT=1', '-DHAVE_LIBPNG=1', '-DHAVE_DRM=1', '-DHAVE_GBM=1', '-DHAVE_UDEV=1', '-DHAVE_WAYLAND_CLIENT=1', '-DHAVE_WAYLAND_EGL=1', '-DGLMARK_DATA_PATH="/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/share/glmark2"', '-DGLMARK_VERSION="2017.07"', '-DUSE_EXCEPTIONS', '-DGLMARK2_USE_DRM', '-DGLMARK2_USE_GLESv2', '-DGLMARK2_USE_EGL', '-D__GBM__', '../src/canvas-generic.cpp', '-c', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/canvas-generic.cpp.1.o', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot']
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 140635292643072: cxx native-state-drm.cpp -> native-state-drm.cpp.1.o}
['/usr/bin/g++', '-std=c++14', '-Wall', '-Wextra', '-Wnon-virtual-dtor', '-g', '-O2', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot', '-Isrc', '-I../src', '-Isrc/glad/include', '-I../src/glad/include', '-Isrc/libmatrix', '-I../src/libmatrix', '-I/usr/include/libpng16', '-I/usr/include/libdrm', '-DHAVE_STDLIB_H=1', '-DHAVE_STRING_H=1', '-DHAVE_STDINT_H=1', '-DHAVE_STDIO_H=1', '-DHAVE_DLFCN_H=1', '-DHAVE_UNISTD_H=1', '-DHAVE_JPEGLIB_H=1', '-DHAVE_MEMSET=1', '-DHAVE_SQRT=1', '-DHAVE_LIBPNG=1', '-DHAVE_DRM=1', '-DHAVE_GBM=1', '-DHAVE_UDEV=1', '-DHAVE_WAYLAND_CLIENT=1', '-DHAVE_WAYLAND_EGL=1', '-DGLMARK_DATA_PATH="/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/share/glmark2"', '-DGLMARK_VERSION="2017.07"', '-DUSE_EXCEPTIONS', '-DGLMARK2_USE_DRM', '-DGLMARK2_USE_GLESv2', '-DGLMARK2_USE_EGL', '-D__GBM__', '../src/native-state-drm.cpp', '-c', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/native-state-drm.cpp.1.o', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot']
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 140635292643152: cxx gl-state-egl.cpp -> gl-state-egl.cpp.1.o}
['/usr/bin/g++', '-std=c++14', '-Wall', '-Wextra', '-Wnon-virtual-dtor', '-g', '-O2', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot', '-Isrc', '-I../src', '-Isrc/glad/include', '-I../src/glad/include', '-Isrc/libmatrix', '-I../src/libmatrix', '-I/usr/include/libpng16', '-I/usr/include/libdrm', '-DHAVE_STDLIB_H=1', '-DHAVE_STRING_H=1', '-DHAVE_STDINT_H=1', '-DHAVE_STDIO_H=1', '-DHAVE_DLFCN_H=1', '-DHAVE_UNISTD_H=1', '-DHAVE_JPEGLIB_H=1', '-DHAVE_MEMSET=1', '-DHAVE_SQRT=1', '-DHAVE_LIBPNG=1', '-DHAVE_DRM=1', '-DHAVE_GBM=1', '-DHAVE_UDEV=1', '-DHAVE_WAYLAND_CLIENT=1', '-DHAVE_WAYLAND_EGL=1', '-DGLMARK_DATA_PATH="/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/share/glmark2"', '-DGLMARK_VERSION="2017.07"', '-DUSE_EXCEPTIONS', '-DGLMARK2_USE_DRM', '-DGLMARK2_USE_GLESv2', '-DGLMARK2_USE_EGL', '-D__GBM__', '../src/gl-state-egl.cpp', '-c', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/gl-state-egl.cpp.1.o', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot']

Checking on the target sysroot (under chroot):

# find /usr -name libc-header-start.h
/usr/include/arm-linux-gnueabihf/bits/libc-header-start.h

What I'm doing wrong?

R3D9477 commented 5 years ago

@afrantzis I also tried to define CFLAGS, but without success:

export CONFIGURE_FLAGS=" --with-libtool-sysroot=$SDK_PATH_TARGET"
export CFLAGS=" --sysroot=$SDK_PATH_TARGET -I$SDK_PATH_TARGET/usr/include/arm-linux-gnueabihf"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS
export LDFLAGS=" --sysroot=$SDK_PATH_TARGET"
./waf

(all paths in variables are valid)

afrantzis commented 5 years ago

I haven't tried to cross-compile glmark2 myself, so I don't have a working recipe, but this seems wrong for cross-compilation:

Checking for 'g++' (C++ compiler) : /usr/bin/g++

Also make sure pkg-config picks up the correct dependencies (ensure PKG_CONFIG_PATH points to the right path).

R3D9477 commented 5 years ago

@afrantzis PKG_CONFIG is correct (all needed libraries were found) Sorry, my bad. I fixed CPP compiler but without success. Compilation is still failing, yet:

collect2: error: ld returned 1 exit status

Waf: Leaving directory `/home/imx6/Desktop/imx6/cache/glmark2/build'
Build failed
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 140661149019984: cxxprogram main.cpp.1.o,canvas-generic.cpp.1.o,native-state-drm.cpp.1.o,gl-state-egl.cpp.1.o,egl.c.2.o,gles2.c.3.o -> glmark2-es2-drm}
['/home/imx6/Desktop/armcc/cache/gcc-linaro-7.4.1-2019.02-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++', 'src/main.cpp.1.o', 'src/canvas-generic.cpp.1.o', 'src/native-state-drm.cpp.1.o', 'src/gl-state-egl.cpp.1.o', 'src/glad/src/egl.c.2.o', 'src/glad/src/gles2.c.3.o', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/glmark2-es2-drm', '-Wl,-Bstatic', '-Lsrc', '-lcommon-glesv2', '-lmatrix-glesv2', '-Wl,-Bdynamic', '-L//usr/lib/arm-linux-gnueabihf', '-L//usr/lib/arm-linux-gnueabihf', '-L//usr/lib/arm-linux-gnueabihf', '-L//lib/arm-linux-gnueabihf', '-lm', '-ljpeg', '-ldl', '-lpng16', '-lz', '-ldrm', '-lgbm', '-ludev', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot']

something wrong with system libs, I'll try to fix it

R3D9477 commented 5 years ago

@afrantzis here is a last exception of linking:

[68/70] Linking build/src/libmatrix-glesv2.a
[69/70] Linking build/src/libcommon-glesv2.a
[70/70] Linking build/src/glmark2-es2-drm
src/libcommon-glesv2.a(shared-library.cpp.5.o): In function `SharedLibrary::open(char const*)':
/home/imx6/Desktop/armcc/cache/glmark2/build/../src/shared-library.cpp:47: warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): In function `dlopen':
(.text+0x8): undefined reference to `__dlopen'
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/lib/arm-linux-gnueabihf/libdl.a(dlclose.o): In function `dlclose':
(.text+0x0): undefined reference to `__dlclose'
/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/lib/arm-linux-gnueabihf/libdl.a(dlsym.o): In function `dlsym':
(.text+0x8): undefined reference to `__dlsym'
collect2: error: ld returned 1 exit status

Waf: Leaving directory `/home/imx6/Desktop/armcc/cache/glmark2/build'
Build failed
 -> task in 'glmark2-es2-drm' failed (exit status 1): 
    {task 139957864828832: cxxprogram main.cpp.1.o,canvas-generic.cpp.1.o,native-state-drm.cpp.1.o,gl-state-egl.cpp.1.o,egl.c.2.o,gles2.c.3.o -> glmark2-es2-drm}
['/home/imx6/Desktop/armcc/cache/gcc-linaro-7.4.1-2019.02-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++', 'src/main.cpp.1.o', 'src/canvas-generic.cpp.1.o', 'src/native-state-drm.cpp.1.o', 'src/gl-state-egl.cpp.1.o', 'src/glad/src/egl.c.2.o', 'src/glad/src/gles2.c.3.o', '-o/home/imx6/Desktop/armcc/cache/glmark2/build/src/glmark2-es2-drm', '-Wl,-Bstatic', '-Lsrc', '-lcommon-glesv2', '-lmatrix-glesv2', '-Wl,-Bdynamic', '-L//usr/lib/arm-linux-gnueabihf', '-L//usr/lib/arm-linux-gnueabihf', '-L//usr/lib/arm-linux-gnueabihf', '-L//lib/arm-linux-gnueabihf', '-lm', '-ljpeg', '-ldl', '-lpng16', '-lz', '-ldrm', '-lgbm', '-ludev', '--sysroot=/home/imx6/Desktop/armcc/tmpmnt/sysroot', '-Wl,-rpath,/home/imx6/Desktop/armcc/tmpmnt/sysroot/lib/arm-linux-gnueabihf', '-Wl,-rpath,/home/imx6/Desktop/armcc/tmpmnt/sysroot/usr/lib/arm-linux-gnueabihf']

Do you have any ideas?


UPD:

$ readlink $SDK_PATH_TARGET/usr/lib/arm-linux-gnueabihf/libdl.so
/lib/arm-linux-gnueabihf/libdl.so.2

it is "internal" path on target machine. I'll try to replace it with full path on host machine

R3D9477 commented 5 years ago

@afrantzis git version failed with:

# glmark2-es2-drm -d
Debug: Using Udev to detect the right DRM node to use
Debug: Looking for the main GPU DRM node...
Debug: Not found!
Debug: Looking for a concrete GPU DRM node...
Debug: Not found!?
Debug: Looking for a virtual GPU DRM node...
Debug: Not found.
Debug: Cannot find a single DRM node using UDEV...
Error: Can't determine the main graphic card DRM device node
Error: Tried to use '' but failed.
Error: Reason : Invalid argument
Debug: Failed to open DRM module 'i915'
Debug: Failed to open DRM module 'imx-drm'
Debug: Failed to open DRM module 'nouveau'
Debug: Failed to open DRM module 'radeon'
Debug: Failed to open DRM module 'vmgfx'
Debug: Failed to open DRM module 'omapdrm'
Debug: Failed to open DRM module 'exynos'
Debug: Failed to open DRM module 'pl111'
Debug: Failed to open DRM module 'vc4'
Debug: Failed to open DRM module 'msm'
Debug: Failed to open DRM module 'meson'
Debug: Failed to open DRM module 'rockchip'
Debug: Failed to open DRM module 'sun4i-drm'
Debug: Failed to open DRM module 'stm'
Error: Failed to find a suitable DRM device
Error: main: Could not initialize canvas
Segmentation fault

I checked just now, DRM is enabled in my Kernel (option DirectRenderingManager->VivanteGCCore enabled)

also:

# dmesg | grep drm
[    1.278203] [drm] Initialized drm 1.1.0 20060810
[    1.278677] [drm] Initialized vivante 1.0.0 20120216 on minor 0
afrantzis commented 5 years ago

Hmm... could you get and paste the output of: udevadm info -a -p /sys/class/drm/card0 on the device? (repeat for card1, card2 etc if they exist)

Also, could you try adding "vivante" in module list at https://github.com/glmark2/glmark2/blob/master/src/native-state-drm.cpp#L388, and see if that helps?

R3D9477 commented 5 years ago

@afrantzis output with added 'vivante' mode:

# exec glmark2-es2-drm -d                    
Debug: Using Udev to detect the right DRM node to use
Debug: Looking for the main GPU DRM node...
Debug: Not found!
Debug: Looking for a concrete GPU DRM node...
Debug: Not found!?
Debug: Looking for a virtual GPU DRM node...
Debug: Not found.
Debug: Cannot find a single DRM node using UDEV...
Error: Can't determine the main graphic card DRM device node
Error: Tried to use '' but failed.
Error: Reason : Invalid argument
Debug: Failed to open DRM module 'i915'
Debug: Failed to open DRM module 'imx-drm'
Debug: Failed to open DRM module 'nouveau'
Debug: Failed to open DRM module 'radeon'
Debug: Failed to open DRM module 'vmgfx'
Debug: Failed to open DRM module 'omapdrm'
Debug: Failed to open DRM module 'exynos'
Debug: Failed to open DRM module 'pl111'
Debug: Failed to open DRM module 'vc4'
Debug: Failed to open DRM module 'msm'
Debug: Failed to open DRM module 'meson'
Debug: Failed to open DRM module 'rockchip'
Debug: Failed to open DRM module 'sun4i-drm'
Debug: Failed to open DRM module 'stm'
Debug: Opened DRM module 'vivante'
Error: drmModeGetResources failed
Error: main: Could not initialize canvas
R3D9477 commented 5 years ago

@afrantzis udevadm info:

# udevadm info -a -p /sys/class/drm/card0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/Vivante GCCore/drm/card0':
    KERNEL=="card0"
    SUBSYSTEM=="drm"
    DRIVER==""

  looking at parent device '/devices/platform/Vivante GCCore':
    KERNELS=="Vivante GCCore"
    SUBSYSTEMS=="platform"
    DRIVERS==""
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""