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

drm/edid: store quirks in display info

Although the quirks are internal to EDID parsing, it'll be helpful to
store them in display info to avoid having to pass them around.

This will also help separate adding probed modes (which needs the
quirks) from updating display info.

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/819b908f64ad2d158245917f436f24d33a65b95d.1672826282.git.jani.nikula@intel.com

+26 -21
+21 -21
drivers/gpu/drm/drm_edid.c
··· 6428 6428 kfree(info->vics); 6429 6429 info->vics = NULL; 6430 6430 info->vics_len = 0; 6431 + 6432 + info->quirks = 0; 6431 6433 } 6432 6434 6433 - static u32 update_display_info(struct drm_connector *connector, 6434 - const struct drm_edid *drm_edid) 6435 + static void update_display_info(struct drm_connector *connector, 6436 + const struct drm_edid *drm_edid) 6435 6437 { 6436 6438 struct drm_display_info *info = &connector->display_info; 6437 6439 const struct edid *edid = drm_edid->edid; 6438 6440 6439 - u32 quirks = edid_get_quirks(drm_edid); 6440 - 6441 6441 drm_reset_display_info(connector); 6442 + 6443 + info->quirks = edid_get_quirks(drm_edid); 6442 6444 6443 6445 info->width_mm = edid->width_cm * 10; 6444 6446 info->height_mm = edid->height_cm * 10; ··· 6512 6510 drm_update_mso(connector, drm_edid); 6513 6511 6514 6512 out: 6515 - if (quirks & EDID_QUIRK_NON_DESKTOP) { 6513 + if (info->quirks & EDID_QUIRK_NON_DESKTOP) { 6516 6514 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Non-desktop display%s\n", 6517 6515 connector->base.id, connector->name, 6518 6516 info->non_desktop ? " (redundant quirk)" : ""); 6519 6517 info->non_desktop = true; 6520 6518 } 6521 6519 6522 - if (quirks & EDID_QUIRK_CAP_DSC_15BPP) 6520 + if (info->quirks & EDID_QUIRK_CAP_DSC_15BPP) 6523 6521 info->max_dsc_bpp = 15; 6524 - 6525 - return quirks; 6526 6522 } 6527 6523 6528 6524 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev, ··· 6618 6618 static int _drm_edid_connector_update(struct drm_connector *connector, 6619 6619 const struct drm_edid *drm_edid) 6620 6620 { 6621 + struct drm_display_info *info = &connector->display_info; 6621 6622 int num_modes = 0; 6622 - u32 quirks; 6623 6623 6624 6624 if (!drm_edid) { 6625 6625 drm_reset_display_info(connector); ··· 6632 6632 * To avoid multiple parsing of same block, lets parse that map 6633 6633 * from sink info, before parsing CEA modes. 6634 6634 */ 6635 - quirks = update_display_info(connector, drm_edid); 6635 + update_display_info(connector, drm_edid); 6636 6636 6637 6637 /* Depends on info->cea_rev set by update_display_info() above */ 6638 6638 drm_edid_to_eld(connector, drm_edid); ··· 6651 6651 * 6652 6652 * XXX order for additional mode types in extension blocks? 6653 6653 */ 6654 - num_modes += add_detailed_modes(connector, drm_edid, quirks); 6654 + num_modes += add_detailed_modes(connector, drm_edid, info->quirks); 6655 6655 num_modes += add_cvt_modes(connector, drm_edid); 6656 6656 num_modes += add_standard_modes(connector, drm_edid); 6657 6657 num_modes += add_established_modes(connector, drm_edid); ··· 6661 6661 if (drm_edid->edid->features & DRM_EDID_FEATURE_CONTINUOUS_FREQ) 6662 6662 num_modes += add_inferred_modes(connector, drm_edid); 6663 6663 6664 - if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) 6665 - edid_fixup_preferred(connector, quirks); 6664 + if (info->quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75)) 6665 + edid_fixup_preferred(connector, info->quirks); 6666 6666 6667 - if (quirks & EDID_QUIRK_FORCE_6BPC) 6668 - connector->display_info.bpc = 6; 6667 + if (info->quirks & EDID_QUIRK_FORCE_6BPC) 6668 + info->bpc = 6; 6669 6669 6670 - if (quirks & EDID_QUIRK_FORCE_8BPC) 6671 - connector->display_info.bpc = 8; 6670 + if (info->quirks & EDID_QUIRK_FORCE_8BPC) 6671 + info->bpc = 8; 6672 6672 6673 - if (quirks & EDID_QUIRK_FORCE_10BPC) 6674 - connector->display_info.bpc = 10; 6673 + if (info->quirks & EDID_QUIRK_FORCE_10BPC) 6674 + info->bpc = 10; 6675 6675 6676 - if (quirks & EDID_QUIRK_FORCE_12BPC) 6677 - connector->display_info.bpc = 12; 6676 + if (info->quirks & EDID_QUIRK_FORCE_12BPC) 6677 + info->bpc = 12; 6678 6678 6679 6679 return num_modes; 6680 6680 }
+5
include/drm/drm_connector.h
··· 728 728 * @vics_len: Number of elements in vics. Internal to EDID parsing. 729 729 */ 730 730 int vics_len; 731 + 732 + /** 733 + * @quirks: EDID based quirks. Internal to EDID parsing. 734 + */ 735 + u32 quirks; 731 736 }; 732 737 733 738 int drm_display_info_set_bus_formats(struct drm_display_info *info,