aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/gma500
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2012-01-12 09:40:12 -0500
committerDave Airlie <airlied@redhat.com>2012-01-13 04:02:06 -0500
commit9f821c675a389cf4aab7f1dc8ee0860fba4f3204 (patch)
tree5c4dde154e229e235da1d91624aba163d9c88cb6 /drivers/gpu/drm/gma500
parentafe887df1c3806da98d4edfeef7794d11eb0fe16 (diff)
gma500: Discard modes that don't fit in stolen memory
[This fixes a crash on boot if the system is plugged into an HDTV so it's probably appropriate to push even though it didn't make the window. We could be cleverer about this but the simple version seems to be the safe one] From: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> At the moment we cannot allocate more than stolen memory size for framebuffers. To get around that issues we discard modes that doesn't fit. This is a temporary solution until we can freely allocate framebuffer memory. [Currently the framebuffer needs to be linear in kernel space due to limits in the kernel fb layer - AC] Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/gma500')
-rw-r--r--drivers/gpu/drm/gma500/cdv_intel_crt.c6
-rw-r--r--drivers/gpu/drm/gma500/cdv_intel_hdmi.c14
-rw-r--r--drivers/gpu/drm/gma500/oaktrail_hdmi.c6
-rw-r--r--drivers/gpu/drm/gma500/psb_intel_sdvo.c6
4 files changed, 24 insertions, 8 deletions
diff --git a/drivers/gpu/drm/gma500/cdv_intel_crt.c b/drivers/gpu/drm/gma500/cdv_intel_crt.c
index 6d0f10b7569..c100f3e9c92 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_crt.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_crt.c
@@ -66,6 +66,7 @@ static void cdv_intel_crt_dpms(struct drm_encoder *encoder, int mode)
66static int cdv_intel_crt_mode_valid(struct drm_connector *connector, 66static int cdv_intel_crt_mode_valid(struct drm_connector *connector,
67 struct drm_display_mode *mode) 67 struct drm_display_mode *mode)
68{ 68{
69 struct drm_psb_private *dev_priv = connector->dev->dev_private;
69 int max_clock = 0; 70 int max_clock = 0;
70 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 71 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
71 return MODE_NO_DBLESCAN; 72 return MODE_NO_DBLESCAN;
@@ -82,6 +83,11 @@ static int cdv_intel_crt_mode_valid(struct drm_connector *connector,
82 if (mode->hdisplay > 1680 || mode->vdisplay > 1050) 83 if (mode->hdisplay > 1680 || mode->vdisplay > 1050)
83 return MODE_PANEL; 84 return MODE_PANEL;
84 85
86 /* We assume worst case scenario of 32 bpp here, since we don't know */
87 if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
88 dev_priv->vram_stolen_size)
89 return MODE_MEM;
90
85 return MODE_OK; 91 return MODE_OK;
86} 92}
87 93
diff --git a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
index 50d7cfb5166..de25560e629 100644
--- a/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
+++ b/drivers/gpu/drm/gma500/cdv_intel_hdmi.c
@@ -241,6 +241,7 @@ static int cdv_hdmi_get_modes(struct drm_connector *connector)
241static int cdv_hdmi_mode_valid(struct drm_connector *connector, 241static int cdv_hdmi_mode_valid(struct drm_connector *connector,
242 struct drm_display_mode *mode) 242 struct drm_display_mode *mode)
243{ 243{
244 struct drm_psb_private *dev_priv = connector->dev->dev_private;
244 245
245 if (mode->clock > 165000) 246 if (mode->clock > 165000)
246 return MODE_CLOCK_HIGH; 247 return MODE_CLOCK_HIGH;
@@ -255,14 +256,11 @@ static int cdv_hdmi_mode_valid(struct drm_connector *connector,
255 if (mode->flags & DRM_MODE_FLAG_INTERLACE) 256 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
256 return MODE_NO_INTERLACE; 257 return MODE_NO_INTERLACE;
257 258
258 /* 259 /* We assume worst case scenario of 32 bpp here, since we don't know */
259 * FIXME: for now we limit the size to 1680x1050 on CDV, otherwise it 260 if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
260 * will go beyond the stolen memory size allocated to the framebuffer 261 dev_priv->vram_stolen_size)
261 */ 262 return MODE_MEM;
262 if (mode->hdisplay > 1680) 263
263 return MODE_PANEL;
264 if (mode->vdisplay > 1050)
265 return MODE_PANEL;
266 return MODE_OK; 264 return MODE_OK;
267} 265}
268 266
diff --git a/drivers/gpu/drm/gma500/oaktrail_hdmi.c b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
index 36878a60080..025d30970cc 100644
--- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c
+++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c
@@ -506,6 +506,7 @@ int oaktrail_crtc_hdmi_mode_set(struct drm_crtc *crtc,
506static int oaktrail_hdmi_mode_valid(struct drm_connector *connector, 506static int oaktrail_hdmi_mode_valid(struct drm_connector *connector,
507 struct drm_display_mode *mode) 507 struct drm_display_mode *mode)
508{ 508{
509 struct drm_psb_private *dev_priv = connector->dev->dev_private;
509 if (mode->clock > 165000) 510 if (mode->clock > 165000)
510 return MODE_CLOCK_HIGH; 511 return MODE_CLOCK_HIGH;
511 if (mode->clock < 20000) 512 if (mode->clock < 20000)
@@ -514,6 +515,11 @@ static int oaktrail_hdmi_mode_valid(struct drm_connector *connector,
514 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 515 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
515 return MODE_NO_DBLESCAN; 516 return MODE_NO_DBLESCAN;
516 517
518 /* We assume worst case scenario of 32 bpp here, since we don't know */
519 if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
520 dev_priv->vram_stolen_size)
521 return MODE_MEM;
522
517 return MODE_OK; 523 return MODE_OK;
518} 524}
519 525
diff --git a/drivers/gpu/drm/gma500/psb_intel_sdvo.c b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
index 4882b29119e..88b42971c0f 100644
--- a/drivers/gpu/drm/gma500/psb_intel_sdvo.c
+++ b/drivers/gpu/drm/gma500/psb_intel_sdvo.c
@@ -1141,6 +1141,7 @@ static void psb_intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
1141static int psb_intel_sdvo_mode_valid(struct drm_connector *connector, 1141static int psb_intel_sdvo_mode_valid(struct drm_connector *connector,
1142 struct drm_display_mode *mode) 1142 struct drm_display_mode *mode)
1143{ 1143{
1144 struct drm_psb_private *dev_priv = connector->dev->dev_private;
1144 struct psb_intel_sdvo *psb_intel_sdvo = intel_attached_sdvo(connector); 1145 struct psb_intel_sdvo *psb_intel_sdvo = intel_attached_sdvo(connector);
1145 1146
1146 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 1147 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
@@ -1160,6 +1161,11 @@ static int psb_intel_sdvo_mode_valid(struct drm_connector *connector,
1160 return MODE_PANEL; 1161 return MODE_PANEL;
1161 } 1162 }
1162 1163
1164 /* We assume worst case scenario of 32 bpp here, since we don't know */
1165 if ((ALIGN(mode->hdisplay * 4, 64) * mode->vdisplay) >
1166 dev_priv->vram_stolen_size)
1167 return MODE_MEM;
1168
1163 return MODE_OK; 1169 return MODE_OK;
1164} 1170}
1165 1171