summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/atom.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-11-11 09:16:15 +1000
committerAlex Deucher <alexander.deucher@amd.com>2014-11-11 17:22:26 -0500
commit1c9498425453bb65ef339a57705c5ef59fe1541d (patch)
tree293c1d2d23aa2269a67d13d8a5486cc3c6ccf549 /drivers/gpu/drm/radeon/atom.c
parent03dca708521d30153fc5c7e2ff136f780a7372c9 (diff)
downloadlinux-stable-1c9498425453bb65ef339a57705c5ef59fe1541d.tar.gz
linux-stable-1c9498425453bb65ef339a57705c5ef59fe1541d.tar.bz2
linux-stable-1c9498425453bb65ef339a57705c5ef59fe1541d.zip
drm/radeon: add locking around atombios scratch space usage
While developing MST support I noticed I often got the wrong data back from a transaction, in a racy fashion. I noticed the scratch space wasn't locked against concurrent users. Based on a patch by Alex, but I've made it a bit more obvious when things are locked. Signed-off-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'drivers/gpu/drm/radeon/atom.c')
-rw-r--r--drivers/gpu/drm/radeon/atom.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
index 15da7ef344a4..ec1593a6a561 100644
--- a/drivers/gpu/drm/radeon/atom.c
+++ b/drivers/gpu/drm/radeon/atom.c
@@ -1217,7 +1217,7 @@ free:
return ret;
}
-int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
+int atom_execute_table_scratch_unlocked(struct atom_context *ctx, int index, uint32_t * params)
{
int r;
@@ -1238,6 +1238,15 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
return r;
}
+int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
+{
+ int r;
+ mutex_lock(&ctx->scratch_mutex);
+ r = atom_execute_table_scratch_unlocked(ctx, index, params);
+ mutex_unlock(&ctx->scratch_mutex);
+ return r;
+}
+
static int atom_iio_len[] = { 1, 2, 3, 3, 3, 3, 4, 4, 4, 3 };
static void atom_index_iio(struct atom_context *ctx, int base)