147f8253dSPrathap Kumar Valsan // SPDX-License-Identifier: MIT 247f8253dSPrathap Kumar Valsan /* 347f8253dSPrathap Kumar Valsan * Copyright © 2019 Intel Corporation 447f8253dSPrathap Kumar Valsan */ 547f8253dSPrathap Kumar Valsan 647f8253dSPrathap Kumar Valsan #include "gen7_renderclear.h" 747f8253dSPrathap Kumar Valsan #include "i915_drv.h" 847f8253dSPrathap Kumar Valsan #include "intel_gpu_commands.h" 947f8253dSPrathap Kumar Valsan 1047f8253dSPrathap Kumar Valsan #define MAX_URB_ENTRIES 64 1147f8253dSPrathap Kumar Valsan #define STATE_SIZE (4 * 1024) 1247f8253dSPrathap Kumar Valsan #define GT3_INLINE_DATA_DELAYS 0x1E00 1347f8253dSPrathap Kumar Valsan #define batch_advance(Y, CS) GEM_BUG_ON((Y)->end != (CS)) 1447f8253dSPrathap Kumar Valsan 1547f8253dSPrathap Kumar Valsan struct cb_kernel { 1647f8253dSPrathap Kumar Valsan const void *data; 1747f8253dSPrathap Kumar Valsan u32 size; 1847f8253dSPrathap Kumar Valsan }; 1947f8253dSPrathap Kumar Valsan 2047f8253dSPrathap Kumar Valsan #define CB_KERNEL(name) { .data = (name), .size = sizeof(name) } 2147f8253dSPrathap Kumar Valsan 2247f8253dSPrathap Kumar Valsan #include "ivb_clear_kernel.c" 2347f8253dSPrathap Kumar Valsan static const struct cb_kernel cb_kernel_ivb = CB_KERNEL(ivb_clear_kernel); 2447f8253dSPrathap Kumar Valsan 2547f8253dSPrathap Kumar Valsan #include "hsw_clear_kernel.c" 2647f8253dSPrathap Kumar Valsan static const struct cb_kernel cb_kernel_hsw = CB_KERNEL(hsw_clear_kernel); 2747f8253dSPrathap Kumar Valsan 2847f8253dSPrathap Kumar Valsan struct batch_chunk { 2947f8253dSPrathap Kumar Valsan struct i915_vma *vma; 3047f8253dSPrathap Kumar Valsan u32 offset; 3147f8253dSPrathap Kumar Valsan u32 *start; 3247f8253dSPrathap Kumar Valsan u32 *end; 3347f8253dSPrathap Kumar Valsan u32 max_items; 3447f8253dSPrathap Kumar Valsan }; 3547f8253dSPrathap Kumar Valsan 3647f8253dSPrathap Kumar Valsan struct batch_vals { 3747f8253dSPrathap Kumar Valsan u32 max_primitives; 3847f8253dSPrathap Kumar Valsan u32 max_urb_entries; 3947f8253dSPrathap Kumar Valsan u32 cmd_size; 4047f8253dSPrathap Kumar Valsan u32 state_size; 4147f8253dSPrathap Kumar Valsan u32 state_start; 4247f8253dSPrathap Kumar Valsan u32 batch_size; 4347f8253dSPrathap Kumar Valsan u32 surface_height; 4447f8253dSPrathap Kumar Valsan u32 surface_width; 4547f8253dSPrathap Kumar Valsan u32 scratch_size; 4647f8253dSPrathap Kumar Valsan u32 max_size; 4747f8253dSPrathap Kumar Valsan }; 4847f8253dSPrathap Kumar Valsan 4947f8253dSPrathap Kumar Valsan static void 5047f8253dSPrathap Kumar Valsan batch_get_defaults(struct drm_i915_private *i915, struct batch_vals *bv) 5147f8253dSPrathap Kumar Valsan { 5247f8253dSPrathap Kumar Valsan if (IS_HASWELL(i915)) { 5347f8253dSPrathap Kumar Valsan bv->max_primitives = 280; 5447f8253dSPrathap Kumar Valsan bv->max_urb_entries = MAX_URB_ENTRIES; 5547f8253dSPrathap Kumar Valsan bv->surface_height = 16 * 16; 5647f8253dSPrathap Kumar Valsan bv->surface_width = 32 * 2 * 16; 5747f8253dSPrathap Kumar Valsan } else { 5847f8253dSPrathap Kumar Valsan bv->max_primitives = 128; 5947f8253dSPrathap Kumar Valsan bv->max_urb_entries = MAX_URB_ENTRIES / 2; 6047f8253dSPrathap Kumar Valsan bv->surface_height = 16 * 8; 6147f8253dSPrathap Kumar Valsan bv->surface_width = 32 * 16; 6247f8253dSPrathap Kumar Valsan } 6347f8253dSPrathap Kumar Valsan bv->cmd_size = bv->max_primitives * 4096; 6447f8253dSPrathap Kumar Valsan bv->state_size = STATE_SIZE; 6547f8253dSPrathap Kumar Valsan bv->state_start = bv->cmd_size; 6647f8253dSPrathap Kumar Valsan bv->batch_size = bv->cmd_size + bv->state_size; 6747f8253dSPrathap Kumar Valsan bv->scratch_size = bv->surface_height * bv->surface_width; 6847f8253dSPrathap Kumar Valsan bv->max_size = bv->batch_size + bv->scratch_size; 6947f8253dSPrathap Kumar Valsan } 7047f8253dSPrathap Kumar Valsan 7147f8253dSPrathap Kumar Valsan static void batch_init(struct batch_chunk *bc, 7247f8253dSPrathap Kumar Valsan struct i915_vma *vma, 7347f8253dSPrathap Kumar Valsan u32 *start, u32 offset, u32 max_bytes) 7447f8253dSPrathap Kumar Valsan { 7547f8253dSPrathap Kumar Valsan bc->vma = vma; 7647f8253dSPrathap Kumar Valsan bc->offset = offset; 7747f8253dSPrathap Kumar Valsan bc->start = start + bc->offset / sizeof(*bc->start); 7847f8253dSPrathap Kumar Valsan bc->end = bc->start; 7947f8253dSPrathap Kumar Valsan bc->max_items = max_bytes / sizeof(*bc->start); 8047f8253dSPrathap Kumar Valsan } 8147f8253dSPrathap Kumar Valsan 8247f8253dSPrathap Kumar Valsan static u32 batch_offset(const struct batch_chunk *bc, u32 *cs) 8347f8253dSPrathap Kumar Valsan { 8447f8253dSPrathap Kumar Valsan return (cs - bc->start) * sizeof(*bc->start) + bc->offset; 8547f8253dSPrathap Kumar Valsan } 8647f8253dSPrathap Kumar Valsan 8747f8253dSPrathap Kumar Valsan static u32 batch_addr(const struct batch_chunk *bc) 8847f8253dSPrathap Kumar Valsan { 8947f8253dSPrathap Kumar Valsan return bc->vma->node.start; 9047f8253dSPrathap Kumar Valsan } 9147f8253dSPrathap Kumar Valsan 9247f8253dSPrathap Kumar Valsan static void batch_add(struct batch_chunk *bc, const u32 d) 9347f8253dSPrathap Kumar Valsan { 9447f8253dSPrathap Kumar Valsan GEM_BUG_ON((bc->end - bc->start) >= bc->max_items); 9547f8253dSPrathap Kumar Valsan *bc->end++ = d; 9647f8253dSPrathap Kumar Valsan } 9747f8253dSPrathap Kumar Valsan 9847f8253dSPrathap Kumar Valsan static u32 *batch_alloc_items(struct batch_chunk *bc, u32 align, u32 items) 9947f8253dSPrathap Kumar Valsan { 10047f8253dSPrathap Kumar Valsan u32 *map; 10147f8253dSPrathap Kumar Valsan 10247f8253dSPrathap Kumar Valsan if (align) { 10347f8253dSPrathap Kumar Valsan u32 *end = PTR_ALIGN(bc->end, align); 10447f8253dSPrathap Kumar Valsan 10547f8253dSPrathap Kumar Valsan memset32(bc->end, 0, end - bc->end); 10647f8253dSPrathap Kumar Valsan bc->end = end; 10747f8253dSPrathap Kumar Valsan } 10847f8253dSPrathap Kumar Valsan 10947f8253dSPrathap Kumar Valsan map = bc->end; 11047f8253dSPrathap Kumar Valsan bc->end += items; 11147f8253dSPrathap Kumar Valsan 11247f8253dSPrathap Kumar Valsan return map; 11347f8253dSPrathap Kumar Valsan } 11447f8253dSPrathap Kumar Valsan 11547f8253dSPrathap Kumar Valsan static u32 *batch_alloc_bytes(struct batch_chunk *bc, u32 align, u32 bytes) 11647f8253dSPrathap Kumar Valsan { 11747f8253dSPrathap Kumar Valsan GEM_BUG_ON(!IS_ALIGNED(bytes, sizeof(*bc->start))); 11847f8253dSPrathap Kumar Valsan return batch_alloc_items(bc, align, bytes / sizeof(*bc->start)); 11947f8253dSPrathap Kumar Valsan } 12047f8253dSPrathap Kumar Valsan 12147f8253dSPrathap Kumar Valsan static u32 12247f8253dSPrathap Kumar Valsan gen7_fill_surface_state(struct batch_chunk *state, 12347f8253dSPrathap Kumar Valsan const u32 dst_offset, 12447f8253dSPrathap Kumar Valsan const struct batch_vals *bv) 12547f8253dSPrathap Kumar Valsan { 12647f8253dSPrathap Kumar Valsan u32 surface_h = bv->surface_height; 12747f8253dSPrathap Kumar Valsan u32 surface_w = bv->surface_width; 12847f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(state, 32, 8); 12947f8253dSPrathap Kumar Valsan u32 offset = batch_offset(state, cs); 13047f8253dSPrathap Kumar Valsan 13147f8253dSPrathap Kumar Valsan #define SURFACE_2D 1 13247f8253dSPrathap Kumar Valsan #define SURFACEFORMAT_B8G8R8A8_UNORM 0x0C0 13347f8253dSPrathap Kumar Valsan #define RENDER_CACHE_READ_WRITE 1 13447f8253dSPrathap Kumar Valsan 13547f8253dSPrathap Kumar Valsan *cs++ = SURFACE_2D << 29 | 13647f8253dSPrathap Kumar Valsan (SURFACEFORMAT_B8G8R8A8_UNORM << 18) | 13747f8253dSPrathap Kumar Valsan (RENDER_CACHE_READ_WRITE << 8); 13847f8253dSPrathap Kumar Valsan 13947f8253dSPrathap Kumar Valsan *cs++ = batch_addr(state) + dst_offset; 14047f8253dSPrathap Kumar Valsan 14147f8253dSPrathap Kumar Valsan *cs++ = ((surface_h / 4 - 1) << 16) | (surface_w / 4 - 1); 14247f8253dSPrathap Kumar Valsan *cs++ = surface_w; 14347f8253dSPrathap Kumar Valsan *cs++ = 0; 14447f8253dSPrathap Kumar Valsan *cs++ = 0; 14547f8253dSPrathap Kumar Valsan *cs++ = 0; 14647f8253dSPrathap Kumar Valsan #define SHADER_CHANNELS(r, g, b, a) \ 14747f8253dSPrathap Kumar Valsan (((r) << 25) | ((g) << 22) | ((b) << 19) | ((a) << 16)) 14847f8253dSPrathap Kumar Valsan *cs++ = SHADER_CHANNELS(4, 5, 6, 7); 14947f8253dSPrathap Kumar Valsan batch_advance(state, cs); 15047f8253dSPrathap Kumar Valsan 15147f8253dSPrathap Kumar Valsan return offset; 15247f8253dSPrathap Kumar Valsan } 15347f8253dSPrathap Kumar Valsan 15447f8253dSPrathap Kumar Valsan static u32 15547f8253dSPrathap Kumar Valsan gen7_fill_binding_table(struct batch_chunk *state, 15647f8253dSPrathap Kumar Valsan const struct batch_vals *bv) 15747f8253dSPrathap Kumar Valsan { 15847f8253dSPrathap Kumar Valsan u32 surface_start = gen7_fill_surface_state(state, bv->batch_size, bv); 15947f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(state, 32, 8); 16047f8253dSPrathap Kumar Valsan u32 offset = batch_offset(state, cs); 16147f8253dSPrathap Kumar Valsan 16247f8253dSPrathap Kumar Valsan *cs++ = surface_start - state->offset; 16347f8253dSPrathap Kumar Valsan *cs++ = 0; 16447f8253dSPrathap Kumar Valsan *cs++ = 0; 16547f8253dSPrathap Kumar Valsan *cs++ = 0; 16647f8253dSPrathap Kumar Valsan *cs++ = 0; 16747f8253dSPrathap Kumar Valsan *cs++ = 0; 16847f8253dSPrathap Kumar Valsan *cs++ = 0; 16947f8253dSPrathap Kumar Valsan *cs++ = 0; 17047f8253dSPrathap Kumar Valsan batch_advance(state, cs); 17147f8253dSPrathap Kumar Valsan 17247f8253dSPrathap Kumar Valsan return offset; 17347f8253dSPrathap Kumar Valsan } 17447f8253dSPrathap Kumar Valsan 17547f8253dSPrathap Kumar Valsan static u32 17647f8253dSPrathap Kumar Valsan gen7_fill_kernel_data(struct batch_chunk *state, 17747f8253dSPrathap Kumar Valsan const u32 *data, 17847f8253dSPrathap Kumar Valsan const u32 size) 17947f8253dSPrathap Kumar Valsan { 18047f8253dSPrathap Kumar Valsan return batch_offset(state, 18147f8253dSPrathap Kumar Valsan memcpy(batch_alloc_bytes(state, 64, size), 18247f8253dSPrathap Kumar Valsan data, size)); 18347f8253dSPrathap Kumar Valsan } 18447f8253dSPrathap Kumar Valsan 18547f8253dSPrathap Kumar Valsan static u32 18647f8253dSPrathap Kumar Valsan gen7_fill_interface_descriptor(struct batch_chunk *state, 18747f8253dSPrathap Kumar Valsan const struct batch_vals *bv, 18847f8253dSPrathap Kumar Valsan const struct cb_kernel *kernel, 18947f8253dSPrathap Kumar Valsan unsigned int count) 19047f8253dSPrathap Kumar Valsan { 19147f8253dSPrathap Kumar Valsan u32 kernel_offset = 19247f8253dSPrathap Kumar Valsan gen7_fill_kernel_data(state, kernel->data, kernel->size); 19347f8253dSPrathap Kumar Valsan u32 binding_table = gen7_fill_binding_table(state, bv); 19447f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(state, 32, 8 * count); 19547f8253dSPrathap Kumar Valsan u32 offset = batch_offset(state, cs); 19647f8253dSPrathap Kumar Valsan 19747f8253dSPrathap Kumar Valsan *cs++ = kernel_offset; 19847f8253dSPrathap Kumar Valsan *cs++ = (1 << 7) | (1 << 13); 19947f8253dSPrathap Kumar Valsan *cs++ = 0; 20047f8253dSPrathap Kumar Valsan *cs++ = (binding_table - state->offset) | 1; 20147f8253dSPrathap Kumar Valsan *cs++ = 0; 20247f8253dSPrathap Kumar Valsan *cs++ = 0; 20347f8253dSPrathap Kumar Valsan *cs++ = 0; 20447f8253dSPrathap Kumar Valsan *cs++ = 0; 20547f8253dSPrathap Kumar Valsan 20647f8253dSPrathap Kumar Valsan /* 1 - 63dummy idds */ 20747f8253dSPrathap Kumar Valsan memset32(cs, 0x00, (count - 1) * 8); 20847f8253dSPrathap Kumar Valsan batch_advance(state, cs + (count - 1) * 8); 20947f8253dSPrathap Kumar Valsan 21047f8253dSPrathap Kumar Valsan return offset; 21147f8253dSPrathap Kumar Valsan } 21247f8253dSPrathap Kumar Valsan 21347f8253dSPrathap Kumar Valsan static void 21447f8253dSPrathap Kumar Valsan gen7_emit_state_base_address(struct batch_chunk *batch, 21547f8253dSPrathap Kumar Valsan u32 surface_state_base) 21647f8253dSPrathap Kumar Valsan { 21747f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(batch, 0, 12); 21847f8253dSPrathap Kumar Valsan 21947f8253dSPrathap Kumar Valsan *cs++ = STATE_BASE_ADDRESS | (12 - 2); 22047f8253dSPrathap Kumar Valsan /* general */ 22147f8253dSPrathap Kumar Valsan *cs++ = batch_addr(batch) | BASE_ADDRESS_MODIFY; 22247f8253dSPrathap Kumar Valsan /* surface */ 22347f8253dSPrathap Kumar Valsan *cs++ = batch_addr(batch) | surface_state_base | BASE_ADDRESS_MODIFY; 22447f8253dSPrathap Kumar Valsan /* dynamic */ 22547f8253dSPrathap Kumar Valsan *cs++ = batch_addr(batch) | BASE_ADDRESS_MODIFY; 22647f8253dSPrathap Kumar Valsan /* indirect */ 22747f8253dSPrathap Kumar Valsan *cs++ = batch_addr(batch) | BASE_ADDRESS_MODIFY; 22847f8253dSPrathap Kumar Valsan /* instruction */ 22947f8253dSPrathap Kumar Valsan *cs++ = batch_addr(batch) | BASE_ADDRESS_MODIFY; 23047f8253dSPrathap Kumar Valsan 23147f8253dSPrathap Kumar Valsan /* general/dynamic/indirect/instruction access Bound */ 23247f8253dSPrathap Kumar Valsan *cs++ = 0; 23347f8253dSPrathap Kumar Valsan *cs++ = BASE_ADDRESS_MODIFY; 23447f8253dSPrathap Kumar Valsan *cs++ = 0; 23547f8253dSPrathap Kumar Valsan *cs++ = BASE_ADDRESS_MODIFY; 23647f8253dSPrathap Kumar Valsan *cs++ = 0; 23747f8253dSPrathap Kumar Valsan *cs++ = 0; 23847f8253dSPrathap Kumar Valsan batch_advance(batch, cs); 23947f8253dSPrathap Kumar Valsan } 24047f8253dSPrathap Kumar Valsan 24147f8253dSPrathap Kumar Valsan static void 24247f8253dSPrathap Kumar Valsan gen7_emit_vfe_state(struct batch_chunk *batch, 24347f8253dSPrathap Kumar Valsan const struct batch_vals *bv, 24447f8253dSPrathap Kumar Valsan u32 urb_size, u32 curbe_size, 24547f8253dSPrathap Kumar Valsan u32 mode) 24647f8253dSPrathap Kumar Valsan { 24747f8253dSPrathap Kumar Valsan u32 urb_entries = bv->max_urb_entries; 24847f8253dSPrathap Kumar Valsan u32 threads = bv->max_primitives - 1; 24947f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(batch, 32, 8); 25047f8253dSPrathap Kumar Valsan 25147f8253dSPrathap Kumar Valsan *cs++ = MEDIA_VFE_STATE | (8 - 2); 25247f8253dSPrathap Kumar Valsan 25347f8253dSPrathap Kumar Valsan /* scratch buffer */ 25447f8253dSPrathap Kumar Valsan *cs++ = 0; 25547f8253dSPrathap Kumar Valsan 25647f8253dSPrathap Kumar Valsan /* number of threads & urb entries for GPGPU vs Media Mode */ 25747f8253dSPrathap Kumar Valsan *cs++ = threads << 16 | urb_entries << 8 | mode << 2; 25847f8253dSPrathap Kumar Valsan 25947f8253dSPrathap Kumar Valsan *cs++ = 0; 26047f8253dSPrathap Kumar Valsan 26147f8253dSPrathap Kumar Valsan /* urb entry size & curbe size in 256 bits unit */ 26247f8253dSPrathap Kumar Valsan *cs++ = urb_size << 16 | curbe_size; 26347f8253dSPrathap Kumar Valsan 26447f8253dSPrathap Kumar Valsan /* scoreboard */ 26547f8253dSPrathap Kumar Valsan *cs++ = 0; 26647f8253dSPrathap Kumar Valsan *cs++ = 0; 26747f8253dSPrathap Kumar Valsan *cs++ = 0; 26847f8253dSPrathap Kumar Valsan batch_advance(batch, cs); 26947f8253dSPrathap Kumar Valsan } 27047f8253dSPrathap Kumar Valsan 27147f8253dSPrathap Kumar Valsan static void 27247f8253dSPrathap Kumar Valsan gen7_emit_interface_descriptor_load(struct batch_chunk *batch, 27347f8253dSPrathap Kumar Valsan const u32 interface_descriptor, 27447f8253dSPrathap Kumar Valsan unsigned int count) 27547f8253dSPrathap Kumar Valsan { 27647f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(batch, 8, 4); 27747f8253dSPrathap Kumar Valsan 27847f8253dSPrathap Kumar Valsan *cs++ = MEDIA_INTERFACE_DESCRIPTOR_LOAD | (4 - 2); 27947f8253dSPrathap Kumar Valsan *cs++ = 0; 28047f8253dSPrathap Kumar Valsan *cs++ = count * 8 * sizeof(*cs); 28147f8253dSPrathap Kumar Valsan 28247f8253dSPrathap Kumar Valsan /* 28347f8253dSPrathap Kumar Valsan * interface descriptor address - it is relative to the dynamics base 28447f8253dSPrathap Kumar Valsan * address 28547f8253dSPrathap Kumar Valsan */ 28647f8253dSPrathap Kumar Valsan *cs++ = interface_descriptor; 28747f8253dSPrathap Kumar Valsan batch_advance(batch, cs); 28847f8253dSPrathap Kumar Valsan } 28947f8253dSPrathap Kumar Valsan 29047f8253dSPrathap Kumar Valsan static void 29147f8253dSPrathap Kumar Valsan gen7_emit_media_object(struct batch_chunk *batch, 29247f8253dSPrathap Kumar Valsan unsigned int media_object_index) 29347f8253dSPrathap Kumar Valsan { 29447f8253dSPrathap Kumar Valsan unsigned int x_offset = (media_object_index % 16) * 64; 29547f8253dSPrathap Kumar Valsan unsigned int y_offset = (media_object_index / 16) * 16; 29647f8253dSPrathap Kumar Valsan unsigned int inline_data_size; 29747f8253dSPrathap Kumar Valsan unsigned int media_batch_size; 29847f8253dSPrathap Kumar Valsan unsigned int i; 29947f8253dSPrathap Kumar Valsan u32 *cs; 30047f8253dSPrathap Kumar Valsan 30147f8253dSPrathap Kumar Valsan inline_data_size = 112 * 8; 30247f8253dSPrathap Kumar Valsan media_batch_size = inline_data_size + 6; 30347f8253dSPrathap Kumar Valsan 30447f8253dSPrathap Kumar Valsan cs = batch_alloc_items(batch, 8, media_batch_size); 30547f8253dSPrathap Kumar Valsan 30647f8253dSPrathap Kumar Valsan *cs++ = MEDIA_OBJECT | (media_batch_size - 2); 30747f8253dSPrathap Kumar Valsan 30847f8253dSPrathap Kumar Valsan /* interface descriptor offset */ 30947f8253dSPrathap Kumar Valsan *cs++ = 0; 31047f8253dSPrathap Kumar Valsan 31147f8253dSPrathap Kumar Valsan /* without indirect data */ 31247f8253dSPrathap Kumar Valsan *cs++ = 0; 31347f8253dSPrathap Kumar Valsan *cs++ = 0; 31447f8253dSPrathap Kumar Valsan 31547f8253dSPrathap Kumar Valsan /* scoreboard */ 31647f8253dSPrathap Kumar Valsan *cs++ = 0; 31747f8253dSPrathap Kumar Valsan *cs++ = 0; 31847f8253dSPrathap Kumar Valsan 31947f8253dSPrathap Kumar Valsan /* inline */ 32047f8253dSPrathap Kumar Valsan *cs++ = (y_offset << 16) | (x_offset); 32147f8253dSPrathap Kumar Valsan *cs++ = 0; 32247f8253dSPrathap Kumar Valsan *cs++ = GT3_INLINE_DATA_DELAYS; 32347f8253dSPrathap Kumar Valsan for (i = 3; i < inline_data_size; i++) 32447f8253dSPrathap Kumar Valsan *cs++ = 0; 32547f8253dSPrathap Kumar Valsan 32647f8253dSPrathap Kumar Valsan batch_advance(batch, cs); 32747f8253dSPrathap Kumar Valsan } 32847f8253dSPrathap Kumar Valsan 32947f8253dSPrathap Kumar Valsan static void gen7_emit_pipeline_flush(struct batch_chunk *batch) 33047f8253dSPrathap Kumar Valsan { 33147f8253dSPrathap Kumar Valsan u32 *cs = batch_alloc_items(batch, 0, 5); 33247f8253dSPrathap Kumar Valsan 33347f8253dSPrathap Kumar Valsan *cs++ = GFX_OP_PIPE_CONTROL(5); 33447f8253dSPrathap Kumar Valsan *cs++ = PIPE_CONTROL_STATE_CACHE_INVALIDATE | 33547f8253dSPrathap Kumar Valsan PIPE_CONTROL_GLOBAL_GTT_IVB; 33647f8253dSPrathap Kumar Valsan *cs++ = 0; 33747f8253dSPrathap Kumar Valsan *cs++ = 0; 33847f8253dSPrathap Kumar Valsan *cs++ = 0; 33947f8253dSPrathap Kumar Valsan batch_advance(batch, cs); 34047f8253dSPrathap Kumar Valsan } 34147f8253dSPrathap Kumar Valsan 34247f8253dSPrathap Kumar Valsan static void emit_batch(struct i915_vma * const vma, 34347f8253dSPrathap Kumar Valsan u32 *start, 34447f8253dSPrathap Kumar Valsan const struct batch_vals *bv) 34547f8253dSPrathap Kumar Valsan { 34647f8253dSPrathap Kumar Valsan struct drm_i915_private *i915 = vma->vm->i915; 34747f8253dSPrathap Kumar Valsan unsigned int desc_count = 64; 34847f8253dSPrathap Kumar Valsan const u32 urb_size = 112; 34947f8253dSPrathap Kumar Valsan struct batch_chunk cmds, state; 35047f8253dSPrathap Kumar Valsan u32 interface_descriptor; 35147f8253dSPrathap Kumar Valsan unsigned int i; 35247f8253dSPrathap Kumar Valsan 35347f8253dSPrathap Kumar Valsan batch_init(&cmds, vma, start, 0, bv->cmd_size); 35447f8253dSPrathap Kumar Valsan batch_init(&state, vma, start, bv->state_start, bv->state_size); 35547f8253dSPrathap Kumar Valsan 35647f8253dSPrathap Kumar Valsan interface_descriptor = 35747f8253dSPrathap Kumar Valsan gen7_fill_interface_descriptor(&state, bv, 35847f8253dSPrathap Kumar Valsan IS_HASWELL(i915) ? 35947f8253dSPrathap Kumar Valsan &cb_kernel_hsw : 36047f8253dSPrathap Kumar Valsan &cb_kernel_ivb, 36147f8253dSPrathap Kumar Valsan desc_count); 36247f8253dSPrathap Kumar Valsan gen7_emit_pipeline_flush(&cmds); 36347f8253dSPrathap Kumar Valsan batch_add(&cmds, PIPELINE_SELECT | PIPELINE_SELECT_MEDIA); 36447f8253dSPrathap Kumar Valsan batch_add(&cmds, MI_NOOP); 36547f8253dSPrathap Kumar Valsan gen7_emit_state_base_address(&cmds, interface_descriptor); 36647f8253dSPrathap Kumar Valsan gen7_emit_pipeline_flush(&cmds); 36747f8253dSPrathap Kumar Valsan 36847f8253dSPrathap Kumar Valsan gen7_emit_vfe_state(&cmds, bv, urb_size - 1, 0, 0); 36947f8253dSPrathap Kumar Valsan 37047f8253dSPrathap Kumar Valsan gen7_emit_interface_descriptor_load(&cmds, 37147f8253dSPrathap Kumar Valsan interface_descriptor, 37247f8253dSPrathap Kumar Valsan desc_count); 37347f8253dSPrathap Kumar Valsan 37447f8253dSPrathap Kumar Valsan for (i = 0; i < bv->max_primitives; i++) 37547f8253dSPrathap Kumar Valsan gen7_emit_media_object(&cmds, i); 37647f8253dSPrathap Kumar Valsan 37747f8253dSPrathap Kumar Valsan batch_add(&cmds, MI_BATCH_BUFFER_END); 37847f8253dSPrathap Kumar Valsan } 37947f8253dSPrathap Kumar Valsan 38047f8253dSPrathap Kumar Valsan int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine, 38147f8253dSPrathap Kumar Valsan struct i915_vma * const vma) 38247f8253dSPrathap Kumar Valsan { 38347f8253dSPrathap Kumar Valsan struct batch_vals bv; 38447f8253dSPrathap Kumar Valsan u32 *batch; 38547f8253dSPrathap Kumar Valsan 38647f8253dSPrathap Kumar Valsan batch_get_defaults(engine->i915, &bv); 38747f8253dSPrathap Kumar Valsan if (!vma) 38847f8253dSPrathap Kumar Valsan return bv.max_size; 38947f8253dSPrathap Kumar Valsan 39047f8253dSPrathap Kumar Valsan GEM_BUG_ON(vma->obj->base.size < bv.max_size); 39147f8253dSPrathap Kumar Valsan 39247f8253dSPrathap Kumar Valsan batch = i915_gem_object_pin_map(vma->obj, I915_MAP_WC); 39347f8253dSPrathap Kumar Valsan if (IS_ERR(batch)) 39447f8253dSPrathap Kumar Valsan return PTR_ERR(batch); 39547f8253dSPrathap Kumar Valsan 39647f8253dSPrathap Kumar Valsan emit_batch(vma, memset(batch, 0, bv.max_size), &bv); 39747f8253dSPrathap Kumar Valsan 39847f8253dSPrathap Kumar Valsan i915_gem_object_flush_map(vma->obj); 39947f8253dSPrathap Kumar Valsan i915_gem_object_unpin_map(vma->obj); 40047f8253dSPrathap Kumar Valsan 40147f8253dSPrathap Kumar Valsan return 0; 40247f8253dSPrathap Kumar Valsan } 403