diff options
author | Min-wuk Lee <mlee@nvidia.com> | 2012-02-14 11:21:05 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:02:06 -0400 |
commit | 9e25c06e5572bf0415dbd5f63b1fad06933f4ee9 (patch) | |
tree | 4333a664176a1d3f325209731e1d0f9fb4e0879d /drivers/video | |
parent | e2bd5f47ded59980885adfcea38eef7bbad86bf8 (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.c | 22 |
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; |