Lines Matching full:buffer
22 * Command Buffer helper:
26 static inline void OUT(struct etnaviv_cmdbuf *buffer, u32 data) in OUT() argument
28 u32 *vaddr = (u32 *)buffer->vaddr; in OUT()
30 BUG_ON(buffer->user_size >= buffer->size); in OUT()
32 vaddr[buffer->user_size / 4] = data; in OUT()
33 buffer->user_size += 4; in OUT()
36 static inline void CMD_LOAD_STATE(struct etnaviv_cmdbuf *buffer, in CMD_LOAD_STATE() argument
41 buffer->user_size = ALIGN(buffer->user_size, 8); in CMD_LOAD_STATE()
44 OUT(buffer, VIV_FE_LOAD_STATE_HEADER_OP_LOAD_STATE | in CMD_LOAD_STATE()
47 OUT(buffer, value); in CMD_LOAD_STATE()
50 static inline void CMD_END(struct etnaviv_cmdbuf *buffer) in CMD_END() argument
52 buffer->user_size = ALIGN(buffer->user_size, 8); in CMD_END()
54 OUT(buffer, VIV_FE_END_HEADER_OP_END); in CMD_END()
57 static inline void CMD_WAIT(struct etnaviv_cmdbuf *buffer, in CMD_WAIT() argument
60 buffer->user_size = ALIGN(buffer->user_size, 8); in CMD_WAIT()
62 OUT(buffer, VIV_FE_WAIT_HEADER_OP_WAIT | waitcycles); in CMD_WAIT()
65 static inline void CMD_LINK(struct etnaviv_cmdbuf *buffer, in CMD_LINK() argument
68 buffer->user_size = ALIGN(buffer->user_size, 8); in CMD_LINK()
70 OUT(buffer, VIV_FE_LINK_HEADER_OP_LINK | in CMD_LINK()
72 OUT(buffer, address); in CMD_LINK()
75 static inline void CMD_STALL(struct etnaviv_cmdbuf *buffer, in CMD_STALL() argument
78 buffer->user_size = ALIGN(buffer->user_size, 8); in CMD_STALL()
80 OUT(buffer, VIV_FE_STALL_HEADER_OP_STALL); in CMD_STALL()
81 OUT(buffer, VIV_FE_STALL_TOKEN_FROM(from) | VIV_FE_STALL_TOKEN_TO(to)); in CMD_STALL()
84 static inline void CMD_SEM(struct etnaviv_cmdbuf *buffer, u32 from, u32 to) in CMD_SEM() argument
86 CMD_LOAD_STATE(buffer, VIVS_GL_SEMAPHORE_TOKEN, in CMD_SEM()
92 struct etnaviv_cmdbuf *buffer, u8 pipe) in etnaviv_cmd_select_pipe() argument
109 CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_CACHE, flush); in etnaviv_cmd_select_pipe()
110 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_cmd_select_pipe()
111 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_cmd_select_pipe()
113 CMD_LOAD_STATE(buffer, VIVS_GL_PIPE_SELECT, in etnaviv_cmd_select_pipe()
138 static void etnaviv_buffer_replace_wait(struct etnaviv_cmdbuf *buffer, in etnaviv_buffer_replace_wait() argument
141 u32 *lw = buffer->vaddr + wl_offset; in etnaviv_buffer_replace_wait()
150 * Ensure that there is space in the command buffer to contiguously write
151 * 'cmd_dwords' 64-bit words into the buffer, wrapping if necessary.
154 struct etnaviv_cmdbuf *buffer, unsigned int cmd_dwords) in etnaviv_buffer_reserve() argument
156 if (buffer->user_size + cmd_dwords * sizeof(u64) > buffer->size) in etnaviv_buffer_reserve()
157 buffer->user_size = 0; in etnaviv_buffer_reserve()
159 return etnaviv_cmdbuf_get_va(buffer, in etnaviv_buffer_reserve()
161 buffer->user_size; in etnaviv_buffer_reserve()
166 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_buffer_init() local
170 /* initialize buffer */ in etnaviv_buffer_init()
171 buffer->user_size = 0; in etnaviv_buffer_init()
173 CMD_WAIT(buffer, gpu->fe_waitcycles); in etnaviv_buffer_init()
174 CMD_LINK(buffer, 2, in etnaviv_buffer_init()
175 etnaviv_cmdbuf_get_va(buffer, &gpu->mmu_context->cmdbuf_mapping) in etnaviv_buffer_init()
176 + buffer->user_size - 4); in etnaviv_buffer_init()
178 return buffer->user_size / 8; in etnaviv_buffer_init()
183 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_buffer_config_mmuv2() local
187 buffer->user_size = 0; in etnaviv_buffer_config_mmuv2()
190 CMD_LOAD_STATE(buffer, VIVS_GL_PIPE_SELECT, in etnaviv_buffer_config_mmuv2()
192 CMD_LOAD_STATE(buffer, VIVS_MMUv2_CONFIGURATION, in etnaviv_buffer_config_mmuv2()
194 CMD_LOAD_STATE(buffer, VIVS_MMUv2_SAFE_ADDRESS, safe_addr); in etnaviv_buffer_config_mmuv2()
195 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_config_mmuv2()
196 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_config_mmuv2()
200 CMD_LOAD_STATE(buffer, VIVS_GL_PIPE_SELECT, in etnaviv_buffer_config_mmuv2()
202 CMD_LOAD_STATE(buffer, VIVS_MMUv2_CONFIGURATION, in etnaviv_buffer_config_mmuv2()
204 CMD_LOAD_STATE(buffer, VIVS_MMUv2_SAFE_ADDRESS, safe_addr); in etnaviv_buffer_config_mmuv2()
205 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_config_mmuv2()
206 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_config_mmuv2()
209 CMD_END(buffer); in etnaviv_buffer_config_mmuv2()
211 buffer->user_size = ALIGN(buffer->user_size, 8); in etnaviv_buffer_config_mmuv2()
213 return buffer->user_size / 8; in etnaviv_buffer_config_mmuv2()
218 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_buffer_config_pta() local
222 buffer->user_size = 0; in etnaviv_buffer_config_pta()
224 CMD_LOAD_STATE(buffer, VIVS_MMUv2_PTA_CONFIG, in etnaviv_buffer_config_pta()
227 CMD_END(buffer); in etnaviv_buffer_config_pta()
229 buffer->user_size = ALIGN(buffer->user_size, 8); in etnaviv_buffer_config_pta()
231 return buffer->user_size / 8; in etnaviv_buffer_config_pta()
236 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_buffer_end() local
237 unsigned int waitlink_offset = buffer->user_size - 16; in etnaviv_buffer_end()
259 link_target = etnaviv_buffer_reserve(gpu, buffer, dwords); in etnaviv_buffer_end()
261 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_end()
262 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_end()
264 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1); in etnaviv_buffer_end()
265 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_end()
266 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_end()
267 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x0); in etnaviv_buffer_end()
269 CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_CACHE, flush); in etnaviv_buffer_end()
272 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1); in etnaviv_buffer_end()
273 CMD_LOAD_STATE(buffer, VIVS_BLT_SET_COMMAND, 0x1); in etnaviv_buffer_end()
274 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x0); in etnaviv_buffer_end()
276 CMD_LOAD_STATE(buffer, VIVS_TS_FLUSH_CACHE, in etnaviv_buffer_end()
280 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_end()
281 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_end()
283 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1); in etnaviv_buffer_end()
284 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_end()
285 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_end()
286 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x0); in etnaviv_buffer_end()
288 CMD_END(buffer); in etnaviv_buffer_end()
290 etnaviv_buffer_replace_wait(buffer, waitlink_offset, in etnaviv_buffer_end()
296 etnaviv_buffer_replace_wait(buffer, waitlink_offset, in etnaviv_buffer_end()
301 /* Append a 'sync point' to the ring buffer. */
304 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_sync_point_queue() local
305 unsigned int waitlink_offset = buffer->user_size - 16; in etnaviv_sync_point_queue()
315 target = etnaviv_buffer_reserve(gpu, buffer, dwords); in etnaviv_sync_point_queue()
318 CMD_LOAD_STATE(buffer, VIVS_GL_EVENT, VIVS_GL_EVENT_EVENT_ID(event) | in etnaviv_sync_point_queue()
322 CMD_END(buffer); in etnaviv_sync_point_queue()
325 CMD_WAIT(buffer, gpu->fe_waitcycles); in etnaviv_sync_point_queue()
326 CMD_LINK(buffer, 2, in etnaviv_sync_point_queue()
327 etnaviv_cmdbuf_get_va(buffer, &gpu->mmu_context->cmdbuf_mapping) in etnaviv_sync_point_queue()
328 + buffer->user_size - 4); in etnaviv_sync_point_queue()
332 * WAIT with a link to the address in the ring buffer. in etnaviv_sync_point_queue()
334 etnaviv_buffer_replace_wait(buffer, waitlink_offset, in etnaviv_sync_point_queue()
340 /* Append a command buffer to the ring buffer. */
345 struct etnaviv_cmdbuf *buffer = &gpu->buffer; in etnaviv_buffer_queue() local
346 unsigned int waitlink_offset = buffer->user_size - 16; in etnaviv_buffer_queue()
359 etnaviv_buffer_dump(gpu, buffer, 0, 0x50); in etnaviv_buffer_queue()
366 * If we need maintenance prior to submitting this buffer, we will in etnaviv_buffer_queue()
368 * link to this buffer - a total of four additional words. in etnaviv_buffer_queue()
392 target = etnaviv_buffer_reserve(gpu, buffer, extra_dwords); in etnaviv_buffer_queue()
409 CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_MMU, in etnaviv_buffer_queue()
423 CMD_LOAD_STATE(buffer, in etnaviv_buffer_queue()
431 CMD_LOAD_STATE(buffer, VIVS_MMUv2_CONFIGURATION, in etnaviv_buffer_queue()
433 CMD_SEM(buffer, SYNC_RECIPIENT_FE, in etnaviv_buffer_queue()
435 CMD_STALL(buffer, SYNC_RECIPIENT_FE, in etnaviv_buffer_queue()
443 etnaviv_cmd_select_pipe(gpu, buffer, exec_state); in etnaviv_buffer_queue()
447 /* And the link to the submitted buffer */ in etnaviv_buffer_queue()
450 CMD_LINK(buffer, link_dwords, link_target); in etnaviv_buffer_queue()
458 * Append a LINK to the submitted command buffer to return to in etnaviv_buffer_queue()
459 * the ring buffer. return_target is the ring target address. in etnaviv_buffer_queue()
473 return_target = etnaviv_buffer_reserve(gpu, buffer, return_dwords); in etnaviv_buffer_queue()
478 * the wait command to the ring buffer. in etnaviv_buffer_queue()
481 CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_CACHE, in etnaviv_buffer_queue()
484 CMD_LOAD_STATE(buffer, VIVS_GL_FLUSH_CACHE, in etnaviv_buffer_queue()
489 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1); in etnaviv_buffer_queue()
490 CMD_LOAD_STATE(buffer, VIVS_BLT_SET_COMMAND, 0x1); in etnaviv_buffer_queue()
491 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x0); in etnaviv_buffer_queue()
493 CMD_LOAD_STATE(buffer, VIVS_TS_FLUSH_CACHE, in etnaviv_buffer_queue()
497 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_queue()
498 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_PE); in etnaviv_buffer_queue()
501 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x1); in etnaviv_buffer_queue()
502 CMD_SEM(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_queue()
503 CMD_STALL(buffer, SYNC_RECIPIENT_FE, SYNC_RECIPIENT_BLT); in etnaviv_buffer_queue()
504 CMD_LOAD_STATE(buffer, VIVS_BLT_ENABLE, 0x0); in etnaviv_buffer_queue()
507 CMD_LOAD_STATE(buffer, VIVS_GL_EVENT, VIVS_GL_EVENT_EVENT_ID(event) | in etnaviv_buffer_queue()
509 CMD_WAIT(buffer, gpu->fe_waitcycles); in etnaviv_buffer_queue()
510 CMD_LINK(buffer, 2, in etnaviv_buffer_queue()
511 etnaviv_cmdbuf_get_va(buffer, &gpu->mmu_context->cmdbuf_mapping) in etnaviv_buffer_queue()
512 + buffer->user_size - 4); in etnaviv_buffer_queue()
524 pr_info("link op: %p\n", buffer->vaddr + waitlink_offset); in etnaviv_buffer_queue()
532 * WAIT with a link to the address in the ring buffer. in etnaviv_buffer_queue()
534 etnaviv_buffer_replace_wait(buffer, waitlink_offset, in etnaviv_buffer_queue()
540 etnaviv_buffer_dump(gpu, buffer, 0, 0x50); in etnaviv_buffer_queue()