[PATCH] drm/ast: Fix default resolution when no monitor is connected on DP
Jocelyn Falempe
jfalempe at redhat.com
Tue Jul 4 16:45:34 UTC 2023
On 04/07/2023 16:54, Jani Nikula wrote:
> On Fri, 23 Jun 2023, Jocelyn Falempe <jfalempe at redhat.com> wrote:
>> Since commit fae7d186403e ("drm/probe-helper: Default to 640x480 if no
>> EDID on DP")
>> The default resolution is now 640x480 when no monitor is connected.
>> But Aspeed graphics is mostly used in servers, where no monitor
>> is attached. This also affects the "remote" resolution to 640x480, which is
>> inconvenient, and breaks the anaconda installer.
>> So when no EDID is present, set 1024x768 as preferred resolution.
>
> This conflates "monitor connected" and "EDID present", which are not
> necessarily the same thing.
>
> The fallback in drm_helper_probe_single_connector_modes() is for no
> modes, but connector status is connected or unknown.
When debugging the issue, I found it surprising that the status is
"connected" when nothing is plugged in the DP port.
>
> You could add a connector ->detect callback that returns disconnected
> when there's no display, and the problem should go away. If there's no
> ->detect callback, it'll default to connected.
ok, I'll try that. I don't know how the hardware detect something is
connected, but looking at the dp code, maybe checking
"AST_IO_CRTC_PORT,0xDC, ASTDP_LINK_SUCCESS" would be good enough.
>
>> Fixes: fae7d186403e ("drm/probe-helper: Default to 640x480 if no EDID on DP")
>> Signed-off-by: Jocelyn Falempe <jfalempe at redhat.com>
>> ---
>> drivers/gpu/drm/ast/ast_mode.c | 26 ++++++++++++++++++++++++--
>> 1 file changed, 24 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
>> index 36374828f6c8..8f7b7cc021c7 100644
>> --- a/drivers/gpu/drm/ast/ast_mode.c
>> +++ b/drivers/gpu/drm/ast/ast_mode.c
>> @@ -1589,9 +1589,31 @@ static const struct drm_connector_helper_funcs ast_dp501_connector_helper_funcs
>> .get_modes = ast_dp501_connector_helper_get_modes,
>> };
>>
>> +static int ast_dp_probe_single_connector_modes(struct drm_connector *connector,
>> + uint32_t maxX, uint32_t maxY)
>> +{
>> + int ret;
>> + struct drm_display_mode *mode;
>> +
>> + ret = drm_helper_probe_single_connector_modes(connector, maxX, maxY);
>> + /*
>> + * When no monitor are detected, DP now default to 640x480
>> + * As aspeed is mostly used in remote server, and DP monitors are
>> + * rarely attached, it's better to default to 1024x768
>> + */
>> + if (!connector->edid_blob_ptr) {
>
> Please try not to use connector->edid_blob_ptr for anything in
> drivers. The logic is complicated enough as it is, with the firmware and
> override EDIDs and everything, and makes future refactoring of EDID
> handling harder.
Ok, I will try your other suggestion, and remove this.
Thanks a lot for your comments.
--
Jocelyn
>
>
> BR,
> Jani.
>
>> + list_for_each_entry(mode, &connector->modes, head) {
>> + if (mode->hdisplay == 1024 && mode->vdisplay == 768)
>> + mode->type |= DRM_MODE_TYPE_PREFERRED;
>> + drm_mode_sort(&connector->modes);
>> + }
>> + }
>> + return ret;
>> +}
>> +
>> static const struct drm_connector_funcs ast_dp501_connector_funcs = {
>> .reset = drm_atomic_helper_connector_reset,
>> - .fill_modes = drm_helper_probe_single_connector_modes,
>> + .fill_modes = ast_dp_probe_single_connector_modes,
>> .destroy = drm_connector_cleanup,
>> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
>> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>> @@ -1678,7 +1700,7 @@ static const struct drm_connector_helper_funcs ast_astdp_connector_helper_funcs
>>
>> static const struct drm_connector_funcs ast_astdp_connector_funcs = {
>> .reset = drm_atomic_helper_connector_reset,
>> - .fill_modes = drm_helper_probe_single_connector_modes,
>> + .fill_modes = ast_dp_probe_single_connector_modes,
>> .destroy = drm_connector_cleanup,
>> .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
>> .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
>>
>> base-commit: 0adec22702d497385dbdc52abb165f379a00efba
>
More information about the dri-devel
mailing list