|
|
@ -70,8 +70,8 @@
|
|
|
|
#define EDID_QUIRK_FORCE_6BPC BIT(10)
|
|
|
|
#define EDID_QUIRK_FORCE_6BPC BIT(10)
|
|
|
|
/* Force 10bpc */
|
|
|
|
/* Force 10bpc */
|
|
|
|
#define EDID_QUIRK_FORCE_10BPC BIT(11)
|
|
|
|
#define EDID_QUIRK_FORCE_10BPC BIT(11)
|
|
|
|
/* Prefer the native CEA mode */
|
|
|
|
/* Prefer hight clock mode */
|
|
|
|
#define EDID_QUIRK_NATIVE_CEA_PREFERRED BIT(12)
|
|
|
|
#define EDID_QUIRK_PREFER_HIGH_CLOCK BIT(12)
|
|
|
|
|
|
|
|
|
|
|
|
struct detailed_mode_closure {
|
|
|
|
struct detailed_mode_closure {
|
|
|
|
struct edid *edid;
|
|
|
|
struct edid *edid;
|
|
|
@ -134,7 +134,7 @@ static struct edid_quirk {
|
|
|
|
{ "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 },
|
|
|
|
{ "SAM", 638, EDID_QUIRK_PREFER_LARGE_60 },
|
|
|
|
|
|
|
|
|
|
|
|
/* Skyworth */
|
|
|
|
/* Skyworth */
|
|
|
|
{ "SKW", 1, (EDID_QUIRK_NATIVE_CEA_PREFERRED | EDID_QUIRK_PREFER_LARGE_60) },
|
|
|
|
{ "SKW", 1, (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_HIGH_CLOCK) },
|
|
|
|
|
|
|
|
|
|
|
|
/* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
|
|
|
|
/* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
|
|
|
|
{ "SNY", 0x2541, EDID_QUIRK_FORCE_12BPC },
|
|
|
|
{ "SNY", 0x2541, EDID_QUIRK_FORCE_12BPC },
|
|
|
@ -2690,9 +2690,6 @@ drm_display_mode_from_vic_index(const u8 *video_db, u8 video_len,
|
|
|
|
*newmode = *cea_mode_for_vic(vic);
|
|
|
|
*newmode = *cea_mode_for_vic(vic);
|
|
|
|
newmode->vrefresh = 0;
|
|
|
|
newmode->vrefresh = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if (video_db[video_index] & 0x80)
|
|
|
|
|
|
|
|
newmode->type |= DRM_MODE_TYPE_NATIVE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return newmode;
|
|
|
|
return newmode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -5314,28 +5311,30 @@ static void edid_fixup_preferred(struct hdmi_edid_data *data,
|
|
|
|
if (cur_mode == preferred_mode)
|
|
|
|
if (cur_mode == preferred_mode)
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if ((quirks & EDID_QUIRK_NATIVE_CEA_PREFERRED) &&
|
|
|
|
|
|
|
|
(cur_mode->type & DRM_MODE_TYPE_NATIVE)) {
|
|
|
|
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Largest mode is preferred */
|
|
|
|
/* Largest mode is preferred */
|
|
|
|
if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
|
|
|
|
if (MODE_SIZE(cur_mode) > MODE_SIZE(preferred_mode))
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
|
|
|
|
|
|
|
|
cur_vrefresh = cur_mode->vrefresh ?
|
|
|
|
cur_vrefresh = cur_mode->vrefresh ?
|
|
|
|
cur_mode->vrefresh : drm_get_vrefresh(cur_mode);
|
|
|
|
cur_mode->vrefresh : drm_get_vrefresh(cur_mode);
|
|
|
|
preferred_vrefresh = preferred_mode->vrefresh ?
|
|
|
|
preferred_vrefresh = preferred_mode->vrefresh ?
|
|
|
|
preferred_mode->vrefresh : drm_get_vrefresh(preferred_mode);
|
|
|
|
preferred_mode->vrefresh : drm_get_vrefresh(preferred_mode);
|
|
|
|
|
|
|
|
|
|
|
|
/* At a given size, try to get closest to target refresh */
|
|
|
|
/* At a given size, try to get closest to target refresh */
|
|
|
|
if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
|
|
|
|
if ((MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
|
|
|
|
MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
|
|
|
|
MODE_REFRESH_DIFF(cur_vrefresh, target_refresh) <
|
|
|
|
MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
|
|
|
|
MODE_REFRESH_DIFF(preferred_vrefresh, target_refresh)) {
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Consider the clock like drm_mode_compare() */
|
|
|
|
|
|
|
|
if ((quirks & EDID_QUIRK_PREFER_HIGH_CLOCK) &&
|
|
|
|
|
|
|
|
(MODE_SIZE(cur_mode) == MODE_SIZE(preferred_mode)) &&
|
|
|
|
|
|
|
|
(cur_vrefresh == preferred_vrefresh) &&
|
|
|
|
|
|
|
|
(cur_mode->clock > preferred_mode->clock)) {
|
|
|
|
|
|
|
|
preferred_mode = cur_mode;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
|
|
|
preferred_mode->type |= DRM_MODE_TYPE_PREFERRED;
|
|
|
|
data->preferred_mode = preferred_mode;
|
|
|
|
data->preferred_mode = preferred_mode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|