Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Initial implementation of PSR2 selective fetch

All GEN12 platforms supports PSR2 selective fetch but not all GEN12
platforms supports PSR2 hardware tracking(aka RKL).

This feature consists in software programming registers with the
damaged area of each plane this way hardware will only fetch from
memory those areas and sent the PSR2 selective update blocks to panel,
saving even more power.

But as initial step it is only enabling the full frame fetch at
every flip, the actual selective fetch part will come in a future
patch.

Also this is only handling the page flip side, it is still completely
missing frontbuffer modifications, that is why the
enable_psr2_sel_fetch parameter was added.

v3:
- calling intel_psr2_sel_fetch_update() during the atomic check phase
(Ville)

BSpec: 55229
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200810174144.76761-1-jose.souza@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

authored by

José Roberto de Souza and committed by
Rodrigo Vivi
6e43e276 96c5a15f

+105 -14
+5
drivers/gpu/drm/i915/display/intel_display.c
··· 12770 12770 12771 12771 } 12772 12772 12773 + if (!mode_changed) 12774 + intel_psr2_sel_fetch_update(state, crtc); 12775 + 12773 12776 return 0; 12774 12777 } 12775 12778 ··· 15149 15146 15150 15147 if (new_crtc_state->update_pipe) 15151 15148 intel_pipe_fastset(old_crtc_state, new_crtc_state); 15149 + 15150 + intel_psr2_program_trans_man_trk_ctl(new_crtc_state); 15152 15151 } 15153 15152 15154 15153 if (dev_priv->display.atomic_update_watermarks)
+3
drivers/gpu/drm/i915/display/intel_display_debugfs.c
··· 417 417 su_blocks = su_blocks >> PSR2_SU_STATUS_SHIFT(frame); 418 418 seq_printf(m, "%d\t%d\n", frame, su_blocks); 419 419 } 420 + 421 + seq_printf(m, "PSR2 selective fetch: %s\n", 422 + enableddisabled(psr->psr2_sel_fetch_enabled)); 420 423 } 421 424 422 425 unlock:
+3
drivers/gpu/drm/i915/display/intel_display_types.h
··· 931 931 932 932 bool has_psr; 933 933 bool has_psr2; 934 + bool enable_psr2_sel_fetch; 934 935 u32 dc3co_exitline; 935 936 936 937 /* ··· 1074 1073 1075 1074 /* For DSB related info */ 1076 1075 struct intel_dsb *dsb; 1076 + 1077 + u32 psr2_man_track_ctl; 1077 1078 }; 1078 1079 1079 1080 enum intel_pipe_crc_source {
+81 -14
drivers/gpu/drm/i915/display/intel_psr.c
··· 553 553 val |= EDP_PSR2_FAST_WAKE(7); 554 554 } 555 555 556 + if (dev_priv->psr.psr2_sel_fetch_enabled) 557 + intel_de_write(dev_priv, 558 + PSR2_MAN_TRK_CTL(dev_priv->psr.transcoder), 559 + PSR2_MAN_TRK_CTL_ENABLE); 560 + else if (HAS_PSR2_SEL_FETCH(dev_priv)) 561 + intel_de_write(dev_priv, 562 + PSR2_MAN_TRK_CTL(dev_priv->psr.transcoder), 0); 563 + 556 564 /* 557 565 * PSR2 HW is incorrectly using EDP_PSR_TP1_TP3_SEL and BSpec is 558 566 * recommending keep this bit unset while PSR2 is enabled. ··· 671 663 crtc_state->dc3co_exitline = crtc_vdisplay - exit_scanlines; 672 664 } 673 665 666 + static bool intel_psr2_sel_fetch_config_valid(struct intel_dp *intel_dp, 667 + struct intel_crtc_state *crtc_state) 668 + { 669 + struct intel_atomic_state *state = to_intel_atomic_state(crtc_state->uapi.state); 670 + struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 671 + struct intel_plane_state *plane_state; 672 + struct intel_plane *plane; 673 + int i; 674 + 675 + if (!dev_priv->params.enable_psr2_sel_fetch) { 676 + drm_dbg_kms(&dev_priv->drm, 677 + "PSR2 sel fetch not enabled, disabled by parameter\n"); 678 + return false; 679 + } 680 + 681 + if (crtc_state->uapi.async_flip) { 682 + drm_dbg_kms(&dev_priv->drm, 683 + "PSR2 sel fetch not enabled, async flip enabled\n"); 684 + return false; 685 + } 686 + 687 + for_each_new_intel_plane_in_state(state, plane, plane_state, i) { 688 + if (plane_state->uapi.rotation != DRM_MODE_ROTATE_0) { 689 + drm_dbg_kms(&dev_priv->drm, 690 + "PSR2 sel fetch not enabled, plane rotated\n"); 691 + return false; 692 + } 693 + } 694 + 695 + return crtc_state->enable_psr2_sel_fetch = true; 696 + } 697 + 674 698 static bool intel_psr2_config_valid(struct intel_dp *intel_dp, 675 699 struct intel_crtc_state *crtc_state) 676 700 { ··· 772 732 return false; 773 733 } 774 734 775 - /* 776 - * Some platforms lack PSR2 HW tracking and instead require manual 777 - * tracking by software. In this case, the driver is required to track 778 - * the areas that need updates and program hardware to send selective 779 - * updates. 780 - * 781 - * So until the software tracking is implemented, PSR2 needs to be 782 - * disabled for platforms without PSR2 HW tracking. 783 - */ 784 - if (!HAS_PSR_HW_TRACKING(dev_priv)) { 785 - drm_dbg_kms(&dev_priv->drm, 786 - "No PSR2 HW tracking in the platform\n"); 787 - return false; 735 + if (HAS_PSR2_SEL_FETCH(dev_priv)) { 736 + if (!intel_psr2_sel_fetch_config_valid(intel_dp, crtc_state) && 737 + !HAS_PSR_HW_TRACKING(dev_priv)) { 738 + drm_dbg_kms(&dev_priv->drm, 739 + "PSR2 not enabled, selective fetch not valid and no HW tracking available\n"); 740 + return false; 741 + } 788 742 } 789 743 790 - if (crtc_hdisplay > psr_max_h || crtc_vdisplay > psr_max_v) { 744 + if (!crtc_state->enable_psr2_sel_fetch && 745 + (crtc_hdisplay > psr_max_h || crtc_vdisplay > psr_max_v)) { 791 746 drm_dbg_kms(&dev_priv->drm, 792 747 "PSR2 not enabled, resolution %dx%d > max supported %dx%d\n", 793 748 crtc_hdisplay, crtc_vdisplay, ··· 933 898 val |= EXITLINE_ENABLE; 934 899 intel_de_write(dev_priv, EXITLINE(cpu_transcoder), val); 935 900 } 901 + 902 + if (HAS_PSR_HW_TRACKING(dev_priv)) 903 + intel_de_rmw(dev_priv, CHICKEN_PAR1_1, IGNORE_PSR2_HW_TRACKING, 904 + dev_priv->psr.psr2_sel_fetch_enabled ? 905 + IGNORE_PSR2_HW_TRACKING : 0); 936 906 } 937 907 938 908 static void intel_psr_enable_locked(struct drm_i915_private *dev_priv, ··· 959 919 /* DC5/DC6 requires at least 6 idle frames */ 960 920 val = usecs_to_jiffies(intel_get_frame_time_us(crtc_state) * 6); 961 921 dev_priv->psr.dc3co_exit_delay = val; 922 + dev_priv->psr.psr2_sel_fetch_enabled = crtc_state->enable_psr2_sel_fetch; 962 923 963 924 /* 964 925 * If a PSR error happened and the driver is reloaded, the EDP_PSR_IIR ··· 1154 1113 * on older gens so doing the manual exit instead. 1155 1114 */ 1156 1115 intel_psr_exit(dev_priv); 1116 + } 1117 + 1118 + void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state) 1119 + { 1120 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1121 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1122 + struct i915_psr *psr = &dev_priv->psr; 1123 + 1124 + if (!HAS_PSR2_SEL_FETCH(dev_priv) || 1125 + !crtc_state->enable_psr2_sel_fetch) 1126 + return; 1127 + 1128 + intel_de_write(dev_priv, PSR2_MAN_TRK_CTL(psr->transcoder), 1129 + crtc_state->psr2_man_track_ctl); 1130 + } 1131 + 1132 + void intel_psr2_sel_fetch_update(struct intel_atomic_state *state, 1133 + struct intel_crtc *crtc) 1134 + { 1135 + struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc); 1136 + 1137 + if (!crtc_state->enable_psr2_sel_fetch) 1138 + return; 1139 + 1140 + crtc_state->psr2_man_track_ctl = PSR2_MAN_TRK_CTL_ENABLE | 1141 + PSR2_MAN_TRK_CTL_SF_SINGLE_FULL_FRAME; 1157 1142 } 1158 1143 1159 1144 /**
+5
drivers/gpu/drm/i915/display/intel_psr.h
··· 13 13 struct drm_i915_private; 14 14 struct intel_crtc_state; 15 15 struct intel_dp; 16 + struct intel_crtc; 17 + struct intel_atomic_state; 16 18 17 19 #define CAN_PSR(dev_priv) (HAS_PSR(dev_priv) && dev_priv->psr.sink_support) 18 20 void intel_psr_init_dpcd(struct intel_dp *intel_dp); ··· 45 43 struct drm_connector_state *old_state, 46 44 struct drm_connector_state *new_state); 47 45 void intel_psr_set_force_mode_changed(struct intel_dp *intel_dp); 46 + void intel_psr2_sel_fetch_update(struct intel_atomic_state *state, 47 + struct intel_crtc *crtc); 48 + void intel_psr2_program_trans_man_trk_ctl(const struct intel_crtc_state *crtc_state); 48 49 49 50 #endif /* __INTEL_PSR_H__ */
+2
drivers/gpu/drm/i915/i915_drv.h
··· 506 506 bool link_standby; 507 507 bool colorimetry_support; 508 508 bool psr2_enabled; 509 + bool psr2_sel_fetch_enabled; 509 510 u8 sink_sync_latency; 510 511 ktime_t last_entry_attempt; 511 512 ktime_t last_exit; ··· 1700 1699 #define HAS_PSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_psr) 1701 1700 #define HAS_PSR_HW_TRACKING(dev_priv) \ 1702 1701 (INTEL_INFO(dev_priv)->display.has_psr_hw_tracking) 1702 + #define HAS_PSR2_SEL_FETCH(dev_priv) (INTEL_GEN(dev_priv) >= 12) 1703 1703 #define HAS_TRANSCODER(dev_priv, trans) ((INTEL_INFO(dev_priv)->cpu_transcoder_mask & BIT(trans)) != 0) 1704 1704 1705 1705 #define HAS_RC6(dev_priv) (INTEL_INFO(dev_priv)->has_rc6)
+5
drivers/gpu/drm/i915/i915_params.c
··· 102 102 "is helpful to detect if PSR issues are related to bad values set in " 103 103 " VBT. (0=use VBT parameters, 1=use safest parameters)"); 104 104 105 + i915_param_named_unsafe(enable_psr2_sel_fetch, bool, 0400, 106 + "Enable PSR2 selective fetch " 107 + "(0=disabled, 1=enabled) " 108 + "Default: 0"); 109 + 105 110 i915_param_named_unsafe(force_probe, charp, 0400, 106 111 "Force probe the driver for specified devices. " 107 112 "See CONFIG_DRM_I915_FORCE_PROBE for details.");
+1
drivers/gpu/drm/i915/i915_params.h
··· 54 54 param(int, enable_fbc, -1, 0600) \ 55 55 param(int, enable_psr, -1, 0600) \ 56 56 param(bool, psr_safest_params, false, 0600) \ 57 + param(bool, enable_psr2_sel_fetch, false, 0600) \ 57 58 param(int, disable_power_well, -1, 0400) \ 58 59 param(int, enable_ips, 1, 0600) \ 59 60 param(int, invert_brightness, 0, 0600) \