All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply	[flat|nested] 69+ messages in thread

* [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	Hans de Goede, linux-arm-kernel

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply	[flat|nested] 69+ messages in thread

* [Intel-gfx] [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply	[flat|nested] 69+ messages in thread

* [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:19 ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, Hans de Goede, linux-arm-kernel

Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
orientation. Panel calls drm_connector_set_panel_orientation() to create
orientation property and sets the value. However, connector properties
can't be created after drm_dev_register() is called. The goal is to
separate the orientation property creation, so drm drivers can create it
earlier before drm_dev_register().

After this series, drm_connector_set_panel_orientation() works like
before. It won't affect existing callers of
drm_connector_set_panel_orientation(). The only difference is that
some drm drivers can call drm_connector_init_panel_orientation_property()
earlier.

Hsin-Yi Wang (4):
  gpu: drm: separate panel orientation property creating and value
    setting
  drm/mediatek: init panel orientation property
  drm/msm: init panel orientation property
  arm64: dts: mt8183: Add panel rotation

 .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
 drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
 drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
 include/drm/drm_connector.h                   |  2 +
 5 files changed, 59 insertions(+), 13 deletions(-)

-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply	[flat|nested] 69+ messages in thread

* [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
  2022-05-30  8:19 ` Hsin-Yi Wang
                     ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	Hans de Goede, linux-arm-kernel

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [Intel-gfx] [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, Hans de Goede, linux-arm-kernel

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);
+
+	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);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 2/4] drm/mediatek: init panel orientation property
  2022-05-30  8:19 ` Hsin-Yi Wang
                     ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 2/4] drm/mediatek: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	Hans de Goede, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [Intel-gfx] [PATCH v10 2/4] drm/mediatek: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 2/4] drm/mediatek: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 2/4] drm/mediatek: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 2/4] drm/mediatek: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, Hans de Goede, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Acked-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
---
 drivers/gpu/drm/mediatek/mtk_dsi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index d9f10a33e6fa..3db44d9b161a 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -822,6 +822,13 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
 		ret = PTR_ERR(dsi->connector);
 		goto err_cleanup_encoder;
 	}
+
+	ret = drm_connector_init_panel_orientation_property(dsi->connector);
+	if (ret) {
+		DRM_ERROR("Unable to init panel orientation\n");
+		goto err_cleanup_encoder;
+	}
+
 	drm_connector_attach_encoder(dsi->connector, &dsi->encoder);
 
 	return 0;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 3/4] drm/msm: init panel orientation property
  2022-05-30  8:19 ` Hsin-Yi Wang
                     ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 3/4] drm/msm: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	Hans de Goede, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [Intel-gfx] [PATCH v10 3/4] drm/msm: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 3/4] drm/msm: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 3/4] drm/msm: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 3/4] drm/msm: init panel orientation property
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, Hans de Goede, linux-arm-kernel

Init panel orientation property after connector is initialized. Let the
panel driver decides the orientation value later.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index cb84d185d73a..16ad3d8fab4d 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -669,6 +669,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	connector->interlace_allowed = 0;
 	connector->doublescan_allowed = 0;
 
+	ret = drm_connector_init_panel_orientation_property(connector);
+	if (ret)
+		goto fail;
+
 	drm_connector_attach_encoder(connector, msm_dsi->encoder);
 
 	ret = msm_dsi_manager_panel_init(connector, id);
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
  2022-05-30  8:19 ` Hsin-Yi Wang
                     ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	Hans de Goede, linux-arm-kernel

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [Intel-gfx] [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov, Hans de Goede

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


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

^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [PATCH v10 4/4] arm64: dts: mt8183: Add panel rotation
@ 2022-05-30  8:19   ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30  8:19 UTC (permalink / raw)
  To: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, Hans de Goede, linux-arm-kernel

krane, kakadu, and kodama boards have a default panel rotation.

Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org>
Reviewed-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Tested-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
---
 arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 1 +
 1 file changed, 1 insertion(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
index 8d5bf73a9099..f0dd5a06629d 100644
--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
@@ -276,6 +276,7 @@ panel: panel@0 {
 		avee-supply = <&ppvarp_lcd>;
 		pp1800-supply = <&pp1800_lcd>;
 		backlight = <&backlight_lcd0>;
+		rotation = <270>;
 		port {
 			panel_in: endpoint {
 				remote-endpoint = <&dsi_out>;
-- 
2.36.1.124.g0e6072fb45-goog


^ permalink raw reply related	[flat|nested] 69+ messages in thread

* [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Separate panel orientation property creating and value setting (rev2)
  2022-05-30  8:19 ` Hsin-Yi Wang
                   ` (8 preceding siblings ...)
  (?)
@ 2022-05-30  8:44 ` Patchwork
  -1 siblings, 0 replies; 69+ messages in thread
From: Patchwork @ 2022-05-30  8:44 UTC (permalink / raw)
  To: Hsin-Yi Wang; +Cc: intel-gfx

== Series Details ==

Series: Separate panel orientation property creating and value setting (rev2)
URL   : https://patchwork.freedesktop.org/series/101530/
State : warning

== Summary ==

Error: dim checkpatch failed
bf8654ee2da6 gpu: drm: separate panel orientation property creating and value setting
-:130: WARNING:SPACE_BEFORE_TAB: please, no space before tabs
#130: FILE: drivers/gpu/drm/drm_connector.c:2389:
+ * ^Icreate the connector's panel orientation property$

-:141: CHECK:OPEN_ENDED_LINE: Lines should not end with a '('
#141: FILE: drivers/gpu/drm/drm_connector.c:2400:
+int drm_connector_init_panel_orientation_property(

-:147: ERROR:SPACING: space required before the open parenthesis '('
#147: FILE: drivers/gpu/drm/drm_connector.c:2406:
+	if(dev->mode_config.panel_orientation_property)

-:151: CHECK:PARENTHESIS_ALIGNMENT: Alignment should match open parenthesis
#151: FILE: drivers/gpu/drm/drm_connector.c:2410:
+	prop = drm_property_create_enum(dev, DRM_MODE_PROP_IMMUTABLE,
+			"panel orientation",

-:176: CHECK:OPEN_ENDED_LINE: Lines should not end with a '('
#176: FILE: include/drm/drm_connector.h:1805:
+int drm_connector_init_panel_orientation_property(

total: 1 errors, 1 warnings, 3 checks, 99 lines checked
fb63fbb19c0d drm/mediatek: init panel orientation property
24e07972d2f3 drm/msm: init panel orientation property
205b521cb9de arm64: dts: mt8183: Add panel rotation



^ permalink raw reply	[flat|nested] 69+ messages in thread

* [Intel-gfx] ✗ Fi.CI.SPARSE: warning for Separate panel orientation property creating and value setting (rev2)
  2022-05-30  8:19 ` Hsin-Yi Wang
                   ` (9 preceding siblings ...)
  (?)
@ 2022-05-30  8:44 ` Patchwork
  -1 siblings, 0 replies; 69+ messages in thread
From: Patchwork @ 2022-05-30  8:44 UTC (permalink / raw)
  To: Hsin-Yi Wang; +Cc: intel-gfx

== Series Details ==

Series: Separate panel orientation property creating and value setting (rev2)
URL   : https://patchwork.freedesktop.org/series/101530/
State : warning

== Summary ==

Error: dim sparse failed
Sparse version: v0.6.2
Fast mode used, each commit won't be checked separately.



^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
  2022-05-30  8:19 ` Hsin-Yi Wang
                     ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:53   ` Hans de Goede
  -1 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	linux-arm-kernel

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:53   ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:53   ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:53   ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:53   ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30  8:53   ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:53 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, linux-arm-kernel

Hi,

On 5/30/22 10:19, Hsin-Yi Wang wrote:
> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> orientation. Panel calls drm_connector_set_panel_orientation() to create
> orientation property and sets the value. However, connector properties
> can't be created after drm_dev_register() is called. The goal is to
> separate the orientation property creation, so drm drivers can create it
> earlier before drm_dev_register().

Sorry for jumping in pretty late in the discussion (based on the v10
I seem to have missed this before).

This sounds to me like the real issue here is that drm_dev_register()
is getting called too early?

To me it seems sensible to delay calling drm_dev_register() and
thus allowing userspace to start detecting available displays +
features until after the panel has been probed.

I see a devicetree patch in this series, so I guess that the panel
is described in devicetree. Especially in the case of devicetree
I would expect the kernel to have enough info to do the right
thing and make sure the panel is probed before calling
drm_dev_register() ?

Regards,

Hans




> 
> After this series, drm_connector_set_panel_orientation() works like
> before. It won't affect existing callers of
> drm_connector_set_panel_orientation(). The only difference is that
> some drm drivers can call drm_connector_init_panel_orientation_property()
> earlier.
> 
> Hsin-Yi Wang (4):
>   gpu: drm: separate panel orientation property creating and value
>     setting
>   drm/mediatek: init panel orientation property
>   drm/msm: init panel orientation property
>   arm64: dts: mt8183: Add panel rotation
> 
>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>  include/drm/drm_connector.h                   |  2 +
>  5 files changed, 59 insertions(+), 13 deletions(-)
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
  2022-05-30  8:19   ` Hsin-Yi Wang
                       ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  8:57     ` Hans de Goede
  -1 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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.

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:57     ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	linux-arm-kernel

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.

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:57     ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

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.

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:57     ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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.

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:57     ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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.

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  8:57     ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  8:57 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, linux-arm-kernel

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.

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
  2022-05-30  8:57     ` Hans de Goede
                         ` (3 preceding siblings ...)
  (?)
@ 2022-05-30  9:01       ` Hans de Goede
  -1 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  9:01       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  9:01       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, devicetree, linux-kernel,
	Douglas Anderson, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Thomas Zimmermann, Matthias Brugger, Sean Paul,
	linux-arm-kernel

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  9:01       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Harry Wentland, devicetree,
	linux-kernel, Douglas Anderson, Maxime Ripard, Stephen Boyd,
	Alex Deucher, Rob Herring, linux-mediatek, Thomas Zimmermann,
	Simon Ser, Matthias Brugger, linux-arm-kernel

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  9:01       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 1/4] gpu: drm: separate panel orientation property creating and value setting
@ 2022-05-30  9:01       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-30  9:01 UTC (permalink / raw)
  To: Hsin-Yi Wang, dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx
  Cc: Rob Clark, Chun-Kuang Hu, Emil Velikov, Harry Wentland,
	devicetree, linux-kernel, Maarten Lankhorst, Douglas Anderson,
	Maxime Ripard, Stephen Boyd, Alex Deucher, Rob Herring,
	linux-mediatek, Jani Nikula, Thomas Zimmermann, Simon Ser,
	Matthias Brugger, Sean Paul, linux-arm-kernel

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);


^ permalink raw reply	[flat|nested] 69+ messages in thread

* [Intel-gfx] ✗ Fi.CI.BAT: failure for Separate panel orientation property creating and value setting (rev2)
  2022-05-30  8:19 ` Hsin-Yi Wang
                   ` (11 preceding siblings ...)
  (?)
@ 2022-05-30  9:08 ` Patchwork
  -1 siblings, 0 replies; 69+ messages in thread
From: Patchwork @ 2022-05-30  9:08 UTC (permalink / raw)
  To: Hsin-Yi Wang; +Cc: intel-gfx

[-- Attachment #1: Type: text/plain, Size: 12974 bytes --]

== Series Details ==

Series: Separate panel orientation property creating and value setting (rev2)
URL   : https://patchwork.freedesktop.org/series/101530/
State : failure

== Summary ==

CI Bug Log - changes from CI_DRM_11705 -> Patchwork_101530v2
====================================================

Summary
-------

  **FAILURE**

  Serious unknown changes coming with Patchwork_101530v2 absolutely need to be
  verified manually.
  
  If you think the reported changes have nothing to do with the changes
  introduced in Patchwork_101530v2, please notify your bug team to allow them
  to document this new failure mode, which will reduce false positives in CI.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/index.html

Participating hosts (42 -> 46)
------------------------------

  Additional (4): bat-dg2-8 fi-rkl-11600 fi-bsw-nick fi-tgl-u2 

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in Patchwork_101530v2:

### IGT changes ###

#### Possible regressions ####

  * igt@prime_self_import@basic-with_one_bo_two_files:
    - fi-kbl-soraka:      [PASS][1] -> [INCOMPLETE][2]
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/fi-kbl-soraka/igt@prime_self_import@basic-with_one_bo_two_files.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-kbl-soraka/igt@prime_self_import@basic-with_one_bo_two_files.html

  
Known issues
------------

  Here are the changes found in Patchwork_101530v2 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_huc_copy@huc-copy:
    - fi-tgl-u2:          NOTRUN -> [SKIP][3] ([i915#2190])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@gem_huc_copy@huc-copy.html
    - fi-rkl-11600:       NOTRUN -> [SKIP][4] ([i915#2190])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@gem_huc_copy@huc-copy.html

  * igt@gem_lmem_swapping@basic:
    - fi-rkl-11600:       NOTRUN -> [SKIP][5] ([i915#4613]) +3 similar issues
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@gem_lmem_swapping@basic.html

  * igt@gem_lmem_swapping@parallel-random-engines:
    - fi-bsw-nick:        NOTRUN -> [SKIP][6] ([fdo#109271]) +48 similar issues
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-bsw-nick/igt@gem_lmem_swapping@parallel-random-engines.html

  * igt@gem_tiled_pread_basic:
    - fi-rkl-11600:       NOTRUN -> [SKIP][7] ([i915#3282])
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@gem_tiled_pread_basic.html

  * igt@i915_pm_backlight@basic-brightness:
    - fi-rkl-11600:       NOTRUN -> [SKIP][8] ([i915#3012])
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@i915_pm_backlight@basic-brightness.html

  * igt@i915_selftest@live@gem:
    - fi-blb-e6850:       NOTRUN -> [DMESG-FAIL][9] ([i915#4528])
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-blb-e6850/igt@i915_selftest@live@gem.html

  * igt@i915_selftest@live@hangcheck:
    - bat-dg1-6:          [PASS][10] -> [DMESG-FAIL][11] ([i915#4494] / [i915#4957])
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/bat-dg1-6/igt@i915_selftest@live@hangcheck.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/bat-dg1-6/igt@i915_selftest@live@hangcheck.html

  * igt@i915_suspend@basic-s2idle-without-i915:
    - fi-bdw-gvtdvm:      NOTRUN -> [INCOMPLETE][12] ([i915#4817])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-bdw-gvtdvm/igt@i915_suspend@basic-s2idle-without-i915.html

  * igt@i915_suspend@basic-s3-without-i915:
    - fi-rkl-11600:       NOTRUN -> [INCOMPLETE][13] ([i915#5982])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@i915_suspend@basic-s3-without-i915.html

  * igt@kms_chamelium@hdmi-edid-read:
    - fi-tgl-u2:          NOTRUN -> [SKIP][14] ([fdo#109284] / [fdo#111827]) +7 similar issues
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@kms_chamelium@hdmi-edid-read.html
    - fi-rkl-11600:       NOTRUN -> [SKIP][15] ([fdo#111827]) +7 similar issues
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_chamelium@hdmi-edid-read.html

  * igt@kms_chamelium@hdmi-hpd-fast:
    - fi-bsw-nick:        NOTRUN -> [SKIP][16] ([fdo#109271] / [fdo#111827]) +8 similar issues
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-bsw-nick/igt@kms_chamelium@hdmi-hpd-fast.html

  * igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
    - fi-tgl-u2:          NOTRUN -> [SKIP][17] ([i915#4103]) +1 similar issue
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html
    - fi-rkl-11600:       NOTRUN -> [SKIP][18] ([i915#4070] / [i915#4103]) +1 similar issue
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html

  * igt@kms_flip@basic-flip-vs-modeset@a-edp1:
    - fi-tgl-u2:          NOTRUN -> [DMESG-WARN][19] ([i915#402]) +2 similar issues
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@kms_flip@basic-flip-vs-modeset@a-edp1.html

  * igt@kms_flip@basic-flip-vs-modeset@b-edp1:
    - bat-adlp-4:         [PASS][20] -> [DMESG-WARN][21] ([i915#3576]) +1 similar issue
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/bat-adlp-4/igt@kms_flip@basic-flip-vs-modeset@b-edp1.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/bat-adlp-4/igt@kms_flip@basic-flip-vs-modeset@b-edp1.html

  * igt@kms_force_connector_basic@force-load-detect:
    - fi-tgl-u2:          NOTRUN -> [SKIP][22] ([fdo#109285])
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@kms_force_connector_basic@force-load-detect.html
    - fi-rkl-11600:       NOTRUN -> [SKIP][23] ([fdo#109285] / [i915#4098])
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_force_connector_basic@force-load-detect.html

  * igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d:
    - fi-rkl-11600:       NOTRUN -> [SKIP][24] ([i915#4070] / [i915#533])
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_pipe_crc_basic@compare-crc-sanitycheck-pipe-d.html

  * igt@kms_psr@primary_page_flip:
    - fi-rkl-11600:       NOTRUN -> [SKIP][25] ([i915#1072]) +3 similar issues
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_psr@primary_page_flip.html

  * igt@kms_setmode@basic-clone-single-crtc:
    - fi-rkl-11600:       NOTRUN -> [SKIP][26] ([i915#3555] / [i915#4098])
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@kms_setmode@basic-clone-single-crtc.html
    - fi-tgl-u2:          NOTRUN -> [SKIP][27] ([i915#3555])
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@kms_setmode@basic-clone-single-crtc.html

  * igt@prime_vgem@basic-read:
    - fi-rkl-11600:       NOTRUN -> [SKIP][28] ([fdo#109295] / [i915#3291] / [i915#3708]) +2 similar issues
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@prime_vgem@basic-read.html

  * igt@prime_vgem@basic-userptr:
    - fi-tgl-u2:          NOTRUN -> [SKIP][29] ([fdo#109295] / [i915#3301])
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-tgl-u2/igt@prime_vgem@basic-userptr.html
    - fi-rkl-11600:       NOTRUN -> [SKIP][30] ([fdo#109295] / [i915#3301] / [i915#3708])
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-rkl-11600/igt@prime_vgem@basic-userptr.html

  
#### Possible fixes ####

  * igt@i915_selftest@live@coherency:
    - {bat-dg2-9}:        [DMESG-WARN][31] ([i915#5763]) -> [PASS][32] +5 similar issues
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/bat-dg2-9/igt@i915_selftest@live@coherency.html
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/bat-dg2-9/igt@i915_selftest@live@coherency.html

  * igt@i915_selftest@live@execlists:
    - fi-bdw-gvtdvm:      [INCOMPLETE][33] ([i915#2940] / [i915#5801]) -> [PASS][34]
   [33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/fi-bdw-gvtdvm/igt@i915_selftest@live@execlists.html
   [34]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-bdw-gvtdvm/igt@i915_selftest@live@execlists.html

  * igt@i915_selftest@live@requests:
    - fi-blb-e6850:       [DMESG-FAIL][35] ([i915#4528]) -> [PASS][36]
   [35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/fi-blb-e6850/igt@i915_selftest@live@requests.html
   [36]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/fi-blb-e6850/igt@i915_selftest@live@requests.html

  * igt@kms_busy@basic@flip:
    - bat-adlp-4:         [DMESG-WARN][37] ([i915#3576]) -> [PASS][38] +1 similar issue
   [37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_11705/bat-adlp-4/igt@kms_busy@basic@flip.html
   [38]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/bat-adlp-4/igt@kms_busy@basic@flip.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
  [fdo#109284]: https://bugs.freedesktop.org/show_bug.cgi?id=109284
  [fdo#109285]: https://bugs.freedesktop.org/show_bug.cgi?id=109285
  [fdo#109295]: https://bugs.freedesktop.org/show_bug.cgi?id=109295
  [fdo#111827]: https://bugs.freedesktop.org/show_bug.cgi?id=111827
  [i915#1072]: https://gitlab.freedesktop.org/drm/intel/issues/1072
  [i915#2190]: https://gitlab.freedesktop.org/drm/intel/issues/2190
  [i915#2575]: https://gitlab.freedesktop.org/drm/intel/issues/2575
  [i915#2582]: https://gitlab.freedesktop.org/drm/intel/issues/2582
  [i915#2940]: https://gitlab.freedesktop.org/drm/intel/issues/2940
  [i915#3012]: https://gitlab.freedesktop.org/drm/intel/issues/3012
  [i915#3282]: https://gitlab.freedesktop.org/drm/intel/issues/3282
  [i915#3291]: https://gitlab.freedesktop.org/drm/intel/issues/3291
  [i915#3301]: https://gitlab.freedesktop.org/drm/intel/issues/3301
  [i915#3555]: https://gitlab.freedesktop.org/drm/intel/issues/3555
  [i915#3576]: https://gitlab.freedesktop.org/drm/intel/issues/3576
  [i915#3708]: https://gitlab.freedesktop.org/drm/intel/issues/3708
  [i915#402]: https://gitlab.freedesktop.org/drm/intel/issues/402
  [i915#4070]: https://gitlab.freedesktop.org/drm/intel/issues/4070
  [i915#4098]: https://gitlab.freedesktop.org/drm/intel/issues/4098
  [i915#4103]: https://gitlab.freedesktop.org/drm/intel/issues/4103
  [i915#4312]: https://gitlab.freedesktop.org/drm/intel/issues/4312
  [i915#4494]: https://gitlab.freedesktop.org/drm/intel/issues/4494
  [i915#4528]: https://gitlab.freedesktop.org/drm/intel/issues/4528
  [i915#4613]: https://gitlab.freedesktop.org/drm/intel/issues/4613
  [i915#4817]: https://gitlab.freedesktop.org/drm/intel/issues/4817
  [i915#4957]: https://gitlab.freedesktop.org/drm/intel/issues/4957
  [i915#5122]: https://gitlab.freedesktop.org/drm/intel/issues/5122
  [i915#5171]: https://gitlab.freedesktop.org/drm/intel/issues/5171
  [i915#5174]: https://gitlab.freedesktop.org/drm/intel/issues/5174
  [i915#5181]: https://gitlab.freedesktop.org/drm/intel/issues/5181
  [i915#5190]: https://gitlab.freedesktop.org/drm/intel/issues/5190
  [i915#533]: https://gitlab.freedesktop.org/drm/intel/issues/533
  [i915#5606]: https://gitlab.freedesktop.org/drm/intel/issues/5606
  [i915#5703]: https://gitlab.freedesktop.org/drm/intel/issues/5703
  [i915#5763]: https://gitlab.freedesktop.org/drm/intel/issues/5763
  [i915#5775]: https://gitlab.freedesktop.org/drm/intel/issues/5775
  [i915#5801]: https://gitlab.freedesktop.org/drm/intel/issues/5801
  [i915#5903]: https://gitlab.freedesktop.org/drm/intel/issues/5903
  [i915#5982]: https://gitlab.freedesktop.org/drm/intel/issues/5982


Build changes
-------------

  * Linux: CI_DRM_11705 -> Patchwork_101530v2

  CI-20190529: 20190529
  CI_DRM_11705: 18a2e6dbca526f996da04741cf5ef169e810a50e @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_6495: 7e2033da45f024a0348e6034fcb7f70a91b80ee9 @ https://gitlab.freedesktop.org/drm/igt-gpu-tools.git
  Patchwork_101530v2: 18a2e6dbca526f996da04741cf5ef169e810a50e @ git://anongit.freedesktop.org/gfx-ci/linux


### Linux commits

01d561b9bb95 arm64: dts: mt8183: Add panel rotation
21530cae4fa3 drm/msm: init panel orientation property
a026c392838a drm/mediatek: init panel orientation property
d1faead57b36 gpu: drm: separate panel orientation property creating and value setting

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_101530v2/index.html

[-- Attachment #2: Type: text/html, Size: 14532 bytes --]

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
  2022-05-30  8:53   ` [Intel-gfx] " Hans de Goede
                       ` (3 preceding siblings ...)
  (?)
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Chun-Kuang Hu, intel-gfx, Stephen Boyd, Rob Herring,
	linux-mediatek, Matthias Brugger, Sean Paul, linux-arm-kernel,
	Emil Velikov, Douglas Anderson, Thomas Zimmermann, Alex Deucher

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, intel-gfx, Maxime Ripard,
	Stephen Boyd, Rob Herring, linux-mediatek, Matthias Brugger,
	linux-arm-kernel, Simon Ser, Douglas Anderson, Thomas Zimmermann,
	Alex Deucher

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-30 11:34     ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-05-30 11:34 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, Daniel Vetter, intel-gfx,
	Maarten Lankhorst, Maxime Ripard, Stephen Boyd, Rob Herring,
	linux-mediatek, Jani Nikula, Matthias Brugger, Sean Paul,
	linux-arm-kernel, Simon Ser, Emil Velikov, Douglas Anderson,
	Thomas Zimmermann, Alex Deucher

On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> > Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> > orientation. Panel calls drm_connector_set_panel_orientation() to create
> > orientation property and sets the value. However, connector properties
> > can't be created after drm_dev_register() is called. The goal is to
> > separate the orientation property creation, so drm drivers can create it
> > earlier before drm_dev_register().
>
> Sorry for jumping in pretty late in the discussion (based on the v10
> I seem to have missed this before).
>
> This sounds to me like the real issue here is that drm_dev_register()
> is getting called too early?
>
Right.

> To me it seems sensible to delay calling drm_dev_register() and
> thus allowing userspace to start detecting available displays +
> features until after the panel has been probed.
>

Most panels set this value very late, in .get_modes callback (since it
is when the connector is known), though the value was known during
panel probe.

I think we can also let drm check if they have remote panel nodes: If
there is a panel and the panel sets the orientation, let the drm read
this value and set the property. Does this workflow sound reasonable?

The corresponding patch to implement this:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

Thanks

> I see a devicetree patch in this series, so I guess that the panel
> is described in devicetree. Especially in the case of devicetree
> I would expect the kernel to have enough info to do the right
> thing and make sure the panel is probed before calling
> drm_dev_register() ?
>
> Regards,
>
> Hans
>
>
>
>
> >
> > After this series, drm_connector_set_panel_orientation() works like
> > before. It won't affect existing callers of
> > drm_connector_set_panel_orientation(). The only difference is that
> > some drm drivers can call drm_connector_init_panel_orientation_property()
> > earlier.
> >
> > Hsin-Yi Wang (4):
> >   gpu: drm: separate panel orientation property creating and value
> >     setting
> >   drm/mediatek: init panel orientation property
> >   drm/msm: init panel orientation property
> >   arm64: dts: mt8183: Add panel rotation
> >
> >  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >  include/drm/drm_connector.h                   |  2 +
> >  5 files changed, 59 insertions(+), 13 deletions(-)
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
  2022-05-30 11:34     ` Hsin-Yi Wang
                         ` (3 preceding siblings ...)
  (?)
@ 2022-05-31 10:56       ` Hans de Goede
  -1 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-31 10:56       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Chun-Kuang Hu, intel-gfx, Stephen Boyd, Rob Herring,
	linux-mediatek, Matthias Brugger, Sean Paul, linux-arm-kernel,
	Emil Velikov, Douglas Anderson, Thomas Zimmermann, Alex Deucher

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-31 10:56       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, intel-gfx, Maxime Ripard,
	Stephen Boyd, Rob Herring, linux-mediatek, Matthias Brugger,
	linux-arm-kernel, Simon Ser, Douglas Anderson, Thomas Zimmermann,
	Alex Deucher

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-31 10:56       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-31 10:56       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-05-31 10:56       ` Hans de Goede
  0 siblings, 0 replies; 69+ messages in thread
From: Hans de Goede @ 2022-05-31 10:56 UTC (permalink / raw)
  To: Hsin-Yi Wang
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, Daniel Vetter, intel-gfx,
	Maarten Lankhorst, Maxime Ripard, Stephen Boyd, Rob Herring,
	linux-mediatek, Jani Nikula, Matthias Brugger, Sean Paul,
	linux-arm-kernel, Simon Ser, Emil Velikov, Douglas Anderson,
	Thomas Zimmermann, Alex Deucher

Hi,

On 5/30/22 13:34, Hsin-Yi Wang wrote:
> On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 5/30/22 10:19, Hsin-Yi Wang wrote:
>>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
>>> orientation. Panel calls drm_connector_set_panel_orientation() to create
>>> orientation property and sets the value. However, connector properties
>>> can't be created after drm_dev_register() is called. The goal is to
>>> separate the orientation property creation, so drm drivers can create it
>>> earlier before drm_dev_register().
>>
>> Sorry for jumping in pretty late in the discussion (based on the v10
>> I seem to have missed this before).
>>
>> This sounds to me like the real issue here is that drm_dev_register()
>> is getting called too early?
>>
> Right.
> 
>> To me it seems sensible to delay calling drm_dev_register() and
>> thus allowing userspace to start detecting available displays +
>> features until after the panel has been probed.
>>
> 
> Most panels set this value very late, in .get_modes callback (since it
> is when the connector is known), though the value was known during
> panel probe.

Hmm I would expect the main drm/kms driver to register the drm_connector
object after probing the panel, right ?

So maybe this is a problem with the panel API? How about adding 
separate callback to the panel API to get the orientation, which the
main drm/kms driver can then call before registering the connector ?

And then have the main drm/kms driver call
drm_connector_set_panel_orientation() with the returned orientation
on the connecter before registering it.

The new get_orientation callback for the panel should of course
be optional (IOW amy be NULL), so we probably want a small
helper for drivers using panel (sub)drivers to take care of
the process of getting the panel orientation from the panel
(if supported) and then setting it on the connector.


> I think we can also let drm check if they have remote panel nodes: If
> there is a panel and the panel sets the orientation, let the drm read
> this value and set the property. Does this workflow sound reasonable?
> 
> The corresponding patch to implement this:
> https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/

That is a suprisingly small patch (which is good). I guess that
my suggestion to add a new panel driver callback to get
the orientation would be a bit bigget then this. Still I think
that that would be a bit cleaner, as it would also solve this
for cases where the orientation comes from the panel itself
(through say some EDID extenstion) rather then from devicetree.

Still I think either way should be acceptable upstream.

Opinions from other drm devs on the above are very much welcome!

Your small patch nicely avoids the probe ordering problem,
so it is much better then this patch series.

Regards,

Hans



> 
> Thanks
> 
>> I see a devicetree patch in this series, so I guess that the panel
>> is described in devicetree. Especially in the case of devicetree
>> I would expect the kernel to have enough info to do the right
>> thing and make sure the panel is probed before calling
>> drm_dev_register() ?
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>
>>>
>>> After this series, drm_connector_set_panel_orientation() works like
>>> before. It won't affect existing callers of
>>> drm_connector_set_panel_orientation(). The only difference is that
>>> some drm drivers can call drm_connector_init_panel_orientation_property()
>>> earlier.
>>>
>>> Hsin-Yi Wang (4):
>>>   gpu: drm: separate panel orientation property creating and value
>>>     setting
>>>   drm/mediatek: init panel orientation property
>>>   drm/msm: init panel orientation property
>>>   arm64: dts: mt8183: Add panel rotation
>>>
>>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
>>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
>>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
>>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
>>>  include/drm/drm_connector.h                   |  2 +
>>>  5 files changed, 59 insertions(+), 13 deletions(-)
>>>
>>
> 


^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
  2022-05-31 10:56       ` Hans de Goede
                           ` (3 preceding siblings ...)
  (?)
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  -1 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Chun-Kuang Hu, intel-gfx, Stephen Boyd, Rob Herring,
	linux-mediatek, Matthias Brugger, Sean Paul, linux-arm-kernel,
	Emil Velikov, Douglas Anderson, Thomas Zimmermann, Alex Deucher

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [Intel-gfx] [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, intel-gfx, Maxime Ripard,
	Stephen Boyd, Rob Herring, linux-mediatek, Matthias Brugger,
	linux-arm-kernel, Simon Ser, Douglas Anderson, Thomas Zimmermann,
	Alex Deucher

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: dri-devel, David Airlie, Daniel Vetter, amd-gfx, intel-gfx,
	Rob Clark, Stephen Boyd, Douglas Anderson, Chun-Kuang Hu,
	Sean Paul, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
	linux-kernel, Rob Herring, Matthias Brugger, devicetree,
	linux-arm-kernel, linux-mediatek, Simon Ser, Harry Wentland,
	Alex Deucher, Jani Nikula, Emil Velikov

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

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

^ permalink raw reply	[flat|nested] 69+ messages in thread

* Re: [PATCH v10 0/4] Separate panel orientation property creating and value setting
@ 2022-06-01  8:26         ` Hsin-Yi Wang
  0 siblings, 0 replies; 69+ messages in thread
From: Hsin-Yi Wang @ 2022-06-01  8:26 UTC (permalink / raw)
  To: Hans de Goede
  Cc: devicetree, David Airlie, dri-devel, linux-kernel, Rob Clark,
	amd-gfx, Harry Wentland, Chun-Kuang Hu, Daniel Vetter, intel-gfx,
	Maarten Lankhorst, Maxime Ripard, Stephen Boyd, Rob Herring,
	linux-mediatek, Jani Nikula, Matthias Brugger, Sean Paul,
	linux-arm-kernel, Simon Ser, Emil Velikov, Douglas Anderson,
	Thomas Zimmermann, Alex Deucher

On Tue, May 31, 2022 at 6:56 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 5/30/22 13:34, Hsin-Yi Wang wrote:
> > On Mon, May 30, 2022 at 4:53 PM Hans de Goede <hdegoede@redhat.com> wrote:
> >>
> >> Hi,
> >>
> >> On 5/30/22 10:19, Hsin-Yi Wang wrote:
> >>> Some drivers, eg. mtk_drm and msm_drm, rely on the panel to set the
> >>> orientation. Panel calls drm_connector_set_panel_orientation() to create
> >>> orientation property and sets the value. However, connector properties
> >>> can't be created after drm_dev_register() is called. The goal is to
> >>> separate the orientation property creation, so drm drivers can create it
> >>> earlier before drm_dev_register().
> >>
> >> Sorry for jumping in pretty late in the discussion (based on the v10
> >> I seem to have missed this before).
> >>
> >> This sounds to me like the real issue here is that drm_dev_register()
> >> is getting called too early?
> >>
> > Right.
> >
> >> To me it seems sensible to delay calling drm_dev_register() and
> >> thus allowing userspace to start detecting available displays +
> >> features until after the panel has been probed.
> >>
> >
> > Most panels set this value very late, in .get_modes callback (since it
> > is when the connector is known), though the value was known during
> > panel probe.
>
> Hmm I would expect the main drm/kms driver to register the drm_connector
> object after probing the panel, right ?
>
> So maybe this is a problem with the panel API? How about adding
> separate callback to the panel API to get the orientation, which the
> main drm/kms driver can then call before registering the connector ?
>
> And then have the main drm/kms driver call
> drm_connector_set_panel_orientation() with the returned orientation
> on the connecter before registering it.
>
> The new get_orientation callback for the panel should of course
> be optional (IOW amy be NULL), so we probably want a small
> helper for drivers using panel (sub)drivers to take care of
> the process of getting the panel orientation from the panel
> (if supported) and then setting it on the connector.
>

Hi Hans,

Thanks for the suggestion. I've sent a new version for this:
https://patchwork.kernel.org/project/dri-devel/patch/20220601081823.1038797-2-hsinyi@chromium.org/

Panel can implement the optional callback to return the orientation
property, while drm/kms driver will call a drm API to get the value
then they can call drm_connector_set_panel_orientation().
Panel .get_mode will still call drm_connector_set_panel_orientation()
but now it will be a no-op as the value was set by drm/kms driver
previously.

This is similar to the small patch below:
https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
But it's now using the panel API.

>
> > I think we can also let drm check if they have remote panel nodes: If
> > there is a panel and the panel sets the orientation, let the drm read
> > this value and set the property. Does this workflow sound reasonable?
> >
> > The corresponding patch to implement this:
> > https://patchwork.kernel.org/project/linux-mediatek/patch/20220530113033.124072-1-hsinyi@chromium.org/
>
> That is a suprisingly small patch (which is good). I guess that
> my suggestion to add a new panel driver callback to get
> the orientation would be a bit bigget then this. Still I think
> that that would be a bit cleaner, as it would also solve this
> for cases where the orientation comes from the panel itself
> (through say some EDID extenstion) rather then from devicetree.
>
> Still I think either way should be acceptable upstream.
>
> Opinions from other drm devs on the above are very much welcome!
>
> Your small patch nicely avoids the probe ordering problem,
> so it is much better then this patch series.
>
> Regards,
>
> Hans
>
>
>
> >
> > Thanks
> >
> >> I see a devicetree patch in this series, so I guess that the panel
> >> is described in devicetree. Especially in the case of devicetree
> >> I would expect the kernel to have enough info to do the right
> >> thing and make sure the panel is probed before calling
> >> drm_dev_register() ?
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>
> >>>
> >>> After this series, drm_connector_set_panel_orientation() works like
> >>> before. It won't affect existing callers of
> >>> drm_connector_set_panel_orientation(). The only difference is that
> >>> some drm drivers can call drm_connector_init_panel_orientation_property()
> >>> earlier.
> >>>
> >>> Hsin-Yi Wang (4):
> >>>   gpu: drm: separate panel orientation property creating and value
> >>>     setting
> >>>   drm/mediatek: init panel orientation property
> >>>   drm/msm: init panel orientation property
> >>>   arm64: dts: mt8183: Add panel rotation
> >>>
> >>>  .../arm64/boot/dts/mediatek/mt8183-kukui.dtsi |  1 +
> >>>  drivers/gpu/drm/drm_connector.c               | 58 ++++++++++++++-----
> >>>  drivers/gpu/drm/mediatek/mtk_dsi.c            |  7 +++
> >>>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |  4 ++
> >>>  include/drm/drm_connector.h                   |  2 +
> >>>  5 files changed, 59 insertions(+), 13 deletions(-)
> >>>
> >>
> >
>

^ permalink raw reply	[flat|nested] 69+ messages in thread

end of thread, other threads:[~2022-06-01 14:04 UTC | newest]

Thread overview: 69+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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.