diff options
author | Jon Mayo <jmayo@nvidia.com> | 2011-04-28 20:25:13 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:45:01 -0800 |
commit | 82578154b77686fc37f2dd286a920cf35f9119fb (patch) | |
tree | d4d6c0d187cd004ac18e1adb400db09f61d5fc2f /drivers/video/tegra/fb.c | |
parent | 73b39952d3b2c5ed685acdf9232c2b421789921e (diff) |
ARM: tegra: dc: clip invalid windows to screen res
clip invalid windows to fix screen size, failure to do so causes display
errors that result in corrupted display and invalid video modes.
prints a warning only once, if this warning is present in the logs then
there is a misbehaving application.
Bug 821094
Original-Change-Id: Ief7b6379026e6abeb31a28aabf920618edd7ab44
Reviewed-on: http://git-master/r/29759
Reviewed-by: Jonathan Mayo <jmayo@nvidia.com>
Tested-by: Jonathan Mayo <jmayo@nvidia.com>
Reviewed-by: Yu-Huan Hsu <yhsu@nvidia.com>
Rebase-Id: Rbbd1c33e5d4b58b5ddc8a4910b6851dc9bb73d63
Diffstat (limited to 'drivers/video/tegra/fb.c')
-rw-r--r-- | drivers/video/tegra/fb.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c index 2872757e7274..4f618179c9fb 100644 --- a/drivers/video/tegra/fb.c +++ b/drivers/video/tegra/fb.c @@ -401,15 +401,28 @@ static int tegra_fb_set_windowattr(struct tegra_fb_info *tegra_fb, win->out_w = flip_win->attr.out_w; win->out_h = flip_win->attr.out_h; - if ((((win->out_x + win->out_w) > xres) && (win->out_x < xres)) || - (((win->out_y + win->out_h) > yres) && (win->out_y < yres))) { - pr_warning("outside of FB: " - "FB=(%d,%d,%d,%d) " - "src=(%d,%d,%d,%d) ", - "dst=(%d,%d,%d,%d)", - 0, 0, xres, yres, - win->x, win->y, win->w, win->h, - win->out_x, win->out_y, win->out_w, win->out_h); + WARN_ONCE(win->out_x >= xres, + "%s:application window x offset exceeds display width(%d)\n", + dev_name(&win->dc->ndev->dev), win->out_x, xres); + WARN_ONCE(win->out_y >= yres, + "%s:application window y offset exceeds display height(%d)\n", + dev_name(&win->dc->ndev->dev), win->out_y, yres); + WARN_ONCE(win->out_x + win->out_w > xres && win->out_x < xres, + "%s:application window width(%d) exceeds display width(%d)\n", + dev_name(&win->dc->ndev->dev), win->out_x + win->out_w, xres); + WARN_ONCE(win->out_y + win->out_h > yres && win->out_y < yres, + "%s:application window height(%d) exceeds display height(%d)\n", + dev_name(&win->dc->ndev->dev), win->out_y + win->out_h, yres); + + if (((win->out_x + win->out_w) > xres) && (win->out_x < xres)) { + long new_w = xres - win->out_x; + win->w = win->w * new_w / win->out_w; + win->out_w = new_w; + } + if (((win->out_y + win->out_h) > yres) && (win->out_y < yres)) { + long new_h = yres - win->out_y; + win->h = win->h * new_h / win->out_h; + win->out_h = new_h; } win->z = flip_win->attr.z; |