1 /*
2 * Copyright © 2012-2018 Rob Clark <[email protected]>
3 * SPDX-License-Identifier: MIT
4 *
5 * Authors:
6 * Rob Clark <[email protected]>
7 */
8
9 #include <unistd.h>
10 #include <sys/stat.h>
11 #include <sys/types.h>
12
13 #include "msm_priv.h"
14
15 static void
msm_device_destroy(struct fd_device * dev)16 msm_device_destroy(struct fd_device *dev)
17 {
18 }
19
20 static const struct fd_device_funcs funcs = {
21 .bo_new = msm_bo_new,
22 .bo_from_handle = msm_bo_from_handle,
23 .handle_from_dmabuf = fd_handle_from_dmabuf_drm,
24 .bo_from_dmabuf = fd_bo_from_dmabuf_drm,
25 .bo_close_handle = fd_bo_close_handle_drm,
26 .pipe_new = msm_pipe_new,
27 .destroy = msm_device_destroy,
28 };
29
30 struct fd_device *
msm_device_new(int fd,drmVersionPtr version)31 msm_device_new(int fd, drmVersionPtr version)
32 {
33 struct msm_device *msm_dev;
34 struct fd_device *dev;
35
36 STATIC_ASSERT(FD_BO_PREP_READ == MSM_PREP_READ);
37 STATIC_ASSERT(FD_BO_PREP_WRITE == MSM_PREP_WRITE);
38 STATIC_ASSERT(FD_BO_PREP_NOSYNC == MSM_PREP_NOSYNC);
39
40 msm_dev = calloc(1, sizeof(*msm_dev));
41 if (!msm_dev)
42 return NULL;
43
44 dev = &msm_dev->base;
45 dev->funcs = &funcs;
46 dev->version = version->version_minor;
47
48 if (version->version_minor >= FD_VERSION_CACHED_COHERENT) {
49 struct drm_msm_gem_new new_req = {
50 .size = os_page_size,
51 .flags = MSM_BO_CACHED_COHERENT,
52 };
53
54 /* The kernel is new enough to support MSM_BO_CACHED_COHERENT,
55 * but that is not a guarantee that the device we are running
56 * on supports it. So do a test allocation to find out.
57 */
58 if (!drmCommandWriteRead(fd, DRM_MSM_GEM_NEW,
59 &new_req, sizeof(new_req))) {
60 struct drm_gem_close close_req = {
61 .handle = new_req.handle,
62 };
63 drmIoctl(fd, DRM_IOCTL_GEM_CLOSE, &close_req);
64
65 dev->has_cached_coherent = true;
66 }
67 }
68
69 dev->bo_size = sizeof(struct msm_bo);
70
71 return dev;
72 }
73