xref: /aosp_15_r20/external/igt-gpu-tools/lib/gpu_cmds.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2018 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  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #include "gpu_cmds.h"
26*d83cc019SAndroid Build Coastguard Worker 
27*d83cc019SAndroid Build Coastguard Worker void
gen7_render_flush(struct intel_batchbuffer * batch,uint32_t batch_end)28*d83cc019SAndroid Build Coastguard Worker gen7_render_flush(struct intel_batchbuffer *batch, uint32_t batch_end)
29*d83cc019SAndroid Build Coastguard Worker {
30*d83cc019SAndroid Build Coastguard Worker 	int ret;
31*d83cc019SAndroid Build Coastguard Worker 
32*d83cc019SAndroid Build Coastguard Worker 	ret = drm_intel_bo_subdata(batch->bo, 0, 4096, batch->buffer);
33*d83cc019SAndroid Build Coastguard Worker 	if (ret == 0)
34*d83cc019SAndroid Build Coastguard Worker 		ret = drm_intel_bo_mrb_exec(batch->bo, batch_end,
35*d83cc019SAndroid Build Coastguard Worker 					    NULL, 0, 0, 0);
36*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ret == 0);
37*d83cc019SAndroid Build Coastguard Worker }
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker void
gen7_render_context_flush(struct intel_batchbuffer * batch,uint32_t batch_end)40*d83cc019SAndroid Build Coastguard Worker gen7_render_context_flush(struct intel_batchbuffer *batch, uint32_t batch_end)
41*d83cc019SAndroid Build Coastguard Worker {
42*d83cc019SAndroid Build Coastguard Worker 	int ret;
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker 	ret = drm_intel_bo_subdata(batch->bo, 0, 4096, batch->buffer);
45*d83cc019SAndroid Build Coastguard Worker 	if (ret == 0)
46*d83cc019SAndroid Build Coastguard Worker 		ret = drm_intel_gem_bo_context_exec(batch->bo, batch->ctx,
47*d83cc019SAndroid Build Coastguard Worker 				batch_end, 0);
48*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ret == 0);
49*d83cc019SAndroid Build Coastguard Worker }
50*d83cc019SAndroid Build Coastguard Worker 
51*d83cc019SAndroid Build Coastguard Worker uint32_t
gen7_fill_curbe_buffer_data(struct intel_batchbuffer * batch,uint8_t color)52*d83cc019SAndroid Build Coastguard Worker gen7_fill_curbe_buffer_data(struct intel_batchbuffer *batch,
53*d83cc019SAndroid Build Coastguard Worker 			    uint8_t color)
54*d83cc019SAndroid Build Coastguard Worker {
55*d83cc019SAndroid Build Coastguard Worker 	uint8_t *curbe_buffer;
56*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
57*d83cc019SAndroid Build Coastguard Worker 
58*d83cc019SAndroid Build Coastguard Worker 	curbe_buffer = intel_batchbuffer_subdata_alloc(batch,
59*d83cc019SAndroid Build Coastguard Worker 						       sizeof(uint32_t) * 8,
60*d83cc019SAndroid Build Coastguard Worker 						       64);
61*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, curbe_buffer);
62*d83cc019SAndroid Build Coastguard Worker 	*curbe_buffer = color;
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker 	return offset;
65*d83cc019SAndroid Build Coastguard Worker }
66*d83cc019SAndroid Build Coastguard Worker 
67*d83cc019SAndroid Build Coastguard Worker uint32_t
gen11_fill_curbe_buffer_data(struct intel_batchbuffer * batch)68*d83cc019SAndroid Build Coastguard Worker gen11_fill_curbe_buffer_data(struct intel_batchbuffer *batch)
69*d83cc019SAndroid Build Coastguard Worker {
70*d83cc019SAndroid Build Coastguard Worker 	uint32_t *curbe_buffer;
71*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker 	curbe_buffer = intel_batchbuffer_subdata_alloc(batch,
74*d83cc019SAndroid Build Coastguard Worker 						       sizeof(uint32_t) * 8,
75*d83cc019SAndroid Build Coastguard Worker 						       64);
76*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, curbe_buffer);
77*d83cc019SAndroid Build Coastguard Worker 	*curbe_buffer++ = 0;
78*d83cc019SAndroid Build Coastguard Worker 	*curbe_buffer   = 1;
79*d83cc019SAndroid Build Coastguard Worker 
80*d83cc019SAndroid Build Coastguard Worker 	return offset;
81*d83cc019SAndroid Build Coastguard Worker }
82*d83cc019SAndroid Build Coastguard Worker 
83*d83cc019SAndroid Build Coastguard Worker uint32_t
gen7_fill_surface_state(struct intel_batchbuffer * batch,const struct igt_buf * buf,uint32_t format,int is_dst)84*d83cc019SAndroid Build Coastguard Worker gen7_fill_surface_state(struct intel_batchbuffer *batch,
85*d83cc019SAndroid Build Coastguard Worker 			const struct igt_buf *buf,
86*d83cc019SAndroid Build Coastguard Worker 			uint32_t format,
87*d83cc019SAndroid Build Coastguard Worker 			int is_dst)
88*d83cc019SAndroid Build Coastguard Worker {
89*d83cc019SAndroid Build Coastguard Worker 	struct gen7_surface_state *ss;
90*d83cc019SAndroid Build Coastguard Worker 	uint32_t write_domain, read_domain, offset;
91*d83cc019SAndroid Build Coastguard Worker 	int ret;
92*d83cc019SAndroid Build Coastguard Worker 
93*d83cc019SAndroid Build Coastguard Worker 	if (is_dst) {
94*d83cc019SAndroid Build Coastguard Worker 		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
95*d83cc019SAndroid Build Coastguard Worker 	} else {
96*d83cc019SAndroid Build Coastguard Worker 		write_domain = 0;
97*d83cc019SAndroid Build Coastguard Worker 		read_domain = I915_GEM_DOMAIN_SAMPLER;
98*d83cc019SAndroid Build Coastguard Worker 	}
99*d83cc019SAndroid Build Coastguard Worker 
100*d83cc019SAndroid Build Coastguard Worker 	ss = intel_batchbuffer_subdata_alloc(batch, sizeof(*ss), 64);
101*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, ss);
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_type = SURFACE_2D;
104*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_format = format;
105*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.render_cache_read_write = 1;
106*d83cc019SAndroid Build Coastguard Worker 
107*d83cc019SAndroid Build Coastguard Worker 	if (buf->tiling == I915_TILING_X)
108*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 2;
109*d83cc019SAndroid Build Coastguard Worker 	else if (buf->tiling == I915_TILING_Y)
110*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 3;
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 	ss->ss1.base_addr = buf->bo->offset;
113*d83cc019SAndroid Build Coastguard Worker 	ret = drm_intel_bo_emit_reloc(batch->bo,
114*d83cc019SAndroid Build Coastguard Worker 				intel_batchbuffer_subdata_offset(batch, ss) + 4,
115*d83cc019SAndroid Build Coastguard Worker 				buf->bo, 0,
116*d83cc019SAndroid Build Coastguard Worker 				read_domain, write_domain);
117*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ret == 0);
118*d83cc019SAndroid Build Coastguard Worker 
119*d83cc019SAndroid Build Coastguard Worker 	ss->ss2.height = igt_buf_height(buf) - 1;
120*d83cc019SAndroid Build Coastguard Worker 	ss->ss2.width  = igt_buf_width(buf) - 1;
121*d83cc019SAndroid Build Coastguard Worker 
122*d83cc019SAndroid Build Coastguard Worker 	ss->ss3.pitch  = buf->stride - 1;
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_r = 4;
125*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_g = 5;
126*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_b = 6;
127*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_a = 7;
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker 	return offset;
130*d83cc019SAndroid Build Coastguard Worker }
131*d83cc019SAndroid Build Coastguard Worker 
132*d83cc019SAndroid Build Coastguard Worker uint32_t
gen7_fill_binding_table(struct intel_batchbuffer * batch,const struct igt_buf * dst)133*d83cc019SAndroid Build Coastguard Worker gen7_fill_binding_table(struct intel_batchbuffer *batch,
134*d83cc019SAndroid Build Coastguard Worker 			const struct igt_buf *dst)
135*d83cc019SAndroid Build Coastguard Worker {
136*d83cc019SAndroid Build Coastguard Worker 	uint32_t *binding_table, offset;
137*d83cc019SAndroid Build Coastguard Worker 
138*d83cc019SAndroid Build Coastguard Worker 	binding_table = intel_batchbuffer_subdata_alloc(batch, 32, 64);
139*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, binding_table);
140*d83cc019SAndroid Build Coastguard Worker 	if (IS_GEN7(batch->devid))
141*d83cc019SAndroid Build Coastguard Worker 		binding_table[0] = gen7_fill_surface_state(batch, dst,
142*d83cc019SAndroid Build Coastguard Worker 						SURFACEFORMAT_R8_UNORM, 1);
143*d83cc019SAndroid Build Coastguard Worker 	else
144*d83cc019SAndroid Build Coastguard Worker 		binding_table[0] = gen8_fill_surface_state(batch, dst,
145*d83cc019SAndroid Build Coastguard Worker 						SURFACEFORMAT_R8_UNORM, 1);
146*d83cc019SAndroid Build Coastguard Worker 
147*d83cc019SAndroid Build Coastguard Worker 	return offset;
148*d83cc019SAndroid Build Coastguard Worker }
149*d83cc019SAndroid Build Coastguard Worker 
150*d83cc019SAndroid Build Coastguard Worker uint32_t
gen11_fill_binding_table(struct intel_batchbuffer * batch,const struct igt_buf * src,const struct igt_buf * dst)151*d83cc019SAndroid Build Coastguard Worker gen11_fill_binding_table(struct intel_batchbuffer *batch,
152*d83cc019SAndroid Build Coastguard Worker 			const struct igt_buf *src,const struct igt_buf *dst)
153*d83cc019SAndroid Build Coastguard Worker {
154*d83cc019SAndroid Build Coastguard Worker 	uint32_t *binding_table, offset;
155*d83cc019SAndroid Build Coastguard Worker 
156*d83cc019SAndroid Build Coastguard Worker 	binding_table = intel_batchbuffer_subdata_alloc(batch, 64, 64);
157*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, binding_table);
158*d83cc019SAndroid Build Coastguard Worker 	binding_table[0] = gen11_fill_surface_state(batch, src,
159*d83cc019SAndroid Build Coastguard Worker 						SURFACE_1D,SURFACEFORMAT_R32G32B32A32_FLOAT,
160*d83cc019SAndroid Build Coastguard Worker 						0,0,
161*d83cc019SAndroid Build Coastguard Worker 						0);
162*d83cc019SAndroid Build Coastguard Worker 	binding_table[1] = gen11_fill_surface_state(batch, dst,
163*d83cc019SAndroid Build Coastguard Worker 						SURFACE_BUFFER, SURFACEFORMAT_RAW,
164*d83cc019SAndroid Build Coastguard Worker 						1,1,
165*d83cc019SAndroid Build Coastguard Worker 						1);
166*d83cc019SAndroid Build Coastguard Worker 
167*d83cc019SAndroid Build Coastguard Worker 	return offset;
168*d83cc019SAndroid Build Coastguard Worker }
169*d83cc019SAndroid Build Coastguard Worker 
170*d83cc019SAndroid Build Coastguard Worker uint32_t
gen7_fill_kernel(struct intel_batchbuffer * batch,const uint32_t kernel[][4],size_t size)171*d83cc019SAndroid Build Coastguard Worker gen7_fill_kernel(struct intel_batchbuffer *batch,
172*d83cc019SAndroid Build Coastguard Worker 		const uint32_t kernel[][4],
173*d83cc019SAndroid Build Coastguard Worker 		size_t size)
174*d83cc019SAndroid Build Coastguard Worker {
175*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
176*d83cc019SAndroid Build Coastguard Worker 
177*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_copy_data(batch, kernel, size, 64);
178*d83cc019SAndroid Build Coastguard Worker 
179*d83cc019SAndroid Build Coastguard Worker 	return offset;
180*d83cc019SAndroid Build Coastguard Worker }
181*d83cc019SAndroid Build Coastguard Worker 
182*d83cc019SAndroid Build Coastguard Worker uint32_t
gen7_fill_interface_descriptor(struct intel_batchbuffer * batch,const struct igt_buf * dst,const uint32_t kernel[][4],size_t size)183*d83cc019SAndroid Build Coastguard Worker gen7_fill_interface_descriptor(struct intel_batchbuffer *batch,
184*d83cc019SAndroid Build Coastguard Worker 			       const struct igt_buf *dst,
185*d83cc019SAndroid Build Coastguard Worker 			       const uint32_t kernel[][4],
186*d83cc019SAndroid Build Coastguard Worker 			       size_t size)
187*d83cc019SAndroid Build Coastguard Worker {
188*d83cc019SAndroid Build Coastguard Worker 	struct gen7_interface_descriptor_data *idd;
189*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
190*d83cc019SAndroid Build Coastguard Worker 	uint32_t binding_table_offset, kernel_offset;
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker 	binding_table_offset = gen7_fill_binding_table(batch, dst);
193*d83cc019SAndroid Build Coastguard Worker 	kernel_offset = gen7_fill_kernel(batch, kernel, size);
194*d83cc019SAndroid Build Coastguard Worker 
195*d83cc019SAndroid Build Coastguard Worker 	idd = intel_batchbuffer_subdata_alloc(batch, sizeof(*idd), 64);
196*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, idd);
197*d83cc019SAndroid Build Coastguard Worker 
198*d83cc019SAndroid Build Coastguard Worker 	idd->desc0.kernel_start_pointer = (kernel_offset >> 6);
199*d83cc019SAndroid Build Coastguard Worker 
200*d83cc019SAndroid Build Coastguard Worker 	idd->desc1.single_program_flow = 1;
201*d83cc019SAndroid Build Coastguard Worker 	idd->desc1.floating_point_mode = GEN7_FLOATING_POINT_IEEE_754;
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.sampler_count = 0;      /* 0 samplers used */
204*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.sampler_state_pointer = 0;
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.binding_table_entry_count = 0;
207*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.binding_table_pointer = (binding_table_offset >> 5);
208*d83cc019SAndroid Build Coastguard Worker 
209*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.constant_urb_entry_read_offset = 0;
210*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.constant_urb_entry_read_length = 1; /* grf 1 */
211*d83cc019SAndroid Build Coastguard Worker 
212*d83cc019SAndroid Build Coastguard Worker 	return offset;
213*d83cc019SAndroid Build Coastguard Worker }
214*d83cc019SAndroid Build Coastguard Worker 
215*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_state_base_address(struct intel_batchbuffer * batch)216*d83cc019SAndroid Build Coastguard Worker gen7_emit_state_base_address(struct intel_batchbuffer *batch)
217*d83cc019SAndroid Build Coastguard Worker {
218*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_STATE_BASE_ADDRESS | (10 - 2));
219*d83cc019SAndroid Build Coastguard Worker 
220*d83cc019SAndroid Build Coastguard Worker 	/* general */
221*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
222*d83cc019SAndroid Build Coastguard Worker 
223*d83cc019SAndroid Build Coastguard Worker 	/* surface */
224*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
225*d83cc019SAndroid Build Coastguard Worker 		  BASE_ADDRESS_MODIFY);
226*d83cc019SAndroid Build Coastguard Worker 
227*d83cc019SAndroid Build Coastguard Worker 	/* dynamic */
228*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
229*d83cc019SAndroid Build Coastguard Worker 		  BASE_ADDRESS_MODIFY);
230*d83cc019SAndroid Build Coastguard Worker 
231*d83cc019SAndroid Build Coastguard Worker 	/* indirect */
232*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
233*d83cc019SAndroid Build Coastguard Worker 
234*d83cc019SAndroid Build Coastguard Worker 	/* instruction */
235*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
236*d83cc019SAndroid Build Coastguard Worker 		  BASE_ADDRESS_MODIFY);
237*d83cc019SAndroid Build Coastguard Worker 
238*d83cc019SAndroid Build Coastguard Worker 	/* general/dynamic/indirect/instruction access Bound */
239*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
240*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
241*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
242*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
243*d83cc019SAndroid Build Coastguard Worker }
244*d83cc019SAndroid Build Coastguard Worker 
245*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_vfe_state(struct intel_batchbuffer * batch,uint32_t threads,uint32_t urb_entries,uint32_t urb_size,uint32_t curbe_size,uint32_t mode)246*d83cc019SAndroid Build Coastguard Worker gen7_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
247*d83cc019SAndroid Build Coastguard Worker 		    uint32_t urb_entries, uint32_t urb_size,
248*d83cc019SAndroid Build Coastguard Worker 		    uint32_t curbe_size, uint32_t mode)
249*d83cc019SAndroid Build Coastguard Worker {
250*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (8 - 2));
251*d83cc019SAndroid Build Coastguard Worker 
252*d83cc019SAndroid Build Coastguard Worker 	/* scratch buffer */
253*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
254*d83cc019SAndroid Build Coastguard Worker 
255*d83cc019SAndroid Build Coastguard Worker 	/* number of threads & urb entries */
256*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(threads << 16 |
257*d83cc019SAndroid Build Coastguard Worker 		urb_entries << 8 |
258*d83cc019SAndroid Build Coastguard Worker 		mode << 2); /* GPGPU vs media mode */
259*d83cc019SAndroid Build Coastguard Worker 
260*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
261*d83cc019SAndroid Build Coastguard Worker 
262*d83cc019SAndroid Build Coastguard Worker 	/* urb entry size & curbe size */
263*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(urb_size << 16 |	/* in 256 bits unit */
264*d83cc019SAndroid Build Coastguard Worker 		  curbe_size);		/* in 256 bits unit */
265*d83cc019SAndroid Build Coastguard Worker 
266*d83cc019SAndroid Build Coastguard Worker 	/* scoreboard */
267*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
268*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
269*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
270*d83cc019SAndroid Build Coastguard Worker }
271*d83cc019SAndroid Build Coastguard Worker 
272*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_curbe_load(struct intel_batchbuffer * batch,uint32_t curbe_buffer)273*d83cc019SAndroid Build Coastguard Worker gen7_emit_curbe_load(struct intel_batchbuffer *batch, uint32_t curbe_buffer)
274*d83cc019SAndroid Build Coastguard Worker {
275*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_MEDIA_CURBE_LOAD | (4 - 2));
276*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
277*d83cc019SAndroid Build Coastguard Worker 	/* curbe total data length */
278*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(64);
279*d83cc019SAndroid Build Coastguard Worker 	/* curbe data start address, is relative to the dynamics base address */
280*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(curbe_buffer);
281*d83cc019SAndroid Build Coastguard Worker }
282*d83cc019SAndroid Build Coastguard Worker 
283*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_interface_descriptor_load(struct intel_batchbuffer * batch,uint32_t interface_descriptor)284*d83cc019SAndroid Build Coastguard Worker gen7_emit_interface_descriptor_load(struct intel_batchbuffer *batch,
285*d83cc019SAndroid Build Coastguard Worker 				    uint32_t interface_descriptor)
286*d83cc019SAndroid Build Coastguard Worker {
287*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_MEDIA_INTERFACE_DESCRIPTOR_LOAD | (4 - 2));
288*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
289*d83cc019SAndroid Build Coastguard Worker 	/* interface descriptor data length */
290*d83cc019SAndroid Build Coastguard Worker 	if (IS_GEN7(batch->devid))
291*d83cc019SAndroid Build Coastguard Worker 		OUT_BATCH(sizeof(struct gen7_interface_descriptor_data));
292*d83cc019SAndroid Build Coastguard Worker 	else
293*d83cc019SAndroid Build Coastguard Worker 		OUT_BATCH(sizeof(struct gen8_interface_descriptor_data));
294*d83cc019SAndroid Build Coastguard Worker 	/* interface descriptor address, is relative to the dynamics base
295*d83cc019SAndroid Build Coastguard Worker 	 * address
296*d83cc019SAndroid Build Coastguard Worker 	 */
297*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(interface_descriptor);
298*d83cc019SAndroid Build Coastguard Worker }
299*d83cc019SAndroid Build Coastguard Worker 
300*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_media_objects(struct intel_batchbuffer * batch,unsigned int x,unsigned int y,unsigned int width,unsigned int height)301*d83cc019SAndroid Build Coastguard Worker gen7_emit_media_objects(struct intel_batchbuffer *batch,
302*d83cc019SAndroid Build Coastguard Worker 			unsigned int x, unsigned int y,
303*d83cc019SAndroid Build Coastguard Worker 			unsigned int width, unsigned int height)
304*d83cc019SAndroid Build Coastguard Worker {
305*d83cc019SAndroid Build Coastguard Worker 	int i, j;
306*d83cc019SAndroid Build Coastguard Worker 
307*d83cc019SAndroid Build Coastguard Worker 	for (i = 0; i < width / 16; i++) {
308*d83cc019SAndroid Build Coastguard Worker 		for (j = 0; j < height / 16; j++) {
309*d83cc019SAndroid Build Coastguard Worker 			gen_emit_media_object(batch, x + i * 16, y + j * 16);
310*d83cc019SAndroid Build Coastguard Worker 		}
311*d83cc019SAndroid Build Coastguard Worker 	}
312*d83cc019SAndroid Build Coastguard Worker }
313*d83cc019SAndroid Build Coastguard Worker 
314*d83cc019SAndroid Build Coastguard Worker void
gen7_emit_gpgpu_walk(struct intel_batchbuffer * batch,unsigned int x,unsigned int y,unsigned int width,unsigned int height)315*d83cc019SAndroid Build Coastguard Worker gen7_emit_gpgpu_walk(struct intel_batchbuffer *batch,
316*d83cc019SAndroid Build Coastguard Worker 		     unsigned int x, unsigned int y,
317*d83cc019SAndroid Build Coastguard Worker 		     unsigned int width, unsigned int height)
318*d83cc019SAndroid Build Coastguard Worker {
319*d83cc019SAndroid Build Coastguard Worker 	uint32_t x_dim, y_dim, tmp, right_mask;
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 	/*
322*d83cc019SAndroid Build Coastguard Worker 	 * Simply do SIMD16 based dispatch, so every thread uses
323*d83cc019SAndroid Build Coastguard Worker 	 * SIMD16 channels.
324*d83cc019SAndroid Build Coastguard Worker 	 *
325*d83cc019SAndroid Build Coastguard Worker 	 * Define our own thread group size, e.g 16x1 for every group, then
326*d83cc019SAndroid Build Coastguard Worker 	 * will have 1 thread each group in SIMD16 dispatch. So thread
327*d83cc019SAndroid Build Coastguard Worker 	 * width/height/depth are all 1.
328*d83cc019SAndroid Build Coastguard Worker 	 *
329*d83cc019SAndroid Build Coastguard Worker 	 * Then thread group X = width / 16 (aligned to 16)
330*d83cc019SAndroid Build Coastguard Worker 	 * thread group Y = height;
331*d83cc019SAndroid Build Coastguard Worker 	 */
332*d83cc019SAndroid Build Coastguard Worker 	x_dim = (width + 15) / 16;
333*d83cc019SAndroid Build Coastguard Worker 	y_dim = height;
334*d83cc019SAndroid Build Coastguard Worker 
335*d83cc019SAndroid Build Coastguard Worker 	tmp = width & 15;
336*d83cc019SAndroid Build Coastguard Worker 	if (tmp == 0)
337*d83cc019SAndroid Build Coastguard Worker 		right_mask = (1 << 16) - 1;
338*d83cc019SAndroid Build Coastguard Worker 	else
339*d83cc019SAndroid Build Coastguard Worker 		right_mask = (1 << tmp) - 1;
340*d83cc019SAndroid Build Coastguard Worker 
341*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_GPGPU_WALKER | 9);
342*d83cc019SAndroid Build Coastguard Worker 
343*d83cc019SAndroid Build Coastguard Worker 	/* interface descriptor offset */
344*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
345*d83cc019SAndroid Build Coastguard Worker 
346*d83cc019SAndroid Build Coastguard Worker 	/* SIMD size, thread w/h/d */
347*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 30 | /* SIMD16 */
348*d83cc019SAndroid Build Coastguard Worker 		  0 << 16 | /* depth:1 */
349*d83cc019SAndroid Build Coastguard Worker 		  0 << 8 | /* height:1 */
350*d83cc019SAndroid Build Coastguard Worker 		  0); /* width:1 */
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker 	/* thread group X */
353*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
354*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(x_dim);
355*d83cc019SAndroid Build Coastguard Worker 
356*d83cc019SAndroid Build Coastguard Worker 	/* thread group Y */
357*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
358*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(y_dim);
359*d83cc019SAndroid Build Coastguard Worker 
360*d83cc019SAndroid Build Coastguard Worker 	/* thread group Z */
361*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
362*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1);
363*d83cc019SAndroid Build Coastguard Worker 
364*d83cc019SAndroid Build Coastguard Worker 	/* right mask */
365*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(right_mask);
366*d83cc019SAndroid Build Coastguard Worker 
367*d83cc019SAndroid Build Coastguard Worker 	/* bottom mask, height 1, always 0xffffffff */
368*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xffffffff);
369*d83cc019SAndroid Build Coastguard Worker }
370*d83cc019SAndroid Build Coastguard Worker 
371*d83cc019SAndroid Build Coastguard Worker uint32_t
gen8_spin_curbe_buffer_data(struct intel_batchbuffer * batch,uint32_t iters)372*d83cc019SAndroid Build Coastguard Worker gen8_spin_curbe_buffer_data(struct intel_batchbuffer *batch,
373*d83cc019SAndroid Build Coastguard Worker 			    uint32_t iters)
374*d83cc019SAndroid Build Coastguard Worker {
375*d83cc019SAndroid Build Coastguard Worker 	uint32_t *curbe_buffer;
376*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
377*d83cc019SAndroid Build Coastguard Worker 
378*d83cc019SAndroid Build Coastguard Worker 	curbe_buffer = intel_batchbuffer_subdata_alloc(batch, 64, 64);
379*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, curbe_buffer);
380*d83cc019SAndroid Build Coastguard Worker 	*curbe_buffer = iters;
381*d83cc019SAndroid Build Coastguard Worker 
382*d83cc019SAndroid Build Coastguard Worker 	return offset;
383*d83cc019SAndroid Build Coastguard Worker }
384*d83cc019SAndroid Build Coastguard Worker 
385*d83cc019SAndroid Build Coastguard Worker uint32_t
gen8_fill_surface_state(struct intel_batchbuffer * batch,const struct igt_buf * buf,uint32_t format,int is_dst)386*d83cc019SAndroid Build Coastguard Worker gen8_fill_surface_state(struct intel_batchbuffer *batch,
387*d83cc019SAndroid Build Coastguard Worker 			const struct igt_buf *buf,
388*d83cc019SAndroid Build Coastguard Worker 			uint32_t format,
389*d83cc019SAndroid Build Coastguard Worker 			int is_dst)
390*d83cc019SAndroid Build Coastguard Worker {
391*d83cc019SAndroid Build Coastguard Worker 	struct gen8_surface_state *ss;
392*d83cc019SAndroid Build Coastguard Worker 	uint32_t write_domain, read_domain, offset;
393*d83cc019SAndroid Build Coastguard Worker 	int ret;
394*d83cc019SAndroid Build Coastguard Worker 
395*d83cc019SAndroid Build Coastguard Worker 	if (is_dst) {
396*d83cc019SAndroid Build Coastguard Worker 		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
397*d83cc019SAndroid Build Coastguard Worker 	} else {
398*d83cc019SAndroid Build Coastguard Worker 		write_domain = 0;
399*d83cc019SAndroid Build Coastguard Worker 		read_domain = I915_GEM_DOMAIN_SAMPLER;
400*d83cc019SAndroid Build Coastguard Worker 	}
401*d83cc019SAndroid Build Coastguard Worker 
402*d83cc019SAndroid Build Coastguard Worker 	ss = intel_batchbuffer_subdata_alloc(batch, sizeof(*ss), 64);
403*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, ss);
404*d83cc019SAndroid Build Coastguard Worker 
405*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_type = SURFACE_2D;
406*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_format = format;
407*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.render_cache_read_write = 1;
408*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.vertical_alignment = 1; /* align 4 */
409*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.horizontal_alignment = 1; /* align 4 */
410*d83cc019SAndroid Build Coastguard Worker 
411*d83cc019SAndroid Build Coastguard Worker 	if (buf->tiling == I915_TILING_X)
412*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 2;
413*d83cc019SAndroid Build Coastguard Worker 	else if (buf->tiling == I915_TILING_Y)
414*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 3;
415*d83cc019SAndroid Build Coastguard Worker 
416*d83cc019SAndroid Build Coastguard Worker 	ss->ss8.base_addr = buf->bo->offset;
417*d83cc019SAndroid Build Coastguard Worker 
418*d83cc019SAndroid Build Coastguard Worker 	ret = drm_intel_bo_emit_reloc(batch->bo,
419*d83cc019SAndroid Build Coastguard Worker 				intel_batchbuffer_subdata_offset(batch, ss) + 8 * 4,
420*d83cc019SAndroid Build Coastguard Worker 				buf->bo, 0, read_domain, write_domain);
421*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ret == 0);
422*d83cc019SAndroid Build Coastguard Worker 
423*d83cc019SAndroid Build Coastguard Worker 	ss->ss2.height = igt_buf_height(buf) - 1;
424*d83cc019SAndroid Build Coastguard Worker 	ss->ss2.width  = igt_buf_width(buf) - 1;
425*d83cc019SAndroid Build Coastguard Worker 	ss->ss3.pitch  = buf->stride - 1;
426*d83cc019SAndroid Build Coastguard Worker 
427*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_r = 4;
428*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_g = 5;
429*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_b = 6;
430*d83cc019SAndroid Build Coastguard Worker 	ss->ss7.shader_chanel_select_a = 7;
431*d83cc019SAndroid Build Coastguard Worker 
432*d83cc019SAndroid Build Coastguard Worker 	return offset;
433*d83cc019SAndroid Build Coastguard Worker }
434*d83cc019SAndroid Build Coastguard Worker 
435*d83cc019SAndroid Build Coastguard Worker uint32_t
gen11_fill_surface_state(struct intel_batchbuffer * batch,const struct igt_buf * buf,uint32_t surface_type,uint32_t format,uint32_t vertical_alignment,uint32_t horizontal_alignment,int is_dst)436*d83cc019SAndroid Build Coastguard Worker gen11_fill_surface_state(struct intel_batchbuffer *batch,
437*d83cc019SAndroid Build Coastguard Worker 			const struct igt_buf *buf,
438*d83cc019SAndroid Build Coastguard Worker 			uint32_t surface_type,
439*d83cc019SAndroid Build Coastguard Worker 			uint32_t format,
440*d83cc019SAndroid Build Coastguard Worker 			uint32_t vertical_alignment,
441*d83cc019SAndroid Build Coastguard Worker 			uint32_t horizontal_alignment,
442*d83cc019SAndroid Build Coastguard Worker 			int is_dst)
443*d83cc019SAndroid Build Coastguard Worker {
444*d83cc019SAndroid Build Coastguard Worker 	struct gen8_surface_state *ss;
445*d83cc019SAndroid Build Coastguard Worker 	uint32_t write_domain, read_domain, offset;
446*d83cc019SAndroid Build Coastguard Worker 	int ret;
447*d83cc019SAndroid Build Coastguard Worker 
448*d83cc019SAndroid Build Coastguard Worker 	if (is_dst) {
449*d83cc019SAndroid Build Coastguard Worker 		write_domain = read_domain = I915_GEM_DOMAIN_RENDER;
450*d83cc019SAndroid Build Coastguard Worker 	} else {
451*d83cc019SAndroid Build Coastguard Worker 		write_domain = 0;
452*d83cc019SAndroid Build Coastguard Worker 		read_domain = I915_GEM_DOMAIN_SAMPLER;
453*d83cc019SAndroid Build Coastguard Worker 	}
454*d83cc019SAndroid Build Coastguard Worker 
455*d83cc019SAndroid Build Coastguard Worker 	ss = intel_batchbuffer_subdata_alloc(batch, sizeof(*ss), 64);
456*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, ss);
457*d83cc019SAndroid Build Coastguard Worker 
458*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_type = surface_type;
459*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.surface_format = format;
460*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.render_cache_read_write = 1;
461*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.vertical_alignment = vertical_alignment; /* align 4 */
462*d83cc019SAndroid Build Coastguard Worker 	ss->ss0.horizontal_alignment = horizontal_alignment; /* align 4 */
463*d83cc019SAndroid Build Coastguard Worker 
464*d83cc019SAndroid Build Coastguard Worker 	if (buf->tiling == I915_TILING_X)
465*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 2;
466*d83cc019SAndroid Build Coastguard Worker 	else if (buf->tiling == I915_TILING_Y)
467*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 3;
468*d83cc019SAndroid Build Coastguard Worker 	else
469*d83cc019SAndroid Build Coastguard Worker 		ss->ss0.tiled_mode = 0;
470*d83cc019SAndroid Build Coastguard Worker 
471*d83cc019SAndroid Build Coastguard Worker 	ss->ss8.base_addr = buf->bo->offset;
472*d83cc019SAndroid Build Coastguard Worker 
473*d83cc019SAndroid Build Coastguard Worker 	ret = drm_intel_bo_emit_reloc(batch->bo,
474*d83cc019SAndroid Build Coastguard Worker 				intel_batchbuffer_subdata_offset(batch, ss) + 8 * 4,
475*d83cc019SAndroid Build Coastguard Worker 				buf->bo, 0, read_domain, write_domain);
476*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ret == 0);
477*d83cc019SAndroid Build Coastguard Worker 
478*d83cc019SAndroid Build Coastguard Worker 	if (is_dst) {
479*d83cc019SAndroid Build Coastguard Worker 		ss->ss1.memory_object_control = 2;
480*d83cc019SAndroid Build Coastguard Worker 		ss->ss2.height = 1;
481*d83cc019SAndroid Build Coastguard Worker 		ss->ss2.width  = 95;
482*d83cc019SAndroid Build Coastguard Worker 		ss->ss3.pitch  = 0;
483*d83cc019SAndroid Build Coastguard Worker 		ss->ss7.shader_chanel_select_r = 4;
484*d83cc019SAndroid Build Coastguard Worker 		ss->ss7.shader_chanel_select_g = 5;
485*d83cc019SAndroid Build Coastguard Worker 		ss->ss7.shader_chanel_select_b = 6;
486*d83cc019SAndroid Build Coastguard Worker 		ss->ss7.shader_chanel_select_a = 7;
487*d83cc019SAndroid Build Coastguard Worker 	}
488*d83cc019SAndroid Build Coastguard Worker 	else {
489*d83cc019SAndroid Build Coastguard Worker 		ss->ss1.qpitch = 4040;
490*d83cc019SAndroid Build Coastguard Worker 		ss->ss1.base_mip_level = 31;
491*d83cc019SAndroid Build Coastguard Worker 		ss->ss2.height = 9216;
492*d83cc019SAndroid Build Coastguard Worker 		ss->ss2.width  = 1019;
493*d83cc019SAndroid Build Coastguard Worker 		ss->ss3.pitch  = 64;
494*d83cc019SAndroid Build Coastguard Worker 		ss->ss5.mip_count = 2;
495*d83cc019SAndroid Build Coastguard Worker 	}
496*d83cc019SAndroid Build Coastguard Worker 
497*d83cc019SAndroid Build Coastguard Worker 	return offset;
498*d83cc019SAndroid Build Coastguard Worker }
499*d83cc019SAndroid Build Coastguard Worker 
500*d83cc019SAndroid Build Coastguard Worker uint32_t
gen8_fill_interface_descriptor(struct intel_batchbuffer * batch,const struct igt_buf * dst,const uint32_t kernel[][4],size_t size)501*d83cc019SAndroid Build Coastguard Worker gen8_fill_interface_descriptor(struct intel_batchbuffer *batch,
502*d83cc019SAndroid Build Coastguard Worker 			       const struct igt_buf *dst,
503*d83cc019SAndroid Build Coastguard Worker 			       const uint32_t kernel[][4],
504*d83cc019SAndroid Build Coastguard Worker 			       size_t size)
505*d83cc019SAndroid Build Coastguard Worker {
506*d83cc019SAndroid Build Coastguard Worker 	struct gen8_interface_descriptor_data *idd;
507*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
508*d83cc019SAndroid Build Coastguard Worker 	uint32_t binding_table_offset, kernel_offset;
509*d83cc019SAndroid Build Coastguard Worker 
510*d83cc019SAndroid Build Coastguard Worker 	binding_table_offset = gen7_fill_binding_table(batch, dst);
511*d83cc019SAndroid Build Coastguard Worker 	kernel_offset = gen7_fill_kernel(batch, kernel, size);
512*d83cc019SAndroid Build Coastguard Worker 
513*d83cc019SAndroid Build Coastguard Worker 	idd = intel_batchbuffer_subdata_alloc(batch, sizeof(*idd), 64);
514*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, idd);
515*d83cc019SAndroid Build Coastguard Worker 
516*d83cc019SAndroid Build Coastguard Worker 	idd->desc0.kernel_start_pointer = (kernel_offset >> 6);
517*d83cc019SAndroid Build Coastguard Worker 
518*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.single_program_flow = 1;
519*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.floating_point_mode = GEN8_FLOATING_POINT_IEEE_754;
520*d83cc019SAndroid Build Coastguard Worker 
521*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.sampler_count = 0;      /* 0 samplers used */
522*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.sampler_state_pointer = 0;
523*d83cc019SAndroid Build Coastguard Worker 
524*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.binding_table_entry_count = 0;
525*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.binding_table_pointer = (binding_table_offset >> 5);
526*d83cc019SAndroid Build Coastguard Worker 
527*d83cc019SAndroid Build Coastguard Worker 	idd->desc5.constant_urb_entry_read_offset = 0;
528*d83cc019SAndroid Build Coastguard Worker 	idd->desc5.constant_urb_entry_read_length = 1; /* grf 1 */
529*d83cc019SAndroid Build Coastguard Worker 
530*d83cc019SAndroid Build Coastguard Worker 	idd->desc6.num_threads_in_tg = 1;
531*d83cc019SAndroid Build Coastguard Worker 
532*d83cc019SAndroid Build Coastguard Worker 	return offset;
533*d83cc019SAndroid Build Coastguard Worker }
534*d83cc019SAndroid Build Coastguard Worker 
535*d83cc019SAndroid Build Coastguard Worker uint32_t
gen11_fill_interface_descriptor(struct intel_batchbuffer * batch,const struct igt_buf * src,const struct igt_buf * dst,const uint32_t kernel[][4],size_t size)536*d83cc019SAndroid Build Coastguard Worker gen11_fill_interface_descriptor(struct intel_batchbuffer *batch,
537*d83cc019SAndroid Build Coastguard Worker 			       const struct igt_buf *src,const struct igt_buf *dst,
538*d83cc019SAndroid Build Coastguard Worker 			       const uint32_t kernel[][4],
539*d83cc019SAndroid Build Coastguard Worker 			       size_t size)
540*d83cc019SAndroid Build Coastguard Worker {
541*d83cc019SAndroid Build Coastguard Worker 	struct gen8_interface_descriptor_data *idd;
542*d83cc019SAndroid Build Coastguard Worker 	uint32_t offset;
543*d83cc019SAndroid Build Coastguard Worker 	uint32_t binding_table_offset, kernel_offset;
544*d83cc019SAndroid Build Coastguard Worker 
545*d83cc019SAndroid Build Coastguard Worker 	binding_table_offset = gen11_fill_binding_table(batch, src,dst);
546*d83cc019SAndroid Build Coastguard Worker 	kernel_offset = gen7_fill_kernel(batch, kernel, size);
547*d83cc019SAndroid Build Coastguard Worker 
548*d83cc019SAndroid Build Coastguard Worker 	idd = intel_batchbuffer_subdata_alloc(batch, sizeof(*idd), 64);
549*d83cc019SAndroid Build Coastguard Worker 	offset = intel_batchbuffer_subdata_offset(batch, idd);
550*d83cc019SAndroid Build Coastguard Worker 
551*d83cc019SAndroid Build Coastguard Worker 	idd->desc0.kernel_start_pointer = (kernel_offset >> 6);
552*d83cc019SAndroid Build Coastguard Worker 
553*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.single_program_flow = 1;
554*d83cc019SAndroid Build Coastguard Worker 	idd->desc2.floating_point_mode = GEN8_FLOATING_POINT_IEEE_754;
555*d83cc019SAndroid Build Coastguard Worker 
556*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.sampler_count = 0;      /* 0 samplers used */
557*d83cc019SAndroid Build Coastguard Worker 	idd->desc3.sampler_state_pointer = 0;
558*d83cc019SAndroid Build Coastguard Worker 
559*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.binding_table_entry_count = 0;
560*d83cc019SAndroid Build Coastguard Worker 	idd->desc4.binding_table_pointer = (binding_table_offset >> 5);
561*d83cc019SAndroid Build Coastguard Worker 
562*d83cc019SAndroid Build Coastguard Worker 	idd->desc5.constant_urb_entry_read_offset = 0;
563*d83cc019SAndroid Build Coastguard Worker 	idd->desc5.constant_urb_entry_read_length = 1; /* grf 1 */
564*d83cc019SAndroid Build Coastguard Worker 
565*d83cc019SAndroid Build Coastguard Worker 	idd->desc6.num_threads_in_tg = 1;
566*d83cc019SAndroid Build Coastguard Worker 
567*d83cc019SAndroid Build Coastguard Worker 	return offset;
568*d83cc019SAndroid Build Coastguard Worker }
569*d83cc019SAndroid Build Coastguard Worker 
570*d83cc019SAndroid Build Coastguard Worker void
gen8_emit_state_base_address(struct intel_batchbuffer * batch)571*d83cc019SAndroid Build Coastguard Worker gen8_emit_state_base_address(struct intel_batchbuffer *batch)
572*d83cc019SAndroid Build Coastguard Worker {
573*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN8_STATE_BASE_ADDRESS | (16 - 2));
574*d83cc019SAndroid Build Coastguard Worker 
575*d83cc019SAndroid Build Coastguard Worker 	/* general */
576*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
577*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
578*d83cc019SAndroid Build Coastguard Worker 
579*d83cc019SAndroid Build Coastguard Worker 	/* stateless data port */
580*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
581*d83cc019SAndroid Build Coastguard Worker 
582*d83cc019SAndroid Build Coastguard Worker 	/* surface */
583*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_SAMPLER, 0, BASE_ADDRESS_MODIFY);
584*d83cc019SAndroid Build Coastguard Worker 
585*d83cc019SAndroid Build Coastguard Worker 	/* dynamic */
586*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo,
587*d83cc019SAndroid Build Coastguard Worker 		  I915_GEM_DOMAIN_RENDER | I915_GEM_DOMAIN_INSTRUCTION,
588*d83cc019SAndroid Build Coastguard Worker 		  0, BASE_ADDRESS_MODIFY);
589*d83cc019SAndroid Build Coastguard Worker 
590*d83cc019SAndroid Build Coastguard Worker 	/* indirect */
591*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
592*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
593*d83cc019SAndroid Build Coastguard Worker 
594*d83cc019SAndroid Build Coastguard Worker 	/* instruction */
595*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
596*d83cc019SAndroid Build Coastguard Worker 		  BASE_ADDRESS_MODIFY);
597*d83cc019SAndroid Build Coastguard Worker 
598*d83cc019SAndroid Build Coastguard Worker 	/* general state buffer size */
599*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xfffff000 | 1);
600*d83cc019SAndroid Build Coastguard Worker 	/* dynamic state buffer size */
601*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 12 | 1);
602*d83cc019SAndroid Build Coastguard Worker 	/* indirect object buffer size */
603*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xfffff000 | 1);
604*d83cc019SAndroid Build Coastguard Worker 	/* instruction buffer size, must set modify enable bit, otherwise it may
605*d83cc019SAndroid Build Coastguard Worker 	 * result in GPU hang
606*d83cc019SAndroid Build Coastguard Worker 	 */
607*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 12 | 1);
608*d83cc019SAndroid Build Coastguard Worker }
609*d83cc019SAndroid Build Coastguard Worker 
610*d83cc019SAndroid Build Coastguard Worker void
gen8_emit_media_state_flush(struct intel_batchbuffer * batch)611*d83cc019SAndroid Build Coastguard Worker gen8_emit_media_state_flush(struct intel_batchbuffer *batch)
612*d83cc019SAndroid Build Coastguard Worker {
613*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN8_MEDIA_STATE_FLUSH | (2 - 2));
614*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
615*d83cc019SAndroid Build Coastguard Worker }
616*d83cc019SAndroid Build Coastguard Worker 
617*d83cc019SAndroid Build Coastguard Worker void
gen8_emit_vfe_state(struct intel_batchbuffer * batch,uint32_t threads,uint32_t urb_entries,uint32_t urb_size,uint32_t curbe_size)618*d83cc019SAndroid Build Coastguard Worker gen8_emit_vfe_state(struct intel_batchbuffer *batch, uint32_t threads,
619*d83cc019SAndroid Build Coastguard Worker 		    uint32_t urb_entries, uint32_t urb_size,
620*d83cc019SAndroid Build Coastguard Worker 		    uint32_t curbe_size)
621*d83cc019SAndroid Build Coastguard Worker {
622*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_MEDIA_VFE_STATE | (9 - 2));
623*d83cc019SAndroid Build Coastguard Worker 
624*d83cc019SAndroid Build Coastguard Worker 	/* scratch buffer */
625*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
626*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
627*d83cc019SAndroid Build Coastguard Worker 
628*d83cc019SAndroid Build Coastguard Worker 	/* number of threads & urb entries */
629*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(threads << 16 |
630*d83cc019SAndroid Build Coastguard Worker 		urb_entries << 8);
631*d83cc019SAndroid Build Coastguard Worker 
632*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
633*d83cc019SAndroid Build Coastguard Worker 
634*d83cc019SAndroid Build Coastguard Worker 	/* urb entry size & curbe size */
635*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(urb_size << 16 |
636*d83cc019SAndroid Build Coastguard Worker 		curbe_size);
637*d83cc019SAndroid Build Coastguard Worker 
638*d83cc019SAndroid Build Coastguard Worker 	/* scoreboard */
639*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
640*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
641*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
642*d83cc019SAndroid Build Coastguard Worker }
643*d83cc019SAndroid Build Coastguard Worker 
644*d83cc019SAndroid Build Coastguard Worker void
gen8_emit_gpgpu_walk(struct intel_batchbuffer * batch,unsigned int x,unsigned int y,unsigned int width,unsigned int height)645*d83cc019SAndroid Build Coastguard Worker gen8_emit_gpgpu_walk(struct intel_batchbuffer *batch,
646*d83cc019SAndroid Build Coastguard Worker 		     unsigned int x, unsigned int y,
647*d83cc019SAndroid Build Coastguard Worker 		     unsigned int width, unsigned int height)
648*d83cc019SAndroid Build Coastguard Worker {
649*d83cc019SAndroid Build Coastguard Worker 	uint32_t x_dim, y_dim, tmp, right_mask;
650*d83cc019SAndroid Build Coastguard Worker 
651*d83cc019SAndroid Build Coastguard Worker 	/*
652*d83cc019SAndroid Build Coastguard Worker 	 * Simply do SIMD16 based dispatch, so every thread uses
653*d83cc019SAndroid Build Coastguard Worker 	 * SIMD16 channels.
654*d83cc019SAndroid Build Coastguard Worker 	 *
655*d83cc019SAndroid Build Coastguard Worker 	 * Define our own thread group size, e.g 16x1 for every group, then
656*d83cc019SAndroid Build Coastguard Worker 	 * will have 1 thread each group in SIMD16 dispatch. So thread
657*d83cc019SAndroid Build Coastguard Worker 	 * width/height/depth are all 1.
658*d83cc019SAndroid Build Coastguard Worker 	 *
659*d83cc019SAndroid Build Coastguard Worker 	 * Then thread group X = width / 16 (aligned to 16)
660*d83cc019SAndroid Build Coastguard Worker 	 * thread group Y = height;
661*d83cc019SAndroid Build Coastguard Worker 	 */
662*d83cc019SAndroid Build Coastguard Worker 	x_dim = (width + 15) / 16;
663*d83cc019SAndroid Build Coastguard Worker 	y_dim = height;
664*d83cc019SAndroid Build Coastguard Worker 
665*d83cc019SAndroid Build Coastguard Worker 	tmp = width & 15;
666*d83cc019SAndroid Build Coastguard Worker 	if (tmp == 0)
667*d83cc019SAndroid Build Coastguard Worker 		right_mask = (1 << 16) - 1;
668*d83cc019SAndroid Build Coastguard Worker 	else
669*d83cc019SAndroid Build Coastguard Worker 		right_mask = (1 << tmp) - 1;
670*d83cc019SAndroid Build Coastguard Worker 
671*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_GPGPU_WALKER | 13);
672*d83cc019SAndroid Build Coastguard Worker 
673*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0); /* kernel offset */
674*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0); /* indirect data length */
675*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0); /* indirect data offset */
676*d83cc019SAndroid Build Coastguard Worker 
677*d83cc019SAndroid Build Coastguard Worker 	/* SIMD size, thread w/h/d */
678*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 30 | /* SIMD16 */
679*d83cc019SAndroid Build Coastguard Worker 		  0 << 16 | /* depth:1 */
680*d83cc019SAndroid Build Coastguard Worker 		  0 << 8 | /* height:1 */
681*d83cc019SAndroid Build Coastguard Worker 		  0); /* width:1 */
682*d83cc019SAndroid Build Coastguard Worker 
683*d83cc019SAndroid Build Coastguard Worker 	/* thread group X */
684*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
685*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
686*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(x_dim);
687*d83cc019SAndroid Build Coastguard Worker 
688*d83cc019SAndroid Build Coastguard Worker 	/* thread group Y */
689*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
690*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
691*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(y_dim);
692*d83cc019SAndroid Build Coastguard Worker 
693*d83cc019SAndroid Build Coastguard Worker 	/* thread group Z */
694*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
695*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1);
696*d83cc019SAndroid Build Coastguard Worker 
697*d83cc019SAndroid Build Coastguard Worker 	/* right mask */
698*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(right_mask);
699*d83cc019SAndroid Build Coastguard Worker 
700*d83cc019SAndroid Build Coastguard Worker 	/* bottom mask, height 1, always 0xffffffff */
701*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xffffffff);
702*d83cc019SAndroid Build Coastguard Worker }
703*d83cc019SAndroid Build Coastguard Worker 
704*d83cc019SAndroid Build Coastguard Worker void
gen_emit_media_object(struct intel_batchbuffer * batch,unsigned int xoffset,unsigned int yoffset)705*d83cc019SAndroid Build Coastguard Worker gen_emit_media_object(struct intel_batchbuffer *batch,
706*d83cc019SAndroid Build Coastguard Worker 		       unsigned int xoffset, unsigned int yoffset)
707*d83cc019SAndroid Build Coastguard Worker {
708*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN7_MEDIA_OBJECT | (8 - 2));
709*d83cc019SAndroid Build Coastguard Worker 
710*d83cc019SAndroid Build Coastguard Worker 	/* interface descriptor offset */
711*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
712*d83cc019SAndroid Build Coastguard Worker 
713*d83cc019SAndroid Build Coastguard Worker 	/* without indirect data */
714*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
715*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
716*d83cc019SAndroid Build Coastguard Worker 
717*d83cc019SAndroid Build Coastguard Worker 	/* scoreboard */
718*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
719*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
720*d83cc019SAndroid Build Coastguard Worker 
721*d83cc019SAndroid Build Coastguard Worker 	/* inline data (xoffset, yoffset) */
722*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(xoffset);
723*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(yoffset);
724*d83cc019SAndroid Build Coastguard Worker 	if (AT_LEAST_GEN(batch->devid, 8) && !IS_CHERRYVIEW(batch->devid))
725*d83cc019SAndroid Build Coastguard Worker 		gen8_emit_media_state_flush(batch);
726*d83cc019SAndroid Build Coastguard Worker }
727*d83cc019SAndroid Build Coastguard Worker 
728*d83cc019SAndroid Build Coastguard Worker void
gen9_emit_state_base_address(struct intel_batchbuffer * batch)729*d83cc019SAndroid Build Coastguard Worker gen9_emit_state_base_address(struct intel_batchbuffer *batch)
730*d83cc019SAndroid Build Coastguard Worker {
731*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(GEN8_STATE_BASE_ADDRESS | (19 - 2));
732*d83cc019SAndroid Build Coastguard Worker 
733*d83cc019SAndroid Build Coastguard Worker 	/* general */
734*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
735*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
736*d83cc019SAndroid Build Coastguard Worker 
737*d83cc019SAndroid Build Coastguard Worker 	/* stateless data port */
738*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
739*d83cc019SAndroid Build Coastguard Worker 
740*d83cc019SAndroid Build Coastguard Worker 	/* surface */
741*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_SAMPLER, 0, BASE_ADDRESS_MODIFY);
742*d83cc019SAndroid Build Coastguard Worker 
743*d83cc019SAndroid Build Coastguard Worker 	/* dynamic */
744*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo,
745*d83cc019SAndroid Build Coastguard Worker 		  I915_GEM_DOMAIN_RENDER | I915_GEM_DOMAIN_INSTRUCTION,
746*d83cc019SAndroid Build Coastguard Worker 		  0, BASE_ADDRESS_MODIFY);
747*d83cc019SAndroid Build Coastguard Worker 
748*d83cc019SAndroid Build Coastguard Worker 	/* indirect */
749*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
750*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
751*d83cc019SAndroid Build Coastguard Worker 
752*d83cc019SAndroid Build Coastguard Worker 	/* instruction */
753*d83cc019SAndroid Build Coastguard Worker 	OUT_RELOC(batch->bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
754*d83cc019SAndroid Build Coastguard Worker 		  BASE_ADDRESS_MODIFY);
755*d83cc019SAndroid Build Coastguard Worker 
756*d83cc019SAndroid Build Coastguard Worker 	/* general state buffer size */
757*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xfffff000 | 1);
758*d83cc019SAndroid Build Coastguard Worker 	/* dynamic state buffer size */
759*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 12 | 1);
760*d83cc019SAndroid Build Coastguard Worker 	/* indirect object buffer size */
761*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xfffff000 | 1);
762*d83cc019SAndroid Build Coastguard Worker 	/* intruction buffer size, must set modify enable bit, otherwise it may
763*d83cc019SAndroid Build Coastguard Worker 	 * result in GPU hang
764*d83cc019SAndroid Build Coastguard Worker 	 */
765*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(1 << 12 | 1);
766*d83cc019SAndroid Build Coastguard Worker 
767*d83cc019SAndroid Build Coastguard Worker 	/* Bindless surface state base address */
768*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0 | BASE_ADDRESS_MODIFY);
769*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0);
770*d83cc019SAndroid Build Coastguard Worker 	OUT_BATCH(0xfffff000);
771*d83cc019SAndroid Build Coastguard Worker }
772