aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_debugfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c131
1 files changed, 114 insertions, 17 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index c65e381b85f3..df3852c02a35 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -30,7 +30,7 @@
30#include <linux/sort.h> 30#include <linux/sort.h>
31#include <linux/sched/mm.h> 31#include <linux/sched/mm.h>
32#include "intel_drv.h" 32#include "intel_drv.h"
33#include "i915_guc_submission.h" 33#include "intel_guc_submission.h"
34 34
35static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node) 35static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node)
36{ 36{
@@ -1974,7 +1974,6 @@ static int i915_context_status(struct seq_file *m, void *unused)
1974 struct intel_context *ce = &ctx->engine[engine->id]; 1974 struct intel_context *ce = &ctx->engine[engine->id];
1975 1975
1976 seq_printf(m, "%s: ", engine->name); 1976 seq_printf(m, "%s: ", engine->name);
1977 seq_putc(m, ce->initialised ? 'I' : 'i');
1978 if (ce->state) 1977 if (ce->state)
1979 describe_obj(m, ce->state->obj); 1978 describe_obj(m, ce->state->obj);
1980 if (ce->ring) 1979 if (ce->ring)
@@ -2434,7 +2433,7 @@ static void i915_guc_log_info(struct seq_file *m,
2434 2433
2435static void i915_guc_client_info(struct seq_file *m, 2434static void i915_guc_client_info(struct seq_file *m,
2436 struct drm_i915_private *dev_priv, 2435 struct drm_i915_private *dev_priv,
2437 struct i915_guc_client *client) 2436 struct intel_guc_client *client)
2438{ 2437{
2439 struct intel_engine_cs *engine; 2438 struct intel_engine_cs *engine;
2440 enum intel_engine_id id; 2439 enum intel_engine_id id;
@@ -2484,6 +2483,8 @@ static int i915_guc_info(struct seq_file *m, void *data)
2484 2483
2485 seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client); 2484 seq_printf(m, "\nGuC execbuf client @ %p:\n", guc->execbuf_client);
2486 i915_guc_client_info(m, dev_priv, guc->execbuf_client); 2485 i915_guc_client_info(m, dev_priv, guc->execbuf_client);
2486 seq_printf(m, "\nGuC preempt client @ %p:\n", guc->preempt_client);
2487 i915_guc_client_info(m, dev_priv, guc->preempt_client);
2487 2488
2488 i915_guc_log_info(m, dev_priv); 2489 i915_guc_log_info(m, dev_priv);
2489 2490
@@ -2497,7 +2498,7 @@ static int i915_guc_stage_pool(struct seq_file *m, void *data)
2497 struct drm_i915_private *dev_priv = node_to_i915(m->private); 2498 struct drm_i915_private *dev_priv = node_to_i915(m->private);
2498 const struct intel_guc *guc = &dev_priv->guc; 2499 const struct intel_guc *guc = &dev_priv->guc;
2499 struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr; 2500 struct guc_stage_desc *desc = guc->stage_desc_pool_vaddr;
2500 struct i915_guc_client *client = guc->execbuf_client; 2501 struct intel_guc_client *client = guc->execbuf_client;
2501 unsigned int tmp; 2502 unsigned int tmp;
2502 int index; 2503 int index;
2503 2504
@@ -2734,39 +2735,76 @@ static int i915_sink_crc(struct seq_file *m, void *data)
2734 struct intel_connector *connector; 2735 struct intel_connector *connector;
2735 struct drm_connector_list_iter conn_iter; 2736 struct drm_connector_list_iter conn_iter;
2736 struct intel_dp *intel_dp = NULL; 2737 struct intel_dp *intel_dp = NULL;
2738 struct drm_modeset_acquire_ctx ctx;
2737 int ret; 2739 int ret;
2738 u8 crc[6]; 2740 u8 crc[6];
2739 2741
2740 drm_modeset_lock_all(dev); 2742 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE);
2743
2741 drm_connector_list_iter_begin(dev, &conn_iter); 2744 drm_connector_list_iter_begin(dev, &conn_iter);
2745
2742 for_each_intel_connector_iter(connector, &conn_iter) { 2746 for_each_intel_connector_iter(connector, &conn_iter) {
2743 struct drm_crtc *crtc; 2747 struct drm_crtc *crtc;
2748 struct drm_connector_state *state;
2749 struct intel_crtc_state *crtc_state;
2744 2750
2745 if (!connector->base.state->best_encoder) 2751 if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP)
2746 continue; 2752 continue;
2747 2753
2748 crtc = connector->base.state->crtc; 2754retry:
2749 if (!crtc->state->active) 2755 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, &ctx);
2756 if (ret)
2757 goto err;
2758
2759 state = connector->base.state;
2760 if (!state->best_encoder)
2750 continue; 2761 continue;
2751 2762
2752 if (connector->base.connector_type != DRM_MODE_CONNECTOR_eDP) 2763 crtc = state->crtc;
2764 ret = drm_modeset_lock(&crtc->mutex, &ctx);
2765 if (ret)
2766 goto err;
2767
2768 crtc_state = to_intel_crtc_state(crtc->state);
2769 if (!crtc_state->base.active)
2753 continue; 2770 continue;
2754 2771
2755 intel_dp = enc_to_intel_dp(connector->base.state->best_encoder); 2772 /*
2773 * We need to wait for all crtc updates to complete, to make
2774 * sure any pending modesets and plane updates are completed.
2775 */
2776 if (crtc_state->base.commit) {
2777 ret = wait_for_completion_interruptible(&crtc_state->base.commit->hw_done);
2756 2778
2757 ret = intel_dp_sink_crc(intel_dp, crc); 2779 if (ret)
2780 goto err;
2781 }
2782
2783 intel_dp = enc_to_intel_dp(state->best_encoder);
2784
2785 ret = intel_dp_sink_crc(intel_dp, crtc_state, crc);
2758 if (ret) 2786 if (ret)
2759 goto out; 2787 goto err;
2760 2788
2761 seq_printf(m, "%02x%02x%02x%02x%02x%02x\n", 2789 seq_printf(m, "%02x%02x%02x%02x%02x%02x\n",
2762 crc[0], crc[1], crc[2], 2790 crc[0], crc[1], crc[2],
2763 crc[3], crc[4], crc[5]); 2791 crc[3], crc[4], crc[5]);
2764 goto out; 2792 goto out;
2793
2794err:
2795 if (ret == -EDEADLK) {
2796 ret = drm_modeset_backoff(&ctx);
2797 if (!ret)
2798 goto retry;
2799 }
2800 goto out;
2765 } 2801 }
2766 ret = -ENODEV; 2802 ret = -ENODEV;
2767out: 2803out:
2768 drm_connector_list_iter_end(&conn_iter); 2804 drm_connector_list_iter_end(&conn_iter);
2769 drm_modeset_unlock_all(dev); 2805 drm_modeset_drop_locks(&ctx);
2806 drm_modeset_acquire_fini(&ctx);
2807
2770 return ret; 2808 return ret;
2771} 2809}
2772 2810
@@ -3049,7 +3087,7 @@ static void intel_connector_info(struct seq_file *m,
3049 break; 3087 break;
3050 case DRM_MODE_CONNECTOR_HDMIA: 3088 case DRM_MODE_CONNECTOR_HDMIA:
3051 if (intel_encoder->type == INTEL_OUTPUT_HDMI || 3089 if (intel_encoder->type == INTEL_OUTPUT_HDMI ||
3052 intel_encoder->type == INTEL_OUTPUT_UNKNOWN) 3090 intel_encoder->type == INTEL_OUTPUT_DDI)
3053 intel_hdmi_info(m, intel_connector); 3091 intel_hdmi_info(m, intel_connector);
3054 break; 3092 break;
3055 default: 3093 default:
@@ -3244,6 +3282,8 @@ static int i915_engine_info(struct seq_file *m, void *unused)
3244 yesno(dev_priv->gt.awake)); 3282 yesno(dev_priv->gt.awake));
3245 seq_printf(m, "Global active requests: %d\n", 3283 seq_printf(m, "Global active requests: %d\n",
3246 dev_priv->gt.active_requests); 3284 dev_priv->gt.active_requests);
3285 seq_printf(m, "CS timestamp frequency: %u kHz\n",
3286 dev_priv->info.cs_timestamp_frequency_khz);
3247 3287
3248 p = drm_seq_file_printer(m); 3288 p = drm_seq_file_printer(m);
3249 for_each_engine(engine, dev_priv, id) 3289 for_each_engine(engine, dev_priv, id)
@@ -3601,7 +3641,7 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused)
3601 continue; 3641 continue;
3602 3642
3603 seq_printf(m, "MST Source Port %c\n", 3643 seq_printf(m, "MST Source Port %c\n",
3604 port_name(intel_dig_port->port)); 3644 port_name(intel_dig_port->base.port));
3605 drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr); 3645 drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr);
3606 } 3646 }
3607 drm_connector_list_iter_end(&conn_iter); 3647 drm_connector_list_iter_end(&conn_iter);
@@ -4448,6 +4488,61 @@ static void cherryview_sseu_device_status(struct drm_i915_private *dev_priv,
4448 } 4488 }
4449} 4489}
4450 4490
4491static void gen10_sseu_device_status(struct drm_i915_private *dev_priv,
4492 struct sseu_dev_info *sseu)
4493{
4494 const struct intel_device_info *info = INTEL_INFO(dev_priv);
4495 int s_max = 6, ss_max = 4;
4496 int s, ss;
4497 u32 s_reg[s_max], eu_reg[2 * s_max], eu_mask[2];
4498
4499 for (s = 0; s < s_max; s++) {
4500 /*
4501 * FIXME: Valid SS Mask respects the spec and read
4502 * only valid bits for those registers, excluding reserverd
4503 * although this seems wrong because it would leave many
4504 * subslices without ACK.
4505 */
4506 s_reg[s] = I915_READ(GEN10_SLICE_PGCTL_ACK(s)) &
4507 GEN10_PGCTL_VALID_SS_MASK(s);
4508 eu_reg[2 * s] = I915_READ(GEN10_SS01_EU_PGCTL_ACK(s));
4509 eu_reg[2 * s + 1] = I915_READ(GEN10_SS23_EU_PGCTL_ACK(s));
4510 }
4511
4512 eu_mask[0] = GEN9_PGCTL_SSA_EU08_ACK |
4513 GEN9_PGCTL_SSA_EU19_ACK |
4514 GEN9_PGCTL_SSA_EU210_ACK |
4515 GEN9_PGCTL_SSA_EU311_ACK;
4516 eu_mask[1] = GEN9_PGCTL_SSB_EU08_ACK |
4517 GEN9_PGCTL_SSB_EU19_ACK |
4518 GEN9_PGCTL_SSB_EU210_ACK |
4519 GEN9_PGCTL_SSB_EU311_ACK;
4520
4521 for (s = 0; s < s_max; s++) {
4522 if ((s_reg[s] & GEN9_PGCTL_SLICE_ACK) == 0)
4523 /* skip disabled slice */
4524 continue;
4525
4526 sseu->slice_mask |= BIT(s);
4527 sseu->subslice_mask = info->sseu.subslice_mask;
4528
4529 for (ss = 0; ss < ss_max; ss++) {
4530 unsigned int eu_cnt;
4531
4532 if (!(s_reg[s] & (GEN9_PGCTL_SS_ACK(ss))))
4533 /* skip disabled subslice */
4534 continue;
4535
4536 eu_cnt = 2 * hweight32(eu_reg[2 * s + ss / 2] &
4537 eu_mask[ss % 2]);
4538 sseu->eu_total += eu_cnt;
4539 sseu->eu_per_subslice = max_t(unsigned int,
4540 sseu->eu_per_subslice,
4541 eu_cnt);
4542 }
4543 }
4544}
4545
4451static void gen9_sseu_device_status(struct drm_i915_private *dev_priv, 4546static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
4452 struct sseu_dev_info *sseu) 4547 struct sseu_dev_info *sseu)
4453{ 4548{
@@ -4483,7 +4578,7 @@ static void gen9_sseu_device_status(struct drm_i915_private *dev_priv,
4483 4578
4484 sseu->slice_mask |= BIT(s); 4579 sseu->slice_mask |= BIT(s);
4485 4580
4486 if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) 4581 if (IS_GEN9_BC(dev_priv))
4487 sseu->subslice_mask = 4582 sseu->subslice_mask =
4488 INTEL_INFO(dev_priv)->sseu.subslice_mask; 4583 INTEL_INFO(dev_priv)->sseu.subslice_mask;
4489 4584
@@ -4589,8 +4684,10 @@ static int i915_sseu_status(struct seq_file *m, void *unused)
4589 cherryview_sseu_device_status(dev_priv, &sseu); 4684 cherryview_sseu_device_status(dev_priv, &sseu);
4590 } else if (IS_BROADWELL(dev_priv)) { 4685 } else if (IS_BROADWELL(dev_priv)) {
4591 broadwell_sseu_device_status(dev_priv, &sseu); 4686 broadwell_sseu_device_status(dev_priv, &sseu);
4592 } else if (INTEL_GEN(dev_priv) >= 9) { 4687 } else if (IS_GEN9(dev_priv)) {
4593 gen9_sseu_device_status(dev_priv, &sseu); 4688 gen9_sseu_device_status(dev_priv, &sseu);
4689 } else if (INTEL_GEN(dev_priv) >= 10) {
4690 gen10_sseu_device_status(dev_priv, &sseu);
4594 } 4691 }
4595 4692
4596 intel_runtime_pm_put(dev_priv); 4693 intel_runtime_pm_put(dev_priv);