1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2015 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Jeff McGee <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker */
26*d83cc019SAndroid Build Coastguard Worker
27*d83cc019SAndroid Build Coastguard Worker #include <intel_bufmgr.h>
28*d83cc019SAndroid Build Coastguard Worker #include <i915_drm.h>
29*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
30*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
31*d83cc019SAndroid Build Coastguard Worker #include "intel_batchbuffer.h"
32*d83cc019SAndroid Build Coastguard Worker #include "gen8_media.h"
33*d83cc019SAndroid Build Coastguard Worker #include "media_spin.h"
34*d83cc019SAndroid Build Coastguard Worker #include "gpu_cmds.h"
35*d83cc019SAndroid Build Coastguard Worker
36*d83cc019SAndroid Build Coastguard Worker static const uint32_t spin_kernel[][4] = {
37*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x20800208, 0x008d0000, 0x00000000 }, /* mov (8)r4.0<1>:ud r0.0<8;8;1>:ud */
38*d83cc019SAndroid Build Coastguard Worker { 0x00200001, 0x20800208, 0x00450040, 0x00000000 }, /* mov (2)r4.0<1>.ud r2.0<2;2;1>:ud */
39*d83cc019SAndroid Build Coastguard Worker { 0x00000001, 0x20880608, 0x00000000, 0x00000003 }, /* mov (1)r4.8<1>:ud 0x3 */
40*d83cc019SAndroid Build Coastguard Worker { 0x00000001, 0x20a00608, 0x00000000, 0x00000000 }, /* mov (1)r5.0<1>:ud 0 */
41*d83cc019SAndroid Build Coastguard Worker { 0x00000040, 0x20a00208, 0x060000a0, 0x00000001 }, /* add (1)r5.0<1>:ud r5.0<0;1;0>:ud 1 */
42*d83cc019SAndroid Build Coastguard Worker { 0x01000010, 0x20000200, 0x02000020, 0x000000a0 }, /* cmp.e.f0.0 (1)null<1> r1<0;1;0> r5<0;1;0> */
43*d83cc019SAndroid Build Coastguard Worker { 0x00110027, 0x00000000, 0x00000000, 0xffffffe0 }, /* ~f0.0 while (1) -32 */
44*d83cc019SAndroid Build Coastguard Worker { 0x0c800031, 0x20000a00, 0x0e000080, 0x040a8000 }, /* send.dcdp1 (16)null<1> r4.0<0;1;0> 0x040a8000 */
45*d83cc019SAndroid Build Coastguard Worker { 0x00600001, 0x2e000208, 0x008d0000, 0x00000000 }, /* mov (8)r112<1>:ud r0.0<8;8;1>:ud */
46*d83cc019SAndroid Build Coastguard Worker { 0x07800031, 0x20000a40, 0x0e000e00, 0x82000010 }, /* send.ts (16)null<1> r112<0;1;0>:d 0x82000010 */
47*d83cc019SAndroid Build Coastguard Worker };
48*d83cc019SAndroid Build Coastguard Worker
49*d83cc019SAndroid Build Coastguard Worker /*
50*d83cc019SAndroid Build Coastguard Worker * This sets up the media pipeline,
51*d83cc019SAndroid Build Coastguard Worker *
52*d83cc019SAndroid Build Coastguard Worker * +---------------+ <---- 4096
53*d83cc019SAndroid Build Coastguard Worker * | ^ |
54*d83cc019SAndroid Build Coastguard Worker * | | |
55*d83cc019SAndroid Build Coastguard Worker * | various |
56*d83cc019SAndroid Build Coastguard Worker * | state |
57*d83cc019SAndroid Build Coastguard Worker * | | |
58*d83cc019SAndroid Build Coastguard Worker * |_______|_______| <---- 2048 + ?
59*d83cc019SAndroid Build Coastguard Worker * | ^ |
60*d83cc019SAndroid Build Coastguard Worker * | | |
61*d83cc019SAndroid Build Coastguard Worker * | batch |
62*d83cc019SAndroid Build Coastguard Worker * | commands |
63*d83cc019SAndroid Build Coastguard Worker * | | |
64*d83cc019SAndroid Build Coastguard Worker * | | |
65*d83cc019SAndroid Build Coastguard Worker * +---------------+ <---- 0 + ?
66*d83cc019SAndroid Build Coastguard Worker *
67*d83cc019SAndroid Build Coastguard Worker */
68*d83cc019SAndroid Build Coastguard Worker
69*d83cc019SAndroid Build Coastguard Worker #define BATCH_STATE_SPLIT 2048
70*d83cc019SAndroid Build Coastguard Worker /* VFE STATE params */
71*d83cc019SAndroid Build Coastguard Worker #define THREADS 0
72*d83cc019SAndroid Build Coastguard Worker #define MEDIA_URB_ENTRIES 2
73*d83cc019SAndroid Build Coastguard Worker #define MEDIA_URB_SIZE 2
74*d83cc019SAndroid Build Coastguard Worker #define MEDIA_CURBE_SIZE 2
75*d83cc019SAndroid Build Coastguard Worker
76*d83cc019SAndroid Build Coastguard Worker /* Offsets needed in gen_emit_media_object. In media_spin library this
77*d83cc019SAndroid Build Coastguard Worker * values do not matter.
78*d83cc019SAndroid Build Coastguard Worker */
79*d83cc019SAndroid Build Coastguard Worker #define xoffset 0
80*d83cc019SAndroid Build Coastguard Worker #define yoffset 0
81*d83cc019SAndroid Build Coastguard Worker
82*d83cc019SAndroid Build Coastguard Worker void
gen8_media_spinfunc(struct intel_batchbuffer * batch,const struct igt_buf * dst,uint32_t spins)83*d83cc019SAndroid Build Coastguard Worker gen8_media_spinfunc(struct intel_batchbuffer *batch,
84*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, uint32_t spins)
85*d83cc019SAndroid Build Coastguard Worker {
86*d83cc019SAndroid Build Coastguard Worker uint32_t curbe_buffer, interface_descriptor;
87*d83cc019SAndroid Build Coastguard Worker uint32_t batch_end;
88*d83cc019SAndroid Build Coastguard Worker
89*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_with_context(batch, NULL);
90*d83cc019SAndroid Build Coastguard Worker
91*d83cc019SAndroid Build Coastguard Worker /* setup states */
92*d83cc019SAndroid Build Coastguard Worker batch->ptr = &batch->buffer[BATCH_STATE_SPLIT];
93*d83cc019SAndroid Build Coastguard Worker
94*d83cc019SAndroid Build Coastguard Worker curbe_buffer = gen8_spin_curbe_buffer_data(batch, spins);
95*d83cc019SAndroid Build Coastguard Worker interface_descriptor = gen8_fill_interface_descriptor(batch, dst,
96*d83cc019SAndroid Build Coastguard Worker spin_kernel, sizeof(spin_kernel));
97*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->ptr < &batch->buffer[4095]);
98*d83cc019SAndroid Build Coastguard Worker
99*d83cc019SAndroid Build Coastguard Worker /* media pipeline */
100*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer;
101*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA);
102*d83cc019SAndroid Build Coastguard Worker gen8_emit_state_base_address(batch);
103*d83cc019SAndroid Build Coastguard Worker
104*d83cc019SAndroid Build Coastguard Worker gen8_emit_vfe_state(batch, THREADS, MEDIA_URB_ENTRIES,
105*d83cc019SAndroid Build Coastguard Worker MEDIA_URB_SIZE, MEDIA_CURBE_SIZE);
106*d83cc019SAndroid Build Coastguard Worker
107*d83cc019SAndroid Build Coastguard Worker gen7_emit_curbe_load(batch, curbe_buffer);
108*d83cc019SAndroid Build Coastguard Worker
109*d83cc019SAndroid Build Coastguard Worker gen7_emit_interface_descriptor_load(batch, interface_descriptor);
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker gen_emit_media_object(batch, xoffset, yoffset);
112*d83cc019SAndroid Build Coastguard Worker
113*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(MI_BATCH_BUFFER_END);
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker batch_end = intel_batchbuffer_align(batch, 8);
116*d83cc019SAndroid Build Coastguard Worker igt_assert(batch_end < BATCH_STATE_SPLIT);
117*d83cc019SAndroid Build Coastguard Worker
118*d83cc019SAndroid Build Coastguard Worker gen7_render_flush(batch, batch_end);
119*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
120*d83cc019SAndroid Build Coastguard Worker }
121*d83cc019SAndroid Build Coastguard Worker
122*d83cc019SAndroid Build Coastguard Worker void
gen9_media_spinfunc(struct intel_batchbuffer * batch,const struct igt_buf * dst,uint32_t spins)123*d83cc019SAndroid Build Coastguard Worker gen9_media_spinfunc(struct intel_batchbuffer *batch,
124*d83cc019SAndroid Build Coastguard Worker const struct igt_buf *dst, uint32_t spins)
125*d83cc019SAndroid Build Coastguard Worker {
126*d83cc019SAndroid Build Coastguard Worker uint32_t curbe_buffer, interface_descriptor;
127*d83cc019SAndroid Build Coastguard Worker uint32_t batch_end;
128*d83cc019SAndroid Build Coastguard Worker
129*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush_with_context(batch, NULL);
130*d83cc019SAndroid Build Coastguard Worker
131*d83cc019SAndroid Build Coastguard Worker /* setup states */
132*d83cc019SAndroid Build Coastguard Worker batch->ptr = &batch->buffer[BATCH_STATE_SPLIT];
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker curbe_buffer = gen8_spin_curbe_buffer_data(batch, spins);
135*d83cc019SAndroid Build Coastguard Worker interface_descriptor = gen8_fill_interface_descriptor(batch, dst,
136*d83cc019SAndroid Build Coastguard Worker spin_kernel, sizeof(spin_kernel));
137*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->ptr < &batch->buffer[4095]);
138*d83cc019SAndroid Build Coastguard Worker
139*d83cc019SAndroid Build Coastguard Worker /* media pipeline */
140*d83cc019SAndroid Build Coastguard Worker batch->ptr = batch->buffer;
141*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA |
142*d83cc019SAndroid Build Coastguard Worker GEN9_FORCE_MEDIA_AWAKE_ENABLE |
143*d83cc019SAndroid Build Coastguard Worker GEN9_SAMPLER_DOP_GATE_DISABLE |
144*d83cc019SAndroid Build Coastguard Worker GEN9_PIPELINE_SELECTION_MASK |
145*d83cc019SAndroid Build Coastguard Worker GEN9_SAMPLER_DOP_GATE_MASK |
146*d83cc019SAndroid Build Coastguard Worker GEN9_FORCE_MEDIA_AWAKE_MASK);
147*d83cc019SAndroid Build Coastguard Worker gen9_emit_state_base_address(batch);
148*d83cc019SAndroid Build Coastguard Worker
149*d83cc019SAndroid Build Coastguard Worker gen8_emit_vfe_state(batch, THREADS, MEDIA_URB_ENTRIES,
150*d83cc019SAndroid Build Coastguard Worker MEDIA_URB_SIZE, MEDIA_CURBE_SIZE);
151*d83cc019SAndroid Build Coastguard Worker
152*d83cc019SAndroid Build Coastguard Worker gen7_emit_curbe_load(batch, curbe_buffer);
153*d83cc019SAndroid Build Coastguard Worker
154*d83cc019SAndroid Build Coastguard Worker gen7_emit_interface_descriptor_load(batch, interface_descriptor);
155*d83cc019SAndroid Build Coastguard Worker
156*d83cc019SAndroid Build Coastguard Worker gen_emit_media_object(batch, xoffset, yoffset);
157*d83cc019SAndroid Build Coastguard Worker
158*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(GEN8_PIPELINE_SELECT | PIPELINE_SELECT_MEDIA |
159*d83cc019SAndroid Build Coastguard Worker GEN9_FORCE_MEDIA_AWAKE_DISABLE |
160*d83cc019SAndroid Build Coastguard Worker GEN9_SAMPLER_DOP_GATE_ENABLE |
161*d83cc019SAndroid Build Coastguard Worker GEN9_PIPELINE_SELECTION_MASK |
162*d83cc019SAndroid Build Coastguard Worker GEN9_SAMPLER_DOP_GATE_MASK |
163*d83cc019SAndroid Build Coastguard Worker GEN9_FORCE_MEDIA_AWAKE_MASK);
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(MI_BATCH_BUFFER_END);
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker batch_end = intel_batchbuffer_align(batch, 8);
168*d83cc019SAndroid Build Coastguard Worker igt_assert(batch_end < BATCH_STATE_SPLIT);
169*d83cc019SAndroid Build Coastguard Worker
170*d83cc019SAndroid Build Coastguard Worker gen7_render_flush(batch, batch_end);
171*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_reset(batch);
172*d83cc019SAndroid Build Coastguard Worker }
173