summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorJon Mayo <jmayo@nvidia.com>2013-06-26 13:54:47 -0700
committerGabby Lee <galee@nvidia.com>2013-07-11 16:39:46 -0700
commit2642d8b18d54a2b65d1f43a4d50b5c3aede3ede2 (patch)
tree00e26c39cbccef97bf3848e8522e927f08df952f /drivers/video
parent530ee13c90f9db1fce999d10dbe806545b350b0d (diff)
video: tegra: dc: rewrite bandwidth formula
Take vertical scaling into account when calculating a window's bandwidth, if the window supports filtering. Change-Id: Ie0816706322699c3c48bdde31372928972412b74 Signed-off-by: Jon Mayo <jmayo@nvidia.com> Reviewed-on: http://git-master/r/242567 (cherry picked from commit 0bf3d1ea973a062f0017b26a28d1804dccf9d7e4) Reviewed-on: http://git-master/r/247514 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Min-wuk Lee <mlee@nvidia.com> Reviewed-by: Youngjin Kim <nkim@nvidia.com> Tested-by: Harry Hong <hhong@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Gabby Lee <galee@nvidia.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/tegra/dc/bandwidth.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/drivers/video/tegra/dc/bandwidth.c b/drivers/video/tegra/dc/bandwidth.c
index 789f7f03facf..4989ba4d096c 100644
--- a/drivers/video/tegra/dc/bandwidth.c
+++ b/drivers/video/tegra/dc/bandwidth.c
@@ -174,23 +174,28 @@ static unsigned long tegra_dc_find_max_bandwidth(struct tegra_dc_win *wins[],
static unsigned long tegra_dc_calc_win_bandwidth(struct tegra_dc *dc,
struct tegra_dc_win *w)
{
- unsigned long ret;
- int tiled_windows_bw_multiplier;
- unsigned long bpp;
unsigned in_w;
+ unsigned in_h;
+ unsigned bpp;
+ unsigned long f_w;
+ unsigned long f_h;
+ unsigned long bw;
+ int tiled_windows_bw_multiplier;
- if (!WIN_IS_ENABLED(w))
+ /* ignore windows that are off or invalid */
+ if (!WIN_IS_ENABLED(w) || dfixed_trunc(w->w) == 0 ||
+ dfixed_trunc(w->h) == 0 || w->out_w == 0 || w->out_h == 0)
return 0;
- if (dfixed_trunc(w->w) == 0 || dfixed_trunc(w->h) == 0 ||
- w->out_w == 0 || w->out_h == 0)
- return 0;
- if (w->flags & TEGRA_WIN_FLAG_SCAN_COLUMN)
- /* rotated: PRESCALE_SIZE swapped, but WIN_SIZE is unchanged */
+ if (w->flags & TEGRA_WIN_FLAG_SCAN_COLUMN) {
+ /* rotated : prescaled size is swapped */
in_w = dfixed_trunc(w->h);
- else
- in_w = dfixed_trunc(w->w); /* normal output, not rotated */
-
+ in_h = dfixed_trunc(w->w);
+ } else {
+ /* normal */
+ in_w = dfixed_trunc(w->w);
+ in_h = dfixed_trunc(w->h);
+ }
tiled_windows_bw_multiplier =
tegra_mc_get_tiled_memory_bandwidth_multiplier();
@@ -199,14 +204,28 @@ static unsigned long tegra_dc_calc_win_bandwidth(struct tegra_dc *dc,
* is of the luma plane's size only. */
bpp = tegra_dc_is_yuv_planar(w->fmt) ?
2 * tegra_dc_fmt_bpp(w->fmt) : tegra_dc_fmt_bpp(w->fmt);
- ret = dc->mode.pclk / 1000UL * bpp / 8 *
+
+ bw = dc->mode.pclk / 1000UL * bpp / 8;
+
+ if (WIN_IS_TILED(w))
+ bw *= tiled_windows_bw_multiplier;
+
#if defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
- (win_use_v_filter(dc, w) ? 2 : 1) *
+ if (win_use_v_filter(dc, w))
+ bw *= 2;
#endif
- in_w / w->out_w * (WIN_IS_TILED(w) ?
- tiled_windows_bw_multiplier : 1);
- return ret;
+ /* calculate H & V scaling factor. treat upscaling as 1.00 */
+ f_w = max(in_w * 100 / w->out_w, 100u);
+ f_h = max(in_h * 100 / w->out_h, 100u);
+ bw *= f_w;
+ bw /= 100;
+ if (win_use_v_filter(dc, w)) {
+ bw *= f_h;
+ bw /= 100;
+ }
+
+ return bw;
}
static unsigned long tegra_dc_get_bandwidth(