Commit 0b2443ed4e07d7973e4554a2cc166bc35447b59e
Committed by
Dave Airlie
1 parent
09e7dcf081
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
drm/edid: limit printk when facing bad edid
Limit printing bad edid information at one time per connector. Connector that are connected to a bad monitor/kvm will likely stay connected to the same bad monitor/kvm and it makes no sense to keep printing the bad edid message. Signed-off-by: Jerome Glisse <jglisse@redhat.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Showing 3 changed files with 20 additions and 11 deletions Side-by-side Diff
drivers/gpu/drm/drm_edid.c
... | ... | @@ -158,7 +158,7 @@ |
158 | 158 | * Sanity check the EDID block (base or extension). Return 0 if the block |
159 | 159 | * doesn't check out, or 1 if it's valid. |
160 | 160 | */ |
161 | -bool drm_edid_block_valid(u8 *raw_edid, int block) | |
161 | +bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid) | |
162 | 162 | { |
163 | 163 | int i; |
164 | 164 | u8 csum = 0; |
... | ... | @@ -181,7 +181,9 @@ |
181 | 181 | for (i = 0; i < EDID_LENGTH; i++) |
182 | 182 | csum += raw_edid[i]; |
183 | 183 | if (csum) { |
184 | - DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum); | |
184 | + if (print_bad_edid) { | |
185 | + DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum); | |
186 | + } | |
185 | 187 | |
186 | 188 | /* allow CEA to slide through, switches mangle this */ |
187 | 189 | if (raw_edid[0] != 0x02) |
... | ... | @@ -207,7 +209,7 @@ |
207 | 209 | return 1; |
208 | 210 | |
209 | 211 | bad: |
210 | - if (raw_edid) { | |
212 | + if (raw_edid && print_bad_edid) { | |
211 | 213 | printk(KERN_ERR "Raw EDID:\n"); |
212 | 214 | print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1, |
213 | 215 | raw_edid, EDID_LENGTH, false); |
... | ... | @@ -231,7 +233,7 @@ |
231 | 233 | return false; |
232 | 234 | |
233 | 235 | for (i = 0; i <= edid->extensions; i++) |
234 | - if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i)) | |
236 | + if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i, true)) | |
235 | 237 | return false; |
236 | 238 | |
237 | 239 | return true; |
... | ... | @@ -316,6 +318,7 @@ |
316 | 318 | { |
317 | 319 | int i, j = 0, valid_extensions = 0; |
318 | 320 | u8 *block, *new; |
321 | + bool print_bad_edid = !connector->bad_edid_counter || (drm_debug & DRM_UT_KMS); | |
319 | 322 | |
320 | 323 | if ((block = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) |
321 | 324 | return NULL; |
... | ... | @@ -324,7 +327,7 @@ |
324 | 327 | for (i = 0; i < 4; i++) { |
325 | 328 | if (drm_do_probe_ddc_edid(adapter, block, 0, EDID_LENGTH)) |
326 | 329 | goto out; |
327 | - if (drm_edid_block_valid(block, 0)) | |
330 | + if (drm_edid_block_valid(block, 0, print_bad_edid)) | |
328 | 331 | break; |
329 | 332 | if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) { |
330 | 333 | connector->null_edid_counter++; |
... | ... | @@ -349,7 +352,7 @@ |
349 | 352 | block + (valid_extensions + 1) * EDID_LENGTH, |
350 | 353 | j, EDID_LENGTH)) |
351 | 354 | goto out; |
352 | - if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j)) { | |
355 | + if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j, print_bad_edid)) { | |
353 | 356 | valid_extensions++; |
354 | 357 | break; |
355 | 358 | } |
... | ... | @@ -372,8 +375,11 @@ |
372 | 375 | return block; |
373 | 376 | |
374 | 377 | carp: |
375 | - dev_warn(connector->dev->dev, "%s: EDID block %d invalid.\n", | |
376 | - drm_get_connector_name(connector), j); | |
378 | + if (print_bad_edid) { | |
379 | + dev_warn(connector->dev->dev, "%s: EDID block %d invalid.\n", | |
380 | + drm_get_connector_name(connector), j); | |
381 | + } | |
382 | + connector->bad_edid_counter++; | |
377 | 383 | |
378 | 384 | out: |
379 | 385 | kfree(block); |
drivers/gpu/drm/drm_edid_load.c
... | ... | @@ -123,6 +123,7 @@ |
123 | 123 | int fwsize, expected; |
124 | 124 | int builtin = 0, err = 0; |
125 | 125 | int i, valid_extensions = 0; |
126 | + bool print_bad_edid = !connector->bad_edid_counter || (drm_debug & DRM_UT_KMS); | |
126 | 127 | |
127 | 128 | pdev = platform_device_register_simple(connector_name, -1, NULL, 0); |
128 | 129 | if (IS_ERR(pdev)) { |
... | ... | @@ -173,7 +174,8 @@ |
173 | 174 | } |
174 | 175 | memcpy(edid, fwdata, fwsize); |
175 | 176 | |
176 | - if (!drm_edid_block_valid(edid, 0)) { | |
177 | + if (!drm_edid_block_valid(edid, 0, print_bad_edid)) { | |
178 | + connector->bad_edid_counter++; | |
177 | 179 | DRM_ERROR("Base block of EDID firmware \"%s\" is invalid ", |
178 | 180 | name); |
179 | 181 | kfree(edid); |
... | ... | @@ -185,7 +187,7 @@ |
185 | 187 | if (i != valid_extensions + 1) |
186 | 188 | memcpy(edid + (valid_extensions + 1) * EDID_LENGTH, |
187 | 189 | edid + i * EDID_LENGTH, EDID_LENGTH); |
188 | - if (drm_edid_block_valid(edid + i * EDID_LENGTH, i)) | |
190 | + if (drm_edid_block_valid(edid + i * EDID_LENGTH, i, print_bad_edid)) | |
189 | 191 | valid_extensions++; |
190 | 192 | } |
191 | 193 |
include/drm/drm_crtc.h
... | ... | @@ -590,6 +590,7 @@ |
590 | 590 | int video_latency[2]; /* [0]: progressive, [1]: interlaced */ |
591 | 591 | int audio_latency[2]; |
592 | 592 | int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */ |
593 | + unsigned bad_edid_counter; | |
593 | 594 | }; |
594 | 595 | |
595 | 596 | /** |
... | ... | @@ -1032,7 +1033,7 @@ |
1032 | 1033 | int hdisplay, int vdisplay); |
1033 | 1034 | |
1034 | 1035 | extern int drm_edid_header_is_valid(const u8 *raw_edid); |
1035 | -extern bool drm_edid_block_valid(u8 *raw_edid, int block); | |
1036 | +extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid); | |
1036 | 1037 | extern bool drm_edid_is_valid(struct edid *edid); |
1037 | 1038 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, |
1038 | 1039 | int hsize, int vsize, int fresh, |