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

Merge tag 'drm-next-2022-03-25' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Dave Airlie:
"Some fixes were queued up in and in light of the fbdev regressions,
I've pulled those in as well.

core:
- Make audio and color plane support checking only happen when a CEA
extension block is found.
- Small selftest fix.

fbdev:
- two regressions fixes from speedup patches.

ttm:
- Fix a small regression from ttm_resource_fini()

i915:
- Reject unsupported TMDS rates on ICL+
- Treat SAGV block time 0 as SAGV disabled
- Fix PSF GV point mask when SAGV is not possible
- Fix renamed INTEL_INFO->media.arch/ver field"

* tag 'drm-next-2022-03-25' of git://anongit.freedesktop.org/drm/drm:
fbdev: Fix cfb_imageblit() for arbitrary image widths
fbdev: Fix sys_imageblit() for arbitrary image widths
drm/edid: fix CEA extension byte #3 parsing
drm/edid: check basic audio support on CEA extension block
drm/i915: Fix renamed struct field
drm/i915: Fix PSF GV point mask when SAGV is not possible
drm/i915: Treat SAGV block time 0 as SAGV disabled
drm/i915: Reject unsupported TMDS rates on ICL+
drm/selftest: plane_helper: Put test structures in static storage
drm/ttm: Fix a kernel oops due to an invalid read

+82 -24
+10 -5
drivers/gpu/drm/drm_edid.c
··· 4859 4859 if (!edid_ext) 4860 4860 goto end; 4861 4861 4862 - has_audio = ((edid_ext[3] & EDID_BASIC_AUDIO) != 0); 4862 + has_audio = (edid_ext[0] == CEA_EXT && 4863 + (edid_ext[3] & EDID_BASIC_AUDIO) != 0); 4863 4864 4864 4865 if (has_audio) { 4865 4866 DRM_DEBUG_KMS("Monitor has basic audio support\n"); ··· 5188 5187 5189 5188 /* The existence of a CEA block should imply RGB support */ 5190 5189 info->color_formats = DRM_COLOR_FORMAT_RGB444; 5191 - if (edid_ext[3] & EDID_CEA_YCRCB444) 5192 - info->color_formats |= DRM_COLOR_FORMAT_YCBCR444; 5193 - if (edid_ext[3] & EDID_CEA_YCRCB422) 5194 - info->color_formats |= DRM_COLOR_FORMAT_YCBCR422; 5190 + 5191 + /* CTA DisplayID Data Block does not have byte #3 */ 5192 + if (edid_ext[0] == CEA_EXT) { 5193 + if (edid_ext[3] & EDID_CEA_YCRCB444) 5194 + info->color_formats |= DRM_COLOR_FORMAT_YCBCR444; 5195 + if (edid_ext[3] & EDID_CEA_YCRCB422) 5196 + info->color_formats |= DRM_COLOR_FORMAT_YCBCR422; 5197 + } 5195 5198 5196 5199 if (cea_db_offsets(edid_ext, &start, &end)) 5197 5200 return;
+2 -1
drivers/gpu/drm/i915/display/intel_bw.c
··· 992 992 * cause. 993 993 */ 994 994 if (!intel_can_enable_sagv(dev_priv, new_bw_state)) { 995 - allowed_points = BIT(max_bw_point); 995 + allowed_points &= ADLS_PSF_PT_MASK; 996 + allowed_points |= BIT(max_bw_point); 996 997 drm_dbg_kms(&dev_priv->drm, "No SAGV, using single QGV point %d\n", 997 998 max_bw_point); 998 999 }
+9
drivers/gpu/drm/i915/display/intel_hdmi.c
··· 1836 1836 bool has_hdmi_sink) 1837 1837 { 1838 1838 struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi); 1839 + enum phy phy = intel_port_to_phy(dev_priv, hdmi_to_dig_port(hdmi)->base.port); 1839 1840 1840 1841 if (clock < 25000) 1841 1842 return MODE_CLOCK_LOW; ··· 1855 1854 1856 1855 /* CHV DPLL can't generate 216-240 MHz */ 1857 1856 if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000) 1857 + return MODE_CLOCK_RANGE; 1858 + 1859 + /* ICL+ combo PHY PLL can't generate 500-533.2 MHz */ 1860 + if (intel_phy_is_combo(dev_priv, phy) && clock > 500000 && clock < 533200) 1861 + return MODE_CLOCK_RANGE; 1862 + 1863 + /* ICL+ TC PHY PLL can't generate 500-532.8 MHz */ 1864 + if (intel_phy_is_tc(dev_priv, phy) && clock > 500000 && clock < 532800) 1858 1865 return MODE_CLOCK_RANGE; 1859 1866 1860 1867 /*
+1 -1
drivers/gpu/drm/i915/i915_drv.h
··· 947 947 (GRAPHICS_VER(i915) >= (from) && GRAPHICS_VER(i915) <= (until)) 948 948 949 949 #define MEDIA_VER(i915) (INTEL_INFO(i915)->media.ver) 950 - #define MEDIA_VER_FULL(i915) IP_VER(INTEL_INFO(i915)->media.arch, \ 950 + #define MEDIA_VER_FULL(i915) IP_VER(INTEL_INFO(i915)->media.ver, \ 951 951 INTEL_INFO(i915)->media.rel) 952 952 #define IS_MEDIA_VER(i915, from, until) \ 953 953 (MEDIA_VER(i915) >= (from) && MEDIA_VER(i915) <= (until))
+6 -4
drivers/gpu/drm/i915/intel_pm.c
··· 3698 3698 MISSING_CASE(DISPLAY_VER(dev_priv)); 3699 3699 } 3700 3700 3701 - /* Default to an unusable block time */ 3702 - dev_priv->sagv_block_time_us = -1; 3701 + dev_priv->sagv_block_time_us = 0; 3703 3702 } 3704 3703 3705 3704 /* ··· 5644 5645 result->min_ddb_alloc = max(min_ddb_alloc, blocks) + 1; 5645 5646 result->enable = true; 5646 5647 5647 - if (DISPLAY_VER(dev_priv) < 12) 5648 + if (DISPLAY_VER(dev_priv) < 12 && dev_priv->sagv_block_time_us) 5648 5649 result->can_sagv = latency >= dev_priv->sagv_block_time_us; 5649 5650 } 5650 5651 ··· 5677 5678 struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 5678 5679 struct skl_wm_level *sagv_wm = &plane_wm->sagv.wm0; 5679 5680 struct skl_wm_level *levels = plane_wm->wm; 5680 - unsigned int latency = dev_priv->wm.skl_latency[0] + dev_priv->sagv_block_time_us; 5681 + unsigned int latency = 0; 5682 + 5683 + if (dev_priv->sagv_block_time_us) 5684 + latency = dev_priv->sagv_block_time_us + dev_priv->wm.skl_latency[0]; 5681 5685 5682 5686 skl_compute_plane_wm(crtc_state, plane, 0, latency, 5683 5687 wm_params, &levels[0],
+4 -4
drivers/gpu/drm/selftests/test-drm_plane_helper.c
··· 77 77 { 78 78 int ret; 79 79 80 - const struct drm_crtc_state crtc_state = { 80 + static const struct drm_crtc_state crtc_state = { 81 81 .crtc = ZERO_SIZE_PTR, 82 82 .enable = true, 83 83 .active = true, ··· 87 87 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) 88 88 }, 89 89 }; 90 - struct drm_plane plane = { 90 + static struct drm_plane plane = { 91 91 .dev = NULL 92 92 }; 93 - struct drm_framebuffer fb = { 93 + static struct drm_framebuffer fb = { 94 94 .width = 2048, 95 95 .height = 2048 96 96 }; 97 - struct drm_plane_state plane_state = { 97 + static struct drm_plane_state plane_state = { 98 98 .plane = &plane, 99 99 .crtc = ZERO_SIZE_PTR, 100 100 .fb = &fb,
+1 -1
drivers/gpu/drm/ttm/ttm_range_manager.c
··· 89 89 spin_unlock(&rman->lock); 90 90 91 91 if (unlikely(ret)) { 92 - ttm_resource_fini(man, *res); 92 + ttm_resource_fini(man, &node->base); 93 93 kfree(node); 94 94 return ret; 95 95 }
+24 -4
drivers/video/fbdev/core/cfbimgblt.c
··· 218 218 { 219 219 u32 fgx = fgcolor, bgx = bgcolor, bpp = p->var.bits_per_pixel; 220 220 u32 ppw = 32/bpp, spitch = (image->width + 7)/8; 221 - u32 bit_mask, eorx; 221 + u32 bit_mask, eorx, shift; 222 222 const char *s = image->data, *src; 223 223 u32 __iomem *dst; 224 224 const u32 *tab = NULL; ··· 259 259 260 260 for (i = image->height; i--; ) { 261 261 dst = (u32 __iomem *)dst1; 262 + shift = 8; 262 263 src = s; 263 264 265 + /* 266 + * Manually unroll the per-line copying loop for better 267 + * performance. This works until we processed the last 268 + * completely filled source byte (inclusive). 269 + */ 264 270 switch (ppw) { 265 271 case 4: /* 8 bpp */ 266 - for (j = k; j; j -= 2, ++src) { 272 + for (j = k; j >= 2; j -= 2, ++src) { 267 273 FB_WRITEL(colortab[(*src >> 4) & bit_mask], dst++); 268 274 FB_WRITEL(colortab[(*src >> 0) & bit_mask], dst++); 269 275 } 270 276 break; 271 277 case 2: /* 16 bpp */ 272 - for (j = k; j; j -= 4, ++src) { 278 + for (j = k; j >= 4; j -= 4, ++src) { 273 279 FB_WRITEL(colortab[(*src >> 6) & bit_mask], dst++); 274 280 FB_WRITEL(colortab[(*src >> 4) & bit_mask], dst++); 275 281 FB_WRITEL(colortab[(*src >> 2) & bit_mask], dst++); ··· 283 277 } 284 278 break; 285 279 case 1: /* 32 bpp */ 286 - for (j = k; j; j -= 8, ++src) { 280 + for (j = k; j >= 8; j -= 8, ++src) { 287 281 FB_WRITEL(colortab[(*src >> 7) & bit_mask], dst++); 288 282 FB_WRITEL(colortab[(*src >> 6) & bit_mask], dst++); 289 283 FB_WRITEL(colortab[(*src >> 5) & bit_mask], dst++); ··· 294 288 FB_WRITEL(colortab[(*src >> 0) & bit_mask], dst++); 295 289 } 296 290 break; 291 + } 292 + 293 + /* 294 + * For image widths that are not a multiple of 8, there 295 + * are trailing pixels left on the current line. Print 296 + * them as well. 297 + */ 298 + for (; j--; ) { 299 + shift -= ppw; 300 + FB_WRITEL(colortab[(*src >> shift) & bit_mask], dst++); 301 + if (!shift) { 302 + shift = 8; 303 + ++src; 304 + } 297 305 } 298 306 299 307 dst1 += p->fix.line_length;
+25 -4
drivers/video/fbdev/core/sysimgblt.c
··· 188 188 { 189 189 u32 fgx = fgcolor, bgx = bgcolor, bpp = p->var.bits_per_pixel; 190 190 u32 ppw = 32/bpp, spitch = (image->width + 7)/8; 191 - u32 bit_mask, eorx; 191 + u32 bit_mask, eorx, shift; 192 192 const char *s = image->data, *src; 193 193 u32 *dst; 194 194 const u32 *tab; ··· 229 229 230 230 for (i = image->height; i--; ) { 231 231 dst = dst1; 232 + shift = 8; 232 233 src = s; 233 234 235 + /* 236 + * Manually unroll the per-line copying loop for better 237 + * performance. This works until we processed the last 238 + * completely filled source byte (inclusive). 239 + */ 234 240 switch (ppw) { 235 241 case 4: /* 8 bpp */ 236 - for (j = k; j; j -= 2, ++src) { 242 + for (j = k; j >= 2; j -= 2, ++src) { 237 243 *dst++ = colortab[(*src >> 4) & bit_mask]; 238 244 *dst++ = colortab[(*src >> 0) & bit_mask]; 239 245 } 240 246 break; 241 247 case 2: /* 16 bpp */ 242 - for (j = k; j; j -= 4, ++src) { 248 + for (j = k; j >= 4; j -= 4, ++src) { 243 249 *dst++ = colortab[(*src >> 6) & bit_mask]; 244 250 *dst++ = colortab[(*src >> 4) & bit_mask]; 245 251 *dst++ = colortab[(*src >> 2) & bit_mask]; ··· 253 247 } 254 248 break; 255 249 case 1: /* 32 bpp */ 256 - for (j = k; j; j -= 8, ++src) { 250 + for (j = k; j >= 8; j -= 8, ++src) { 257 251 *dst++ = colortab[(*src >> 7) & bit_mask]; 258 252 *dst++ = colortab[(*src >> 6) & bit_mask]; 259 253 *dst++ = colortab[(*src >> 5) & bit_mask]; ··· 265 259 } 266 260 break; 267 261 } 262 + 263 + /* 264 + * For image widths that are not a multiple of 8, there 265 + * are trailing pixels left on the current line. Print 266 + * them as well. 267 + */ 268 + for (; j--; ) { 269 + shift -= ppw; 270 + *dst++ = colortab[(*src >> shift) & bit_mask]; 271 + if (!shift) { 272 + shift = 8; 273 + ++src; 274 + } 275 + } 276 + 268 277 dst1 += p->fix.line_length; 269 278 s += spitch; 270 279 }