| From 14e2b8a2e963c015372733d3d0950384ee5fa4fb Mon Sep 17 00:00:00 2001 |
| From: Aaron Lu <aaron.lu@intel.com> |
| Date: Fri, 2 Aug 2013 09:16:03 +0800 |
| Subject: drm/i915: avoid brightness overflow when doing scale |
| |
| Some card's max brightness level is pretty large, e.g. on Acer Aspire |
| 4732Z, the max level is 989910. If user space set a large enough level |
| then the current scale done in intel_panel_set_backlight will cause an |
| integer overflow and the scaled level will be mistakenly small, leaving |
| user with an almost black screen. This patch fixes this problem. |
| |
| Signed-off-by: Aaron Lu <aaron.lu@intel.com> |
| [danvet: Add a comment to explain what's going on.] |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| (cherry picked from commit 22505b82a2800bddb67908522833bef96dd15845) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_panel.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c |
| index 67e2c1f1c9a8..5063eadac3ef 100644 |
| --- a/drivers/gpu/drm/i915/intel_panel.c |
| +++ b/drivers/gpu/drm/i915/intel_panel.c |
| @@ -497,8 +497,11 @@ void intel_panel_set_backlight(struct drm_device *dev, u32 level, u32 max) |
| goto out; |
| } |
| |
| - /* scale to hardware */ |
| - level = level * freq / max; |
| + /* scale to hardware, but be careful to not overflow */ |
| + if (freq < max) |
| + level = level * freq / max; |
| + else |
| + level = freq / max * level; |
| |
| dev_priv->backlight.level = level; |
| if (dev_priv->backlight.device) |
| -- |
| 1.8.5.rc3 |
| |