diff options
author | Jon Mayo <jmayo@nvidia.com> | 2013-06-26 13:54:47 -0700 |
---|---|---|
committer | Gabby Lee <galee@nvidia.com> | 2013-07-11 16:39:46 -0700 |
commit | 2642d8b18d54a2b65d1f43a4d50b5c3aede3ede2 (patch) | |
tree | 00e26c39cbccef97bf3848e8522e927f08df952f /drivers/video | |
parent | 530ee13c90f9db1fce999d10dbe806545b350b0d (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.c | 53 |
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( |