summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMichael Frydrych <mfrydrych@nvidia.com>2013-11-29 12:11:58 +0200
committerHarry Hong <hhong@nvidia.com>2014-01-08 16:42:26 -0800
commitf08b3a1c970f72c6978979936d117b694ecaeba6 (patch)
tree1c5fc0ab266d929cfb3dde503ffdaa394bd87b9a /drivers
parenta9de415fa54f1cef805b69e5a07b7455b74afe84 (diff)
video: tegra: Fix filtering with SCAN_COLUMN on
When SCAN_COLUMN is enabled, swap input width and height when deciding if filter needs to be turned on for respective dimension. Bug 1413155 Change-Id: I9d6048e567fbbbb90a27b27cb66418be9ecc9bfc Signed-off-by: Michael Frydrych <mfrydrych@nvidia.com> Reviewed-on: http://git-master/r/350551 Reviewed-by: Harry Hong <hhong@nvidia.com> Tested-by: Harry Hong <hhong@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/tegra/dc/bandwidth.c6
-rw-r--r--drivers/video/tegra/dc/dc_config.h25
-rw-r--r--drivers/video/tegra/dc/window.c7
3 files changed, 26 insertions, 12 deletions
diff --git a/drivers/video/tegra/dc/bandwidth.c b/drivers/video/tegra/dc/bandwidth.c
index 4989ba4d096c..181ae5a31af7 100644
--- a/drivers/video/tegra/dc/bandwidth.c
+++ b/drivers/video/tegra/dc/bandwidth.c
@@ -66,7 +66,7 @@ static void tegra_dc_set_latency_allowance(struct tegra_dc *dc,
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
/* tegra_dc_get_bandwidth() treats V filter windows as double
* bandwidth, but LA has a seperate client for V filter */
- if (w->idx == 1 && win_use_v_filter(dc, w))
+ if (w->idx == 1 && win_use_v_filter(dc, w, false))
bw /= 2;
#endif
@@ -211,7 +211,7 @@ static unsigned long tegra_dc_calc_win_bandwidth(struct tegra_dc *dc,
bw *= tiled_windows_bw_multiplier;
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
- if (win_use_v_filter(dc, w))
+ if (win_use_v_filter(dc, w, false))
bw *= 2;
#endif
@@ -220,7 +220,7 @@ static unsigned long tegra_dc_calc_win_bandwidth(struct tegra_dc *dc,
f_h = max(in_h * 100 / w->out_h, 100u);
bw *= f_w;
bw /= 100;
- if (win_use_v_filter(dc, w)) {
+ if (win_use_v_filter(dc, w, w->flags & TEGRA_WIN_FLAG_SCAN_COLUMN)) {
bw *= f_h;
bw /= 100;
}
diff --git a/drivers/video/tegra/dc/dc_config.h b/drivers/video/tegra/dc/dc_config.h
index 0ef076c2d3e1..19cc71accc49 100644
--- a/drivers/video/tegra/dc/dc_config.h
+++ b/drivers/video/tegra/dc/dc_config.h
@@ -1,6 +1,7 @@
/*
* drivers/video/tegra/dc/dc_config.c
- * Copyright (c) 2010-2012, NVIDIA CORPORATION, All rights reserved.
+ *
+ * Copyright (c) 2010-2013, NVIDIA CORPORATION, All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -156,16 +157,26 @@ long *tegra_dc_parse_feature(struct tegra_dc *dc, int win_idx, int operation);
void tegra_dc_feature_register(struct tegra_dc *dc);
static inline bool win_use_v_filter(struct tegra_dc *dc,
- const struct tegra_dc_win *win)
+ const struct tegra_dc_win *win, bool scan_column)
{
- return tegra_dc_feature_has_filter(dc, win->idx, HAS_V_FILTER) &&
- win->h.full != dfixed_const(win->out_h);
+ int has_filter;
+
+ has_filter = tegra_dc_feature_has_filter(dc, win->idx, HAS_V_FILTER);
+ if (scan_column)
+ return has_filter && win->w.full != dfixed_const(win->out_h);
+ else
+ return has_filter && win->h.full != dfixed_const(win->out_h);
}
static inline bool win_use_h_filter(struct tegra_dc *dc,
- const struct tegra_dc_win *win)
+ const struct tegra_dc_win *win, bool scan_column)
{
- return tegra_dc_feature_has_filter(dc, win->idx, HAS_H_FILTER) &&
- win->w.full != dfixed_const(win->out_w);
+ int has_filter;
+
+ has_filter = tegra_dc_feature_has_filter(dc, win->idx, HAS_H_FILTER);
+ if (scan_column)
+ return has_filter && win->h.full != dfixed_const(win->out_w);
+ else
+ return has_filter && win->w.full != dfixed_const(win->out_w);
}
#endif
diff --git a/drivers/video/tegra/dc/window.c b/drivers/video/tegra/dc/window.c
index 58113ab652cb..987797aaa2a0 100644
--- a/drivers/video/tegra/dc/window.c
+++ b/drivers/video/tegra/dc/window.c
@@ -364,8 +364,8 @@ int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n)
unsigned Bpp = tegra_dc_fmt_bpp(win->fmt) / 8;
/* Bytes per pixel of bandwidth, used for dda_inc calculation */
unsigned Bpp_bw = Bpp * (yuvp ? 2 : 1);
- const bool filter_h = win_use_h_filter(dc, win);
- const bool filter_v = win_use_v_filter(dc, win);
+ bool filter_h;
+ bool filter_v;
#if defined(CONFIG_TEGRA_DC_SCAN_COLUMN)
scan_column = (win->flags & TEGRA_WIN_FLAG_SCAN_COLUMN);
#endif
@@ -395,6 +395,9 @@ int tegra_dc_update_windows(struct tegra_dc_win *windows[], int n)
continue;
}
+ filter_h = win_use_h_filter(dc, win, scan_column);
+ filter_v = win_use_v_filter(dc, win, scan_column);
+
tegra_dc_writel(dc, tegra_dc_fmt(win->fmt),
DC_WIN_COLOR_DEPTH);
tegra_dc_writel(dc, tegra_dc_fmt_byteorder(win->fmt),