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

Merge tag 'drm-intel-next-2025-11-14' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next

drm/i915 feature pull #2 for v6.19:

Features and functionality:
- Add initial display support for Xe3p_LPD, display version 35 (Sai Teja, Matt
R, Gustavo, Matt A, Ankit, Juha-pekka, Luca, Ravi Kumar)
- Compute LT PHY HDMI params when port clock not in predefined tables (Suraj)

Refactoring and cleanups:
- Refactor intel_frontbuffer split between i915, xe, and display (Ville)
- Clean up intel_de_wait_custom() usage (Ville)
- Unify display register polling interfaces (Ville)
- Finish removal of the expensive format info lookups (Ville)
- Cursor code cleanups (Ville)
- Convert intel_rom interfaces to struct drm_device (Jani)

Fixes:
- Fix uninitialized variable in DSI exec packet (Jonathan)
- Fix PIPEDMC logging (Alok Tiwari)
- Fix PSR pipe to vblank conversion (Jani)
- Fix intel_frontbuffer lifetime handling (Ville)
- Disable Panel Replay on DP MST for the time being (Imre)

Merges:
- Backmerge drm-next to get the drm_print.h changes (Jani)

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patch.msgid.link/b131309bb7310ab749f1770aa6e36fa8d6a82fa5@intel.com

+1347 -874
+1
drivers/gpu/drm/i915/Makefile
··· 156 156 gem/i915_gem_lmem.o \ 157 157 gem/i915_gem_mman.o \ 158 158 gem/i915_gem_object.o \ 159 + gem/i915_gem_object_frontbuffer.o \ 159 160 gem/i915_gem_pages.o \ 160 161 gem/i915_gem_phys.o \ 161 162 gem/i915_gem_pm.o \
+2 -2
drivers/gpu/drm/i915/display/hsw_ips.c
··· 56 56 * the HW state readout code will complain that the expected 57 57 * IPS_CTL value is not the one we read. 58 58 */ 59 - if (intel_de_wait_for_set(display, IPS_CTL, IPS_ENABLE, 50)) 59 + if (intel_de_wait_for_set_ms(display, IPS_CTL, IPS_ENABLE, 50)) 60 60 drm_err(display->drm, 61 61 "Timed out waiting for IPS enable\n"); 62 62 } ··· 78 78 * 42ms timeout value leads to occasional timeouts so use 100ms 79 79 * instead. 80 80 */ 81 - if (intel_de_wait_for_clear(display, IPS_CTL, IPS_ENABLE, 100)) 81 + if (intel_de_wait_for_clear_ms(display, IPS_CTL, IPS_ENABLE, 100)) 82 82 drm_err(display->drm, 83 83 "Timed out waiting for IPS disable\n"); 84 84 } else {
+14 -18
drivers/gpu/drm/i915/display/i9xx_plane.c
··· 754 754 755 755 static unsigned int 756 756 hsw_primary_max_stride(struct intel_plane *plane, 757 - u32 pixel_format, u64 modifier, 758 - unsigned int rotation) 757 + const struct drm_format_info *info, 758 + u64 modifier, unsigned int rotation) 759 759 { 760 - const struct drm_format_info *info = drm_format_info(pixel_format); 761 760 int cpp = info->cpp[0]; 762 761 763 762 /* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */ ··· 765 766 766 767 static unsigned int 767 768 ilk_primary_max_stride(struct intel_plane *plane, 768 - u32 pixel_format, u64 modifier, 769 - unsigned int rotation) 769 + const struct drm_format_info *info, 770 + u64 modifier, unsigned int rotation) 770 771 { 771 - const struct drm_format_info *info = drm_format_info(pixel_format); 772 772 int cpp = info->cpp[0]; 773 773 774 774 /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */ ··· 779 781 780 782 unsigned int 781 783 i965_plane_max_stride(struct intel_plane *plane, 782 - u32 pixel_format, u64 modifier, 783 - unsigned int rotation) 784 + const struct drm_format_info *info, 785 + u64 modifier, unsigned int rotation) 784 786 { 785 - const struct drm_format_info *info = drm_format_info(pixel_format); 786 787 int cpp = info->cpp[0]; 787 788 788 789 /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */ ··· 793 796 794 797 static unsigned int 795 798 i915_plane_max_stride(struct intel_plane *plane, 796 - u32 pixel_format, u64 modifier, 797 - unsigned int rotation) 799 + const struct drm_format_info *info, 800 + u64 modifier, unsigned int rotation) 798 801 { 799 802 if (modifier == I915_FORMAT_MOD_X_TILED) 800 803 return 8 * 1024; ··· 804 807 805 808 static unsigned int 806 809 i8xx_plane_max_stride(struct intel_plane *plane, 807 - u32 pixel_format, u64 modifier, 808 - unsigned int rotation) 810 + const struct drm_format_info *info, 811 + u64 modifier, unsigned int rotation) 809 812 { 810 813 if (plane->i9xx_plane == PLANE_C) 811 814 return 4 * 1024; ··· 1188 1191 val = intel_de_read(display, DSPCNTR(display, i9xx_plane)); 1189 1192 1190 1193 if (DISPLAY_VER(display) >= 4) { 1191 - if (val & DISP_TILED) { 1192 - plane_config->tiling = I915_TILING_X; 1194 + if (val & DISP_TILED) 1193 1195 fb->modifier = I915_FORMAT_MOD_X_TILED; 1194 - } 1195 1196 1196 1197 if (val & DISP_ROTATE_180) 1197 1198 plane_config->rotation = DRM_MODE_ROTATE_180; ··· 1201 1206 1202 1207 pixel_format = val & DISP_FORMAT_MASK; 1203 1208 fourcc = i9xx_format_to_fourcc(pixel_format); 1204 - fb->format = drm_format_info(fourcc); 1209 + 1210 + fb->format = drm_get_format_info(display->drm, fourcc, fb->modifier); 1205 1211 1206 1212 if (display->platform.haswell || display->platform.broadwell) { 1207 1213 offset = intel_de_read(display, 1208 1214 DSPOFFSET(display, i9xx_plane)); 1209 1215 base = intel_de_read(display, DSPSURF(display, i9xx_plane)) & DISP_ADDR_MASK; 1210 1216 } else if (DISPLAY_VER(display) >= 4) { 1211 - if (plane_config->tiling) 1217 + if (fb->modifier == I915_FORMAT_MOD_X_TILED) 1212 1218 offset = intel_de_read(display, 1213 1219 DSPTILEOFF(display, i9xx_plane)); 1214 1220 else
+3 -2
drivers/gpu/drm/i915/display/i9xx_plane.h
··· 9 9 #include <linux/types.h> 10 10 11 11 enum pipe; 12 + struct drm_format_info; 12 13 struct drm_framebuffer; 13 14 struct intel_crtc; 14 15 struct intel_display; ··· 19 18 20 19 #ifdef I915 21 20 unsigned int i965_plane_max_stride(struct intel_plane *plane, 22 - u32 pixel_format, u64 modifier, 23 - unsigned int rotation); 21 + const struct drm_format_info *info, 22 + u64 modifier, unsigned int rotation); 24 23 unsigned int vlv_plane_min_alignment(struct intel_plane *plane, 25 24 const struct drm_framebuffer *fb, 26 25 int colot_plane);
+16 -19
drivers/gpu/drm/i915/display/icl_dsi.c
··· 148 148 for_each_dsi_port(port, intel_dsi->ports) { 149 149 dsi_trans = dsi_port_to_transcoder(port); 150 150 151 - ret = intel_de_wait_custom(display, DSI_LP_MSG(dsi_trans), 152 - LPTX_IN_PROGRESS, 0, 153 - 20, 0, NULL); 151 + ret = intel_de_wait_for_clear_us(display, 152 + DSI_LP_MSG(dsi_trans), 153 + LPTX_IN_PROGRESS, 20); 154 154 if (ret) 155 155 drm_err(display->drm, "LPTX bit not cleared\n"); 156 156 } ··· 534 534 for_each_dsi_port(port, intel_dsi->ports) { 535 535 intel_de_rmw(display, DDI_BUF_CTL(port), 0, DDI_BUF_CTL_ENABLE); 536 536 537 - ret = intel_de_wait_custom(display, DDI_BUF_CTL(port), 538 - DDI_BUF_IS_IDLE, 0, 539 - 500, 0, NULL); 537 + ret = intel_de_wait_for_clear_us(display, DDI_BUF_CTL(port), 538 + DDI_BUF_IS_IDLE, 500); 540 539 if (ret) 541 540 drm_err(display->drm, "DDI port:%c buffer idle\n", 542 541 port_name(port)); ··· 856 857 857 858 dsi_trans = dsi_port_to_transcoder(port); 858 859 859 - ret = intel_de_wait_custom(display, DSI_TRANS_FUNC_CONF(dsi_trans), 860 - LINK_READY, LINK_READY, 861 - 2500, 0, NULL); 860 + ret = intel_de_wait_for_set_us(display, 861 + DSI_TRANS_FUNC_CONF(dsi_trans), 862 + LINK_READY, 2500); 862 863 if (ret) 863 864 drm_err(display->drm, "DSI link not ready\n"); 864 865 } ··· 1047 1048 TRANSCONF_ENABLE); 1048 1049 1049 1050 /* wait for transcoder to be enabled */ 1050 - if (intel_de_wait_for_set(display, TRANSCONF(display, dsi_trans), 1051 - TRANSCONF_STATE_ENABLE, 10)) 1051 + if (intel_de_wait_for_set_ms(display, TRANSCONF(display, dsi_trans), 1052 + TRANSCONF_STATE_ENABLE, 10)) 1052 1053 drm_err(display->drm, 1053 1054 "DSI transcoder not enabled\n"); 1054 1055 } ··· 1316 1317 TRANSCONF_ENABLE, 0); 1317 1318 1318 1319 /* wait for transcoder to be disabled */ 1319 - if (intel_de_wait_for_clear(display, TRANSCONF(display, dsi_trans), 1320 - TRANSCONF_STATE_ENABLE, 50)) 1320 + if (intel_de_wait_for_clear_ms(display, TRANSCONF(display, dsi_trans), 1321 + TRANSCONF_STATE_ENABLE, 50)) 1321 1322 drm_err(display->drm, 1322 1323 "DSI trancoder not disabled\n"); 1323 1324 } ··· 1357 1358 tmp &= ~LINK_ULPS_TYPE_LP11; 1358 1359 intel_de_write(display, DSI_LP_MSG(dsi_trans), tmp); 1359 1360 1360 - ret = intel_de_wait_custom(display, DSI_LP_MSG(dsi_trans), 1361 - LINK_IN_ULPS, LINK_IN_ULPS, 1362 - 10, 0, NULL); 1361 + ret = intel_de_wait_for_set_us(display, DSI_LP_MSG(dsi_trans), 1362 + LINK_IN_ULPS, 10); 1363 1363 if (ret) 1364 1364 drm_err(display->drm, "DSI link not in ULPS\n"); 1365 1365 } ··· 1393 1395 for_each_dsi_port(port, intel_dsi->ports) { 1394 1396 intel_de_rmw(display, DDI_BUF_CTL(port), DDI_BUF_CTL_ENABLE, 0); 1395 1397 1396 - ret = intel_de_wait_custom(display, DDI_BUF_CTL(port), 1397 - DDI_BUF_IS_IDLE, DDI_BUF_IS_IDLE, 1398 - 8, 0, NULL); 1398 + ret = intel_de_wait_for_set_us(display, DDI_BUF_CTL(port), 1399 + DDI_BUF_IS_IDLE, 8); 1399 1400 1400 1401 if (ret) 1401 1402 drm_err(display->drm,
+2 -4
drivers/gpu/drm/i915/display/intel_bios.c
··· 36 36 37 37 #include "soc/intel_rom.h" 38 38 39 - #include "i915_drv.h" 40 39 #include "intel_display.h" 41 40 #include "intel_display_core.h" 42 41 #include "intel_display_rpm.h" ··· 3144 3145 static const struct vbt_header *intel_bios_get_vbt(struct intel_display *display, 3145 3146 size_t *sizep) 3146 3147 { 3147 - struct drm_i915_private *i915 = to_i915(display->drm); 3148 3148 const struct vbt_header *vbt = NULL; 3149 3149 3150 3150 vbt = firmware_get_vbt(display, sizep); ··· 3157 3159 */ 3158 3160 if (!vbt && display->platform.dgfx) 3159 3161 with_intel_display_rpm(display) 3160 - vbt = oprom_get_vbt(display, intel_rom_spi(i915), sizep, "SPI flash"); 3162 + vbt = oprom_get_vbt(display, intel_rom_spi(display->drm), sizep, "SPI flash"); 3161 3163 3162 3164 if (!vbt) 3163 3165 with_intel_display_rpm(display) 3164 - vbt = oprom_get_vbt(display, intel_rom_pci(i915), sizep, "PCI ROM"); 3166 + vbt = oprom_get_vbt(display, intel_rom_pci(display->drm), sizep, "PCI ROM"); 3165 3167 3166 3168 return vbt; 3167 3169 }
+30 -10
drivers/gpu/drm/i915/display/intel_bo.c
··· 29 29 return i915_gem_object_is_protected(to_intel_bo(obj)); 30 30 } 31 31 32 - void intel_bo_flush_if_display(struct drm_gem_object *obj) 33 - { 34 - i915_gem_object_flush_if_display(to_intel_bo(obj)); 35 - } 36 - 37 32 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 38 33 { 39 34 return i915_gem_fb_mmap(to_intel_bo(obj), vma); ··· 39 44 return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size); 40 45 } 41 46 42 - struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj) 47 + struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj) 43 48 { 44 - return i915_gem_object_get_frontbuffer(to_intel_bo(obj)); 49 + struct drm_i915_gem_object *obj = to_intel_bo(_obj); 50 + struct i915_frontbuffer *front; 51 + 52 + front = i915_gem_object_frontbuffer_get(obj); 53 + if (!front) 54 + return NULL; 55 + 56 + return &front->base; 45 57 } 46 58 47 - struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj, 48 - struct intel_frontbuffer *front) 59 + void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front) 49 60 { 50 - return i915_gem_object_set_frontbuffer(to_intel_bo(obj), front); 61 + struct i915_frontbuffer *front = 62 + container_of(_front, typeof(*front), base); 63 + 64 + i915_gem_object_frontbuffer_ref(front); 65 + } 66 + 67 + void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front) 68 + { 69 + struct i915_frontbuffer *front = 70 + container_of(_front, typeof(*front), base); 71 + 72 + return i915_gem_object_frontbuffer_put(front); 73 + } 74 + 75 + void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front) 76 + { 77 + struct i915_frontbuffer *front = 78 + container_of(_front, typeof(*front), base); 79 + 80 + i915_gem_object_flush_if_display(front->obj); 51 81 } 52 82 53 83 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
+4 -4
drivers/gpu/drm/i915/display/intel_bo.h
··· 16 16 bool intel_bo_is_userptr(struct drm_gem_object *obj); 17 17 bool intel_bo_is_shmem(struct drm_gem_object *obj); 18 18 bool intel_bo_is_protected(struct drm_gem_object *obj); 19 - void intel_bo_flush_if_display(struct drm_gem_object *obj); 20 19 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 21 20 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size); 22 21 23 - struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj); 24 - struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj, 25 - struct intel_frontbuffer *front); 22 + struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj); 23 + void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front); 24 + void intel_bo_frontbuffer_put(struct intel_frontbuffer *front); 25 + void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front); 26 26 27 27 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj); 28 28
+27 -16
drivers/gpu/drm/i915/display/intel_bw.c
··· 805 805 if (!HAS_DISPLAY(display)) 806 806 return; 807 807 808 - if (DISPLAY_VERx100(display) >= 3002) 809 - tgl_get_bw_info(display, dram_info, &xe3lpd_3002_sa_info); 810 - else if (DISPLAY_VER(display) >= 30) 811 - tgl_get_bw_info(display, dram_info, &xe3lpd_sa_info); 812 - else if (DISPLAY_VERx100(display) >= 1401 && display->platform.dgfx && 813 - dram_info->type == INTEL_DRAM_GDDR_ECC) 814 - xe2_hpd_get_bw_info(display, dram_info, &xe2_hpd_ecc_sa_info); 815 - else if (DISPLAY_VERx100(display) >= 1401 && display->platform.dgfx) 816 - xe2_hpd_get_bw_info(display, dram_info, &xe2_hpd_sa_info); 817 - else if (DISPLAY_VER(display) >= 14) 808 + /* 809 + * Starting with Xe3p_LPD, the hardware tells us whether memory has ECC 810 + * enabled that would impact display bandwidth. However, so far there 811 + * are no instructions in Bspec on how to handle that case. Let's 812 + * complain if we ever find such a scenario. 813 + */ 814 + if (DISPLAY_VER(display) >= 35) 815 + drm_WARN_ON(display->drm, dram_info->ecc_impacting_de_bw); 816 + 817 + if (DISPLAY_VER(display) >= 30) { 818 + if (DISPLAY_VERx100(display) == 3002) 819 + tgl_get_bw_info(display, dram_info, &xe3lpd_3002_sa_info); 820 + else 821 + tgl_get_bw_info(display, dram_info, &xe3lpd_sa_info); 822 + } else if (DISPLAY_VERx100(display) >= 1401 && display->platform.dgfx) { 823 + if (dram_info->type == INTEL_DRAM_GDDR_ECC) 824 + xe2_hpd_get_bw_info(display, dram_info, &xe2_hpd_ecc_sa_info); 825 + else 826 + xe2_hpd_get_bw_info(display, dram_info, &xe2_hpd_sa_info); 827 + } else if (DISPLAY_VER(display) >= 14) { 818 828 tgl_get_bw_info(display, dram_info, &mtl_sa_info); 819 - else if (display->platform.dg2) 829 + } else if (display->platform.dg2) { 820 830 dg2_get_bw_info(display); 821 - else if (display->platform.alderlake_p) 831 + } else if (display->platform.alderlake_p) { 822 832 tgl_get_bw_info(display, dram_info, &adlp_sa_info); 823 - else if (display->platform.alderlake_s) 833 + } else if (display->platform.alderlake_s) { 824 834 tgl_get_bw_info(display, dram_info, &adls_sa_info); 825 - else if (display->platform.rocketlake) 835 + } else if (display->platform.rocketlake) { 826 836 tgl_get_bw_info(display, dram_info, &rkl_sa_info); 827 - else if (DISPLAY_VER(display) == 12) 837 + } else if (DISPLAY_VER(display) == 12) { 828 838 tgl_get_bw_info(display, dram_info, &tgl_sa_info); 829 - else if (DISPLAY_VER(display) == 11) 839 + } else if (DISPLAY_VER(display) == 11) { 830 840 icl_get_bw_info(display, dram_info, &icl_sa_info); 841 + } 831 842 } 832 843 833 844 static unsigned int intel_bw_num_active_planes(struct intel_display *display,
+56 -18
drivers/gpu/drm/i915/display/intel_cdclk.c
··· 902 902 * According to the spec, it should be enough to poll for this 1 us. 903 903 * However, extensive testing shows that this can take longer. 904 904 */ 905 - ret = intel_de_wait_custom(display, LCPLL_CTL, 906 - LCPLL_CD_SOURCE_FCLK_DONE, LCPLL_CD_SOURCE_FCLK_DONE, 907 - 100, 0, NULL); 905 + ret = intel_de_wait_for_set_us(display, LCPLL_CTL, 906 + LCPLL_CD_SOURCE_FCLK_DONE, 100); 908 907 if (ret) 909 908 drm_err(display->drm, "Switching to FCLK failed\n"); 910 909 ··· 913 914 intel_de_rmw(display, LCPLL_CTL, 914 915 LCPLL_CD_SOURCE_FCLK, 0); 915 916 916 - ret = intel_de_wait_custom(display, LCPLL_CTL, 917 - LCPLL_CD_SOURCE_FCLK_DONE, 0, 918 - 1, 0, NULL); 917 + ret = intel_de_wait_for_clear_us(display, LCPLL_CTL, 918 + LCPLL_CD_SOURCE_FCLK_DONE, 1); 919 919 if (ret) 920 920 drm_err(display->drm, "Switching back to LCPLL failed\n"); 921 921 ··· 1112 1114 intel_de_rmw(display, LCPLL1_CTL, 1113 1115 0, LCPLL_PLL_ENABLE); 1114 1116 1115 - if (intel_de_wait_for_set(display, LCPLL1_CTL, LCPLL_PLL_LOCK, 5)) 1117 + if (intel_de_wait_for_set_ms(display, LCPLL1_CTL, LCPLL_PLL_LOCK, 5)) 1116 1118 drm_err(display->drm, "DPLL0 not locked\n"); 1117 1119 1118 1120 display->cdclk.hw.vco = vco; ··· 1126 1128 intel_de_rmw(display, LCPLL1_CTL, 1127 1129 LCPLL_PLL_ENABLE, 0); 1128 1130 1129 - if (intel_de_wait_for_clear(display, LCPLL1_CTL, LCPLL_PLL_LOCK, 1)) 1131 + if (intel_de_wait_for_clear_ms(display, LCPLL1_CTL, LCPLL_PLL_LOCK, 1)) 1130 1132 drm_err(display->drm, "Couldn't disable DPLL0\n"); 1131 1133 1132 1134 display->cdclk.hw.vco = 0; ··· 1533 1535 {} 1534 1536 }; 1535 1537 1538 + static const struct intel_cdclk_vals xe3p_lpd_cdclk_table[] = { 1539 + { .refclk = 38400, .cdclk = 151200, .ratio = 21, .waveform = 0xa4a4 }, 1540 + { .refclk = 38400, .cdclk = 176400, .ratio = 21, .waveform = 0xaa54 }, 1541 + { .refclk = 38400, .cdclk = 201600, .ratio = 21, .waveform = 0xaaaa }, 1542 + { .refclk = 38400, .cdclk = 226800, .ratio = 21, .waveform = 0xad5a }, 1543 + { .refclk = 38400, .cdclk = 252000, .ratio = 21, .waveform = 0xb6b6 }, 1544 + { .refclk = 38400, .cdclk = 277200, .ratio = 21, .waveform = 0xdbb6 }, 1545 + { .refclk = 38400, .cdclk = 302400, .ratio = 21, .waveform = 0xeeee }, 1546 + { .refclk = 38400, .cdclk = 327600, .ratio = 21, .waveform = 0xf7de }, 1547 + { .refclk = 38400, .cdclk = 352800, .ratio = 21, .waveform = 0xfefe }, 1548 + { .refclk = 38400, .cdclk = 378000, .ratio = 21, .waveform = 0xfffe }, 1549 + { .refclk = 38400, .cdclk = 403200, .ratio = 21, .waveform = 0xffff }, 1550 + { .refclk = 38400, .cdclk = 422400, .ratio = 22, .waveform = 0xffff }, 1551 + { .refclk = 38400, .cdclk = 441600, .ratio = 23, .waveform = 0xffff }, 1552 + { .refclk = 38400, .cdclk = 460800, .ratio = 24, .waveform = 0xffff }, 1553 + { .refclk = 38400, .cdclk = 480000, .ratio = 25, .waveform = 0xffff }, 1554 + { .refclk = 38400, .cdclk = 499200, .ratio = 26, .waveform = 0xffff }, 1555 + { .refclk = 38400, .cdclk = 518400, .ratio = 27, .waveform = 0xffff }, 1556 + { .refclk = 38400, .cdclk = 537600, .ratio = 28, .waveform = 0xffff }, 1557 + { .refclk = 38400, .cdclk = 556800, .ratio = 29, .waveform = 0xffff }, 1558 + { .refclk = 38400, .cdclk = 576000, .ratio = 30, .waveform = 0xffff }, 1559 + { .refclk = 38400, .cdclk = 595200, .ratio = 31, .waveform = 0xffff }, 1560 + { .refclk = 38400, .cdclk = 614400, .ratio = 32, .waveform = 0xffff }, 1561 + { .refclk = 38400, .cdclk = 633600, .ratio = 33, .waveform = 0xffff }, 1562 + { .refclk = 38400, .cdclk = 652800, .ratio = 34, .waveform = 0xffff }, 1563 + { .refclk = 38400, .cdclk = 672000, .ratio = 35, .waveform = 0xffff }, 1564 + { .refclk = 38400, .cdclk = 691200, .ratio = 36, .waveform = 0xffff }, 1565 + { .refclk = 38400, .cdclk = 710400, .ratio = 37, .waveform = 0xffff }, 1566 + { .refclk = 38400, .cdclk = 729600, .ratio = 38, .waveform = 0xffff }, 1567 + { .refclk = 38400, .cdclk = 748800, .ratio = 39, .waveform = 0xffff }, 1568 + { .refclk = 38400, .cdclk = 768000, .ratio = 40, .waveform = 0xffff }, 1569 + { .refclk = 38400, .cdclk = 787200, .ratio = 41, .waveform = 0xffff }, 1570 + {} 1571 + }; 1572 + 1536 1573 static const int cdclk_squash_len = 16; 1537 1574 1538 1575 static int cdclk_squash_divider(u16 waveform) ··· 1833 1800 intel_de_write(display, BXT_DE_PLL_ENABLE, 0); 1834 1801 1835 1802 /* Timeout 200us */ 1836 - if (intel_de_wait_for_clear(display, 1837 - BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1803 + if (intel_de_wait_for_clear_ms(display, 1804 + BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1838 1805 drm_err(display->drm, "timeout waiting for DE PLL unlock\n"); 1839 1806 1840 1807 display->cdclk.hw.vco = 0; ··· 1850 1817 intel_de_write(display, BXT_DE_PLL_ENABLE, BXT_DE_PLL_PLL_ENABLE); 1851 1818 1852 1819 /* Timeout 200us */ 1853 - if (intel_de_wait_for_set(display, 1854 - BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1820 + if (intel_de_wait_for_set_ms(display, 1821 + BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1855 1822 drm_err(display->drm, "timeout waiting for DE PLL lock\n"); 1856 1823 1857 1824 display->cdclk.hw.vco = vco; ··· 1863 1830 BXT_DE_PLL_PLL_ENABLE, 0); 1864 1831 1865 1832 /* Timeout 200us */ 1866 - if (intel_de_wait_for_clear(display, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1833 + if (intel_de_wait_for_clear_ms(display, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1867 1834 drm_err(display->drm, "timeout waiting for CDCLK PLL unlock\n"); 1868 1835 1869 1836 display->cdclk.hw.vco = 0; ··· 1881 1848 intel_de_write(display, BXT_DE_PLL_ENABLE, val); 1882 1849 1883 1850 /* Timeout 200us */ 1884 - if (intel_de_wait_for_set(display, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1851 + if (intel_de_wait_for_set_ms(display, BXT_DE_PLL_ENABLE, BXT_DE_PLL_LOCK, 1)) 1885 1852 drm_err(display->drm, "timeout waiting for CDCLK PLL lock\n"); 1886 1853 1887 1854 display->cdclk.hw.vco = vco; ··· 1901 1868 intel_de_write(display, BXT_DE_PLL_ENABLE, val); 1902 1869 1903 1870 /* Timeout 200us */ 1904 - if (intel_de_wait_for_set(display, BXT_DE_PLL_ENABLE, 1905 - BXT_DE_PLL_LOCK | BXT_DE_PLL_FREQ_REQ_ACK, 1)) 1871 + if (intel_de_wait_for_set_ms(display, BXT_DE_PLL_ENABLE, 1872 + BXT_DE_PLL_LOCK | BXT_DE_PLL_FREQ_REQ_ACK, 1)) 1906 1873 drm_err(display->drm, "timeout waiting for FREQ change request ack\n"); 1907 1874 1908 1875 val &= ~BXT_DE_PLL_FREQ_REQ; ··· 3594 3561 */ 3595 3562 void intel_update_max_cdclk(struct intel_display *display) 3596 3563 { 3597 - if (DISPLAY_VERx100(display) >= 3002) { 3564 + if (DISPLAY_VER(display) >= 35) { 3565 + display->cdclk.max_cdclk_freq = 787200; 3566 + } else if (DISPLAY_VERx100(display) >= 3002) { 3598 3567 display->cdclk.max_cdclk_freq = 480000; 3599 3568 } else if (DISPLAY_VER(display) >= 30) { 3600 3569 display->cdclk.max_cdclk_freq = 691200; ··· 3947 3912 */ 3948 3913 void intel_init_cdclk_hooks(struct intel_display *display) 3949 3914 { 3950 - if (DISPLAY_VER(display) >= 30) { 3915 + if (DISPLAY_VER(display) >= 35) { 3916 + display->funcs.cdclk = &xe3lpd_cdclk_funcs; 3917 + display->cdclk.table = xe3p_lpd_cdclk_table; 3918 + } else if (DISPLAY_VER(display) >= 30) { 3951 3919 display->funcs.cdclk = &xe3lpd_cdclk_funcs; 3952 3920 display->cdclk.table = xe3lpd_cdclk_table; 3953 3921 } else if (DISPLAY_VER(display) >= 20) {
+7 -6
drivers/gpu/drm/i915/display/intel_color.c
··· 1090 1090 { 1091 1091 struct intel_display *display = to_intel_display(crtc_state); 1092 1092 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1093 - u32 tmp; 1094 1093 1095 1094 crtc_state->gamma_mode = hsw_read_gamma_mode(crtc); 1096 1095 crtc_state->csc_mode = ilk_read_csc_mode(crtc); 1097 1096 1098 - tmp = intel_de_read(display, SKL_BOTTOM_COLOR(crtc->pipe)); 1097 + if (DISPLAY_VER(display) < 35) { 1098 + u32 tmp = intel_de_read(display, SKL_BOTTOM_COLOR(crtc->pipe)); 1099 1099 1100 - if (tmp & SKL_BOTTOM_COLOR_GAMMA_ENABLE) 1101 - crtc_state->gamma_enable = true; 1100 + if (tmp & SKL_BOTTOM_COLOR_GAMMA_ENABLE) 1101 + crtc_state->gamma_enable = true; 1102 1102 1103 - if (tmp & SKL_BOTTOM_COLOR_CSC_ENABLE) 1104 - crtc_state->csc_enable = true; 1103 + if (tmp & SKL_BOTTOM_COLOR_CSC_ENABLE) 1104 + crtc_state->csc_enable = true; 1105 + } 1105 1106 } 1106 1107 1107 1108 static void skl_color_commit_arm(struct intel_dsb *dsb,
+8 -8
drivers/gpu/drm/i915/display/intel_crt.c
··· 498 498 499 499 intel_de_write(display, crt->adpa_reg, adpa); 500 500 501 - if (intel_de_wait_for_clear(display, 502 - crt->adpa_reg, 503 - ADPA_CRT_HOTPLUG_FORCE_TRIGGER, 504 - 1000)) 501 + if (intel_de_wait_for_clear_ms(display, 502 + crt->adpa_reg, 503 + ADPA_CRT_HOTPLUG_FORCE_TRIGGER, 504 + 1000)) 505 505 drm_dbg_kms(display->drm, 506 506 "timed out waiting for FORCE_TRIGGER"); 507 507 ··· 553 553 554 554 intel_de_write(display, crt->adpa_reg, adpa); 555 555 556 - if (intel_de_wait_for_clear(display, crt->adpa_reg, 557 - ADPA_CRT_HOTPLUG_FORCE_TRIGGER, 1000)) { 556 + if (intel_de_wait_for_clear_ms(display, crt->adpa_reg, 557 + ADPA_CRT_HOTPLUG_FORCE_TRIGGER, 1000)) { 558 558 drm_dbg_kms(display->drm, 559 559 "timed out waiting for FORCE_TRIGGER"); 560 560 intel_de_write(display, crt->adpa_reg, save_adpa); ··· 604 604 CRT_HOTPLUG_FORCE_DETECT, 605 605 CRT_HOTPLUG_FORCE_DETECT); 606 606 /* wait for FORCE_DETECT to go off */ 607 - if (intel_de_wait_for_clear(display, PORT_HOTPLUG_EN(display), 608 - CRT_HOTPLUG_FORCE_DETECT, 1000)) 607 + if (intel_de_wait_for_clear_ms(display, PORT_HOTPLUG_EN(display), 608 + CRT_HOTPLUG_FORCE_DETECT, 1000)) 609 609 drm_dbg_kms(display->drm, 610 610 "timed out waiting for FORCE_DETECT to go off"); 611 611 }
+24 -4
drivers/gpu/drm/i915/display/intel_cursor.c
··· 182 182 183 183 static unsigned int 184 184 i845_cursor_max_stride(struct intel_plane *plane, 185 - u32 pixel_format, u64 modifier, 186 - unsigned int rotation) 185 + const struct drm_format_info *info, 186 + u64 modifier, unsigned int rotation) 187 187 { 188 188 return 2048; 189 189 } ··· 343 343 344 344 static unsigned int 345 345 i9xx_cursor_max_stride(struct intel_plane *plane, 346 - u32 pixel_format, u64 modifier, 347 - unsigned int rotation) 346 + const struct drm_format_info *info, 347 + u64 modifier, unsigned int rotation) 348 348 { 349 349 return plane->base.dev->mode_config.cursor_width * 4; 350 350 } ··· 1091 1091 intel_plane_free(cursor); 1092 1092 1093 1093 return ERR_PTR(ret); 1094 + } 1095 + 1096 + void intel_cursor_mode_config_init(struct intel_display *display) 1097 + { 1098 + struct drm_mode_config *mode_config = &display->drm->mode_config; 1099 + 1100 + if (display->platform.i845g) { 1101 + mode_config->cursor_width = 64; 1102 + mode_config->cursor_height = 1023; 1103 + } else if (display->platform.i865g) { 1104 + mode_config->cursor_width = 512; 1105 + mode_config->cursor_height = 1023; 1106 + } else if (display->platform.i830 || display->platform.i85x || 1107 + display->platform.i915g || display->platform.i915gm) { 1108 + mode_config->cursor_width = 64; 1109 + mode_config->cursor_height = 64; 1110 + } else { 1111 + mode_config->cursor_width = 256; 1112 + mode_config->cursor_height = 256; 1113 + } 1094 1114 }
+2
drivers/gpu/drm/i915/display/intel_cursor.h
··· 17 17 18 18 void intel_cursor_unpin_work(struct kthread_work *base); 19 19 20 + void intel_cursor_mode_config_init(struct intel_display *display); 21 + 20 22 #endif
+63 -71
drivers/gpu/drm/i915/display/intel_cx0_phy.c
··· 145 145 intel_de_write(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 146 146 XELPDP_PORT_M2P_TRANSACTION_RESET); 147 147 148 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 149 - XELPDP_PORT_M2P_TRANSACTION_RESET, 150 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 148 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 149 + XELPDP_PORT_M2P_TRANSACTION_RESET, 150 + XELPDP_MSGBUS_TIMEOUT_MS)) { 151 151 drm_err_once(display->drm, 152 152 "Failed to bring PHY %c to idle.\n", 153 153 phy_name(phy)); ··· 164 164 enum port port = encoder->port; 165 165 enum phy phy = intel_encoder_to_phy(encoder); 166 166 167 - if (intel_de_wait_custom(display, 168 - XELPDP_PORT_P2M_MSGBUS_STATUS(display, port, lane), 169 - XELPDP_PORT_P2M_RESPONSE_READY, 170 - XELPDP_PORT_P2M_RESPONSE_READY, 171 - XELPDP_MSGBUS_TIMEOUT_FAST_US, 172 - XELPDP_MSGBUS_TIMEOUT_SLOW, val)) { 167 + if (intel_de_wait_ms(display, XELPDP_PORT_P2M_MSGBUS_STATUS(display, port, lane), 168 + XELPDP_PORT_P2M_RESPONSE_READY, 169 + XELPDP_PORT_P2M_RESPONSE_READY, 170 + XELPDP_MSGBUS_TIMEOUT_MS, val)) { 173 171 drm_dbg_kms(display->drm, 174 172 "PHY %c Timeout waiting for message ACK. Status: 0x%x\n", 175 173 phy_name(phy), *val); ··· 212 214 int ack; 213 215 u32 val; 214 216 215 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 216 - XELPDP_PORT_M2P_TRANSACTION_PENDING, 217 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 217 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 218 + XELPDP_PORT_M2P_TRANSACTION_PENDING, 219 + XELPDP_MSGBUS_TIMEOUT_MS)) { 218 220 drm_dbg_kms(display->drm, 219 221 "PHY %c Timeout waiting for previous transaction to complete. Reset the bus and retry.\n", phy_name(phy)); 220 222 intel_cx0_bus_reset(encoder, lane); ··· 283 285 int ack; 284 286 u32 val; 285 287 286 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 287 - XELPDP_PORT_M2P_TRANSACTION_PENDING, 288 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 288 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 289 + XELPDP_PORT_M2P_TRANSACTION_PENDING, 290 + XELPDP_MSGBUS_TIMEOUT_MS)) { 289 291 drm_dbg_kms(display->drm, 290 292 "PHY %c Timeout waiting for previous transaction to complete. Resetting the bus.\n", phy_name(phy)); 291 293 intel_cx0_bus_reset(encoder, lane); ··· 299 301 XELPDP_PORT_M2P_DATA(data) | 300 302 XELPDP_PORT_M2P_ADDRESS(addr)); 301 303 302 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 303 - XELPDP_PORT_M2P_TRANSACTION_PENDING, 304 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 304 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 305 + XELPDP_PORT_M2P_TRANSACTION_PENDING, 306 + XELPDP_MSGBUS_TIMEOUT_MS)) { 305 307 drm_dbg_kms(display->drm, 306 308 "PHY %c Timeout waiting for write to complete. Resetting the bus.\n", phy_name(phy)); 307 309 intel_cx0_bus_reset(encoder, lane); ··· 2812 2814 2813 2815 /* Wait for pending transactions.*/ 2814 2816 for_each_cx0_lane_in_mask(lane_mask, lane) 2815 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 2816 - XELPDP_PORT_M2P_TRANSACTION_PENDING, 2817 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 2817 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 2818 + XELPDP_PORT_M2P_TRANSACTION_PENDING, 2819 + XELPDP_MSGBUS_TIMEOUT_MS)) { 2818 2820 drm_dbg_kms(display->drm, 2819 2821 "PHY %c Timeout waiting for previous transaction to complete. Reset the bus.\n", 2820 2822 phy_name(phy)); ··· 2826 2828 intel_cx0_get_powerdown_update(lane_mask)); 2827 2829 2828 2830 /* Update Timeout Value */ 2829 - if (intel_de_wait_custom(display, buf_ctl2_reg, 2830 - intel_cx0_get_powerdown_update(lane_mask), 0, 2831 - XELPDP_PORT_POWERDOWN_UPDATE_TIMEOUT_US, 2, NULL)) 2831 + if (intel_de_wait_for_clear_ms(display, buf_ctl2_reg, 2832 + intel_cx0_get_powerdown_update(lane_mask), 2833 + XELPDP_PORT_POWERDOWN_UPDATE_TIMEOUT_MS)) 2832 2834 drm_warn(display->drm, 2833 - "PHY %c failed to bring out of Lane reset after %dus.\n", 2834 - phy_name(phy), XELPDP_PORT_RESET_START_TIMEOUT_US); 2835 + "PHY %c failed to bring out of lane reset\n", 2836 + phy_name(phy)); 2835 2837 } 2836 2838 2837 2839 void intel_cx0_setup_powerdown(struct intel_encoder *encoder) ··· 2887 2889 XELPDP_LANE_PHY_CURRENT_STATUS(1)) 2888 2890 : XELPDP_LANE_PHY_CURRENT_STATUS(0); 2889 2891 2890 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL1(display, port), 2891 - XELPDP_PORT_BUF_SOC_PHY_READY, 2892 - XELPDP_PORT_BUF_SOC_PHY_READY, 2893 - XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US, 0, NULL)) 2892 + if (intel_de_wait_for_set_us(display, XELPDP_PORT_BUF_CTL1(display, port), 2893 + XELPDP_PORT_BUF_SOC_PHY_READY, 2894 + XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US)) 2894 2895 drm_warn(display->drm, 2895 - "PHY %c failed to bring out of SOC reset after %dus.\n", 2896 - phy_name(phy), XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US); 2896 + "PHY %c failed to bring out of SOC reset\n", 2897 + phy_name(phy)); 2897 2898 2898 2899 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), lane_pipe_reset, 2899 2900 lane_pipe_reset); 2900 2901 2901 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL2(display, port), 2902 - lane_phy_current_status, lane_phy_current_status, 2903 - XELPDP_PORT_RESET_START_TIMEOUT_US, 0, NULL)) 2902 + if (intel_de_wait_for_set_us(display, XELPDP_PORT_BUF_CTL2(display, port), 2903 + lane_phy_current_status, 2904 + XELPDP_PORT_RESET_START_TIMEOUT_US)) 2904 2905 drm_warn(display->drm, 2905 - "PHY %c failed to bring out of Lane reset after %dus.\n", 2906 - phy_name(phy), XELPDP_PORT_RESET_START_TIMEOUT_US); 2906 + "PHY %c failed to bring out of lane reset\n", 2907 + phy_name(phy)); 2907 2908 2908 2909 intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, port), 2909 2910 intel_cx0_get_pclk_refclk_request(owned_lane_mask), 2910 2911 intel_cx0_get_pclk_refclk_request(lane_mask)); 2911 2912 2912 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, port), 2913 - intel_cx0_get_pclk_refclk_ack(owned_lane_mask), 2914 - intel_cx0_get_pclk_refclk_ack(lane_mask), 2915 - XELPDP_REFCLK_ENABLE_TIMEOUT_US, 0, NULL)) 2913 + if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, port), 2914 + intel_cx0_get_pclk_refclk_ack(owned_lane_mask), 2915 + intel_cx0_get_pclk_refclk_ack(lane_mask), 2916 + XELPDP_REFCLK_ENABLE_TIMEOUT_US, NULL)) 2916 2917 drm_warn(display->drm, 2917 - "PHY %c failed to request refclk after %dus.\n", 2918 - phy_name(phy), XELPDP_REFCLK_ENABLE_TIMEOUT_US); 2918 + "PHY %c failed to request refclk\n", 2919 + phy_name(phy)); 2919 2920 2920 2921 intel_cx0_powerdown_change_sequence(encoder, INTEL_CX0_BOTH_LANES, 2921 2922 XELPDP_P2_STATE_RESET); ··· 2922 2925 2923 2926 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), lane_pipe_reset, 0); 2924 2927 2925 - if (intel_de_wait_for_clear(display, XELPDP_PORT_BUF_CTL2(display, port), 2926 - lane_phy_current_status, 2927 - XELPDP_PORT_RESET_END_TIMEOUT)) 2928 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_BUF_CTL2(display, port), 2929 + lane_phy_current_status, 2930 + XELPDP_PORT_RESET_END_TIMEOUT_MS)) 2928 2931 drm_warn(display->drm, 2929 - "PHY %c failed to bring out of Lane reset after %dms.\n", 2930 - phy_name(phy), XELPDP_PORT_RESET_END_TIMEOUT); 2932 + "PHY %c failed to bring out of lane reset\n", 2933 + phy_name(phy)); 2931 2934 } 2932 2935 2933 2936 static void intel_cx0_program_phy_lane(struct intel_encoder *encoder, int lane_count, ··· 3062 3065 intel_cx0_get_pclk_pll_request(maxpclk_lane)); 3063 3066 3064 3067 /* 10. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK> == "1". */ 3065 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3066 - intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES), 3067 - intel_cx0_get_pclk_pll_ack(maxpclk_lane), 3068 - XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, 0, NULL)) 3069 - drm_warn(display->drm, "Port %c PLL not locked after %dus.\n", 3070 - phy_name(phy), XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US); 3068 + if (intel_de_wait_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3069 + intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES), 3070 + intel_cx0_get_pclk_pll_ack(maxpclk_lane), 3071 + XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US, NULL)) 3072 + drm_warn(display->drm, "Port %c PLL not locked\n", 3073 + phy_name(phy)); 3071 3074 3072 3075 /* 3073 3076 * 11. Follow the Display Voltage Frequency Switching Sequence After ··· 3186 3189 intel_de_write(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), val); 3187 3190 3188 3191 /* 5. Poll on PORT_CLOCK_CTL TBT CLOCK Ack == "1". */ 3189 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3190 - XELPDP_TBT_CLOCK_ACK, 3191 - XELPDP_TBT_CLOCK_ACK, 3192 - 100, 0, NULL)) 3193 - drm_warn(display->drm, 3194 - "[ENCODER:%d:%s][%c] PHY PLL not locked after 100us.\n", 3192 + if (intel_de_wait_for_set_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3193 + XELPDP_TBT_CLOCK_ACK, 100)) 3194 + drm_warn(display->drm, "[ENCODER:%d:%s][%c] PHY PLL not locked\n", 3195 3195 encoder->base.base.id, encoder->base.name, phy_name(phy)); 3196 3196 3197 3197 /* ··· 3298 3304 /* 3299 3305 * 5. Poll on PORT_CLOCK_CTL PCLK PLL Ack LN<Lane for maxPCLK**> == "0". 3300 3306 */ 3301 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3302 - intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES) | 3303 - intel_cx0_get_pclk_refclk_ack(INTEL_CX0_BOTH_LANES), 0, 3304 - XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US, 0, NULL)) 3305 - drm_warn(display->drm, 3306 - "Port %c PLL not unlocked after %dus.\n", 3307 - phy_name(phy), XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US); 3307 + if (intel_de_wait_for_clear_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3308 + intel_cx0_get_pclk_pll_ack(INTEL_CX0_BOTH_LANES) | 3309 + intel_cx0_get_pclk_refclk_ack(INTEL_CX0_BOTH_LANES), 3310 + XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US)) 3311 + drm_warn(display->drm, "Port %c PLL not unlocked\n", 3312 + phy_name(phy)); 3308 3313 3309 3314 /* 3310 3315 * 6. Follow the Display Voltage Frequency Switching Sequence After ··· 3346 3353 XELPDP_TBT_CLOCK_REQUEST, 0); 3347 3354 3348 3355 /* 3. Poll on PORT_CLOCK_CTL TBT CLOCK Ack == "0". */ 3349 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3350 - XELPDP_TBT_CLOCK_ACK, 0, 10, 0, NULL)) 3351 - drm_warn(display->drm, 3352 - "[ENCODER:%d:%s][%c] PHY PLL not unlocked after 10us.\n", 3356 + if (intel_de_wait_for_clear_us(display, XELPDP_PORT_CLOCK_CTL(display, encoder->port), 3357 + XELPDP_TBT_CLOCK_ACK, 10)) 3358 + drm_warn(display->drm, "[ENCODER:%d:%s][%c] PHY PLL not unlocked\n", 3353 3359 encoder->base.base.id, encoder->base.name, phy_name(phy)); 3354 3360 3355 3361 /*
+3 -4
drivers/gpu/drm/i915/display/intel_cx0_phy_regs.h
··· 74 74 #define XELPDP_PORT_P2M_DATA(val) REG_FIELD_PREP(XELPDP_PORT_P2M_DATA_MASK, val) 75 75 #define XELPDP_PORT_P2M_ERROR_SET REG_BIT(15) 76 76 77 - #define XELPDP_MSGBUS_TIMEOUT_SLOW 1 78 - #define XELPDP_MSGBUS_TIMEOUT_FAST_US 2 77 + #define XELPDP_MSGBUS_TIMEOUT_MS 1 79 78 #define XELPDP_PCLK_PLL_ENABLE_TIMEOUT_US 3200 80 79 #define XELPDP_PCLK_PLL_DISABLE_TIMEOUT_US 20 81 80 #define XELPDP_PORT_BUF_SOC_READY_TIMEOUT_US 100 82 81 #define XELPDP_PORT_RESET_START_TIMEOUT_US 5 83 - #define XELPDP_PORT_POWERDOWN_UPDATE_TIMEOUT_US 100 84 - #define XELPDP_PORT_RESET_END_TIMEOUT 15 82 + #define XELPDP_PORT_POWERDOWN_UPDATE_TIMEOUT_MS 2 83 + #define XELPDP_PORT_RESET_END_TIMEOUT_MS 15 85 84 #define XELPDP_REFCLK_ENABLE_TIMEOUT_US 1 86 85 87 86 #define _XELPDP_PORT_BUF_CTL1_LN0_A 0x64004
+15 -19
drivers/gpu/drm/i915/display/intel_ddi.c
··· 210 210 } 211 211 212 212 static_assert(DDI_BUF_IS_IDLE == XELPDP_PORT_BUF_PHY_IDLE); 213 - if (intel_de_wait_for_set(display, intel_ddi_buf_status_reg(display, port), 214 - DDI_BUF_IS_IDLE, 10)) 213 + if (intel_de_wait_for_set_ms(display, intel_ddi_buf_status_reg(display, port), 214 + DDI_BUF_IS_IDLE, 10)) 215 215 drm_err(display->drm, "Timeout waiting for DDI BUF %c to get idle\n", 216 216 port_name(port)); 217 217 } ··· 235 235 } 236 236 237 237 static_assert(DDI_BUF_IS_IDLE == XELPDP_PORT_BUF_PHY_IDLE); 238 - if (intel_de_wait_for_clear(display, intel_ddi_buf_status_reg(display, port), 239 - DDI_BUF_IS_IDLE, 10)) 238 + if (intel_de_wait_for_clear_ms(display, intel_ddi_buf_status_reg(display, port), 239 + DDI_BUF_IS_IDLE, 10)) 240 240 drm_err(display->drm, "Timeout waiting for DDI BUF %c to get active\n", 241 241 port_name(port)); 242 242 } ··· 2307 2307 { 2308 2308 struct intel_display *display = to_intel_display(encoder); 2309 2309 2310 - if (intel_de_wait_for_set(display, dp_tp_status_reg(encoder, crtc_state), 2311 - DP_TP_STATUS_ACT_SENT, 1)) 2310 + if (intel_de_wait_for_set_ms(display, dp_tp_status_reg(encoder, crtc_state), 2311 + DP_TP_STATUS_ACT_SENT, 1)) 2312 2312 drm_err(display->drm, "Timed out waiting for ACT sent\n"); 2313 2313 } 2314 2314 ··· 2383 2383 return 0; 2384 2384 2385 2385 if (enabled) 2386 - ret = intel_de_wait_for_set(display, dp_tp_status_reg(encoder, crtc_state), 2387 - DP_TP_STATUS_FEC_ENABLE_LIVE, 1); 2386 + ret = intel_de_wait_for_set_ms(display, dp_tp_status_reg(encoder, crtc_state), 2387 + DP_TP_STATUS_FEC_ENABLE_LIVE, 1); 2388 2388 else 2389 - ret = intel_de_wait_for_clear(display, dp_tp_status_reg(encoder, crtc_state), 2390 - DP_TP_STATUS_FEC_ENABLE_LIVE, 1); 2389 + ret = intel_de_wait_for_clear_ms(display, dp_tp_status_reg(encoder, crtc_state), 2390 + DP_TP_STATUS_FEC_ENABLE_LIVE, 1); 2391 2391 2392 2392 if (ret) { 2393 2393 drm_err(display->drm, ··· 2577 2577 2578 2578 intel_de_rmw(display, reg, 0, set_bits); 2579 2579 2580 - ret = intel_de_wait_custom(display, reg, 2581 - wait_bits, wait_bits, 2582 - 100, 0, NULL); 2580 + ret = intel_de_wait_for_set_us(display, reg, wait_bits, 100); 2583 2581 if (ret) { 2584 2582 drm_err(display->drm, "Timeout waiting for D2D Link enable for DDI/PORT_BUF_CTL %c\n", 2585 2583 port_name(port)); ··· 3077 3079 3078 3080 intel_de_rmw(display, reg, clr_bits, 0); 3079 3081 3080 - ret = intel_de_wait_custom(display, reg, 3081 - wait_bits, 0, 3082 - 100, 0, NULL); 3082 + ret = intel_de_wait_for_clear_us(display, reg, wait_bits, 100); 3083 3083 if (ret) 3084 3084 drm_err(display->drm, "Timeout waiting for D2D Link disable for DDI/PORT_BUF_CTL %c\n", 3085 3085 port_name(port)); ··· 3864 3868 if (port == PORT_A && DISPLAY_VER(display) < 12) 3865 3869 return; 3866 3870 3867 - if (intel_de_wait_for_set(display, 3868 - dp_tp_status_reg(encoder, crtc_state), 3869 - DP_TP_STATUS_IDLE_DONE, 2)) 3871 + if (intel_de_wait_for_set_ms(display, 3872 + dp_tp_status_reg(encoder, crtc_state), 3873 + DP_TP_STATUS_IDLE_DONE, 2)) 3870 3874 drm_err(display->drm, 3871 3875 "Timed out waiting for DP idle patterns\n"); 3872 3876 }
+72 -71
drivers/gpu/drm/i915/display/intel_de.h
··· 84 84 } 85 85 86 86 static inline u32 87 - __intel_de_rmw_nowl(struct intel_display *display, i915_reg_t reg, 88 - u32 clear, u32 set) 89 - { 90 - return intel_uncore_rmw(__to_uncore(display), reg, clear, set); 91 - } 92 - 93 - static inline u32 94 87 intel_de_rmw(struct intel_display *display, i915_reg_t reg, u32 clear, u32 set) 95 88 { 96 89 u32 val; 97 90 98 91 intel_dmc_wl_get(display, reg); 99 92 100 - val = __intel_de_rmw_nowl(display, reg, clear, set); 93 + val = intel_uncore_rmw(__to_uncore(display), reg, clear, set); 101 94 102 95 intel_dmc_wl_put(display, reg); 103 96 ··· 98 105 } 99 106 100 107 static inline int 101 - __intel_de_wait_for_register_nowl(struct intel_display *display, 102 - i915_reg_t reg, 103 - u32 mask, u32 value, unsigned int timeout_ms) 104 - { 105 - return intel_wait_for_register(__to_uncore(display), reg, mask, 106 - value, timeout_ms); 107 - } 108 - 109 - static inline int 110 - __intel_de_wait_for_register_atomic_nowl(struct intel_display *display, 111 - i915_reg_t reg, 112 - u32 mask, u32 value, 113 - unsigned int fast_timeout_us) 114 - { 115 - return __intel_wait_for_register(__to_uncore(display), reg, mask, 116 - value, fast_timeout_us, 0, NULL); 117 - } 118 - 119 - static inline int 120 - intel_de_wait(struct intel_display *display, i915_reg_t reg, 121 - u32 mask, u32 value, unsigned int timeout_ms) 122 - { 123 - int ret; 124 - 125 - intel_dmc_wl_get(display, reg); 126 - 127 - ret = __intel_de_wait_for_register_nowl(display, reg, mask, value, 128 - timeout_ms); 129 - 130 - intel_dmc_wl_put(display, reg); 131 - 132 - return ret; 133 - } 134 - 135 - static inline int 136 - intel_de_wait_fw(struct intel_display *display, i915_reg_t reg, 137 - u32 mask, u32 value, unsigned int timeout_ms, u32 *out_value) 138 - { 139 - int ret; 140 - 141 - intel_dmc_wl_get(display, reg); 142 - 143 - ret = intel_wait_for_register_fw(__to_uncore(display), reg, mask, 144 - value, timeout_ms, out_value); 145 - 146 - intel_dmc_wl_put(display, reg); 147 - 148 - return ret; 149 - } 150 - 151 - static inline int 152 - intel_de_wait_custom(struct intel_display *display, i915_reg_t reg, 153 - u32 mask, u32 value, 154 - unsigned int fast_timeout_us, 155 - unsigned int slow_timeout_ms, u32 *out_value) 108 + intel_de_wait_us(struct intel_display *display, i915_reg_t reg, 109 + u32 mask, u32 value, unsigned int timeout_us, 110 + u32 *out_value) 156 111 { 157 112 int ret; 158 113 159 114 intel_dmc_wl_get(display, reg); 160 115 161 116 ret = __intel_wait_for_register(__to_uncore(display), reg, mask, 162 - value, 163 - fast_timeout_us, slow_timeout_ms, out_value); 117 + value, timeout_us, 0, out_value); 164 118 165 119 intel_dmc_wl_put(display, reg); 166 120 ··· 115 175 } 116 176 117 177 static inline int 118 - intel_de_wait_for_set(struct intel_display *display, i915_reg_t reg, 119 - u32 mask, unsigned int timeout_ms) 178 + intel_de_wait_ms(struct intel_display *display, i915_reg_t reg, 179 + u32 mask, u32 value, unsigned int timeout_ms, 180 + u32 *out_value) 120 181 { 121 - return intel_de_wait(display, reg, mask, mask, timeout_ms); 182 + int ret; 183 + 184 + intel_dmc_wl_get(display, reg); 185 + 186 + ret = __intel_wait_for_register(__to_uncore(display), reg, mask, 187 + value, 2, timeout_ms, out_value); 188 + 189 + intel_dmc_wl_put(display, reg); 190 + 191 + return ret; 122 192 } 123 193 124 194 static inline int 125 - intel_de_wait_for_clear(struct intel_display *display, i915_reg_t reg, 126 - u32 mask, unsigned int timeout_ms) 195 + intel_de_wait_fw_ms(struct intel_display *display, i915_reg_t reg, 196 + u32 mask, u32 value, unsigned int timeout_ms, 197 + u32 *out_value) 127 198 { 128 - return intel_de_wait(display, reg, mask, 0, timeout_ms); 199 + return __intel_wait_for_register_fw(__to_uncore(display), reg, mask, 200 + value, 2, timeout_ms, out_value); 201 + } 202 + 203 + static inline int 204 + intel_de_wait_fw_us_atomic(struct intel_display *display, i915_reg_t reg, 205 + u32 mask, u32 value, unsigned int timeout_us, 206 + u32 *out_value) 207 + { 208 + return __intel_wait_for_register_fw(__to_uncore(display), reg, mask, 209 + value, timeout_us, 0, out_value); 210 + } 211 + 212 + static inline int 213 + intel_de_wait_for_set_us(struct intel_display *display, i915_reg_t reg, 214 + u32 mask, unsigned int timeout_us) 215 + { 216 + return intel_de_wait_us(display, reg, mask, mask, timeout_us, NULL); 217 + } 218 + 219 + static inline int 220 + intel_de_wait_for_clear_us(struct intel_display *display, i915_reg_t reg, 221 + u32 mask, unsigned int timeout_us) 222 + { 223 + return intel_de_wait_us(display, reg, mask, 0, timeout_us, NULL); 224 + } 225 + 226 + static inline int 227 + intel_de_wait_for_set_ms(struct intel_display *display, i915_reg_t reg, 228 + u32 mask, unsigned int timeout_ms) 229 + { 230 + return intel_de_wait_ms(display, reg, mask, mask, timeout_ms, NULL); 231 + } 232 + 233 + static inline int 234 + intel_de_wait_for_clear_ms(struct intel_display *display, i915_reg_t reg, 235 + u32 mask, unsigned int timeout_ms) 236 + { 237 + return intel_de_wait_ms(display, reg, mask, 0, timeout_ms, NULL); 129 238 } 130 239 131 240 /* ··· 201 212 { 202 213 trace_i915_reg_rw(true, reg, val, sizeof(val), true); 203 214 intel_uncore_write_fw(__to_uncore(display), reg, val); 215 + } 216 + 217 + static inline u32 218 + intel_de_rmw_fw(struct intel_display *display, i915_reg_t reg, u32 clear, u32 set) 219 + { 220 + u32 old, val; 221 + 222 + old = intel_de_read_fw(display, reg); 223 + val = (old & ~clear) | set; 224 + intel_de_write_fw(display, reg, val); 225 + 226 + return old; 204 227 } 205 228 206 229 static inline u32
+27 -15
drivers/gpu/drm/i915/display/intel_display.c
··· 359 359 enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder; 360 360 361 361 /* Wait for the Pipe State to go off */ 362 - if (intel_de_wait_for_clear(display, TRANSCONF(display, cpu_transcoder), 363 - TRANSCONF_STATE_ENABLE, 100)) 362 + if (intel_de_wait_for_clear_ms(display, TRANSCONF(display, cpu_transcoder), 363 + TRANSCONF_STATE_ENABLE, 100)) 364 364 drm_WARN(display->drm, 1, "pipe_off wait timed out\n"); 365 365 } else { 366 366 intel_wait_for_pipe_scanline_stopped(crtc); ··· 547 547 intel_wait_for_pipe_off(old_crtc_state); 548 548 } 549 549 550 - u32 intel_plane_fb_max_stride(struct drm_device *drm, 551 - u32 pixel_format, u64 modifier) 550 + u32 intel_plane_fb_max_stride(struct intel_display *display, 551 + const struct drm_format_info *info, 552 + u64 modifier) 552 553 { 553 - struct intel_display *display = to_intel_display(drm); 554 554 struct intel_crtc *crtc; 555 555 struct intel_plane *plane; 556 - 557 - if (!HAS_DISPLAY(display)) 558 - return 0; 559 556 560 557 /* 561 558 * We assume the primary plane for pipe A has ··· 565 568 566 569 plane = to_intel_plane(crtc->base.primary); 567 570 568 - return plane->max_stride(plane, pixel_format, modifier, 571 + return plane->max_stride(plane, info, modifier, 569 572 DRM_MODE_ROTATE_0); 573 + } 574 + 575 + u32 intel_dumb_fb_max_stride(struct drm_device *drm, 576 + u32 pixel_format, u64 modifier) 577 + { 578 + struct intel_display *display = to_intel_display(drm); 579 + 580 + if (!HAS_DISPLAY(display)) 581 + return 0; 582 + 583 + return intel_plane_fb_max_stride(display, 584 + drm_get_format_info(drm, pixel_format, modifier), 585 + modifier); 570 586 } 571 587 572 588 void intel_set_plane_visible(struct intel_crtc_state *crtc_state, ··· 2668 2658 crtc_vblank_start = crtc_vdisplay + crtc_state->set_context_latency; 2669 2659 } 2670 2660 2671 - if (DISPLAY_VER(display) >= 4) 2661 + if (DISPLAY_VER(display) >= 4 && DISPLAY_VER(display) < 35) 2672 2662 intel_de_write(display, 2673 2663 TRANS_VSYNCSHIFT(display, cpu_transcoder), 2674 2664 vsyncshift); ··· 2809 2799 struct intel_display *display = to_intel_display(crtc_state); 2810 2800 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 2811 2801 2812 - if (DISPLAY_VER(display) == 2) 2802 + if (DISPLAY_VER(display) == 2 || DISPLAY_VER(display) >= 35) 2813 2803 return false; 2814 2804 2815 2805 if (DISPLAY_VER(display) >= 9 || ··· 3200 3190 if (display->platform.haswell && crtc_state->dither) 3201 3191 val |= TRANSCONF_DITHER_EN | TRANSCONF_DITHER_TYPE_SP; 3202 3192 3203 - if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) 3204 - val |= TRANSCONF_INTERLACE_IF_ID_ILK; 3205 - else 3206 - val |= TRANSCONF_INTERLACE_PF_PD_ILK; 3193 + if (DISPLAY_VER(display) < 35) { 3194 + if (crtc_state->hw.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE) 3195 + val |= TRANSCONF_INTERLACE_IF_ID_ILK; 3196 + else 3197 + val |= TRANSCONF_INTERLACE_PF_PD_ILK; 3198 + } 3207 3199 3208 3200 if (display->platform.haswell && 3209 3201 crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
+6 -2
drivers/gpu/drm/i915/display/intel_display.h
··· 34 34 struct drm_device; 35 35 struct drm_display_mode; 36 36 struct drm_encoder; 37 + struct drm_format_info; 37 38 struct drm_modeset_acquire_ctx; 38 39 struct intel_atomic_state; 39 40 struct intel_crtc; ··· 403 402 int pixel_clock, int link_clock, 404 403 int bw_overhead, 405 404 struct intel_link_m_n *m_n); 406 - u32 intel_plane_fb_max_stride(struct drm_device *drm, 407 - u32 pixel_format, u64 modifier); 405 + u32 intel_plane_fb_max_stride(struct intel_display *display, 406 + const struct drm_format_info *info, 407 + u64 modifier); 408 + u32 intel_dumb_fb_max_stride(struct drm_device *drm, 409 + u32 pixel_format, u64 modifier); 408 410 enum drm_mode_status 409 411 intel_mode_valid_max_plane_size(struct intel_display *display, 410 412 const struct drm_display_mode *mode,
+2 -3
drivers/gpu/drm/i915/display/intel_display_core.h
··· 142 142 }; 143 143 144 144 struct intel_frontbuffer_tracking { 145 + /* protects busy_bits */ 145 146 spinlock_t lock; 146 147 147 148 /* 148 - * Tracking bits for delayed frontbuffer flushing du to gpu activity or 149 - * scheduled flips. 149 + * Tracking bits for delayed frontbuffer flushing due to gpu activity. 150 150 */ 151 151 unsigned busy_bits; 152 - unsigned flip_bits; 153 152 }; 154 153 155 154 struct intel_hotplug {
-3
drivers/gpu/drm/i915/display/intel_display_debugfs.c
··· 78 78 seq_printf(m, "FB tracking busy bits: 0x%08x\n", 79 79 display->fb_tracking.busy_bits); 80 80 81 - seq_printf(m, "FB tracking flip bits: 0x%08x\n", 82 - display->fb_tracking.flip_bits); 83 - 84 81 spin_unlock(&display->fb_tracking.lock); 85 82 86 83 return 0;
+1
drivers/gpu/drm/i915/display/intel_display_device.c
··· 1507 1507 { 20, 0, &xe2_lpd_display }, 1508 1508 { 30, 0, &xe2_lpd_display }, 1509 1509 { 30, 2, &wcl_display }, 1510 + { 35, 0, &xe2_lpd_display }, 1510 1511 }; 1511 1512 1512 1513 static const struct intel_display_device_info *
+2 -11
drivers/gpu/drm/i915/display/intel_display_driver.c
··· 29 29 #include "intel_cdclk.h" 30 30 #include "intel_color.h" 31 31 #include "intel_crtc.h" 32 + #include "intel_cursor.h" 32 33 #include "intel_dbuf_bw.h" 33 34 #include "intel_display_core.h" 34 35 #include "intel_display_debugfs.h" ··· 149 148 mode_config->max_height = 2048; 150 149 } 151 150 152 - if (display->platform.i845g || display->platform.i865g) { 153 - mode_config->cursor_width = display->platform.i845g ? 64 : 512; 154 - mode_config->cursor_height = 1023; 155 - } else if (display->platform.i830 || display->platform.i85x || 156 - display->platform.i915g || display->platform.i915gm) { 157 - mode_config->cursor_width = 64; 158 - mode_config->cursor_height = 64; 159 - } else { 160 - mode_config->cursor_width = 256; 161 - mode_config->cursor_height = 256; 162 - } 151 + intel_cursor_mode_config_init(display); 163 152 } 164 153 165 154 static void intel_mode_config_cleanup(struct intel_display *display)
+9 -8
drivers/gpu/drm/i915/display/intel_display_power.c
··· 1292 1292 val |= LCPLL_CD_SOURCE_FCLK; 1293 1293 intel_de_write(display, LCPLL_CTL, val); 1294 1294 1295 - ret = intel_de_wait_custom(display, LCPLL_CTL, 1296 - LCPLL_CD_SOURCE_FCLK_DONE, LCPLL_CD_SOURCE_FCLK_DONE, 1297 - 1, 0, NULL); 1295 + ret = intel_de_wait_for_set_us(display, LCPLL_CTL, 1296 + LCPLL_CD_SOURCE_FCLK_DONE, 1); 1298 1297 if (ret) 1299 1298 drm_err(display->drm, "Switching to FCLK failed\n"); 1300 1299 ··· 1304 1305 intel_de_write(display, LCPLL_CTL, val); 1305 1306 intel_de_posting_read(display, LCPLL_CTL); 1306 1307 1307 - if (intel_de_wait_for_clear(display, LCPLL_CTL, LCPLL_PLL_LOCK, 1)) 1308 + if (intel_de_wait_for_clear_ms(display, LCPLL_CTL, LCPLL_PLL_LOCK, 1)) 1308 1309 drm_err(display->drm, "LCPLL still locked\n"); 1309 1310 1310 1311 val = hsw_read_dcomp(display); ··· 1361 1362 val &= ~LCPLL_PLL_DISABLE; 1362 1363 intel_de_write(display, LCPLL_CTL, val); 1363 1364 1364 - if (intel_de_wait_for_set(display, LCPLL_CTL, LCPLL_PLL_LOCK, 5)) 1365 + if (intel_de_wait_for_set_ms(display, LCPLL_CTL, LCPLL_PLL_LOCK, 5)) 1365 1366 drm_err(display->drm, "LCPLL not locked yet\n"); 1366 1367 1367 1368 if (val & LCPLL_CD_SOURCE_FCLK) { 1368 1369 intel_de_rmw(display, LCPLL_CTL, LCPLL_CD_SOURCE_FCLK, 0); 1369 1370 1370 - ret = intel_de_wait_custom(display, LCPLL_CTL, 1371 - LCPLL_CD_SOURCE_FCLK_DONE, 0, 1372 - 1, 0, NULL); 1371 + ret = intel_de_wait_for_clear_us(display, LCPLL_CTL, 1372 + LCPLL_CD_SOURCE_FCLK_DONE, 1); 1373 1373 if (ret) 1374 1374 drm_err(display->drm, 1375 1375 "Switching back to LCPLL failed\n"); ··· 1435 1437 { 1436 1438 i915_reg_t reg; 1437 1439 u32 reset_bits; 1440 + 1441 + if (DISPLAY_VER(display) >= 35) 1442 + return; 1438 1443 1439 1444 if (display->platform.ivybridge) { 1440 1445 reg = GEN7_MSG_CTL;
+21 -21
drivers/gpu/drm/i915/display/intel_display_power_well.c
··· 293 293 } 294 294 295 295 /* Timeout for PW1:10 us, AUX:not specified, other PWs:20 us. */ 296 - if (intel_de_wait_for_set(display, regs->driver, 297 - HSW_PWR_WELL_CTL_STATE(pw_idx), timeout)) { 296 + if (intel_de_wait_for_set_ms(display, regs->driver, 297 + HSW_PWR_WELL_CTL_STATE(pw_idx), timeout)) { 298 298 drm_dbg_kms(display->drm, "%s power well enable timeout\n", 299 299 intel_power_well_name(power_well)); 300 300 ··· 338 338 */ 339 339 reqs = hsw_power_well_requesters(display, regs, pw_idx); 340 340 341 - ret = intel_de_wait_for_clear(display, regs->driver, 342 - HSW_PWR_WELL_CTL_STATE(pw_idx), 343 - reqs ? 0 : 1); 341 + ret = intel_de_wait_for_clear_ms(display, regs->driver, 342 + HSW_PWR_WELL_CTL_STATE(pw_idx), 343 + reqs ? 0 : 1); 344 344 if (!ret) 345 345 return; 346 346 ··· 359 359 { 360 360 /* Timeout 5us for PG#0, for other PGs 1us */ 361 361 drm_WARN_ON(display->drm, 362 - intel_de_wait_for_set(display, SKL_FUSE_STATUS, 363 - SKL_FUSE_PG_DIST_STATUS(pg), 1)); 362 + intel_de_wait_for_set_ms(display, SKL_FUSE_STATUS, 363 + SKL_FUSE_PG_DIST_STATUS(pg), 1)); 364 364 } 365 365 366 366 static void hsw_power_well_enable(struct intel_display *display, ··· 1358 1358 u32 phy_control = display->power.chv_phy_control; 1359 1359 u32 phy_status = 0; 1360 1360 u32 phy_status_mask = 0xffffffff; 1361 + u32 val; 1361 1362 1362 1363 /* 1363 1364 * The BIOS can leave the PHY is some weird state ··· 1446 1445 * The PHY may be busy with some initial calibration and whatnot, 1447 1446 * so the power state can take a while to actually change. 1448 1447 */ 1449 - if (intel_de_wait(display, DISPLAY_PHY_STATUS, 1450 - phy_status_mask, phy_status, 10)) 1448 + if (intel_de_wait_ms(display, DISPLAY_PHY_STATUS, 1449 + phy_status_mask, phy_status, 10, &val)) 1451 1450 drm_err(display->drm, 1452 1451 "Unexpected PHY_STATUS 0x%08x, expected 0x%08x (PHY_CONTROL=0x%08x)\n", 1453 - intel_de_read(display, DISPLAY_PHY_STATUS) & phy_status_mask, 1454 - phy_status, display->power.chv_phy_control); 1452 + val & phy_status_mask, phy_status, display->power.chv_phy_control); 1455 1453 } 1456 1454 1457 1455 #undef BITS_SET ··· 1476 1476 vlv_set_power_well(display, power_well, true); 1477 1477 1478 1478 /* Poll for phypwrgood signal */ 1479 - if (intel_de_wait_for_set(display, DISPLAY_PHY_STATUS, 1480 - PHY_POWERGOOD(phy), 1)) 1479 + if (intel_de_wait_for_set_ms(display, DISPLAY_PHY_STATUS, 1480 + PHY_POWERGOOD(phy), 1)) 1481 1481 drm_err(display->drm, "Display PHY %d is not power up\n", 1482 1482 phy); 1483 1483 ··· 1867 1867 * bit. 1868 1868 */ 1869 1869 if (DISPLAY_VER(display) >= 35) { 1870 - if (intel_de_wait_for_set(display, XELPDP_DP_AUX_CH_CTL(display, aux_ch), 1871 - XELPDP_DP_AUX_CH_CTL_POWER_STATUS, 2)) 1870 + if (intel_de_wait_for_set_ms(display, XELPDP_DP_AUX_CH_CTL(display, aux_ch), 1871 + XELPDP_DP_AUX_CH_CTL_POWER_STATUS, 2)) 1872 1872 drm_warn(display->drm, 1873 1873 "Timeout waiting for PHY %c AUX channel power to be up\n", 1874 1874 phy_name(phy)); ··· 1888 1888 0); 1889 1889 1890 1890 if (DISPLAY_VER(display) >= 35) { 1891 - if (intel_de_wait_for_clear(display, XELPDP_DP_AUX_CH_CTL(display, aux_ch), 1892 - XELPDP_DP_AUX_CH_CTL_POWER_STATUS, 1)) 1891 + if (intel_de_wait_for_clear_ms(display, XELPDP_DP_AUX_CH_CTL(display, aux_ch), 1892 + XELPDP_DP_AUX_CH_CTL_POWER_STATUS, 1)) 1893 1893 drm_warn(display->drm, 1894 1894 "Timeout waiting for PHY %c AUX channel to powerdown\n", 1895 1895 phy_name(phy)); ··· 1913 1913 intel_de_write(display, XE2LPD_PICA_PW_CTL, 1914 1914 XE2LPD_PICA_CTL_POWER_REQUEST); 1915 1915 1916 - if (intel_de_wait_for_set(display, XE2LPD_PICA_PW_CTL, 1917 - XE2LPD_PICA_CTL_POWER_STATUS, 1)) { 1916 + if (intel_de_wait_for_set_ms(display, XE2LPD_PICA_PW_CTL, 1917 + XE2LPD_PICA_CTL_POWER_STATUS, 1)) { 1918 1918 drm_dbg_kms(display->drm, "pica power well enable timeout\n"); 1919 1919 1920 1920 drm_WARN(display->drm, 1, "Power well PICA timeout when enabled"); ··· 1926 1926 { 1927 1927 intel_de_write(display, XE2LPD_PICA_PW_CTL, 0); 1928 1928 1929 - if (intel_de_wait_for_clear(display, XE2LPD_PICA_PW_CTL, 1930 - XE2LPD_PICA_CTL_POWER_STATUS, 1)) { 1929 + if (intel_de_wait_for_clear_ms(display, XE2LPD_PICA_PW_CTL, 1930 + XE2LPD_PICA_CTL_POWER_STATUS, 1)) { 1931 1931 drm_dbg_kms(display->drm, "pica power well disable timeout\n"); 1932 1932 1933 1933 drm_WARN(display->drm, 1, "Power well PICA timeout when disabled");
+2 -3
drivers/gpu/drm/i915/display/intel_display_types.h
··· 726 726 struct intel_memory_region *mem; 727 727 resource_size_t phys_base; 728 728 struct i915_vma *vma; 729 - unsigned int tiling; 730 729 int size; 731 730 u32 base; 732 731 u8 rotation; ··· 1563 1564 const struct drm_framebuffer *fb, 1564 1565 int color_plane); 1565 1566 unsigned int (*max_stride)(struct intel_plane *plane, 1566 - u32 pixel_format, u64 modifier, 1567 - unsigned int rotation); 1567 + const struct drm_format_info *info, 1568 + u64 modifier, unsigned int rotation); 1568 1569 bool (*can_async_flip)(u64 modifier); 1569 1570 /* Write all non-self arming plane registers */ 1570 1571 void (*update_noarm)(struct intel_dsb *dsb,
+2 -1
drivers/gpu/drm/i915/display/intel_display_wa.c
··· 49 49 */ 50 50 static bool intel_display_needs_wa_16025573575(struct intel_display *display) 51 51 { 52 - return DISPLAY_VERx100(display) == 3000 || DISPLAY_VERx100(display) == 3002; 52 + return DISPLAY_VERx100(display) == 3000 || DISPLAY_VERx100(display) == 3002 || 53 + DISPLAY_VERx100(display) == 3500; 53 54 } 54 55 55 56 /*
+13 -6
drivers/gpu/drm/i915/display/intel_dmc.c
··· 127 127 #define DISPLAY_VER13_DMC_MAX_FW_SIZE 0x20000 128 128 #define DISPLAY_VER12_DMC_MAX_FW_SIZE ICL_DMC_MAX_FW_SIZE 129 129 130 + #define XE3P_LPD_DMC_PATH DMC_PATH(xe3p_lpd) 131 + MODULE_FIRMWARE(XE3P_LPD_DMC_PATH); 132 + 130 133 #define XE3LPD_3002_DMC_PATH DMC_PATH(xe3lpd_3002) 131 134 MODULE_FIRMWARE(XE3LPD_3002_DMC_PATH); 132 135 ··· 189 186 { 190 187 const char *fw_path = NULL; 191 188 u32 max_fw_size = 0; 192 - if (DISPLAY_VERx100(display) == 3002) { 189 + 190 + if (DISPLAY_VERx100(display) == 3500) { 191 + fw_path = XE3P_LPD_DMC_PATH; 192 + max_fw_size = XE2LPD_DMC_MAX_FW_SIZE; 193 + } else if (DISPLAY_VERx100(display) == 3002) { 193 194 fw_path = XE3LPD_3002_DMC_PATH; 194 195 max_fw_size = XE2LPD_DMC_MAX_FW_SIZE; 195 196 } else if (DISPLAY_VERx100(display) == 3000) { ··· 718 711 static bool need_pipedmc_load_mmio(struct intel_display *display, enum pipe pipe) 719 712 { 720 713 /* 721 - * PTL: 714 + * Xe3_LPD/Xe3p_LPD: 722 715 * - pipe A/B DMC doesn't need save/restore 723 716 * - pipe C/D DMC is in PG0, needs manual save/restore 724 717 */ 725 - if (DISPLAY_VER(display) == 30) 718 + if (IS_DISPLAY_VER(display, 30, 35)) 726 719 return pipe >= PIPE_C; 727 720 728 721 /* ··· 1719 1712 drm_err_ratelimited(display->drm, "[CRTC:%d:%s] PIPEDMC GTT fault\n", 1720 1713 crtc->base.base.id, crtc->base.name); 1721 1714 if (tmp & PIPEDMC_ERROR) 1722 - drm_err(display->drm, "[CRTC:%d:%s]] PIPEDMC error\n", 1715 + drm_err(display->drm, "[CRTC:%d:%s] PIPEDMC error\n", 1723 1716 crtc->base.base.id, crtc->base.name); 1724 1717 } 1725 1718 1726 1719 int_vector = intel_de_read(display, PIPEDMC_STATUS(pipe)) & PIPEDMC_INT_VECTOR_MASK; 1727 1720 if (tmp == 0 && int_vector != 0) 1728 - drm_err(display->drm, "[CRTC:%d:%s]] PIPEDMC interrupt vector 0x%x\n", 1729 - crtc->base.base.id, crtc->base.name, tmp); 1721 + drm_err(display->drm, "[CRTC:%d:%s] PIPEDMC interrupt vector 0x%x\n", 1722 + crtc->base.base.id, crtc->base.name, int_vector); 1730 1723 } 1731 1724 1732 1725 void intel_pipedmc_enable_event(struct intel_crtc *crtc,
+12 -13
drivers/gpu/drm/i915/display/intel_dmc_wl.c
··· 179 179 if (refcount_read(&wl->refcount)) 180 180 goto out_unlock; 181 181 182 - __intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0); 182 + intel_de_rmw_fw(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0); 183 183 184 - if (__intel_de_wait_for_register_atomic_nowl(display, DMC_WAKELOCK1_CTL, 185 - DMC_WAKELOCK_CTL_ACK, 0, 186 - DMC_WAKELOCK_CTL_TIMEOUT_US)) { 184 + if (intel_de_wait_fw_us_atomic(display, DMC_WAKELOCK1_CTL, 185 + DMC_WAKELOCK_CTL_ACK, 0, 186 + DMC_WAKELOCK_CTL_TIMEOUT_US, NULL)) { 187 187 WARN_RATELIMIT(1, "DMC wakelock release timed out"); 188 188 goto out_unlock; 189 189 } ··· 207 207 if (wl->taken) 208 208 return; 209 209 210 - __intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, 0, 211 - DMC_WAKELOCK_CTL_REQ); 210 + intel_de_rmw_fw(display, DMC_WAKELOCK1_CTL, 0, DMC_WAKELOCK_CTL_REQ); 212 211 213 212 /* 214 213 * We need to use the atomic variant of the waiting routine 215 214 * because the DMC wakelock is also taken in atomic context. 216 215 */ 217 - if (__intel_de_wait_for_register_atomic_nowl(display, DMC_WAKELOCK1_CTL, 218 - DMC_WAKELOCK_CTL_ACK, 219 - DMC_WAKELOCK_CTL_ACK, 220 - DMC_WAKELOCK_CTL_TIMEOUT_US)) { 216 + if (intel_de_wait_fw_us_atomic(display, DMC_WAKELOCK1_CTL, 217 + DMC_WAKELOCK_CTL_ACK, 218 + DMC_WAKELOCK_CTL_ACK, 219 + DMC_WAKELOCK_CTL_TIMEOUT_US, NULL)) { 221 220 WARN_RATELIMIT(1, "DMC wakelock ack timed out"); 222 221 return; 223 222 } ··· 359 360 * wakelock, because we're just enabling it, so call the 360 361 * non-locking version directly here. 361 362 */ 362 - __intel_de_rmw_nowl(display, DMC_WAKELOCK_CFG, 0, DMC_WAKELOCK_CFG_ENABLE); 363 + intel_de_rmw_fw(display, DMC_WAKELOCK_CFG, 0, DMC_WAKELOCK_CFG_ENABLE); 363 364 364 365 wl->enabled = true; 365 366 ··· 401 402 goto out_unlock; 402 403 403 404 /* Disable wakelock in DMC */ 404 - __intel_de_rmw_nowl(display, DMC_WAKELOCK_CFG, DMC_WAKELOCK_CFG_ENABLE, 0); 405 + intel_de_rmw_fw(display, DMC_WAKELOCK_CFG, DMC_WAKELOCK_CFG_ENABLE, 0); 405 406 406 407 wl->enabled = false; 407 408 ··· 413 414 * 414 415 * TODO: Get the correct expectation from the hardware team. 415 416 */ 416 - __intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0); 417 + intel_de_rmw_fw(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0); 417 418 418 419 wl->taken = false; 419 420
+3 -3
drivers/gpu/drm/i915/display/intel_dp_aux.c
··· 62 62 u32 status; 63 63 int ret; 64 64 65 - ret = intel_de_wait_custom(display, ch_ctl, DP_AUX_CH_CTL_SEND_BUSY, 66 - 0, 67 - 2, timeout_ms, &status); 65 + ret = intel_de_wait_ms(display, ch_ctl, 66 + DP_AUX_CH_CTL_SEND_BUSY, 0, 67 + timeout_ms, &status); 68 68 69 69 if (ret == -ETIMEDOUT) 70 70 drm_err(display->drm,
+7 -7
drivers/gpu/drm/i915/display/intel_dp_hdcp.c
··· 782 782 return -EINVAL; 783 783 784 784 /* Wait for encryption confirmation */ 785 - if (intel_de_wait(display, HDCP_STATUS(display, cpu_transcoder, port), 786 - stream_enc_status, enable ? stream_enc_status : 0, 787 - HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 785 + if (intel_de_wait_ms(display, HDCP_STATUS(display, cpu_transcoder, port), 786 + stream_enc_status, enable ? stream_enc_status : 0, 787 + HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS, NULL)) { 788 788 drm_err(display->drm, "Timed out waiting for transcoder: %s stream encryption %s\n", 789 789 transcoder_name(cpu_transcoder), str_enabled_disabled(enable)); 790 790 return -ETIMEDOUT; ··· 821 821 return ret; 822 822 823 823 /* Wait for encryption confirmation */ 824 - if (intel_de_wait(display, HDCP2_STREAM_STATUS(display, cpu_transcoder, pipe), 825 - STREAM_ENCRYPTION_STATUS, 826 - enable ? STREAM_ENCRYPTION_STATUS : 0, 827 - HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 824 + if (intel_de_wait_ms(display, HDCP2_STREAM_STATUS(display, cpu_transcoder, pipe), 825 + STREAM_ENCRYPTION_STATUS, 826 + enable ? STREAM_ENCRYPTION_STATUS : 0, 827 + HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS, NULL)) { 828 828 drm_err(display->drm, "Timed out waiting for transcoder: %s stream encryption %s\n", 829 829 transcoder_name(cpu_transcoder), str_enabled_disabled(enable)); 830 830 return -ETIMEDOUT;
+5 -5
drivers/gpu/drm/i915/display/intel_dpio_phy.c
··· 390 390 static void bxt_phy_wait_grc_done(struct intel_display *display, 391 391 enum dpio_phy phy) 392 392 { 393 - if (intel_de_wait_for_set(display, BXT_PORT_REF_DW3(phy), GRC_DONE, 10)) 393 + if (intel_de_wait_for_set_ms(display, BXT_PORT_REF_DW3(phy), GRC_DONE, 10)) 394 394 drm_err(display->drm, "timeout waiting for PHY%d GRC\n", phy); 395 395 } 396 396 ··· 427 427 * The flag should get set in 100us according to the HW team, but 428 428 * use 1ms due to occasional timeouts observed with that. 429 429 */ 430 - if (intel_de_wait_fw(display, BXT_PORT_CL1CM_DW0(phy), 430 + if (intel_de_wait_ms(display, BXT_PORT_CL1CM_DW0(phy), 431 431 PHY_RESERVED | PHY_POWER_GOOD, PHY_POWER_GOOD, 1, NULL)) 432 432 drm_err(display->drm, "timeout during PHY%d power on\n", 433 433 phy); ··· 1173 1173 struct intel_display *display = to_intel_display(encoder); 1174 1174 u32 port_mask; 1175 1175 i915_reg_t dpll_reg; 1176 + u32 val; 1176 1177 1177 1178 switch (encoder->port) { 1178 1179 default: ··· 1194 1193 break; 1195 1194 } 1196 1195 1197 - if (intel_de_wait(display, dpll_reg, port_mask, expected_mask, 1000)) 1196 + if (intel_de_wait_ms(display, dpll_reg, port_mask, expected_mask, 1000, &val)) 1198 1197 drm_WARN(display->drm, 1, 1199 1198 "timed out waiting for [ENCODER:%d:%s] port ready: got 0x%x, expected 0x%x\n", 1200 1199 encoder->base.base.id, encoder->base.name, 1201 - intel_de_read(display, dpll_reg) & port_mask, 1202 - expected_mask); 1200 + val & port_mask, expected_mask); 1203 1201 }
+2 -2
drivers/gpu/drm/i915/display/intel_dpll.c
··· 2019 2019 intel_de_posting_read(display, DPLL(display, pipe)); 2020 2020 udelay(150); 2021 2021 2022 - if (intel_de_wait_for_set(display, DPLL(display, pipe), DPLL_LOCK_VLV, 1)) 2022 + if (intel_de_wait_for_set_ms(display, DPLL(display, pipe), DPLL_LOCK_VLV, 1)) 2023 2023 drm_err(display->drm, "DPLL %d failed to lock\n", pipe); 2024 2024 } 2025 2025 ··· 2165 2165 intel_de_write(display, DPLL(display, pipe), hw_state->dpll); 2166 2166 2167 2167 /* Check PLL is locked */ 2168 - if (intel_de_wait_for_set(display, DPLL(display, pipe), DPLL_LOCK_VLV, 1)) 2168 + if (intel_de_wait_for_set_ms(display, DPLL(display, pipe), DPLL_LOCK_VLV, 1)) 2169 2169 drm_err(display->drm, "PLL %d failed to lock\n", pipe); 2170 2170 } 2171 2171
+13 -14
drivers/gpu/drm/i915/display/intel_dpll_mgr.c
··· 1395 1395 /* the enable bit is always bit 31 */ 1396 1396 intel_de_rmw(display, regs[id].ctl, 0, LCPLL_PLL_ENABLE); 1397 1397 1398 - if (intel_de_wait_for_set(display, DPLL_STATUS, DPLL_LOCK(id), 5)) 1398 + if (intel_de_wait_for_set_ms(display, DPLL_STATUS, DPLL_LOCK(id), 5)) 1399 1399 drm_err(display->drm, "DPLL %d not locked\n", id); 1400 1400 } 1401 1401 ··· 2057 2057 intel_de_rmw(display, BXT_PORT_PLL_ENABLE(port), 2058 2058 0, PORT_PLL_POWER_ENABLE); 2059 2059 2060 - ret = intel_de_wait_custom(display, BXT_PORT_PLL_ENABLE(port), 2061 - PORT_PLL_POWER_STATE, PORT_PLL_POWER_STATE, 2062 - 200, 0, NULL); 2060 + ret = intel_de_wait_for_set_us(display, 2061 + BXT_PORT_PLL_ENABLE(port), 2062 + PORT_PLL_POWER_STATE, 200); 2063 2063 if (ret) 2064 2064 drm_err(display->drm, 2065 2065 "Power state not set for PLL:%d\n", port); ··· 2122 2122 intel_de_rmw(display, BXT_PORT_PLL_ENABLE(port), 0, PORT_PLL_ENABLE); 2123 2123 intel_de_posting_read(display, BXT_PORT_PLL_ENABLE(port)); 2124 2124 2125 - ret = intel_de_wait_custom(display, BXT_PORT_PLL_ENABLE(port), 2126 - PORT_PLL_LOCK, PORT_PLL_LOCK, 2127 - 200, 0, NULL); 2125 + ret = intel_de_wait_for_set_us(display, BXT_PORT_PLL_ENABLE(port), 2126 + PORT_PLL_LOCK, 200); 2128 2127 if (ret) 2129 2128 drm_err(display->drm, "PLL %d not locked\n", port); 2130 2129 ··· 2157 2158 intel_de_rmw(display, BXT_PORT_PLL_ENABLE(port), 2158 2159 PORT_PLL_POWER_ENABLE, 0); 2159 2160 2160 - ret = intel_de_wait_custom(display, BXT_PORT_PLL_ENABLE(port), 2161 - PORT_PLL_POWER_STATE, 0, 2162 - 200, 0, NULL); 2161 + ret = intel_de_wait_for_clear_us(display, 2162 + BXT_PORT_PLL_ENABLE(port), 2163 + PORT_PLL_POWER_STATE, 200); 2163 2164 if (ret) 2164 2165 drm_err(display->drm, 2165 2166 "Power state not reset for PLL:%d\n", port); ··· 3920 3921 * The spec says we need to "wait" but it also says it should be 3921 3922 * immediate. 3922 3923 */ 3923 - if (intel_de_wait_for_set(display, enable_reg, PLL_POWER_STATE, 1)) 3924 + if (intel_de_wait_for_set_ms(display, enable_reg, PLL_POWER_STATE, 1)) 3924 3925 drm_err(display->drm, "PLL %d Power not enabled\n", 3925 3926 pll->info->id); 3926 3927 } ··· 3932 3933 intel_de_rmw(display, enable_reg, 0, PLL_ENABLE); 3933 3934 3934 3935 /* Timeout is actually 600us. */ 3935 - if (intel_de_wait_for_set(display, enable_reg, PLL_LOCK, 1)) 3936 + if (intel_de_wait_for_set_ms(display, enable_reg, PLL_LOCK, 1)) 3936 3937 drm_err(display->drm, "PLL %d not locked\n", pll->info->id); 3937 3938 } 3938 3939 ··· 4045 4046 intel_de_rmw(display, enable_reg, PLL_ENABLE, 0); 4046 4047 4047 4048 /* Timeout is actually 1us. */ 4048 - if (intel_de_wait_for_clear(display, enable_reg, PLL_LOCK, 1)) 4049 + if (intel_de_wait_for_clear_ms(display, enable_reg, PLL_LOCK, 1)) 4049 4050 drm_err(display->drm, "PLL %d locked\n", pll->info->id); 4050 4051 4051 4052 /* DVFS post sequence would be here. See the comment above. */ ··· 4056 4057 * The spec says we need to "wait" but it also says it should be 4057 4058 * immediate. 4058 4059 */ 4059 - if (intel_de_wait_for_clear(display, enable_reg, PLL_POWER_STATE, 1)) 4060 + if (intel_de_wait_for_clear_ms(display, enable_reg, PLL_POWER_STATE, 1)) 4060 4061 drm_err(display->drm, "PLL %d Power not disabled\n", 4061 4062 pll->info->id); 4062 4063 }
+3
drivers/gpu/drm/i915/display/intel_dsi_vbt.c
··· 171 171 case MIPI_DSI_DCS_LONG_WRITE: 172 172 ret = mipi_dsi_dcs_write_buffer(dsi_device, data, len); 173 173 break; 174 + default: 175 + ret = -EINVAL; 176 + break; 174 177 } 175 178 176 179 if (ret < 0)
+14 -10
drivers/gpu/drm/i915/display/intel_fb.c
··· 1326 1326 * unclear in Bspec, for now no checking. 1327 1327 */ 1328 1328 stride = intel_fb_pitch(fb, 0, rotation); 1329 - max_stride = plane->max_stride(plane, fb->base.format->format, 1329 + max_stride = plane->max_stride(plane, fb->base.format, 1330 1330 fb->base.modifier, rotation); 1331 1331 1332 1332 return stride > max_stride; ··· 1972 1972 1973 1973 static 1974 1974 u32 intel_fb_max_stride(struct intel_display *display, 1975 - u32 pixel_format, u64 modifier) 1975 + const struct drm_format_info *info, 1976 + u64 modifier) 1976 1977 { 1977 1978 /* 1978 1979 * Arbitrary limit for gen4+ chosen to match the ··· 1983 1982 */ 1984 1983 if (DISPLAY_VER(display) < 4 || intel_fb_is_ccs_modifier(modifier) || 1985 1984 intel_fb_modifier_uses_dpt(display, modifier)) 1986 - return intel_plane_fb_max_stride(display->drm, pixel_format, modifier); 1985 + return intel_plane_fb_max_stride(display, info, modifier); 1987 1986 else if (DISPLAY_VER(display) >= 7) 1988 1987 return 256 * 1024; 1989 1988 else ··· 1997 1996 unsigned int tile_width; 1998 1997 1999 1998 if (is_surface_linear(fb, color_plane)) { 2000 - unsigned int max_stride = intel_plane_fb_max_stride(display->drm, 2001 - fb->format->format, 1999 + unsigned int max_stride = intel_plane_fb_max_stride(display, 2000 + fb->format, 2002 2001 fb->modifier); 2003 2002 2004 2003 /* ··· 2056 2055 2057 2056 /* FIXME other color planes? */ 2058 2057 stride = plane_state->view.color_plane[0].mapping_stride; 2059 - max_stride = plane->max_stride(plane, fb->format->format, 2058 + max_stride = plane->max_stride(plane, fb->format, 2060 2059 fb->modifier, rotation); 2061 2060 2062 2061 if (stride > max_stride) { ··· 2195 2194 return ret; 2196 2195 2197 2196 flush: 2198 - intel_bo_flush_if_display(obj); 2199 2197 intel_frontbuffer_flush(front, ORIGIN_DIRTYFB); 2200 2198 return ret; 2201 2199 } ··· 2234 2234 if (ret) 2235 2235 goto err_frontbuffer_put; 2236 2236 2237 - ret = -EINVAL; 2238 2237 if (!drm_any_plane_has_format(display->drm, 2239 2238 mode_cmd->pixel_format, 2240 2239 mode_cmd->modifier[0])) { 2241 2240 drm_dbg_kms(display->drm, 2242 2241 "unsupported pixel format %p4cc / modifier 0x%llx\n", 2243 2242 &mode_cmd->pixel_format, mode_cmd->modifier[0]); 2243 + ret = -EINVAL; 2244 2244 goto err_bo_framebuffer_fini; 2245 2245 } 2246 2246 2247 - max_stride = intel_fb_max_stride(display, mode_cmd->pixel_format, 2248 - mode_cmd->modifier[0]); 2247 + max_stride = intel_fb_max_stride(display, info, mode_cmd->modifier[0]); 2249 2248 if (mode_cmd->pitches[0] > max_stride) { 2250 2249 drm_dbg_kms(display->drm, 2251 2250 "%s pitch (%u) must be at most %d\n", 2252 2251 mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR ? 2253 2252 "tiled" : "linear", 2254 2253 mode_cmd->pitches[0], max_stride); 2254 + ret = -EINVAL; 2255 2255 goto err_bo_framebuffer_fini; 2256 2256 } 2257 2257 ··· 2260 2260 drm_dbg_kms(display->drm, 2261 2261 "plane 0 offset (0x%08x) must be 0\n", 2262 2262 mode_cmd->offsets[0]); 2263 + ret = -EINVAL; 2263 2264 goto err_bo_framebuffer_fini; 2264 2265 } 2265 2266 ··· 2271 2270 2272 2271 if (mode_cmd->handles[i] != mode_cmd->handles[0]) { 2273 2272 drm_dbg_kms(display->drm, "bad plane %d handle\n", i); 2273 + ret = -EINVAL; 2274 2274 goto err_bo_framebuffer_fini; 2275 2275 } 2276 2276 ··· 2280 2278 drm_dbg_kms(display->drm, 2281 2279 "plane %d pitch (%d) must be at least %u byte aligned\n", 2282 2280 i, fb->pitches[i], stride_alignment); 2281 + ret = -EINVAL; 2283 2282 goto err_bo_framebuffer_fini; 2284 2283 } 2285 2284 ··· 2291 2288 drm_dbg_kms(display->drm, 2292 2289 "ccs aux plane %d pitch (%d) must be %d\n", 2293 2290 i, fb->pitches[i], ccs_aux_stride); 2291 + ret = -EINVAL; 2294 2292 goto err_bo_framebuffer_fini; 2295 2293 } 2296 2294 }
+2 -2
drivers/gpu/drm/i915/display/intel_fbc.c
··· 328 328 intel_de_write(display, FBC_CONTROL, fbc_ctl); 329 329 330 330 /* Wait for compressing bit to clear */ 331 - if (intel_de_wait_for_clear(display, FBC_STATUS, 332 - FBC_STAT_COMPRESSING, 10)) { 331 + if (intel_de_wait_for_clear_ms(display, FBC_STATUS, 332 + FBC_STAT_COMPRESSING, 10)) { 333 333 drm_dbg_kms(display->drm, "FBC idle timed out\n"); 334 334 return; 335 335 }
+4 -4
drivers/gpu/drm/i915/display/intel_flipq.c
··· 163 163 PIPEDMC_FQ_CTRL_PREEMPT, preempt ? PIPEDMC_FQ_CTRL_PREEMPT : 0); 164 164 165 165 if (preempt && 166 - intel_de_wait_for_clear(display, 167 - PIPEDMC_FQ_STATUS(crtc->pipe), 168 - PIPEDMC_FQ_STATUS_BUSY, 169 - intel_flipq_preempt_timeout_ms(display))) 166 + intel_de_wait_for_clear_ms(display, 167 + PIPEDMC_FQ_STATUS(crtc->pipe), 168 + PIPEDMC_FQ_STATUS_BUSY, 169 + intel_flipq_preempt_timeout_ms(display))) 170 170 drm_err(display->drm, "[CRTC:%d:%s] flip queue preempt timeout\n", 171 171 crtc->base.base.id, crtc->base.name); 172 172 }
+24 -131
drivers/gpu/drm/i915/display/intel_frontbuffer.c
··· 58 58 #include <drm/drm_gem.h> 59 59 #include <drm/drm_print.h> 60 60 61 - #include "i915_active.h" 62 - #include "i915_vma.h" 63 61 #include "intel_bo.h" 64 62 #include "intel_display_trace.h" 65 63 #include "intel_display_types.h" ··· 102 104 } 103 105 104 106 /** 105 - * intel_frontbuffer_flip_prepare - prepare asynchronous frontbuffer flip 106 - * @display: display device 107 - * @frontbuffer_bits: frontbuffer plane tracking bits 108 - * 109 - * This function gets called after scheduling a flip on @obj. The actual 110 - * frontbuffer flushing will be delayed until completion is signalled with 111 - * intel_frontbuffer_flip_complete. If an invalidate happens in between this 112 - * flush will be cancelled. 113 - * 114 - * Can be called without any locks held. 115 - */ 116 - void intel_frontbuffer_flip_prepare(struct intel_display *display, 117 - unsigned frontbuffer_bits) 118 - { 119 - spin_lock(&display->fb_tracking.lock); 120 - display->fb_tracking.flip_bits |= frontbuffer_bits; 121 - /* Remove stale busy bits due to the old buffer. */ 122 - display->fb_tracking.busy_bits &= ~frontbuffer_bits; 123 - spin_unlock(&display->fb_tracking.lock); 124 - } 125 - 126 - /** 127 - * intel_frontbuffer_flip_complete - complete asynchronous frontbuffer flip 128 - * @display: display device 129 - * @frontbuffer_bits: frontbuffer plane tracking bits 130 - * 131 - * This function gets called after the flip has been latched and will complete 132 - * on the next vblank. It will execute the flush if it hasn't been cancelled yet. 133 - * 134 - * Can be called without any locks held. 135 - */ 136 - void intel_frontbuffer_flip_complete(struct intel_display *display, 137 - unsigned frontbuffer_bits) 138 - { 139 - spin_lock(&display->fb_tracking.lock); 140 - /* Mask any cancelled flips. */ 141 - frontbuffer_bits &= display->fb_tracking.flip_bits; 142 - display->fb_tracking.flip_bits &= ~frontbuffer_bits; 143 - spin_unlock(&display->fb_tracking.lock); 144 - 145 - if (frontbuffer_bits) 146 - frontbuffer_flush(display, frontbuffer_bits, ORIGIN_FLIP); 147 - } 148 - 149 - /** 150 107 * intel_frontbuffer_flip - synchronous frontbuffer flip 151 108 * @display: display device 152 109 * @frontbuffer_bits: frontbuffer plane tracking bits ··· 127 174 enum fb_op_origin origin, 128 175 unsigned int frontbuffer_bits) 129 176 { 130 - struct intel_display *display = to_intel_display(front->obj->dev); 177 + struct intel_display *display = front->display; 131 178 132 179 if (origin == ORIGIN_CS) { 133 180 spin_lock(&display->fb_tracking.lock); 134 181 display->fb_tracking.busy_bits |= frontbuffer_bits; 135 - display->fb_tracking.flip_bits &= ~frontbuffer_bits; 136 182 spin_unlock(&display->fb_tracking.lock); 137 183 } 138 184 ··· 147 195 enum fb_op_origin origin, 148 196 unsigned int frontbuffer_bits) 149 197 { 150 - struct intel_display *display = to_intel_display(front->obj->dev); 198 + struct intel_display *display = front->display; 199 + 200 + if (origin == ORIGIN_DIRTYFB) 201 + intel_bo_frontbuffer_flush_for_display(front); 151 202 152 203 if (origin == ORIGIN_CS) { 153 204 spin_lock(&display->fb_tracking.lock); ··· 164 209 frontbuffer_flush(display, frontbuffer_bits, origin); 165 210 } 166 211 212 + static void intel_frontbuffer_ref(struct intel_frontbuffer *front) 213 + { 214 + intel_bo_frontbuffer_ref(front); 215 + } 216 + 167 217 static void intel_frontbuffer_flush_work(struct work_struct *work) 168 218 { 169 219 struct intel_frontbuffer *front = 170 220 container_of(work, struct intel_frontbuffer, flush_work); 171 221 172 - intel_bo_flush_if_display(front->obj); 173 222 intel_frontbuffer_flush(front, ORIGIN_DIRTYFB); 174 223 intel_frontbuffer_put(front); 175 224 } ··· 190 231 if (!front) 191 232 return; 192 233 193 - kref_get(&front->ref); 234 + intel_frontbuffer_ref(front); 194 235 if (!schedule_work(&front->flush_work)) 195 236 intel_frontbuffer_put(front); 196 237 } 197 238 198 - static int frontbuffer_active(struct i915_active *ref) 239 + void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm) 199 240 { 200 - struct intel_frontbuffer *front = 201 - container_of(ref, typeof(*front), write); 202 - 203 - kref_get(&front->ref); 204 - return 0; 205 - } 206 - 207 - static void frontbuffer_retire(struct i915_active *ref) 208 - { 209 - struct intel_frontbuffer *front = 210 - container_of(ref, typeof(*front), write); 211 - 212 - intel_frontbuffer_flush(front, ORIGIN_CS); 213 - intel_frontbuffer_put(front); 214 - } 215 - 216 - static void frontbuffer_release(struct kref *ref) 217 - __releases(&to_intel_display(front->obj->dev)->fb_tracking.lock) 218 - { 219 - struct intel_frontbuffer *ret, *front = 220 - container_of(ref, typeof(*front), ref); 221 - struct drm_gem_object *obj = front->obj; 222 - struct intel_display *display = to_intel_display(obj->dev); 223 - 224 - drm_WARN_ON(display->drm, atomic_read(&front->bits)); 225 - 226 - i915_ggtt_clear_scanout(to_intel_bo(obj)); 227 - 228 - ret = intel_bo_set_frontbuffer(obj, NULL); 229 - drm_WARN_ON(display->drm, ret); 230 - spin_unlock(&display->fb_tracking.lock); 231 - 232 - i915_active_fini(&front->write); 233 - 234 - drm_gem_object_put(obj); 235 - kfree_rcu(front, rcu); 236 - } 237 - 238 - struct intel_frontbuffer * 239 - intel_frontbuffer_get(struct drm_gem_object *obj) 240 - { 241 - struct intel_display *display = to_intel_display(obj->dev); 242 - struct intel_frontbuffer *front, *cur; 243 - 244 - front = intel_bo_get_frontbuffer(obj); 245 - if (front) 246 - return front; 247 - 248 - front = kmalloc(sizeof(*front), GFP_KERNEL); 249 - if (!front) 250 - return NULL; 251 - 252 - drm_gem_object_get(obj); 253 - 254 - front->obj = obj; 255 - kref_init(&front->ref); 241 + front->display = to_intel_display(drm); 256 242 atomic_set(&front->bits, 0); 257 - i915_active_init(&front->write, 258 - frontbuffer_active, 259 - frontbuffer_retire, 260 - I915_ACTIVE_RETIRE_SLEEPS); 261 243 INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work); 244 + } 262 245 263 - spin_lock(&display->fb_tracking.lock); 264 - cur = intel_bo_set_frontbuffer(obj, front); 265 - spin_unlock(&display->fb_tracking.lock); 246 + void intel_frontbuffer_fini(struct intel_frontbuffer *front) 247 + { 248 + drm_WARN_ON(front->display->drm, atomic_read(&front->bits)); 249 + } 266 250 267 - if (cur != front) { 268 - drm_gem_object_put(obj); 269 - kfree(front); 270 - } 271 - 272 - return cur; 251 + struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj) 252 + { 253 + return intel_bo_frontbuffer_get(obj); 273 254 } 274 255 275 256 void intel_frontbuffer_put(struct intel_frontbuffer *front) 276 257 { 277 - kref_put_lock(&front->ref, 278 - frontbuffer_release, 279 - &to_intel_display(front->obj->dev)->fb_tracking.lock); 258 + intel_bo_frontbuffer_put(front); 280 259 } 281 260 282 261 /** ··· 243 346 BUILD_BUG_ON(I915_MAX_PLANES > INTEL_FRONTBUFFER_BITS_PER_PIPE); 244 347 245 348 if (old) { 246 - struct intel_display *display = to_intel_display(old->obj->dev); 247 - 248 - drm_WARN_ON(display->drm, 349 + drm_WARN_ON(old->display->drm, 249 350 !(atomic_read(&old->bits) & frontbuffer_bits)); 250 351 atomic_andnot(frontbuffer_bits, &old->bits); 251 352 } 252 353 253 354 if (new) { 254 - struct intel_display *display = to_intel_display(new->obj->dev); 255 - 256 - drm_WARN_ON(display->drm, 355 + drm_WARN_ON(new->display->drm, 257 356 atomic_read(&new->bits) & frontbuffer_bits); 258 357 atomic_or(frontbuffer_bits, &new->bits); 259 358 }
+6 -12
drivers/gpu/drm/i915/display/intel_frontbuffer.h
··· 26 26 27 27 #include <linux/atomic.h> 28 28 #include <linux/bits.h> 29 - #include <linux/kref.h> 29 + #include <linux/workqueue_types.h> 30 30 31 - #include "i915_active_types.h" 32 - 31 + struct drm_device; 33 32 struct drm_gem_object; 34 33 struct intel_display; 35 34 ··· 41 42 }; 42 43 43 44 struct intel_frontbuffer { 44 - struct kref ref; 45 + struct intel_display *display; 45 46 atomic_t bits; 46 - struct i915_active write; 47 - struct drm_gem_object *obj; 48 - struct rcu_head rcu; 49 - 50 47 struct work_struct flush_work; 51 48 }; 52 49 ··· 63 68 GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1, \ 64 69 INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe)) 65 70 66 - void intel_frontbuffer_flip_prepare(struct intel_display *display, 67 - unsigned frontbuffer_bits); 68 - void intel_frontbuffer_flip_complete(struct intel_display *display, 69 - unsigned frontbuffer_bits); 70 71 void intel_frontbuffer_flip(struct intel_display *display, 71 72 unsigned frontbuffer_bits); 72 73 ··· 134 143 void intel_frontbuffer_track(struct intel_frontbuffer *old, 135 144 struct intel_frontbuffer *new, 136 145 unsigned int frontbuffer_bits); 146 + 147 + void intel_frontbuffer_init(struct intel_frontbuffer *front, struct drm_device *drm); 148 + void intel_frontbuffer_fini(struct intel_frontbuffer *front); 137 149 138 150 #endif /* __INTEL_FRONTBUFFER_H__ */
+1 -1
drivers/gpu/drm/i915/display/intel_gmbus.c
··· 449 449 add_wait_queue(&display->gmbus.wait_queue, &wait); 450 450 intel_de_write_fw(display, GMBUS4(display), irq_enable); 451 451 452 - ret = intel_de_wait_fw(display, GMBUS2(display), GMBUS_ACTIVE, 0, 10, NULL); 452 + ret = intel_de_wait_fw_ms(display, GMBUS2(display), GMBUS_ACTIVE, 0, 10, NULL); 453 453 454 454 intel_de_write_fw(display, GMBUS4(display), 0); 455 455 remove_wait_queue(&display->gmbus.wait_queue, &wait);
+23 -26
drivers/gpu/drm/i915/display/intel_hdcp.c
··· 410 410 } 411 411 412 412 /* Wait for the keys to load (500us) */ 413 - ret = intel_de_wait_custom(display, HDCP_KEY_STATUS, 414 - HDCP_KEY_LOAD_DONE, HDCP_KEY_LOAD_DONE, 415 - 10, 1, &val); 413 + ret = intel_de_wait_ms(display, HDCP_KEY_STATUS, HDCP_KEY_LOAD_DONE, 414 + HDCP_KEY_LOAD_DONE, 1, &val); 416 415 if (ret) 417 416 return ret; 418 417 else if (!(val & HDCP_KEY_LOAD_STATUS)) ··· 427 428 static int intel_write_sha_text(struct intel_display *display, u32 sha_text) 428 429 { 429 430 intel_de_write(display, HDCP_SHA_TEXT, sha_text); 430 - if (intel_de_wait_for_set(display, HDCP_REP_CTL, HDCP_SHA1_READY, 1)) { 431 + if (intel_de_wait_for_set_ms(display, HDCP_REP_CTL, HDCP_SHA1_READY, 1)) { 431 432 drm_err(display->drm, "Timed out waiting for SHA1 ready\n"); 432 433 return -ETIMEDOUT; 433 434 } ··· 706 707 /* Tell the HW we're done with the hash and wait for it to ACK */ 707 708 intel_de_write(display, HDCP_REP_CTL, 708 709 rep_ctl | HDCP_SHA1_COMPLETE_HASH); 709 - if (intel_de_wait_for_set(display, HDCP_REP_CTL, 710 - HDCP_SHA1_COMPLETE, 1)) { 710 + if (intel_de_wait_for_set_ms(display, HDCP_REP_CTL, 711 + HDCP_SHA1_COMPLETE, 1)) { 711 712 drm_err(display->drm, "Timed out waiting for SHA1 complete\n"); 712 713 return -ETIMEDOUT; 713 714 } ··· 855 856 HDCP_CONF_CAPTURE_AN); 856 857 857 858 /* Wait for An to be acquired */ 858 - if (intel_de_wait_for_set(display, 859 - HDCP_STATUS(display, cpu_transcoder, port), 860 - HDCP_STATUS_AN_READY, 1)) { 859 + if (intel_de_wait_for_set_ms(display, 860 + HDCP_STATUS(display, cpu_transcoder, port), 861 + HDCP_STATUS_AN_READY, 1)) { 861 862 drm_err(display->drm, "Timed out waiting for An\n"); 862 863 return -ETIMEDOUT; 863 864 } ··· 952 953 } 953 954 954 955 /* Wait for encryption confirmation */ 955 - if (intel_de_wait_for_set(display, 956 - HDCP_STATUS(display, cpu_transcoder, port), 957 - HDCP_STATUS_ENC, 958 - HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 956 + if (intel_de_wait_for_set_ms(display, 957 + HDCP_STATUS(display, cpu_transcoder, port), 958 + HDCP_STATUS_ENC, 959 + HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 959 960 drm_err(display->drm, "Timed out waiting for encryption\n"); 960 961 return -ETIMEDOUT; 961 962 } ··· 1012 1013 1013 1014 hdcp->hdcp_encrypted = false; 1014 1015 intel_de_write(display, HDCP_CONF(display, cpu_transcoder, port), 0); 1015 - if (intel_de_wait_for_clear(display, 1016 - HDCP_STATUS(display, cpu_transcoder, port), 1017 - ~0, HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 1016 + if (intel_de_wait_for_clear_ms(display, 1017 + HDCP_STATUS(display, cpu_transcoder, port), 1018 + ~0, HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) { 1018 1019 drm_err(display->drm, 1019 1020 "Failed to disable HDCP, timeout clearing status\n"); 1020 1021 return -ETIMEDOUT; ··· 1939 1940 intel_de_rmw(display, HDCP2_CTL(display, cpu_transcoder, port), 1940 1941 0, CTL_LINK_ENCRYPTION_REQ); 1941 1942 1942 - ret = intel_de_wait_for_set(display, 1943 - HDCP2_STATUS(display, cpu_transcoder, 1944 - port), 1945 - LINK_ENCRYPTION_STATUS, 1946 - HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS); 1943 + ret = intel_de_wait_for_set_ms(display, 1944 + HDCP2_STATUS(display, cpu_transcoder, port), 1945 + LINK_ENCRYPTION_STATUS, 1946 + HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS); 1947 1947 dig_port->hdcp.auth_status = true; 1948 1948 1949 1949 return ret; ··· 1964 1966 intel_de_rmw(display, HDCP2_CTL(display, cpu_transcoder, port), 1965 1967 CTL_LINK_ENCRYPTION_REQ, 0); 1966 1968 1967 - ret = intel_de_wait_for_clear(display, 1968 - HDCP2_STATUS(display, cpu_transcoder, 1969 - port), 1970 - LINK_ENCRYPTION_STATUS, 1971 - HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS); 1969 + ret = intel_de_wait_for_clear_ms(display, 1970 + HDCP2_STATUS(display, cpu_transcoder, port), 1971 + LINK_ENCRYPTION_STATUS, 1972 + HDCP_ENCRYPT_STATUS_CHANGE_TIMEOUT_MS); 1972 1973 if (ret == -ETIMEDOUT) 1973 1974 drm_dbg_kms(display->drm, "Disable Encryption Timedout"); 1974 1975
+2 -2
drivers/gpu/drm/i915/display/intel_hdmi.c
··· 1598 1598 intel_de_write(display, HDCP_RPRIME(display, cpu_transcoder, port), ri.reg); 1599 1599 1600 1600 /* Wait for Ri prime match */ 1601 - ret = intel_de_wait_for_set(display, HDCP_STATUS(display, cpu_transcoder, port), 1602 - HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC, 1); 1601 + ret = intel_de_wait_for_set_ms(display, HDCP_STATUS(display, cpu_transcoder, port), 1602 + HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC, 1); 1603 1603 if (ret) { 1604 1604 drm_dbg_kms(display->drm, "Ri' mismatch detected (%x)\n", 1605 1605 intel_de_read(display, HDCP_STATUS(display, cpu_transcoder,
+384 -57
drivers/gpu/drm/i915/display/intel_lt_phy.c
··· 6 6 #include <drm/drm_print.h> 7 7 8 8 #include "i915_reg.h" 9 - #include "i915_utils.h" 10 9 #include "intel_cx0_phy.h" 11 10 #include "intel_cx0_phy_regs.h" 12 11 #include "intel_ddi.h" ··· 13 14 #include "intel_de.h" 14 15 #include "intel_display.h" 15 16 #include "intel_display_types.h" 17 + #include "intel_display_utils.h" 16 18 #include "intel_dpll_mgr.h" 17 19 #include "intel_hdmi.h" 18 20 #include "intel_lt_phy.h" ··· 31 31 #define INTEL_LT_PHY_BOTH_LANES (INTEL_LT_PHY_LANE1 |\ 32 32 INTEL_LT_PHY_LANE0) 33 33 #define MODE_DP 3 34 + #define Q32_TO_INT(x) ((x) >> 32) 35 + #define Q32_TO_FRAC(x) ((x) & 0xFFFFFFFF) 36 + #define DCO_MIN_FREQ_MHZ 11850 37 + #define REF_CLK_KHZ 38400 38 + #define TDC_RES_MULTIPLIER 10000000ULL 39 + 40 + struct phy_param_t { 41 + u32 val; 42 + u32 addr; 43 + }; 44 + 45 + struct lt_phy_params { 46 + struct phy_param_t pll_reg4; 47 + struct phy_param_t pll_reg3; 48 + struct phy_param_t pll_reg5; 49 + struct phy_param_t pll_reg57; 50 + struct phy_param_t lf; 51 + struct phy_param_t tdc; 52 + struct phy_param_t ssc; 53 + struct phy_param_t bias2; 54 + struct phy_param_t bias_trim; 55 + struct phy_param_t dco_med; 56 + struct phy_param_t dco_fine; 57 + struct phy_param_t ssc_inj; 58 + struct phy_param_t surv_bonus; 59 + }; 34 60 35 61 static const struct intel_lt_phy_pll_state xe3plpd_lt_dp_rbr = { 36 62 .clock = 162000, ··· 1067 1041 int ack; 1068 1042 u32 val; 1069 1043 1070 - if (intel_de_wait_for_clear(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 1071 - XELPDP_PORT_P2P_TRANSACTION_PENDING, 1072 - XELPDP_MSGBUS_TIMEOUT_SLOW)) { 1044 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_M2P_MSGBUS_CTL(display, port, lane), 1045 + XELPDP_PORT_P2P_TRANSACTION_PENDING, 1046 + XELPDP_MSGBUS_TIMEOUT_MS)) { 1073 1047 drm_dbg_kms(display->drm, 1074 1048 "PHY %c Timeout waiting for previous transaction to complete. Resetting bus.\n", 1075 1049 phy_name(phy)); ··· 1201 1175 XELPDP_LANE_PCLK_PLL_REQUEST(0), 1202 1176 XELPDP_LANE_PCLK_PLL_REQUEST(0)); 1203 1177 1204 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, port), 1205 - XELPDP_LANE_PCLK_PLL_ACK(0), 1206 - XELPDP_LANE_PCLK_PLL_ACK(0), 1207 - XE3PLPD_MACCLK_TURNON_LATENCY_US, 1208 - XE3PLPD_MACCLK_TURNON_LATENCY_MS, NULL)) 1209 - drm_warn(display->drm, "PHY %c PLL MacCLK assertion Ack not done after %dus.\n", 1210 - phy_name(phy), XE3PLPD_MACCLK_TURNON_LATENCY_MS * 1000); 1178 + if (intel_de_wait_for_set_ms(display, XELPDP_PORT_CLOCK_CTL(display, port), 1179 + XELPDP_LANE_PCLK_PLL_ACK(0), 1180 + XE3PLPD_MACCLK_TURNON_LATENCY_MS)) 1181 + drm_warn(display->drm, "PHY %c PLL MacCLK assertion ack not done\n", 1182 + phy_name(phy)); 1211 1183 1212 1184 intel_de_rmw(display, XELPDP_PORT_CLOCK_CTL(display, port), 1213 1185 XELPDP_FORWARD_CLOCK_UNGATE, ··· 1214 1190 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), 1215 1191 lane_pipe_reset | lane_phy_pulse_status, 0); 1216 1192 1217 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL2(display, port), 1218 - lane_phy_current_status, 0, 1219 - XE3PLPD_RESET_END_LATENCY_US, 2, NULL)) 1220 - drm_warn(display->drm, 1221 - "PHY %c failed to bring out of Lane reset after %dus.\n", 1222 - phy_name(phy), XE3PLPD_RESET_END_LATENCY_US); 1193 + if (intel_de_wait_for_clear_ms(display, XELPDP_PORT_BUF_CTL2(display, port), 1194 + lane_phy_current_status, 1195 + XE3PLPD_RESET_END_LATENCY_MS)) 1196 + drm_warn(display->drm, "PHY %c failed to bring out of lane reset\n", 1197 + phy_name(phy)); 1223 1198 1224 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL2(display, port), 1225 - lane_phy_pulse_status, lane_phy_pulse_status, 1226 - XE3PLPD_RATE_CALIB_DONE_LATENCY_US, 0, NULL)) 1227 - drm_warn(display->drm, "PHY %c PLL rate not changed after %dus.\n", 1228 - phy_name(phy), XE3PLPD_RATE_CALIB_DONE_LATENCY_US); 1199 + if (intel_de_wait_for_set_ms(display, XELPDP_PORT_BUF_CTL2(display, port), 1200 + lane_phy_pulse_status, 1201 + XE3PLPD_RATE_CALIB_DONE_LATENCY_MS)) 1202 + drm_warn(display->drm, "PHY %c PLL rate not changed\n", 1203 + phy_name(phy)); 1229 1204 1230 1205 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), lane_phy_pulse_status, 0); 1231 1206 } ··· 1379 1356 return false; 1380 1357 } 1381 1358 1382 - static int 1383 - intel_lt_phy_calc_hdmi_port_clock(const struct intel_lt_phy_pll_state *lt_state) 1359 + static u64 mul_q32_u32(u64 a_q32, u32 b) 1384 1360 { 1385 - #define REF_CLK_KHZ 38400 1361 + u64 p0, p1, carry, result; 1362 + u64 x_hi = a_q32 >> 32; 1363 + u64 x_lo = a_q32 & 0xFFFFFFFFULL; 1364 + 1365 + p0 = x_lo * (u64)b; 1366 + p1 = x_hi * (u64)b; 1367 + carry = p0 >> 32; 1368 + result = (p1 << 32) + (carry << 32) + (p0 & 0xFFFFFFFFULL); 1369 + 1370 + return result; 1371 + } 1372 + 1373 + static bool 1374 + calculate_target_dco_and_loop_cnt(u32 frequency_khz, u64 *target_dco_mhz, u32 *loop_cnt) 1375 + { 1376 + u32 ppm_value = 1; 1377 + u32 dco_min_freq = DCO_MIN_FREQ_MHZ; 1378 + u32 dco_max_freq = 16200; 1379 + u32 dco_min_freq_low = 10000; 1380 + u32 dco_max_freq_low = 12000; 1381 + u64 val = 0; 1382 + u64 refclk_khz = REF_CLK_KHZ; 1383 + u64 m2div = 0; 1384 + u64 val_with_frac = 0; 1385 + u64 ppm = 0; 1386 + u64 temp0 = 0, temp1, scale; 1387 + int ppm_cnt, dco_count, y; 1388 + 1389 + for (ppm_cnt = 0; ppm_cnt < 5; ppm_cnt++) { 1390 + ppm_value = ppm_cnt == 2 ? 2 : 1; 1391 + for (dco_count = 0; dco_count < 2; dco_count++) { 1392 + if (dco_count == 1) { 1393 + dco_min_freq = dco_min_freq_low; 1394 + dco_max_freq = dco_max_freq_low; 1395 + } 1396 + for (y = 2; y <= 255; y += 2) { 1397 + val = div64_u64((u64)y * frequency_khz, 200); 1398 + m2div = div64_u64(((u64)(val) << 32), refclk_khz); 1399 + m2div = mul_q32_u32(m2div, 500); 1400 + val_with_frac = mul_q32_u32(m2div, refclk_khz); 1401 + val_with_frac = div64_u64(val_with_frac, 500); 1402 + temp1 = Q32_TO_INT(val_with_frac); 1403 + temp0 = (temp1 > val) ? (temp1 - val) : 1404 + (val - temp1); 1405 + ppm = div64_u64(temp0, val); 1406 + if (temp1 >= dco_min_freq && 1407 + temp1 <= dco_max_freq && 1408 + ppm < ppm_value) { 1409 + /* Round to two places */ 1410 + scale = (1ULL << 32) / 100; 1411 + temp0 = DIV_ROUND_UP_ULL(val_with_frac, 1412 + scale); 1413 + *target_dco_mhz = temp0 * scale; 1414 + *loop_cnt = y; 1415 + return true; 1416 + } 1417 + } 1418 + } 1419 + } 1420 + 1421 + return false; 1422 + } 1423 + 1424 + static void set_phy_vdr_addresses(struct lt_phy_params *p, int pll_type) 1425 + { 1426 + p->pll_reg4.addr = PLL_REG_ADDR(PLL_REG4_ADDR, pll_type); 1427 + p->pll_reg3.addr = PLL_REG_ADDR(PLL_REG3_ADDR, pll_type); 1428 + p->pll_reg5.addr = PLL_REG_ADDR(PLL_REG5_ADDR, pll_type); 1429 + p->pll_reg57.addr = PLL_REG_ADDR(PLL_REG57_ADDR, pll_type); 1430 + p->lf.addr = PLL_REG_ADDR(PLL_LF_ADDR, pll_type); 1431 + p->tdc.addr = PLL_REG_ADDR(PLL_TDC_ADDR, pll_type); 1432 + p->ssc.addr = PLL_REG_ADDR(PLL_SSC_ADDR, pll_type); 1433 + p->bias2.addr = PLL_REG_ADDR(PLL_BIAS2_ADDR, pll_type); 1434 + p->bias_trim.addr = PLL_REG_ADDR(PLL_BIAS_TRIM_ADDR, pll_type); 1435 + p->dco_med.addr = PLL_REG_ADDR(PLL_DCO_MED_ADDR, pll_type); 1436 + p->dco_fine.addr = PLL_REG_ADDR(PLL_DCO_FINE_ADDR, pll_type); 1437 + p->ssc_inj.addr = PLL_REG_ADDR(PLL_SSC_INJ_ADDR, pll_type); 1438 + p->surv_bonus.addr = PLL_REG_ADDR(PLL_SURV_BONUS_ADDR, pll_type); 1439 + } 1440 + 1441 + static void compute_ssc(struct lt_phy_params *p, u32 ana_cfg) 1442 + { 1443 + int ssc_stepsize = 0; 1444 + int ssc_steplen = 0; 1445 + int ssc_steplog = 0; 1446 + 1447 + p->ssc.val = (1 << 31) | (ana_cfg << 24) | (ssc_steplog << 16) | 1448 + (ssc_stepsize << 8) | ssc_steplen; 1449 + } 1450 + 1451 + static void compute_bias2(struct lt_phy_params *p) 1452 + { 1453 + u32 ssc_en_local = 0; 1454 + u64 dynctrl_ovrd_en = 0; 1455 + 1456 + p->bias2.val = (dynctrl_ovrd_en << 31) | (ssc_en_local << 30) | 1457 + (1 << 23) | (1 << 24) | (32 << 16) | (1 << 8); 1458 + } 1459 + 1460 + static void compute_tdc(struct lt_phy_params *p, u64 tdc_fine) 1461 + { 1462 + u32 settling_time = 15; 1463 + u32 bias_ovr_en = 1; 1464 + u32 coldstart = 1; 1465 + u32 true_lock = 2; 1466 + u32 early_lock = 1; 1467 + u32 lock_ovr_en = 1; 1468 + u32 lock_thr = tdc_fine ? 3 : 5; 1469 + u32 unlock_thr = tdc_fine ? 5 : 11; 1470 + 1471 + p->tdc.val = (u32)((2 << 30) + (settling_time << 16) + (bias_ovr_en << 15) + 1472 + (lock_ovr_en << 14) + (coldstart << 12) + (true_lock << 10) + 1473 + (early_lock << 8) + (unlock_thr << 4) + lock_thr); 1474 + } 1475 + 1476 + static void compute_dco_med(struct lt_phy_params *p) 1477 + { 1478 + u32 cselmed_en = 0; 1479 + u32 cselmed_dyn_adj = 0; 1480 + u32 cselmed_ratio = 39; 1481 + u32 cselmed_thr = 8; 1482 + 1483 + p->dco_med.val = (cselmed_en << 31) + (cselmed_dyn_adj << 30) + 1484 + (cselmed_ratio << 24) + (cselmed_thr << 21); 1485 + } 1486 + 1487 + static void compute_dco_fine(struct lt_phy_params *p, u32 dco_12g) 1488 + { 1489 + u32 dco_fine0_tune_2_0 = 0; 1490 + u32 dco_fine1_tune_2_0 = 0; 1491 + u32 dco_fine2_tune_2_0 = 0; 1492 + u32 dco_fine3_tune_2_0 = 0; 1493 + u32 dco_dith0_tune_2_0 = 0; 1494 + u32 dco_dith1_tune_2_0 = 0; 1495 + 1496 + dco_fine0_tune_2_0 = dco_12g ? 4 : 3; 1497 + dco_fine1_tune_2_0 = 2; 1498 + dco_fine2_tune_2_0 = dco_12g ? 2 : 1; 1499 + dco_fine3_tune_2_0 = 5; 1500 + dco_dith0_tune_2_0 = dco_12g ? 4 : 3; 1501 + dco_dith1_tune_2_0 = 2; 1502 + 1503 + p->dco_fine.val = (dco_dith1_tune_2_0 << 19) + 1504 + (dco_dith0_tune_2_0 << 16) + 1505 + (dco_fine3_tune_2_0 << 11) + 1506 + (dco_fine2_tune_2_0 << 8) + 1507 + (dco_fine1_tune_2_0 << 3) + 1508 + dco_fine0_tune_2_0; 1509 + } 1510 + 1511 + int 1512 + intel_lt_phy_calculate_hdmi_state(struct intel_lt_phy_pll_state *lt_state, 1513 + u32 frequency_khz) 1514 + { 1515 + #define DATA_ASSIGN(i, pll_reg) \ 1516 + do { \ 1517 + lt_state->data[i][0] = (u8)((((pll_reg).val) & 0xFF000000) >> 24); \ 1518 + lt_state->data[i][1] = (u8)((((pll_reg).val) & 0x00FF0000) >> 16); \ 1519 + lt_state->data[i][2] = (u8)((((pll_reg).val) & 0x0000FF00) >> 8); \ 1520 + lt_state->data[i][3] = (u8)((((pll_reg).val) & 0x000000FF)); \ 1521 + } while (0) 1522 + #define ADDR_ASSIGN(i, pll_reg) \ 1523 + do { \ 1524 + lt_state->addr_msb[i] = ((pll_reg).addr >> 8) & 0xFF; \ 1525 + lt_state->addr_lsb[i] = (pll_reg).addr & 0xFF; \ 1526 + } while (0) 1527 + 1528 + bool found = false; 1529 + struct lt_phy_params p; 1530 + u32 dco_fmin = DCO_MIN_FREQ_MHZ; 1531 + u64 refclk_khz = REF_CLK_KHZ; 1532 + u32 refclk_mhz_int = REF_CLK_KHZ / 1000; 1533 + u64 m2div = 0; 1534 + u64 target_dco_mhz = 0; 1535 + u64 tdc_fine, tdc_targetcnt; 1536 + u64 feedfwd_gain ,feedfwd_cal_en; 1537 + u64 tdc_res = 30; 1538 + u32 prop_coeff; 1539 + u32 int_coeff; 1540 + u32 ndiv = 1; 1541 + u32 m1div = 1, m2div_int, m2div_frac; 1542 + u32 frac_en; 1543 + u32 ana_cfg; 1544 + u32 loop_cnt = 0; 1545 + u32 gain_ctrl = 2; 1546 + u32 postdiv = 0; 1547 + u32 dco_12g = 0; 1548 + u32 pll_type = 0; 1549 + u32 d1 = 2, d3 = 5, d4 = 0, d5 = 0; 1550 + u32 d6 = 0, d6_new = 0; 1551 + u32 d7, d8 = 0; 1552 + u32 bonus_7_0 = 0; 1553 + u32 csel2fo = 11; 1554 + u32 csel2fo_ovrd_en = 1; 1555 + u64 temp0, temp1, temp2, temp3; 1556 + 1557 + p.surv_bonus.val = (bonus_7_0 << 16); 1558 + p.pll_reg4.val = (refclk_mhz_int << 17) + 1559 + (ndiv << 9) + (1 << 4); 1560 + p.bias_trim.val = (csel2fo_ovrd_en << 30) + (csel2fo << 24); 1561 + p.ssc_inj.val = 0; 1562 + found = calculate_target_dco_and_loop_cnt(frequency_khz, &target_dco_mhz, &loop_cnt); 1563 + if (!found) 1564 + return -EINVAL; 1565 + 1566 + m2div = div64_u64(target_dco_mhz, (refclk_khz * ndiv * m1div)); 1567 + m2div = mul_q32_u32(m2div, 1000); 1568 + if (Q32_TO_INT(m2div) > 511) 1569 + return -EINVAL; 1570 + 1571 + m2div_int = (u32)Q32_TO_INT(m2div); 1572 + m2div_frac = (u32)(Q32_TO_FRAC(m2div)); 1573 + frac_en = (m2div_frac > 0) ? 1 : 0; 1574 + 1575 + if (frac_en > 0) 1576 + tdc_res = 70; 1577 + else 1578 + tdc_res = 36; 1579 + tdc_fine = tdc_res > 50 ? 1 : 0; 1580 + temp0 = tdc_res * 40 * 11; 1581 + temp1 = div64_u64(((4 * TDC_RES_MULTIPLIER) + temp0) * 500, temp0 * refclk_khz); 1582 + temp2 = div64_u64(temp0 * refclk_khz, 1000); 1583 + temp3 = div64_u64(((8 * TDC_RES_MULTIPLIER) + temp2), temp2); 1584 + tdc_targetcnt = tdc_res < 50 ? (int)(temp1) : (int)(temp3); 1585 + tdc_targetcnt = (int)(tdc_targetcnt / 2); 1586 + temp0 = mul_q32_u32(target_dco_mhz, tdc_res); 1587 + temp0 >>= 32; 1588 + feedfwd_gain = (m2div_frac > 0) ? div64_u64(m1div * TDC_RES_MULTIPLIER, temp0) : 0; 1589 + feedfwd_cal_en = frac_en; 1590 + 1591 + temp0 = (u32)Q32_TO_INT(target_dco_mhz); 1592 + prop_coeff = (temp0 >= dco_fmin) ? 3 : 4; 1593 + int_coeff = (temp0 >= dco_fmin) ? 7 : 8; 1594 + ana_cfg = (temp0 >= dco_fmin) ? 8 : 6; 1595 + dco_12g = (temp0 >= dco_fmin) ? 0 : 1; 1596 + 1597 + if (temp0 > 12960) 1598 + d7 = 10; 1599 + else 1600 + d7 = 8; 1601 + 1602 + d8 = loop_cnt / 2; 1603 + d4 = d8 * 2; 1604 + 1605 + /* Compute pll_reg3,5,57 & lf */ 1606 + p.pll_reg3.val = (u32)((d4 << 21) + (d3 << 18) + (d1 << 15) + (m2div_int << 5)); 1607 + p.pll_reg5.val = m2div_frac; 1608 + postdiv = (d5 == 0) ? 9 : d5; 1609 + d6_new = (d6 == 0) ? 40 : d6; 1610 + p.pll_reg57.val = (d7 << 24) + (postdiv << 15) + (d8 << 7) + d6_new; 1611 + p.lf.val = (u32)((frac_en << 31) + (1 << 30) + (frac_en << 29) + 1612 + (feedfwd_cal_en << 28) + (tdc_fine << 27) + 1613 + (gain_ctrl << 24) + (feedfwd_gain << 16) + 1614 + (int_coeff << 12) + (prop_coeff << 8) + tdc_targetcnt); 1615 + 1616 + compute_ssc(&p, ana_cfg); 1617 + compute_bias2(&p); 1618 + compute_tdc(&p, tdc_fine); 1619 + compute_dco_med(&p); 1620 + compute_dco_fine(&p, dco_12g); 1621 + 1622 + pll_type = ((frequency_khz == 10000) || (frequency_khz == 20000) || 1623 + (frequency_khz == 2500) || (dco_12g == 1)) ? 0 : 1; 1624 + set_phy_vdr_addresses(&p, pll_type); 1625 + 1626 + lt_state->config[0] = 0x84; 1627 + lt_state->config[1] = 0x2d; 1628 + ADDR_ASSIGN(0, p.pll_reg4); 1629 + ADDR_ASSIGN(1, p.pll_reg3); 1630 + ADDR_ASSIGN(2, p.pll_reg5); 1631 + ADDR_ASSIGN(3, p.pll_reg57); 1632 + ADDR_ASSIGN(4, p.lf); 1633 + ADDR_ASSIGN(5, p.tdc); 1634 + ADDR_ASSIGN(6, p.ssc); 1635 + ADDR_ASSIGN(7, p.bias2); 1636 + ADDR_ASSIGN(8, p.bias_trim); 1637 + ADDR_ASSIGN(9, p.dco_med); 1638 + ADDR_ASSIGN(10, p.dco_fine); 1639 + ADDR_ASSIGN(11, p.ssc_inj); 1640 + ADDR_ASSIGN(12, p.surv_bonus); 1641 + DATA_ASSIGN(0, p.pll_reg4); 1642 + DATA_ASSIGN(1, p.pll_reg3); 1643 + DATA_ASSIGN(2, p.pll_reg5); 1644 + DATA_ASSIGN(3, p.pll_reg57); 1645 + DATA_ASSIGN(4, p.lf); 1646 + DATA_ASSIGN(5, p.tdc); 1647 + DATA_ASSIGN(6, p.ssc); 1648 + DATA_ASSIGN(7, p.bias2); 1649 + DATA_ASSIGN(8, p.bias_trim); 1650 + DATA_ASSIGN(9, p.dco_med); 1651 + DATA_ASSIGN(10, p.dco_fine); 1652 + DATA_ASSIGN(11, p.ssc_inj); 1653 + DATA_ASSIGN(12, p.surv_bonus); 1654 + 1655 + return 0; 1656 + } 1657 + 1658 + static int 1659 + intel_lt_phy_calc_hdmi_port_clock(const struct intel_crtc_state *crtc_state) 1660 + { 1386 1661 #define REGVAL(i) ( \ 1387 1662 (lt_state->data[i][3]) | \ 1388 1663 (lt_state->data[i][2] << 8) | \ ··· 1688 1367 (lt_state->data[i][0] << 24) \ 1689 1368 ) 1690 1369 1370 + struct intel_display *display = to_intel_display(crtc_state); 1371 + const struct intel_lt_phy_pll_state *lt_state = 1372 + &crtc_state->dpll_hw_state.ltpll; 1691 1373 int clk = 0; 1692 1374 u32 d8, pll_reg_5, pll_reg_3, pll_reg_57, m2div_frac, m2div_int; 1693 1375 u64 temp0, temp1; ··· 1733 1409 * frequency = (m2div * refclk_khz / (d8 * 10)) 1734 1410 */ 1735 1411 d8 = (pll_reg_57 & REG_GENMASK(14, 7)) >> 7; 1412 + if (d8 == 0) { 1413 + drm_WARN_ON(display->drm, 1414 + "Invalid port clock using lowest HDMI portclock\n"); 1415 + return xe3plpd_lt_hdmi_252.clock; 1416 + } 1736 1417 m2div_int = (pll_reg_3 & REG_GENMASK(14, 5)) >> 5; 1737 1418 temp0 = ((u64)m2div_frac * REF_CLK_KHZ) >> 32; 1738 1419 temp1 = (u64)m2div_int * REF_CLK_KHZ; 1739 - if (d8 == 0) 1740 - return 0; 1741 1420 1742 1421 clk = div_u64((temp1 + temp0), d8 * 10); 1743 1422 ··· 1769 1442 lt_state->config[0]); 1770 1443 clk = intel_lt_phy_get_dp_clock(rate); 1771 1444 } else { 1772 - clk = intel_lt_phy_calc_hdmi_port_clock(lt_state); 1445 + clk = intel_lt_phy_calc_hdmi_port_clock(crtc_state); 1773 1446 } 1774 1447 1775 1448 return clk; ··· 1799 1472 } 1800 1473 } 1801 1474 1802 - /* TODO: Add a function to compute the data for HDMI TMDS*/ 1475 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) { 1476 + return intel_lt_phy_calculate_hdmi_state(&crtc_state->dpll_hw_state.ltpll, 1477 + crtc_state->port_clock); 1478 + } 1803 1479 1804 1480 return -EINVAL; 1805 1481 } ··· 1981 1651 XELPDP_LANE_PCLK_PLL_REQUEST(0), 0); 1982 1652 1983 1653 /* 8. Poll for PORT_CLOCK_CTL[PCLK PLL Ack LN0]= 0. */ 1984 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, port), 1985 - XELPDP_LANE_PCLK_PLL_ACK(0), 0, 1986 - XE3PLPD_MACCLK_TURNOFF_LATENCY_US, 0, NULL)) 1987 - drm_warn(display->drm, "PHY %c PLL MacCLK Ack deassertion Timeout after %dus.\n", 1988 - phy_name(phy), XE3PLPD_MACCLK_TURNOFF_LATENCY_US); 1654 + if (intel_de_wait_for_clear_us(display, XELPDP_PORT_CLOCK_CTL(display, port), 1655 + XELPDP_LANE_PCLK_PLL_ACK(0), 1656 + XE3PLPD_MACCLK_TURNOFF_LATENCY_US)) 1657 + drm_warn(display->drm, "PHY %c PLL MacCLK ack deassertion timeout\n", 1658 + phy_name(phy)); 1989 1659 1990 1660 /* 1991 1661 * 9. Follow the Display Voltage Frequency Switching - Sequence Before Frequency ··· 2001 1671 XELPDP_LANE_PCLK_PLL_REQUEST(0)); 2002 1672 2003 1673 /* 12. Poll for PORT_CLOCK_CTL[PCLK PLL Ack LN0]= 1. */ 2004 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, port), 2005 - XELPDP_LANE_PCLK_PLL_ACK(0), 2006 - XELPDP_LANE_PCLK_PLL_ACK(0), 2007 - XE3PLPD_MACCLK_TURNON_LATENCY_US, 2, NULL)) 2008 - drm_warn(display->drm, "PHY %c PLL MacCLK Ack assertion Timeout after %dus.\n", 2009 - phy_name(phy), XE3PLPD_MACCLK_TURNON_LATENCY_US); 1674 + if (intel_de_wait_for_set_ms(display, XELPDP_PORT_CLOCK_CTL(display, port), 1675 + XELPDP_LANE_PCLK_PLL_ACK(0), 1676 + XE3PLPD_MACCLK_TURNON_LATENCY_MS)) 1677 + drm_warn(display->drm, "PHY %c PLL MacCLK ack assertion timeout\n", 1678 + phy_name(phy)); 2010 1679 2011 1680 /* 2012 1681 * 13. Ungate the forward clock by setting ··· 2029 1700 rate_update, MB_WRITE_COMMITTED); 2030 1701 2031 1702 /* 16. Poll for PORT_BUF_CTL2 register PHY Pulse Status = 1 for Owned PHY Lanes. */ 2032 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL2(display, port), 2033 - lane_phy_pulse_status, lane_phy_pulse_status, 2034 - XE3PLPD_RATE_CALIB_DONE_LATENCY_US, 2, NULL)) 2035 - drm_warn(display->drm, "PHY %c PLL rate not changed after %dus.\n", 2036 - phy_name(phy), XE3PLPD_RATE_CALIB_DONE_LATENCY_US); 1703 + if (intel_de_wait_for_set_ms(display, XELPDP_PORT_BUF_CTL2(display, port), 1704 + lane_phy_pulse_status, 1705 + XE3PLPD_RATE_CALIB_DONE_LATENCY_MS)) 1706 + drm_warn(display->drm, "PHY %c PLL rate not changed\n", 1707 + phy_name(phy)); 2037 1708 2038 1709 /* 17. SW clears PORT_BUF_CTL2 [PHY Pulse Status]. */ 2039 1710 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), ··· 2087 1758 lane_pipe_reset); 2088 1759 2089 1760 /* 3. Poll for PORT_BUF_CTL2<port> Lane<PHY Lanes Owned> PHY Current Status == 1. */ 2090 - if (intel_de_wait_custom(display, XELPDP_PORT_BUF_CTL2(display, port), 2091 - lane_phy_current_status, 2092 - lane_phy_current_status, 2093 - XE3PLPD_RESET_START_LATENCY_US, 0, NULL)) 2094 - drm_warn(display->drm, 2095 - "PHY %c failed to reset Lane after %dms.\n", 2096 - phy_name(phy), XE3PLPD_RESET_START_LATENCY_US); 1761 + if (intel_de_wait_for_set_us(display, XELPDP_PORT_BUF_CTL2(display, port), 1762 + lane_phy_current_status, 1763 + XE3PLPD_RESET_START_LATENCY_US)) 1764 + drm_warn(display->drm, "PHY %c failed to reset lane\n", 1765 + phy_name(phy)); 2097 1766 2098 1767 /* 4. Clear for PHY pulse status on owned PHY lanes. */ 2099 1768 intel_de_rmw(display, XELPDP_PORT_BUF_CTL2(display, port), ··· 2110 1783 intel_de_write(display, DDI_CLK_VALFREQ(encoder->port), 0); 2111 1784 2112 1785 /* 8. Poll for PORT_CLOCK_CTL[PCLK PLL Ack LN0]= 0. */ 2113 - if (intel_de_wait_custom(display, XELPDP_PORT_CLOCK_CTL(display, port), 2114 - XELPDP_LANE_PCLK_PLL_ACK(0), 0, 2115 - XE3PLPD_MACCLK_TURNOFF_LATENCY_US, 0, NULL)) 2116 - drm_warn(display->drm, "PHY %c PLL MacCLK Ack deassertion Timeout after %dus.\n", 2117 - phy_name(phy), XE3PLPD_MACCLK_TURNOFF_LATENCY_US); 1786 + if (intel_de_wait_for_clear_us(display, XELPDP_PORT_CLOCK_CTL(display, port), 1787 + XELPDP_LANE_PCLK_PLL_ACK(0), 1788 + XE3PLPD_MACCLK_TURNOFF_LATENCY_US)) 1789 + drm_warn(display->drm, "PHY %c PLL MacCLK ack deassertion timeout\n", 1790 + phy_name(phy)); 2118 1791 2119 1792 /* 2120 1793 * 9. Follow the Display Voltage Frequency Switching -
+3
drivers/gpu/drm/i915/display/intel_lt_phy.h
··· 35 35 struct intel_lt_phy_pll_state *pll_state); 36 36 void intel_lt_phy_pll_state_verify(struct intel_atomic_state *state, 37 37 struct intel_crtc *crtc); 38 + int 39 + intel_lt_phy_calculate_hdmi_state(struct intel_lt_phy_pll_state *lt_state, 40 + u32 frequency_khz); 38 41 void intel_xe3plpd_pll_enable(struct intel_encoder *encoder, 39 42 const struct intel_crtc_state *crtc_state); 40 43 void intel_xe3plpd_pll_disable(struct intel_encoder *encoder);
+19 -4
drivers/gpu/drm/i915/display/intel_lt_phy_regs.h
··· 7 7 #define __INTEL_LT_PHY_REGS_H__ 8 8 9 9 #define XE3PLPD_MSGBUS_TIMEOUT_FAST_US 500 10 - #define XE3PLPD_MACCLK_TURNON_LATENCY_MS 1 11 - #define XE3PLPD_MACCLK_TURNON_LATENCY_US 21 10 + #define XE3PLPD_MACCLK_TURNON_LATENCY_MS 2 12 11 #define XE3PLPD_MACCLK_TURNOFF_LATENCY_US 1 13 - #define XE3PLPD_RATE_CALIB_DONE_LATENCY_US 50 12 + #define XE3PLPD_RATE_CALIB_DONE_LATENCY_MS 1 14 13 #define XE3PLPD_RESET_START_LATENCY_US 10 15 14 #define XE3PLPD_PWRDN_TO_RDY_LATENCY_US 4 16 - #define XE3PLPD_RESET_END_LATENCY_US 200 15 + #define XE3PLPD_RESET_END_LATENCY_MS 2 17 16 18 17 /* LT Phy MAC Register */ 19 18 #define LT_PHY_MAC_VDR _MMIO(0xC00) ··· 71 72 #define XE3PLPD_PORT_P2M_MSGBUS_STATUS_P2P(port, lane) _XE3PLPD_PORT_P2M_MSGBUS_STATUS_P2P(__xe2lpd_port_idx(port), \ 72 73 lane) 73 74 #define XE3LPD_PORT_P2M_ADDR_MASK REG_GENMASK(11, 0) 75 + 76 + #define PLL_REG4_ADDR 0x8510 77 + #define PLL_REG3_ADDR 0x850C 78 + #define PLL_REG5_ADDR 0x8514 79 + #define PLL_REG57_ADDR 0x85E4 80 + #define PLL_LF_ADDR 0x860C 81 + #define PLL_TDC_ADDR 0x8610 82 + #define PLL_SSC_ADDR 0x8614 83 + #define PLL_BIAS2_ADDR 0x8618 84 + #define PLL_BIAS_TRIM_ADDR 0x8648 85 + #define PLL_DCO_MED_ADDR 0x8640 86 + #define PLL_DCO_FINE_ADDR 0x864C 87 + #define PLL_SSC_INJ_ADDR 0x8624 88 + #define PLL_SURV_BONUS_ADDR 0x8644 89 + #define PLL_TYPE_OFFSET 0x200 90 + #define PLL_REG_ADDR(base, pll_type) ((pll_type) ? (base) + PLL_TYPE_OFFSET : (base)) 74 91 #endif /* __INTEL_LT_PHY_REGS_H__ */
+3 -3
drivers/gpu/drm/i915/display/intel_lvds.c
··· 329 329 intel_de_rmw(display, PP_CONTROL(display, 0), 0, PANEL_POWER_ON); 330 330 intel_de_posting_read(display, lvds_encoder->reg); 331 331 332 - if (intel_de_wait_for_set(display, PP_STATUS(display, 0), PP_ON, 5000)) 332 + if (intel_de_wait_for_set_ms(display, PP_STATUS(display, 0), PP_ON, 5000)) 333 333 drm_err(display->drm, 334 334 "timed out waiting for panel to power on\n"); 335 335 ··· 345 345 struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(encoder); 346 346 347 347 intel_de_rmw(display, PP_CONTROL(display, 0), PANEL_POWER_ON, 0); 348 - if (intel_de_wait_for_clear(display, PP_STATUS(display, 0), PP_ON, 1000)) 348 + if (intel_de_wait_for_clear_ms(display, PP_STATUS(display, 0), PP_ON, 1000)) 349 349 drm_err(display->drm, 350 350 "timed out waiting for panel to power off\n"); 351 351 ··· 384 384 { 385 385 struct intel_display *display = to_intel_display(encoder); 386 386 387 - if (intel_de_wait_for_clear(display, PP_STATUS(display, 0), PP_CYCLE_DELAY_ACTIVE, 5000)) 387 + if (intel_de_wait_for_clear_ms(display, PP_STATUS(display, 0), PP_CYCLE_DELAY_ACTIVE, 5000)) 388 388 drm_err(display->drm, 389 389 "timed out waiting for panel power cycle delay\n"); 390 390 }
+1 -5
drivers/gpu/drm/i915/display/intel_overlay.c
··· 308 308 intel_frontbuffer_put(overlay->frontbuffer); 309 309 overlay->frontbuffer = frontbuffer; 310 310 311 - intel_frontbuffer_flip_prepare(display, INTEL_FRONTBUFFER_OVERLAY(pipe)); 312 - 313 311 overlay->old_vma = overlay->vma; 314 312 if (vma) 315 313 overlay->vma = i915_vma_get(vma); ··· 364 366 if (drm_WARN_ON(display->drm, !vma)) 365 367 return; 366 368 367 - intel_frontbuffer_flip_complete(display, INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); 369 + intel_frontbuffer_flip(display, INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); 368 370 369 371 i915_vma_unpin(vma); 370 372 i915_vma_put(vma); ··· 819 821 ret = PTR_ERR(vma); 820 822 goto out_pin_section; 821 823 } 822 - 823 - i915_gem_object_flush_frontbuffer(new_bo, ORIGIN_DIRTYFB); 824 824 825 825 if (!overlay->active) { 826 826 const struct intel_crtc_state *crtc_state =
+6 -6
drivers/gpu/drm/i915/display/intel_pch_display.c
··· 305 305 } 306 306 307 307 intel_de_write(display, reg, val | TRANS_ENABLE); 308 - if (intel_de_wait_for_set(display, reg, TRANS_STATE_ENABLE, 100)) 308 + if (intel_de_wait_for_set_ms(display, reg, TRANS_STATE_ENABLE, 100)) 309 309 drm_err(display->drm, "failed to enable transcoder %c\n", 310 310 pipe_name(pipe)); 311 311 } ··· 326 326 reg = PCH_TRANSCONF(pipe); 327 327 intel_de_rmw(display, reg, TRANS_ENABLE, 0); 328 328 /* wait for PCH transcoder off, transcoder state */ 329 - if (intel_de_wait_for_clear(display, reg, TRANS_STATE_ENABLE, 50)) 329 + if (intel_de_wait_for_clear_ms(display, reg, TRANS_STATE_ENABLE, 50)) 330 330 drm_err(display->drm, "failed to disable transcoder %c\n", 331 331 pipe_name(pipe)); 332 332 ··· 572 572 val |= TRANS_INTERLACE_PROGRESSIVE; 573 573 574 574 intel_de_write(display, LPT_TRANSCONF, val); 575 - if (intel_de_wait_for_set(display, LPT_TRANSCONF, 576 - TRANS_STATE_ENABLE, 100)) 575 + if (intel_de_wait_for_set_ms(display, LPT_TRANSCONF, 576 + TRANS_STATE_ENABLE, 100)) 577 577 drm_err(display->drm, "Failed to enable PCH transcoder\n"); 578 578 } 579 579 ··· 581 581 { 582 582 intel_de_rmw(display, LPT_TRANSCONF, TRANS_ENABLE, 0); 583 583 /* wait for PCH transcoder off, transcoder state */ 584 - if (intel_de_wait_for_clear(display, LPT_TRANSCONF, 585 - TRANS_STATE_ENABLE, 50)) 584 + if (intel_de_wait_for_clear_ms(display, LPT_TRANSCONF, 585 + TRANS_STATE_ENABLE, 50)) 586 586 drm_err(display->drm, "Failed to disable PCH transcoder\n"); 587 587 588 588 /* Workaround: clear timing override bit. */
+4 -6
drivers/gpu/drm/i915/display/intel_pch_refclk.c
··· 21 21 22 22 intel_de_rmw(display, SOUTH_CHICKEN2, 0, FDI_MPHY_IOSFSB_RESET_CTL); 23 23 24 - ret = intel_de_wait_custom(display, SOUTH_CHICKEN2, 25 - FDI_MPHY_IOSFSB_RESET_STATUS, FDI_MPHY_IOSFSB_RESET_STATUS, 26 - 100, 0, NULL); 24 + ret = intel_de_wait_for_set_us(display, SOUTH_CHICKEN2, 25 + FDI_MPHY_IOSFSB_RESET_STATUS, 100); 27 26 if (ret) 28 27 drm_err(display->drm, "FDI mPHY reset assert timeout\n"); 29 28 30 29 intel_de_rmw(display, SOUTH_CHICKEN2, FDI_MPHY_IOSFSB_RESET_CTL, 0); 31 30 32 - ret = intel_de_wait_custom(display, SOUTH_CHICKEN2, 33 - FDI_MPHY_IOSFSB_RESET_STATUS, 0, 34 - 100, 0, NULL); 31 + ret = intel_de_wait_for_clear_us(display, SOUTH_CHICKEN2, 32 + FDI_MPHY_IOSFSB_RESET_STATUS, 100); 35 33 if (ret) 36 34 drm_err(display->drm, "FDI mPHY reset de-assert timeout\n"); 37 35 }
+3
drivers/gpu/drm/i915/display/intel_plane.c
··· 1051 1051 DISPLAY_VERx100(display) == 3002) && 1052 1052 src_x % 2 != 0) 1053 1053 hsub = 2; 1054 + 1055 + if (DISPLAY_VER(display) == 35) 1056 + vsub = 2; 1054 1057 } else { 1055 1058 hsub = fb->format->hsub; 1056 1059 vsub = fb->format->vsub;
+7 -4
drivers/gpu/drm/i915/display/intel_plane_initial.c
··· 133 133 struct drm_mm_node orig_mm = {}; 134 134 struct i915_vma *vma; 135 135 resource_size_t phys_base; 136 + unsigned int tiling; 136 137 u32 base, size; 137 138 u64 pinctl; 138 139 ··· 180 179 i915_gem_object_set_cache_coherency(obj, HAS_WT(i915) ? 181 180 I915_CACHE_WT : I915_CACHE_NONE); 182 181 183 - switch (plane_config->tiling) { 182 + tiling = intel_fb_modifier_to_tiling(plane_config->fb->base.modifier); 183 + 184 + switch (tiling) { 184 185 case I915_TILING_NONE: 185 186 break; 186 187 case I915_TILING_X: 187 188 case I915_TILING_Y: 188 189 obj->tiling_and_stride = 189 190 plane_config->fb->base.pitches[0] | 190 - plane_config->tiling; 191 + tiling; 191 192 break; 192 193 default: 193 - MISSING_CASE(plane_config->tiling); 194 + MISSING_CASE(tiling); 194 195 goto err_obj; 195 196 } 196 197 ··· 377 374 plane_state->uapi.crtc_w = fb->width; 378 375 plane_state->uapi.crtc_h = fb->height; 379 376 380 - if (plane_config->tiling) 377 + if (fb->modifier != DRM_FORMAT_MOD_LINEAR) 381 378 dev_priv->preserve_bios_swizzle = true; 382 379 383 380 plane_state->uapi.fb = fb;
+9 -9
drivers/gpu/drm/i915/display/intel_pmdemand.c
··· 390 390 391 391 static bool intel_pmdemand_check_prev_transaction(struct intel_display *display) 392 392 { 393 - return !(intel_de_wait_for_clear(display, 394 - XELPDP_INITIATE_PMDEMAND_REQUEST(1), 395 - XELPDP_PMDEMAND_REQ_ENABLE, 10) || 396 - intel_de_wait_for_clear(display, 397 - GEN12_DCPR_STATUS_1, 398 - XELPDP_PMDEMAND_INFLIGHT_STATUS, 10)); 393 + return !(intel_de_wait_for_clear_ms(display, 394 + XELPDP_INITIATE_PMDEMAND_REQUEST(1), 395 + XELPDP_PMDEMAND_REQ_ENABLE, 10) || 396 + intel_de_wait_for_clear_ms(display, 397 + GEN12_DCPR_STATUS_1, 398 + XELPDP_PMDEMAND_INFLIGHT_STATUS, 10)); 399 399 } 400 400 401 401 void ··· 462 462 u32 status; 463 463 int ret; 464 464 465 - ret = intel_de_wait_custom(display, XELPDP_INITIATE_PMDEMAND_REQUEST(1), 466 - XELPDP_PMDEMAND_REQ_ENABLE, 0, 467 - 50, timeout_ms, &status); 465 + ret = intel_de_wait_ms(display, XELPDP_INITIATE_PMDEMAND_REQUEST(1), 466 + XELPDP_PMDEMAND_REQ_ENABLE, 0, 467 + timeout_ms, &status); 468 468 469 469 if (ret == -ETIMEDOUT) 470 470 drm_err(display->drm,
+11 -6
drivers/gpu/drm/i915/display/intel_psr.c
··· 626 626 struct intel_display *display = to_intel_display(intel_dp); 627 627 int ret; 628 628 629 + /* TODO: Enable Panel Replay on MST once it's properly implemented. */ 630 + if (intel_dp->mst_detect == DRM_DP_MST) 631 + return; 632 + 629 633 ret = drm_dp_dpcd_read_data(&intel_dp->aux, DP_PANEL_REPLAY_CAP_SUPPORT, 630 634 &intel_dp->pr_dpcd, sizeof(intel_dp->pr_dpcd)); 631 635 if (ret < 0) ··· 936 932 { 937 933 struct intel_display *display = to_intel_display(intel_dp); 938 934 u32 current_dc_state = intel_display_power_get_current_dc_state(display); 939 - struct drm_vblank_crtc *vblank = &display->drm->vblank[intel_dp->psr.pipe]; 935 + struct intel_crtc *crtc = intel_crtc_for_pipe(display, intel_dp->psr.pipe); 936 + struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base); 940 937 941 938 return (current_dc_state != DC_STATE_EN_UPTO_DC5 && 942 939 current_dc_state != DC_STATE_EN_UPTO_DC6) || ··· 2277 2272 } 2278 2273 2279 2274 /* Wait till PSR is idle */ 2280 - if (intel_de_wait_for_clear(display, psr_status, 2281 - psr_status_mask, 2000)) 2275 + if (intel_de_wait_for_clear_ms(display, psr_status, 2276 + psr_status_mask, 2000)) 2282 2277 drm_err(display->drm, "Timed out waiting PSR idle state\n"); 2283 2278 } 2284 2279 ··· 3166 3161 return true; 3167 3162 } 3168 3163 3169 - return intel_de_wait_for_clear(display, 3164 + return intel_de_wait_for_clear_ms(display, 3170 3165 EDP_PSR2_STATUS(display, cpu_transcoder), 3171 3166 EDP_PSR2_STATUS_STATE_DEEP_SLEEP, 3172 3167 PSR_IDLE_TIMEOUT_MS); ··· 3186 3181 return true; 3187 3182 } 3188 3183 3189 - return intel_de_wait_for_clear(display, 3184 + return intel_de_wait_for_clear_ms(display, 3190 3185 psr_status_reg(display, cpu_transcoder), 3191 3186 EDP_PSR_STATUS_STATE_MASK, 3192 3187 PSR_IDLE_TIMEOUT_MS); ··· 3264 3259 3265 3260 mutex_unlock(&intel_dp->psr.lock); 3266 3261 3267 - err = intel_de_wait_for_clear(display, reg, mask, 50); 3262 + err = intel_de_wait_for_clear_ms(display, reg, mask, 50); 3268 3263 if (err) 3269 3264 drm_err(display->drm, 3270 3265 "Timed out waiting for PSR Idle for re-enable\n");
+4 -2
drivers/gpu/drm/i915/display/intel_sbi.c
··· 21 21 22 22 lockdep_assert_held(&display->sbi.lock); 23 23 24 - if (intel_de_wait_fw(display, SBI_CTL_STAT, SBI_STATUS_MASK, SBI_STATUS_READY, 100, NULL)) { 24 + if (intel_de_wait_fw_ms(display, SBI_CTL_STAT, 25 + SBI_STATUS_MASK, SBI_STATUS_READY, 100, NULL)) { 25 26 drm_err(display->drm, "timeout waiting for SBI to become ready\n"); 26 27 return -EBUSY; 27 28 } ··· 38 37 cmd |= SBI_CTL_OP_WR; 39 38 intel_de_write_fw(display, SBI_CTL_STAT, cmd | SBI_STATUS_BUSY); 40 39 41 - if (intel_de_wait_fw(display, SBI_CTL_STAT, SBI_STATUS_MASK, SBI_STATUS_READY, 100, &cmd)) { 40 + if (intel_de_wait_fw_ms(display, SBI_CTL_STAT, 41 + SBI_STATUS_MASK, SBI_STATUS_READY, 100, &cmd)) { 42 42 drm_err(display->drm, "timeout waiting for SBI to complete read\n"); 43 43 return -ETIMEDOUT; 44 44 }
+4 -4
drivers/gpu/drm/i915/display/intel_snps_phy.c
··· 42 42 * which phy was affected and skip setup of the corresponding 43 43 * output later. 44 44 */ 45 - if (intel_de_wait_for_clear(display, DG2_PHY_MISC(phy), 46 - DG2_PHY_DP_TX_ACK_MASK, 25)) 45 + if (intel_de_wait_for_clear_ms(display, DG2_PHY_MISC(phy), 46 + DG2_PHY_DP_TX_ACK_MASK, 25)) 47 47 display->snps.phy_failed_calibration |= BIT(phy); 48 48 } 49 49 } ··· 1863 1863 * is locked at new settings. This register bit is sampling PHY 1864 1864 * dp_mpllb_state interface signal. 1865 1865 */ 1866 - if (intel_de_wait_for_set(display, enable_reg, PLL_LOCK, 5)) 1866 + if (intel_de_wait_for_set_ms(display, enable_reg, PLL_LOCK, 5)) 1867 1867 drm_dbg_kms(display->drm, "Port %c PLL not locked\n", phy_name(phy)); 1868 1868 1869 1869 /* ··· 1903 1903 * 5. Software polls DPLL_ENABLE [PLL Lock] for PHY acknowledgment 1904 1904 * (dp_txX_ack) that the new transmitter setting request is completed. 1905 1905 */ 1906 - if (intel_de_wait_for_clear(display, enable_reg, PLL_LOCK, 5)) 1906 + if (intel_de_wait_for_clear_ms(display, enable_reg, PLL_LOCK, 5)) 1907 1907 drm_err(display->drm, "Port %c PLL not locked\n", phy_name(phy)); 1908 1908 1909 1909 /*
+4 -6
drivers/gpu/drm/i915/display/intel_sprite.c
··· 958 958 959 959 static unsigned int 960 960 g4x_sprite_max_stride(struct intel_plane *plane, 961 - u32 pixel_format, u64 modifier, 962 - unsigned int rotation) 961 + const struct drm_format_info *info, 962 + u64 modifier, unsigned int rotation) 963 963 { 964 - const struct drm_format_info *info = drm_format_info(pixel_format); 965 964 int cpp = info->cpp[0]; 966 965 967 966 /* Limit to 4k pixels to guarantee TILEOFF.x doesn't get too big. */ ··· 972 973 973 974 static unsigned int 974 975 hsw_sprite_max_stride(struct intel_plane *plane, 975 - u32 pixel_format, u64 modifier, 976 - unsigned int rotation) 976 + const struct drm_format_info *info, 977 + u64 modifier, unsigned int rotation) 977 978 { 978 - const struct drm_format_info *info = drm_format_info(pixel_format); 979 979 int cpp = info->cpp[0]; 980 980 981 981 /* Limit to 8k pixels to guarantee OFFSET.x doesn't get too big. */
+4 -4
drivers/gpu/drm/i915/display/intel_tc.c
··· 1076 1076 static void xelpdp_tc_power_request_wa(struct intel_display *display, bool enable) 1077 1077 { 1078 1078 /* check if mailbox is running busy */ 1079 - if (intel_de_wait_for_clear(display, TCSS_DISP_MAILBOX_IN_CMD, 1080 - TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) { 1079 + if (intel_de_wait_for_clear_ms(display, TCSS_DISP_MAILBOX_IN_CMD, 1080 + TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) { 1081 1081 drm_dbg_kms(display->drm, 1082 1082 "Timeout waiting for TCSS mailbox run/busy bit to clear\n"); 1083 1083 return; ··· 1089 1089 TCSS_DISP_MAILBOX_IN_CMD_DATA(0x1)); 1090 1090 1091 1091 /* wait to clear mailbox running busy bit before continuing */ 1092 - if (intel_de_wait_for_clear(display, TCSS_DISP_MAILBOX_IN_CMD, 1093 - TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) { 1092 + if (intel_de_wait_for_clear_ms(display, TCSS_DISP_MAILBOX_IN_CMD, 1093 + TCSS_DISP_MAILBOX_IN_CMD_RUN_BUSY, 10)) { 1094 1094 drm_dbg_kms(display->drm, 1095 1095 "Timeout after writing data to mailbox. Mailbox run/busy bit did not clear\n"); 1096 1096 return;
+3 -3
drivers/gpu/drm/i915/display/intel_vrr.c
··· 716 716 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), 717 717 trans_vrr_ctl(old_crtc_state)); 718 718 719 - if (intel_de_wait_for_clear(display, 720 - TRANS_VRR_STATUS(display, cpu_transcoder), 721 - VRR_STATUS_VRR_EN_LIVE, 1000)) 719 + if (intel_de_wait_for_clear_ms(display, 720 + TRANS_VRR_STATUS(display, cpu_transcoder), 721 + VRR_STATUS_VRR_EN_LIVE, 1000)) 722 722 drm_err(display->drm, "Timed out waiting for VRR live status to clear\n"); 723 723 724 724 intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 0);
+12 -13
drivers/gpu/drm/i915/display/skl_universal_plane.c
··· 465 465 466 466 static unsigned int 467 467 plane_max_stride(struct intel_plane *plane, 468 - u32 pixel_format, u64 modifier, 469 - unsigned int rotation, 468 + const struct drm_format_info *info, 469 + u64 modifier, unsigned int rotation, 470 470 unsigned int max_pixels, 471 471 unsigned int max_bytes) 472 472 { 473 - const struct drm_format_info *info = drm_format_info(pixel_format); 474 473 int cpp = info->cpp[0]; 475 474 476 475 if (drm_rotation_90_or_270(rotation)) ··· 480 481 481 482 static unsigned int 482 483 adl_plane_max_stride(struct intel_plane *plane, 483 - u32 pixel_format, u64 modifier, 484 - unsigned int rotation) 484 + const struct drm_format_info *info, 485 + u64 modifier, unsigned int rotation) 485 486 { 486 487 unsigned int max_pixels = 65536; /* PLANE_OFFSET limit */ 487 488 unsigned int max_bytes = 128 * 1024; 488 489 489 - return plane_max_stride(plane, pixel_format, 490 + return plane_max_stride(plane, info, 490 491 modifier, rotation, 491 492 max_pixels, max_bytes); 492 493 } 493 494 494 495 static unsigned int 495 496 skl_plane_max_stride(struct intel_plane *plane, 496 - u32 pixel_format, u64 modifier, 497 - unsigned int rotation) 497 + const struct drm_format_info *info, 498 + u64 modifier, unsigned int rotation) 498 499 { 499 500 unsigned int max_pixels = 8192; /* PLANE_OFFSET limit */ 500 501 unsigned int max_bytes = 32 * 1024; 501 502 502 - return plane_max_stride(plane, pixel_format, 503 + return plane_max_stride(plane, info, 503 504 modifier, rotation, 504 505 max_pixels, max_bytes); 505 506 } ··· 1747 1748 } 1748 1749 1749 1750 if (rotation & DRM_MODE_REFLECT_X && 1750 - fb->modifier == DRM_FORMAT_MOD_LINEAR) { 1751 + fb->modifier == DRM_FORMAT_MOD_LINEAR && 1752 + DISPLAY_VER(display) < 35) { 1751 1753 drm_dbg_kms(display->drm, 1752 1754 "[PLANE:%d:%s] horizontal flip is not supported with linear surface formats\n", 1753 1755 plane->base.base.id, plane->base.name); ··· 3083 3083 3084 3084 fourcc = skl_format_to_fourcc(pixel_format, 3085 3085 val & PLANE_CTL_ORDER_RGBX, alpha); 3086 - fb->format = drm_format_info(fourcc); 3087 3086 3088 3087 tiling = val & PLANE_CTL_TILED_MASK; 3089 3088 switch (tiling) { ··· 3090 3091 fb->modifier = DRM_FORMAT_MOD_LINEAR; 3091 3092 break; 3092 3093 case PLANE_CTL_TILED_X: 3093 - plane_config->tiling = I915_TILING_X; 3094 3094 fb->modifier = I915_FORMAT_MOD_X_TILED; 3095 3095 break; 3096 3096 case PLANE_CTL_TILED_Y: 3097 - plane_config->tiling = I915_TILING_Y; 3098 3097 if (val & PLANE_CTL_RENDER_DECOMPRESSION_ENABLE) 3099 3098 if (DISPLAY_VER(display) >= 14) 3100 3099 fb->modifier = I915_FORMAT_MOD_4_TILED_MTL_RC_CCS; ··· 3132 3135 MISSING_CASE(tiling); 3133 3136 goto error; 3134 3137 } 3138 + 3139 + fb->format = drm_get_format_info(display->drm, fourcc, fb->modifier); 3135 3140 3136 3141 if (!display->params.enable_dpt && 3137 3142 intel_fb_modifier_uses_dpt(display, fb->modifier)) {
+6 -6
drivers/gpu/drm/i915/display/skl_universal_plane_regs.h
··· 324 324 #define PLANE_WM_IGNORE_LINES REG_BIT(30) 325 325 #define PLANE_WM_AUTO_MIN_ALLOC_EN REG_BIT(29) 326 326 #define PLANE_WM_LINES_MASK REG_GENMASK(26, 14) 327 - #define PLANE_WM_BLOCKS_MASK REG_GENMASK(11, 0) 327 + #define PLANE_WM_BLOCKS_MASK REG_GENMASK(12, 0) 328 328 329 329 #define _PLANE_WM_SAGV_1_A 0x70258 330 330 #define _PLANE_WM_SAGV_1_B 0x71258 ··· 375 375 _PLANE_BUF_CFG_1_A, _PLANE_BUF_CFG_1_B, \ 376 376 _PLANE_BUF_CFG_2_A, _PLANE_BUF_CFG_2_B) 377 377 378 - /* skl+: 10 bits, icl+ 11 bits, adlp+ 12 bits */ 379 - #define PLANE_BUF_END_MASK REG_GENMASK(27, 16) 378 + /* skl+: 10 bits, icl+ 11 bits, adlp+ 12 bits, xe3p_lpd 13 bits */ 379 + #define PLANE_BUF_END_MASK REG_GENMASK(28, 16) 380 380 #define PLANE_BUF_END(end) REG_FIELD_PREP(PLANE_BUF_END_MASK, (end)) 381 - #define PLANE_BUF_START_MASK REG_GENMASK(11, 0) 381 + #define PLANE_BUF_START_MASK REG_GENMASK(12, 0) 382 382 #define PLANE_BUF_START(start) REG_FIELD_PREP(PLANE_BUF_START_MASK, (start)) 383 383 384 384 #define _PLANE_MIN_BUF_CFG_1_A 0x70274 ··· 389 389 _PLANE_MIN_BUF_CFG_1_A, _PLANE_MIN_BUF_CFG_1_B, \ 390 390 _PLANE_MIN_BUF_CFG_2_A, _PLANE_MIN_BUF_CFG_2_B) 391 391 #define PLANE_AUTO_MIN_DBUF_EN REG_BIT(31) 392 - #define PLANE_MIN_DBUF_BLOCKS_MASK REG_GENMASK(27, 16) 392 + #define PLANE_MIN_DBUF_BLOCKS_MASK REG_GENMASK(28, 16) 393 393 #define PLANE_MIN_DBUF_BLOCKS(val) REG_FIELD_PREP(PLANE_MIN_DBUF_BLOCKS_MASK, (val)) 394 - #define PLANE_INTERIM_DBUF_BLOCKS_MASK REG_GENMASK(11, 0) 394 + #define PLANE_INTERIM_DBUF_BLOCKS_MASK REG_GENMASK(12, 0) 395 395 #define PLANE_INTERIM_DBUF_BLOCKS(val) REG_FIELD_PREP(PLANE_INTERIM_DBUF_BLOCKS_MASK, (val)) 396 396 397 397 /* tgl+ */
+32 -8
drivers/gpu/drm/i915/display/skl_watermark.c
··· 635 635 { 636 636 struct intel_display *display = to_intel_display(crtc_state); 637 637 struct intel_plane *plane = to_intel_plane(crtc_state->uapi.crtc->cursor); 638 + const struct drm_mode_config *mode_config = &display->drm->mode_config; 639 + const struct drm_format_info *info; 638 640 struct skl_wm_level wm = {}; 639 641 int ret, min_ddb_alloc = 0; 640 642 struct skl_wm_params wp; 643 + u64 modifier; 644 + u32 format; 641 645 int level; 642 646 643 - ret = skl_compute_wm_params(crtc_state, 256, 644 - drm_format_info(DRM_FORMAT_ARGB8888), 645 - DRM_FORMAT_MOD_LINEAR, 646 - DRM_MODE_ROTATE_0, 647 + format = DRM_FORMAT_ARGB8888; 648 + modifier = DRM_FORMAT_MOD_LINEAR; 649 + 650 + info = drm_get_format_info(display->drm, format, modifier); 651 + 652 + ret = skl_compute_wm_params(crtc_state, mode_config->cursor_width, 653 + info, modifier, DRM_MODE_ROTATE_0, 647 654 crtc_state->pixel_rate, &wp, 0, 0); 648 655 drm_WARN_ON(display->drm, ret); 649 656 ··· 1819 1812 1820 1813 if (wp->y_tiled) { 1821 1814 selected_result = max_fixed16(method2, wp->y_tile_minimum); 1815 + } else if (DISPLAY_VER(display) >= 35) { 1816 + selected_result = method2; 1822 1817 } else { 1823 1818 if ((wp->cpp * crtc_state->hw.pipe_mode.crtc_htotal / 1824 1819 wp->dbuf_block_size < 1) && ··· 3192 3183 int level, num_levels = display->wm.num_levels; 3193 3184 3194 3185 /* 3186 + * Xe3p and beyond should ignore level 0's reported latency and 3187 + * always apply WaWmMemoryReadLatency logic. 3188 + */ 3189 + if (DISPLAY_VER(display) >= 35) 3190 + wm[0] = 0; 3191 + 3192 + /* 3195 3193 * If a level n (n > 1) has a 0us latency, all levels m (m >= n) 3196 3194 * need to be disabled. We make sure to sanitize the values out 3197 3195 * of the punit to satisfy this requirement. ··· 3493 3477 if (!HAS_MBUS_JOINING(display)) 3494 3478 return; 3495 3479 3496 - if (DISPLAY_VER(display) >= 20) 3480 + if (DISPLAY_VER(display) >= 35) 3481 + intel_de_rmw(display, MBUS_CTL, XE3P_MBUS_TRANSLATION_THROTTLE_MIN_MASK, 3482 + XE3P_MBUS_TRANSLATION_THROTTLE_MIN(ratio - 1)); 3483 + else if (DISPLAY_VER(display) >= 20) 3497 3484 intel_de_rmw(display, MBUS_CTL, MBUS_TRANSLATION_THROTTLE_MIN_MASK, 3498 3485 MBUS_TRANSLATION_THROTTLE_MIN(ratio - 1)); 3499 3486 ··· 3507 3488 ratio, str_yes_no(joined_mbus)); 3508 3489 3509 3490 for_each_dbuf_slice(display, slice) 3510 - intel_de_rmw(display, DBUF_CTL_S(slice), 3511 - DBUF_MIN_TRACKER_STATE_SERVICE_MASK, 3512 - DBUF_MIN_TRACKER_STATE_SERVICE(ratio - 1)); 3491 + if (DISPLAY_VER(display) >= 35) 3492 + intel_de_rmw(display, DBUF_CTL_S(slice), 3493 + XE3P_DBUF_MIN_TRACKER_STATE_SERVICE_MASK, 3494 + XE3P_DBUF_MIN_TRACKER_STATE_SERVICE(ratio - 1)); 3495 + else 3496 + intel_de_rmw(display, DBUF_CTL_S(slice), 3497 + DBUF_MIN_TRACKER_STATE_SERVICE_MASK, 3498 + DBUF_MIN_TRACKER_STATE_SERVICE(ratio - 1)); 3513 3499 } 3514 3500 3515 3501 static void intel_dbuf_mdclk_min_tracker_update(struct intel_atomic_state *state)
+28 -24
drivers/gpu/drm/i915/display/skl_watermark_regs.h
··· 32 32 #define MBUS_BBOX_CTL_S1 _MMIO(0x45040) 33 33 #define MBUS_BBOX_CTL_S2 _MMIO(0x45044) 34 34 35 - #define MBUS_CTL _MMIO(0x4438C) 36 - #define MBUS_JOIN REG_BIT(31) 37 - #define MBUS_HASHING_MODE_MASK REG_BIT(30) 38 - #define MBUS_HASHING_MODE_2x2 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 0) 39 - #define MBUS_HASHING_MODE_1x4 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 1) 40 - #define MBUS_JOIN_PIPE_SELECT_MASK REG_GENMASK(28, 26) 41 - #define MBUS_JOIN_PIPE_SELECT(pipe) REG_FIELD_PREP(MBUS_JOIN_PIPE_SELECT_MASK, pipe) 42 - #define MBUS_JOIN_PIPE_SELECT_NONE MBUS_JOIN_PIPE_SELECT(7) 43 - #define MBUS_TRANSLATION_THROTTLE_MIN_MASK REG_GENMASK(15, 13) 44 - #define MBUS_TRANSLATION_THROTTLE_MIN(val) REG_FIELD_PREP(MBUS_TRANSLATION_THROTTLE_MIN_MASK, val) 35 + #define MBUS_CTL _MMIO(0x4438C) 36 + #define MBUS_JOIN REG_BIT(31) 37 + #define MBUS_HASHING_MODE_MASK REG_BIT(30) 38 + #define MBUS_HASHING_MODE_2x2 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 0) 39 + #define MBUS_HASHING_MODE_1x4 REG_FIELD_PREP(MBUS_HASHING_MODE_MASK, 1) 40 + #define MBUS_JOIN_PIPE_SELECT_MASK REG_GENMASK(28, 26) 41 + #define MBUS_JOIN_PIPE_SELECT(pipe) REG_FIELD_PREP(MBUS_JOIN_PIPE_SELECT_MASK, pipe) 42 + #define MBUS_JOIN_PIPE_SELECT_NONE MBUS_JOIN_PIPE_SELECT(7) 43 + #define XE3P_MBUS_TRANSLATION_THROTTLE_MIN_MASK REG_GENMASK(16, 13) 44 + #define XE3P_MBUS_TRANSLATION_THROTTLE_MIN(val) REG_FIELD_PREP(XE3P_MBUS_TRANSLATION_THROTTLE_MIN_MASK, val) 45 + #define MBUS_TRANSLATION_THROTTLE_MIN_MASK REG_GENMASK(15, 13) 46 + #define MBUS_TRANSLATION_THROTTLE_MIN(val) REG_FIELD_PREP(MBUS_TRANSLATION_THROTTLE_MIN_MASK, val) 45 47 46 48 /* 47 49 * The below are numbered starting from "S1" on gen11/gen12, but starting ··· 53 51 * way things will be named by the hardware team going forward, plus it's more 54 52 * consistent with how most of the rest of our registers are named. 55 53 */ 56 - #define _DBUF_CTL_S0 0x45008 57 - #define _DBUF_CTL_S1 0x44FE8 58 - #define _DBUF_CTL_S2 0x44300 59 - #define _DBUF_CTL_S3 0x44304 60 - #define DBUF_CTL_S(slice) _MMIO(_PICK(slice, \ 61 - _DBUF_CTL_S0, \ 62 - _DBUF_CTL_S1, \ 63 - _DBUF_CTL_S2, \ 64 - _DBUF_CTL_S3)) 65 - #define DBUF_POWER_REQUEST REG_BIT(31) 66 - #define DBUF_POWER_STATE REG_BIT(30) 67 - #define DBUF_TRACKER_STATE_SERVICE_MASK REG_GENMASK(23, 19) 68 - #define DBUF_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(DBUF_TRACKER_STATE_SERVICE_MASK, x) 69 - #define DBUF_MIN_TRACKER_STATE_SERVICE_MASK REG_GENMASK(18, 16) /* ADL-P+ */ 54 + #define _DBUF_CTL_S0 0x45008 55 + #define _DBUF_CTL_S1 0x44FE8 56 + #define _DBUF_CTL_S2 0x44300 57 + #define _DBUF_CTL_S3 0x44304 58 + #define DBUF_CTL_S(slice) _MMIO(_PICK(slice, \ 59 + _DBUF_CTL_S0, \ 60 + _DBUF_CTL_S1, \ 61 + _DBUF_CTL_S2, \ 62 + _DBUF_CTL_S3)) 63 + #define DBUF_POWER_REQUEST REG_BIT(31) 64 + #define DBUF_POWER_STATE REG_BIT(30) 65 + #define DBUF_TRACKER_STATE_SERVICE_MASK REG_GENMASK(23, 19) 66 + #define DBUF_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(DBUF_TRACKER_STATE_SERVICE_MASK, x) 67 + #define XE3P_DBUF_MIN_TRACKER_STATE_SERVICE_MASK REG_GENMASK(20, 16) 68 + #define XE3P_DBUF_MIN_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(XE3P_DBUF_MIN_TRACKER_STATE_SERVICE_MASK, x) 69 + #define DBUF_MIN_TRACKER_STATE_SERVICE_MASK REG_GENMASK(18, 16) /* ADL-P+ */ 70 70 #define DBUF_MIN_TRACKER_STATE_SERVICE(x) REG_FIELD_PREP(DBUF_MIN_TRACKER_STATE_SERVICE_MASK, x) /* ADL-P+ */ 71 71 72 72 #define MTL_LATENCY_LP0_LP1 _MMIO(0x45780)
+27 -27
drivers/gpu/drm/i915/display/vlv_dsi.c
··· 94 94 mask = LP_CTRL_FIFO_EMPTY | HS_CTRL_FIFO_EMPTY | 95 95 LP_DATA_FIFO_EMPTY | HS_DATA_FIFO_EMPTY; 96 96 97 - if (intel_de_wait_for_set(display, MIPI_GEN_FIFO_STAT(display, port), 98 - mask, 100)) 97 + if (intel_de_wait_for_set_ms(display, MIPI_GEN_FIFO_STAT(display, port), 98 + mask, 100)) 99 99 drm_err(display->drm, "DPI FIFOs are not empty\n"); 100 100 } 101 101 ··· 162 162 163 163 /* note: this is never true for reads */ 164 164 if (packet.payload_length) { 165 - if (intel_de_wait_for_clear(display, MIPI_GEN_FIFO_STAT(display, port), 166 - data_mask, 50)) 165 + if (intel_de_wait_for_clear_ms(display, MIPI_GEN_FIFO_STAT(display, port), 166 + data_mask, 50)) 167 167 drm_err(display->drm, 168 168 "Timeout waiting for HS/LP DATA FIFO !full\n"); 169 169 ··· 176 176 GEN_READ_DATA_AVAIL); 177 177 } 178 178 179 - if (intel_de_wait_for_clear(display, MIPI_GEN_FIFO_STAT(display, port), 180 - ctrl_mask, 50)) { 179 + if (intel_de_wait_for_clear_ms(display, MIPI_GEN_FIFO_STAT(display, port), 180 + ctrl_mask, 50)) { 181 181 drm_err(display->drm, 182 182 "Timeout waiting for HS/LP CTRL FIFO !full\n"); 183 183 } ··· 188 188 /* ->rx_len is set only for reads */ 189 189 if (msg->rx_len) { 190 190 data_mask = GEN_READ_DATA_AVAIL; 191 - if (intel_de_wait_for_set(display, MIPI_INTR_STAT(display, port), 192 - data_mask, 50)) 191 + if (intel_de_wait_for_set_ms(display, MIPI_INTR_STAT(display, port), 192 + data_mask, 50)) 193 193 drm_err(display->drm, 194 194 "Timeout waiting for read data.\n"); 195 195 ··· 246 246 intel_de_write(display, MIPI_DPI_CONTROL(display, port), cmd); 247 247 248 248 mask = SPL_PKT_SENT_INTERRUPT; 249 - if (intel_de_wait_for_set(display, MIPI_INTR_STAT(display, port), mask, 100)) 249 + if (intel_de_wait_for_set_ms(display, MIPI_INTR_STAT(display, port), mask, 100)) 250 250 drm_err(display->drm, 251 251 "Video mode command 0x%08x send failed.\n", cmd); 252 252 ··· 352 352 353 353 /* Wait for Pwr ACK */ 354 354 for_each_dsi_port(port, intel_dsi->ports) { 355 - if (intel_de_wait_for_set(display, MIPI_CTRL(display, port), 356 - GLK_MIPIIO_PORT_POWERED, 20)) 355 + if (intel_de_wait_for_set_ms(display, MIPI_CTRL(display, port), 356 + GLK_MIPIIO_PORT_POWERED, 20)) 357 357 drm_err(display->drm, "MIPIO port is powergated\n"); 358 358 } 359 359 ··· 374 374 375 375 /* Wait for MIPI PHY status bit to set */ 376 376 for_each_dsi_port(port, intel_dsi->ports) { 377 - if (intel_de_wait_for_set(display, MIPI_CTRL(display, port), 378 - GLK_PHY_STATUS_PORT_READY, 20)) 377 + if (intel_de_wait_for_set_ms(display, MIPI_CTRL(display, port), 378 + GLK_PHY_STATUS_PORT_READY, 20)) 379 379 drm_err(display->drm, "PHY is not ON\n"); 380 380 } 381 381 ··· 394 394 ULPS_STATE_MASK, ULPS_STATE_ENTER | DEVICE_READY); 395 395 396 396 /* Wait for ULPS active */ 397 - if (intel_de_wait_for_clear(display, MIPI_CTRL(display, port), 398 - GLK_ULPS_NOT_ACTIVE, 20)) 397 + if (intel_de_wait_for_clear_ms(display, MIPI_CTRL(display, port), 398 + GLK_ULPS_NOT_ACTIVE, 20)) 399 399 drm_err(display->drm, "ULPS not active\n"); 400 400 401 401 /* Exit ULPS */ ··· 413 413 414 414 /* Wait for Stop state */ 415 415 for_each_dsi_port(port, intel_dsi->ports) { 416 - if (intel_de_wait_for_set(display, MIPI_CTRL(display, port), 417 - GLK_DATA_LANE_STOP_STATE, 20)) 416 + if (intel_de_wait_for_set_ms(display, MIPI_CTRL(display, port), 417 + GLK_DATA_LANE_STOP_STATE, 20)) 418 418 drm_err(display->drm, 419 419 "Date lane not in STOP state\n"); 420 420 } 421 421 422 422 /* Wait for AFE LATCH */ 423 423 for_each_dsi_port(port, intel_dsi->ports) { 424 - if (intel_de_wait_for_set(display, BXT_MIPI_PORT_CTRL(port), 425 - AFE_LATCHOUT, 20)) 424 + if (intel_de_wait_for_set_ms(display, BXT_MIPI_PORT_CTRL(port), 425 + AFE_LATCHOUT, 20)) 426 426 drm_err(display->drm, 427 427 "D-PHY not entering LP-11 state\n"); 428 428 } ··· 519 519 520 520 /* Wait for MIPI PHY status bit to unset */ 521 521 for_each_dsi_port(port, intel_dsi->ports) { 522 - if (intel_de_wait_for_clear(display, MIPI_CTRL(display, port), 523 - GLK_PHY_STATUS_PORT_READY, 20)) 522 + if (intel_de_wait_for_clear_ms(display, MIPI_CTRL(display, port), 523 + GLK_PHY_STATUS_PORT_READY, 20)) 524 524 drm_err(display->drm, "PHY is not turning OFF\n"); 525 525 } 526 526 527 527 /* Wait for Pwr ACK bit to unset */ 528 528 for_each_dsi_port(port, intel_dsi->ports) { 529 - if (intel_de_wait_for_clear(display, MIPI_CTRL(display, port), 530 - GLK_MIPIIO_PORT_POWERED, 20)) 529 + if (intel_de_wait_for_clear_ms(display, MIPI_CTRL(display, port), 530 + GLK_MIPIIO_PORT_POWERED, 20)) 531 531 drm_err(display->drm, 532 532 "MIPI IO Port is not powergated\n"); 533 533 } ··· 544 544 545 545 /* Wait for MIPI PHY status bit to unset */ 546 546 for_each_dsi_port(port, intel_dsi->ports) { 547 - if (intel_de_wait_for_clear(display, MIPI_CTRL(display, port), 548 - GLK_PHY_STATUS_PORT_READY, 20)) 547 + if (intel_de_wait_for_clear_ms(display, MIPI_CTRL(display, port), 548 + GLK_PHY_STATUS_PORT_READY, 20)) 549 549 drm_err(display->drm, "PHY is not turning OFF\n"); 550 550 } 551 551 ··· 595 595 * Port A only. MIPI Port C has no similar bit for checking. 596 596 */ 597 597 if ((display->platform.broxton || port == PORT_A) && 598 - intel_de_wait_for_clear(display, port_ctrl, 599 - AFE_LATCHOUT, 30)) 598 + intel_de_wait_for_clear_ms(display, port_ctrl, 599 + AFE_LATCHOUT, 30)) 600 600 drm_err(display->drm, "DSI LP not going Low\n"); 601 601 602 602 /* Disable MIPI PHY transparent latch */
+4 -4
drivers/gpu/drm/i915/display/vlv_dsi_pll.c
··· 319 319 * PLL lock should deassert within 200us. 320 320 * Wait up to 1ms before timing out. 321 321 */ 322 - if (intel_de_wait_for_clear(display, BXT_DSI_PLL_ENABLE, 323 - BXT_DSI_PLL_LOCKED, 1)) 322 + if (intel_de_wait_for_clear_ms(display, BXT_DSI_PLL_ENABLE, 323 + BXT_DSI_PLL_LOCKED, 1)) 324 324 drm_err(display->drm, 325 325 "Timeout waiting for PLL lock deassertion\n"); 326 326 } ··· 568 568 intel_de_rmw(display, BXT_DSI_PLL_ENABLE, 0, BXT_DSI_PLL_DO_ENABLE); 569 569 570 570 /* Timeout and fail if PLL not locked */ 571 - if (intel_de_wait_for_set(display, BXT_DSI_PLL_ENABLE, 572 - BXT_DSI_PLL_LOCKED, 1)) { 571 + if (intel_de_wait_for_set_ms(display, BXT_DSI_PLL_ENABLE, 572 + BXT_DSI_PLL_LOCKED, 1)) { 573 573 drm_err(display->drm, 574 574 "Timed out waiting for DSI PLL to lock\n"); 575 575 return;
+2 -2
drivers/gpu/drm/i915/gem/i915_gem_create.c
··· 194 194 args->pitch = ALIGN(args->width * cpp, 64); 195 195 196 196 /* align stride to page size so that we can remap */ 197 - if (args->pitch > intel_plane_fb_max_stride(dev, format, 198 - DRM_FORMAT_MOD_LINEAR)) 197 + if (args->pitch > intel_dumb_fb_max_stride(dev, format, 198 + DRM_FORMAT_MOD_LINEAR)) 199 199 args->pitch = ALIGN(args->pitch, 4096); 200 200 201 201 if (args->pitch < args->width)
+8 -8
drivers/gpu/drm/i915/gem/i915_gem_object.c
··· 477 477 void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj, 478 478 enum fb_op_origin origin) 479 479 { 480 - struct intel_frontbuffer *front; 480 + struct i915_frontbuffer *front; 481 481 482 - front = i915_gem_object_get_frontbuffer(obj); 482 + front = i915_gem_object_frontbuffer_lookup(obj); 483 483 if (front) { 484 - intel_frontbuffer_flush(front, origin); 485 - intel_frontbuffer_put(front); 484 + intel_frontbuffer_flush(&front->base, origin); 485 + i915_gem_object_frontbuffer_put(front); 486 486 } 487 487 } 488 488 489 489 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj, 490 490 enum fb_op_origin origin) 491 491 { 492 - struct intel_frontbuffer *front; 492 + struct i915_frontbuffer *front; 493 493 494 - front = i915_gem_object_get_frontbuffer(obj); 494 + front = i915_gem_object_frontbuffer_lookup(obj); 495 495 if (front) { 496 - intel_frontbuffer_invalidate(front, origin); 497 - intel_frontbuffer_put(front); 496 + intel_frontbuffer_invalidate(&front->base, origin); 497 + i915_gem_object_frontbuffer_put(front); 498 498 } 499 499 } 500 500
+103
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* Copyright © 2025 Intel Corporation */ 3 + 4 + #include "i915_drv.h" 5 + #include "i915_gem_object_frontbuffer.h" 6 + 7 + static int frontbuffer_active(struct i915_active *ref) 8 + { 9 + struct i915_frontbuffer *front = 10 + container_of(ref, typeof(*front), write); 11 + 12 + kref_get(&front->ref); 13 + return 0; 14 + } 15 + 16 + static void frontbuffer_retire(struct i915_active *ref) 17 + { 18 + struct i915_frontbuffer *front = 19 + container_of(ref, typeof(*front), write); 20 + 21 + intel_frontbuffer_flush(&front->base, ORIGIN_CS); 22 + i915_gem_object_frontbuffer_put(front); 23 + } 24 + 25 + struct i915_frontbuffer * 26 + i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj) 27 + { 28 + struct drm_i915_private *i915 = to_i915(obj->base.dev); 29 + struct i915_frontbuffer *front, *cur; 30 + 31 + front = i915_gem_object_frontbuffer_lookup(obj); 32 + if (front) 33 + return front; 34 + 35 + front = kmalloc(sizeof(*front), GFP_KERNEL); 36 + if (!front) 37 + return NULL; 38 + 39 + intel_frontbuffer_init(&front->base, &i915->drm); 40 + 41 + kref_init(&front->ref); 42 + i915_gem_object_get(obj); 43 + front->obj = obj; 44 + 45 + i915_active_init(&front->write, 46 + frontbuffer_active, 47 + frontbuffer_retire, 48 + I915_ACTIVE_RETIRE_SLEEPS); 49 + 50 + spin_lock(&i915->frontbuffer_lock); 51 + if (rcu_access_pointer(obj->frontbuffer)) { 52 + cur = rcu_dereference_protected(obj->frontbuffer, true); 53 + kref_get(&cur->ref); 54 + } else { 55 + cur = front; 56 + rcu_assign_pointer(obj->frontbuffer, front); 57 + } 58 + spin_unlock(&i915->frontbuffer_lock); 59 + 60 + if (cur != front) { 61 + i915_gem_object_put(obj); 62 + intel_frontbuffer_fini(&front->base); 63 + kfree(front); 64 + } 65 + 66 + return cur; 67 + } 68 + 69 + void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front) 70 + { 71 + kref_get(&front->ref); 72 + } 73 + 74 + static void frontbuffer_release(struct kref *ref) 75 + __releases(&i915->frontbuffer_lock) 76 + { 77 + struct i915_frontbuffer *front = 78 + container_of(ref, typeof(*front), ref); 79 + struct drm_i915_gem_object *obj = front->obj; 80 + struct drm_i915_private *i915 = to_i915(obj->base.dev); 81 + 82 + i915_ggtt_clear_scanout(obj); 83 + 84 + RCU_INIT_POINTER(obj->frontbuffer, NULL); 85 + 86 + spin_unlock(&i915->frontbuffer_lock); 87 + 88 + i915_active_fini(&front->write); 89 + 90 + i915_gem_object_put(obj); 91 + 92 + intel_frontbuffer_fini(&front->base); 93 + 94 + kfree_rcu(front, rcu); 95 + } 96 + 97 + void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front) 98 + { 99 + struct drm_i915_private *i915 = to_i915(front->obj->base.dev); 100 + 101 + kref_put_lock(&front->ref, frontbuffer_release, 102 + &i915->frontbuffer_lock); 103 + }
+18 -36
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
··· 12 12 #include "display/intel_frontbuffer.h" 13 13 #include "i915_gem_object_types.h" 14 14 15 + struct i915_frontbuffer { 16 + struct intel_frontbuffer base; 17 + struct drm_i915_gem_object *obj; 18 + struct i915_active write; 19 + struct rcu_head rcu; 20 + struct kref ref; 21 + }; 22 + 15 23 void __i915_gem_object_flush_frontbuffer(struct drm_i915_gem_object *obj, 16 24 enum fb_op_origin origin); 17 25 void __i915_gem_object_invalidate_frontbuffer(struct drm_i915_gem_object *obj, ··· 41 33 __i915_gem_object_invalidate_frontbuffer(obj, origin); 42 34 } 43 35 36 + struct i915_frontbuffer *i915_gem_object_frontbuffer_get(struct drm_i915_gem_object *obj); 37 + void i915_gem_object_frontbuffer_ref(struct i915_frontbuffer *front); 38 + void i915_gem_object_frontbuffer_put(struct i915_frontbuffer *front); 39 + 44 40 /** 45 - * i915_gem_object_get_frontbuffer - Get the object's frontbuffer 46 - * @obj: The object whose frontbuffer to get. 41 + * i915_gem_object_frontbuffer_lookup - Look up the object's frontbuffer 42 + * @obj: The object whose frontbuffer to look up. 47 43 * 48 44 * Get pointer to object's frontbuffer if such exists. Please note that RCU 49 45 * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. 50 46 * 51 47 * Return: pointer to object's frontbuffer is such exists or NULL 52 48 */ 53 - static inline struct intel_frontbuffer * 54 - i915_gem_object_get_frontbuffer(const struct drm_i915_gem_object *obj) 49 + static inline struct i915_frontbuffer * 50 + i915_gem_object_frontbuffer_lookup(const struct drm_i915_gem_object *obj) 55 51 { 56 - struct intel_frontbuffer *front; 52 + struct i915_frontbuffer *front; 57 53 58 54 if (likely(!rcu_access_pointer(obj->frontbuffer))) 59 55 return NULL; ··· 74 62 if (likely(front == rcu_access_pointer(obj->frontbuffer))) 75 63 break; 76 64 77 - intel_frontbuffer_put(front); 65 + i915_gem_object_frontbuffer_put(front); 78 66 } while (1); 79 67 rcu_read_unlock(); 80 68 81 69 return front; 82 - } 83 - 84 - /** 85 - * i915_gem_object_set_frontbuffer - Set the object's frontbuffer 86 - * @obj: The object whose frontbuffer to set. 87 - * @front: The frontbuffer to set 88 - * 89 - * Set object's frontbuffer pointer. If frontbuffer is already set for the 90 - * object keep it and return it's pointer to the caller. Please note that RCU 91 - * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. This 92 - * function is protected by i915->display->fb_tracking.lock 93 - * 94 - * Return: pointer to frontbuffer which was set. 95 - */ 96 - static inline struct intel_frontbuffer * 97 - i915_gem_object_set_frontbuffer(struct drm_i915_gem_object *obj, 98 - struct intel_frontbuffer *front) 99 - { 100 - struct intel_frontbuffer *cur = front; 101 - 102 - if (!front) { 103 - RCU_INIT_POINTER(obj->frontbuffer, NULL); 104 - } else if (rcu_access_pointer(obj->frontbuffer)) { 105 - cur = rcu_dereference_protected(obj->frontbuffer, true); 106 - kref_get(&cur->ref); 107 - } else { 108 - rcu_assign_pointer(obj->frontbuffer, front); 109 - } 110 - 111 - return cur; 112 70 } 113 71 114 72 #endif
+1 -1
drivers/gpu/drm/i915/gem/i915_gem_object_types.h
··· 574 574 */ 575 575 u16 write_domain; 576 576 577 - struct intel_frontbuffer __rcu *frontbuffer; 577 + struct i915_frontbuffer __rcu *frontbuffer; 578 578 579 579 /** Current tiling stride for the object, if it's tiled. */ 580 580 unsigned int tiling_and_stride;
+2
drivers/gpu/drm/i915/i915_drv.h
··· 311 311 struct file *mmap_singleton; 312 312 } gem; 313 313 314 + spinlock_t frontbuffer_lock; /* protects obj->frontbuffer (write-side) */ 315 + 314 316 struct intel_pxp *pxp; 315 317 316 318 struct i915_pmu pmu;
+2
drivers/gpu/drm/i915/i915_gem.c
··· 1299 1299 { 1300 1300 i915_gem_init__mm(dev_priv); 1301 1301 i915_gem_init__contexts(dev_priv); 1302 + 1303 + spin_lock_init(&dev_priv->frontbuffer_lock); 1302 1304 } 1303 1305 1304 1306 void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
+1
drivers/gpu/drm/i915/i915_reg.h
··· 1233 1233 #define OROM_OFFSET_MASK REG_GENMASK(20, 16) 1234 1234 1235 1235 #define MTL_MEM_SS_INFO_GLOBAL _MMIO(0x45700) 1236 + #define XE3P_ECC_IMPACTING_DE REG_BIT(12) 1236 1237 #define MTL_N_OF_ENABLED_QGV_POINTS_MASK REG_GENMASK(11, 8) 1237 1238 #define MTL_N_OF_POPULATED_CH_MASK REG_GENMASK(7, 4) 1238 1239 #define MTL_DDR_TYPE_MASK REG_GENMASK(3, 0)
+4 -4
drivers/gpu/drm/i915/i915_vma.c
··· 1992 1992 } 1993 1993 1994 1994 if (flags & EXEC_OBJECT_WRITE) { 1995 - struct intel_frontbuffer *front; 1995 + struct i915_frontbuffer *front; 1996 1996 1997 - front = i915_gem_object_get_frontbuffer(obj); 1997 + front = i915_gem_object_frontbuffer_lookup(obj); 1998 1998 if (unlikely(front)) { 1999 - if (intel_frontbuffer_invalidate(front, ORIGIN_CS)) 1999 + if (intel_frontbuffer_invalidate(&front->base, ORIGIN_CS)) 2000 2000 i915_active_add_request(&front->write, rq); 2001 - intel_frontbuffer_put(front); 2001 + i915_gem_object_frontbuffer_put(front); 2002 2002 } 2003 2003 } 2004 2004
+4
drivers/gpu/drm/i915/soc/intel_dram.c
··· 686 686 687 687 static int xelpdp_get_dram_info(struct drm_i915_private *i915, struct dram_info *dram_info) 688 688 { 689 + struct intel_display *display = i915->display; 689 690 u32 val = intel_uncore_read(&i915->uncore, MTL_MEM_SS_INFO_GLOBAL); 690 691 691 692 switch (REG_FIELD_GET(MTL_DDR_TYPE_MASK, val)) { ··· 724 723 dram_info->num_channels = REG_FIELD_GET(MTL_N_OF_POPULATED_CH_MASK, val); 725 724 dram_info->num_qgv_points = REG_FIELD_GET(MTL_N_OF_ENABLED_QGV_POINTS_MASK, val); 726 725 /* PSF GV points not supported in D14+ */ 726 + 727 + if (DISPLAY_VER(display) >= 35) 728 + dram_info->ecc_impacting_de_bw = REG_FIELD_GET(XE3P_ECC_IMPACTING_DE, val); 727 729 728 730 return 0; 729 731 }
+1
drivers/gpu/drm/i915/soc/intel_dram.h
··· 30 30 u8 num_channels; 31 31 u8 num_qgv_points; 32 32 u8 num_psf_gv_points; 33 + bool ecc_impacting_de_bw; /* Only valid from Xe3p_LPD onward. */ 33 34 bool symmetric_memory; 34 35 bool has_16gb_dimms; 35 36 };
+4 -3
drivers/gpu/drm/i915/soc/intel_rom.c
··· 39 39 return spi_read32(rom, offset) & 0xffff; 40 40 } 41 41 42 - struct intel_rom *intel_rom_spi(struct drm_i915_private *i915) 42 + struct intel_rom *intel_rom_spi(struct drm_device *drm) 43 43 { 44 + struct drm_i915_private *i915 = to_i915(drm); 44 45 struct intel_rom *rom; 45 46 u32 static_region; 46 47 ··· 86 85 pci_unmap_rom(rom->pdev, rom->oprom); 87 86 } 88 87 89 - struct intel_rom *intel_rom_pci(struct drm_i915_private *i915) 88 + struct intel_rom *intel_rom_pci(struct drm_device *drm) 90 89 { 91 90 struct intel_rom *rom; 92 91 ··· 94 93 if (!rom) 95 94 return NULL; 96 95 97 - rom->pdev = to_pci_dev(i915->drm.dev); 96 + rom->pdev = to_pci_dev(drm->dev); 98 97 99 98 rom->oprom = pci_map_rom(rom->pdev, &rom->size); 100 99 if (!rom->oprom) {
+3 -3
drivers/gpu/drm/i915/soc/intel_rom.h
··· 8 8 9 9 #include <linux/types.h> 10 10 11 - struct drm_i915_private; 11 + struct drm_device; 12 12 struct intel_rom; 13 13 14 - struct intel_rom *intel_rom_spi(struct drm_i915_private *i915); 15 - struct intel_rom *intel_rom_pci(struct drm_i915_private *i915); 14 + struct intel_rom *intel_rom_spi(struct drm_device *drm); 15 + struct intel_rom *intel_rom_pci(struct drm_device *drm); 16 16 17 17 u32 intel_rom_read32(struct intel_rom *rom, loff_t offset); 18 18 u16 intel_rom_read16(struct intel_rom *rom, loff_t offset);
-2
drivers/gpu/drm/xe/compat-i915-headers/i915_vma.h
··· 26 26 struct xe_ggtt_node *node; 27 27 }; 28 28 29 - #define i915_ggtt_clear_scanout(bo) do { } while (0) 30 - 31 29 #define i915_vma_fence_id(vma) -1 32 30 33 31 static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
+10 -21
drivers/gpu/drm/xe/compat-i915-headers/intel_uncore.h
··· 91 91 return xe_mmio_rmw32(__compat_uncore_to_mmio(uncore), reg, clear, set); 92 92 } 93 93 94 - static inline int intel_wait_for_register(struct intel_uncore *uncore, 95 - i915_reg_t i915_reg, u32 mask, 96 - u32 value, unsigned int timeout) 97 - { 98 - struct xe_reg reg = XE_REG(i915_mmio_reg_offset(i915_reg)); 99 - 100 - return xe_mmio_wait32(__compat_uncore_to_mmio(uncore), reg, mask, value, 101 - timeout * USEC_PER_MSEC, NULL, false); 102 - } 103 - 104 - static inline int intel_wait_for_register_fw(struct intel_uncore *uncore, 105 - i915_reg_t i915_reg, u32 mask, 106 - u32 value, unsigned int timeout, 107 - u32 *out_value) 108 - { 109 - struct xe_reg reg = XE_REG(i915_mmio_reg_offset(i915_reg)); 110 - 111 - return xe_mmio_wait32(__compat_uncore_to_mmio(uncore), reg, mask, value, 112 - timeout * USEC_PER_MSEC, out_value, false); 113 - } 114 - 115 94 static inline int 116 95 __intel_wait_for_register(struct intel_uncore *uncore, i915_reg_t i915_reg, 117 96 u32 mask, u32 value, unsigned int fast_timeout_us, ··· 110 131 return xe_mmio_wait32(__compat_uncore_to_mmio(uncore), reg, mask, value, 111 132 fast_timeout_us + 1000 * slow_timeout_ms, 112 133 out_value, atomic); 134 + } 135 + 136 + static inline int 137 + __intel_wait_for_register_fw(struct intel_uncore *uncore, i915_reg_t i915_reg, 138 + u32 mask, u32 value, unsigned int fast_timeout_us, 139 + unsigned int slow_timeout_ms, u32 *out_value) 140 + { 141 + return __intel_wait_for_register(uncore, i915_reg, mask, value, 142 + fast_timeout_us, slow_timeout_ms, 143 + out_value); 113 144 } 114 145 115 146 static inline u32 intel_uncore_read_fw(struct intel_uncore *uncore,
+51 -9
drivers/gpu/drm/xe/display/intel_bo.c
··· 5 5 6 6 #include "xe_bo.h" 7 7 #include "intel_bo.h" 8 + #include "intel_frontbuffer.h" 8 9 9 10 bool intel_bo_is_tiled(struct drm_gem_object *obj) 10 11 { ··· 29 28 return xe_bo_is_protected(gem_to_xe_bo(obj)); 30 29 } 31 30 32 - void intel_bo_flush_if_display(struct drm_gem_object *obj) 33 - { 34 - } 35 - 36 31 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) 37 32 { 38 33 return drm_gem_prime_mmap(obj, vma); ··· 41 44 return xe_bo_read(bo, offset, dst, size); 42 45 } 43 46 44 - struct intel_frontbuffer *intel_bo_get_frontbuffer(struct drm_gem_object *obj) 47 + struct xe_frontbuffer { 48 + struct intel_frontbuffer base; 49 + struct drm_gem_object *obj; 50 + struct kref ref; 51 + }; 52 + 53 + struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj) 45 54 { 46 - return NULL; 55 + struct xe_frontbuffer *front; 56 + 57 + front = kmalloc(sizeof(*front), GFP_KERNEL); 58 + if (!front) 59 + return NULL; 60 + 61 + intel_frontbuffer_init(&front->base, obj->dev); 62 + 63 + kref_init(&front->ref); 64 + 65 + drm_gem_object_get(obj); 66 + front->obj = obj; 67 + 68 + return &front->base; 47 69 } 48 70 49 - struct intel_frontbuffer *intel_bo_set_frontbuffer(struct drm_gem_object *obj, 50 - struct intel_frontbuffer *front) 71 + void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front) 51 72 { 52 - return front; 73 + struct xe_frontbuffer *front = 74 + container_of(_front, typeof(*front), base); 75 + 76 + kref_get(&front->ref); 77 + } 78 + 79 + static void frontbuffer_release(struct kref *ref) 80 + { 81 + struct xe_frontbuffer *front = 82 + container_of(ref, typeof(*front), ref); 83 + 84 + intel_frontbuffer_fini(&front->base); 85 + 86 + drm_gem_object_put(front->obj); 87 + 88 + kfree(front); 89 + } 90 + 91 + void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front) 92 + { 93 + struct xe_frontbuffer *front = 94 + container_of(_front, typeof(*front), base); 95 + 96 + kref_put(&front->ref, frontbuffer_release); 97 + } 98 + 99 + void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front) 100 + { 53 101 } 54 102 55 103 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj)
-3
drivers/gpu/drm/xe/xe_device_types.h
··· 656 656 */ 657 657 u32 edram_size_mb; 658 658 659 - /* To shut up runtime pm macros.. */ 660 - struct xe_runtime_pm {} runtime_pm; 661 - 662 659 struct intel_uncore { 663 660 spinlock_t lock; 664 661 } uncore;