Skip to content

Commit cb7cbaa

Browse files
committed
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
2 parents 46f538b + 2a81dba commit cb7cbaa

File tree

9 files changed

+82
-24
lines changed

9 files changed

+82
-24
lines changed

drivers/gpu/drm/drm_edid.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4859,7 +4859,8 @@ bool drm_detect_monitor_audio(struct edid *edid)
48594859
if (!edid_ext)
48604860
goto end;
48614861

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);
48634864

48644865
if (has_audio) {
48654866
DRM_DEBUG_KMS("Monitor has basic audio support\n");
@@ -5187,10 +5188,14 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
51875188

51885189
/* The existence of a CEA block should imply RGB support */
51895190
info->color_formats = DRM_COLOR_FORMAT_RGB444;
5190-
if (edid_ext[3] & EDID_CEA_YCRCB444)
5191-
info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
5192-
if (edid_ext[3] & EDID_CEA_YCRCB422)
5193-
info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
5191+
5192+
/* CTA DisplayID Data Block does not have byte #3 */
5193+
if (edid_ext[0] == CEA_EXT) {
5194+
if (edid_ext[3] & EDID_CEA_YCRCB444)
5195+
info->color_formats |= DRM_COLOR_FORMAT_YCBCR444;
5196+
if (edid_ext[3] & EDID_CEA_YCRCB422)
5197+
info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
5198+
}
51945199

51955200
if (cea_db_offsets(edid_ext, &start, &end))
51965201
return;

drivers/gpu/drm/i915/display/intel_bw.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -992,7 +992,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
992992
* cause.
993993
*/
994994
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);
996997
drm_dbg_kms(&dev_priv->drm, "No SAGV, using single QGV point %d\n",
997998
max_bw_point);
998999
}

drivers/gpu/drm/i915/display/intel_hdmi.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,7 @@ hdmi_port_clock_valid(struct intel_hdmi *hdmi,
18361836
bool has_hdmi_sink)
18371837
{
18381838
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);
18391840

18401841
if (clock < 25000)
18411842
return MODE_CLOCK_LOW;
@@ -1856,6 +1857,14 @@ hdmi_port_clock_valid(struct intel_hdmi *hdmi,
18561857
if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
18571858
return MODE_CLOCK_RANGE;
18581859

1860+
/* ICL+ combo PHY PLL can't generate 500-533.2 MHz */
1861+
if (intel_phy_is_combo(dev_priv, phy) && clock > 500000 && clock < 533200)
1862+
return MODE_CLOCK_RANGE;
1863+
1864+
/* ICL+ TC PHY PLL can't generate 500-532.8 MHz */
1865+
if (intel_phy_is_tc(dev_priv, phy) && clock > 500000 && clock < 532800)
1866+
return MODE_CLOCK_RANGE;
1867+
18591868
/*
18601869
* SNPS PHYs' MPLLB table-based programming can only handle a fixed
18611870
* set of link rates.

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ static inline struct intel_gt *to_gt(struct drm_i915_private *i915)
947947
(GRAPHICS_VER(i915) >= (from) && GRAPHICS_VER(i915) <= (until))
948948

949949
#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, \
951951
INTEL_INFO(i915)->media.rel)
952952
#define IS_MEDIA_VER(i915, from, until) \
953953
(MEDIA_VER(i915) >= (from) && MEDIA_VER(i915) <= (until))

drivers/gpu/drm/i915/intel_pm.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3698,8 +3698,7 @@ skl_setup_sagv_block_time(struct drm_i915_private *dev_priv)
36983698
MISSING_CASE(DISPLAY_VER(dev_priv));
36993699
}
37003700

3701-
/* Default to an unusable block time */
3702-
dev_priv->sagv_block_time_us = -1;
3701+
dev_priv->sagv_block_time_us = 0;
37033702
}
37043703

37053704
/*
@@ -5645,7 +5644,7 @@ static void skl_compute_plane_wm(const struct intel_crtc_state *crtc_state,
56455644
result->min_ddb_alloc = max(min_ddb_alloc, blocks) + 1;
56465645
result->enable = true;
56475646

5648-
if (DISPLAY_VER(dev_priv) < 12)
5647+
if (DISPLAY_VER(dev_priv) < 12 && dev_priv->sagv_block_time_us)
56495648
result->can_sagv = latency >= dev_priv->sagv_block_time_us;
56505649
}
56515650

@@ -5678,7 +5677,10 @@ static void tgl_compute_sagv_wm(const struct intel_crtc_state *crtc_state,
56785677
struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev);
56795678
struct skl_wm_level *sagv_wm = &plane_wm->sagv.wm0;
56805679
struct skl_wm_level *levels = plane_wm->wm;
5681-
unsigned int latency = dev_priv->wm.skl_latency[0] + dev_priv->sagv_block_time_us;
5680+
unsigned int latency = 0;
5681+
5682+
if (dev_priv->sagv_block_time_us)
5683+
latency = dev_priv->sagv_block_time_us + dev_priv->wm.skl_latency[0];
56825684

56835685
skl_compute_plane_wm(crtc_state, plane, 0, latency,
56845686
wm_params, &levels[0],

drivers/gpu/drm/selftests/test-drm_plane_helper.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ int igt_check_plane_state(void *ignored)
7777
{
7878
int ret;
7979

80-
const struct drm_crtc_state crtc_state = {
80+
static const struct drm_crtc_state crtc_state = {
8181
.crtc = ZERO_SIZE_PTR,
8282
.enable = true,
8383
.active = true,
@@ -87,14 +87,14 @@ int igt_check_plane_state(void *ignored)
8787
DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC)
8888
},
8989
};
90-
struct drm_plane plane = {
90+
static struct drm_plane plane = {
9191
.dev = NULL
9292
};
93-
struct drm_framebuffer fb = {
93+
static struct drm_framebuffer fb = {
9494
.width = 2048,
9595
.height = 2048
9696
};
97-
struct drm_plane_state plane_state = {
97+
static struct drm_plane_state plane_state = {
9898
.plane = &plane,
9999
.crtc = ZERO_SIZE_PTR,
100100
.fb = &fb,

drivers/gpu/drm/ttm/ttm_range_manager.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static int ttm_range_man_alloc(struct ttm_resource_manager *man,
8989
spin_unlock(&rman->lock);
9090

9191
if (unlikely(ret)) {
92-
ttm_resource_fini(man, *res);
92+
ttm_resource_fini(man, &node->base);
9393
kfree(node);
9494
return ret;
9595
}

drivers/video/fbdev/core/cfbimgblt.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ static inline void fast_imageblit(const struct fb_image *image, struct fb_info *
218218
{
219219
u32 fgx = fgcolor, bgx = bgcolor, bpp = p->var.bits_per_pixel;
220220
u32 ppw = 32/bpp, spitch = (image->width + 7)/8;
221-
u32 bit_mask, eorx;
221+
u32 bit_mask, eorx, shift;
222222
const char *s = image->data, *src;
223223
u32 __iomem *dst;
224224
const u32 *tab = NULL;
@@ -259,25 +259,31 @@ static inline void fast_imageblit(const struct fb_image *image, struct fb_info *
259259

260260
for (i = image->height; i--; ) {
261261
dst = (u32 __iomem *)dst1;
262+
shift = 8;
262263
src = s;
263264

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+
*/
264270
switch (ppw) {
265271
case 4: /* 8 bpp */
266-
for (j = k; j; j -= 2, ++src) {
272+
for (j = k; j >= 2; j -= 2, ++src) {
267273
FB_WRITEL(colortab[(*src >> 4) & bit_mask], dst++);
268274
FB_WRITEL(colortab[(*src >> 0) & bit_mask], dst++);
269275
}
270276
break;
271277
case 2: /* 16 bpp */
272-
for (j = k; j; j -= 4, ++src) {
278+
for (j = k; j >= 4; j -= 4, ++src) {
273279
FB_WRITEL(colortab[(*src >> 6) & bit_mask], dst++);
274280
FB_WRITEL(colortab[(*src >> 4) & bit_mask], dst++);
275281
FB_WRITEL(colortab[(*src >> 2) & bit_mask], dst++);
276282
FB_WRITEL(colortab[(*src >> 0) & bit_mask], dst++);
277283
}
278284
break;
279285
case 1: /* 32 bpp */
280-
for (j = k; j; j -= 8, ++src) {
286+
for (j = k; j >= 8; j -= 8, ++src) {
281287
FB_WRITEL(colortab[(*src >> 7) & bit_mask], dst++);
282288
FB_WRITEL(colortab[(*src >> 6) & bit_mask], dst++);
283289
FB_WRITEL(colortab[(*src >> 5) & bit_mask], dst++);
@@ -290,6 +296,20 @@ static inline void fast_imageblit(const struct fb_image *image, struct fb_info *
290296
break;
291297
}
292298

299+
/*
300+
* For image widths that are not a multiple of 8, there
301+
* are trailing pixels left on the current line. Print
302+
* them as well.
303+
*/
304+
for (; j--; ) {
305+
shift -= ppw;
306+
FB_WRITEL(colortab[(*src >> shift) & bit_mask], dst++);
307+
if (!shift) {
308+
shift = 8;
309+
++src;
310+
}
311+
}
312+
293313
dst1 += p->fix.line_length;
294314
s += spitch;
295315
}

drivers/video/fbdev/core/sysimgblt.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
188188
{
189189
u32 fgx = fgcolor, bgx = bgcolor, bpp = p->var.bits_per_pixel;
190190
u32 ppw = 32/bpp, spitch = (image->width + 7)/8;
191-
u32 bit_mask, eorx;
191+
u32 bit_mask, eorx, shift;
192192
const char *s = image->data, *src;
193193
u32 *dst;
194194
const u32 *tab;
@@ -229,25 +229,31 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
229229

230230
for (i = image->height; i--; ) {
231231
dst = dst1;
232+
shift = 8;
232233
src = s;
233234

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+
*/
234240
switch (ppw) {
235241
case 4: /* 8 bpp */
236-
for (j = k; j; j -= 2, ++src) {
242+
for (j = k; j >= 2; j -= 2, ++src) {
237243
*dst++ = colortab[(*src >> 4) & bit_mask];
238244
*dst++ = colortab[(*src >> 0) & bit_mask];
239245
}
240246
break;
241247
case 2: /* 16 bpp */
242-
for (j = k; j; j -= 4, ++src) {
248+
for (j = k; j >= 4; j -= 4, ++src) {
243249
*dst++ = colortab[(*src >> 6) & bit_mask];
244250
*dst++ = colortab[(*src >> 4) & bit_mask];
245251
*dst++ = colortab[(*src >> 2) & bit_mask];
246252
*dst++ = colortab[(*src >> 0) & bit_mask];
247253
}
248254
break;
249255
case 1: /* 32 bpp */
250-
for (j = k; j; j -= 8, ++src) {
256+
for (j = k; j >= 8; j -= 8, ++src) {
251257
*dst++ = colortab[(*src >> 7) & bit_mask];
252258
*dst++ = colortab[(*src >> 6) & bit_mask];
253259
*dst++ = colortab[(*src >> 5) & bit_mask];
@@ -259,6 +265,21 @@ static void fast_imageblit(const struct fb_image *image, struct fb_info *p,
259265
}
260266
break;
261267
}
268+
269+
/*
270+
* For image widths that are not a multiple of 8, there
271+
* are trailing pixels left on the current line. Print
272+
* them as well.
273+
*/
274+
for (; j--; ) {
275+
shift -= ppw;
276+
*dst++ = colortab[(*src >> shift) & bit_mask];
277+
if (!shift) {
278+
shift = 8;
279+
++src;
280+
}
281+
}
282+
262283
dst1 += p->fix.line_length;
263284
s += spitch;
264285
}

0 commit comments

Comments
 (0)