summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/ext
diff options
context:
space:
mode:
authorMin-wuk Lee <mlee@nvidia.com>2012-02-15 01:21:05 +0900
committerSimone Willett <swillett@nvidia.com>2012-02-17 15:54:49 -0800
commitaea522fcad415cf7a940e05a323751c26cca21d3 (patch)
tree4e3dd613207783fa6021d33d2695f4e8fe0a2f04 /drivers/video/tegra/dc/ext
parent13829c1be066826ddeb0190474077826139e9c27 (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>
Diffstat (limited to 'drivers/video/tegra/dc/ext')
-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 a0d0949f27a7..24e62ca15a72 100644
--- a/drivers/video/tegra/dc/ext/dev.c
+++ b/drivers/video/tegra/dc/ext/dev.c
@@ -1,7 +1,7 @@
/*
* drivers/video/tegra/dc/dev.c
*
- * Copyright (C) 2011, NVIDIA Corporation
+ * Copyright (C) 2011-2012, NVIDIA Corporation
*
* Author: Robert Morell <rmorell@nvidia.com>
* Some code based on fbdev extensions written by:
@@ -398,6 +398,11 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
int work_index;
int i, ret = 0;
+#ifdef CONFIG_ANDROID
+ int index_check[DC_N_WINDOWS] = {0, };
+ int zero_index_id = 0;
+#endif
+
if (!user->nvmap)
return -EFAULT;
@@ -412,6 +417,21 @@ static int tegra_dc_ext_flip(struct tegra_dc_ext_user *user,
INIT_WORK(&data->work, tegra_dc_ext_flip_worker);
data->ext = ext;
+#ifdef CONFIG_ANDROID
+ for (i = 0; i < DC_N_WINDOWS; i++) {
+ index_check[i] = args->win[i].index;
+ if (index_check[i] == 0)
+ zero_index_id = i;
+ }
+
+ if (index_check[DC_N_WINDOWS - 1] != 0) {
+ struct tegra_dc_ext_flip_windowattr win_temp;
+ win_temp = args->win[DC_N_WINDOWS - 1];
+ args->win[DC_N_WINDOWS - 1] = args->win[zero_index_id];
+ args->win[zero_index_id] = win_temp;
+ }
+#endif
+
for (i = 0; i < DC_N_WINDOWS; i++) {
struct tegra_dc_ext_flip_win *flip_win = &data->win[i];
int index = args->win[i].index;