All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Douglas Anderson <dianders@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Sean Paul <sean@poorly.run>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	Simon Ser <contact@emersion.fr>,
	Harry Wentland <harry.wentland@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	Jani Nikula <jani.nikula@linux.intel.com>,
	Emil Velikov <emil.l.velikov@gmail.com>
Subject: Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


WARNING: multiple messages have this Message-ID (diff)
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Douglas Anderson <dianders@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Sean Paul <sean@poorly.run>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	Simon Ser <contact@emersion.fr>,
	Harry Wentland <harry.wentland@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	Jani Nikula <jani.nikula@linux.intel.com>,
	Emil Velikov <emil.l.velikov@gmail.com>
Subject: Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

WARNING: multiple messages have this Message-ID (diff)
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Emil Velikov <emil.l.velikov@gmail.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	Douglas Anderson <dianders@chromium.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Alex Deucher <alexander.deucher@amd.com>,
	Rob Herring <robh+dt@kernel.org>,
	linux-mediatek@lists.infradead.org,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Sean Paul <sean@poorly.run>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


WARNING: multiple messages have this Message-ID (diff)
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Harry Wentland <harry.wentland@amd.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	Douglas Anderson <dianders@chromium.org>,
	Maxime Ripard <mripard@kernel.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Alex Deucher <alexander.deucher@amd.com>,
	Rob Herring <robh+dt@kernel.org>,
	linux-mediatek@lists.infradead.org,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Simon Ser <contact@emersion.fr>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [Intel-gfx] [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


WARNING: multiple messages have this Message-ID (diff)
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Douglas Anderson <dianders@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Sean Paul <sean@poorly.run>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	Simon Ser <contact@emersion.fr>,
	Harry Wentland <harry.wentland@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	Jani Nikula <jani.nikula@linux.intel.com>,
	Emil Velikov <emil.l.velikov@gmail.com>
Subject: Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Hans de Goede <hdegoede@redhat.com>
To: Hsin-Yi Wang <hsinyi@chromium.org>,
	dri-devel@lists.freedesktop.org, David Airlie <airlied@linux.ie>,
	Daniel Vetter <daniel@ffwll.ch>,
	amd-gfx@lists.freedesktop.org, intel-gfx@lists.freedesktop.org
Cc: Rob Clark <robdclark@chromium.org>,
	Chun-Kuang Hu <chunkuang.hu@kernel.org>,
	Emil Velikov <emil.l.velikov@gmail.com>,
	Harry Wentland <harry.wentland@amd.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Douglas Anderson <dianders@chromium.org>,
	Maxime Ripard <mripard@kernel.org>,
	Stephen Boyd <swboyd@chromium.org>,
	Alex Deucher <alexander.deucher@amd.com>,
	Rob Herring <robh+dt@kernel.org>,
	linux-mediatek@lists.infradead.org,
	Jani Nikula <jani.nikula@linux.intel.com>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	Simon Ser <contact@emersion.fr>,
	Matthias Brugger <matthias.bgg@gmail.com>,
	Sean Paul <sean@poorly.run>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
Date: Mon, 30 May 2022 11:01:09 +0200	[thread overview]
Message-ID: <09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com> (raw)
In-Reply-To: <3ae6d7d1-fcf2-a769-5e4d-f80328ae06fe@redhat.com>

Hi,

On 5/30/22 10:57, Hans de Goede wrote:
> Hi,
> 
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>> drm_dev_register() sets connector->registration_state to
>> DRM_CONNECTOR_REGISTERED and dev->registered to true. If
>> drm_connector_set_panel_orientation() is first called after
>> drm_dev_register(), it will fail several checks and results in following
>> warning.
>>
>> Add a function to create panel orientation property and set default value
>> to UNKNOWN, so drivers can call this function to init the property earlier
>> , and let the panel set the real value later.
>>
>> [    4.480976] ------------[ cut here ]------------
>> [    4.485603] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:45 __drm_mode_object_add+0xb4/0xbc
>> <snip>
>> [    4.609772] Call trace:
>> [    4.612208]  __drm_mode_object_add+0xb4/0xbc
>> [    4.616466]  drm_mode_object_add+0x20/0x2c
>> [    4.620552]  drm_property_create+0xdc/0x174
>> [    4.624723]  drm_property_create_enum+0x34/0x98
>> [    4.629241]  drm_connector_set_panel_orientation+0x64/0xa0
>> [    4.634716]  boe_panel_get_modes+0x88/0xd8
>> [    4.638802]  drm_panel_get_modes+0x2c/0x48
>> [    4.642887]  panel_bridge_get_modes+0x1c/0x28
>> [    4.647233]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.652273]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.658266]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.662699]  drm_ioctl_kernel+0xac/0x128
>> [    4.666611]  drm_ioctl+0x268/0x410
>> [    4.670002]  drm_compat_ioctl+0xdc/0xf0
>> [    4.673829]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.678436]  el0_svc_common+0xf4/0x1c0
>> [    4.682174]  do_el0_svc_compat+0x28/0x3c
>> [    4.686088]  el0_svc_compat+0x10/0x1c
>> [    4.689738]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.694171]  el0_sync_compat+0x178/0x180
>> [    4.698082] ---[ end trace b4f2db9d9c88610b ]---
>> [    4.702721] ------------[ cut here ]------------
>> [    4.707329] WARNING: CPU: 5 PID: 369 at drivers/gpu/drm/drm_mode_object.c:243 drm_object_attach_property+0x48/0xb8
>> <snip>
>> [    4.833830] Call trace:
>> [    4.836266]  drm_object_attach_property+0x48/0xb8
>> [    4.840958]  drm_connector_set_panel_orientation+0x84/0xa0
>> [    4.846432]  boe_panel_get_modes+0x88/0xd8
>> [    4.850516]  drm_panel_get_modes+0x2c/0x48
>> [    4.854600]  panel_bridge_get_modes+0x1c/0x28
>> [    4.858946]  drm_bridge_connector_get_modes+0xa0/0xd4
>> [    4.863984]  drm_helper_probe_single_connector_modes+0x218/0x700
>> [    4.869978]  drm_mode_getconnector+0x1b4/0x45c
>> [    4.874410]  drm_ioctl_kernel+0xac/0x128
>> [    4.878320]  drm_ioctl+0x268/0x410
>> [    4.881711]  drm_compat_ioctl+0xdc/0xf0
>> [    4.885536]  __arm64_compat_sys_ioctl+0xc8/0x100
>> [    4.890142]  el0_svc_common+0xf4/0x1c0
>> [    4.893879]  do_el0_svc_compat+0x28/0x3c
>> [    4.897791]  el0_svc_compat+0x10/0x1c
>> [    4.901441]  el0_sync_compat_handler+0xa8/0xcc
>> [    4.905873]  el0_sync_compat+0x178/0x180
>> [    4.909783] ---[ end trace b4f2db9d9c88610c ]---
>>
>> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
>> Reviewed-by: Sean Paul <seanpaul@chromium.org>
>> ---
>> v9->v10: rebase to latest linux-next.
>> v9: https://patchwork.kernel.org/project/linux-mediatek/patch/20220318074825.3359978-2-hsinyi@chromium.org/
>> v8: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208084234.1684930-1-hsinyi@chromium.org/
>> v7: https://patchwork.kernel.org/project/linux-mediatek/patch/20220208073714.1540390-1-hsinyi@chromium.org/
>> ---
>>  drivers/gpu/drm/drm_connector.c | 58 +++++++++++++++++++++++++--------
>>  include/drm/drm_connector.h     |  2 ++
>>  2 files changed, 47 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
>> index 1c48d162c77e..d68cc78f6684 100644
>> --- a/drivers/gpu/drm/drm_connector.c
>> +++ b/drivers/gpu/drm/drm_connector.c
>> @@ -1252,7 +1252,7 @@ static const struct drm_prop_enum_list dp_colorspaces[] = {
>>   *	INPUT_PROP_DIRECT) will still map 1:1 to the actual LCD panel
>>   *	coordinates, so if userspace rotates the picture to adjust for
>>   *	the orientation it must also apply the same transformation to the
>> - *	touchscreen input coordinates. This property is initialized by calling
>> + *	touchscreen input coordinates. This property value is set by calling
>>   *	drm_connector_set_panel_orientation() or
>>   *	drm_connector_set_panel_orientation_with_quirk()
>>   *
>> @@ -2310,8 +2310,8 @@ EXPORT_SYMBOL(drm_connector_set_vrr_capable_property);
>>   * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   *
>> - * This function sets the connector's panel_orientation and attaches
>> - * a "panel orientation" property to the connector.
>> + * This function sets the connector's panel_orientation value. If the property
>> + * doesn't exist, it will try to create one.
>>   *
>>   * Calling this function on a connector where the panel_orientation has
>>   * already been set is a no-op (e.g. the orientation has been overridden with
>> @@ -2343,18 +2343,13 @@ int drm_connector_set_panel_orientation(
>>  
>>  	prop = dev->mode_config.panel_orientation_property;
>>  	if (!prop) {
>> -		prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> -				"panel orientation",
>> -				drm_panel_orientation_enum_list,
>> -				ARRAY_SIZE(drm_panel_orientation_enum_list));
>> -		if (!prop)
>> +		if (drm_connector_init_panel_orientation_property(connector) < 0)
>>  			return -ENOMEM;
>> -
>> -		dev->mode_config.panel_orientation_property = prop;
>> +		prop = dev->mode_config.panel_orientation_property;
>>  	}
>>  
>> -	drm_object_attach_property(&connector->base, prop,
>> -				   info->panel_orientation);
>> +	drm_object_property_set_value(&connector->base, prop,
>> +				      info->panel_orientation);
>>  	return 0;
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>> @@ -2362,7 +2357,7 @@ EXPORT_SYMBOL(drm_connector_set_panel_orientation);
>>  /**
>>   * drm_connector_set_panel_orientation_with_quirk - set the
>>   *	connector's panel_orientation after checking for quirks
>> - * @connector: connector for which to init the panel-orientation property.
>> + * @connector: connector for which to set the panel-orientation property.
>>   * @panel_orientation: drm_panel_orientation value to set
>>   * @width: width in pixels of the panel, used for panel quirk detection
>>   * @height: height in pixels of the panel, used for panel quirk detection
>> @@ -2389,6 +2384,43 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  }
>>  EXPORT_SYMBOL(drm_connector_set_panel_orientation_with_quirk);
>>  
>> +/**
>> + * drm_connector_init_panel_orientation_property -
>> + * 	create the connector's panel orientation property
>> + *
>> + * This function attaches a "panel orientation" property to the connector
>> + * and initializes its value to DRM_MODE_PANEL_ORIENTATION_UNKNOWN.
>> + *
>> + * The value of the property can be set by drm_connector_set_panel_orientation()
>> + * or drm_connector_set_panel_orientation_with_quirk() later.
>> + *
>> + * Returns:
>> + * Zero on success, negative errno on failure.
>> + */
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector)
>> +{
>> +	struct drm_device *dev = connector->dev;
>> +	struct drm_property *prop;
>> +
>> +	if(dev->mode_config.panel_orientation_property)
>> +		return 0;
>> +
>> +	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
>> +			"panel orientation",
>> +			drm_panel_orientation_enum_list,
>> +			ARRAY_SIZE(drm_panel_orientation_enum_list));
>> +	if (!prop)
>> +		return -ENOMEM;
>> +
>> +	dev->mode_config.panel_orientation_property = prop;
>> +	drm_object_attach_property(&connector->base, prop,
>> +				   DRM_MODE_PANEL_ORIENTATION_UNKNOWN);
> 
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN is -1 which is not a valid value
> for an enum. IOW when the panel-orientation is DRM_MODE_PANEL_ORIENTATION_UNKNOWN
> then the property should not be created on the drm-connector object at all.

p.s. note that the original drm_connector_set_panel_orientation() avoids
ever creating the property when the orientation is unknown because of
this bit of code near the top of the function:

        /* Don't attach the property if the orientation is unknown */
        if (panel_orientation == DRM_MODE_PANEL_ORIENTATION_UNKNOWN)
                return 0;

> Which brings us back to what I said in reply to the coverletter,
> it seems that you have a probe ordering problem here; and fixing that
> issue would make this patch-set unnecessary.

Regards,

Hans


>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL(drm_connector_init_panel_orientation_property);
>> +
>>  static const struct drm_prop_enum_list privacy_screen_enum[] = {
>>  	{ PRIVACY_SCREEN_DISABLED,		"Disabled" },
>>  	{ PRIVACY_SCREEN_ENABLED,		"Enabled" },
>> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
>> index 3ac4bf87f257..f0681091c617 100644
>> --- a/include/drm/drm_connector.h
>> +++ b/include/drm/drm_connector.h
>> @@ -1802,6 +1802,8 @@ int drm_connector_set_panel_orientation_with_quirk(
>>  	struct drm_connector *connector,
>>  	enum drm_panel_orientation panel_orientation,
>>  	int width, int height);
>> +int drm_connector_init_panel_orientation_property(
>> +	struct drm_connector *connector);
>>  int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
>>  					  int min, int max);
>>  void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);


  reply	other threads:[~2022-05-30  9:01 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-30  8:19 [PATCH v10 0/4] Separate panel orientation property creating and value setting Hsin-Yi Wang
2022-05-30  8:19 ` Hsin-Yi Wang
2022-05-30  8:19 ` Hsin-Yi Wang
2022-05-30  8:19 ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30  8:19 ` Hsin-Yi Wang
2022-05-30  8:19 ` Hsin-Yi Wang
2022-05-30  8:19 ` [PATCH v10 1/4] gpu: drm: separate " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:57   ` Hans de Goede
2022-05-30  8:57     ` Hans de Goede
2022-05-30  8:57     ` Hans de Goede
2022-05-30  8:57     ` Hans de Goede
2022-05-30  8:57     ` [Intel-gfx] " Hans de Goede
2022-05-30  8:57     ` Hans de Goede
2022-05-30  9:01     ` Hans de Goede [this message]
2022-05-30  9:01       ` Hans de Goede
2022-05-30  9:01       ` Hans de Goede
2022-05-30  9:01       ` [Intel-gfx] " Hans de Goede
2022-05-30  9:01       ` Hans de Goede
2022-05-30  9:01       ` Hans de Goede
2022-05-30  8:19 ` [PATCH v10 2/4] drm/mediatek: init panel orientation property Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19 ` [PATCH v10 3/4] drm/msm: " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19 ` [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:19   ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30  8:19   ` Hsin-Yi Wang
2022-05-30  8:44 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Separate panel orientation property creating and value setting (rev2) Patchwork
2022-05-30  8:44 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2022-05-30  8:53 ` [PATCH v10 0/4] Separate panel orientation property creating and value setting Hans de Goede
2022-05-30  8:53   ` Hans de Goede
2022-05-30  8:53   ` Hans de Goede
2022-05-30  8:53   ` Hans de Goede
2022-05-30  8:53   ` Hans de Goede
2022-05-30  8:53   ` [Intel-gfx] " Hans de Goede
2022-05-30 11:34   ` Hsin-Yi Wang
2022-05-30 11:34     ` Hsin-Yi Wang
2022-05-30 11:34     ` Hsin-Yi Wang
2022-05-30 11:34     ` [Intel-gfx] " Hsin-Yi Wang
2022-05-30 11:34     ` Hsin-Yi Wang
2022-05-30 11:34     ` Hsin-Yi Wang
2022-05-31 10:56     ` Hans de Goede
2022-05-31 10:56       ` Hans de Goede
2022-05-31 10:56       ` Hans de Goede
2022-05-31 10:56       ` Hans de Goede
2022-05-31 10:56       ` [Intel-gfx] " Hans de Goede
2022-05-31 10:56       ` Hans de Goede
2022-06-01  8:26       ` Hsin-Yi Wang
2022-06-01  8:26         ` Hsin-Yi Wang
2022-06-01  8:26         ` Hsin-Yi Wang
2022-06-01  8:26         ` [Intel-gfx] " Hsin-Yi Wang
2022-06-01  8:26         ` Hsin-Yi Wang
2022-06-01  8:26         ` Hsin-Yi Wang
2022-05-30  9:08 ` [Intel-gfx] ✗ Fi.CI.BAT: failure for Separate panel orientation property creating and value setting (rev2) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=09c12a48-534f-e6b8-eaef-f05874087d35@redhat.com \
    --to=hdegoede@redhat.com \
    --cc=airlied@linux.ie \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=chunkuang.hu@kernel.org \
    --cc=contact@emersion.fr \
    --cc=daniel@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=emil.l.velikov@gmail.com \
    --cc=harry.wentland@amd.com \
    --cc=hsinyi@chromium.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=matthias.bgg@gmail.com \
    --cc=mripard@kernel.org \
    --cc=robdclark@chromium.org \
    --cc=robh+dt@kernel.org \
    --cc=sean@poorly.run \
    --cc=swboyd@chromium.org \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.