drm/etnaviv: add lockdep annotations to buffer manipulation functions
authorLucas Stach <l.stach@pengutronix.de>
Fri, 17 Nov 2017 16:51:19 +0000 (17:51 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Tue, 2 Jan 2018 16:25:44 +0000 (17:25 +0100)
When manipulating the kernel command buffer the GPU mutex must be held, as
otherwise different callers might try to replace the same part of the
buffer, wreacking havok in the GPU execution.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_buffer.c

index 6ad8972a59cc326bba6496c135a887585ccc395b..b0e046d8ad2dd1cfceb1977a017c90adf48a497c 100644 (file)
@@ -100,6 +100,8 @@ static void etnaviv_cmd_select_pipe(struct etnaviv_gpu *gpu,
 {
        u32 flush = 0;
 
+       lockdep_assert_held(&gpu->lock);
+
        /*
         * This assumes that if we're switching to 2D, we're switching
         * away from 3D, and vice versa.  Hence, if we're switching to
@@ -166,6 +168,8 @@ u16 etnaviv_buffer_init(struct etnaviv_gpu *gpu)
 {
        struct etnaviv_cmdbuf *buffer = gpu->buffer;
 
+       lockdep_assert_held(&gpu->lock);
+
        /* initialize buffer */
        buffer->user_size = 0;
 
@@ -180,6 +184,8 @@ u16 etnaviv_buffer_config_mmuv2(struct etnaviv_gpu *gpu, u32 mtlb_addr, u32 safe
 {
        struct etnaviv_cmdbuf *buffer = gpu->buffer;
 
+       lockdep_assert_held(&gpu->lock);
+
        buffer->user_size = 0;
 
        if (gpu->identity.features & chipFeatures_PIPE_3D) {
@@ -215,6 +221,8 @@ void etnaviv_buffer_end(struct etnaviv_gpu *gpu)
        unsigned int waitlink_offset = buffer->user_size - 16;
        u32 link_target, flush = 0;
 
+       lockdep_assert_held(&gpu->lock);
+
        if (gpu->exec_state == ETNA_PIPE_2D)
                flush = VIVS_GL_FLUSH_CACHE_PE2D;
        else if (gpu->exec_state == ETNA_PIPE_3D)
@@ -257,6 +265,8 @@ void etnaviv_sync_point_queue(struct etnaviv_gpu *gpu, unsigned int event)
        unsigned int waitlink_offset = buffer->user_size - 16;
        u32 dwords, target;
 
+       lockdep_assert_held(&gpu->lock);
+
        /*
         * We need at most 3 dwords in the return target:
         * 1 event + 1 end + 1 wait + 1 link.
@@ -296,6 +306,8 @@ void etnaviv_buffer_queue(struct etnaviv_gpu *gpu, unsigned int event,
        u32 link_target, link_dwords;
        bool switch_context = gpu->exec_state != cmdbuf->exec_state;
 
+       lockdep_assert_held(&gpu->lock);
+
        if (drm_debug & DRM_UT_DRIVER)
                etnaviv_buffer_dump(gpu, buffer, 0, 0x50);