]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge tag 'topic/core-stuff-2014-06-30' of git://anongit.freedesktop.org/drm-intel...
authorDave Airlie <airlied@redhat.com>
Tue, 8 Jul 2014 01:04:35 +0000 (11:04 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 8 Jul 2014 01:04:35 +0000 (11:04 +1000)
misc core patches picked up by Daniel and Jani.

* tag 'topic/core-stuff-2014-06-30' of git://anongit.freedesktop.org/drm-intel:
  drm/fb-helper: Remove unnecessary list empty check in drm_fb_helper_debug_enter()
  drm/fb-helper: Redundant info->fix.type_aux setting in drm_fb_helper_fill_fix()
  drm/debugfs: add an "edid_override" file per connector
  drm/debugfs: add a "force" file per connector
  drm: add register and unregister functions for connectors
  drm: fix uninitialized acquire_ctx fields (v2)
  drm: Driver-specific ioctls range from 0x40 to 0x9f
  drm: Don't export internal module variables

1  2 
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/msm/hdmi/hdmi_connector.c
drivers/gpu/drm/radeon/radeon_connectors.c

index 9e530f205ad2244f13fdea07e6ec1b322f94550a,4693531ebd48b699cc51a5b58c6692516fa6bd31..3aa1c7ebbfcc34111b5a1d65dd5d1b9fb3885d26
@@@ -40,7 -40,7 +40,7 @@@ exynos_dpi_detect(struct drm_connector 
  {
        struct exynos_dpi *ctx = connector_to_dpi(connector);
  
 -      if (!ctx->panel->connector)
 +      if (ctx->panel && !ctx->panel->connector)
                drm_panel_attach(ctx->panel, &ctx->connector);
  
        return connector_status_connected;
@@@ -48,7 -48,7 +48,7 @@@
  
  static void exynos_dpi_connector_destroy(struct drm_connector *connector)
  {
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
  }
  
@@@ -117,7 -117,7 +117,7 @@@ static int exynos_dpi_create_connector(
        }
  
        drm_connector_helper_add(connector, &exynos_dpi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
  
        return 0;
index ab7d182063c3aef8699e0d3322cd9af5dbeeaacd,ddb5003f67f5583b05a8539137d32ba9341a8d26..d82e3cb8a70db37a99eb41863cdf2adc1b9f1084
@@@ -39,8 -39,6 +39,6 @@@
  #define DRIVER_MAJOR  1
  #define DRIVER_MINOR  0
  
- #define VBLANK_OFF_DELAY      50000
  static struct platform_device *exynos_drm_pdev;
  
  static DEFINE_MUTEX(drm_component_lock);
@@@ -103,8 -101,6 +101,6 @@@ static int exynos_drm_load(struct drm_d
        /* setup possible_clones. */
        exynos_drm_encoder_setup(dev);
  
-       drm_vblank_offdelay = VBLANK_OFF_DELAY;
        platform_set_drvdata(dev->platformdev, dev);
  
        /* Try to bind all sub drivers. */
@@@ -765,24 -761,24 +761,24 @@@ static int exynos_drm_init(void
  
        return 0;
  
 -err_unregister_pd:
 -      platform_device_unregister(exynos_drm_pdev);
 -
  err_remove_vidi:
  #ifdef CONFIG_DRM_EXYNOS_VIDI
        exynos_drm_remove_vidi();
 +
 +err_unregister_pd:
  #endif
 +      platform_device_unregister(exynos_drm_pdev);
  
        return ret;
  }
  
  static void exynos_drm_exit(void)
  {
 +      platform_driver_unregister(&exynos_drm_platform_driver);
  #ifdef CONFIG_DRM_EXYNOS_VIDI
        exynos_drm_remove_vidi();
  #endif
        platform_device_unregister(exynos_drm_pdev);
 -      platform_driver_unregister(&exynos_drm_platform_driver);
  }
  
  module_init(exynos_drm_init);
index 06cde4506278504fa3cbca2d1bb4ddc91abb5c77,fca4b98c4077df2ec56c05ec160e8fb9992f526d..02f3b3dcb9f8edc5219a356460f6d5e532c98d24
@@@ -40,8 -40,6 +40,6 @@@ struct drm_device
  struct exynos_drm_overlay;
  struct drm_connector;
  
- extern unsigned int drm_vblank_offdelay;
  /* This enumerates device type. */
  enum exynos_drm_device_type {
        EXYNOS_DEVICE_TYPE_NONE,
@@@ -343,7 -341,7 +341,7 @@@ struct exynos_drm_display * exynos_dpi_
  int exynos_dpi_remove(struct device *dev);
  #else
  static inline struct exynos_drm_display *
 -exynos_dpi_probe(struct device *dev) { return 0; }
 +exynos_dpi_probe(struct device *dev) { return NULL; }
  static inline int exynos_dpi_remove(struct device *dev) { return 0; }
  #endif
  
index aa259b0a873a18e09701ad7b44391199fb8e4bec,dd565c4e5b4d6adff67b7de022d5dff9dbf4ac00..81df11d5767360ed0fd319d481bb1a85fe7b31f0
@@@ -1129,7 -1129,7 +1129,7 @@@ static int hdmi_create_connector(struc
        }
  
        drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
        drm_mode_connector_attach_encoder(connector, encoder);
  
        return 0;
  
  static void hdmi_dpms(struct exynos_drm_display *display, int mode)
  {
 +      struct hdmi_context *hdata = display->ctx;
 +      struct drm_encoder *encoder = hdata->encoder;
 +      struct drm_crtc *crtc = encoder->crtc;
 +      struct drm_crtc_helper_funcs *funcs = NULL;
 +
        DRM_DEBUG_KMS("mode %d\n", mode);
  
        switch (mode) {
        case DRM_MODE_DPMS_STANDBY:
        case DRM_MODE_DPMS_SUSPEND:
        case DRM_MODE_DPMS_OFF:
 +              /*
 +               * The SFRs of VP and Mixer are updated by Vertical Sync of
 +               * Timing generator which is a part of HDMI so the sequence
 +               * to disable TV Subsystem should be as following,
 +               *      VP -> Mixer -> HDMI
 +               *
 +               * Below codes will try to disable Mixer and VP(if used)
 +               * prior to disabling HDMI.
 +               */
 +              if (crtc)
 +                      funcs = crtc->helper_private;
 +              if (funcs && funcs->dpms)
 +                      (*funcs->dpms)(crtc, mode);
 +
                hdmi_poweroff(display);
                break;
        default:
index 556c916dbf9d26ebea62b648dbcdd379674e82ab,dbabaec6ae2dcf0a95053e3d971cf6aeed51faa2..1112d9ecc226c480252183866e2eb9268514531c
@@@ -2087,7 -2087,6 +2087,7 @@@ void intel_flush_primary_plane(struct d
  static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,
                                          enum plane plane, enum pipe pipe)
  {
 +      struct drm_device *dev = dev_priv->dev;
        struct intel_crtc *intel_crtc =
                to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
        int reg;
  
        I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
        intel_flush_primary_plane(dev_priv, plane);
 +
 +      /*
 +       * BDW signals flip done immediately if the plane
 +       * is disabled, even if the plane enable is already
 +       * armed to occur at the next vblank :(
 +       */
 +      if (IS_BROADWELL(dev))
 +              intel_wait_for_vblank(dev, intel_crtc->pipe);
  }
  
  /**
@@@ -4573,10 -4564,7 +4573,10 @@@ static void valleyview_crtc_enable(stru
        if (intel_crtc->active)
                return;
  
 -      vlv_prepare_pll(intel_crtc);
 +      is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI);
 +
 +      if (!is_dsi && !IS_CHERRYVIEW(dev))
 +              vlv_prepare_pll(intel_crtc);
  
        /* Set up the display plane register */
        dspcntr = DISPPLANE_GAMMA_ENABLE;
                if (encoder->pre_pll_enable)
                        encoder->pre_pll_enable(encoder);
  
 -      is_dsi = intel_pipe_has_type(crtc, INTEL_OUTPUT_DSI);
 -
        if (!is_dsi) {
                if (IS_CHERRYVIEW(dev))
                        chv_enable_pll(intel_crtc);
@@@ -11097,22 -11087,6 +11097,22 @@@ const char *intel_output_name(int outpu
        return names[output];
  }
  
 +static bool intel_crt_present(struct drm_device *dev)
 +{
 +      struct drm_i915_private *dev_priv = dev->dev_private;
 +
 +      if (IS_ULT(dev))
 +              return false;
 +
 +      if (IS_CHERRYVIEW(dev))
 +              return false;
 +
 +      if (IS_VALLEYVIEW(dev) && !dev_priv->vbt.int_crt_support)
 +              return false;
 +
 +      return true;
 +}
 +
  static void intel_setup_outputs(struct drm_device *dev)
  {
        struct drm_i915_private *dev_priv = dev->dev_private;
  
        intel_lvds_init(dev);
  
 -      if (!IS_ULT(dev) && !IS_CHERRYVIEW(dev) && dev_priv->vbt.int_crt_support)
 +      if (intel_crt_present(dev))
                intel_crt_init(dev);
  
        if (HAS_DDI(dev)) {
@@@ -12260,7 -12234,7 +12260,7 @@@ void intel_connector_unregister(struct 
        struct drm_connector *connector = &intel_connector->base;
  
        intel_panel_destroy_backlight(connector);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
  }
  
  void intel_modeset_cleanup(struct drm_device *dev)
@@@ -12437,8 -12411,8 +12437,8 @@@ intel_display_capture_error_state(struc
  
        for_each_pipe(i) {
                error->pipe[i].power_domain_on =
 -                      intel_display_power_enabled_sw(dev_priv,
 -                                                     POWER_DOMAIN_PIPE(i));
 +                      intel_display_power_enabled_unlocked(dev_priv,
 +                                                         POWER_DOMAIN_PIPE(i));
                if (!error->pipe[i].power_domain_on)
                        continue;
  
                enum transcoder cpu_transcoder = transcoders[i];
  
                error->transcoder[i].power_domain_on =
 -                      intel_display_power_enabled_sw(dev_priv,
 +                      intel_display_power_enabled_unlocked(dev_priv,
                                POWER_DOMAIN_TRANSCODER(cpu_transcoder));
                if (!error->transcoder[i].power_domain_on)
                        continue;
index 20375cc7f82ddac3ce39e05046b02f4714988706,e0be8ae75c15a7aefb3553fa66c0c83b7a0be976..9350edd6728d4706b82d13f1133ad22e09a0708b
@@@ -1385,9 -1385,7 +1385,9 @@@ static void intel_sdvo_get_config(struc
                         >> SDVO_PORT_MULTIPLY_SHIFT) + 1;
        }
  
 -      dotclock = pipe_config->port_clock / pipe_config->pixel_multiplier;
 +      dotclock = pipe_config->port_clock;
 +      if (pipe_config->pixel_multiplier)
 +              dotclock /= pipe_config->pixel_multiplier;
  
        if (HAS_PCH_SPLIT(dev))
                ironlake_check_encoder_dotclock(pipe_config, dotclock);
@@@ -2433,7 -2431,7 +2433,7 @@@ intel_sdvo_connector_init(struct intel_
        connector->base.unregister = intel_sdvo_connector_unregister;
  
        intel_connector_attach_encoder(&connector->base, &encoder->base);
-       ret = drm_sysfs_connector_add(drm_connector);
+       ret = drm_connector_register(drm_connector);
        if (ret < 0)
                goto err1;
  
        return 0;
  
  err2:
-       drm_sysfs_connector_remove(drm_connector);
+       drm_connector_unregister(drm_connector);
  err1:
        drm_connector_cleanup(drm_connector);
  
@@@ -2559,7 -2557,7 +2559,7 @@@ intel_sdvo_tv_init(struct intel_sdvo *i
        return true;
  
  err:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        intel_sdvo_destroy(connector);
        return false;
  }
@@@ -2638,7 -2636,7 +2638,7 @@@ intel_sdvo_lvds_init(struct intel_sdvo 
        return true;
  
  err:
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        intel_sdvo_destroy(connector);
        return false;
  }
@@@ -2711,7 -2709,7 +2711,7 @@@ static void intel_sdvo_output_cleanup(s
        list_for_each_entry_safe(connector, tmp,
                                 &dev->mode_config.connector_list, head) {
                if (intel_attached_encoder(connector) == &intel_sdvo->base) {
-                       drm_sysfs_connector_remove(connector);
+                       drm_connector_unregister(connector);
                        intel_sdvo_destroy(connector);
                }
        }
index 28f7e3ec6c28939d918a86ee1bdbc2fa60c0d010,56c64c14c9b0f81b4736e56fefb5e32991bce719..76960faae38ffcf356ff5eb0c433c78d8d7dd5a4
@@@ -127,14 -127,6 +127,14 @@@ static int hpd_enable(struct hdmi_conne
        }
  
        for (i = 0; i < config->hpd_clk_cnt; i++) {
 +              if (config->hpd_freq && config->hpd_freq[i]) {
 +                      ret = clk_set_rate(hdmi->hpd_clks[i],
 +                                      config->hpd_freq[i]);
 +                      if (ret)
 +                              dev_warn(dev->dev, "failed to set clk %s (%d)\n",
 +                                              config->hpd_clk_names[i], ret);
 +              }
 +
                ret = clk_prepare_enable(hdmi->hpd_clks[i]);
                if (ret) {
                        dev_err(dev->dev, "failed to enable hpd clk: %s (%d)\n",
@@@ -306,7 -298,7 +306,7 @@@ static void hdmi_connector_destroy(stru
  
        hdp_disable(hdmi_connector);
  
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
  
        hdmi_unreference(hdmi_connector->hdmi);
@@@ -416,7 -408,7 +416,7 @@@ struct drm_connector *hdmi_connector_in
        connector->interlace_allowed = 1;
        connector->doublescan_allowed = 0;
  
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
  
        ret = hpd_enable(hdmi_connector);
        if (ret) {
index 44831197e82eed7e441399818408a8599e697dde,5b1a611c30eb10be6fee4df028c83a2c8cfa05a4..8137b7a346963fe8ab862c3e4b262ff3a17245af
@@@ -199,9 -199,6 +199,9 @@@ int radeon_get_monitor_bpc(struct drm_c
                }
        }
  
 +      if ((radeon_deep_color == 0) && (bpc > 8))
 +              bpc = 8;
 +
        DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
                          connector->name, connector->display_info.bpc, bpc);
  
@@@ -740,7 -737,7 +740,7 @@@ static void radeon_connector_destroy(st
        if (radeon_connector->edid)
                kfree(radeon_connector->edid);
        kfree(radeon_connector->con_priv);
-       drm_sysfs_connector_remove(connector);
+       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
        kfree(connector);
  }
@@@ -1291,15 -1288,17 +1291,15 @@@ static int radeon_dvi_mode_valid(struc
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
                    (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
                        return MODE_OK;
 -              else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
 -                      if (ASIC_IS_DCE6(rdev)) {
 -                              /* HDMI 1.3+ supports max clock of 340 Mhz */
 -                              if (mode->clock > 340000)
 -                                      return MODE_CLOCK_HIGH;
 -                              else
 -                                      return MODE_OK;
 -                      } else
 +              else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
 +                      /* HDMI 1.3+ supports max clock of 340 Mhz */
 +                      if (mode->clock > 340000)
                                return MODE_CLOCK_HIGH;
 -              } else
 +                      else
 +                              return MODE_OK;
 +              } else {
                        return MODE_CLOCK_HIGH;
 +              }
        }
  
        /* check against the max pixel clock */
@@@ -1550,8 -1549,6 +1550,8 @@@ out
  static int radeon_dp_mode_valid(struct drm_connector *connector,
                                  struct drm_display_mode *mode)
  {
 +      struct drm_device *dev = connector->dev;
 +      struct radeon_device *rdev = dev->dev_private;
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
        struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
  
                                        return MODE_PANEL;
                        }
                }
 -              return MODE_OK;
        } else {
                if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
 -                  (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
 +                  (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {
                        return radeon_dp_mode_valid_helper(connector, mode);
 -              else
 -                      return MODE_OK;
 +              } else {
 +                      if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) {
 +                              /* HDMI 1.3+ supports max clock of 340 Mhz */
 +                              if (mode->clock > 340000)
 +                                      return MODE_CLOCK_HIGH;
 +                      } else {
 +                              if (mode->clock > 165000)
 +                                      return MODE_CLOCK_HIGH;
 +                      }
 +              }
        }
 +
 +      return MODE_OK;
  }
  
  static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
@@@ -2050,7 -2038,7 +2050,7 @@@ radeon_add_atom_connector(struct drm_de
                connector->polled = DRM_CONNECTOR_POLL_HPD;
  
        connector->display_info.subpixel_order = subpixel_order;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
  
        if (has_aux)
                radeon_dp_aux_init(radeon_connector);
@@@ -2211,5 -2199,5 +2211,5 @@@ radeon_add_legacy_connector(struct drm_
        } else
                connector->polled = DRM_CONNECTOR_POLL_HPD;
        connector->display_info.subpixel_order = subpixel_order;
-       drm_sysfs_connector_add(connector);
+       drm_connector_register(connector);
  }