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

drm/i915: Extract intel_bw_check_data_rate()

Extract the data rate calculation loop out from
intel_bw_atomic_check() to make it a bit less confusing.

v2: Deal with 'bool changed'

Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> #v1
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220218064039.12834-7-ville.syrjala@linux.intel.com

+34 -21
+34 -21
drivers/gpu/drm/i915/display/intel_bw.c
··· 836 836 return mask; 837 837 } 838 838 839 - int intel_bw_atomic_check(struct intel_atomic_state *state) 839 + static int intel_bw_check_data_rate(struct intel_atomic_state *state, bool *changed) 840 840 { 841 - struct drm_i915_private *dev_priv = to_i915(state->base.dev); 842 - struct intel_crtc_state *new_crtc_state, *old_crtc_state; 843 - struct intel_bw_state *new_bw_state = NULL; 844 - const struct intel_bw_state *old_bw_state = NULL; 845 - unsigned int data_rate; 846 - unsigned int num_active_planes; 841 + struct drm_i915_private *i915 = to_i915(state->base.dev); 842 + const struct intel_crtc_state *new_crtc_state, *old_crtc_state; 847 843 struct intel_crtc *crtc; 848 - int i, ret; 849 - u32 allowed_points = 0; 850 - unsigned int max_bw_point = 0, max_bw = 0; 851 - unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points; 852 - unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points; 853 - bool changed = false; 854 - 855 - /* FIXME earlier gens need some checks too */ 856 - if (DISPLAY_VER(dev_priv) < 11) 857 - return 0; 844 + int i; 858 845 859 846 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, 860 847 new_crtc_state, i) { ··· 853 866 intel_bw_crtc_num_active_planes(old_crtc_state); 854 867 unsigned int new_active_planes = 855 868 intel_bw_crtc_num_active_planes(new_crtc_state); 869 + struct intel_bw_state *new_bw_state; 856 870 857 871 /* 858 872 * Avoid locking the bw state when ··· 870 882 new_bw_state->data_rate[crtc->pipe] = new_data_rate; 871 883 new_bw_state->num_active_planes[crtc->pipe] = new_active_planes; 872 884 873 - changed = true; 885 + *changed = true; 874 886 875 - drm_dbg_kms(&dev_priv->drm, 876 - "pipe %c data rate %u num active planes %u\n", 877 - pipe_name(crtc->pipe), 887 + drm_dbg_kms(&i915->drm, 888 + "[CRTC:%d:%s] data rate %u num active planes %u\n", 889 + crtc->base.base.id, crtc->base.name, 878 890 new_bw_state->data_rate[crtc->pipe], 879 891 new_bw_state->num_active_planes[crtc->pipe]); 880 892 } 893 + 894 + return 0; 895 + } 896 + 897 + int intel_bw_atomic_check(struct intel_atomic_state *state) 898 + { 899 + struct drm_i915_private *dev_priv = to_i915(state->base.dev); 900 + const struct intel_bw_state *old_bw_state; 901 + struct intel_bw_state *new_bw_state; 902 + unsigned int data_rate; 903 + unsigned int num_active_planes; 904 + int i, ret; 905 + u32 allowed_points = 0; 906 + unsigned int max_bw_point = 0, max_bw = 0; 907 + unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points; 908 + unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points; 909 + bool changed = false; 910 + 911 + /* FIXME earlier gens need some checks too */ 912 + if (DISPLAY_VER(dev_priv) < 11) 913 + return 0; 914 + 915 + ret = intel_bw_check_data_rate(state, &changed); 916 + if (ret) 917 + return ret; 881 918 882 919 old_bw_state = intel_atomic_get_old_bw_state(state); 883 920 new_bw_state = intel_atomic_get_new_bw_state(state);