OSDN Git Service

Merge branch 'topic/core-stuff' of git://git.freedesktop.org/git/drm-intel into drm...
authorDave Airlie <airlied@redhat.com>
Tue, 18 Mar 2014 09:23:22 +0000 (19:23 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 18 Mar 2014 09:23:22 +0000 (19:23 +1000)
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

1  2 
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_pci.c

@@@ -1098,14 -1098,10 +1098,14 @@@ EXPORT_SYMBOL(drm_edid_is_valid)
  /**
   * Get EDID information via I2C.
   *
 - * \param adapter : i2c device adaptor
 - * \param buf     : EDID data buffer to be filled
 - * \param len     : EDID data buffer length
 - * \return 0 on success or -1 on failure.
 + * @adapter : i2c device adaptor
 + * @buf: EDID data buffer to be filled
 + * @block: 128 byte EDID block to start fetching from
 + * @len: EDID data buffer length to fetch
 + *
 + * Returns:
 + *
 + * 0 on success or -1 on failure.
   *
   * Try to fetch EDID information by calling i2c driver function.
   */
  
  /**
   * Probe DDC presence.
 + * @adapter: i2c adapter to probe
 + *
 + * Returns:
   *
 - * \param adapter : i2c device adaptor
 - * \return 1 on success
 + * 1 on success
   */
  bool
  drm_probe_ddc(struct i2c_adapter *adapter)
@@@ -1592,10 -1586,8 +1592,10 @@@ bad_std_timing(u8 a, u8 b
  
  /**
   * drm_mode_std - convert standard mode info (width, height, refresh) into mode
 + * @connector: connector of for the EDID block
 + * @edid: EDID block to scan
   * @t: standard timing params
 - * @timing_level: standard timing level
 + * @revision: standard timing level
   *
   * Take the standard timing params (in this case width, aspect, and refresh)
   * and convert them into a real mode using CVT/GTF/DMT.
@@@ -2140,7 -2132,6 +2140,7 @@@ do_established_modes(struct detailed_ti
  
  /**
   * add_established_modes - get est. modes from EDID and add them
 + * @connector: connector of for the EDID block
   * @edid: EDID block to scan
   *
   * Each EDID block contains a bitmap of the supported "established modes" list
@@@ -2203,7 -2194,6 +2203,7 @@@ do_standard_modes(struct detailed_timin
  
  /**
   * add_standard_modes - get std. modes from EDID and add them
 + * @connector: connector of for the EDID block
   * @edid: EDID block to scan
   *
   * Standard modes can be calculated using the appropriate standard (DMT,
@@@ -2590,6 -2580,9 +2590,9 @@@ drm_display_mode_from_vic_index(struct 
                return NULL;
  
        newmode = drm_mode_duplicate(dev, &edid_cea_modes[cea_mode]);
+       if (!newmode)
+               return NULL;
        newmode->vrefresh = 0;
  
        return newmode;
@@@ -3310,7 -3303,6 +3313,7 @@@ EXPORT_SYMBOL(drm_detect_hdmi_monitor)
  
  /**
   * drm_detect_monitor_audio - check monitor audio capability
 + * @edid: EDID block to scan
   *
   * Monitor should have CEA extension block.
   * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
@@@ -3356,7 -3348,6 +3359,7 @@@ EXPORT_SYMBOL(drm_detect_monitor_audio)
  
  /**
   * drm_rgb_quant_range_selectable - is RGB quantization range selectable?
 + * @edid: EDID block to scan
   *
   * Check whether the monitor reports the RGB quantization range selection
   * as supported. The AVI infoframe can then be used to inform the monitor
@@@ -3576,8 -3567,8 +3579,8 @@@ void drm_set_preferred_mode(struct drm_
        struct drm_display_mode *mode;
  
        list_for_each_entry(mode, &connector->probed_modes, head) {
 -              if (drm_mode_width(mode)  == hpref &&
 -                  drm_mode_height(mode) == vpref)
 +              if (mode->hdisplay  == hpref &&
 +                  mode->vdisplay == vpref)
                        mode->type |= DRM_MODE_TYPE_PREFERRED;
        }
  }
@@@ -3611,6 -3602,7 +3614,7 @@@ drm_hdmi_avi_infoframe_from_display_mod
  
        frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
        frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
+       frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
  
        return 0;
  }
@@@ -516,6 -516,9 +516,9 @@@ int drm_fb_helper_init(struct drm_devic
        struct drm_crtc *crtc;
        int i;
  
+       if (!max_conn_count)
+               return -EINVAL;
        fb_helper->dev = dev;
  
        INIT_LIST_HEAD(&fb_helper->kernel_fb_list);
@@@ -809,8 -812,6 +812,6 @@@ int drm_fb_helper_set_par(struct fb_inf
        struct drm_fb_helper *fb_helper = info->par;
        struct drm_device *dev = fb_helper->dev;
        struct fb_var_screeninfo *var = &info->var;
-       int ret;
-       int i;
  
        if (var->pixclock != 0) {
                DRM_ERROR("PIXEL CLOCK SET\n");
        }
  
        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);
  
        if (fb_helper->delayed_hotplug) {
@@@ -1136,20 -1131,19 +1131,20 @@@ static int drm_fb_helper_probe_connecto
        return count;
  }
  
 -static struct drm_display_mode *drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, int width, int height)
 +struct drm_display_mode *drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, int width, int height)
  {
        struct drm_display_mode *mode;
  
        list_for_each_entry(mode, &fb_connector->connector->modes, head) {
 -              if (drm_mode_width(mode) > width ||
 -                  drm_mode_height(mode) > height)
 +              if (mode->hdisplay > width ||
 +                  mode->vdisplay > height)
                        continue;
                if (mode->type & DRM_MODE_TYPE_PREFERRED)
                        return mode;
        }
        return NULL;
  }
 +EXPORT_SYMBOL(drm_has_preferred_mode);
  
  static bool drm_has_cmdline_mode(struct drm_fb_helper_connector *fb_connector)
  {
        return cmdline_mode->specified;
  }
  
 -static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
 +struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
                                                      int width, int height)
  {
        struct drm_cmdline_mode *cmdline_mode;
@@@ -1198,7 -1192,6 +1193,7 @@@ create_mode
        list_add(&mode->head, &fb_helper_conn->connector->modes);
        return mode;
  }
 +EXPORT_SYMBOL(drm_pick_cmdline_mode);
  
  static bool drm_connector_enabled(struct drm_connector *connector, bool strict)
  {
@@@ -351,7 -351,7 +351,7 @@@ err_agp
        drm_pci_agp_destroy(dev);
        pci_disable_device(pdev);
  err_free:
 -      drm_dev_free(dev);
 +      drm_dev_unref(dev);
        return ret;
  }
  EXPORT_SYMBOL(drm_get_pci_dev);
@@@ -468,8 -468,8 +468,8 @@@ void drm_pci_exit(struct drm_driver *dr
        } else {
                list_for_each_entry_safe(dev, tmp, &driver->legacy_dev_list,
                                         legacy_dev_list) {
-                       drm_put_dev(dev);
                        list_del(&dev->legacy_dev_list);
+                       drm_put_dev(dev);
                }
        }
        DRM_INFO("Module unloaded\n");