drm/i915/debugfs: Print sink PSR status
[linux-2.6-block.git] / drivers / gpu / drm / i915 / i915_debugfs.c
index 3560eb567ca727b4f2f867c4597a5f1a80df7370..cb1a804bf72e5836e8bbfbfcc2db8d644bc7ce2b 100644 (file)
@@ -150,8 +150,8 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
                   get_global_flag(obj),
                   get_pin_mapped_flag(obj),
                   obj->base.size / 1024,
-                  obj->base.read_domains,
-                  obj->base.write_domain,
+                  obj->read_domains,
+                  obj->write_domain,
                   i915_cache_level_str(dev_priv, obj->cache_level),
                   obj->mm.dirty ? " dirty" : "",
                   obj->mm.madv == I915_MADV_DONTNEED ? " purgeable" : "");
@@ -519,7 +519,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
        list_for_each_entry_reverse(file, &dev->filelist, lhead) {
                struct file_stats stats;
                struct drm_i915_file_private *file_priv = file->driver_priv;
-               struct drm_i915_gem_request *request;
+               struct i915_request *request;
                struct task_struct *task;
 
                mutex_lock(&dev->struct_mutex);
@@ -536,7 +536,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
                 * Therefore, we need to protect this ->comm access using RCU.
                 */
                request = list_first_entry_or_null(&file_priv->mm.request_list,
-                                                  struct drm_i915_gem_request,
+                                                  struct i915_request,
                                                   client_link);
                rcu_read_lock();
                task = pid_task(request && request->ctx->pid ?
@@ -646,6 +646,56 @@ static int i915_gem_batch_pool_info(struct seq_file *m, void *data)
        return 0;
 }
 
+static void gen8_display_interrupt_info(struct seq_file *m)
+{
+       struct drm_i915_private *dev_priv = node_to_i915(m->private);
+       int pipe;
+
+       for_each_pipe(dev_priv, pipe) {
+               enum intel_display_power_domain power_domain;
+
+               power_domain = POWER_DOMAIN_PIPE(pipe);
+               if (!intel_display_power_get_if_enabled(dev_priv,
+                                                       power_domain)) {
+                       seq_printf(m, "Pipe %c power disabled\n",
+                                  pipe_name(pipe));
+                       continue;
+               }
+               seq_printf(m, "Pipe %c IMR:\t%08x\n",
+                          pipe_name(pipe),
+                          I915_READ(GEN8_DE_PIPE_IMR(pipe)));
+               seq_printf(m, "Pipe %c IIR:\t%08x\n",
+                          pipe_name(pipe),
+                          I915_READ(GEN8_DE_PIPE_IIR(pipe)));
+               seq_printf(m, "Pipe %c IER:\t%08x\n",
+                          pipe_name(pipe),
+                          I915_READ(GEN8_DE_PIPE_IER(pipe)));
+
+               intel_display_power_put(dev_priv, power_domain);
+       }
+
+       seq_printf(m, "Display Engine port interrupt mask:\t%08x\n",
+                  I915_READ(GEN8_DE_PORT_IMR));
+       seq_printf(m, "Display Engine port interrupt identity:\t%08x\n",
+                  I915_READ(GEN8_DE_PORT_IIR));
+       seq_printf(m, "Display Engine port interrupt enable:\t%08x\n",
+                  I915_READ(GEN8_DE_PORT_IER));
+
+       seq_printf(m, "Display Engine misc interrupt mask:\t%08x\n",
+                  I915_READ(GEN8_DE_MISC_IMR));
+       seq_printf(m, "Display Engine misc interrupt identity:\t%08x\n",
+                  I915_READ(GEN8_DE_MISC_IIR));
+       seq_printf(m, "Display Engine misc interrupt enable:\t%08x\n",
+                  I915_READ(GEN8_DE_MISC_IER));
+
+       seq_printf(m, "PCU interrupt mask:\t%08x\n",
+                  I915_READ(GEN8_PCU_IMR));
+       seq_printf(m, "PCU interrupt identity:\t%08x\n",
+                  I915_READ(GEN8_PCU_IIR));
+       seq_printf(m, "PCU interrupt enable:\t%08x\n",
+                  I915_READ(GEN8_PCU_IER));
+}
+
 static int i915_interrupt_info(struct seq_file *m, void *data)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -709,6 +759,27 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
                           I915_READ(GEN8_PCU_IIR));
                seq_printf(m, "PCU interrupt enable:\t%08x\n",
                           I915_READ(GEN8_PCU_IER));
+       } else if (INTEL_GEN(dev_priv) >= 11) {
+               seq_printf(m, "Master Interrupt Control:  %08x\n",
+                          I915_READ(GEN11_GFX_MSTR_IRQ));
+
+               seq_printf(m, "Render/Copy Intr Enable:   %08x\n",
+                          I915_READ(GEN11_RENDER_COPY_INTR_ENABLE));
+               seq_printf(m, "VCS/VECS Intr Enable:      %08x\n",
+                          I915_READ(GEN11_VCS_VECS_INTR_ENABLE));
+               seq_printf(m, "GUC/SG Intr Enable:\t   %08x\n",
+                          I915_READ(GEN11_GUC_SG_INTR_ENABLE));
+               seq_printf(m, "GPM/WGBOXPERF Intr Enable: %08x\n",
+                          I915_READ(GEN11_GPM_WGBOXPERF_INTR_ENABLE));
+               seq_printf(m, "Crypto Intr Enable:\t   %08x\n",
+                          I915_READ(GEN11_CRYPTO_RSVD_INTR_ENABLE));
+               seq_printf(m, "GUnit/CSME Intr Enable:\t   %08x\n",
+                          I915_READ(GEN11_GUNIT_CSME_INTR_ENABLE));
+
+               seq_printf(m, "Display Interrupt Control:\t%08x\n",
+                          I915_READ(GEN11_DISPLAY_INT_CTL));
+
+               gen8_display_interrupt_info(m);
        } else if (INTEL_GEN(dev_priv) >= 8) {
                seq_printf(m, "Master Interrupt Control:\t%08x\n",
                           I915_READ(GEN8_MASTER_IRQ));
@@ -722,49 +793,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
                                   i, I915_READ(GEN8_GT_IER(i)));
                }
 
-               for_each_pipe(dev_priv, pipe) {
-                       enum intel_display_power_domain power_domain;
-
-                       power_domain = POWER_DOMAIN_PIPE(pipe);
-                       if (!intel_display_power_get_if_enabled(dev_priv,
-                                                               power_domain)) {
-                               seq_printf(m, "Pipe %c power disabled\n",
-                                          pipe_name(pipe));
-                               continue;
-                       }
-                       seq_printf(m, "Pipe %c IMR:\t%08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(GEN8_DE_PIPE_IMR(pipe)));
-                       seq_printf(m, "Pipe %c IIR:\t%08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(GEN8_DE_PIPE_IIR(pipe)));
-                       seq_printf(m, "Pipe %c IER:\t%08x\n",
-                                  pipe_name(pipe),
-                                  I915_READ(GEN8_DE_PIPE_IER(pipe)));
-
-                       intel_display_power_put(dev_priv, power_domain);
-               }
-
-               seq_printf(m, "Display Engine port interrupt mask:\t%08x\n",
-                          I915_READ(GEN8_DE_PORT_IMR));
-               seq_printf(m, "Display Engine port interrupt identity:\t%08x\n",
-                          I915_READ(GEN8_DE_PORT_IIR));
-               seq_printf(m, "Display Engine port interrupt enable:\t%08x\n",
-                          I915_READ(GEN8_DE_PORT_IER));
-
-               seq_printf(m, "Display Engine misc interrupt mask:\t%08x\n",
-                          I915_READ(GEN8_DE_MISC_IMR));
-               seq_printf(m, "Display Engine misc interrupt identity:\t%08x\n",
-                          I915_READ(GEN8_DE_MISC_IIR));
-               seq_printf(m, "Display Engine misc interrupt enable:\t%08x\n",
-                          I915_READ(GEN8_DE_MISC_IER));
-
-               seq_printf(m, "PCU interrupt mask:\t%08x\n",
-                          I915_READ(GEN8_PCU_IMR));
-               seq_printf(m, "PCU interrupt identity:\t%08x\n",
-                          I915_READ(GEN8_PCU_IIR));
-               seq_printf(m, "PCU interrupt enable:\t%08x\n",
-                          I915_READ(GEN8_PCU_IER));
+               gen8_display_interrupt_info(m);
        } else if (IS_VALLEYVIEW(dev_priv)) {
                seq_printf(m, "Display IER:\t%08x\n",
                           I915_READ(VLV_IER));
@@ -846,13 +875,35 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
                seq_printf(m, "Graphics Interrupt mask:         %08x\n",
                           I915_READ(GTIMR));
        }
-       if (INTEL_GEN(dev_priv) >= 6) {
+
+       if (INTEL_GEN(dev_priv) >= 11) {
+               seq_printf(m, "RCS Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_RCS0_RSVD_INTR_MASK));
+               seq_printf(m, "BCS Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_BCS_RSVD_INTR_MASK));
+               seq_printf(m, "VCS0/VCS1 Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_VCS0_VCS1_INTR_MASK));
+               seq_printf(m, "VCS2/VCS3 Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_VCS2_VCS3_INTR_MASK));
+               seq_printf(m, "VECS0/VECS1 Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_VECS0_VECS1_INTR_MASK));
+               seq_printf(m, "GUC/SG Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_GUC_SG_INTR_MASK));
+               seq_printf(m, "GPM/WGBOXPERF Intr Mask: %08x\n",
+                          I915_READ(GEN11_GPM_WGBOXPERF_INTR_MASK));
+               seq_printf(m, "Crypto Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_CRYPTO_RSVD_INTR_MASK));
+               seq_printf(m, "Gunit/CSME Intr Mask:\t %08x\n",
+                          I915_READ(GEN11_GUNIT_CSME_INTR_MASK));
+
+       } else if (INTEL_GEN(dev_priv) >= 6) {
                for_each_engine(engine, dev_priv, id) {
                        seq_printf(m,
                                   "Graphics Interrupt mask (%s):       %08x\n",
                                   engine->name, I915_READ_IMR(engine));
                }
        }
+
        intel_runtime_pm_put(dev_priv);
 
        return 0;
@@ -1164,20 +1215,20 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 :
                            rp_state_cap >> 16) & 0xff;
                max_freq *= (IS_GEN9_BC(dev_priv) ||
-                            IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+                            INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
                seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
                           intel_gpu_freq(dev_priv, max_freq));
 
                max_freq = (rp_state_cap & 0xff00) >> 8;
                max_freq *= (IS_GEN9_BC(dev_priv) ||
-                            IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+                            INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
                seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
                           intel_gpu_freq(dev_priv, max_freq));
 
                max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 :
                            rp_state_cap >> 0) & 0xff;
                max_freq *= (IS_GEN9_BC(dev_priv) ||
-                            IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+                            INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
                seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
                           intel_gpu_freq(dev_priv, max_freq));
                seq_printf(m, "Max overclocked frequency: %dMHz\n",
@@ -1745,9 +1796,9 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        struct intel_rps *rps = &dev_priv->gt_pm.rps;
-       int ret = 0;
-       int gpu_freq, ia_freq;
        unsigned int max_gpu_freq, min_gpu_freq;
+       int gpu_freq, ia_freq;
+       int ret;
 
        if (!HAS_LLC(dev_priv))
                return -ENODEV;
@@ -1758,13 +1809,12 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
        if (ret)
                goto out;
 
-       if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+       min_gpu_freq = rps->min_freq;
+       max_gpu_freq = rps->max_freq;
+       if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
                /* Convert GT frequency to 50 HZ units */
-               min_gpu_freq = rps->min_freq_softlimit / GEN9_FREQ_SCALER;
-               max_gpu_freq = rps->max_freq_softlimit / GEN9_FREQ_SCALER;
-       } else {
-               min_gpu_freq = rps->min_freq_softlimit;
-               max_gpu_freq = rps->max_freq_softlimit;
+               min_gpu_freq /= GEN9_FREQ_SCALER;
+               max_gpu_freq /= GEN9_FREQ_SCALER;
        }
 
        seq_puts(m, "GPU freq (MHz)\tEffective CPU freq (MHz)\tEffective Ring freq (MHz)\n");
@@ -1777,7 +1827,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
                seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
                           intel_gpu_freq(dev_priv, (gpu_freq *
                                                     (IS_GEN9_BC(dev_priv) ||
-                                                     IS_CANNONLAKE(dev_priv) ?
+                                                     INTEL_GEN(dev_priv) >= 10 ?
                                                      GEN9_FREQ_SCALER : 1))),
                           ((ia_freq >> 0) & 0xff) * 100,
                           ((ia_freq >> 8) & 0xff) * 100);
@@ -1872,8 +1922,8 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 
 static void describe_ctx_ring(struct seq_file *m, struct intel_ring *ring)
 {
-       seq_printf(m, " (ringbuffer, space: %d, head: %u, tail: %u)",
-                  ring->space, ring->head, ring->tail);
+       seq_printf(m, " (ringbuffer, space: %d, head: %u, tail: %u, emit: %u)",
+                  ring->space, ring->head, ring->tail, ring->emit);
 }
 
 static int i915_context_status(struct seq_file *m, void *unused)
@@ -2275,30 +2325,45 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
        return 0;
 }
 
-static void i915_guc_log_info(struct seq_file *m,
-                             struct drm_i915_private *dev_priv)
+static const char *
+stringify_guc_log_type(enum guc_log_buffer_type type)
 {
-       struct intel_guc *guc = &dev_priv->guc;
+       switch (type) {
+       case GUC_ISR_LOG_BUFFER:
+               return "ISR";
+       case GUC_DPC_LOG_BUFFER:
+               return "DPC";
+       case GUC_CRASH_DUMP_LOG_BUFFER:
+               return "CRASH";
+       default:
+               MISSING_CASE(type);
+       }
 
-       seq_puts(m, "\nGuC logging stats:\n");
+       return "";
+}
 
-       seq_printf(m, "\tISR:   flush count %10u, overflow count %10u\n",
-                  guc->log.flush_count[GUC_ISR_LOG_BUFFER],
-                  guc->log.total_overflow_count[GUC_ISR_LOG_BUFFER]);
+static void i915_guc_log_info(struct seq_file *m,
+                             struct drm_i915_private *dev_priv)
+{
+       struct intel_guc_log *log = &dev_priv->guc.log;
+       enum guc_log_buffer_type type;
 
-       seq_printf(m, "\tDPC:   flush count %10u, overflow count %10u\n",
-                  guc->log.flush_count[GUC_DPC_LOG_BUFFER],
-                  guc->log.total_overflow_count[GUC_DPC_LOG_BUFFER]);
+       if (!intel_guc_log_relay_enabled(log)) {
+               seq_puts(m, "GuC log relay disabled\n");
+               return;
+       }
 
-       seq_printf(m, "\tCRASH: flush count %10u, overflow count %10u\n",
-                  guc->log.flush_count[GUC_CRASH_DUMP_LOG_BUFFER],
-                  guc->log.total_overflow_count[GUC_CRASH_DUMP_LOG_BUFFER]);
+       seq_puts(m, "GuC logging stats:\n");
 
-       seq_printf(m, "\tTotal flush interrupt count: %u\n",
-                  guc->log.flush_interrupt_count);
+       seq_printf(m, "\tRelay full count: %u\n",
+                  log->relay.full_count);
 
-       seq_printf(m, "\tCapture miss count: %u\n",
-                  guc->log.capture_miss_count);
+       for (type = GUC_ISR_LOG_BUFFER; type < GUC_MAX_LOG_BUFFER; type++) {
+               seq_printf(m, "\t%s:\tflush count %10u, overflow count %10u\n",
+                          stringify_guc_log_type(type),
+                          log->stats[type].flush,
+                          log->stats[type].sampled_overflow);
+       }
 }
 
 static void i915_guc_client_info(struct seq_file *m,
@@ -2328,14 +2393,19 @@ static int i915_guc_info(struct seq_file *m, void *data)
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        const struct intel_guc *guc = &dev_priv->guc;
 
-       if (!USES_GUC_SUBMISSION(dev_priv))
+       if (!USES_GUC(dev_priv))
                return -ENODEV;
 
+       i915_guc_log_info(m, dev_priv);
+
+       if (!USES_GUC_SUBMISSION(dev_priv))
+               return 0;
+
        GEM_BUG_ON(!guc->execbuf_client);
 
-       seq_printf(m, "Doorbell map:\n");
+       seq_printf(m, "\nDoorbell map:\n");
        seq_printf(m, "\t%*pb\n", GUC_NUM_DOORBELLS, guc->doorbell_bitmap);
-       seq_printf(m, "Doorbell next cacheline: 0x%x\n\n", guc->db_cacheline);
+       seq_printf(m, "Doorbell next cacheline: 0x%x\n", guc->db_cacheline);
 
        seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client);
        i915_guc_client_info(m, dev_priv, guc->execbuf_client);
@@ -2345,8 +2415,6 @@ static int i915_guc_info(struct seq_file *m, void *data)
                i915_guc_client_info(m, dev_priv, guc->preempt_client);
        }
 
-       i915_guc_log_info(m, dev_priv);
-
        /* Add more as required ... */
 
        return 0;
@@ -2445,35 +2513,73 @@ static int i915_guc_log_dump(struct seq_file *m, void *data)
        return 0;
 }
 
-static int i915_guc_log_control_get(void *data, u64 *val)
+static int i915_guc_log_level_get(void *data, u64 *val)
 {
        struct drm_i915_private *dev_priv = data;
 
-       if (!HAS_GUC(dev_priv))
+       if (!USES_GUC(dev_priv))
                return -ENODEV;
 
-       if (!dev_priv->guc.log.vma)
-               return -EINVAL;
-
-       *val = i915_modparams.guc_log_level;
+       *val = intel_guc_log_level_get(&dev_priv->guc.log);
 
        return 0;
 }
 
-static int i915_guc_log_control_set(void *data, u64 val)
+static int i915_guc_log_level_set(void *data, u64 val)
 {
        struct drm_i915_private *dev_priv = data;
 
-       if (!HAS_GUC(dev_priv))
+       if (!USES_GUC(dev_priv))
                return -ENODEV;
 
-       return intel_guc_log_control(&dev_priv->guc, val);
+       return intel_guc_log_level_set(&dev_priv->guc.log, val);
 }
 
-DEFINE_SIMPLE_ATTRIBUTE(i915_guc_log_control_fops,
-                       i915_guc_log_control_get, i915_guc_log_control_set,
+DEFINE_SIMPLE_ATTRIBUTE(i915_guc_log_level_fops,
+                       i915_guc_log_level_get, i915_guc_log_level_set,
                        "%lld\n");
 
+static int i915_guc_log_relay_open(struct inode *inode, struct file *file)
+{
+       struct drm_i915_private *dev_priv = inode->i_private;
+
+       if (!USES_GUC(dev_priv))
+               return -ENODEV;
+
+       file->private_data = &dev_priv->guc.log;
+
+       return intel_guc_log_relay_open(&dev_priv->guc.log);
+}
+
+static ssize_t
+i915_guc_log_relay_write(struct file *filp,
+                        const char __user *ubuf,
+                        size_t cnt,
+                        loff_t *ppos)
+{
+       struct intel_guc_log *log = filp->private_data;
+
+       intel_guc_log_relay_flush(log);
+
+       return cnt;
+}
+
+static int i915_guc_log_relay_release(struct inode *inode, struct file *file)
+{
+       struct drm_i915_private *dev_priv = inode->i_private;
+
+       intel_guc_log_relay_close(&dev_priv->guc.log);
+
+       return 0;
+}
+
+static const struct file_operations i915_guc_log_relay_fops = {
+       .owner = THIS_MODULE,
+       .open = i915_guc_log_relay_open,
+       .write = i915_guc_log_relay_write,
+       .release = i915_guc_log_relay_release,
+};
+
 static const char *psr2_live_status(u32 val)
 {
        static const char * const live_status[] = {
@@ -2497,6 +2603,26 @@ static const char *psr2_live_status(u32 val)
        return "unknown";
 }
 
+static const char *psr_sink_status(u8 val)
+{
+       static const char * const sink_status[] = {
+               "inactive",
+               "transition to active, capture and display",
+               "active, display from RFB",
+               "active, capture and display on sink device timings",
+               "transition to inactive, capture and display, timing re-sync",
+               "reserved",
+               "reserved",
+               "sink internal error"
+       };
+
+       val &= DP_PSR_SINK_STATE_MASK;
+       if (val < ARRAY_SIZE(sink_status))
+               return sink_status[val];
+
+       return "unknown";
+}
+
 static int i915_edp_psr_status(struct seq_file *m, void *data)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -2518,14 +2644,13 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
 
        mutex_lock(&dev_priv->psr.lock);
        seq_printf(m, "Enabled: %s\n", yesno((bool)dev_priv->psr.enabled));
-       seq_printf(m, "Active: %s\n", yesno(dev_priv->psr.active));
        seq_printf(m, "Busy frontbuffer bits: 0x%03x\n",
                   dev_priv->psr.busy_frontbuffer_bits);
        seq_printf(m, "Re-enable work scheduled: %s\n",
                   yesno(work_busy(&dev_priv->psr.work.work)));
 
        if (HAS_DDI(dev_priv)) {
-               if (dev_priv->psr.psr2_support)
+               if (dev_priv->psr.psr2_enabled)
                        enabled = I915_READ(EDP_PSR2_CTL) & EDP_PSR2_ENABLE;
                else
                        enabled = I915_READ(EDP_PSR_CTL) & EDP_PSR_ENABLE;
@@ -2573,18 +2698,67 @@ static int i915_edp_psr_status(struct seq_file *m, void *data)
 
                seq_printf(m, "Performance_Counter: %u\n", psrperf);
        }
-       if (dev_priv->psr.psr2_support) {
+       if (dev_priv->psr.psr2_enabled) {
                u32 psr2 = I915_READ(EDP_PSR2_STATUS);
 
                seq_printf(m, "EDP_PSR2_STATUS: %x [%s]\n",
                           psr2, psr2_live_status(psr2));
        }
+
+       if (dev_priv->psr.enabled) {
+               struct drm_dp_aux *aux = &dev_priv->psr.enabled->aux;
+               u8 val;
+
+               if (drm_dp_dpcd_readb(aux, DP_PSR_STATUS, &val) == 1)
+                       seq_printf(m, "Sink PSR status: 0x%x [%s]\n", val,
+                                  psr_sink_status(val));
+       }
        mutex_unlock(&dev_priv->psr.lock);
 
+       if (READ_ONCE(dev_priv->psr.debug)) {
+               seq_printf(m, "Last attempted entry at: %lld\n",
+                          dev_priv->psr.last_entry_attempt);
+               seq_printf(m, "Last exit at: %lld\n",
+                          dev_priv->psr.last_exit);
+       }
+
+       intel_runtime_pm_put(dev_priv);
+       return 0;
+}
+
+static int
+i915_edp_psr_debug_set(void *data, u64 val)
+{
+       struct drm_i915_private *dev_priv = data;
+
+       if (!CAN_PSR(dev_priv))
+               return -ENODEV;
+
+       DRM_DEBUG_KMS("PSR debug %s\n", enableddisabled(val));
+
+       intel_runtime_pm_get(dev_priv);
+       intel_psr_irq_control(dev_priv, !!val);
        intel_runtime_pm_put(dev_priv);
+
        return 0;
 }
 
+static int
+i915_edp_psr_debug_get(void *data, u64 *val)
+{
+       struct drm_i915_private *dev_priv = data;
+
+       if (!CAN_PSR(dev_priv))
+               return -ENODEV;
+
+       *val = READ_ONCE(dev_priv->psr.debug);
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(i915_edp_psr_debug_fops,
+                       i915_edp_psr_debug_get, i915_edp_psr_debug_set,
+                       "%llu\n");
+
 static int i915_sink_crc(struct seq_file *m, void *data)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
@@ -3150,6 +3324,16 @@ static int i915_engine_info(struct seq_file *m, void *unused)
        return 0;
 }
 
+static int i915_rcs_topology(struct seq_file *m, void *unused)
+{
+       struct drm_i915_private *dev_priv = node_to_i915(m->private);
+       struct drm_printer p = drm_seq_file_printer(m);
+
+       intel_device_info_dump_topology(&INTEL_INFO(dev_priv)->sseu, &p);
+
+       return 0;
+}
+
 static int i915_shrinker_info(struct seq_file *m, void *unused)
 {
        struct drm_i915_private *i915 = node_to_i915(m->private);
@@ -3170,7 +3354,8 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused)
        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
 
-               seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->name, pll->id);
+               seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->info->name,
+                          pll->info->id);
                seq_printf(m, " crtc_mask: 0x%08x, active: 0x%x, on: %s\n",
                           pll->state.crtc_mask, pll->active_mask, yesno(pll->on));
                seq_printf(m, " tracked hardware state:\n");
@@ -3188,24 +3373,13 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused)
 
 static int i915_wa_registers(struct seq_file *m, void *unused)
 {
-       int i;
-       int ret;
-       struct intel_engine_cs *engine;
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
-       struct drm_device *dev = &dev_priv->drm;
        struct i915_workarounds *workarounds = &dev_priv->workarounds;
-       enum intel_engine_id id;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
+       int i;
 
        intel_runtime_pm_get(dev_priv);
 
        seq_printf(m, "Workarounds applied: %d\n", workarounds->count);
-       for_each_engine(engine, dev_priv, id)
-               seq_printf(m, "HW whitelist count for %s: %d\n",
-                          engine->name, workarounds->hw_whitelist_count[id]);
        for (i = 0; i < workarounds->count; ++i) {
                i915_reg_t addr;
                u32 mask, value, read;
@@ -3221,7 +3395,6 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
        }
 
        intel_runtime_pm_put(dev_priv);
-       mutex_unlock(&dev->struct_mutex);
 
        return 0;
 }
@@ -3506,7 +3679,8 @@ static ssize_t i915_displayport_test_active_write(struct file *file,
 
 static int i915_displayport_test_active_show(struct seq_file *m, void *data)
 {
-       struct drm_device *dev = m->private;
+       struct drm_i915_private *dev_priv = m->private;
+       struct drm_device *dev = &dev_priv->drm;
        struct drm_connector *connector;
        struct drm_connector_list_iter conn_iter;
        struct intel_dp *intel_dp;
@@ -3540,10 +3714,8 @@ static int i915_displayport_test_active_show(struct seq_file *m, void *data)
 static int i915_displayport_test_active_open(struct inode *inode,
                                             struct file *file)
 {
-       struct drm_i915_private *dev_priv = inode->i_private;
-
        return single_open(file, i915_displayport_test_active_show,
-                          &dev_priv->drm);
+                          inode->i_private);
 }
 
 static const struct file_operations i915_displayport_test_active_fops = {
@@ -3557,7 +3729,8 @@ static const struct file_operations i915_displayport_test_active_fops = {
 
 static int i915_displayport_test_data_show(struct seq_file *m, void *data)
 {
-       struct drm_device *dev = m->private;
+       struct drm_i915_private *dev_priv = m->private;
+       struct drm_device *dev = &dev_priv->drm;
        struct drm_connector *connector;
        struct drm_connector_list_iter conn_iter;
        struct intel_dp *intel_dp;
@@ -3596,26 +3769,12 @@ static int i915_displayport_test_data_show(struct seq_file *m, void *data)
 
        return 0;
 }
-static int i915_displayport_test_data_open(struct inode *inode,
-                                          struct file *file)
-{
-       struct drm_i915_private *dev_priv = inode->i_private;
-
-       return single_open(file, i915_displayport_test_data_show,
-                          &dev_priv->drm);
-}
-
-static const struct file_operations i915_displayport_test_data_fops = {
-       .owner = THIS_MODULE,
-       .open = i915_displayport_test_data_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release
-};
+DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_data);
 
 static int i915_displayport_test_type_show(struct seq_file *m, void *data)
 {
-       struct drm_device *dev = m->private;
+       struct drm_i915_private *dev_priv = m->private;
+       struct drm_device *dev = &dev_priv->drm;
        struct drm_connector *connector;
        struct drm_connector_list_iter conn_iter;
        struct intel_dp *intel_dp;
@@ -3642,23 +3801,7 @@ static int i915_displayport_test_type_show(struct seq_file *m, void *data)
 
        return 0;
 }
-
-static int i915_displayport_test_type_open(struct inode *inode,
-                                      struct file *file)
-{
-       struct drm_i915_private *dev_priv = inode->i_private;
-
-       return single_open(file, i915_displayport_test_type_show,
-                          &dev_priv->drm);
-}
-
-static const struct file_operations i915_displayport_test_type_fops = {
-       .owner = THIS_MODULE,
-       .open = i915_displayport_test_type_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release
-};
+DEFINE_SHOW_ATTRIBUTE(i915_displayport_test_type);
 
 static void wm_latency_show(struct seq_file *m, const uint16_t wm[8])
 {
@@ -3926,7 +4069,8 @@ i915_wedged_set(void *data, u64 val)
                engine->hangcheck.stalled = true;
        }
 
-       i915_handle_error(i915, val, "Manually setting wedged to %llu", val);
+       i915_handle_error(i915, val, I915_ERROR_CAPTURE,
+                         "Manually set wedged engine mask = %llx", val);
 
        wait_on_bit(&i915->gpu_error.flags,
                    I915_RESET_HANDOFF,
@@ -4060,7 +4204,7 @@ i915_drop_caches_set(void *data, u64 val)
                                                     I915_WAIT_LOCKED);
 
                if (val & DROP_RETIRE)
-                       i915_gem_retire_requests(dev_priv);
+                       i915_retire_requests(dev_priv);
 
                mutex_unlock(&dev->struct_mutex);
        }
@@ -4079,10 +4223,8 @@ i915_drop_caches_set(void *data, u64 val)
        if (val & DROP_IDLE)
                drain_delayed_work(&dev_priv->gt.idle_work);
 
-       if (val & DROP_FREED) {
-               synchronize_rcu();
+       if (val & DROP_FREED)
                i915_gem_drain_freed_objects(dev_priv);
-       }
 
        return ret;
 }
@@ -4091,119 +4233,6 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_drop_caches_fops,
                        i915_drop_caches_get, i915_drop_caches_set,
                        "0x%08llx\n");
 
-static int
-i915_max_freq_get(void *data, u64 *val)
-{
-       struct drm_i915_private *dev_priv = data;
-
-       if (INTEL_GEN(dev_priv) < 6)
-               return -ENODEV;
-
-       *val = intel_gpu_freq(dev_priv, dev_priv->gt_pm.rps.max_freq_softlimit);
-       return 0;
-}
-
-static int
-i915_max_freq_set(void *data, u64 val)
-{
-       struct drm_i915_private *dev_priv = data;
-       struct intel_rps *rps = &dev_priv->gt_pm.rps;
-       u32 hw_max, hw_min;
-       int ret;
-
-       if (INTEL_GEN(dev_priv) < 6)
-               return -ENODEV;
-
-       DRM_DEBUG_DRIVER("Manually setting max freq to %llu\n", val);
-
-       ret = mutex_lock_interruptible(&dev_priv->pcu_lock);
-       if (ret)
-               return ret;
-
-       /*
-        * Turbo will still be enabled, but won't go above the set value.
-        */
-       val = intel_freq_opcode(dev_priv, val);
-
-       hw_max = rps->max_freq;
-       hw_min = rps->min_freq;
-
-       if (val < hw_min || val > hw_max || val < rps->min_freq_softlimit) {
-               mutex_unlock(&dev_priv->pcu_lock);
-               return -EINVAL;
-       }
-
-       rps->max_freq_softlimit = val;
-
-       if (intel_set_rps(dev_priv, val))
-               DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
-
-       mutex_unlock(&dev_priv->pcu_lock);
-
-       return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(i915_max_freq_fops,
-                       i915_max_freq_get, i915_max_freq_set,
-                       "%llu\n");
-
-static int
-i915_min_freq_get(void *data, u64 *val)
-{
-       struct drm_i915_private *dev_priv = data;
-
-       if (INTEL_GEN(dev_priv) < 6)
-               return -ENODEV;
-
-       *val = intel_gpu_freq(dev_priv, dev_priv->gt_pm.rps.min_freq_softlimit);
-       return 0;
-}
-
-static int
-i915_min_freq_set(void *data, u64 val)
-{
-       struct drm_i915_private *dev_priv = data;
-       struct intel_rps *rps = &dev_priv->gt_pm.rps;
-       u32 hw_max, hw_min;
-       int ret;
-
-       if (INTEL_GEN(dev_priv) < 6)
-               return -ENODEV;
-
-       DRM_DEBUG_DRIVER("Manually setting min freq to %llu\n", val);
-
-       ret = mutex_lock_interruptible(&dev_priv->pcu_lock);
-       if (ret)
-               return ret;
-
-       /*
-        * Turbo will still be enabled, but won't go below the set value.
-        */
-       val = intel_freq_opcode(dev_priv, val);
-
-       hw_max = rps->max_freq;
-       hw_min = rps->min_freq;
-
-       if (val < hw_min ||
-           val > hw_max || val > rps->max_freq_softlimit) {
-               mutex_unlock(&dev_priv->pcu_lock);
-               return -EINVAL;
-       }
-
-       rps->min_freq_softlimit = val;
-
-       if (intel_set_rps(dev_priv, val))
-               DRM_DEBUG_DRIVER("failed to update RPS to new softlimit\n");
-
-       mutex_unlock(&dev_priv->pcu_lock);
-
-       return 0;
-}
-
-DEFINE_SIMPLE_ATTRIBUTE(i915_min_freq_fops,
-                       i915_min_freq_get, i915_min_freq_set,
-                       "%llu\n");
-
 static int
 i915_cache_sharing_get(void *data, u64 *val)
 {
@@ -4256,9 +4285,10 @@ DEFINE_SIMPLE_ATTRIBUTE(i915_cache_sharing_fops,
 static void cherryview_sseu_device_status(struct drm_i915_private *dev_priv,
                                          struct sseu_dev_info *sseu)
 {
-       int ss_max = 2;
+#define SS_MAX 2
+       const int ss_max = SS_MAX;
+       u32 sig1[SS_MAX], sig2[SS_MAX];
        int ss;
-       u32 sig1[ss_max], sig2[ss_max];
 
        sig1[0] = I915_READ(CHV_POWER_SS0_SIG1);
        sig1[1] = I915_READ(CHV_POWER_SS1_SIG1);
@@ -4273,7 +4303,7 @@ static void cherryview_sseu_device_status(struct drm_i915_private *dev_priv,
                        continue;
 
                sseu->slice_mask = BIT(0);
-               sseu->subslice_mask |= BIT(ss);
+               sseu->subslice_mask[0] |= BIT(ss);
                eu_cnt = ((sig1[ss] & CHV_EU08_PG_ENABLE) ? 0 : 2) +
                         ((sig1[ss] & CHV_EU19_PG_ENABLE) ? 0 : 2) +
                         ((sig1[ss] & CHV_EU210_PG_ENABLE) ? 0 : 2) +
@@ -4282,17 +4312,18 @@ static void cherryview_sseu_device_status(struct drm_i915_private *dev_priv,
                sseu->eu_per_subslice = max_t(unsigned int,
                                              sseu->eu_per_subslice, eu_cnt);
        }
+#undef SS_MAX
 }
 
 static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
                                     struct sseu_dev_info *sseu)
 {
+#define SS_MAX 6
        const struct intel_device_info *info = INTEL_INFO(dev_priv);
-       int s_max = 6, ss_max = 4;
+       u32 s_reg[SS_MAX], eu_reg[2 * SS_MAX], eu_mask[2];
        int s, ss;
-       u32 s_reg[s_max], eu_reg[2 * s_max], eu_mask[2];
 
-       for (s = 0; s < s_max; s++) {
+       for (s = 0; s < info->sseu.max_slices; s++) {
                /*
                 * FIXME: Valid SS Mask respects the spec and read
                 * only valid bits for those registers, excluding reserverd
@@ -4314,15 +4345,15 @@ static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
                     GEN9_PGCTL_SSB_EU210_ACK |
                     GEN9_PGCTL_SSB_EU311_ACK;
 
-       for (s = 0; s < s_max; s++) {
+       for (s = 0; s < info->sseu.max_slices; s++) {
                if ((s_reg[s] & GEN9_PGCTL_SLICE_ACK) == 0)
                        /* skip disabled slice */
                        continue;
 
                sseu->slice_mask |= BIT(s);
-               sseu->subslice_mask = info->sseu.subslice_mask;
+               sseu->subslice_mask[s] = info->sseu.subslice_mask[s];
 
-               for (ss = 0; ss < ss_max; ss++) {
+               for (ss = 0; ss < info->sseu.max_subslices; ss++) {
                        unsigned int eu_cnt;
 
                        if (!(s_reg[s] & (GEN9_PGCTL_SS_ACK(ss))))
@@ -4337,22 +4368,18 @@ static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
                                                      eu_cnt);
                }
        }
+#undef SS_MAX
 }
 
 static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
                                    struct sseu_dev_info *sseu)
 {
-       int s_max = 3, ss_max = 4;
+#define SS_MAX 3
+       const struct intel_device_info *info = INTEL_INFO(dev_priv);
+       u32 s_reg[SS_MAX], eu_reg[2 * SS_MAX], eu_mask[2];
        int s, ss;
-       u32 s_reg[s_max], eu_reg[2*s_max], eu_mask[2];
 
-       /* BXT has a single slice and at most 3 subslices. */
-       if (IS_GEN9_LP(dev_priv)) {
-               s_max = 1;
-               ss_max = 3;
-       }
-
-       for (s = 0; s < s_max; s++) {
+       for (s = 0; s < info->sseu.max_slices; s++) {
                s_reg[s] = I915_READ(GEN9_SLICE_PGCTL_ACK(s));
                eu_reg[2*s] = I915_READ(GEN9_SS01_EU_PGCTL_ACK(s));
                eu_reg[2*s + 1] = I915_READ(GEN9_SS23_EU_PGCTL_ACK(s));
@@ -4367,7 +4394,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
                     GEN9_PGCTL_SSB_EU210_ACK |
                     GEN9_PGCTL_SSB_EU311_ACK;
 
-       for (s = 0; s < s_max; s++) {
+       for (s = 0; s < info->sseu.max_slices; s++) {
                if ((s_reg[s] & GEN9_PGCTL_SLICE_ACK) == 0)
                        /* skip disabled slice */
                        continue;
@@ -4375,10 +4402,10 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
                sseu->slice_mask |= BIT(s);
 
                if (IS_GEN9_BC(dev_priv))
-                       sseu->subslice_mask =
-                               INTEL_INFO(dev_priv)->sseu.subslice_mask;
+                       sseu->subslice_mask[s] =
+                               INTEL_INFO(dev_priv)->sseu.subslice_mask[s];
 
-               for (ss = 0; ss < ss_max; ss++) {
+               for (ss = 0; ss < info->sseu.max_subslices; ss++) {
                        unsigned int eu_cnt;
 
                        if (IS_GEN9_LP(dev_priv)) {
@@ -4386,7 +4413,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
                                        /* skip disabled subslice */
                                        continue;
 
-                               sseu->subslice_mask |= BIT(ss);
+                               sseu->subslice_mask[s] |= BIT(ss);
                        }
 
                        eu_cnt = 2 * hweight32(eu_reg[2*s + ss/2] &
@@ -4397,6 +4424,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
                                                      eu_cnt);
                }
        }
+#undef SS_MAX
 }
 
 static void broadwell_sseu_device_status(struct drm_i915_private *dev_priv,
@@ -4408,9 +4436,12 @@ static void broadwell_sseu_device_status(struct drm_i915_private *dev_priv,
        sseu->slice_mask = slice_info & GEN8_LSLICESTAT_MASK;
 
        if (sseu->slice_mask) {
-               sseu->subslice_mask = INTEL_INFO(dev_priv)->sseu.subslice_mask;
                sseu->eu_per_subslice =
                                INTEL_INFO(dev_priv)->sseu.eu_per_subslice;
+               for (s = 0; s < fls(sseu->slice_mask); s++) {
+                       sseu->subslice_mask[s] =
+                               INTEL_INFO(dev_priv)->sseu.subslice_mask[s];
+               }
                sseu->eu_total = sseu->eu_per_subslice *
                                 sseu_subslice_total(sseu);
 
@@ -4429,6 +4460,7 @@ static void i915_print_sseu_info(struct seq_file *m, bool is_available_info,
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        const char *type = is_available_info ? "Available" : "Enabled";
+       int s;
 
        seq_printf(m, "  %s Slice Mask: %04x\n", type,
                   sseu->slice_mask);
@@ -4436,10 +4468,10 @@ static void i915_print_sseu_info(struct seq_file *m, bool is_available_info,
                   hweight8(sseu->slice_mask));
        seq_printf(m, "  %s Subslice Total: %u\n", type,
                   sseu_subslice_total(sseu));
-       seq_printf(m, "  %s Subslice Mask: %04x\n", type,
-                  sseu->subslice_mask);
-       seq_printf(m, "  %s Subslice Per Slice: %u\n", type,
-                  hweight8(sseu->subslice_mask));
+       for (s = 0; s < fls(sseu->slice_mask); s++) {
+               seq_printf(m, "  %s Slice%i subslices: %u\n", type,
+                          s, hweight8(sseu->subslice_mask[s]));
+       }
        seq_printf(m, "  %s EU Total: %u\n", type,
                   sseu->eu_total);
        seq_printf(m, "  %s EU Per Subslice: %u\n", type,
@@ -4473,6 +4505,10 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
 
        seq_puts(m, "SSEU Device Status\n");
        memset(&sseu, 0, sizeof(sseu));
+       sseu.max_slices = INTEL_INFO(dev_priv)->sseu.max_slices;
+       sseu.max_subslices = INTEL_INFO(dev_priv)->sseu.max_subslices;
+       sseu.max_eus_per_subslice =
+               INTEL_INFO(dev_priv)->sseu.max_eus_per_subslice;
 
        intel_runtime_pm_get(dev_priv);
 
@@ -4640,6 +4676,67 @@ static int i915_drrs_ctl_set(void *data, u64 val)
 
 DEFINE_SIMPLE_ATTRIBUTE(i915_drrs_ctl_fops, NULL, i915_drrs_ctl_set, "%llu\n");
 
+static ssize_t
+i915_fifo_underrun_reset_write(struct file *filp,
+                              const char __user *ubuf,
+                              size_t cnt, loff_t *ppos)
+{
+       struct drm_i915_private *dev_priv = filp->private_data;
+       struct intel_crtc *intel_crtc;
+       struct drm_device *dev = &dev_priv->drm;
+       int ret;
+       bool reset;
+
+       ret = kstrtobool_from_user(ubuf, cnt, &reset);
+       if (ret)
+               return ret;
+
+       if (!reset)
+               return cnt;
+
+       for_each_intel_crtc(dev, intel_crtc) {
+               struct drm_crtc_commit *commit;
+               struct intel_crtc_state *crtc_state;
+
+               ret = drm_modeset_lock_single_interruptible(&intel_crtc->base.mutex);
+               if (ret)
+                       return ret;
+
+               crtc_state = to_intel_crtc_state(intel_crtc->base.state);
+               commit = crtc_state->base.commit;
+               if (commit) {
+                       ret = wait_for_completion_interruptible(&commit->hw_done);
+                       if (!ret)
+                               ret = wait_for_completion_interruptible(&commit->flip_done);
+               }
+
+               if (!ret && crtc_state->base.active) {
+                       DRM_DEBUG_KMS("Re-arming FIFO underruns on pipe %c\n",
+                                     pipe_name(intel_crtc->pipe));
+
+                       intel_crtc_arm_fifo_underrun(intel_crtc, crtc_state);
+               }
+
+               drm_modeset_unlock(&intel_crtc->base.mutex);
+
+               if (ret)
+                       return ret;
+       }
+
+       ret = intel_fbc_reset_underrun(dev_priv);
+       if (ret)
+               return ret;
+
+       return cnt;
+}
+
+static const struct file_operations i915_fifo_underrun_reset_ops = {
+       .owner = THIS_MODULE,
+       .open = simple_open,
+       .write = i915_fifo_underrun_reset_write,
+       .llseek = default_llseek,
+};
+
 static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_capabilities", i915_capabilities, 0},
        {"i915_gem_objects", i915_gem_object_info, 0},
@@ -4680,6 +4777,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
        {"i915_dmc_info", i915_dmc_info, 0},
        {"i915_display_info", i915_display_info, 0},
        {"i915_engine_info", i915_engine_info, 0},
+       {"i915_rcs_topology", i915_rcs_topology, 0},
        {"i915_shrinker_info", i915_shrinker_info, 0},
        {"i915_shared_dplls_info", i915_shared_dplls_info, 0},
        {"i915_dp_mst_info", i915_dp_mst_info, 0},
@@ -4696,8 +4794,6 @@ static const struct i915_debugfs_files {
        const struct file_operations *fops;
 } i915_debugfs_files[] = {
        {"i915_wedged", &i915_wedged_fops},
-       {"i915_max_freq", &i915_max_freq_fops},
-       {"i915_min_freq", &i915_min_freq_fops},
        {"i915_cache_sharing", &i915_cache_sharing_fops},
        {"i915_ring_missed_irq", &i915_ring_missed_irq_fops},
        {"i915_ring_test_irq", &i915_ring_test_irq_fops},
@@ -4706,6 +4802,7 @@ static const struct i915_debugfs_files {
        {"i915_error_state", &i915_error_state_fops},
        {"i915_gpu_info", &i915_gpu_info_fops},
 #endif
+       {"i915_fifo_underrun_reset", &i915_fifo_underrun_reset_ops},
        {"i915_next_seqno", &i915_next_seqno_fops},
        {"i915_display_crc_ctl", &i915_display_crc_ctl_fops},
        {"i915_pri_wm_latency", &i915_pri_wm_latency_fops},
@@ -4715,10 +4812,12 @@ static const struct i915_debugfs_files {
        {"i915_dp_test_data", &i915_displayport_test_data_fops},
        {"i915_dp_test_type", &i915_displayport_test_type_fops},
        {"i915_dp_test_active", &i915_displayport_test_active_fops},
-       {"i915_guc_log_control", &i915_guc_log_control_fops},
+       {"i915_guc_log_level", &i915_guc_log_level_fops},
+       {"i915_guc_log_relay", &i915_guc_log_relay_fops},
        {"i915_hpd_storm_ctl", &i915_hpd_storm_ctl_fops},
        {"i915_ipc_status", &i915_ipc_status_fops},
-       {"i915_drrs_ctl", &i915_drrs_ctl_fops}
+       {"i915_drrs_ctl", &i915_drrs_ctl_fops},
+       {"i915_edp_psr_debug", &i915_edp_psr_debug_fops}
 };
 
 int i915_debugfs_register(struct drm_i915_private *dev_priv)
@@ -4812,19 +4911,7 @@ static int i915_dpcd_show(struct seq_file *m, void *data)
 
        return 0;
 }
-
-static int i915_dpcd_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, i915_dpcd_show, inode->i_private);
-}
-
-static const struct file_operations i915_dpcd_fops = {
-       .owner = THIS_MODULE,
-       .open = i915_dpcd_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(i915_dpcd);
 
 static int i915_panel_show(struct seq_file *m, void *data)
 {
@@ -4846,19 +4933,7 @@ static int i915_panel_show(struct seq_file *m, void *data)
 
        return 0;
 }
-
-static int i915_panel_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, i915_panel_show, inode->i_private);
-}
-
-static const struct file_operations i915_panel_fops = {
-       .owner = THIS_MODULE,
-       .open = i915_panel_open,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
+DEFINE_SHOW_ATTRIBUTE(i915_panel);
 
 /**
  * i915_debugfs_connector_add - add i915 specific connector debugfs files