Problem importing buffer allocated by etnaviv to imx-drm

Martin Fuzzey mfuzzey at parkeon.com
Wed Jul 11 17:14:58 UTC 2018


Hi all,

finally got back to looking at this issue.
I have now updated to
     * Android 8.1,
     * mesa 18.1.1,
     * libdrm 2.4.92
     * gbm_gralloc from git://github.com/robherring/ 
ed2c246bfc6c4bd8f9ef72b6a771814cf493c1f8
     * drm_hwc from git://anongit.freedesktop.org/git/ 
78c9f6c26210423926ea027edfab0b9504c2d7ff

The good news is that no hacks are needed to make all this build on 
Android 8 (before I was on 5.1 which only supports HWC 1 which meant 
reverting some commits).

However I'm still getting the same issue
     01-02 03:07:26.233   181   181 E hwc-platform-drm-generic: failed 
to import prime fd 13 to 6 ret=-1

(I added the destination fd log) For the same reason (non contiguous)

pkn_arm32_generic:/ # ls -l /proc/181/fd
total 0
lr-x------ 1 system graphics 64 1970-01-02 03:07 13 -> anon_inode:dmabuf
lrwx------ 1 system graphics 64 1970-01-02 03:07 6 -> /dev/dri/card1


On the i.MX6 /dev/dri/card1 is the IPU (imx-drm) and /dev/dri/card0 is 
the GPU (etnaviv)

Looking at the code in etna_resource_alloc() it seems that the 
allocation is done from imx-drm for the case of scanout buffers but from 
etnaviv for other buffers.

The fds are opened in several places:
     gbm_gralloc: gbm_dev_create()
         property_get("gralloc.gbm.device", path, "/dev/dri/renderD128")

     imx_drm_screen_create() has two fds:
         .gpu_fd hardcoded as /dev/dri/renderD128
         .kms_fd passed as parameter and used by 
renderonly_create_kms_dumb_buffer_for_resource
      This comes from the gbm_gralloc FD above

     droid_open_device() uses fd obtained from gralloc via 
GRALLOC_MODULE_PERFORM_GET_DRM_FD

     drm_hwc uses property_get("hwc.drm.device", path, "/dev/dri/card0")


With all the defaults Initially the allocation of the scanout buffer in 
renderonly_scanout_for_resource() failed because it was being done on 
the GPU render node.
Setting both gralloc.gbm.device and hwc.drm.device to /dev/dri/card1 
fixes that.

I also tried leaving the gbm_gralloc allocation parameter alone and 
modifying imx_drm_screen_create() to use /dev/dri/card1 for .kms_fd with 
the same result.

--- a/src/gallium/winsys/imx/drm/imx_drm_winsys.c
+++ b/src/gallium/winsys/imx/drm/imx_drm_winsys.c
  struct pipe_screen *imx_drm_screen_create(int fd)
  {
     struct renderonly ro = {
        .create_for_resource = 
renderonly_create_kms_dumb_buffer_for_resource,
-      .kms_fd = fd,
+      //.kms_fd = fd,
+      .kms_fd = open("/dev/dri/card1", O_RDWR | O_CLOEXEC), // MF Hack
        .gpu_fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC)
     };


There were also another 2 problems that I have worked around for the moment:

PrimeHandleToFD failing on the kernel side due to no authentication.
This is because, in android 8, the components have been biderized so 
there are now 4 processes involved:

1) android.hardware.graphics.allocator at 2.0-service (Allocator hosts gralloc)
2) android.hardware.graphics.composer at 2.1-service         (hosts drm_hwc)
3) surfaceflinger
4) bootanimation

Whereas in previous android versions the first 3 were all in the 
surfaceflinger process.
For the moment I have hacked around that with this on the kernel side

--- a/drivers/gpu/drm/drm_file.c
+++ b/drivers/gpu/drm/drm_file.c
@@ -218,6 +218,14 @@ static int drm_open_helper(struct file *filp, 
struct drm_minor *minor)

         /* for compatibility root is always authenticated */
         priv->authenticated = capable(CAP_SYS_ADMIN);
+#if 1
+       if (!priv->authenticated) {
+               dev_warn(dev->dev,
+                       "@MF@ forcing authentication BIG SECURITY HOLE 
pid=%d comm=%s\n",
+                       current->pid, current->comm);
+               priv->authenticated = 1; // MF big security hole
+       }
+#endif
         priv->lock_count = 0;


A mismatch between the versions of struct gralloc_handle_t used by 
gbm_gralloc and drm_hwc
gbm_gralloc uses  external/gbm_gralloc/gralloc_drm_handle.h
whereas drm_hwc uses external/libdrm/android/gralloc_handle.h

This caused the format code to be misinterpreted leading to
      01-02 00:35:01.242   181   181 E hwc-platform-drm-generic: Cannot 
convert hal format to drm format 2304


Regards

Martin




More information about the etnaviv mailing list