summaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorMin-wuk Lee <mlee@nvidia.com>2012-02-14 11:21:05 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:02:06 -0400
commit9e25c06e5572bf0415dbd5f63b1fad06933f4ee9 (patch)
tree4333a664176a1d3f325209731e1d0f9fb4e0879d /drivers/video
parente2bd5f47ded59980885adfcea38eef7bbad86bf8 (diff)
video: tegra: dc: prevent nvmap_unpin crash
This is a workaround to make sure serialization of flip worker, for Android specific. Android doesn't need mutiple workqueues per each window since it gets composited one from user layer. If the last windows' argument index is not 0, provided change will make the last index to 0 with swap operation so work will be queued into one workqueue all the time. Bug 929993 Bug 932592 Bug 933831 Bug 935623 Bug 934569 Change-Id: Ic467bb4f593c72ae98ea1fb324cf1a6d343faa62 Signed-off-by: Min-wuk Lee <mlee@nvidia.com> Reviewed-on: http://git-master/r/82971 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com> Rebase-Id: Rc454558f5527de0ec1dc3c93422e182f928c8d41
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/tegra/dc/ext/dev.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/video/tegra/dc/ext/dev.c b/drivers/video/tegra/dc/ext/dev.c
index 56aa3ced2..63f70485b 100644
--- a/drivers/video/tegra/dc/ext/dev.c
+++ b/drivers/video/tegra/dc/ext/dev.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * drivers/video/tegra/dc/dev.c 2 * drivers/video/tegra/dc/dev.c
3 * 3 *
4 * Copyright (C) 2011, NVIDIA Corporation 4 * Copyright (C) 2011-2012, NVIDIA Corporation
5 * 5 *
6 * Author: Robert Morell <rmorell@nvidia.com> 6 * Author: Robert Morell <rmorell@nvidia.com>
7 * Some code based on fbdev extensions written by: 7 * Some code based on fbdev extensions written by:
@@ -399,6 +399,11 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
399 int work_index; 399 int work_index;
400 int i, ret = 0; 400 int i, ret = 0;
401 401
402#ifdef CONFIG_ANDROID
403 int index_check[DC_N_WINDOWS] = {0, };
404 int zero_index_id = 0;
405#endif
406
402 if (!user->nvmap) 407 if (!user->nvmap)
403 return -EFAULT; 408 return -EFAULT;
404 409
@@ -413,6 +418,21 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
413 INIT_WORK(&data->work, tegra_dc_ext_flip_worker); 418 INIT_WORK(&data->work, tegra_dc_ext_flip_worker);
414 data->ext = ext; 419 data->ext = ext;
415 420
421#ifdef CONFIG_ANDROID
422 for (i = 0; i < DC_N_WINDOWS; i++) {
423 index_check[i] = args->win[i].index;
424 if (index_check[i] == 0)
425 zero_index_id = i;
426 }
427
428 if (index_check[DC_N_WINDOWS - 1] != 0) {
429 struct tegra_dc_ext_flip_windowattr win_temp;
430 win_temp = args->win[DC_N_WINDOWS - 1];
431 args->win[DC_N_WINDOWS - 1] = args->win[zero_index_id];
432 args->win[zero_index_id] = win_temp;
433 }
434#endif
435
416 for (i = 0; i < DC_N_WINDOWS; i++) { 436 for (i = 0; i < DC_N_WINDOWS; i++) {
417 struct tegra_dc_ext_flip_win *flip_win = &data->win[i]; 437 struct tegra_dc_ext_flip_win *flip_win = &data->win[i];
418 int index = args->win[i].index; 438 int index = args->win[i].index;