[PATCH 06/10] drm/i915/display: Add DSC pixel replication
kernel test robot
lkp at intel.com
Thu Oct 24 22:18:47 UTC 2024
Hi Ankit,
kernel test robot noticed the following build errors:
[auto build test ERROR on drm-intel/for-linux-next]
[also build test ERROR on next-20241024]
[cannot apply to drm-intel/for-linux-next-fixes drm-tip/drm-tip linus/master v6.12-rc4]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ankit-Nautiyal/drm-i915-display-Prepare-for-dsc-3-stream-splitter/20241017-162821
base: git://anongit.freedesktop.org/drm-intel for-linux-next
patch link: https://lore.kernel.org/r/20241017082348.3413727-7-ankit.k.nautiyal%40intel.com
patch subject: [PATCH 06/10] drm/i915/display: Add DSC pixel replication
config: i386-randconfig-006-20241024 (https://download.01.org/0day-ci/archive/20241025/202410250632.xdHuHbQW-lkp@intel.com/config)
compiler: clang version 19.1.2 (https://github.com/llvm/llvm-project 7ba7d8e2f7b6445b60679da826210cdde29eaf8b)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241025/202410250632.xdHuHbQW-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410250632.xdHuHbQW-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from drivers/gpu/drm/i915/display/intel_vdsc.c:13:
In file included from drivers/gpu/drm/i915/i915_drv.h:40:
In file included from drivers/gpu/drm/i915/display/intel_display_core.h:16:
In file included from include/drm/drm_connector.h:32:
In file included from include/drm/drm_util.h:36:
In file included from include/linux/kgdb.h:19:
In file included from include/linux/kprobes.h:28:
In file included from include/linux/ftrace.h:13:
In file included from include/linux/kallsyms.h:13:
In file included from include/linux/mm.h:2213:
include/linux/vmstat.h:518:36: error: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Werror,-Wenum-enum-conversion]
518 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
drivers/gpu/drm/i915/display/intel_vdsc.c:375:10: error: arithmetic between different enumeration types ('enum pipe' and 'enum intel_display_power_domain') [-Werror,-Wenum-enum-conversion]
375 | return POWER_DOMAIN_PIPE(pipe);
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_display_power.h:120:41: note: expanded from macro 'POWER_DOMAIN_PIPE'
120 | #define POWER_DOMAIN_PIPE(pipe) ((pipe) + POWER_DOMAIN_PIPE_A)
| ~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/i915/display/intel_vdsc.c:817:11: error: arithmetic between different enumeration types ('const enum transcoder' and 'enum pipe') [-Werror,-Wenum-enum-conversion]
816 | intel_de_write(dev_priv,
| ~~~~~~~~~~~~~~~~~~~~~~~~
817 | BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder), dss_ctl3_val);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_vdsc_regs.h:57:53: note: expanded from macro 'BMG_PIPE_DSS_CTL3'
57 | #define BMG_PIPE_DSS_CTL3(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
| ^ ~~~~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:25:45: note: expanded from macro '_MMIO_PIPE'
25 | #define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b))
| ^~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:18:39: note: expanded from macro '_PIPE'
18 | #define _PIPE(pipe, a, b) _PICK_EVEN(pipe, a, b)
| ^~~~
drivers/gpu/drm/i915/i915_reg_defs.h:213:49: note: expanded from macro '_PICK_EVEN'
213 | #define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a)))
| ^~~~~~~
drivers/gpu/drm/i915/i915_reg_defs.h:267:47: note: expanded from macro '_MMIO'
267 | #define _MMIO(r) ((const i915_reg_t){ .reg = (r) })
| ^
drivers/gpu/drm/i915/display/intel_de.h:88:71: note: expanded from macro 'intel_de_write'
88 | #define intel_de_write(p,...) __intel_de_write(__to_intel_display(p), __VA_ARGS__)
| ^~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_vdsc.c:833:12: error: arithmetic between different enumeration types ('const enum transcoder' and 'enum pipe') [-Werror,-Wenum-enum-conversion]
832 | intel_de_write(dev_priv,
| ~~~~~~~~~~~~~~~~~~~~~~~~
833 | BMG_PIPE_DSS_CTL3(old_crtc_state->cpu_transcoder), 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_vdsc_regs.h:57:53: note: expanded from macro 'BMG_PIPE_DSS_CTL3'
57 | #define BMG_PIPE_DSS_CTL3(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
| ^ ~~~~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:25:45: note: expanded from macro '_MMIO_PIPE'
25 | #define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b))
| ^~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:18:39: note: expanded from macro '_PIPE'
18 | #define _PIPE(pipe, a, b) _PICK_EVEN(pipe, a, b)
| ^~~~
drivers/gpu/drm/i915/i915_reg_defs.h:213:49: note: expanded from macro '_PICK_EVEN'
213 | #define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a)))
| ^~~~~~~
drivers/gpu/drm/i915/i915_reg_defs.h:267:47: note: expanded from macro '_MMIO'
267 | #define _MMIO(r) ((const i915_reg_t){ .reg = (r) })
| ^
drivers/gpu/drm/i915/display/intel_de.h:88:71: note: expanded from macro 'intel_de_write'
88 | #define intel_de_write(p,...) __intel_de_write(__to_intel_display(p), __VA_ARGS__)
| ^~~~~~~~~~~
>> drivers/gpu/drm/i915/display/intel_vdsc.c:1006:38: error: arithmetic between different enumeration types ('enum transcoder' and 'enum pipe') [-Werror,-Wenum-enum-conversion]
1006 | dss_ctl3 = intel_de_read(dev_priv, BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder));
| ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/gpu/drm/i915/display/intel_vdsc_regs.h:57:53: note: expanded from macro 'BMG_PIPE_DSS_CTL3'
57 | #define BMG_PIPE_DSS_CTL3(pipe) _MMIO_PIPE((pipe) - PIPE_B, \
| ^ ~~~~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:25:45: note: expanded from macro '_MMIO_PIPE'
25 | #define _MMIO_PIPE(pipe, a, b) _MMIO(_PIPE(pipe, a, b))
| ^~~~
drivers/gpu/drm/i915/display/intel_display_reg_defs.h:18:39: note: expanded from macro '_PIPE'
18 | #define _PIPE(pipe, a, b) _PICK_EVEN(pipe, a, b)
| ^~~~
drivers/gpu/drm/i915/i915_reg_defs.h:213:49: note: expanded from macro '_PICK_EVEN'
213 | #define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a)))
| ^~~~~~~
drivers/gpu/drm/i915/i915_reg_defs.h:267:47: note: expanded from macro '_MMIO'
267 | #define _MMIO(r) ((const i915_reg_t){ .reg = (r) })
| ^
drivers/gpu/drm/i915/display/intel_de.h:32:69: note: expanded from macro 'intel_de_read'
32 | #define intel_de_read(p,...) __intel_de_read(__to_intel_display(p), __VA_ARGS__)
| ^~~~~~~~~~~
5 errors generated.
vim +817 drivers/gpu/drm/i915/display/intel_vdsc.c
770
771 void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
772 {
773 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
774 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
775 u32 dss_ctl1_val = 0;
776 u32 dss_ctl2_val = 0;
777 u32 dss_ctl3_val = 0;
778 int vdsc_instances_per_pipe = intel_dsc_get_vdsc_per_pipe(crtc_state);
779
780 if (!crtc_state->dsc.compression_enable)
781 return;
782
783 intel_dsc_pps_configure(crtc_state);
784
785 dss_ctl2_val |= VDSC0_ENABLE;
786 if (vdsc_instances_per_pipe > 1) {
787 dss_ctl2_val |= VDSC1_ENABLE;
788 dss_ctl1_val |= JOINER_ENABLE;
789 }
790
791 if (vdsc_instances_per_pipe > 2) {
792 dss_ctl2_val |= VDSC2_ENABLE;
793 dss_ctl2_val |= SMALL_JOINER_CONFIG_3_ENGINES;
794 }
795
796 if (crtc_state->joiner_pipes) {
797 if (intel_crtc_ultrajoiner_enable_needed(crtc_state))
798 dss_ctl1_val |= ULTRA_JOINER_ENABLE;
799
800 if (intel_crtc_is_ultrajoiner_primary(crtc_state))
801 dss_ctl1_val |= PRIMARY_ULTRA_JOINER_ENABLE;
802
803 dss_ctl1_val |= BIG_JOINER_ENABLE;
804
805 if (intel_crtc_is_bigjoiner_primary(crtc_state))
806 dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
807 }
808
809 if (crtc_state->dsc.pixel_replication_count)
810 dss_ctl3_val = DSC_PIXEL_REPLICATION(crtc_state->dsc.pixel_replication_count);
811
812 intel_de_write(dev_priv, dss_ctl1_reg(crtc, crtc_state->cpu_transcoder), dss_ctl1_val);
813 intel_de_write(dev_priv, dss_ctl2_reg(crtc, crtc_state->cpu_transcoder), dss_ctl2_val);
814
815 if (IS_BATTLEMAGE(dev_priv) && dss_ctl3_val)
816 intel_de_write(dev_priv,
> 817 BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder), dss_ctl3_val);
818 }
819
820 void intel_dsc_disable(const struct intel_crtc_state *old_crtc_state)
821 {
822 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
823 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
824
825 /* Disable only if either of them is enabled */
826 if (old_crtc_state->dsc.compression_enable ||
827 old_crtc_state->joiner_pipes) {
828 intel_de_write(dev_priv, dss_ctl1_reg(crtc, old_crtc_state->cpu_transcoder), 0);
829 intel_de_write(dev_priv, dss_ctl2_reg(crtc, old_crtc_state->cpu_transcoder), 0);
830
831 if (IS_BATTLEMAGE(dev_priv))
832 intel_de_write(dev_priv,
833 BMG_PIPE_DSS_CTL3(old_crtc_state->cpu_transcoder), 0);
834 }
835 }
836
837 static u32 intel_dsc_pps_read(struct intel_crtc_state *crtc_state, int pps,
838 bool *all_equal)
839 {
840 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
841 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
842 i915_reg_t dsc_reg[3];
843 int i, vdsc_per_pipe, dsc_reg_num;
844 u32 val;
845
846 vdsc_per_pipe = intel_dsc_get_vdsc_per_pipe(crtc_state);
847 dsc_reg_num = min_t(int, ARRAY_SIZE(dsc_reg), vdsc_per_pipe);
848
849 drm_WARN_ON_ONCE(&i915->drm, dsc_reg_num < vdsc_per_pipe);
850
851 intel_dsc_get_pps_reg(crtc_state, pps, dsc_reg, dsc_reg_num);
852
853 *all_equal = true;
854
855 val = intel_de_read(i915, dsc_reg[0]);
856
857 for (i = 1; i < dsc_reg_num; i++) {
858 if (intel_de_read(i915, dsc_reg[i]) != val) {
859 *all_equal = false;
860 break;
861 }
862 }
863
864 return val;
865 }
866
867 static u32 intel_dsc_pps_read_and_verify(struct intel_crtc_state *crtc_state, int pps)
868 {
869 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
870 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
871 u32 val;
872 bool all_equal;
873
874 val = intel_dsc_pps_read(crtc_state, pps, &all_equal);
875 drm_WARN_ON(&i915->drm, !all_equal);
876
877 return val;
878 }
879
880 static void intel_dsc_get_pps_config(struct intel_crtc_state *crtc_state)
881 {
882 struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
883 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
884 struct drm_i915_private *i915 = to_i915(crtc->base.dev);
885 int num_vdsc_instances = intel_dsc_get_num_vdsc_instances(crtc_state);
886 u32 pps_temp;
887
888 /* PPS 0 */
889 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 0);
890
891 vdsc_cfg->bits_per_component = REG_FIELD_GET(DSC_PPS0_BPC_MASK, pps_temp);
892 vdsc_cfg->line_buf_depth = REG_FIELD_GET(DSC_PPS0_LINE_BUF_DEPTH_MASK, pps_temp);
893 vdsc_cfg->block_pred_enable = pps_temp & DSC_PPS0_BLOCK_PREDICTION;
894 vdsc_cfg->convert_rgb = pps_temp & DSC_PPS0_COLOR_SPACE_CONVERSION;
895 vdsc_cfg->simple_422 = pps_temp & DSC_PPS0_422_ENABLE;
896 vdsc_cfg->native_422 = pps_temp & DSC_PPS0_NATIVE_422_ENABLE;
897 vdsc_cfg->native_420 = pps_temp & DSC_PPS0_NATIVE_420_ENABLE;
898 vdsc_cfg->vbr_enable = pps_temp & DSC_PPS0_VBR_ENABLE;
899
900 /* PPS 1 */
901 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 1);
902
903 vdsc_cfg->bits_per_pixel = REG_FIELD_GET(DSC_PPS1_BPP_MASK, pps_temp);
904
905 if (vdsc_cfg->native_420)
906 vdsc_cfg->bits_per_pixel >>= 1;
907
908 crtc_state->dsc.compressed_bpp_x16 = vdsc_cfg->bits_per_pixel;
909
910 /* PPS 2 */
911 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 2);
912
913 vdsc_cfg->pic_width = REG_FIELD_GET(DSC_PPS2_PIC_WIDTH_MASK, pps_temp) * num_vdsc_instances;
914 vdsc_cfg->pic_height = REG_FIELD_GET(DSC_PPS2_PIC_HEIGHT_MASK, pps_temp);
915
916 /* PPS 3 */
917 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 3);
918
919 vdsc_cfg->slice_width = REG_FIELD_GET(DSC_PPS3_SLICE_WIDTH_MASK, pps_temp);
920 vdsc_cfg->slice_height = REG_FIELD_GET(DSC_PPS3_SLICE_HEIGHT_MASK, pps_temp);
921
922 /* PPS 4 */
923 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 4);
924
925 vdsc_cfg->initial_dec_delay = REG_FIELD_GET(DSC_PPS4_INITIAL_DEC_DELAY_MASK, pps_temp);
926 vdsc_cfg->initial_xmit_delay = REG_FIELD_GET(DSC_PPS4_INITIAL_XMIT_DELAY_MASK, pps_temp);
927
928 /* PPS 5 */
929 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 5);
930
931 vdsc_cfg->scale_decrement_interval = REG_FIELD_GET(DSC_PPS5_SCALE_DEC_INT_MASK, pps_temp);
932 vdsc_cfg->scale_increment_interval = REG_FIELD_GET(DSC_PPS5_SCALE_INC_INT_MASK, pps_temp);
933
934 /* PPS 6 */
935 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 6);
936
937 vdsc_cfg->initial_scale_value = REG_FIELD_GET(DSC_PPS6_INITIAL_SCALE_VALUE_MASK, pps_temp);
938 vdsc_cfg->first_line_bpg_offset = REG_FIELD_GET(DSC_PPS6_FIRST_LINE_BPG_OFFSET_MASK, pps_temp);
939 vdsc_cfg->flatness_min_qp = REG_FIELD_GET(DSC_PPS6_FLATNESS_MIN_QP_MASK, pps_temp);
940 vdsc_cfg->flatness_max_qp = REG_FIELD_GET(DSC_PPS6_FLATNESS_MAX_QP_MASK, pps_temp);
941
942 /* PPS 7 */
943 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 7);
944
945 vdsc_cfg->nfl_bpg_offset = REG_FIELD_GET(DSC_PPS7_NFL_BPG_OFFSET_MASK, pps_temp);
946 vdsc_cfg->slice_bpg_offset = REG_FIELD_GET(DSC_PPS7_SLICE_BPG_OFFSET_MASK, pps_temp);
947
948 /* PPS 8 */
949 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 8);
950
951 vdsc_cfg->initial_offset = REG_FIELD_GET(DSC_PPS8_INITIAL_OFFSET_MASK, pps_temp);
952 vdsc_cfg->final_offset = REG_FIELD_GET(DSC_PPS8_FINAL_OFFSET_MASK, pps_temp);
953
954 /* PPS 9 */
955 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 9);
956
957 vdsc_cfg->rc_model_size = REG_FIELD_GET(DSC_PPS9_RC_MODEL_SIZE_MASK, pps_temp);
958
959 /* PPS 10 */
960 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 10);
961
962 vdsc_cfg->rc_quant_incr_limit0 = REG_FIELD_GET(DSC_PPS10_RC_QUANT_INC_LIMIT0_MASK, pps_temp);
963 vdsc_cfg->rc_quant_incr_limit1 = REG_FIELD_GET(DSC_PPS10_RC_QUANT_INC_LIMIT1_MASK, pps_temp);
964
965 /* PPS 16 */
966 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 16);
967
968 vdsc_cfg->slice_chunk_size = REG_FIELD_GET(DSC_PPS16_SLICE_CHUNK_SIZE_MASK, pps_temp);
969
970 if (DISPLAY_VER(i915) >= 14) {
971 /* PPS 17 */
972 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 17);
973
974 vdsc_cfg->second_line_bpg_offset = REG_FIELD_GET(DSC_PPS17_SL_BPG_OFFSET_MASK, pps_temp);
975
976 /* PPS 18 */
977 pps_temp = intel_dsc_pps_read_and_verify(crtc_state, 18);
978
979 vdsc_cfg->nsl_bpg_offset = REG_FIELD_GET(DSC_PPS18_NSL_BPG_OFFSET_MASK, pps_temp);
980 vdsc_cfg->second_line_offset_adj = REG_FIELD_GET(DSC_PPS18_SL_OFFSET_ADJ_MASK, pps_temp);
981 }
982 }
983
984 void intel_dsc_get_config(struct intel_crtc_state *crtc_state)
985 {
986 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
987 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
988 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
989 enum intel_display_power_domain power_domain;
990 intel_wakeref_t wakeref;
991 u32 dss_ctl1, dss_ctl2, dss_ctl3 = 0;
992
993 if (!intel_dsc_source_support(crtc_state))
994 return;
995
996 power_domain = intel_dsc_power_domain(crtc, cpu_transcoder);
997
998 wakeref = intel_display_power_get_if_enabled(dev_priv, power_domain);
999 if (!wakeref)
1000 return;
1001
1002 dss_ctl1 = intel_de_read(dev_priv, dss_ctl1_reg(crtc, cpu_transcoder));
1003 dss_ctl2 = intel_de_read(dev_priv, dss_ctl2_reg(crtc, cpu_transcoder));
1004
1005 if (IS_BATTLEMAGE(dev_priv))
> 1006 dss_ctl3 = intel_de_read(dev_priv, BMG_PIPE_DSS_CTL3(crtc_state->cpu_transcoder));
1007
1008 crtc_state->dsc.compression_enable = dss_ctl2 & VDSC0_ENABLE;
1009 if (!crtc_state->dsc.compression_enable)
1010 goto out;
1011
1012 if (dss_ctl1 & JOINER_ENABLE) {
1013 if (dss_ctl2 & (VDSC2_ENABLE | SMALL_JOINER_CONFIG_3_ENGINES))
1014 crtc_state->dsc.dsc_split = INTEL_DSC_SPLIT_3_STREAMS;
1015
1016 else if (dss_ctl2 & VDSC1_ENABLE)
1017 crtc_state->dsc.dsc_split = INTEL_DSC_SPLIT_2_STREAMS;
1018 } else {
1019 crtc_state->dsc.dsc_split = INTEL_DSC_SPLIT_DISABLED;
1020 }
1021
1022 if (dss_ctl3 & DSC_PIXEL_REPLICATION_MASK)
1023 crtc_state->dsc.pixel_replication_count =
1024 dss_ctl3 & DSC_PIXEL_REPLICATION_MASK;
1025
1026 intel_dsc_get_pps_config(crtc_state);
1027 out:
1028 intel_display_power_put(dev_priv, power_domain, wakeref);
1029 }
1030
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the Intel-gfx
mailing list