[PATCH 2/5] drm/mgag200: vga-bmc: Transparently handle BMC

Thomas Zimmermann tzimmermann at suse.de
Fri Sep 27 14:22:50 UTC 2024


Hi

Am 27.09.24 um 16:08 schrieb Jani Nikula:
> On Mon, 05 Aug 2024, Thomas Zimmermann <tzimmermann at suse.de> wrote:
>> The VGA-BMC connector selects the VGA output if a display has been
>> attached to the physical connector. Otherwise it selects the BMC
>> output. In any case, the connector status is set to 'detected', so
>> that the userspace compositor displays to it.
>>
>> Depending on the setting, the connector's display modes either come
>> from the VGA monitor's EDID or from an internal list of BMC-compatible
>> modes.
>>
>> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
>> ---
>>   drivers/gpu/drm/mgag200/mgag200_vga_bmc.c | 50 ++++++++++++++++++++++-
>>   1 file changed, 48 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_vga_bmc.c b/drivers/gpu/drm/mgag200/mgag200_vga_bmc.c
>> index b6b90632b3c6..3a958c3587ac 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_vga_bmc.c
>> +++ b/drivers/gpu/drm/mgag200/mgag200_vga_bmc.c
>> @@ -1,6 +1,7 @@
>>   // SPDX-License-Identifier: GPL-2.0-only
>>   
>>   #include <drm/drm_atomic_helper.h>
>> +#include <drm/drm_edid.h>
>>   #include <drm/drm_modeset_helper_vtables.h>
>>   #include <drm/drm_probe_helper.h>
>>   
>> @@ -11,9 +12,54 @@ static const struct drm_encoder_funcs mgag200_dac_encoder_funcs = {
>>   	.destroy = drm_encoder_cleanup
>>   };
>>   
>> +static int mgag200_vga_bmc_connector_helper_get_modes(struct drm_connector *connector)
>> +{
>> +	struct mga_device *mdev = to_mga_device(connector->dev);
>> +	const struct mgag200_device_info *minfo = mdev->info;
>> +	int count;
>> +
>> +	count = drm_connector_helper_get_modes(connector);
>> +
>> +	if (!count) {
>> +		/*
>> +		 * 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, minfo->max_hdisplay, minfo->max_vdisplay);
>> +		if (count)
>> +			drm_set_preferred_mode(connector, 1024, 768);
>> +	}
>> +
>> +	return count;
>> +}
>> +
>> +/*
>> + * There's no monitor connected if the DDC did not return an EDID. Still
>> + * return 'connected' as there's always a BMC. Incrementing the connector's
>> + * epoch counter triggers an update of the related properties.
>> + */
>> +static int mgag200_vga_bmc_connector_helper_detect_ctx(struct drm_connector *connector,
>> +						       struct drm_modeset_acquire_ctx *ctx,
>> +						       bool force)
>> +{
>> +	enum drm_connector_status old_status, status;
>> +
>> +	if (connector->edid_blob_ptr)
> This is now the only place outside of drm_edid.c that uses edid_blob_ptr
> for anything.
>
> Seems like you're using it as a proxy for "had a display connected".
>
> I wish it could be kept private to the EDID code.

No problem. I'd also prefer to change this to work like in ast, [1] 
where that function tests for the connector's 'physical status'.

But I'd like to store the physical status in struct drm_connector and 
have an optional update helper that detects the actual (logical) status, 
as outlined at [2]. Can we talk about that?

Best regards
Thomas

[1] 
https://gitlab.freedesktop.org/drm/kernel/-/blob/ae2c6d8b3b88c176dff92028941a4023f1b4cb91/drivers/gpu/drm/ast/ast_vga.c#L29
[2] 
https://lore.kernel.org/dri-devel/1d16c1ae-2e27-4daa-b8a6-5eab179ef551@suse.de/

>
>
> BR,
> Jani.
>
>
>> +		old_status = connector_status_connected;
>> +	else
>> +		old_status = connector_status_disconnected;
>> +
>> +	status = drm_connector_helper_detect_from_ddc(connector, ctx, force);
>> +
>> +	if (status != old_status)
>> +		++connector->epoch_counter;
>> +	return connector_status_connected;
>> +}
>> +
>>   static const struct drm_connector_helper_funcs mgag200_vga_connector_helper_funcs = {
>> -	.get_modes = drm_connector_helper_get_modes,
>> -	.detect_ctx = drm_connector_helper_detect_from_ddc
>> +	.get_modes = mgag200_vga_bmc_connector_helper_get_modes,
>> +	.detect_ctx = mgag200_vga_bmc_connector_helper_detect_ctx,
>>   };
>>   
>>   static const struct drm_connector_funcs mgag200_vga_connector_funcs = {

-- 
--
Thomas Zimmermann
Graphics Driver Developer
SUSE Software Solutions Germany GmbH
Frankenstrasse 146, 90461 Nuernberg, Germany
GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman
HRB 36809 (AG Nuernberg)



More information about the dri-devel mailing list