Commit 44a37ba1 authored by Thomas Zimmermann's avatar Thomas Zimmermann

drm/ast: dp501: Transparently handle BMC support

Permanently set the connector status to 'connected'. Return BMC modes
for connector if no display is attached to the physical DP connector.
Otherwise use EDID modes as before.

If the status of the physical connector changes, the driver still
generates a hotplug event. DRM clients will then reconfigure their
output to a mode appropriate for either physical display or BMC.

v3:
- use struct ast_connector.physical_status to handle BMC
Signed-off-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJocelyn Falempe <jfalempe@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240815151953.184679-9-tzimmermann@suse.de
parent 9e7a74a1
...@@ -509,14 +509,29 @@ static const struct drm_encoder_helper_funcs ast_dp501_encoder_helper_funcs = { ...@@ -509,14 +509,29 @@ static const struct drm_encoder_helper_funcs ast_dp501_encoder_helper_funcs = {
static int ast_dp501_connector_helper_get_modes(struct drm_connector *connector) static int ast_dp501_connector_helper_get_modes(struct drm_connector *connector)
{ {
struct ast_connector *ast_connector = to_ast_connector(connector);
int count;
if (ast_connector->physical_status == connector_status_connected) {
struct ast_device *ast = to_ast_device(connector->dev); struct ast_device *ast = to_ast_device(connector->dev);
const struct drm_edid *drm_edid; const struct drm_edid *drm_edid;
int count;
drm_edid = drm_edid_read_custom(connector, ast_dp512_read_edid_block, ast); drm_edid = drm_edid_read_custom(connector, ast_dp512_read_edid_block, ast);
drm_edid_connector_update(connector, drm_edid); drm_edid_connector_update(connector, drm_edid);
count = drm_edid_connector_add_modes(connector); count = drm_edid_connector_add_modes(connector);
drm_edid_free(drm_edid); drm_edid_free(drm_edid);
} else {
drm_edid_connector_update(connector, NULL);
/*
* There's no EDID data without a connected monitor. Set BMC-
* compatible modes in this case. The XGA default resolution
* should work well for all BMCs.
*/
count = drm_add_modes_noedid(connector, 4096, 4096);
if (count)
drm_set_preferred_mode(connector, 1024, 768);
}
return count; return count;
} }
...@@ -530,11 +545,13 @@ static int ast_dp501_connector_helper_detect_ctx(struct drm_connector *connector ...@@ -530,11 +545,13 @@ static int ast_dp501_connector_helper_detect_ctx(struct drm_connector *connector
enum drm_connector_status status = connector_status_disconnected; enum drm_connector_status status = connector_status_disconnected;
if (ast_dp501_is_connected(ast)) if (ast_dp501_is_connected(ast))
return connector_status_connected; status = connector_status_connected;
if (status != ast_connector->physical_status)
++connector->epoch_counter;
ast_connector->physical_status = status; ast_connector->physical_status = status;
return status; return connector_status_connected;
} }
static const struct drm_connector_helper_funcs ast_dp501_connector_helper_funcs = { static const struct drm_connector_helper_funcs ast_dp501_connector_helper_funcs = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment