xref: /aosp_15_r20/external/mesa3d/src/freedreno/drm/msm/msm_device.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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