1*d83cc019SAndroid Build Coastguard Worker /**************************************************************************
2*d83cc019SAndroid Build Coastguard Worker *
3*d83cc019SAndroid Build Coastguard Worker * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
4*d83cc019SAndroid Build Coastguard Worker * All Rights Reserved.
5*d83cc019SAndroid Build Coastguard Worker *
6*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*d83cc019SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*d83cc019SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*d83cc019SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*d83cc019SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*d83cc019SAndroid Build Coastguard Worker * the following conditions:
13*d83cc019SAndroid Build Coastguard Worker *
14*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*d83cc019SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*d83cc019SAndroid Build Coastguard Worker * of the Software.
17*d83cc019SAndroid Build Coastguard Worker *
18*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*d83cc019SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*d83cc019SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*d83cc019SAndroid Build Coastguard Worker * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22*d83cc019SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*d83cc019SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*d83cc019SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker **************************************************************************/
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
31*d83cc019SAndroid Build Coastguard Worker #include <string.h>
32*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
33*d83cc019SAndroid Build Coastguard Worker
34*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
35*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
36*d83cc019SAndroid Build Coastguard Worker #include "intel_batchbuffer.h"
37*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
38*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
39*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
40*d83cc019SAndroid Build Coastguard Worker #include "rendercopy.h"
41*d83cc019SAndroid Build Coastguard Worker #include "media_fill.h"
42*d83cc019SAndroid Build Coastguard Worker #include "ioctl_wrappers.h"
43*d83cc019SAndroid Build Coastguard Worker #include "media_spin.h"
44*d83cc019SAndroid Build Coastguard Worker #include "gpgpu_fill.h"
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker #include <i915_drm.h>
47*d83cc019SAndroid Build Coastguard Worker
48*d83cc019SAndroid Build Coastguard Worker /**
49*d83cc019SAndroid Build Coastguard Worker * SECTION:intel_batchbuffer
50*d83cc019SAndroid Build Coastguard Worker * @short_description: Batchbuffer and blitter support
51*d83cc019SAndroid Build Coastguard Worker * @title: Batch Buffer
52*d83cc019SAndroid Build Coastguard Worker * @include: igt.h
53*d83cc019SAndroid Build Coastguard Worker *
54*d83cc019SAndroid Build Coastguard Worker * This library provides some basic support for batchbuffers and using the
55*d83cc019SAndroid Build Coastguard Worker * blitter engine based upon libdrm. A new batchbuffer is allocated with
56*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_alloc() and for simple blitter commands submitted with
57*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_flush().
58*d83cc019SAndroid Build Coastguard Worker *
59*d83cc019SAndroid Build Coastguard Worker * It also provides some convenient macros to easily emit commands into
60*d83cc019SAndroid Build Coastguard Worker * batchbuffers. All those macros presume that a pointer to a #intel_batchbuffer
61*d83cc019SAndroid Build Coastguard Worker * structure called batch is in scope. The basic macros are #BEGIN_BATCH,
62*d83cc019SAndroid Build Coastguard Worker * #OUT_BATCH, #OUT_RELOC and #ADVANCE_BATCH.
63*d83cc019SAndroid Build Coastguard Worker *
64*d83cc019SAndroid Build Coastguard Worker * Note that this library's header pulls in the [i-g-t core](igt-gpu-tools-i-g-t-core.html)
65*d83cc019SAndroid Build Coastguard Worker * library as a dependency.
66*d83cc019SAndroid Build Coastguard Worker */
67*d83cc019SAndroid Build Coastguard Worker
68*d83cc019SAndroid Build Coastguard Worker /**
69*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_align:
70*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
71*d83cc019SAndroid Build Coastguard Worker * @align: value in bytes to which we want to align
72*d83cc019SAndroid Build Coastguard Worker *
73*d83cc019SAndroid Build Coastguard Worker * Aligns the current in-batch offset to the given value.
74*d83cc019SAndroid Build Coastguard Worker *
75*d83cc019SAndroid Build Coastguard Worker * Returns: Batchbuffer offset aligned to the given value.
76*d83cc019SAndroid Build Coastguard Worker */
77*d83cc019SAndroid Build Coastguard Worker uint32_t
intel_batchbuffer_align(struct intel_batchbuffer * batch,uint32_t align)78*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_align(struct intel_batchbuffer *batch, uint32_t align)
79*d83cc019SAndroid Build Coastguard Worker {
80*d83cc019SAndroid Build Coastguard Worker uint32_t offset = batch->ptr - batch->buffer;
81*d83cc019SAndroid Build Coastguard Worker
82*d83cc019SAndroid Build Coastguard Worker offset = ALIGN(offset, align);
83*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer + offset;
84*d83cc019SAndroid Build Coastguard Worker return offset;
85*d83cc019SAndroid Build Coastguard Worker }
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker /**
88*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_subdata_alloc:
89*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
90*d83cc019SAndroid Build Coastguard Worker * @size: amount of bytes need to allocate
91*d83cc019SAndroid Build Coastguard Worker * @align: value in bytes to which we want to align
92*d83cc019SAndroid Build Coastguard Worker *
93*d83cc019SAndroid Build Coastguard Worker * Verify if sufficient @size within @batch is available to deny overflow.
94*d83cc019SAndroid Build Coastguard Worker * Then allocate @size bytes within @batch.
95*d83cc019SAndroid Build Coastguard Worker *
96*d83cc019SAndroid Build Coastguard Worker * Returns: Offset within @batch between allocated subdata and base of @batch.
97*d83cc019SAndroid Build Coastguard Worker */
98*d83cc019SAndroid Build Coastguard Worker void *
intel_batchbuffer_subdata_alloc(struct intel_batchbuffer * batch,uint32_t size,uint32_t align)99*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_alloc(struct intel_batchbuffer *batch, uint32_t size,
100*d83cc019SAndroid Build Coastguard Worker uint32_t align)
101*d83cc019SAndroid Build Coastguard Worker {
102*d83cc019SAndroid Build Coastguard Worker uint32_t offset = intel_batchbuffer_align(batch, align);
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker igt_assert(size <= intel_batchbuffer_space(batch));
105*d83cc019SAndroid Build Coastguard Worker
106*d83cc019SAndroid Build Coastguard Worker batch->ptr += size;
107*d83cc019SAndroid Build Coastguard Worker return memset(batch->buffer + offset, 0, size);
108*d83cc019SAndroid Build Coastguard Worker }
109*d83cc019SAndroid Build Coastguard Worker
110*d83cc019SAndroid Build Coastguard Worker /**
111*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_subdata_offset:
112*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
113*d83cc019SAndroid Build Coastguard Worker * @ptr: pointer to given data
114*d83cc019SAndroid Build Coastguard Worker *
115*d83cc019SAndroid Build Coastguard Worker * Returns: Offset within @batch between @ptr and base of @batch.
116*d83cc019SAndroid Build Coastguard Worker */
117*d83cc019SAndroid Build Coastguard Worker uint32_t
intel_batchbuffer_subdata_offset(struct intel_batchbuffer * batch,void * ptr)118*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_subdata_offset(struct intel_batchbuffer *batch, void *ptr)
119*d83cc019SAndroid Build Coastguard Worker {
120*d83cc019SAndroid Build Coastguard Worker return (uint8_t *)ptr - batch->buffer;
121*d83cc019SAndroid Build Coastguard Worker }
122*d83cc019SAndroid Build Coastguard Worker
123*d83cc019SAndroid Build Coastguard Worker /**
124*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_reset:
125*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
126*d83cc019SAndroid Build Coastguard Worker *
127*d83cc019SAndroid Build Coastguard Worker * Resets @batch by allocating a new gem buffer object as backing storage.
128*d83cc019SAndroid Build Coastguard Worker */
129*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_reset(struct intel_batchbuffer * batch)130*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(struct intel_batchbuffer *batch)
131*d83cc019SAndroid Build Coastguard Worker {
132*d83cc019SAndroid Build Coastguard Worker if (batch->bo != NULL) {
133*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unreference(batch->bo);
134*d83cc019SAndroid Build Coastguard Worker batch->bo = NULL;
135*d83cc019SAndroid Build Coastguard Worker }
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker batch->bo = drm_intel_bo_alloc(batch->bufmgr, "batchbuffer",
138*d83cc019SAndroid Build Coastguard Worker BATCH_SZ, 4096);
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker memset(batch->buffer, 0, sizeof(batch->buffer));
141*d83cc019SAndroid Build Coastguard Worker batch->ctx = NULL;
142*d83cc019SAndroid Build Coastguard Worker
143*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer;
144*d83cc019SAndroid Build Coastguard Worker batch->end = NULL;
145*d83cc019SAndroid Build Coastguard Worker }
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker /**
148*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_alloc:
149*d83cc019SAndroid Build Coastguard Worker * @bufmgr: libdrm buffer manager
150*d83cc019SAndroid Build Coastguard Worker * @devid: pci device id of the drm device
151*d83cc019SAndroid Build Coastguard Worker *
152*d83cc019SAndroid Build Coastguard Worker * Allocates a new batchbuffer object. @devid must be supplied since libdrm
153*d83cc019SAndroid Build Coastguard Worker * doesn't expose it directly.
154*d83cc019SAndroid Build Coastguard Worker *
155*d83cc019SAndroid Build Coastguard Worker * Returns: The allocated and initialized batchbuffer object.
156*d83cc019SAndroid Build Coastguard Worker */
157*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *
intel_batchbuffer_alloc(drm_intel_bufmgr * bufmgr,uint32_t devid)158*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_alloc(drm_intel_bufmgr *bufmgr, uint32_t devid)
159*d83cc019SAndroid Build Coastguard Worker {
160*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *batch = calloc(sizeof(*batch), 1);
161*d83cc019SAndroid Build Coastguard Worker
162*d83cc019SAndroid Build Coastguard Worker batch->bufmgr = bufmgr;
163*d83cc019SAndroid Build Coastguard Worker batch->devid = devid;
164*d83cc019SAndroid Build Coastguard Worker batch->gen = intel_gen(devid);
165*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker return batch;
168*d83cc019SAndroid Build Coastguard Worker }
169*d83cc019SAndroid Build Coastguard Worker
170*d83cc019SAndroid Build Coastguard Worker /**
171*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_free:
172*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
173*d83cc019SAndroid Build Coastguard Worker *
174*d83cc019SAndroid Build Coastguard Worker * Releases all resource of the batchbuffer object @batch.
175*d83cc019SAndroid Build Coastguard Worker */
176*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_free(struct intel_batchbuffer * batch)177*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_free(struct intel_batchbuffer *batch)
178*d83cc019SAndroid Build Coastguard Worker {
179*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_unreference(batch->bo);
180*d83cc019SAndroid Build Coastguard Worker batch->bo = NULL;
181*d83cc019SAndroid Build Coastguard Worker free(batch);
182*d83cc019SAndroid Build Coastguard Worker }
183*d83cc019SAndroid Build Coastguard Worker
184*d83cc019SAndroid Build Coastguard Worker #define CMD_POLY_STIPPLE_OFFSET 0x7906
185*d83cc019SAndroid Build Coastguard Worker
186*d83cc019SAndroid Build Coastguard Worker static unsigned int
flush_on_ring_common(struct intel_batchbuffer * batch,int ring)187*d83cc019SAndroid Build Coastguard Worker flush_on_ring_common(struct intel_batchbuffer *batch, int ring)
188*d83cc019SAndroid Build Coastguard Worker {
189*d83cc019SAndroid Build Coastguard Worker unsigned int used = batch->ptr - batch->buffer;
190*d83cc019SAndroid Build Coastguard Worker
191*d83cc019SAndroid Build Coastguard Worker if (used == 0)
192*d83cc019SAndroid Build Coastguard Worker return 0;
193*d83cc019SAndroid Build Coastguard Worker
194*d83cc019SAndroid Build Coastguard Worker if (IS_GEN5(batch->devid)) {
195*d83cc019SAndroid Build Coastguard Worker /* emit gen5 w/a without batch space checks - we reserve that
196*d83cc019SAndroid Build Coastguard Worker * already. */
197*d83cc019SAndroid Build Coastguard Worker *(uint32_t *) (batch->ptr) = CMD_POLY_STIPPLE_OFFSET << 16;
198*d83cc019SAndroid Build Coastguard Worker batch->ptr += 4;
199*d83cc019SAndroid Build Coastguard Worker *(uint32_t *) (batch->ptr) = 0;
200*d83cc019SAndroid Build Coastguard Worker batch->ptr += 4;
201*d83cc019SAndroid Build Coastguard Worker }
202*d83cc019SAndroid Build Coastguard Worker
203*d83cc019SAndroid Build Coastguard Worker /* Round batchbuffer usage to 2 DWORDs. */
204*d83cc019SAndroid Build Coastguard Worker if ((used & 4) == 0) {
205*d83cc019SAndroid Build Coastguard Worker *(uint32_t *) (batch->ptr) = 0; /* noop */
206*d83cc019SAndroid Build Coastguard Worker batch->ptr += 4;
207*d83cc019SAndroid Build Coastguard Worker }
208*d83cc019SAndroid Build Coastguard Worker
209*d83cc019SAndroid Build Coastguard Worker /* Mark the end of the buffer. */
210*d83cc019SAndroid Build Coastguard Worker *(uint32_t *)(batch->ptr) = MI_BATCH_BUFFER_END; /* noop */
211*d83cc019SAndroid Build Coastguard Worker batch->ptr += 4;
212*d83cc019SAndroid Build Coastguard Worker return batch->ptr - batch->buffer;
213*d83cc019SAndroid Build Coastguard Worker }
214*d83cc019SAndroid Build Coastguard Worker
215*d83cc019SAndroid Build Coastguard Worker /**
216*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_flush_on_ring:
217*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
218*d83cc019SAndroid Build Coastguard Worker * @ring: execbuf ring flag
219*d83cc019SAndroid Build Coastguard Worker *
220*d83cc019SAndroid Build Coastguard Worker * Submits the batch for execution on @ring.
221*d83cc019SAndroid Build Coastguard Worker */
222*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_flush_on_ring(struct intel_batchbuffer * batch,int ring)223*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_on_ring(struct intel_batchbuffer *batch, int ring)
224*d83cc019SAndroid Build Coastguard Worker {
225*d83cc019SAndroid Build Coastguard Worker unsigned int used = flush_on_ring_common(batch, ring);
226*d83cc019SAndroid Build Coastguard Worker drm_intel_context *ctx;
227*d83cc019SAndroid Build Coastguard Worker
228*d83cc019SAndroid Build Coastguard Worker if (used == 0)
229*d83cc019SAndroid Build Coastguard Worker return;
230*d83cc019SAndroid Build Coastguard Worker
231*d83cc019SAndroid Build Coastguard Worker do_or_die(drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer));
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker batch->ptr = NULL;
234*d83cc019SAndroid Build Coastguard Worker
235*d83cc019SAndroid Build Coastguard Worker /* XXX bad kernel API */
236*d83cc019SAndroid Build Coastguard Worker ctx = batch->ctx;
237*d83cc019SAndroid Build Coastguard Worker if (ring != I915_EXEC_RENDER)
238*d83cc019SAndroid Build Coastguard Worker ctx = NULL;
239*d83cc019SAndroid Build Coastguard Worker do_or_die(drm_intel_gem_bo_context_exec(batch->bo, ctx, used, ring));
240*d83cc019SAndroid Build Coastguard Worker
241*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
242*d83cc019SAndroid Build Coastguard Worker }
243*d83cc019SAndroid Build Coastguard Worker
244*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_set_context(struct intel_batchbuffer * batch,drm_intel_context * context)245*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_set_context(struct intel_batchbuffer *batch,
246*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context)
247*d83cc019SAndroid Build Coastguard Worker {
248*d83cc019SAndroid Build Coastguard Worker batch->ctx = context;
249*d83cc019SAndroid Build Coastguard Worker }
250*d83cc019SAndroid Build Coastguard Worker
251*d83cc019SAndroid Build Coastguard Worker /**
252*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_flush_with_context:
253*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
254*d83cc019SAndroid Build Coastguard Worker * @context: libdrm hardware context object
255*d83cc019SAndroid Build Coastguard Worker *
256*d83cc019SAndroid Build Coastguard Worker * Submits the batch for execution on the render engine with the supplied
257*d83cc019SAndroid Build Coastguard Worker * hardware context.
258*d83cc019SAndroid Build Coastguard Worker */
259*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_flush_with_context(struct intel_batchbuffer * batch,drm_intel_context * context)260*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_with_context(struct intel_batchbuffer *batch,
261*d83cc019SAndroid Build Coastguard Worker drm_intel_context *context)
262*d83cc019SAndroid Build Coastguard Worker {
263*d83cc019SAndroid Build Coastguard Worker int ret;
264*d83cc019SAndroid Build Coastguard Worker unsigned int used = flush_on_ring_common(batch, I915_EXEC_RENDER);
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker if (used == 0)
267*d83cc019SAndroid Build Coastguard Worker return;
268*d83cc019SAndroid Build Coastguard Worker
269*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->buffer);
270*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
271*d83cc019SAndroid Build Coastguard Worker
272*d83cc019SAndroid Build Coastguard Worker batch->ptr = NULL;
273*d83cc019SAndroid Build Coastguard Worker
274*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_gem_bo_context_exec(batch->bo, context, used,
275*d83cc019SAndroid Build Coastguard Worker I915_EXEC_RENDER);
276*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
277*d83cc019SAndroid Build Coastguard Worker
278*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
279*d83cc019SAndroid Build Coastguard Worker }
280*d83cc019SAndroid Build Coastguard Worker
281*d83cc019SAndroid Build Coastguard Worker /**
282*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_flush:
283*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
284*d83cc019SAndroid Build Coastguard Worker *
285*d83cc019SAndroid Build Coastguard Worker * Submits the batch for execution on the blitter engine, selecting the right
286*d83cc019SAndroid Build Coastguard Worker * ring depending upon the hardware platform.
287*d83cc019SAndroid Build Coastguard Worker */
288*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_flush(struct intel_batchbuffer * batch)289*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(struct intel_batchbuffer *batch)
290*d83cc019SAndroid Build Coastguard Worker {
291*d83cc019SAndroid Build Coastguard Worker int ring = 0;
292*d83cc019SAndroid Build Coastguard Worker if (HAS_BLT_RING(batch->devid))
293*d83cc019SAndroid Build Coastguard Worker ring = I915_EXEC_BLT;
294*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_on_ring(batch, ring);
295*d83cc019SAndroid Build Coastguard Worker }
296*d83cc019SAndroid Build Coastguard Worker
297*d83cc019SAndroid Build Coastguard Worker
298*d83cc019SAndroid Build Coastguard Worker /**
299*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_emit_reloc:
300*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
301*d83cc019SAndroid Build Coastguard Worker * @buffer: relocation target libdrm buffer object
302*d83cc019SAndroid Build Coastguard Worker * @delta: delta value to add to @buffer's gpu address
303*d83cc019SAndroid Build Coastguard Worker * @read_domains: gem domain bits for the relocation
304*d83cc019SAndroid Build Coastguard Worker * @write_domain: gem domain bit for the relocation
305*d83cc019SAndroid Build Coastguard Worker * @fenced: whether this gpu access requires fences
306*d83cc019SAndroid Build Coastguard Worker *
307*d83cc019SAndroid Build Coastguard Worker * Emits both a libdrm relocation entry pointing at @buffer and the pre-computed
308*d83cc019SAndroid Build Coastguard Worker * DWORD of @batch's presumed gpu address plus the supplied @delta into @batch.
309*d83cc019SAndroid Build Coastguard Worker *
310*d83cc019SAndroid Build Coastguard Worker * Note that @fenced is only relevant if @buffer is actually tiled.
311*d83cc019SAndroid Build Coastguard Worker *
312*d83cc019SAndroid Build Coastguard Worker * This is the only way buffers get added to the validate list.
313*d83cc019SAndroid Build Coastguard Worker */
314*d83cc019SAndroid Build Coastguard Worker void
intel_batchbuffer_emit_reloc(struct intel_batchbuffer * batch,drm_intel_bo * buffer,uint64_t delta,uint32_t read_domains,uint32_t write_domain,int fenced)315*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_reloc(struct intel_batchbuffer *batch,
316*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *buffer, uint64_t delta,
317*d83cc019SAndroid Build Coastguard Worker uint32_t read_domains, uint32_t write_domain,
318*d83cc019SAndroid Build Coastguard Worker int fenced)
319*d83cc019SAndroid Build Coastguard Worker {
320*d83cc019SAndroid Build Coastguard Worker uint64_t offset;
321*d83cc019SAndroid Build Coastguard Worker int ret;
322*d83cc019SAndroid Build Coastguard Worker
323*d83cc019SAndroid Build Coastguard Worker if (batch->ptr - batch->buffer > BATCH_SZ)
324*d83cc019SAndroid Build Coastguard Worker igt_info("bad relocation ptr %p map %p offset %d size %d\n",
325*d83cc019SAndroid Build Coastguard Worker batch->ptr, batch->buffer,
326*d83cc019SAndroid Build Coastguard Worker (int)(batch->ptr - batch->buffer), BATCH_SZ);
327*d83cc019SAndroid Build Coastguard Worker
328*d83cc019SAndroid Build Coastguard Worker if (fenced)
329*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_bo_emit_reloc_fence(batch->bo, batch->ptr - batch->buffer,
330*d83cc019SAndroid Build Coastguard Worker buffer, delta,
331*d83cc019SAndroid Build Coastguard Worker read_domains, write_domain);
332*d83cc019SAndroid Build Coastguard Worker else
333*d83cc019SAndroid Build Coastguard Worker ret = drm_intel_bo_emit_reloc(batch->bo, batch->ptr - batch->buffer,
334*d83cc019SAndroid Build Coastguard Worker buffer, delta,
335*d83cc019SAndroid Build Coastguard Worker read_domains, write_domain);
336*d83cc019SAndroid Build Coastguard Worker
337*d83cc019SAndroid Build Coastguard Worker offset = buffer->offset64;
338*d83cc019SAndroid Build Coastguard Worker offset += delta;
339*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_dword(batch, offset);
340*d83cc019SAndroid Build Coastguard Worker if (batch->gen >= 8)
341*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_emit_dword(batch, offset >> 32);
342*d83cc019SAndroid Build Coastguard Worker igt_assert(ret == 0);
343*d83cc019SAndroid Build Coastguard Worker }
344*d83cc019SAndroid Build Coastguard Worker
345*d83cc019SAndroid Build Coastguard Worker /**
346*d83cc019SAndroid Build Coastguard Worker * intel_batchbuffer_copy_data:
347*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
348*d83cc019SAndroid Build Coastguard Worker * @data: pointer to the data to write into the batchbuffer
349*d83cc019SAndroid Build Coastguard Worker * @bytes: number of bytes to write into the batchbuffer
350*d83cc019SAndroid Build Coastguard Worker * @align: value in bytes to which we want to align
351*d83cc019SAndroid Build Coastguard Worker *
352*d83cc019SAndroid Build Coastguard Worker * This transfers the given @data into the batchbuffer. Note that the length
353*d83cc019SAndroid Build Coastguard Worker * must be DWORD aligned, i.e. multiples of 32bits. The caller must
354*d83cc019SAndroid Build Coastguard Worker * confirm that there is enough space in the batch for the data to be
355*d83cc019SAndroid Build Coastguard Worker * copied.
356*d83cc019SAndroid Build Coastguard Worker *
357*d83cc019SAndroid Build Coastguard Worker * Returns: Offset of copied data.
358*d83cc019SAndroid Build Coastguard Worker */
359*d83cc019SAndroid Build Coastguard Worker uint32_t
intel_batchbuffer_copy_data(struct intel_batchbuffer * batch,const void * data,unsigned int bytes,uint32_t align)360*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_copy_data(struct intel_batchbuffer *batch,
361*d83cc019SAndroid Build Coastguard Worker const void *data, unsigned int bytes,
362*d83cc019SAndroid Build Coastguard Worker uint32_t align)
363*d83cc019SAndroid Build Coastguard Worker {
364*d83cc019SAndroid Build Coastguard Worker uint32_t *subdata;
365*d83cc019SAndroid Build Coastguard Worker
366*d83cc019SAndroid Build Coastguard Worker igt_assert((bytes & 3) == 0);
367*d83cc019SAndroid Build Coastguard Worker subdata = intel_batchbuffer_subdata_alloc(batch, bytes, align);
368*d83cc019SAndroid Build Coastguard Worker memcpy(subdata, data, bytes);
369*d83cc019SAndroid Build Coastguard Worker
370*d83cc019SAndroid Build Coastguard Worker return intel_batchbuffer_subdata_offset(batch, subdata);
371*d83cc019SAndroid Build Coastguard Worker }
372*d83cc019SAndroid Build Coastguard Worker
373*d83cc019SAndroid Build Coastguard Worker #define CHECK_RANGE(x) do { \
374*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(0, (x)); \
375*d83cc019SAndroid Build Coastguard Worker igt_assert_lt((x), (1 << 15)); \
376*d83cc019SAndroid Build Coastguard Worker } while (0)
377*d83cc019SAndroid Build Coastguard Worker
378*d83cc019SAndroid Build Coastguard Worker /**
379*d83cc019SAndroid Build Coastguard Worker * intel_blt_copy:
380*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
381*d83cc019SAndroid Build Coastguard Worker * @src_bo: source libdrm buffer object
382*d83cc019SAndroid Build Coastguard Worker * @src_x1: source pixel x-coordination
383*d83cc019SAndroid Build Coastguard Worker * @src_y1: source pixel y-coordination
384*d83cc019SAndroid Build Coastguard Worker * @src_pitch: @src_bo's pitch in bytes
385*d83cc019SAndroid Build Coastguard Worker * @dst_bo: destination libdrm buffer object
386*d83cc019SAndroid Build Coastguard Worker * @dst_x1: destination pixel x-coordination
387*d83cc019SAndroid Build Coastguard Worker * @dst_y1: destination pixel y-coordination
388*d83cc019SAndroid Build Coastguard Worker * @dst_pitch: @dst_bo's pitch in bytes
389*d83cc019SAndroid Build Coastguard Worker * @width: width of the copied rectangle
390*d83cc019SAndroid Build Coastguard Worker * @height: height of the copied rectangle
391*d83cc019SAndroid Build Coastguard Worker * @bpp: bits per pixel
392*d83cc019SAndroid Build Coastguard Worker *
393*d83cc019SAndroid Build Coastguard Worker * This emits a 2D copy operation using blitter commands into the supplied batch
394*d83cc019SAndroid Build Coastguard Worker * buffer object.
395*d83cc019SAndroid Build Coastguard Worker */
396*d83cc019SAndroid Build Coastguard Worker void
intel_blt_copy(struct intel_batchbuffer * batch,drm_intel_bo * src_bo,int src_x1,int src_y1,int src_pitch,drm_intel_bo * dst_bo,int dst_x1,int dst_y1,int dst_pitch,int width,int height,int bpp)397*d83cc019SAndroid Build Coastguard Worker intel_blt_copy(struct intel_batchbuffer *batch,
398*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *src_bo, int src_x1, int src_y1, int src_pitch,
399*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *dst_bo, int dst_x1, int dst_y1, int dst_pitch,
400*d83cc019SAndroid Build Coastguard Worker int width, int height, int bpp)
401*d83cc019SAndroid Build Coastguard Worker {
402*d83cc019SAndroid Build Coastguard Worker const int gen = batch->gen;
403*d83cc019SAndroid Build Coastguard Worker uint32_t src_tiling, dst_tiling, swizzle;
404*d83cc019SAndroid Build Coastguard Worker uint32_t cmd_bits = 0;
405*d83cc019SAndroid Build Coastguard Worker uint32_t br13_bits;
406*d83cc019SAndroid Build Coastguard Worker
407*d83cc019SAndroid Build Coastguard Worker igt_assert(bpp*(src_x1 + width) <= 8*src_pitch);
408*d83cc019SAndroid Build Coastguard Worker igt_assert(bpp*(dst_x1 + width) <= 8*dst_pitch);
409*d83cc019SAndroid Build Coastguard Worker igt_assert(src_pitch * (src_y1 + height) <= src_bo->size);
410*d83cc019SAndroid Build Coastguard Worker igt_assert(dst_pitch * (dst_y1 + height) <= dst_bo->size);
411*d83cc019SAndroid Build Coastguard Worker
412*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_get_tiling(src_bo, &src_tiling, &swizzle);
413*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_get_tiling(dst_bo, &dst_tiling, &swizzle);
414*d83cc019SAndroid Build Coastguard Worker
415*d83cc019SAndroid Build Coastguard Worker if (gen >= 4 && src_tiling != I915_TILING_NONE) {
416*d83cc019SAndroid Build Coastguard Worker src_pitch /= 4;
417*d83cc019SAndroid Build Coastguard Worker cmd_bits |= XY_SRC_COPY_BLT_SRC_TILED;
418*d83cc019SAndroid Build Coastguard Worker }
419*d83cc019SAndroid Build Coastguard Worker
420*d83cc019SAndroid Build Coastguard Worker if (gen >= 4 && dst_tiling != I915_TILING_NONE) {
421*d83cc019SAndroid Build Coastguard Worker dst_pitch /= 4;
422*d83cc019SAndroid Build Coastguard Worker cmd_bits |= XY_SRC_COPY_BLT_DST_TILED;
423*d83cc019SAndroid Build Coastguard Worker }
424*d83cc019SAndroid Build Coastguard Worker
425*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x1); CHECK_RANGE(src_y1);
426*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x1); CHECK_RANGE(dst_y1);
427*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(width); CHECK_RANGE(height);
428*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x1 + width); CHECK_RANGE(src_y1 + height);
429*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x1 + width); CHECK_RANGE(dst_y1 + height);
430*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_pitch); CHECK_RANGE(dst_pitch);
431*d83cc019SAndroid Build Coastguard Worker
432*d83cc019SAndroid Build Coastguard Worker br13_bits = 0;
433*d83cc019SAndroid Build Coastguard Worker switch (bpp) {
434*d83cc019SAndroid Build Coastguard Worker case 8:
435*d83cc019SAndroid Build Coastguard Worker break;
436*d83cc019SAndroid Build Coastguard Worker case 16: /* supporting only RGB565, not ARGB1555 */
437*d83cc019SAndroid Build Coastguard Worker br13_bits |= 1 << 24;
438*d83cc019SAndroid Build Coastguard Worker break;
439*d83cc019SAndroid Build Coastguard Worker case 32:
440*d83cc019SAndroid Build Coastguard Worker br13_bits |= 3 << 24;
441*d83cc019SAndroid Build Coastguard Worker cmd_bits |= XY_SRC_COPY_BLT_WRITE_ALPHA |
442*d83cc019SAndroid Build Coastguard Worker XY_SRC_COPY_BLT_WRITE_RGB;
443*d83cc019SAndroid Build Coastguard Worker break;
444*d83cc019SAndroid Build Coastguard Worker default:
445*d83cc019SAndroid Build Coastguard Worker igt_fail(IGT_EXIT_FAILURE);
446*d83cc019SAndroid Build Coastguard Worker }
447*d83cc019SAndroid Build Coastguard Worker
448*d83cc019SAndroid Build Coastguard Worker BLIT_COPY_BATCH_START(cmd_bits);
449*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((br13_bits) |
450*d83cc019SAndroid Build Coastguard Worker (0xcc << 16) | /* copy ROP */
451*d83cc019SAndroid Build Coastguard Worker dst_pitch);
452*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((dst_y1 << 16) | dst_x1); /* dst x1,y1 */
453*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(((dst_y1 + height) << 16) | (dst_x1 + width)); /* dst x2,y2 */
454*d83cc019SAndroid Build Coastguard Worker OUT_RELOC_FENCED(dst_bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
455*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((src_y1 << 16) | src_x1); /* src x1,y1 */
456*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(src_pitch);
457*d83cc019SAndroid Build Coastguard Worker OUT_RELOC_FENCED(src_bo, I915_GEM_DOMAIN_RENDER, 0, 0);
458*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
459*d83cc019SAndroid Build Coastguard Worker
460*d83cc019SAndroid Build Coastguard Worker #define CMD_POLY_STIPPLE_OFFSET 0x7906
461*d83cc019SAndroid Build Coastguard Worker if (gen == 5) {
462*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(2, 0);
463*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(CMD_POLY_STIPPLE_OFFSET << 16);
464*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
465*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
466*d83cc019SAndroid Build Coastguard Worker }
467*d83cc019SAndroid Build Coastguard Worker
468*d83cc019SAndroid Build Coastguard Worker if (gen >= 6 && src_bo == dst_bo) {
469*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(3, 0);
470*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(XY_SETUP_CLIP_BLT_CMD);
471*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
472*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
473*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
474*d83cc019SAndroid Build Coastguard Worker }
475*d83cc019SAndroid Build Coastguard Worker
476*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
477*d83cc019SAndroid Build Coastguard Worker }
478*d83cc019SAndroid Build Coastguard Worker
479*d83cc019SAndroid Build Coastguard Worker /**
480*d83cc019SAndroid Build Coastguard Worker * intel_copy_bo:
481*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
482*d83cc019SAndroid Build Coastguard Worker * @src_bo: source libdrm buffer object
483*d83cc019SAndroid Build Coastguard Worker * @dst_bo: destination libdrm buffer object
484*d83cc019SAndroid Build Coastguard Worker * @size: size of the copy range in bytes
485*d83cc019SAndroid Build Coastguard Worker *
486*d83cc019SAndroid Build Coastguard Worker * This emits a copy operation using blitter commands into the supplied batch
487*d83cc019SAndroid Build Coastguard Worker * buffer object. A total of @size bytes from the start of @src_bo is copied
488*d83cc019SAndroid Build Coastguard Worker * over to @dst_bo. Note that @size must be page-aligned.
489*d83cc019SAndroid Build Coastguard Worker */
490*d83cc019SAndroid Build Coastguard Worker void
intel_copy_bo(struct intel_batchbuffer * batch,drm_intel_bo * dst_bo,drm_intel_bo * src_bo,long int size)491*d83cc019SAndroid Build Coastguard Worker intel_copy_bo(struct intel_batchbuffer *batch,
492*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *dst_bo, drm_intel_bo *src_bo,
493*d83cc019SAndroid Build Coastguard Worker long int size)
494*d83cc019SAndroid Build Coastguard Worker {
495*d83cc019SAndroid Build Coastguard Worker igt_assert(size % 4096 == 0);
496*d83cc019SAndroid Build Coastguard Worker
497*d83cc019SAndroid Build Coastguard Worker intel_blt_copy(batch,
498*d83cc019SAndroid Build Coastguard Worker src_bo, 0, 0, 4096,
499*d83cc019SAndroid Build Coastguard Worker dst_bo, 0, 0, 4096,
500*d83cc019SAndroid Build Coastguard Worker 4096/4, size/4096, 32);
501*d83cc019SAndroid Build Coastguard Worker }
502*d83cc019SAndroid Build Coastguard Worker
503*d83cc019SAndroid Build Coastguard Worker /**
504*d83cc019SAndroid Build Coastguard Worker * igt_buf_width:
505*d83cc019SAndroid Build Coastguard Worker * @buf: the i-g-t buffer object
506*d83cc019SAndroid Build Coastguard Worker *
507*d83cc019SAndroid Build Coastguard Worker * Computes the width in 32-bit pixels of the given buffer.
508*d83cc019SAndroid Build Coastguard Worker *
509*d83cc019SAndroid Build Coastguard Worker * Returns:
510*d83cc019SAndroid Build Coastguard Worker * The width of the buffer.
511*d83cc019SAndroid Build Coastguard Worker */
igt_buf_width(const struct igt_buf * buf)512*d83cc019SAndroid Build Coastguard Worker unsigned igt_buf_width(const struct igt_buf *buf)
513*d83cc019SAndroid Build Coastguard Worker {
514*d83cc019SAndroid Build Coastguard Worker return buf->stride/(buf->bpp / 8);
515*d83cc019SAndroid Build Coastguard Worker }
516*d83cc019SAndroid Build Coastguard Worker
517*d83cc019SAndroid Build Coastguard Worker /**
518*d83cc019SAndroid Build Coastguard Worker * igt_buf_height:
519*d83cc019SAndroid Build Coastguard Worker * @buf: the i-g-t buffer object
520*d83cc019SAndroid Build Coastguard Worker *
521*d83cc019SAndroid Build Coastguard Worker * Computes the height in 32-bit pixels of the given buffer.
522*d83cc019SAndroid Build Coastguard Worker *
523*d83cc019SAndroid Build Coastguard Worker * Returns:
524*d83cc019SAndroid Build Coastguard Worker * The height of the buffer.
525*d83cc019SAndroid Build Coastguard Worker */
igt_buf_height(const struct igt_buf * buf)526*d83cc019SAndroid Build Coastguard Worker unsigned igt_buf_height(const struct igt_buf *buf)
527*d83cc019SAndroid Build Coastguard Worker {
528*d83cc019SAndroid Build Coastguard Worker return buf->size/buf->stride;
529*d83cc019SAndroid Build Coastguard Worker }
530*d83cc019SAndroid Build Coastguard Worker
531*d83cc019SAndroid Build Coastguard Worker /*
532*d83cc019SAndroid Build Coastguard Worker * pitches are in bytes if the surfaces are linear, number of dwords
533*d83cc019SAndroid Build Coastguard Worker * otherwise
534*d83cc019SAndroid Build Coastguard Worker */
fast_copy_pitch(unsigned int stride,unsigned int tiling)535*d83cc019SAndroid Build Coastguard Worker static uint32_t fast_copy_pitch(unsigned int stride, unsigned int tiling)
536*d83cc019SAndroid Build Coastguard Worker {
537*d83cc019SAndroid Build Coastguard Worker if (tiling != I915_TILING_NONE)
538*d83cc019SAndroid Build Coastguard Worker return stride / 4;
539*d83cc019SAndroid Build Coastguard Worker else
540*d83cc019SAndroid Build Coastguard Worker return stride;
541*d83cc019SAndroid Build Coastguard Worker }
542*d83cc019SAndroid Build Coastguard Worker
fast_copy_dword0(unsigned int src_tiling,unsigned int dst_tiling)543*d83cc019SAndroid Build Coastguard Worker static uint32_t fast_copy_dword0(unsigned int src_tiling,
544*d83cc019SAndroid Build Coastguard Worker unsigned int dst_tiling)
545*d83cc019SAndroid Build Coastguard Worker {
546*d83cc019SAndroid Build Coastguard Worker uint32_t dword0 = 0;
547*d83cc019SAndroid Build Coastguard Worker
548*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_BLT;
549*d83cc019SAndroid Build Coastguard Worker
550*d83cc019SAndroid Build Coastguard Worker switch (src_tiling) {
551*d83cc019SAndroid Build Coastguard Worker case I915_TILING_X:
552*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_SRC_TILING_X;
553*d83cc019SAndroid Build Coastguard Worker break;
554*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Y:
555*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Yf:
556*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_SRC_TILING_Yb_Yf;
557*d83cc019SAndroid Build Coastguard Worker break;
558*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Ys:
559*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_SRC_TILING_Ys;
560*d83cc019SAndroid Build Coastguard Worker break;
561*d83cc019SAndroid Build Coastguard Worker case I915_TILING_NONE:
562*d83cc019SAndroid Build Coastguard Worker default:
563*d83cc019SAndroid Build Coastguard Worker break;
564*d83cc019SAndroid Build Coastguard Worker }
565*d83cc019SAndroid Build Coastguard Worker
566*d83cc019SAndroid Build Coastguard Worker switch (dst_tiling) {
567*d83cc019SAndroid Build Coastguard Worker case I915_TILING_X:
568*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_DST_TILING_X;
569*d83cc019SAndroid Build Coastguard Worker break;
570*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Y:
571*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Yf:
572*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_DST_TILING_Yb_Yf;
573*d83cc019SAndroid Build Coastguard Worker break;
574*d83cc019SAndroid Build Coastguard Worker case I915_TILING_Ys:
575*d83cc019SAndroid Build Coastguard Worker dword0 |= XY_FAST_COPY_DST_TILING_Ys;
576*d83cc019SAndroid Build Coastguard Worker break;
577*d83cc019SAndroid Build Coastguard Worker case I915_TILING_NONE:
578*d83cc019SAndroid Build Coastguard Worker default:
579*d83cc019SAndroid Build Coastguard Worker break;
580*d83cc019SAndroid Build Coastguard Worker }
581*d83cc019SAndroid Build Coastguard Worker
582*d83cc019SAndroid Build Coastguard Worker return dword0;
583*d83cc019SAndroid Build Coastguard Worker }
584*d83cc019SAndroid Build Coastguard Worker
fast_copy_dword1(unsigned int src_tiling,unsigned int dst_tiling,int bpp)585*d83cc019SAndroid Build Coastguard Worker static uint32_t fast_copy_dword1(unsigned int src_tiling,
586*d83cc019SAndroid Build Coastguard Worker unsigned int dst_tiling,
587*d83cc019SAndroid Build Coastguard Worker int bpp)
588*d83cc019SAndroid Build Coastguard Worker {
589*d83cc019SAndroid Build Coastguard Worker uint32_t dword1 = 0;
590*d83cc019SAndroid Build Coastguard Worker
591*d83cc019SAndroid Build Coastguard Worker if (src_tiling == I915_TILING_Yf)
592*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_SRC_TILING_Yf;
593*d83cc019SAndroid Build Coastguard Worker if (dst_tiling == I915_TILING_Yf)
594*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_DST_TILING_Yf;
595*d83cc019SAndroid Build Coastguard Worker
596*d83cc019SAndroid Build Coastguard Worker switch (bpp) {
597*d83cc019SAndroid Build Coastguard Worker case 8:
598*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_COLOR_DEPTH_8;
599*d83cc019SAndroid Build Coastguard Worker break;
600*d83cc019SAndroid Build Coastguard Worker case 16:
601*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_COLOR_DEPTH_16;
602*d83cc019SAndroid Build Coastguard Worker break;
603*d83cc019SAndroid Build Coastguard Worker case 32:
604*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_COLOR_DEPTH_32;
605*d83cc019SAndroid Build Coastguard Worker break;
606*d83cc019SAndroid Build Coastguard Worker case 64:
607*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_COLOR_DEPTH_64;
608*d83cc019SAndroid Build Coastguard Worker break;
609*d83cc019SAndroid Build Coastguard Worker case 128:
610*d83cc019SAndroid Build Coastguard Worker dword1 |= XY_FAST_COPY_COLOR_DEPTH_128;
611*d83cc019SAndroid Build Coastguard Worker break;
612*d83cc019SAndroid Build Coastguard Worker default:
613*d83cc019SAndroid Build Coastguard Worker igt_assert(0);
614*d83cc019SAndroid Build Coastguard Worker }
615*d83cc019SAndroid Build Coastguard Worker
616*d83cc019SAndroid Build Coastguard Worker return dword1;
617*d83cc019SAndroid Build Coastguard Worker }
618*d83cc019SAndroid Build Coastguard Worker
619*d83cc019SAndroid Build Coastguard Worker static void
fill_relocation(struct drm_i915_gem_relocation_entry * reloc,uint32_t gem_handle,uint32_t delta,uint32_t offset,uint32_t read_domains,uint32_t write_domains)620*d83cc019SAndroid Build Coastguard Worker fill_relocation(struct drm_i915_gem_relocation_entry *reloc,
621*d83cc019SAndroid Build Coastguard Worker uint32_t gem_handle, uint32_t delta, /* in bytes */
622*d83cc019SAndroid Build Coastguard Worker uint32_t offset, /* in dwords */
623*d83cc019SAndroid Build Coastguard Worker uint32_t read_domains, uint32_t write_domains)
624*d83cc019SAndroid Build Coastguard Worker {
625*d83cc019SAndroid Build Coastguard Worker reloc->target_handle = gem_handle;
626*d83cc019SAndroid Build Coastguard Worker reloc->delta = delta;
627*d83cc019SAndroid Build Coastguard Worker reloc->offset = offset * sizeof(uint32_t);
628*d83cc019SAndroid Build Coastguard Worker reloc->presumed_offset = 0;
629*d83cc019SAndroid Build Coastguard Worker reloc->read_domains = read_domains;
630*d83cc019SAndroid Build Coastguard Worker reloc->write_domain = write_domains;
631*d83cc019SAndroid Build Coastguard Worker }
632*d83cc019SAndroid Build Coastguard Worker
633*d83cc019SAndroid Build Coastguard Worker static void
fill_object(struct drm_i915_gem_exec_object2 * obj,uint32_t gem_handle,struct drm_i915_gem_relocation_entry * relocs,uint32_t count)634*d83cc019SAndroid Build Coastguard Worker fill_object(struct drm_i915_gem_exec_object2 *obj, uint32_t gem_handle,
635*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_relocation_entry *relocs, uint32_t count)
636*d83cc019SAndroid Build Coastguard Worker {
637*d83cc019SAndroid Build Coastguard Worker memset(obj, 0, sizeof(*obj));
638*d83cc019SAndroid Build Coastguard Worker obj->handle = gem_handle;
639*d83cc019SAndroid Build Coastguard Worker obj->relocation_count = count;
640*d83cc019SAndroid Build Coastguard Worker obj->relocs_ptr = to_user_pointer(relocs);
641*d83cc019SAndroid Build Coastguard Worker }
642*d83cc019SAndroid Build Coastguard Worker
exec_blit(int fd,struct drm_i915_gem_exec_object2 * objs,uint32_t count,uint32_t batch_len)643*d83cc019SAndroid Build Coastguard Worker static void exec_blit(int fd,
644*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_exec_object2 *objs, uint32_t count,
645*d83cc019SAndroid Build Coastguard Worker uint32_t batch_len /* in dwords */)
646*d83cc019SAndroid Build Coastguard Worker {
647*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_execbuffer2 exec;
648*d83cc019SAndroid Build Coastguard Worker
649*d83cc019SAndroid Build Coastguard Worker exec.buffers_ptr = to_user_pointer(objs);
650*d83cc019SAndroid Build Coastguard Worker exec.buffer_count = count;
651*d83cc019SAndroid Build Coastguard Worker exec.batch_start_offset = 0;
652*d83cc019SAndroid Build Coastguard Worker exec.batch_len = batch_len * 4;
653*d83cc019SAndroid Build Coastguard Worker exec.DR1 = exec.DR4 = 0;
654*d83cc019SAndroid Build Coastguard Worker exec.num_cliprects = 0;
655*d83cc019SAndroid Build Coastguard Worker exec.cliprects_ptr = 0;
656*d83cc019SAndroid Build Coastguard Worker exec.flags = I915_EXEC_BLT;
657*d83cc019SAndroid Build Coastguard Worker i915_execbuffer2_set_context_id(exec, 0);
658*d83cc019SAndroid Build Coastguard Worker exec.rsvd2 = 0;
659*d83cc019SAndroid Build Coastguard Worker
660*d83cc019SAndroid Build Coastguard Worker gem_execbuf(fd, &exec);
661*d83cc019SAndroid Build Coastguard Worker }
662*d83cc019SAndroid Build Coastguard Worker
663*d83cc019SAndroid Build Coastguard Worker /**
664*d83cc019SAndroid Build Coastguard Worker * igt_blitter_fast_copy__raw:
665*d83cc019SAndroid Build Coastguard Worker * @fd: file descriptor of the i915 driver
666*d83cc019SAndroid Build Coastguard Worker * @src_handle: GEM handle of the source buffer
667*d83cc019SAndroid Build Coastguard Worker * @src_delta: offset into the source GEM bo, in bytes
668*d83cc019SAndroid Build Coastguard Worker * @src_stride: Stride (in bytes) of the source buffer
669*d83cc019SAndroid Build Coastguard Worker * @src_tiling: Tiling mode of the source buffer
670*d83cc019SAndroid Build Coastguard Worker * @src_x: X coordinate of the source region to copy
671*d83cc019SAndroid Build Coastguard Worker * @src_y: Y coordinate of the source region to copy
672*d83cc019SAndroid Build Coastguard Worker * @width: Width of the region to copy
673*d83cc019SAndroid Build Coastguard Worker * @height: Height of the region to copy
674*d83cc019SAndroid Build Coastguard Worker * @bpp: source and destination bits per pixel
675*d83cc019SAndroid Build Coastguard Worker * @dst_handle: GEM handle of the destination buffer
676*d83cc019SAndroid Build Coastguard Worker * @dst_delta: offset into the destination GEM bo, in bytes
677*d83cc019SAndroid Build Coastguard Worker * @dst_stride: Stride (in bytes) of the destination buffer
678*d83cc019SAndroid Build Coastguard Worker * @dst_tiling: Tiling mode of the destination buffer
679*d83cc019SAndroid Build Coastguard Worker * @dst_x: X coordinate of destination
680*d83cc019SAndroid Build Coastguard Worker * @dst_y: Y coordinate of destination
681*d83cc019SAndroid Build Coastguard Worker *
682*d83cc019SAndroid Build Coastguard Worker * Like igt_blitter_fast_copy(), but talking to the kernel directly.
683*d83cc019SAndroid Build Coastguard Worker */
igt_blitter_fast_copy__raw(int fd,uint32_t src_handle,unsigned int src_delta,unsigned int src_stride,unsigned int src_tiling,unsigned int src_x,unsigned src_y,unsigned int width,unsigned int height,int bpp,uint32_t dst_handle,unsigned dst_delta,unsigned int dst_stride,unsigned int dst_tiling,unsigned int dst_x,unsigned dst_y)684*d83cc019SAndroid Build Coastguard Worker void igt_blitter_fast_copy__raw(int fd,
685*d83cc019SAndroid Build Coastguard Worker /* src */
686*d83cc019SAndroid Build Coastguard Worker uint32_t src_handle,
687*d83cc019SAndroid Build Coastguard Worker unsigned int src_delta,
688*d83cc019SAndroid Build Coastguard Worker unsigned int src_stride,
689*d83cc019SAndroid Build Coastguard Worker unsigned int src_tiling,
690*d83cc019SAndroid Build Coastguard Worker unsigned int src_x, unsigned src_y,
691*d83cc019SAndroid Build Coastguard Worker
692*d83cc019SAndroid Build Coastguard Worker /* size */
693*d83cc019SAndroid Build Coastguard Worker unsigned int width, unsigned int height,
694*d83cc019SAndroid Build Coastguard Worker
695*d83cc019SAndroid Build Coastguard Worker /* bpp */
696*d83cc019SAndroid Build Coastguard Worker int bpp,
697*d83cc019SAndroid Build Coastguard Worker
698*d83cc019SAndroid Build Coastguard Worker /* dst */
699*d83cc019SAndroid Build Coastguard Worker uint32_t dst_handle,
700*d83cc019SAndroid Build Coastguard Worker unsigned dst_delta,
701*d83cc019SAndroid Build Coastguard Worker unsigned int dst_stride,
702*d83cc019SAndroid Build Coastguard Worker unsigned int dst_tiling,
703*d83cc019SAndroid Build Coastguard Worker unsigned int dst_x, unsigned dst_y)
704*d83cc019SAndroid Build Coastguard Worker {
705*d83cc019SAndroid Build Coastguard Worker uint32_t batch[12];
706*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_exec_object2 objs[3];
707*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_relocation_entry relocs[2];
708*d83cc019SAndroid Build Coastguard Worker uint32_t batch_handle;
709*d83cc019SAndroid Build Coastguard Worker uint32_t dword0, dword1;
710*d83cc019SAndroid Build Coastguard Worker uint32_t src_pitch, dst_pitch;
711*d83cc019SAndroid Build Coastguard Worker int i = 0;
712*d83cc019SAndroid Build Coastguard Worker
713*d83cc019SAndroid Build Coastguard Worker src_pitch = fast_copy_pitch(src_stride, src_tiling);
714*d83cc019SAndroid Build Coastguard Worker dst_pitch = fast_copy_pitch(dst_stride, dst_tiling);
715*d83cc019SAndroid Build Coastguard Worker dword0 = fast_copy_dword0(src_tiling, dst_tiling);
716*d83cc019SAndroid Build Coastguard Worker dword1 = fast_copy_dword1(src_tiling, dst_tiling, bpp);
717*d83cc019SAndroid Build Coastguard Worker
718*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x); CHECK_RANGE(src_y);
719*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x); CHECK_RANGE(dst_y);
720*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(width); CHECK_RANGE(height);
721*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x + width); CHECK_RANGE(src_y + height);
722*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x + width); CHECK_RANGE(dst_y + height);
723*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_pitch); CHECK_RANGE(dst_pitch);
724*d83cc019SAndroid Build Coastguard Worker
725*d83cc019SAndroid Build Coastguard Worker batch[i++] = dword0;
726*d83cc019SAndroid Build Coastguard Worker batch[i++] = dword1 | dst_pitch;
727*d83cc019SAndroid Build Coastguard Worker batch[i++] = (dst_y << 16) | dst_x; /* dst x1,y1 */
728*d83cc019SAndroid Build Coastguard Worker batch[i++] = ((dst_y + height) << 16) | (dst_x + width); /* dst x2,y2 */
729*d83cc019SAndroid Build Coastguard Worker batch[i++] = dst_delta; /* dst address lower bits */
730*d83cc019SAndroid Build Coastguard Worker batch[i++] = 0; /* dst address upper bits */
731*d83cc019SAndroid Build Coastguard Worker batch[i++] = (src_y << 16) | src_x; /* src x1,y1 */
732*d83cc019SAndroid Build Coastguard Worker batch[i++] = src_pitch;
733*d83cc019SAndroid Build Coastguard Worker batch[i++] = src_delta; /* src address lower bits */
734*d83cc019SAndroid Build Coastguard Worker batch[i++] = 0; /* src address upper bits */
735*d83cc019SAndroid Build Coastguard Worker batch[i++] = MI_BATCH_BUFFER_END;
736*d83cc019SAndroid Build Coastguard Worker batch[i++] = MI_NOOP;
737*d83cc019SAndroid Build Coastguard Worker
738*d83cc019SAndroid Build Coastguard Worker igt_assert(i == ARRAY_SIZE(batch));
739*d83cc019SAndroid Build Coastguard Worker
740*d83cc019SAndroid Build Coastguard Worker batch_handle = gem_create(fd, 4096);
741*d83cc019SAndroid Build Coastguard Worker gem_write(fd, batch_handle, 0, batch, sizeof(batch));
742*d83cc019SAndroid Build Coastguard Worker
743*d83cc019SAndroid Build Coastguard Worker fill_relocation(&relocs[0], dst_handle, dst_delta, 4,
744*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER);
745*d83cc019SAndroid Build Coastguard Worker fill_relocation(&relocs[1], src_handle, src_delta, 8, I915_GEM_DOMAIN_RENDER, 0);
746*d83cc019SAndroid Build Coastguard Worker
747*d83cc019SAndroid Build Coastguard Worker fill_object(&objs[0], dst_handle, NULL, 0);
748*d83cc019SAndroid Build Coastguard Worker fill_object(&objs[1], src_handle, NULL, 0);
749*d83cc019SAndroid Build Coastguard Worker fill_object(&objs[2], batch_handle, relocs, 2);
750*d83cc019SAndroid Build Coastguard Worker
751*d83cc019SAndroid Build Coastguard Worker exec_blit(fd, objs, 3, ARRAY_SIZE(batch));
752*d83cc019SAndroid Build Coastguard Worker
753*d83cc019SAndroid Build Coastguard Worker gem_close(fd, batch_handle);
754*d83cc019SAndroid Build Coastguard Worker }
755*d83cc019SAndroid Build Coastguard Worker
756*d83cc019SAndroid Build Coastguard Worker /**
757*d83cc019SAndroid Build Coastguard Worker * igt_blitter_fast_copy:
758*d83cc019SAndroid Build Coastguard Worker * @batch: batchbuffer object
759*d83cc019SAndroid Build Coastguard Worker * @src: source i-g-t buffer object
760*d83cc019SAndroid Build Coastguard Worker * @src_delta: offset into the source i-g-t bo
761*d83cc019SAndroid Build Coastguard Worker * @src_x: source pixel x-coordination
762*d83cc019SAndroid Build Coastguard Worker * @src_y: source pixel y-coordination
763*d83cc019SAndroid Build Coastguard Worker * @width: width of the copied rectangle
764*d83cc019SAndroid Build Coastguard Worker * @height: height of the copied rectangle
765*d83cc019SAndroid Build Coastguard Worker * @dst: destination i-g-t buffer object
766*d83cc019SAndroid Build Coastguard Worker * @dst_delta: offset into the destination i-g-t bo
767*d83cc019SAndroid Build Coastguard Worker * @dst_x: destination pixel x-coordination
768*d83cc019SAndroid Build Coastguard Worker * @dst_y: destination pixel y-coordination
769*d83cc019SAndroid Build Coastguard Worker *
770*d83cc019SAndroid Build Coastguard Worker * Copy @src into @dst using the gen9 fast copy blitter command.
771*d83cc019SAndroid Build Coastguard Worker *
772*d83cc019SAndroid Build Coastguard Worker * The source and destination surfaces cannot overlap.
773*d83cc019SAndroid Build Coastguard Worker */
igt_blitter_fast_copy(struct intel_batchbuffer * batch,const struct igt_buf * src,unsigned src_delta,unsigned src_x,unsigned src_y,unsigned width,unsigned height,int bpp,const struct igt_buf * dst,unsigned dst_delta,unsigned dst_x,unsigned dst_y)774*d83cc019SAndroid Build Coastguard Worker void igt_blitter_fast_copy(struct intel_batchbuffer *batch,
775*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *src, unsigned src_delta,
776*d83cc019SAndroid Build Coastguard Worker unsigned src_x, unsigned src_y,
777*d83cc019SAndroid Build Coastguard Worker unsigned width, unsigned height,
778*d83cc019SAndroid Build Coastguard Worker int bpp,
779*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, unsigned dst_delta,
780*d83cc019SAndroid Build Coastguard Worker unsigned dst_x, unsigned dst_y)
781*d83cc019SAndroid Build Coastguard Worker {
782*d83cc019SAndroid Build Coastguard Worker uint32_t src_pitch, dst_pitch;
783*d83cc019SAndroid Build Coastguard Worker uint32_t dword0, dword1;
784*d83cc019SAndroid Build Coastguard Worker
785*d83cc019SAndroid Build Coastguard Worker igt_assert(src->bpp == dst->bpp);
786*d83cc019SAndroid Build Coastguard Worker
787*d83cc019SAndroid Build Coastguard Worker src_pitch = fast_copy_pitch(src->stride, src->tiling);
788*d83cc019SAndroid Build Coastguard Worker dst_pitch = fast_copy_pitch(dst->stride, src->tiling);
789*d83cc019SAndroid Build Coastguard Worker dword0 = fast_copy_dword0(src->tiling, dst->tiling);
790*d83cc019SAndroid Build Coastguard Worker dword1 = fast_copy_dword1(src->tiling, dst->tiling, dst->bpp);
791*d83cc019SAndroid Build Coastguard Worker
792*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x); CHECK_RANGE(src_y);
793*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x); CHECK_RANGE(dst_y);
794*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(width); CHECK_RANGE(height);
795*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_x + width); CHECK_RANGE(src_y + height);
796*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(dst_x + width); CHECK_RANGE(dst_y + height);
797*d83cc019SAndroid Build Coastguard Worker CHECK_RANGE(src_pitch); CHECK_RANGE(dst_pitch);
798*d83cc019SAndroid Build Coastguard Worker
799*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(10, 2);
800*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(dword0);
801*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(dword1 | dst_pitch);
802*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((dst_y << 16) | dst_x); /* dst x1,y1 */
803*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(((dst_y + height) << 16) | (dst_x + width)); /* dst x2,y2 */
804*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(dst->bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, dst_delta);
805*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* dst address upper bits */
806*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((src_y << 16) | src_x); /* src x1,y1 */
807*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(src_pitch);
808*d83cc019SAndroid Build Coastguard Worker OUT_RELOC(src->bo, I915_GEM_DOMAIN_RENDER, 0, src_delta);
809*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0); /* src address upper bits */
810*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
811*d83cc019SAndroid Build Coastguard Worker
812*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
813*d83cc019SAndroid Build Coastguard Worker }
814*d83cc019SAndroid Build Coastguard Worker
815*d83cc019SAndroid Build Coastguard Worker #undef CHECK_RANGE
816*d83cc019SAndroid Build Coastguard Worker
817*d83cc019SAndroid Build Coastguard Worker /**
818*d83cc019SAndroid Build Coastguard Worker * igt_get_render_copyfunc:
819*d83cc019SAndroid Build Coastguard Worker * @devid: pci device id
820*d83cc019SAndroid Build Coastguard Worker *
821*d83cc019SAndroid Build Coastguard Worker * Returns:
822*d83cc019SAndroid Build Coastguard Worker *
823*d83cc019SAndroid Build Coastguard Worker * The platform-specific render copy function pointer for the device
824*d83cc019SAndroid Build Coastguard Worker * specified with @devid. Will return NULL when no render copy function is
825*d83cc019SAndroid Build Coastguard Worker * implemented.
826*d83cc019SAndroid Build Coastguard Worker */
igt_get_render_copyfunc(int devid)827*d83cc019SAndroid Build Coastguard Worker igt_render_copyfunc_t igt_get_render_copyfunc(int devid)
828*d83cc019SAndroid Build Coastguard Worker {
829*d83cc019SAndroid Build Coastguard Worker igt_render_copyfunc_t copy = NULL;
830*d83cc019SAndroid Build Coastguard Worker
831*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid))
832*d83cc019SAndroid Build Coastguard Worker copy = gen2_render_copyfunc;
833*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN3(devid))
834*d83cc019SAndroid Build Coastguard Worker copy = gen3_render_copyfunc;
835*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN4(devid) || IS_GEN5(devid))
836*d83cc019SAndroid Build Coastguard Worker copy = gen4_render_copyfunc;
837*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN6(devid))
838*d83cc019SAndroid Build Coastguard Worker copy = gen6_render_copyfunc;
839*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN7(devid))
840*d83cc019SAndroid Build Coastguard Worker copy = gen7_render_copyfunc;
841*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN8(devid))
842*d83cc019SAndroid Build Coastguard Worker copy = gen8_render_copyfunc;
843*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN9(devid) || IS_GEN10(devid))
844*d83cc019SAndroid Build Coastguard Worker copy = gen9_render_copyfunc;
845*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN11(devid))
846*d83cc019SAndroid Build Coastguard Worker copy = gen11_render_copyfunc;
847*d83cc019SAndroid Build Coastguard Worker
848*d83cc019SAndroid Build Coastguard Worker return copy;
849*d83cc019SAndroid Build Coastguard Worker }
850*d83cc019SAndroid Build Coastguard Worker
851*d83cc019SAndroid Build Coastguard Worker /**
852*d83cc019SAndroid Build Coastguard Worker * igt_get_media_fillfunc:
853*d83cc019SAndroid Build Coastguard Worker * @devid: pci device id
854*d83cc019SAndroid Build Coastguard Worker *
855*d83cc019SAndroid Build Coastguard Worker * Returns:
856*d83cc019SAndroid Build Coastguard Worker *
857*d83cc019SAndroid Build Coastguard Worker * The platform-specific media fill function pointer for the device specified
858*d83cc019SAndroid Build Coastguard Worker * with @devid. Will return NULL when no media fill function is implemented.
859*d83cc019SAndroid Build Coastguard Worker */
igt_get_media_fillfunc(int devid)860*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t igt_get_media_fillfunc(int devid)
861*d83cc019SAndroid Build Coastguard Worker {
862*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t fill = NULL;
863*d83cc019SAndroid Build Coastguard Worker
864*d83cc019SAndroid Build Coastguard Worker if (IS_GEN9(devid) || IS_GEN10(devid) || IS_GEN11(devid))
865*d83cc019SAndroid Build Coastguard Worker fill = gen9_media_fillfunc;
866*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN8(devid))
867*d83cc019SAndroid Build Coastguard Worker fill = gen8_media_fillfunc;
868*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN7(devid))
869*d83cc019SAndroid Build Coastguard Worker fill = gen7_media_fillfunc;
870*d83cc019SAndroid Build Coastguard Worker
871*d83cc019SAndroid Build Coastguard Worker return fill;
872*d83cc019SAndroid Build Coastguard Worker }
873*d83cc019SAndroid Build Coastguard Worker
igt_get_media_vme_func(int devid)874*d83cc019SAndroid Build Coastguard Worker igt_vme_func_t igt_get_media_vme_func(int devid)
875*d83cc019SAndroid Build Coastguard Worker {
876*d83cc019SAndroid Build Coastguard Worker igt_vme_func_t fill = NULL;
877*d83cc019SAndroid Build Coastguard Worker
878*d83cc019SAndroid Build Coastguard Worker if (IS_GEN11(devid))
879*d83cc019SAndroid Build Coastguard Worker fill = gen11_media_vme_func;
880*d83cc019SAndroid Build Coastguard Worker
881*d83cc019SAndroid Build Coastguard Worker return fill;
882*d83cc019SAndroid Build Coastguard Worker }
883*d83cc019SAndroid Build Coastguard Worker /**
884*d83cc019SAndroid Build Coastguard Worker * igt_get_gpgpu_fillfunc:
885*d83cc019SAndroid Build Coastguard Worker * @devid: pci device id
886*d83cc019SAndroid Build Coastguard Worker *
887*d83cc019SAndroid Build Coastguard Worker * Returns:
888*d83cc019SAndroid Build Coastguard Worker *
889*d83cc019SAndroid Build Coastguard Worker * The platform-specific gpgpu fill function pointer for the device specified
890*d83cc019SAndroid Build Coastguard Worker * with @devid. Will return NULL when no gpgpu fill function is implemented.
891*d83cc019SAndroid Build Coastguard Worker */
igt_get_gpgpu_fillfunc(int devid)892*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t igt_get_gpgpu_fillfunc(int devid)
893*d83cc019SAndroid Build Coastguard Worker {
894*d83cc019SAndroid Build Coastguard Worker igt_fillfunc_t fill = NULL;
895*d83cc019SAndroid Build Coastguard Worker
896*d83cc019SAndroid Build Coastguard Worker if (IS_GEN7(devid))
897*d83cc019SAndroid Build Coastguard Worker fill = gen7_gpgpu_fillfunc;
898*d83cc019SAndroid Build Coastguard Worker else if (IS_BROADWELL(devid))
899*d83cc019SAndroid Build Coastguard Worker fill = gen8_gpgpu_fillfunc;
900*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN9(devid) || IS_GEN10(devid))
901*d83cc019SAndroid Build Coastguard Worker fill = gen9_gpgpu_fillfunc;
902*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN11(devid))
903*d83cc019SAndroid Build Coastguard Worker fill = gen11_gpgpu_fillfunc;
904*d83cc019SAndroid Build Coastguard Worker
905*d83cc019SAndroid Build Coastguard Worker return fill;
906*d83cc019SAndroid Build Coastguard Worker }
907*d83cc019SAndroid Build Coastguard Worker
908*d83cc019SAndroid Build Coastguard Worker /**
909*d83cc019SAndroid Build Coastguard Worker * igt_get_media_spinfunc:
910*d83cc019SAndroid Build Coastguard Worker * @devid: pci device id
911*d83cc019SAndroid Build Coastguard Worker *
912*d83cc019SAndroid Build Coastguard Worker * Returns:
913*d83cc019SAndroid Build Coastguard Worker *
914*d83cc019SAndroid Build Coastguard Worker * The platform-specific media spin function pointer for the device specified
915*d83cc019SAndroid Build Coastguard Worker * with @devid. Will return NULL when no media spin function is implemented.
916*d83cc019SAndroid Build Coastguard Worker */
igt_get_media_spinfunc(int devid)917*d83cc019SAndroid Build Coastguard Worker igt_media_spinfunc_t igt_get_media_spinfunc(int devid)
918*d83cc019SAndroid Build Coastguard Worker {
919*d83cc019SAndroid Build Coastguard Worker igt_media_spinfunc_t spin = NULL;
920*d83cc019SAndroid Build Coastguard Worker
921*d83cc019SAndroid Build Coastguard Worker if (IS_GEN9(devid))
922*d83cc019SAndroid Build Coastguard Worker spin = gen9_media_spinfunc;
923*d83cc019SAndroid Build Coastguard Worker else if (IS_GEN8(devid))
924*d83cc019SAndroid Build Coastguard Worker spin = gen8_media_spinfunc;
925*d83cc019SAndroid Build Coastguard Worker
926*d83cc019SAndroid Build Coastguard Worker return spin;
927*d83cc019SAndroid Build Coastguard Worker }
928