xref: /aosp_15_r20/external/mesa3d/src/intel/vulkan/anv_gem.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <sys/ioctl.h>
25*61046927SAndroid Build Coastguard Worker #include <sys/types.h>
26*61046927SAndroid Build Coastguard Worker #include <sys/mman.h>
27*61046927SAndroid Build Coastguard Worker #include <string.h>
28*61046927SAndroid Build Coastguard Worker #include <errno.h>
29*61046927SAndroid Build Coastguard Worker #include <unistd.h>
30*61046927SAndroid Build Coastguard Worker #include <fcntl.h>
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include "anv_private.h"
33*61046927SAndroid Build Coastguard Worker #include "common/intel_gem.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "i915/anv_gem.h"
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker /**
38*61046927SAndroid Build Coastguard Worker  * On error, \a timeout_ns holds the remaining time.
39*61046927SAndroid Build Coastguard Worker  */
40*61046927SAndroid Build Coastguard Worker int
anv_gem_wait(struct anv_device * device,uint32_t gem_handle,int64_t * timeout_ns)41*61046927SAndroid Build Coastguard Worker anv_gem_wait(struct anv_device *device, uint32_t gem_handle, int64_t *timeout_ns)
42*61046927SAndroid Build Coastguard Worker {
43*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
44*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
45*61046927SAndroid Build Coastguard Worker       return anv_i915_gem_wait(device, gem_handle, timeout_ns);
46*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
47*61046927SAndroid Build Coastguard Worker       return -1;
48*61046927SAndroid Build Coastguard Worker    default:
49*61046927SAndroid Build Coastguard Worker       unreachable("missing");
50*61046927SAndroid Build Coastguard Worker       return -1;
51*61046927SAndroid Build Coastguard Worker    }
52*61046927SAndroid Build Coastguard Worker }
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker /** Return -1 on error. */
55*61046927SAndroid Build Coastguard Worker int
anv_gem_get_tiling(struct anv_device * device,uint32_t gem_handle)56*61046927SAndroid Build Coastguard Worker anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle)
57*61046927SAndroid Build Coastguard Worker {
58*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
59*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
60*61046927SAndroid Build Coastguard Worker       return anv_i915_gem_get_tiling(device, gem_handle);
61*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
62*61046927SAndroid Build Coastguard Worker       return -1;
63*61046927SAndroid Build Coastguard Worker    default:
64*61046927SAndroid Build Coastguard Worker       unreachable("missing");
65*61046927SAndroid Build Coastguard Worker       return -1;
66*61046927SAndroid Build Coastguard Worker    }
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker int
anv_gem_set_tiling(struct anv_device * device,uint32_t gem_handle,uint32_t stride,uint32_t tiling)70*61046927SAndroid Build Coastguard Worker anv_gem_set_tiling(struct anv_device *device,
71*61046927SAndroid Build Coastguard Worker                    uint32_t gem_handle, uint32_t stride, uint32_t tiling)
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
74*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
75*61046927SAndroid Build Coastguard Worker       return anv_i915_gem_set_tiling(device, gem_handle, stride, tiling);
76*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
77*61046927SAndroid Build Coastguard Worker       return 0;
78*61046927SAndroid Build Coastguard Worker    default:
79*61046927SAndroid Build Coastguard Worker       unreachable("missing");
80*61046927SAndroid Build Coastguard Worker       return -1;
81*61046927SAndroid Build Coastguard Worker    }
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker 
84*61046927SAndroid Build Coastguard Worker int
anv_gem_handle_to_fd(struct anv_device * device,uint32_t gem_handle)85*61046927SAndroid Build Coastguard Worker anv_gem_handle_to_fd(struct anv_device *device, uint32_t gem_handle)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    struct drm_prime_handle args = {
88*61046927SAndroid Build Coastguard Worker       .handle = gem_handle,
89*61046927SAndroid Build Coastguard Worker       .flags = DRM_CLOEXEC | DRM_RDWR,
90*61046927SAndroid Build Coastguard Worker    };
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    int ret = intel_ioctl(device->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args);
93*61046927SAndroid Build Coastguard Worker    if (ret == -1)
94*61046927SAndroid Build Coastguard Worker       return -1;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker    return args.fd;
97*61046927SAndroid Build Coastguard Worker }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker uint32_t
anv_gem_fd_to_handle(struct anv_device * device,int fd)100*61046927SAndroid Build Coastguard Worker anv_gem_fd_to_handle(struct anv_device *device, int fd)
101*61046927SAndroid Build Coastguard Worker {
102*61046927SAndroid Build Coastguard Worker    struct drm_prime_handle args = {
103*61046927SAndroid Build Coastguard Worker       .fd = fd,
104*61046927SAndroid Build Coastguard Worker    };
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    int ret = intel_ioctl(device->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &args);
107*61046927SAndroid Build Coastguard Worker    if (ret == -1)
108*61046927SAndroid Build Coastguard Worker       return 0;
109*61046927SAndroid Build Coastguard Worker 
110*61046927SAndroid Build Coastguard Worker    return args.handle;
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker VkResult
anv_gem_import_bo_alloc_flags_to_bo_flags(struct anv_device * device,struct anv_bo * bo,enum anv_bo_alloc_flags alloc_flags,uint32_t * bo_flags)114*61046927SAndroid Build Coastguard Worker anv_gem_import_bo_alloc_flags_to_bo_flags(struct anv_device *device,
115*61046927SAndroid Build Coastguard Worker                                           struct anv_bo *bo,
116*61046927SAndroid Build Coastguard Worker                                           enum anv_bo_alloc_flags alloc_flags,
117*61046927SAndroid Build Coastguard Worker                                           uint32_t *bo_flags)
118*61046927SAndroid Build Coastguard Worker {
119*61046927SAndroid Build Coastguard Worker    switch (device->info->kmd_type) {
120*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_I915:
121*61046927SAndroid Build Coastguard Worker       return anv_i915_gem_import_bo_alloc_flags_to_bo_flags(device, bo,
122*61046927SAndroid Build Coastguard Worker                                                             alloc_flags,
123*61046927SAndroid Build Coastguard Worker                                                             bo_flags);
124*61046927SAndroid Build Coastguard Worker    case INTEL_KMD_TYPE_XE:
125*61046927SAndroid Build Coastguard Worker       *bo_flags = device->kmd_backend->bo_alloc_flags_to_bo_flags(device, alloc_flags);
126*61046927SAndroid Build Coastguard Worker       return VK_SUCCESS;
127*61046927SAndroid Build Coastguard Worker    default:
128*61046927SAndroid Build Coastguard Worker       unreachable("missing");
129*61046927SAndroid Build Coastguard Worker       return VK_ERROR_UNKNOWN;
130*61046927SAndroid Build Coastguard Worker    }
131*61046927SAndroid Build Coastguard Worker }
132*61046927SAndroid Build Coastguard Worker 
anv_stub_kmd_backend_get(void)133*61046927SAndroid Build Coastguard Worker const struct anv_kmd_backend *anv_stub_kmd_backend_get(void)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker    return NULL;
136*61046927SAndroid Build Coastguard Worker }
137