Skip to contentSkip to conversation

Fix omap VENC (PAL/NTSC TV out) operation with omapdrm driver

PATCH In review H. Nikolaus Schaller 3 participants 10 messages Nov 13, 2015 – Dec 15, 2015

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

cover Fix omap VENC (PAL/NTSC TV out) operation with omapdrm driver

This patch set fixes some issues with the OMAP VENC when used with the omapdrm driver.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

H. Nikolaus Schaller (2):
video:omap2:dss: fix timings for VENC to match what omapdrm expects video:omapdrm: make omapdrm assume the tv-out cable is always
connected

 drivers/gpu/drm/omapdrm/omap_connector.c |  1 +
 drivers/video/fbdev/omap2/dss/venc.c     | 12 ++++++++++++
 2 files changed, 13 insertions(+)
Signature · 1 line
2.5.1
#1 lore raw

PATCH 1/2 video:omap2:dss: fix timings for VENC to match what omapdrm expects

Otherwise check_timings fails and we get a "has no modes" message from xrandr.

This fix makes the venc assume PAL and NTSC timings that match the timings synthetized by copy_timings_drm_to_omap() from omapdrm mode settings so that check_timings() succeeds.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---
 drivers/video/fbdev/omap2/dss/venc.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
drivers/video/fbdev/omap2/dss/venc.c +12 -0
index 99ca268..d05a549 100644
@@ -275,6 +275,12 @@ const struct omap_video_timings omap_dss_pal_timings = {
 	.vbp		= 41,
 
 	.interlace	= true,
+
+	.hsync_level = OMAPDSS_SIG_ACTIVE_LOW,
+	.vsync_level = OMAPDSS_SIG_ACTIVE_LOW,
+	.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE,
+	.de_level = OMAPDSS_SIG_ACTIVE_HIGH,
+	.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE,
 };
 EXPORT_SYMBOL(omap_dss_pal_timings);
 
@@ -290,6 +296,12 @@ const struct omap_video_timings omap_dss_ntsc_timings = {
 	.vbp		= 31,
 
 	.interlace	= true,
+
+	.hsync_level = OMAPDSS_SIG_ACTIVE_LOW,
+	.vsync_level = OMAPDSS_SIG_ACTIVE_LOW,
+	.data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE,
+	.de_level = OMAPDSS_SIG_ACTIVE_HIGH,
+	.sync_pclk_edge = OMAPDSS_DRIVE_SIG_FALLING_EDGE,
 };
 EXPORT_SYMBOL(omap_dss_ntsc_timings);
 
Signature · 1 line
2.5.1
#2 lore raw

Re: [PATCH 1/2] video:omap2:dss: fix timings for VENC to match what omapdrm expects

Quoted 7 lines · H. Nikolaus Schaller

Otherwise check_timings fails and we get a "has no modes" message from xrandr.

This fix makes the venc assume PAL and NTSC timings that match the timings synthetized by copy_timings_drm_to_omap() from omapdrm mode settings so that check_timings() succeeds.

Quoted 6 lines

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---
 drivers/video/fbdev/omap2/dss/venc.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

I've picked this up.

With this patch and the one below I can get tv-out working on my very old beagleboard, and it seems to work with X also. It doesn't start automatically as the connection state is unknown, but doing "xrandr --output None-1 --auto" was all I needed to enable it.

Tomi

From a4274600a5a67256b91266b0d2624b9c9028909b Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <[email protected]>
Date: Tue, 8 Dec 2015 18:32:14 +0200
Subject: [PATCH] drm/omap: fix fbdev pix format to support all platforms

omap_fbdev always creates a framebuffer with ARGB8888 pixel format. On OMAP3 we have VIDEO1 overlay that does not support ARGB8888, and on OMAP2 none of the overlays support ARGB888.

This patch changes the omap_fbdev's fb to XRGB8888, which is supported by all platforms.

drivers/gpu/drm/omapdrm/omap_fbdev.c +1 -4
index b8e4cdec28c3..24f92bea39c7 100644
@@ -112,11 +112,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
 	dma_addr_t paddr;
 	int ret;
 
-	/* only doing ARGB32 since this is what is needed to alpha-blend
-	 * with video overlays:
-	 */
 	sizes->surface_bpp = 32;
-	sizes->surface_depth = 32;
+	sizes->surface_depth = 24;
 
 	DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width,
 			sizes->surface_height, sizes->surface_bpp,
#3 lore raw

Re: [PATCH 1/2] video:omap2:dss: fix timings for VENC to match what omapdrm expects

Hi Tomi,

Am 09.12.2015 um 09:18 schrieb Tomi Valkeinen <[email protected]>:

Quoted 9 lines · H. Nikolaus Schaller
Quoted 7 lines

Otherwise check_timings fails and we get a "has no modes" message from xrandr.

This fix makes the venc assume PAL and NTSC timings that match the timings synthetized by copy_timings_drm_to_omap() from omapdrm mode settings so that check_timings() succeeds.

Quoted 8 lines
Quoted 6 lines

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---
drivers/video/fbdev/omap2/dss/venc.c | 12 ++++++++++++

1 file changed, 12 insertions(+)

I've picked this up.

Thanks!

Quoted 5 lines

With this patch and the one below I can get tv-out working on my very old beagleboard, and it seems to work with X also. It doesn't start automatically as the connection state is unknown, but doing "xrandr --output None-1 --auto" was all I needed to enable it.

Great that you did find the real reason of the problem.

I have tested it on the GTA04 and it also works.

Will the patches arrive in 4.5?

So thanks a lot,
Nikolaus

Quoted 35 lines

Tomi

From a4274600a5a67256b91266b0d2624b9c9028909b Mon Sep 17 00:00:00 2001
From: Tomi Valkeinen <[email protected]>
Date: Tue, 8 Dec 2015 18:32:14 +0200
Subject: [PATCH] drm/omap: fix fbdev pix format to support all platforms

omap_fbdev always creates a framebuffer with ARGB8888 pixel format. On OMAP3 we have VIDEO1 overlay that does not support ARGB8888, and on OMAP2 none of the overlays support ARGB888.

This patch changes the omap_fbdev's fb to XRGB8888, which is supported by all platforms.

drivers/gpu/drm/omapdrm/omap_fbdev.c +1 -4
index b8e4cdec28c3..24f92bea39c7 100644
@@ -112,11 +112,8 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
 	dma_addr_t paddr;
 	int ret;
 
-	/* only doing ARGB32 since this is what is needed to alpha-blend
-	 * with video overlays:
-	 */
 	sizes->surface_bpp = 32;
-	sizes->surface_depth = 32;
+	sizes->surface_depth = 24;
 
 	DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width,
 			sizes->surface_height, sizes->surface_bpp,
#4 lore raw

Re: [PATCH 1/2] video:omap2:dss: fix timings for VENC to match what omapdrm expects

Quoted 5 lines · H. Nikolaus Schaller

Great that you did find the real reason of the problem.

I have tested it on the GTA04 and it also works.

Will the patches arrive in 4.5?

4.4, I hope.

Tomi

#5 lore raw

PATCH 2/2 video:omapdrm: make omapdrm assume the tv-out cable is always connected

In reply to H. Nikolaus Schaller

Include VENC in the set of drivers where it is assimed that the cable is always connected. Like DPI, DSI, DBI and SDI do.

Otherwise, the VENC will return cable status "unknown" and is not enabled by the X-server. So there is no video output signal.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---
 drivers/gpu/drm/omapdrm/omap_connector.c | 1 +
 1 file changed, 1 insertion(+)
drivers/gpu/drm/omapdrm/omap_connector.c +1 -0
index 83f2a91..98ddb5d 100644
@@ -120,6 +120,7 @@ static enum drm_connector_status omap_connector_detect(
 		else
 			ret = connector_status_disconnected;
 	} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
+			dssdev->type == OMAP_DISPLAY_TYPE_VENC ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DSI) {
Signature · 1 line
2.5.1
#6 lore raw

Re: [PATCH 2/2] video:omapdrm: make omapdrm assume the tv-out cable is always connected

Quoted 19 lines · H. Nikolaus Schaller

Include VENC in the set of drivers where it is assimed that the cable is always connected. Like DPI, DSI, DBI and SDI do.

Otherwise, the VENC will return cable status "unknown" and is not enabled by the X-server. So there is no video output signal.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---
 drivers/gpu/drm/omapdrm/omap_connector.c | 1 +
 1 file changed, 1 insertion(+)
drivers/gpu/drm/omapdrm/omap_connector.c +0 -0
index 83f2a91..98ddb5d 100644

drivers/gpu/drm/omapdrm/omap_connector.c static enum drm_connector_status omap_connector_detect( · line 126

Quoted 7 lines
drivers/gpu/drm/omapdrm/omap_connector.c +1 -0
@@ -120,6 +120,7 @@ static enum drm_connector_status omap_connector_detect(
 		else
 			ret = connector_status_disconnected;
 	} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
+			dssdev->type == OMAP_DISPLAY_TYPE_VENC ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DSI) {

I have no idea why VENC is not working for you when using connector_status_unknown, but I just tested DPI with connector_status_unknown (i.e. changed the above func to return unknown for DPI), and it works fine with X and X omap driver. And xrandr confirms that the connection status is unknown:

# xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 2048 x 2048
HDMI-1 disconnected (normal left inverted right x axis y axis)
None-1 unknown connection 1920x1200+0+0 (normal left inverted right x
axis y axis) 0mm x 0mm
   1920x1200     60.00*+  60.00 +

Grep also shows that there are many drivers using connector_status_unknown, so I'm guessing it should work fine...

Tomi

#7 lore raw

Re: [PATCH 2/2] video:omapdrm: make omapdrm assume the tv-out cable is always connected

Quoted 42 lines · On Friday 13 November 2015 13:46:01 Tomi Valkeinen wrote:
Quoted 20 lines · H. Nikolaus Schaller

Include VENC in the set of drivers where it is assimed that the cable is always connected. Like DPI, DSI, DBI and SDI do.

Otherwise, the VENC will return cable status "unknown" and is not enabled by the X-server. So there is no video output signal.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---

 drivers/gpu/drm/omapdrm/omap_connector.c | 1 +
 1 file changed, 1 insertion(+)
(quoted diff) +0 -0

b/drivers/gpu/drm/omapdrm/omap_connector.c index 83f2a91..98ddb5d 100644

drivers/gpu/drm/omapdrm/omap_connector.c +0 -0
@@ -120,6 +120,7 @@ static enum drm_connector_status

omap_connector_detect(

drivers/gpu/drm/omapdrm/omap_connector.c static enum drm_connector_status omap_connector_detect( · line 126

Quoted 7 lines
drivers/gpu/drm/omapdrm/omap_connector.c +1 -0
 		else
 			ret = connector_status_disconnected;
 	} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
+			dssdev->type == OMAP_DISPLAY_TYPE_VENC ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
 			dssdev->type == OMAP_DISPLAY_TYPE_DSI) {

I have no idea why VENC is not working for you when using connector_status_unknown, but I just tested DPI with connector_status_unknown (i.e. changed the above func to return unknown for DPI), and it works fine with X and X omap driver. And xrandr confirms that the connection status is unknown:

# xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 2048 x 2048
HDMI-1 disconnected (normal left inverted right x axis y axis)
None-1 unknown connection 1920x1200+0+0 (normal left inverted right x
axis y axis) 0mm x 0mm
   1920x1200     60.00*+  60.00 +
Quoted 2 lines

Grep also shows that there are many drivers using connector_status_unknown, so I'm guessing it should work fine...

And beside it's not right to consider VENC as always connected, as it isn't. The unknown status is there for a reason, to describe connectors for which we can't get any status information. The situation is different for DPI, DBI, SDI and DSI as those are on-board busses that connect to a non-removable panel, so we can say with a good confidence that the panel is connected (the situation could be changed with a hammer and a chisel, but that's unlikely to happen, hence the confidence).

Signature · 8 lines
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel
#8 lore raw

Re: [PATCH 2/2] video:omapdrm: make omapdrm assume the tv-out cable is always connected

Hi Laurent and Tomi,

Am 13.11.2015 um 13:01 schrieb Laurent Pinchart <[email protected]>:

Quoted 16 lines · On Friday 13 November 2015 13:46:01 Tomi Valkeinen wrote:
Quoted 15 lines · H. Nikolaus Schaller
Quoted 14 lines

Include VENC in the set of drivers where it is assimed that the cable is always connected. Like DPI, DSI, DBI and SDI do.

Otherwise, the VENC will return cable status "unknown" and is not enabled by the X-server. So there is no video output signal.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---

drivers/gpu/drm/omapdrm/omap_connector.c | 1 +

1 file changed, 1 insertion(+)
Quoted 16 lines
Quoted 8 lines
Quoted 8 lines
(quoted diff) +0 -0

b/drivers/gpu/drm/omapdrm/omap_connector.c index 83f2a91..98ddb5d 100644

drivers/gpu/drm/omapdrm/omap_connector.c +0 -0
@@ -120,6 +120,7 @@ static enum drm_connector_status

omap_connector_detect(

		else
			ret = connector_status_disconnected;
Quoted 8 lines
Quoted 5 lines
	} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
drivers/gpu/drm/omapdrm/omap_connector.c +1 -0
+			dssdev->type == OMAP_DISPLAY_TYPE_VENC ||
			dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
			dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
			dssdev->type == OMAP_DISPLAY_TYPE_DSI) {

I have no idea why VENC is not working for you when using connector_status_unknown,

I agree that it should...

Quoted 3 lines
Quoted 3 lines

but I just tested DPI with
connector_status_unknown (i.e. changed the above func to return unknown for DPI

Good hint. I can do the same check. Maybe it highlights the real issue.

Quoted 9 lines
Quoted 9 lines

), and it works fine with X and X omap driver. And xrandr confirms that the connection status is unknown:

# xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 2048 x 2048
HDMI-1 disconnected (normal left inverted right x axis y axis)
None-1 unknown connection 1920x1200+0+0 (normal left inverted right x
axis y axis) 0mm x 0mm
  1920x1200     60.00*+  60.00 +

Which configs, drivers and system are you using for this results?

Quoted 5 lines
Quoted 3 lines

Grep also shows that there are many drivers using connector_status_unknown, so I'm guessing it should work fine...

And beside it's not right to consider VENC as always connected, as it isn't.

Hm. Well, the VENC (meaning the D/A converter inside the OMAP3 chip) is always connected. But the monitor or cable isn't.

Quoted 6 lines

The unknown status is there for a reason, to describe connectors for which we can't get any status information. The situation is different for DPI, DBI, SDI and DSI as those are on-board busses that connect to a non-removable panel, so we can say with a good confidence that the panel is connected (the situation could be changed with a hammer and a chisel, but that's unlikely to happen, hence the confidence).

Well, it may be that the omapdrm and X11 combination (unfortuantely I don't understand either and have not found a good description how they interwork),
keeps the VENC disabled if the connector is unknown.

And since there is no code to detect that a cable has been connected, there might be missing some trigger to enable the interface.

The symptom I see is that the status of this card is "disabled" while the LCD panel is "enabled". After doing my proposed patch, both come up "enabled".

So my patch appears to be a work around some other still hidden problem.

Any hint from the experts how to debug / find the real issue & solution is welcome.

BR,
Nikolaus

#9 lore raw

Re: [PATCH 2/2] video:omapdrm: make omapdrm assume the tv-out cable is always connected

In reply to Laurent Pinchart

Here the test results:

Am 13.11.2015 um 13:01 schrieb Laurent Pinchart <[email protected]>:

Quoted 36 lines · On Friday 13 November 2015 13:46:01 Tomi Valkeinen wrote:
Quoted 35 lines · H. Nikolaus Schaller
Quoted 24 lines

Include VENC in the set of drivers where it is assimed that the cable is always connected. Like DPI, DSI, DBI and SDI do.

Otherwise, the VENC will return cable status "unknown" and is not enabled by the X-server. So there is no video output signal.

Tested on: BeagleBoard XM, GTA04 and OpenPandora

---

drivers/gpu/drm/omapdrm/omap_connector.c | 1 +

1 file changed, 1 insertion(+)
(quoted diff) +0 -0

b/drivers/gpu/drm/omapdrm/omap_connector.c index 83f2a91..98ddb5d 100644

drivers/gpu/drm/omapdrm/omap_connector.c +0 -0
@@ -120,6 +120,7 @@ static enum drm_connector_status

omap_connector_detect(

		else
			ret = connector_status_disconnected;
	} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
drivers/gpu/drm/omapdrm/omap_connector.c +1 -0
+			dssdev->type == OMAP_DISPLAY_TYPE_VENC ||
Quoted 3 lines
			dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
			dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
			dssdev->type == OMAP_DISPLAY_TYPE_DSI) {

I have no idea why VENC is not working for you when using connector_status_unknown, but I just tested DPI with connector_status_unknown (i.e. changed the above func to return unknown for DPI), and it works fine with X and X omap driver. And xrandr confirms that the connection status is unknown:

Quoted 6 lines
Quoted 6 lines
# xrandr
Screen 0: minimum 320 x 200, current 1920 x 1200, maximum 2048 x 2048
HDMI-1 disconnected (normal left inverted right x axis y axis)
None-1 unknown connection 1920x1200+0+0 (normal left inverted right x
axis y axis) 0mm x 0mm
  1920x1200     60.00*+  60.00 +

A) with this VENC patch:

root@letux:~# xrandr
Screen 0: minimum 320 x 200, current 720 x 640, maximum 2048 x 2048
None-1 connected 720x574+0+0 0mm x 0mm
   720x574i      50.00*+
None-2 connected 480x640+0+0 0mm x 0mm
   480x640       65.74*+
root@letux:~# cat /sys/class/drm/card0-Unknown-*/enabled
enabled
enabled
root@letux:~# cat /sys/class/drm/card0-Unknown-*/status 
connected
connected

B) w/o VENC patch (VENC returns returning connector_status_unknown):

root@letux:~# xrandr
Screen 0: minimum 320 x 200, current 480 x 640, maximum 2048 x 2048
None-1 connected 480x640+0+0 0mm x 0mm
   480x640       65.74*+
None-2 unknown connection
   720x574i      50.00 +
root@letux:~# cat /sys/class/drm/card0-Unknown-*/enabled
enabled
disabled
root@letux:~# cat /sys/class/drm/card0-Unknown-*/status
connected
unknown

C) with DPI (also) returning connector_status_unknown

root@letux:~# xrandr
Screen 0: minimum 320 x 200, current 720 x 640, maximum 2048 x 2048
None-1 unknown connection 720x574+0+0 0mm x 0mm
   720x574i      50.00*+
None-2 unknown connection 480x640+0+0 0mm x 0mm
   480x640       65.74*+
root@letux:~# cat /sys/class/drm/card0-Unknown-*/enabled
enabled
enabled
root@letux:~# cat /sys/class/drm/card0-Unknown-*/status
unknown
unknown
root@letux:~# 

D) VENC patch but DPI returning connector_status_unknown

rroot@letux:~# xrandr
Screen 0: minimum 320 x 200, current 720 x 574, maximum 2048 x 2048
None-1 unknown connection
   480x640       65.74 +
None-2 connected 720x574+0+0 0mm x 0mm
   720x574i      50.00*+oot@letux:~# cat /sys/class/drm/card0-Unknown-*/enabled
disabled
enabled
root@letux:~# cat /sys/class/drm/card0-Unknown-*/status
unknown
connected

In case B) I have no TV out and in case D) I have no LCD.

So it looks as if it works if my LCD and VENC report the same connection status. And fails if they differ.

Anyone with an explanation or even vague idea where to search for the real bug?

BR and thanks,
Nikolaus