drm/etnaviv: add 'sync point' support
In order to support performance counters in a sane way we need to provide a method to sync the GPU with the CPU. The GPU can process multpile command buffers/events per irq. With the help of a 'sync point' we can trigger an event and stop the GPU/FE immediately. When the CPU is done with is processing it simply needs to restart the FE and the GPU will process the command stream. Changes from v1 -> v2: - process sync point with a work item to keep irq as fast as possible Changes from v4 -> v5: - renamed pmrs_* to sync_point_* - call event_free(..) in sync_point_worker(..) Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
This commit is contained in:

committed by
Lucas Stach

parent
249300c740
commit
357713ce9b
@@ -250,6 +250,42 @@ void etnaviv_buffer_end(struct etnaviv_gpu *gpu)
|
||||
}
|
||||
}
|
||||
|
||||
/* Append a 'sync point' to the ring buffer. */
|
||||
void etnaviv_sync_point_queue(struct etnaviv_gpu *gpu, unsigned int event)
|
||||
{
|
||||
struct etnaviv_cmdbuf *buffer = gpu->buffer;
|
||||
unsigned int waitlink_offset = buffer->user_size - 16;
|
||||
u32 dwords, target;
|
||||
|
||||
/*
|
||||
* We need at most 3 dwords in the return target:
|
||||
* 1 event + 1 end + 1 wait + 1 link.
|
||||
*/
|
||||
dwords = 4;
|
||||
target = etnaviv_buffer_reserve(gpu, buffer, dwords);
|
||||
|
||||
/* Signal sync point event */
|
||||
CMD_LOAD_STATE(buffer, VIVS_GL_EVENT, VIVS_GL_EVENT_EVENT_ID(event) |
|
||||
VIVS_GL_EVENT_FROM_PE);
|
||||
|
||||
/* Stop the FE to 'pause' the GPU */
|
||||
CMD_END(buffer);
|
||||
|
||||
/* Append waitlink */
|
||||
CMD_WAIT(buffer);
|
||||
CMD_LINK(buffer, 2, etnaviv_cmdbuf_get_va(buffer) +
|
||||
buffer->user_size - 4);
|
||||
|
||||
/*
|
||||
* Kick off the 'sync point' command by replacing the previous
|
||||
* WAIT with a link to the address in the ring buffer.
|
||||
*/
|
||||
etnaviv_buffer_replace_wait(buffer, waitlink_offset,
|
||||
VIV_FE_LINK_HEADER_OP_LINK |
|
||||
VIV_FE_LINK_HEADER_PREFETCH(dwords),
|
||||
target);
|
||||
}
|
||||
|
||||
/* Append a command buffer to the ring buffer. */
|
||||
void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event,
|
||||
struct etnaviv_cmdbuf *cmdbuf)
|
||||
|
Reference in New Issue
Block a user