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