diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 131 |
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 | ||
35 | static inline struct drm_i915_private *node_to_i915(struct drm_info_node *node) | 35 | static 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 | ||
2435 | static void i915_guc_client_info(struct seq_file *m, | 2434 | static 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; | 2754 | retry: |
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 | |||
2794 | err: | ||
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; |
2767 | out: | 2803 | out: |
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 | ||
4491 | static 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 | |||
4451 | static void gen9_sseu_device_status(struct drm_i915_private *dev_priv, | 4546 | static 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); |