瀏覽代碼

Merge branch 'topic/core-stuff' of git://git.freedesktop.org/git/drm-intel into drm-next

Merge straggling core drm patches.

* 'topic/core-stuff' of git://git.freedesktop.org/git/drm-intel:
  drm: Fix use-after-free in the shadow-attache exit code
  drm/fb-helper: Do the 'max_conn_count' zero check
  drm: Check if the allocation has succeeded before dereferencing newmode
  drm/fb-helper: Use drm_fb_helper_restore_fbdev_mode() in drm_fb_helper_set_par()
  drm/edid: request HDMI underscan by default
Dave Airlie 11 年之前
父節點
當前提交
5a08c07526
共有 3 個文件被更改,包括 9 次插入10 次删除
  1. 4 0
      drivers/gpu/drm/drm_edid.c
  2. 4 9
      drivers/gpu/drm/drm_fb_helper.c
  3. 1 1
      drivers/gpu/drm/drm_pci.c

+ 4 - 0
drivers/gpu/drm/drm_edid.c

@@ -2590,6 +2590,9 @@ drm_display_mode_from_vic_index(struct drm_connector *connector,
 		return NULL;
 		return NULL;
 
 
 	newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
 	newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
+	if (!newmode)
+		return NULL;
+
 	newmode->vrefresh = 0;
 	newmode->vrefresh = 0;
 
 
 	return newmode;
 	return newmode;
@@ -3611,6 +3614,7 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
 
 
 	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
 	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
 	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
 	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
+	frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
 
 
 	return 0;
 	return 0;
 }
 }

+ 4 - 9
drivers/gpu/drm/drm_fb_helper.c

@@ -516,6 +516,9 @@ int drm_fb_helper_init(struct drm_device *dev,
 	struct drm_crtc *crtc;
 	struct drm_crtc *crtc;
 	int i;
 	int i;
 
 
+	if (!max_conn_count)
+		return -EINVAL;
+
 	fb_helper->dev = dev;
 	fb_helper->dev = dev;
 
 
 	INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
 	INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
@@ -809,8 +812,6 @@ int drm_fb_helper_set_par(struct fb_info *info)
 	struct drm_fb_helper *fb_helper = info->par;
 	struct drm_fb_helper *fb_helper = info->par;
 	struct drm_device *dev = fb_helper->dev;
 	struct drm_device *dev = fb_helper->dev;
 	struct fb_var_screeninfo *var = &info->var;
 	struct fb_var_screeninfo *var = &info->var;
-	int ret;
-	int i;
 
 
 	if (var->pixclock != 0) {
 	if (var->pixclock != 0) {
 		DRM_ERROR("PIXEL CLOCK SET\n");
 		DRM_ERROR("PIXEL CLOCK SET\n");
@@ -818,13 +819,7 @@ int drm_fb_helper_set_par(struct fb_info *info)
 	}
 	}
 
 
 	drm_modeset_lock_all(dev);
 	drm_modeset_lock_all(dev);
-	for (i = 0; i < fb_helper->crtc_count; i++) {
-		ret = drm_mode_set_config_internal(&fb_helper->crtc_info[i].mode_set);
-		if (ret) {
-			drm_modeset_unlock_all(dev);
-			return ret;
-		}
-	}
+	drm_fb_helper_restore_fbdev_mode(fb_helper);
 	drm_modeset_unlock_all(dev);
 	drm_modeset_unlock_all(dev);
 
 
 	if (fb_helper->delayed_hotplug) {
 	if (fb_helper->delayed_hotplug) {

+ 1 - 1
drivers/gpu/drm/drm_pci.c

@@ -468,8 +468,8 @@ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver)
 	} else {
 	} else {
 		list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list,
 		list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list,
 					 legacy_dev_list) {
 					 legacy_dev_list) {
-			drm_put_dev(dev);
 			list_del(&dev->legacy_dev_list);
 			list_del(&dev->legacy_dev_list);
+			drm_put_dev(dev);
 		}
 		}
 	}
 	}
 	DRM_INFO("Module unloaded\n");
 	DRM_INFO("Module unloaded\n");