xref: /aosp_15_r20/external/mesa3d/src/intel/common/intel_gem.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2018 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 #ifndef INTEL_GEM_H
25*61046927SAndroid Build Coastguard Worker #define INTEL_GEM_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <assert.h>
28*61046927SAndroid Build Coastguard Worker #include <time.h>
29*61046927SAndroid Build Coastguard Worker #include <errno.h>
30*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
31*61046927SAndroid Build Coastguard Worker #include <stdint.h>
32*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
33*61046927SAndroid Build Coastguard Worker #include <unistd.h>
34*61046927SAndroid Build Coastguard Worker #include <sys/ioctl.h>
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker #include "intel_engine.h"
37*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm.h"
38*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
41*61046927SAndroid Build Coastguard Worker extern "C" {
42*61046927SAndroid Build Coastguard Worker #endif
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker #define RCS_TIMESTAMP 0x2358
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker static inline uint64_t
intel_canonical_address(uint64_t v)47*61046927SAndroid Build Coastguard Worker intel_canonical_address(uint64_t v)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    /* From the Broadwell PRM Vol. 2a, MI_LOAD_REGISTER_MEM::MemoryAddress:
50*61046927SAndroid Build Coastguard Worker     *
51*61046927SAndroid Build Coastguard Worker     *    "This field specifies the address of the memory location where the
52*61046927SAndroid Build Coastguard Worker     *    register value specified in the DWord above will read from. The
53*61046927SAndroid Build Coastguard Worker     *    address specifies the DWord location of the data. Range =
54*61046927SAndroid Build Coastguard Worker     *    GraphicsVirtualAddress[63:2] for a DWord register GraphicsAddress
55*61046927SAndroid Build Coastguard Worker     *    [63:48] are ignored by the HW and assumed to be in correct
56*61046927SAndroid Build Coastguard Worker     *    canonical form [63:48] == [47]."
57*61046927SAndroid Build Coastguard Worker     */
58*61046927SAndroid Build Coastguard Worker    const int shift = 63 - 47;
59*61046927SAndroid Build Coastguard Worker    return (int64_t)(v << shift) >> shift;
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker /**
63*61046927SAndroid Build Coastguard Worker  * This returns a 48-bit address with the high 16 bits zeroed.
64*61046927SAndroid Build Coastguard Worker  *
65*61046927SAndroid Build Coastguard Worker  * It's the opposite of intel_canonicalize_address.
66*61046927SAndroid Build Coastguard Worker  */
67*61046927SAndroid Build Coastguard Worker static inline uint64_t
intel_48b_address(uint64_t v)68*61046927SAndroid Build Coastguard Worker intel_48b_address(uint64_t v)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker    const int shift = 63 - 47;
71*61046927SAndroid Build Coastguard Worker    return (uint64_t)(v << shift) >> shift;
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker /**
75*61046927SAndroid Build Coastguard Worker  * Call ioctl, restarting if it is interrupted
76*61046927SAndroid Build Coastguard Worker  */
77*61046927SAndroid Build Coastguard Worker static inline int
intel_ioctl(int fd,unsigned long request,void * arg)78*61046927SAndroid Build Coastguard Worker intel_ioctl(int fd, unsigned long request, void *arg)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker     int ret;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker     do {
83*61046927SAndroid Build Coastguard Worker         ret = ioctl(fd, request, arg);
84*61046927SAndroid Build Coastguard Worker     } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
85*61046927SAndroid Build Coastguard Worker     return ret;
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker bool intel_gem_supports_syncobj_wait(int fd);
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker bool
91*61046927SAndroid Build Coastguard Worker intel_gem_read_render_timestamp(int fd, enum intel_kmd_type kmd_type,
92*61046927SAndroid Build Coastguard Worker                                 uint64_t *value);
93*61046927SAndroid Build Coastguard Worker bool
94*61046927SAndroid Build Coastguard Worker intel_gem_read_correlate_cpu_gpu_timestamp(int fd,
95*61046927SAndroid Build Coastguard Worker                                            enum intel_kmd_type kmd_type,
96*61046927SAndroid Build Coastguard Worker                                            enum intel_engine_class engine_class,
97*61046927SAndroid Build Coastguard Worker                                            uint16_t engine_instance,
98*61046927SAndroid Build Coastguard Worker                                            clockid_t cpu_clock_id,
99*61046927SAndroid Build Coastguard Worker                                            uint64_t *cpu_timestamp,
100*61046927SAndroid Build Coastguard Worker                                            uint64_t *gpu_timestamp,
101*61046927SAndroid Build Coastguard Worker                                            uint64_t *cpu_delta);
102*61046927SAndroid Build Coastguard Worker bool intel_gem_can_render_on_fd(int fd, enum intel_kmd_type kmd_type);
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker /* Functions only used by i915 */
105*61046927SAndroid Build Coastguard Worker enum intel_gem_create_context_flags {
106*61046927SAndroid Build Coastguard Worker    INTEL_GEM_CREATE_CONTEXT_EXT_RECOVERABLE_FLAG = BITFIELD_BIT(0),
107*61046927SAndroid Build Coastguard Worker    INTEL_GEM_CREATE_CONTEXT_EXT_PROTECTED_FLAG   = BITFIELD_BIT(1),
108*61046927SAndroid Build Coastguard Worker    INTEL_GEM_CREATE_CONTEXT_EXT_LOW_LATENCY_FLAG = BITFIELD_BIT(2),
109*61046927SAndroid Build Coastguard Worker };
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker bool intel_gem_create_context(int fd, uint32_t *context_id);
112*61046927SAndroid Build Coastguard Worker bool intel_gem_destroy_context(int fd, uint32_t context_id);
113*61046927SAndroid Build Coastguard Worker bool
114*61046927SAndroid Build Coastguard Worker intel_gem_create_context_engines(int fd,
115*61046927SAndroid Build Coastguard Worker                                  enum intel_gem_create_context_flags flags,
116*61046927SAndroid Build Coastguard Worker                                  const struct intel_query_engine_info *info,
117*61046927SAndroid Build Coastguard Worker                                  int num_engines, enum intel_engine_class *engine_classes,
118*61046927SAndroid Build Coastguard Worker                                  uint32_t vm_id,
119*61046927SAndroid Build Coastguard Worker                                  uint32_t *context_id);
120*61046927SAndroid Build Coastguard Worker bool
121*61046927SAndroid Build Coastguard Worker intel_gem_set_context_param(int fd, uint32_t context, uint32_t param,
122*61046927SAndroid Build Coastguard Worker                             uint64_t value);
123*61046927SAndroid Build Coastguard Worker bool
124*61046927SAndroid Build Coastguard Worker intel_gem_get_context_param(int fd, uint32_t context, uint32_t param,
125*61046927SAndroid Build Coastguard Worker                             uint64_t *value);
126*61046927SAndroid Build Coastguard Worker bool intel_gem_get_param(int fd, uint32_t param, int *value);
127*61046927SAndroid Build Coastguard Worker bool intel_gem_wait_on_get_param(int fd, uint32_t param, int target_val,
128*61046927SAndroid Build Coastguard Worker                                  uint32_t timeout_ms);
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker bool intel_gem_create_context_ext(int fd, enum intel_gem_create_context_flags flags,
131*61046927SAndroid Build Coastguard Worker                                   uint32_t *ctx_id);
132*61046927SAndroid Build Coastguard Worker bool intel_gem_supports_protected_context(int fd,
133*61046927SAndroid Build Coastguard Worker                                           enum intel_kmd_type kmd_type);
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_I915_LAST             DRM_IO(DRM_COMMAND_END - 1)
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker struct drm_intel_stub_devinfo {
138*61046927SAndroid Build Coastguard Worker    uint64_t addr;
139*61046927SAndroid Build Coastguard Worker    uint32_t size;
140*61046927SAndroid Build Coastguard Worker };
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker #define DRM_IOCTL_INTEL_STUB_DEVINFO    DRM_IOR(DRM_IOCTL_I915_LAST, struct drm_intel_stub_devinfo)
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker #endif
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker #endif /* INTEL_GEM_H */
149