]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge tag 'drm-for-v4.9' into drm-intel-next-queued
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 12 Oct 2016 06:22:25 +0000 (08:22 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 12 Oct 2016 06:22:25 +0000 (08:22 +0200)
It's been over two months, git definitely lost it's marbles. Conflicts
resolved by picking our version, plus manually checking the diff with
the parent in drm-intel-next-queued to make sure git didn't do
anything stupid. It did, so I removed 2 occasions where it
double-inserted a bit of code. The diff is now just
- kernel-doc changes
- drm format/name changes
- display-info changes
so looks all reasonable.

Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
1  2 
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/intel_audio.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_lvds.c

index 1a1cc9b5dabb4bfa3cab38bc46a3ad314d0281c6,27b0e34dadecdadafd6506148a49dd450ca5106d..20689f1cd719c3bc32bcecf11ab8b49b4c039cec
@@@ -79,8 -79,10 +79,8 @@@ static int i915_capabilities(struct seq
        seq_printf(m, "gen: %d\n", INTEL_GEN(dev_priv));
        seq_printf(m, "pch: %d\n", INTEL_PCH_TYPE(dev_priv));
  #define PRINT_FLAG(x)  seq_printf(m, #x ": %s\n", yesno(info->x))
 -#define SEP_SEMICOLON ;
 -      DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_SEMICOLON);
 +      DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG);
  #undef PRINT_FLAG
 -#undef SEP_SEMICOLON
  
        return 0;
  }
@@@ -643,23 -645,6 +643,23 @@@ static int i915_gem_batch_pool_info(str
        return 0;
  }
  
 +static void print_request(struct seq_file *m,
 +                        struct drm_i915_gem_request *rq,
 +                        const char *prefix)
 +{
 +      struct pid *pid = rq->ctx->pid;
 +      struct task_struct *task;
 +
 +      rcu_read_lock();
 +      task = pid ? pid_task(pid, PIDTYPE_PID) : NULL;
 +      seq_printf(m, "%s%x [%x:%x] @ %d: %s [%d]\n", prefix,
 +                 rq->fence.seqno, rq->ctx->hw_id, rq->fence.seqno,
 +                 jiffies_to_msecs(jiffies - rq->emitted_jiffies),
 +                 task ? task->comm : "<unknown>",
 +                 task ? task->pid : -1);
 +      rcu_read_unlock();
 +}
 +
  static int i915_gem_request_info(struct seq_file *m, void *data)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
                        continue;
  
                seq_printf(m, "%s requests: %d\n", engine->name, count);
 -              list_for_each_entry(req, &engine->request_list, link) {
 -                      struct pid *pid = req->ctx->pid;
 -                      struct task_struct *task;
 -
 -                      rcu_read_lock();
 -                      task = pid ? pid_task(pid, PIDTYPE_PID) : NULL;
 -                      seq_printf(m, "    %x @ %d: %s [%d]\n",
 -                                 req->fence.seqno,
 -                                 (int) (jiffies - req->emitted_jiffies),
 -                                 task ? task->comm : "<unknown>",
 -                                 task ? task->pid : -1);
 -                      rcu_read_unlock();
 -              }
 +              list_for_each_entry(req, &engine->request_list, link)
 +                      print_request(m, req, "    ");
  
                any++;
        }
        return ret;
  }
  
 +static void i915_instdone_info(struct drm_i915_private *dev_priv,
 +                             struct seq_file *m,
 +                             struct intel_instdone *instdone)
 +{
 +      int slice;
 +      int subslice;
 +
 +      seq_printf(m, "\t\tINSTDONE: 0x%08x\n",
 +                 instdone->instdone);
 +
 +      if (INTEL_GEN(dev_priv) <= 3)
 +              return;
 +
 +      seq_printf(m, "\t\tSC_INSTDONE: 0x%08x\n",
 +                 instdone->slice_common);
 +
 +      if (INTEL_GEN(dev_priv) <= 6)
 +              return;
 +
 +      for_each_instdone_slice_subslice(dev_priv, slice, subslice)
 +              seq_printf(m, "\t\tSAMPLER_INSTDONE[%d][%d]: 0x%08x\n",
 +                         slice, subslice, instdone->sampler[slice][subslice]);
 +
 +      for_each_instdone_slice_subslice(dev_priv, slice, subslice)
 +              seq_printf(m, "\t\tROW_INSTDONE[%d][%d]: 0x%08x\n",
 +                         slice, subslice, instdone->row[slice][subslice]);
 +}
 +
  static int i915_hangcheck_info(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        struct intel_engine_cs *engine;
        u64 acthd[I915_NUM_ENGINES];
        u32 seqno[I915_NUM_ENGINES];
 -      u32 instdone[I915_NUM_INSTDONE_REG];
 +      struct intel_instdone instdone;
        enum intel_engine_id id;
 -      int j;
  
        if (test_bit(I915_WEDGED, &dev_priv->gpu_error.flags))
                seq_printf(m, "Wedged\n");
                seqno[id] = intel_engine_get_seqno(engine);
        }
  
 -      i915_get_extra_instdone(dev_priv, instdone);
 +      i915_get_engine_instdone(dev_priv, RCS, &instdone);
  
        intel_runtime_pm_put(dev_priv);
  
                seq_printf(m, "Hangcheck inactive\n");
  
        for_each_engine_id(engine, dev_priv, id) {
 +              struct intel_breadcrumbs *b = &engine->breadcrumbs;
 +              struct rb_node *rb;
 +
                seq_printf(m, "%s:\n", engine->name);
                seq_printf(m, "\tseqno = %x [current %x, last %x]\n",
                           engine->hangcheck.seqno,
                           yesno(intel_engine_has_waiter(engine)),
                           yesno(test_bit(engine->id,
                                          &dev_priv->gpu_error.missed_irq_rings)));
 +              spin_lock(&b->lock);
 +              for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
 +                      struct intel_wait *w = container_of(rb, typeof(*w), node);
 +
 +                      seq_printf(m, "\t%s [%d] waiting for %x\n",
 +                                 w->tsk->comm, w->tsk->pid, w->seqno);
 +              }
 +              spin_unlock(&b->lock);
 +
                seq_printf(m, "\tACTHD = 0x%08llx [current 0x%08llx]\n",
                           (long long)engine->hangcheck.acthd,
                           (long long)acthd[id]);
                seq_printf(m, "\taction = %d\n", engine->hangcheck.action);
  
                if (engine->id == RCS) {
 -                      seq_puts(m, "\tinstdone read =");
 +                      seq_puts(m, "\tinstdone read =\n");
  
 -                      for (j = 0; j < I915_NUM_INSTDONE_REG; j++)
 -                              seq_printf(m, " 0x%08x", instdone[j]);
 +                      i915_instdone_info(dev_priv, m, &instdone);
  
 -                      seq_puts(m, "\n\tinstdone accu =");
 +                      seq_puts(m, "\tinstdone accu =\n");
  
 -                      for (j = 0; j < I915_NUM_INSTDONE_REG; j++)
 -                              seq_printf(m, " 0x%08x",
 -                                         engine->hangcheck.instdone[j]);
 -
 -                      seq_puts(m, "\n");
 +                      i915_instdone_info(dev_priv, m,
 +                                         &engine->hangcheck.instdone);
                }
        }
  
@@@ -1674,8 -1635,7 +1674,8 @@@ static int i915_fbc_status(struct seq_f
                seq_printf(m, "FBC disabled: %s\n",
                           dev_priv->fbc.no_fbc_reason);
  
 -      if (INTEL_GEN(dev_priv) >= 7)
 +      if (intel_fbc_is_active(dev_priv) &&
 +          INTEL_GEN(dev_priv) >= 7)
                seq_printf(m, "Compressing: %s\n",
                           yesno(I915_READ(FBC_STATUS2) &
                                 FBC_COMPRESSION_MASK));
@@@ -2062,6 -2022,84 +2062,6 @@@ static int i915_dump_lrc(struct seq_fil
        return 0;
  }
  
 -static int i915_execlists(struct seq_file *m, void *data)
 -{
 -      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 -      struct drm_device *dev = &dev_priv->drm;
 -      struct intel_engine_cs *engine;
 -      u32 status_pointer;
 -      u8 read_pointer;
 -      u8 write_pointer;
 -      u32 status;
 -      u32 ctx_id;
 -      struct list_head *cursor;
 -      int i, ret;
 -
 -      if (!i915.enable_execlists) {
 -              seq_puts(m, "Logical Ring Contexts are disabled\n");
 -              return 0;
 -      }
 -
 -      ret = mutex_lock_interruptible(&dev->struct_mutex);
 -      if (ret)
 -              return ret;
 -
 -      intel_runtime_pm_get(dev_priv);
 -
 -      for_each_engine(engine, dev_priv) {
 -              struct drm_i915_gem_request *head_req = NULL;
 -              int count = 0;
 -
 -              seq_printf(m, "%s\n", engine->name);
 -
 -              status = I915_READ(RING_EXECLIST_STATUS_LO(engine));
 -              ctx_id = I915_READ(RING_EXECLIST_STATUS_HI(engine));
 -              seq_printf(m, "\tExeclist status: 0x%08X, context: %u\n",
 -                         status, ctx_id);
 -
 -              status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(engine));
 -              seq_printf(m, "\tStatus pointer: 0x%08X\n", status_pointer);
 -
 -              read_pointer = GEN8_CSB_READ_PTR(status_pointer);
 -              write_pointer = GEN8_CSB_WRITE_PTR(status_pointer);
 -              if (read_pointer > write_pointer)
 -                      write_pointer += GEN8_CSB_ENTRIES;
 -              seq_printf(m, "\tRead pointer: 0x%08X, write pointer 0x%08X\n",
 -                         read_pointer, write_pointer);
 -
 -              for (i = 0; i < GEN8_CSB_ENTRIES; i++) {
 -                      status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, i));
 -                      ctx_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, i));
 -
 -                      seq_printf(m, "\tStatus buffer %d: 0x%08X, context: %u\n",
 -                                 i, status, ctx_id);
 -              }
 -
 -              spin_lock_bh(&engine->execlist_lock);
 -              list_for_each(cursor, &engine->execlist_queue)
 -                      count++;
 -              head_req = list_first_entry_or_null(&engine->execlist_queue,
 -                                                  struct drm_i915_gem_request,
 -                                                  execlist_link);
 -              spin_unlock_bh(&engine->execlist_lock);
 -
 -              seq_printf(m, "\t%d requests in queue\n", count);
 -              if (head_req) {
 -                      seq_printf(m, "\tHead request context: %u\n",
 -                                 head_req->ctx->hw_id);
 -                      seq_printf(m, "\tHead request tail: %u\n",
 -                                 head_req->tail);
 -              }
 -
 -              seq_putc(m, '\n');
 -      }
 -
 -      intel_runtime_pm_put(dev_priv);
 -      mutex_unlock(&dev->struct_mutex);
 -
 -      return 0;
 -}
 -
  static const char *swizzle_string(unsigned swizzle)
  {
        switch (swizzle) {
@@@ -2966,6 -3004,7 +2966,7 @@@ static void intel_plane_info(struct seq
        for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
                struct drm_plane_state *state;
                struct drm_plane *plane = &intel_plane->base;
+               char *format_name;
  
                if (!plane->state) {
                        seq_puts(m, "plane->state is NULL!\n");
  
                state = plane->state;
  
+               if (state->fb) {
+                       format_name = drm_get_format_name(state->fb->pixel_format);
+               } else {
+                       format_name = kstrdup("N/A", GFP_KERNEL);
+               }
                seq_printf(m, "\t--Plane id %d: type=%s, crtc_pos=%4dx%4d, crtc_size=%4dx%4d, src_pos=%d.%04ux%d.%04u, src_size=%d.%04ux%d.%04u, format=%s, rotation=%s\n",
                           plane->base.id,
                           plane_type(intel_plane->base.type),
                           ((state->src_w & 0xffff) * 15625) >> 10,
                           (state->src_h >> 16),
                           ((state->src_h & 0xffff) * 15625) >> 10,
-                          state->fb ? drm_get_format_name(state->fb->pixel_format) : "N/A",
+                          format_name,
                           plane_rotation(state->rotation));
+               kfree(format_name);
        }
  }
  
@@@ -3074,133 -3121,6 +3083,133 @@@ static int i915_display_info(struct seq
        return 0;
  }
  
 +static int i915_engine_info(struct seq_file *m, void *unused)
 +{
 +      struct drm_i915_private *dev_priv = node_to_i915(m->private);
 +      struct intel_engine_cs *engine;
 +
 +      for_each_engine(engine, dev_priv) {
 +              struct intel_breadcrumbs *b = &engine->breadcrumbs;
 +              struct drm_i915_gem_request *rq;
 +              struct rb_node *rb;
 +              u64 addr;
 +
 +              seq_printf(m, "%s\n", engine->name);
 +              seq_printf(m, "\tcurrent seqno %x, last %x, hangcheck %x [score %d]\n",
 +                         intel_engine_get_seqno(engine),
 +                         engine->last_submitted_seqno,
 +                         engine->hangcheck.seqno,
 +                         engine->hangcheck.score);
 +
 +              rcu_read_lock();
 +
 +              seq_printf(m, "\tRequests:\n");
 +
 +              rq = list_first_entry(&engine->request_list,
 +                              struct drm_i915_gem_request, link);
 +              if (&rq->link != &engine->request_list)
 +                      print_request(m, rq, "\t\tfirst  ");
 +
 +              rq = list_last_entry(&engine->request_list,
 +                              struct drm_i915_gem_request, link);
 +              if (&rq->link != &engine->request_list)
 +                      print_request(m, rq, "\t\tlast   ");
 +
 +              rq = i915_gem_find_active_request(engine);
 +              if (rq) {
 +                      print_request(m, rq, "\t\tactive ");
 +                      seq_printf(m,
 +                                 "\t\t[head %04x, postfix %04x, tail %04x, batch 0x%08x_%08x]\n",
 +                                 rq->head, rq->postfix, rq->tail,
 +                                 rq->batch ? upper_32_bits(rq->batch->node.start) : ~0u,
 +                                 rq->batch ? lower_32_bits(rq->batch->node.start) : ~0u);
 +              }
 +
 +              seq_printf(m, "\tRING_START: 0x%08x [0x%08x]\n",
 +                         I915_READ(RING_START(engine->mmio_base)),
 +                         rq ? i915_ggtt_offset(rq->ring->vma) : 0);
 +              seq_printf(m, "\tRING_HEAD:  0x%08x [0x%08x]\n",
 +                         I915_READ(RING_HEAD(engine->mmio_base)) & HEAD_ADDR,
 +                         rq ? rq->ring->head : 0);
 +              seq_printf(m, "\tRING_TAIL:  0x%08x [0x%08x]\n",
 +                         I915_READ(RING_TAIL(engine->mmio_base)) & TAIL_ADDR,
 +                         rq ? rq->ring->tail : 0);
 +              seq_printf(m, "\tRING_CTL:   0x%08x [%s]\n",
 +                         I915_READ(RING_CTL(engine->mmio_base)),
 +                         I915_READ(RING_CTL(engine->mmio_base)) & (RING_WAIT | RING_WAIT_SEMAPHORE) ? "waiting" : "");
 +
 +              rcu_read_unlock();
 +
 +              addr = intel_engine_get_active_head(engine);
 +              seq_printf(m, "\tACTHD:  0x%08x_%08x\n",
 +                         upper_32_bits(addr), lower_32_bits(addr));
 +              addr = intel_engine_get_last_batch_head(engine);
 +              seq_printf(m, "\tBBADDR: 0x%08x_%08x\n",
 +                         upper_32_bits(addr), lower_32_bits(addr));
 +
 +              if (i915.enable_execlists) {
 +                      u32 ptr, read, write;
 +
 +                      seq_printf(m, "\tExeclist status: 0x%08x %08x\n",
 +                                 I915_READ(RING_EXECLIST_STATUS_LO(engine)),
 +                                 I915_READ(RING_EXECLIST_STATUS_HI(engine)));
 +
 +                      ptr = I915_READ(RING_CONTEXT_STATUS_PTR(engine));
 +                      read = GEN8_CSB_READ_PTR(ptr);
 +                      write = GEN8_CSB_WRITE_PTR(ptr);
 +                      seq_printf(m, "\tExeclist CSB read %d, write %d\n",
 +                                 read, write);
 +                      if (read >= GEN8_CSB_ENTRIES)
 +                              read = 0;
 +                      if (write >= GEN8_CSB_ENTRIES)
 +                              write = 0;
 +                      if (read > write)
 +                              write += GEN8_CSB_ENTRIES;
 +                      while (read < write) {
 +                              unsigned int idx = ++read % GEN8_CSB_ENTRIES;
 +
 +                              seq_printf(m, "\tExeclist CSB[%d]: 0x%08x, context: %d\n",
 +                                         idx,
 +                                         I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, idx)),
 +                                         I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, idx)));
 +                      }
 +
 +                      rcu_read_lock();
 +                      rq = READ_ONCE(engine->execlist_port[0].request);
 +                      if (rq)
 +                              print_request(m, rq, "\t\tELSP[0] ");
 +                      else
 +                              seq_printf(m, "\t\tELSP[0] idle\n");
 +                      rq = READ_ONCE(engine->execlist_port[1].request);
 +                      if (rq)
 +                              print_request(m, rq, "\t\tELSP[1] ");
 +                      else
 +                              seq_printf(m, "\t\tELSP[1] idle\n");
 +                      rcu_read_unlock();
 +              } else if (INTEL_GEN(dev_priv) > 6) {
 +                      seq_printf(m, "\tPP_DIR_BASE: 0x%08x\n",
 +                                 I915_READ(RING_PP_DIR_BASE(engine)));
 +                      seq_printf(m, "\tPP_DIR_BASE_READ: 0x%08x\n",
 +                                 I915_READ(RING_PP_DIR_BASE_READ(engine)));
 +                      seq_printf(m, "\tPP_DIR_DCLV: 0x%08x\n",
 +                                 I915_READ(RING_PP_DIR_DCLV(engine)));
 +              }
 +
 +              spin_lock(&b->lock);
 +              for (rb = rb_first(&b->waiters); rb; rb = rb_next(rb)) {
 +                      struct intel_wait *w = container_of(rb, typeof(*w), node);
 +
 +                      seq_printf(m, "\t%s [%d] waiting for %x\n",
 +                                 w->tsk->comm, w->tsk->pid, w->seqno);
 +              }
 +              spin_unlock(&b->lock);
 +
 +              seq_puts(m, "\n");
 +      }
 +
 +      return 0;
 +}
 +
  static int i915_semaphore_status(struct seq_file *m, void *unused)
  {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@@ -5355,6 -5275,7 +5364,6 @@@ static const struct drm_info_list i915_
        {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
        {"i915_context_status", i915_context_status, 0},
        {"i915_dump_lrc", i915_dump_lrc, 0},
 -      {"i915_execlists", i915_execlists, 0},
        {"i915_forcewake_domains", i915_forcewake_domains, 0},
        {"i915_swizzle_info", i915_swizzle_info, 0},
        {"i915_ppgtt_info", i915_ppgtt_info, 0},
        {"i915_power_domain_info", i915_power_domain_info, 0},
        {"i915_dmc_info", i915_dmc_info, 0},
        {"i915_display_info", i915_display_info, 0},
 +      {"i915_engine_info", i915_engine_info, 0},
        {"i915_semaphore_status", i915_semaphore_status, 0},
        {"i915_shared_dplls_info", i915_shared_dplls_info, 0},
        {"i915_dp_mst_info", i915_dp_mst_info, 0},
index 904e7c36c79c23b99bd685f4fb2717b243e70a5c,6c70a5bfd7d896a316eda26c82444338fedf8622..81df29ca4947f6f9f0a776ece9c2ae6e64715eca
   * related registers. (The notable exception is the power management, not
   * covered here.)
   *
-  * The struct i915_audio_component is used to interact between the graphics
-  * and audio drivers. The struct i915_audio_component_ops *ops in it is
+  * The struct &i915_audio_component is used to interact between the graphics
+  * and audio drivers. The struct &i915_audio_component_ops @ops in it is
   * defined in graphics driver and called in audio driver. The
-  * struct i915_audio_component_audio_ops *audio_ops is called from i915 driver.
+  * struct &i915_audio_component_audio_ops @audio_ops is called from i915 driver.
   */
  
  static const struct {
@@@ -81,7 -81,7 +81,7 @@@ static const struct 
        int clock;
        int n;
        int cts;
 -} aud_ncts[] = {
 +} hdmi_aud_ncts[] = {
        { 44100, TMDS_296M, 4459, 234375 },
        { 44100, TMDS_297M, 4704, 247500 },
        { 48000, TMDS_296M, 5824, 281250 },
@@@ -121,20 -121,45 +121,20 @@@ static u32 audio_config_hdmi_pixel_cloc
        return hdmi_audio_clock[i].config;
  }
  
 -static int audio_config_get_n(const struct drm_display_mode *mode, int rate)
 +static int audio_config_hdmi_get_n(const struct drm_display_mode *adjusted_mode,
 +                                 int rate)
  {
        int i;
  
 -      for (i = 0; i < ARRAY_SIZE(aud_ncts); i++) {
 -              if ((rate == aud_ncts[i].sample_rate) &&
 -                      (mode->clock == aud_ncts[i].clock)) {
 -                      return aud_ncts[i].n;
 +      for (i = 0; i < ARRAY_SIZE(hdmi_aud_ncts); i++) {
 +              if (rate == hdmi_aud_ncts[i].sample_rate &&
 +                  adjusted_mode->crtc_clock == hdmi_aud_ncts[i].clock) {
 +                      return hdmi_aud_ncts[i].n;
                }
        }
        return 0;
  }
  
 -static uint32_t audio_config_setup_n_reg(int n, uint32_t val)
 -{
 -      int n_low, n_up;
 -      uint32_t tmp = val;
 -
 -      n_low = n & 0xfff;
 -      n_up = (n >> 12) & 0xff;
 -      tmp &= ~(AUD_CONFIG_UPPER_N_MASK | AUD_CONFIG_LOWER_N_MASK);
 -      tmp |= ((n_up << AUD_CONFIG_UPPER_N_SHIFT) |
 -                      (n_low << AUD_CONFIG_LOWER_N_SHIFT) |
 -                      AUD_CONFIG_N_PROG_ENABLE);
 -      return tmp;
 -}
 -
 -/* check whether N/CTS/M need be set manually */
 -static bool audio_rate_need_prog(struct intel_crtc *crtc,
 -                               const struct drm_display_mode *mode)
 -{
 -      if (((mode->clock == TMDS_297M) ||
 -               (mode->clock == TMDS_296M)) &&
 -              intel_crtc_has_type(crtc->config, INTEL_OUTPUT_HDMI))
 -              return true;
 -      else
 -              return false;
 -}
 -
  static bool intel_eld_uptodate(struct drm_connector *connector,
                               i915_reg_t reg_eldv, uint32_t bits_eldv,
                               i915_reg_t reg_elda, uint32_t bits_elda,
@@@ -220,65 -245,6 +220,65 @@@ static void g4x_audio_codec_enable(stru
        I915_WRITE(G4X_AUD_CNTL_ST, tmp);
  }
  
 +static void
 +hsw_dp_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
 +                         const struct drm_display_mode *adjusted_mode)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
 +      enum pipe pipe = intel_crtc->pipe;
 +      u32 tmp;
 +
 +      tmp = I915_READ(HSW_AUD_CFG(pipe));
 +      tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
 +      tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
 +      tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
 +      tmp |= AUD_CONFIG_N_VALUE_INDEX;
 +
 +      I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 +}
 +
 +static void
 +hsw_hdmi_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
 +                           const struct drm_display_mode *adjusted_mode)
 +{
 +      struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev);
 +      struct i915_audio_component *acomp = dev_priv->audio_component;
 +      int rate = acomp ? acomp->aud_sample_rate[port] : 0;
 +      enum pipe pipe = intel_crtc->pipe;
 +      int n;
 +      u32 tmp;
 +
 +      tmp = I915_READ(HSW_AUD_CFG(pipe));
 +      tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
 +      tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
 +      tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
 +      tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
 +
 +      if (adjusted_mode->crtc_clock == TMDS_296M ||
 +          adjusted_mode->crtc_clock == TMDS_297M) {
 +              n = audio_config_hdmi_get_n(adjusted_mode, rate);
 +              if (n != 0) {
 +                      tmp &= ~AUD_CONFIG_N_MASK;
 +                      tmp |= AUD_CONFIG_N(n);
 +                      tmp |= AUD_CONFIG_N_PROG_ENABLE;
 +              } else {
 +                      DRM_DEBUG_KMS("no suitable N value is found\n");
 +              }
 +      }
 +
 +      I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 +}
 +
 +static void
 +hsw_audio_config_update(struct intel_crtc *intel_crtc, enum port port,
 +                      const struct drm_display_mode *adjusted_mode)
 +{
 +      if (intel_crtc_has_dp_encoder(intel_crtc->config))
 +              hsw_dp_audio_config_update(intel_crtc, port, adjusted_mode);
 +      else
 +              hsw_hdmi_audio_config_update(intel_crtc, port, adjusted_mode);
 +}
 +
  static void hsw_audio_codec_disable(struct intel_encoder *encoder)
  {
        struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  }
  
  static void hsw_audio_codec_enable(struct drm_connector *connector,
 -                                 struct intel_encoder *encoder,
 +                                 struct intel_encoder *intel_encoder,
                                   const struct drm_display_mode *adjusted_mode)
  {
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
        enum pipe pipe = intel_crtc->pipe;
 -      struct i915_audio_component *acomp = dev_priv->audio_component;
 +      enum port port = intel_encoder->port;
        const uint8_t *eld = connector->eld;
 -      struct intel_digital_port *intel_dig_port =
 -              enc_to_dig_port(&encoder->base);
 -      enum port port = intel_dig_port->port;
        uint32_t tmp;
        int len, i;
 -      int n, rate;
  
        DRM_DEBUG_KMS("Enable audio codec on pipe %c, %u bytes ELD\n",
                      pipe_name(pipe), drm_eld_size(eld));
        I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
  
        /* Enable timestamps */
 -      tmp = I915_READ(HSW_AUD_CFG(pipe));
 -      tmp &= ~AUD_CONFIG_N_VALUE_INDEX;
 -      tmp &= ~AUD_CONFIG_PIXEL_CLOCK_HDMI_MASK;
 -      if (intel_crtc_has_dp_encoder(intel_crtc->config))
 -              tmp |= AUD_CONFIG_N_VALUE_INDEX;
 -      else
 -              tmp |= audio_config_hdmi_pixel_clock(adjusted_mode);
 -
 -      tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
 -      if (audio_rate_need_prog(intel_crtc, adjusted_mode)) {
 -              if (!acomp)
 -                      rate = 0;
 -              else if (port >= PORT_A && port <= PORT_E)
 -                      rate = acomp->aud_sample_rate[port];
 -              else {
 -                      DRM_ERROR("invalid port: %d\n", port);
 -                      rate = 0;
 -              }
 -              n = audio_config_get_n(adjusted_mode, rate);
 -              if (n != 0)
 -                      tmp = audio_config_setup_n_reg(n, tmp);
 -              else
 -                      DRM_DEBUG_KMS("no suitable N value is found\n");
 -      }
 -
 -      I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 +      hsw_audio_config_update(intel_crtc, port, adjusted_mode);
  
        mutex_unlock(&dev_priv->av_mutex);
  }
  
 -static void ilk_audio_codec_disable(struct intel_encoder *encoder)
 +static void ilk_audio_codec_disable(struct intel_encoder *intel_encoder)
  {
 -      struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
 -      enum port port = enc_to_dig_port(&encoder->base)->port;
 +      struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev);
 +      struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
        enum pipe pipe = intel_crtc->pipe;
 +      enum port port = intel_encoder->port;
        uint32_t tmp, eldv;
        i915_reg_t aud_config, aud_cntrl_st2;
  
  }
  
  static void ilk_audio_codec_enable(struct drm_connector *connector,
 -                                 struct intel_encoder *encoder,
 +                                 struct intel_encoder *intel_encoder,
                                   const struct drm_display_mode *adjusted_mode)
  {
        struct drm_i915_private *dev_priv = to_i915(connector->dev);
 -      struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
 -      enum port port = enc_to_dig_port(&encoder->base)->port;
 +      struct intel_crtc *intel_crtc = to_intel_crtc(intel_encoder->base.crtc);
        enum pipe pipe = intel_crtc->pipe;
 +      enum port port = intel_encoder->port;
        uint8_t *eld = connector->eld;
        uint32_t tmp, eldv;
        int len, i;
@@@ -495,10 -490,11 +495,10 @@@ void intel_audio_codec_enable(struct in
        struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
        const struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
        struct drm_connector *connector;
 -      struct drm_device *dev = encoder->dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->dev);
        struct i915_audio_component *acomp = dev_priv->audio_component;
 -      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 -      enum port port = intel_dig_port->port;
 +      enum port port = intel_encoder->port;
 +      enum pipe pipe = crtc->pipe;
  
        connector = drm_select_eld(encoder);
        if (!connector)
                                                     adjusted_mode);
  
        mutex_lock(&dev_priv->av_mutex);
 -      intel_dig_port->audio_connector = connector;
 +      intel_encoder->audio_connector = connector;
 +
        /* referred in audio callbacks */
 -      dev_priv->dig_port_map[port] = intel_encoder;
 +      dev_priv->av_enc_map[pipe] = intel_encoder;
        mutex_unlock(&dev_priv->av_mutex);
  
 +      /* audio drivers expect pipe = -1 to indicate Non-MST cases */
 +      if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
 +              pipe = -1;
 +
        if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
 -              acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
 +              acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
 +                                               (int) port, (int) pipe);
  }
  
  /**
  void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
  {
        struct drm_encoder *encoder = &intel_encoder->base;
 -      struct drm_device *dev = encoder->dev;
 -      struct drm_i915_private *dev_priv = to_i915(dev);
 +      struct drm_i915_private *dev_priv = to_i915(encoder->dev);
        struct i915_audio_component *acomp = dev_priv->audio_component;
 -      struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 -      enum port port = intel_dig_port->port;
 +      enum port port = intel_encoder->port;
 +      struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
 +      enum pipe pipe = crtc->pipe;
  
        if (dev_priv->display.audio_codec_disable)
                dev_priv->display.audio_codec_disable(intel_encoder);
  
        mutex_lock(&dev_priv->av_mutex);
 -      intel_dig_port->audio_connector = NULL;
 -      dev_priv->dig_port_map[port] = NULL;
 +      intel_encoder->audio_connector = NULL;
 +      dev_priv->av_enc_map[pipe] = NULL;
        mutex_unlock(&dev_priv->av_mutex);
  
 +      /* audio drivers expect pipe = -1 to indicate Non-MST cases */
 +      if (intel_encoder->type != INTEL_OUTPUT_DP_MST)
 +              pipe = -1;
 +
        if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
 -              acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port);
 +              acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr,
 +                                               (int) port, (int) pipe);
  }
  
  /**
@@@ -642,67 -627,74 +642,67 @@@ static int i915_audio_component_get_cdc
        return dev_priv->cdclk_freq;
  }
  
 -static int i915_audio_component_sync_audio_rate(struct device *kdev,
 -                                              int port, int rate)
 +static struct intel_encoder *get_saved_enc(struct drm_i915_private *dev_priv,
 +                                             int port, int pipe)
 +{
 +
 +      if (WARN_ON(pipe >= I915_MAX_PIPES))
 +              return NULL;
 +
 +      /* MST */
 +      if (pipe >= 0)
 +              return dev_priv->av_enc_map[pipe];
 +
 +      /* Non-MST */
 +      for_each_pipe(dev_priv, pipe) {
 +              struct intel_encoder *encoder;
 +
 +              encoder = dev_priv->av_enc_map[pipe];
 +              if (encoder == NULL)
 +                      continue;
 +
 +              if (port == encoder->port)
 +                      return encoder;
 +      }
 +
 +      return NULL;
 +}
 +
 +static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
 +                                              int pipe, int rate)
  {
        struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
        struct intel_encoder *intel_encoder;
        struct intel_crtc *crtc;
 -      struct drm_display_mode *mode;
 +      struct drm_display_mode *adjusted_mode;
        struct i915_audio_component *acomp = dev_priv->audio_component;
 -      enum pipe pipe = INVALID_PIPE;
 -      u32 tmp;
 -      int n;
        int err = 0;
  
 -      /* HSW, BDW, SKL, KBL need this fix */
 -      if (!IS_SKYLAKE(dev_priv) &&
 -          !IS_KABYLAKE(dev_priv) &&
 -          !IS_BROADWELL(dev_priv) &&
 -          !IS_HASWELL(dev_priv))
 +      if (!HAS_DDI(dev_priv))
                return 0;
  
        i915_audio_component_get_power(kdev);
        mutex_lock(&dev_priv->av_mutex);
 +
        /* 1. get the pipe */
 -      intel_encoder = dev_priv->dig_port_map[port];
 -      /* intel_encoder might be NULL for DP MST */
 +      intel_encoder = get_saved_enc(dev_priv, port, pipe);
        if (!intel_encoder || !intel_encoder->base.crtc ||
            intel_encoder->type != INTEL_OUTPUT_HDMI) {
 -              DRM_DEBUG_KMS("no valid port %c\n", port_name(port));
 +              DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
                err = -ENODEV;
                goto unlock;
        }
 +
 +      /* pipe passed from the audio driver will be -1 for Non-MST case */
        crtc = to_intel_crtc(intel_encoder->base.crtc);
        pipe = crtc->pipe;
 -      if (pipe == INVALID_PIPE) {
 -              DRM_DEBUG_KMS("no pipe for the port %c\n", port_name(port));
 -              err = -ENODEV;
 -              goto unlock;
 -      }
  
 -      DRM_DEBUG_KMS("pipe %c connects port %c\n",
 -                                pipe_name(pipe), port_name(port));
 -      mode = &crtc->config->base.adjusted_mode;
 +      adjusted_mode = &crtc->config->base.adjusted_mode;
  
        /* port must be valid now, otherwise the pipe will be invalid */
        acomp->aud_sample_rate[port] = rate;
  
 -      /* 2. check whether to set the N/CTS/M manually or not */
 -      if (!audio_rate_need_prog(crtc, mode)) {
 -              tmp = I915_READ(HSW_AUD_CFG(pipe));
 -              tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
 -              I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 -              goto unlock;
 -      }
 -
 -      n = audio_config_get_n(mode, rate);
 -      if (n == 0) {
 -              DRM_DEBUG_KMS("Using automatic mode for N value on port %c\n",
 -                                        port_name(port));
 -              tmp = I915_READ(HSW_AUD_CFG(pipe));
 -              tmp &= ~AUD_CONFIG_N_PROG_ENABLE;
 -              I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 -              goto unlock;
 -      }
 -
 -      /* 3. set the N/CTS/M */
 -      tmp = I915_READ(HSW_AUD_CFG(pipe));
 -      tmp = audio_config_setup_n_reg(n, tmp);
 -      I915_WRITE(HSW_AUD_CFG(pipe), tmp);
 +      hsw_audio_config_update(crtc, port, adjusted_mode);
  
   unlock:
        mutex_unlock(&dev_priv->av_mutex);
  }
  
  static int i915_audio_component_get_eld(struct device *kdev, int port,
 -                                      bool *enabled,
 +                                      int pipe, bool *enabled,
                                        unsigned char *buf, int max_bytes)
  {
        struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
        struct intel_encoder *intel_encoder;
 -      struct intel_digital_port *intel_dig_port;
        const u8 *eld;
        int ret = -EINVAL;
  
        mutex_lock(&dev_priv->av_mutex);
 -      intel_encoder = dev_priv->dig_port_map[port];
 -      /* intel_encoder might be NULL for DP MST */
 -      if (intel_encoder) {
 -              ret = 0;
 -              intel_dig_port = enc_to_dig_port(&intel_encoder->base);
 -              *enabled = intel_dig_port->audio_connector != NULL;
 -              if (*enabled) {
 -                      eld = intel_dig_port->audio_connector->eld;
 -                      ret = drm_eld_size(eld);
 -                      memcpy(buf, eld, min(max_bytes, ret));
 -              }
 +
 +      intel_encoder = get_saved_enc(dev_priv, port, pipe);
 +      if (!intel_encoder) {
 +              DRM_DEBUG_KMS("Not valid for port %c\n", port_name(port));
 +              mutex_unlock(&dev_priv->av_mutex);
 +              return ret;
 +      }
 +
 +      ret = 0;
 +      *enabled = intel_encoder->audio_connector != NULL;
 +      if (*enabled) {
 +              eld = intel_encoder->audio_connector->eld;
 +              ret = drm_eld_size(eld);
 +              memcpy(buf, eld, min(max_bytes, ret));
        }
  
        mutex_unlock(&dev_priv->av_mutex);
index f0ca31d4a50691b7fbbd9e53584a7d701b7346f4,fbcfed63a76e16ec59f465c96e9b5c7c8d37ffe2..e4bdd3a6a6e35cb1bc8668ba64e086a95b021b41
@@@ -3603,6 -3603,8 +3603,6 @@@ void intel_finish_reset(struct drm_i915
  
        dev_priv->modeset_restore_state = NULL;
  
 -      dev_priv->modeset_restore_state = NULL;
 -
        /* reset doesn't touch the display */
        if (!gpu_reset_clobbers_display(dev_priv)) {
                if (!state) {
@@@ -12286,7 -12288,7 +12286,7 @@@ static int intel_crtc_page_flip(struct 
  
                work->flip_queued_req = i915_gem_active_get(&obj->last_write,
                                                            &obj->base.dev->struct_mutex);
 -              schedule_work(&work->mmio_work);
 +              queue_work(system_unbound_wq, &work->mmio_work);
        } else {
                request = i915_gem_request_alloc(engine, engine->last_context);
                if (IS_ERR(request)) {
@@@ -12673,22 -12675,22 +12673,22 @@@ static voi
  connected_sink_compute_bpp(struct intel_connector *connector,
                           struct intel_crtc_state *pipe_config)
  {
+       const struct drm_display_info *info = &connector->base.display_info;
        int bpp = pipe_config->pipe_bpp;
  
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s] checking for sink bpp constrains\n",
-               connector->base.base.id,
-               connector->base.name);
+                     connector->base.base.id,
+                     connector->base.name);
  
        /* Don't use an invalid EDID bpc value */
-       if (connector->base.display_info.bpc &&
-           connector->base.display_info.bpc * 3 < bpp) {
+       if (info->bpc != 0 && info->bpc * 3 < bpp) {
                DRM_DEBUG_KMS("clamping display bpp (was %d) to EDID reported max of %d\n",
-                             bpp, connector->base.display_info.bpc*3);
-               pipe_config->pipe_bpp = connector->base.display_info.bpc*3;
+                             bpp, info->bpc * 3);
+               pipe_config->pipe_bpp = info->bpc * 3;
        }
  
        /* Clamp bpp to 8 on screens without EDID 1.4 */
-       if (connector->base.display_info.bpc == 0 && bpp > 24) {
+       if (info->bpc == 0 && bpp > 24) {
                DRM_DEBUG_KMS("clamping display bpp (was %d) to default limit of 24\n",
                              bpp);
                pipe_config->pipe_bpp = 24;
@@@ -12842,6 -12844,7 +12842,7 @@@ static void intel_dump_pipe_config(stru
  
        DRM_DEBUG_KMS("planes on this crtc\n");
        list_for_each_entry(plane, &dev->mode_config.plane_list, head) {
+               char *format_name;
                intel_plane = to_intel_plane(plane);
                if (intel_plane->pipe != crtc->pipe)
                        continue;
                        continue;
                }
  
+               format_name = drm_get_format_name(fb->pixel_format);
                DRM_DEBUG_KMS("[PLANE:%d:%s] enabled",
                              plane->base.id, plane->name);
                DRM_DEBUG_KMS("\tFB:%d, fb = %ux%u format = %s",
-                             fb->base.id, fb->width, fb->height,
-                             drm_get_format_name(fb->pixel_format));
+                             fb->base.id, fb->width, fb->height, format_name);
                DRM_DEBUG_KMS("\tscaler:%d src %dx%d+%d+%d dst %dx%d+%d+%d\n",
                              state->scaler_id,
                              state->base.src.x1 >> 16,
                              state->base.dst.x1, state->base.dst.y1,
                              drm_rect_width(&state->base.dst),
                              drm_rect_height(&state->base.dst));
+               kfree(format_name);
        }
  }
  
@@@ -14648,7 -14654,7 +14652,7 @@@ static const struct drm_crtc_funcs inte
   */
  int
  intel_prepare_plane_fb(struct drm_plane *plane,
-                      const struct drm_plane_state *new_state)
+                      struct drm_plane_state *new_state)
  {
        struct drm_device *dev = plane->dev;
        struct drm_framebuffer *fb = new_state->fb;
   */
  void
  intel_cleanup_plane_fb(struct drm_plane *plane,
-                      const struct drm_plane_state *old_state)
+                      struct drm_plane_state *old_state)
  {
        struct drm_device *dev = plane->dev;
        struct intel_plane_state *old_intel_state;
@@@ -15650,6 -15656,7 +15654,7 @@@ static int intel_framebuffer_init(struc
        unsigned int tiling = i915_gem_object_get_tiling(obj);
        int ret;
        u32 pitch_limit, stride_alignment;
+       char *format_name;
  
        WARN_ON(!mutex_is_locked(&dev->struct_mutex));
  
                break;
        case DRM_FORMAT_XRGB1555:
                if (INTEL_INFO(dev)->gen > 3) {
-                       DRM_DEBUG("unsupported pixel format: %s\n",
-                                 drm_get_format_name(mode_cmd->pixel_format));
+                       format_name = drm_get_format_name(mode_cmd->pixel_format);
+                       DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+                       kfree(format_name);
                        return -EINVAL;
                }
                break;
        case DRM_FORMAT_ABGR8888:
                if (!IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev) &&
                    INTEL_INFO(dev)->gen < 9) {
-                       DRM_DEBUG("unsupported pixel format: %s\n",
-                                 drm_get_format_name(mode_cmd->pixel_format));
+                       format_name = drm_get_format_name(mode_cmd->pixel_format);
+                       DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+                       kfree(format_name);
                        return -EINVAL;
                }
                break;
        case DRM_FORMAT_XRGB2101010:
        case DRM_FORMAT_XBGR2101010:
                if (INTEL_INFO(dev)->gen < 4) {
-                       DRM_DEBUG("unsupported pixel format: %s\n",
-                                 drm_get_format_name(mode_cmd->pixel_format));
+                       format_name = drm_get_format_name(mode_cmd->pixel_format);
+                       DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+                       kfree(format_name);
                        return -EINVAL;
                }
                break;
        case DRM_FORMAT_ABGR2101010:
                if (!IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev)) {
-                       DRM_DEBUG("unsupported pixel format: %s\n",
-                                 drm_get_format_name(mode_cmd->pixel_format));
+                       format_name = drm_get_format_name(mode_cmd->pixel_format);
+                       DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+                       kfree(format_name);
                        return -EINVAL;
                }
                break;
        case DRM_FORMAT_YVYU:
        case DRM_FORMAT_VYUY:
                if (INTEL_INFO(dev)->gen < 5) {
-                       DRM_DEBUG("unsupported pixel format: %s\n",
-                                 drm_get_format_name(mode_cmd->pixel_format));
+                       format_name = drm_get_format_name(mode_cmd->pixel_format);
+                       DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+                       kfree(format_name);
                        return -EINVAL;
                }
                break;
        default:
-               DRM_DEBUG("unsupported pixel format: %s\n",
-                         drm_get_format_name(mode_cmd->pixel_format));
+               format_name = drm_get_format_name(mode_cmd->pixel_format);
+               DRM_DEBUG("unsupported pixel format: %s\n", format_name);
+               kfree(format_name);
                return -EINVAL;
        }
  
@@@ -15827,6 -15840,12 +15838,6 @@@ intel_user_framebuffer_create(struct dr
        return fb;
  }
  
 -#ifndef CONFIG_DRM_FBDEV_EMULATION
 -static inline void intel_fbdev_output_poll_changed(struct drm_device *dev)
 -{
 -}
 -#endif
 -
  static const struct drm_mode_config_funcs intel_mode_funcs = {
        .fb_create = intel_user_framebuffer_create,
        .output_poll_changed = intel_fbdev_output_poll_changed,
index 74df0fc66861cc89f87ddf8441a62139363fa19e,a19ec06f9e4281e5cecadb7e960080b853eb5139..f48e79ae2ac6caf6e453daa13aaabbf3fa00174d
@@@ -206,7 -206,6 +206,7 @@@ struct intel_encoder 
        struct drm_encoder base;
  
        enum intel_output_type type;
 +      enum port port;
        unsigned int cloneable;
        void (*hot_plug)(struct intel_encoder *);
        bool (*compute_config)(struct intel_encoder *,
        void (*suspend)(struct intel_encoder *);
        int crtc_mask;
        enum hpd_pin hpd_pin;
 +      /* for communication with audio component; protected by av_mutex */
 +      const struct drm_connector *audio_connector;
  };
  
  struct intel_panel {
@@@ -962,6 -959,8 +962,6 @@@ struct intel_digital_port 
        enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
        bool release_cl2_override;
        uint8_t max_lanes;
 -      /* for communication with audio component; protected by av_mutex */
 -      const struct drm_connector *audio_connector;
  };
  
  struct intel_dp_mst_encoder {
@@@ -1269,9 -1268,9 +1269,9 @@@ void intel_finish_page_flip_cs(struct d
  void intel_finish_page_flip_mmio(struct drm_i915_private *dev_priv, int pipe);
  void intel_check_page_flip(struct drm_i915_private *dev_priv, int pipe);
  int intel_prepare_plane_fb(struct drm_plane *plane,
-                          const struct drm_plane_state *new_state);
+                          struct drm_plane_state *new_state);
  void intel_cleanup_plane_fb(struct drm_plane *plane,
-                           const struct drm_plane_state *old_state);
+                           struct drm_plane_state *old_state);
  int intel_plane_atomic_get_property(struct drm_plane *plane,
                                    const struct drm_plane_state *state,
                                    struct drm_property *property,
@@@ -1488,10 -1487,6 +1488,10 @@@ static inline void intel_fbdev_set_susp
  {
  }
  
 +static inline void intel_fbdev_output_poll_changed(struct drm_device *dev)
 +{
 +}
 +
  static inline void intel_fbdev_restore_mode(struct drm_device *dev)
  {
  }
@@@ -1518,7 -1513,6 +1518,7 @@@ void intel_fbc_invalidate(struct drm_i9
  void intel_fbc_flush(struct drm_i915_private *dev_priv,
                     unsigned int frontbuffer_bits, enum fb_op_origin origin);
  void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv);
 +void intel_fbc_handle_fifo_underrun_irq(struct drm_i915_private *dev_priv);
  
  /* intel_hdmi.c */
  void intel_hdmi_init(struct drm_device *dev, i915_reg_t hdmi_reg, enum port port);
index 8d49800064df6e6067d56c23582712b09d44e949,f40a35f2913a8222f2800bfa081b3adb1c636288..8d46f5836746d1eca3459ac6624e4807a7d35efe
@@@ -1220,10 -1220,17 +1220,17 @@@ static int hdmi_port_clock_limit(struc
        int max_tmds_clock = intel_hdmi_source_max_tmds_clock(to_i915(dev));
  
        if (respect_downstream_limits) {
+               struct intel_connector *connector = hdmi->attached_connector;
+               const struct drm_display_info *info = &connector->base.display_info;
                if (hdmi->dp_dual_mode.max_tmds_clock)
                        max_tmds_clock = min(max_tmds_clock,
                                             hdmi->dp_dual_mode.max_tmds_clock);
-               if (!hdmi->has_hdmi_sink)
+               if (info->max_tmds_clock)
+                       max_tmds_clock = min(max_tmds_clock,
+                                            info->max_tmds_clock);
+               else if (!hdmi->has_hdmi_sink)
                        max_tmds_clock = min(max_tmds_clock, 165000);
        }
  
@@@ -1972,7 -1979,6 +1979,7 @@@ void intel_hdmi_init(struct drm_device 
        }
  
        intel_encoder->type = INTEL_OUTPUT_HDMI;
 +      intel_encoder->port = port;
        if (IS_CHERRYVIEW(dev)) {
                if (port == PORT_D)
                        intel_encoder->crtc_mask = 1 << 2;
index c44f074f54aece447ba6154c201027002fdf05ae,e1d47d51ea4784493fc707029c008673df7d0179..2e943bd1c3cf8dd416c6bef2f4a3ef3d4f5a328d
@@@ -1064,9 -1064,8 +1064,9 @@@ void intel_lvds_init(struct drm_device 
        intel_connector->get_hw_state = intel_connector_get_hw_state;
  
        intel_connector_attach_encoder(intel_connector, intel_encoder);
 -      intel_encoder->type = INTEL_OUTPUT_LVDS;
  
 +      intel_encoder->type = INTEL_OUTPUT_LVDS;
 +      intel_encoder->port = PORT_NONE;
        intel_encoder->cloneable = 0;
        if (HAS_PCH_SPLIT(dev))
                intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
        }
        lvds_connector->base.edid = edid;
  
-       if (IS_ERR_OR_NULL(edid)) {
-               /* Didn't get an EDID, so
-                * Set wide sync ranges so we get all modes
-                * handed to valid_mode for checking
-                */
-               connector->display_info.min_vfreq = 0;
-               connector->display_info.max_vfreq = 200;
-               connector->display_info.min_hfreq = 0;
-               connector->display_info.max_hfreq = 200;
-       }
        list_for_each_entry(scan, &connector->probed_modes, head) {
                if (scan->type & DRM_MODE_TYPE_PREFERRED) {
                        DRM_DEBUG_KMS("using preferred mode from EDID: ");