freedreno/kgsl: don't even bother trying CREATE_FD
authorRob Clark <robclark@freedesktop.org>
Fri, 28 Feb 2014 15:02:59 +0000 (10:02 -0500)
committerRob Clark <robclark@freedesktop.org>
Wed, 5 Mar 2014 15:35:41 +0000 (10:35 -0500)
Don't even bother trying DRM_KGSL_GEM_CREATE_FD.  It hasn't worked since
(afaict) 2.6.35 kernels.  And in some cases seems to cause some
problems.  Instead just allocate a minimum size dummy object (just for
purposes of having a handle) and then mmap the framebuffer as user-mem
(which is deprecated, but seems to still work.. and as far as I can tell
is the best option for now).

Signed-off-by: Rob Clark <robclark@freedesktop.org>
freedreno/kgsl/kgsl_bo.c

index dd7b612..19a1008 100644 (file)
@@ -174,28 +174,18 @@ struct fd_bo * kgsl_bo_from_handle(struct fd_device *dev,
 struct fd_bo * fd_bo_from_fbdev(struct fd_pipe *pipe,
                int fbfd, uint32_t size)
 {
-       struct drm_kgsl_gem_create_fd req = {
-                       .fd = fbfd,
-       };
        struct fd_bo *bo;
-       struct kgsl_bo *kgsl_bo;
 
        if (!is_kgsl_pipe(pipe))
                return NULL;
 
-       if (drmCommandWriteRead(pipe->dev->fd, DRM_KGSL_GEM_CREATE_FD,
-                       &req, sizeof(req))) {
-               return NULL;
-       }
-
-       bo = fd_bo_from_handle(pipe->dev, req.handle, size);
-       kgsl_bo = to_kgsl_bo(bo);
+       bo = fd_bo_new(pipe->dev, 1, 0);
 
        /* this is fugly, but works around a bug in the kernel..
         * priv->memdesc.size never gets set, so getbufinfo ioctl
         * thinks the buffer hasn't be allocate and fails
         */
-       if (bo && !kgsl_bo_gpuaddr(kgsl_bo, 0)) {
+       if (bo) {
                void *fbmem = mmap(NULL, size, PROT_READ | PROT_WRITE,
                                MAP_SHARED, fbfd, 0);
                struct kgsl_map_user_mem req = {
@@ -204,7 +194,9 @@ struct fd_bo * fd_bo_from_fbdev(struct fd_pipe *pipe,
                                .offset  = 0,
                                .hostptr = (unsigned long)fbmem,
                };
+               struct kgsl_bo *kgsl_bo = to_kgsl_bo(bo);
                int ret;
+
                ret = ioctl(to_kgsl_pipe(pipe)->fd, IOCTL_KGSL_MAP_USER_MEM, &req);
                if (ret) {
                        ERROR_MSG("mapping user mem failed: %s",