linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* I.MX6 HDMI support in v4.2
@ 2015-09-07 10:55 Krzysztof Hałasa
  2015-09-07 11:25 ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-07 10:55 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

I'd like to ask if the HDMI output on I.MX6-based boards is possible.
I'm unable to get it to work. What I'm trying to do is getting
a) DRM HDMI output, b) X.org output using etnaviv, libdrm-armada and
xf86-video-armada, c) GLX and Xvideo. Basically, latest versions.

I'm working with Gateworks Ventana GW54xx boards and with Sabre-lite,
using newly built imx6q-gw54xx.dtb and imx6q-sabrelite.dtb. In both
cases, required kernel modules are inserted and (somehow) initialized,
but the HDMI device isn't created.

The first problem seems to be this:
- dw_hdmi_imx_probe() is called (and does component_add()), but
- dw_hdmi_imx_bind() is never called.

Now if I enable LVDS (CONFIG_DRM_IMX_LDB - I don't have any LVDS
hardware connected), the HDMI device is created (as well as LVDS).

This used to detect the monitor as "unknown" but now it's "connected"
most of the time - not sure what have changed. EDID is empty and I get
the following entries in /sys/devices/soc0/display-subsystem/drm/card0:

dev                                            226:0
card0-HDMI-A-1/edid                            (empty)
card0-HDMI-A-1/dpms                            On
card0-HDMI-A-1/modes
card0-HDMI-A-1/power/control                   auto
card0-HDMI-A-1/power/runtime_active_time       0
card0-HDMI-A-1/power/autosuspend_delay_ms      (Input/output error)
card0-HDMI-A-1/power/runtime_status            unsupported
card0-HDMI-A-1/power/runtime_suspended_time    0
card0-HDMI-A-1/enabled                         enabled
card0-HDMI-A-1/status                          used to be "unknown", now: "connected"
card0-HDMI-A-1/uevent                          power/control auto
power/runtime_active_time                      0
power/autosuspend_delay_ms                     (Input/output error)
power/runtime_status                           unsupported
power/runtime_suspended_time                   0
card0-LVDS-1/edid
card0-LVDS-1/dpms                              On
card0-LVDS-1/modes
card0-LVDS-1/power/control                     auto
card0-LVDS-1/power/runtime_active_time         0
card0-LVDS-1/power/autosuspend_delay_ms        (Input/output error)
card0-LVDS-1/power/runtime_status              unsupported
card0-LVDS-1/power/runtime_suspended_time      0
card0-LVDS-1/enabled                           disabled
card0-LVDS-1/status                            unknown
card0-LVDS-1/uevent
uevent                                         MAJOR=226
                                               MINOR=0
                                               DEVNAME=dri/card0
                                               DEVTYPE=drm_minor

Have to "touch /etc/xorg.conf" (otherwise the X server segfaults).

Now, somehow the X.org server sets the resolution to 1024x768, though
nothing is displayed on the monitor (it's in stand-by). Files in
/sys/.../card0-HDMI-A/ now have the actual EDID, mode list etc.

# xrandr
Screen 0: minimum 320 x 200, current 1024 x 768, maximum 4096 x 4096
HDMI-0 connected 1024x768+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
   1920x1080     60.00 +
   1680x1050     59.88
   1280x1024     75.02    60.02
   1440x900      74.98    59.90
   1280x720      60.00
   1024x768      75.08    60.00*
   800x600       75.00    60.32
   640x480       75.00    72.81    66.67    60.00
   720x400       70.08
LVDS-0 connected 1024x768+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768      60.00*+

This also causes:
imx-ipuv3 2400000.ipu: DC stop timeout after 50 ms
imx-ipuv3 2400000.ipu: Timeout waiting for DMFC FIFOs to clear

What am I doing wrong?
- kernel command line? video=mxcfb0:dev=hdmi,1920x1080M at 60,if=RGB24
- wrong SDMA firmware? MD5 is:
  5d4584134cc4cba62e1be2f382cd6f3a  /lib/firmware/imx/sdma/sdma-imx6q.bin
- wrong X.org stuff?

CPU identified as i.MX6Q, silicon rev 1.2

imx_ipuv3_crtc         20480  0
ahci_imx               16384  0
libahci_platform       16384  1 ahci_imx
libahci                28672  2 ahci_imx,libahci_platform
imx_ipu_v3             49152  1 imx_ipuv3_crtc
fec                    45056  0
dw_hdmi_imx            16384  0
dw_hdmi                20480  1 dw_hdmi_imx
imx_ldb                16384  0
imxdrm                 16384  3 dw_hdmi_imx,imx_ipuv3_crtc,imx_ldb
drm_kms_helper         90112  4 dw_hdmi,imxdrm,imx_ipuv3_crtc,imx_ldb
syscopyarea            16384  1 drm_kms_helper
sysfillrect            16384  1 drm_kms_helper
coda                   45056  0
videobuf2_vmalloc      16384  1 coda
videobuf2_dma_contig   20480  1 coda
flexcan                20480  0
videobuf2_memops       16384  2 videobuf2_vmalloc,videobuf2_dma_contig
v4l2_mem2mem           16384  1 coda
videobuf2_core         40960  2 coda,v4l2_mem2mem
sysimgblt              16384  1 drm_kms_helper
sky2                   57344  0
gpmi_nand              28672  0
drm                   249856  7 dw_hdmi,drm_kms_helper,dw_hdmi_imx,imxdrm,imx_ipuv3_crtc,imx_ldb

CONFIG_SOC_IMX6=y
CONFIG_SOC_IMX6Q=y
CONFIG_I2C_IMX=y
CONFIG_SPI_IMX=y
CONFIG_PINCTRL_IMX=y
CONFIG_PINCTRL_IMX6Q=y
CONFIG_GPIO_MXC=y
CONFIG_DRM_IMX=m
# CONFIG_DRM_IMX_FB_HELPER is not set
# CONFIG_DRM_IMX_PARALLEL_DISPLAY is not set
# CONFIG_DRM_IMX_TVE is not set
# CONFIG_DRM_IMX_LDB is not set
CONFIG_DRM_IMX_IPUV3=m
CONFIG_DRM_IMX_HDMI=m
CONFIG_MX3_IPU=y
CONFIG_MX3_IPU_IRQS=4
CONFIG_IMX_SDMA=y
# CONFIG_IMX_DMA is not set
CONFIG_MXS_DMA=y
CONFIG_CLKSRC_IMX_GPT=y

Machine model: Gateworks Ventana i.MX6 Dual/Quad GW54XX
Kernel command line: console=ttymxc1,115200 video=mxcfb0:dev=hdmi,1920x1080M at 60,if=RGB24 earlyprintk
--
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-07 10:55 I.MX6 HDMI support in v4.2 Krzysztof Hałasa
@ 2015-09-07 11:25 ` Russell King - ARM Linux
  2015-09-07 14:04   ` Krzysztof Hałasa
  2015-09-08 10:45   ` Krzysztof Hałasa
  0 siblings, 2 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-07 11:25 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 07, 2015 at 12:55:54PM +0200, Krzysztof Ha?asa wrote:
> Hi,
> 
> I'd like to ask if the HDMI output on I.MX6-based boards is possible.
> I'm unable to get it to work. What I'm trying to do is getting
> a) DRM HDMI output, b) X.org output using etnaviv, libdrm-armada and
> xf86-video-armada, c) GLX and Xvideo. Basically, latest versions.
> 
> I'm working with Gateworks Ventana GW54xx boards and with Sabre-lite,
> using newly built imx6q-gw54xx.dtb and imx6q-sabrelite.dtb. In both
> cases, required kernel modules are inserted and (somehow) initialized,
> but the HDMI device isn't created.
> 
> The first problem seems to be this:
> - dw_hdmi_imx_probe() is called (and does component_add()), but
> - dw_hdmi_imx_bind() is never called.
> 
> Now if I enable LVDS (CONFIG_DRM_IMX_LDB - I don't have any LVDS
> hardware connected), the HDMI device is created (as well as LVDS).

Are you telling the kernel in your device tree file that LDB is required?
DRM doesn't support hot-plugging outputs, all specified output modules
must be present before DRM can bring up the display subsystem.

> This used to detect the monitor as "unknown" but now it's "connected"
> most of the time - not sure what have changed. EDID is empty and I get
> the following entries in /sys/devices/soc0/display-subsystem/drm/card0:

"used to" - when was this?  I don't think dw_hdmi has ever reported
a connected status of "unknown", always explicitly stating connected
or disconnected.

> dev                                            226:0
> card0-HDMI-A-1/edid                            (empty)
> card0-HDMI-A-1/dpms                            On
> card0-HDMI-A-1/modes
> card0-HDMI-A-1/power/control                   auto
> card0-HDMI-A-1/power/runtime_active_time       0
> card0-HDMI-A-1/power/autosuspend_delay_ms      (Input/output error)
> card0-HDMI-A-1/power/runtime_status            unsupported
> card0-HDMI-A-1/power/runtime_suspended_time    0
> card0-HDMI-A-1/enabled                         enabled
> card0-HDMI-A-1/status                          used to be "unknown", now: "connected"
> card0-HDMI-A-1/uevent                          power/control auto

Looks fine apart from the lack of EDID.  Are you sure you have the
pinctrl setup correct for this?  (We don't use the DDC I2C built
into the HDMI interface.)

> Now, somehow the X.org server sets the resolution to 1024x768, though
> nothing is displayed on the monitor (it's in stand-by). Files in
> /sys/.../card0-HDMI-A/ now have the actual EDID, mode list etc.

By default, 1024x768 is selected when there's nothing else available.
The DPMS "on" and enabled above tends to suggest you should be seeing
output though.

It's possible that having both LVDS and HDMI enabled causes a pixel
clocking conflict if both are routed to the same CRTC and PLL.  (The
clocking side of it is something I really hate, and the decision was
taken to control this statically.)

> This also causes:
> imx-ipuv3 2400000.ipu: DC stop timeout after 50 ms
> imx-ipuv3 2400000.ipu: Timeout waiting for DMFC FIFOs to clear

I don't have an answer for that... that's deep internal IPU stuff.

> What am I doing wrong?
> - kernel command line? video=mxcfb0:dev=hdmi,1920x1080M at 60,if=RGB24
> - wrong SDMA firmware? MD5 is:
>   5d4584134cc4cba62e1be2f382cd6f3a  /lib/firmware/imx/sdma/sdma-imx6q.bin
> - wrong X.org stuff?

Probably none of the above.

I should point out that virtually every -rc kernel gets tested here on
iMX6 with HDMI output - onto my Panasonic TV, and I've seen no evidence
of any regressions.  For me, it Just Works(tm).

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-07 11:25 ` Russell King - ARM Linux
@ 2015-09-07 14:04   ` Krzysztof Hałasa
  2015-09-08  9:16     ` Russell King - ARM Linux
  2015-09-08 10:45   ` Krzysztof Hałasa
  1 sibling, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-07 14:04 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

>> Now if I enable LVDS (CONFIG_DRM_IMX_LDB - I don't have any LVDS
>> hardware connected), the HDMI device is created (as well as LVDS).
>
> Are you telling the kernel in your device tree file that LDB is required?
> DRM doesn't support hot-plugging outputs, all specified output modules
> must be present before DRM can bring up the display subsystem.

It seems to be the case, I'll test with the LDB portion removed. Though
I don't mind LVDS if it doesn't break HDMI.

>> This used to detect the monitor as "unknown" but now it's "connected"
>> most of the time - not sure what have changed. EDID is empty and I get
>> the following entries in /sys/devices/soc0/display-subsystem/drm/card0:
>
> "used to" - when was this?

Well... before I made unspecified changes to something :-)
I mean, I don't think I made any related changes, but something must
have changed since it always prints "connected" now. Most of the time.
I mean, from time to time :-)
Seems low level.

> I don't think dw_hdmi has ever reported
> a connected status of "unknown", always explicitly stating connected
> or disconnected.

The "unknown" must be an uninitialized variable (neither connected = 1
or disconnected = 2):

--- dmesg-unknown
+++ dmesg-connected
-imx-ipuv3 2400000.ipu: IPUv3H probed
@@
-XXX dw_hdmi_imx_probe[261]
+imx-ipuv3 2400000.ipu: IPUv3H probed
 imx-ipuv3 2800000.ipu: IPUv3H probed
+XXX dw_hdmi_imx_probe[261]
 [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
 [drm] No driver support for vblank timestamp query.
 imx-drm display-subsystem: bound imx-ipuv3-crtc.0 (ops ipu_crtc_ops [imx_ipuv3_crtc])
@@ -323,8 +323,9 @@
 XXX dw_hdmi_hardirq[1479]
 XXX dw_hdmi_irq[1493]
 imx-drm display-subsystem: bound 2000000.aips-bus:ldb at 020e0008 (ops imx_ldb_driver_exit [imx_ldb])
 [drm] Initialized imx-drm 1.0.0 20120507 on minor 0
+XXX dw_hdmi_connector_detect[1389]: CONNECTED

In the "unknown" case, the dw_hdmi_connector_detect() wasn't called.
Maybe the problem happens when dw_hdmi_imx_probe() is called before
"imx-ipuv3 2400000.ipu: IPUv3H probed" is done. Probably an interrupt
isn't generated or something like this, maybe it should poll it once.
I'll check this later.

> Looks fine apart from the lack of EDID.  Are you sure you have the
> pinctrl setup correct for this?  (We don't use the DDC I2C built
> into the HDMI interface.)

How do I check it? I'm simply using the (v4.2) imx6q-gw54xx.dts file.

>> Now, somehow the X.org server sets the resolution to 1024x768, though
>> nothing is displayed on the monitor (it's in stand-by). Files in
>> /sys/.../card0-HDMI-A/ now have the actual EDID, mode list etc.
>
> By default, 1024x768 is selected when there's nothing else available.

How do I select e.g. 1920x1080? The EDID supports this mode, but
# xrandr --output HDMI1 --auto

X Error:  BadMatch
  Request Major code 139 (RANDR)
  Request Minor code 7 ()
  Error Serial #34
  Current Serial #35

imx-drm display-subsystem: failed to allocate buffer with size 8294400
imx-drm display-subsystem: failed to allocate buffer with size 8294400
imx-ipuv3 2400000.ipu: DC stop timeout after 50 ms

I assume I have to reserve the (big linear region of) memory at boot
time, but don't know how.

> The DPMS "on" and enabled above tends to suggest you should be seeing
> output though.

I've applied the PLL5 patch and it now started to work. At least I have
output. I'm still seeing "DC stop timeout after 50 ms" but apparently
only when the X server is being closed, from time to time.

> I should point out that virtually every -rc kernel gets tested here on
> iMX6 with HDMI output - onto my Panasonic TV, and I've seen no evidence
> of any regressions.  For me, it Just Works(tm).

Ok. I'll try to reach the same state :-)

Now, having the HDMI output on the screen, I'm trying to get XVideo
working. It seems all XV attributes are set to their minimum values and
I can't change that. Is it normal? For this or other reason, I can see
a black video window only (I'm trying to use I420 overlay). Could be
unrelated problem, though.

# xvattr
Found Xv 2.2
Adaptor: 0
Name: Marvell Armada Overlay Video
 Port: 85
  Name: XV_ENCODING
   Flags: XvGettable XvSettable
   Min value: 0
   Max value: 0
   Current value: 0
  Name: XV_SATURATION
   Flags: XvGettable XvSettable
   Min value: -16384
   Max value: 16383
   Current value: -16384
  Name: XV_BRIGHTNESS
   Flags: XvGettable XvSettable
   Min value: -256
   Max value: 255
   Current value: -256
  Name: XV_CONTRAST
   Flags: XvGettable XvSettable
   Min value: -16384
   Max value: 16383
   Current value: -16384
  Name: XV_AUTOPAINT_COLORKEY
   Flags: XvGettable XvSettable
   Min value: 0
   Max value: 1
   Current value: 1
  Name: XV_COLORKEY
   Flags: XvGettable XvSettable
   Min value: 0
   Max value: 16777215
   Current value: 0
  Name: XV_PIPE
   Flags: XvGettable XvSettable
   Min value: -1
   Max value: 3
   Current value: -1

# xvattr -a XV_BRIGHTNESS -v 0 -p 85
Found Xv 2.2
XV_BRIGHTNESS set to -256

I'll continue with this stuff tomorrow.


Thanks for the help,
--
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-07 14:04   ` Krzysztof Hałasa
@ 2015-09-08  9:16     ` Russell King - ARM Linux
  2015-09-08 11:01       ` Krzysztof Hałasa
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08  9:16 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 07, 2015 at 04:04:30PM +0200, Krzysztof Ha?asa wrote:
> Russell King - ARM Linux <linux@arm.linux.org.uk> writes:
> 
> >> Now if I enable LVDS (CONFIG_DRM_IMX_LDB - I don't have any LVDS
> >> hardware connected), the HDMI device is created (as well as LVDS).
> >
> > Are you telling the kernel in your device tree file that LDB is required?
> > DRM doesn't support hot-plugging outputs, all specified output modules
> > must be present before DRM can bring up the display subsystem.
> 
> It seems to be the case, I'll test with the LDB portion removed. Though
> I don't mind LVDS if it doesn't break HDMI.
> 
> >> This used to detect the monitor as "unknown" but now it's "connected"
> >> most of the time - not sure what have changed. EDID is empty and I get
> >> the following entries in /sys/devices/soc0/display-subsystem/drm/card0:
> >
> > "used to" - when was this?
> 
> Well... before I made unspecified changes to something :-)
> I mean, I don't think I made any related changes, but something must
> have changed since it always prints "connected" now. Most of the time.
> I mean, from time to time :-)
> Seems low level.

I don't know - what normally happens is that a HPD IRQ fires at boot time
from the HDMI interface which causes us to run the ->detect functions,
and that would have updated the connect status before the thing has
finished probing.

> > I don't think dw_hdmi has ever reported
> > a connected status of "unknown", always explicitly stating connected
> > or disconnected.
> 
> The "unknown" must be an uninitialized variable (neither connected = 1
> or disconnected = 2):
> 
> --- dmesg-unknown
> +++ dmesg-connected
> -imx-ipuv3 2400000.ipu: IPUv3H probed
> @@
> -XXX dw_hdmi_imx_probe[261]
> +imx-ipuv3 2400000.ipu: IPUv3H probed
>  imx-ipuv3 2800000.ipu: IPUv3H probed
> +XXX dw_hdmi_imx_probe[261]

Do you have DRM configured as modules?  I can't think of anything else
that would change the probe order like this.

>  [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
>  [drm] No driver support for vblank timestamp query.
>  imx-drm display-subsystem: bound imx-ipuv3-crtc.0 (ops ipu_crtc_ops [imx_ipuv3_crtc])
> @@ -323,8 +323,9 @@
>  XXX dw_hdmi_hardirq[1479]
>  XXX dw_hdmi_irq[1493]
>  imx-drm display-subsystem: bound 2000000.aips-bus:ldb at 020e0008 (ops imx_ldb_driver_exit [imx_ldb])
>  [drm] Initialized imx-drm 1.0.0 20120507 on minor 0
> +XXX dw_hdmi_connector_detect[1389]: CONNECTED
> 
> In the "unknown" case, the dw_hdmi_connector_detect() wasn't called.
> Maybe the problem happens when dw_hdmi_imx_probe() is called before
> "imx-ipuv3 2400000.ipu: IPUv3H probed" is done.

The IPU and HDMI are separate entities and can't influence each others
IRQs.

> Probably an interrupt
> isn't generated or something like this, maybe it should poll it once.
> I'll check this later.

You seem to have the interrupt generated (though you don't print what the
IRQ status register contained).  It should cause drm_helper_hpd_irq_event()
to be called, which then polls the connector detect functions.

If that detects any connector having changed status, it goes on to call
drm_kms_helper_hotplug_event(), which then goes on to call (via a few
other functions) drm_fb_helper_hotplug_event() and
drm_fb_helper_probe_connector_modes().

> > Looks fine apart from the lack of EDID.  Are you sure you have the
> > pinctrl setup correct for this?  (We don't use the DDC I2C built
> > into the HDMI interface.)
> 
> How do I check it? I'm simply using the (v4.2) imx6q-gw54xx.dts file.

drm_fb_helper_probe_connector_modes() should cause the modes to be read
via the get_modes() callback into the HDMI driver.

> >> Now, somehow the X.org server sets the resolution to 1024x768, though
> >> nothing is displayed on the monitor (it's in stand-by). Files in
> >> /sys/.../card0-HDMI-A/ now have the actual EDID, mode list etc.
> >
> > By default, 1024x768 is selected when there's nothing else available.
> 
> How do I select e.g. 1920x1080? The EDID supports this mode, but
> # xrandr --output HDMI1 --auto
> 
> X Error:  BadMatch
>   Request Major code 139 (RANDR)
>   Request Minor code 7 ()
>   Error Serial #34
>   Current Serial #35
> 
> imx-drm display-subsystem: failed to allocate buffer with size 8294400
> imx-drm display-subsystem: failed to allocate buffer with size 8294400

Why are you getting those errors?  Do you have CMA disabled?  Maybe you
need to use cma=128M or something on the command line.

> Now, having the HDMI output on the screen, I'm trying to get XVideo
> working. It seems all XV attributes are set to their minimum values and
> I can't change that. Is it normal? For this or other reason, I can see
> a black video window only (I'm trying to use I420 overlay). Could be
> unrelated problem, though.

That's probably because of the restrictions in the IPU - the mainline
IPU code is unable to scale overlays at all - it's not supported.  The
problem is most Xorg drivers assume that overlays can be scaled.  I've
said about this before, and how this is broken, but I've no idea whether
it's going to get fixed.  As far as I know, this only affects platforms
using the IPU.

The only alternative there is to switch to using the GPU to blit the
XVideo frame onto the display (but then you need all the etnaviv bits
in place, including the etnaviv DRM driver.)  This works up to a point,
but suffers from tearing, because there's no sane good way to synchronise
the GPU blit with the video scanout (because they're two different
completely unrelated chunks of hardware: the reason Intel i965 can do
this is because it seems possible to put into the GPU stream "wait for
scan line X before continuing" thereby preventing the blit modifying
scanlines that are about to be displayed.

I have some experimental code for the Xorg driver that computes the
period of time after the vsync that the scanlines would be scanned out.
However, my measurements of the time taken for the GPU to blit the
frame show that it takes almost one scan-out to do the filter blit.
That makes the timings are _really_ tight there which means any jitter
in the scheduling and interrupts will throw any solution to this off,
and the tearing will be back.

As long as the video playback situation (as a whole, I'm talking about
the VPU) is poorly supported both in userspace and mainline kernels (it
only supports H264, not MPEG2/4, and requires bleeding edge gstreamer
support), video decode and overlay on iMX6 doesn't interest me.  My
preferred ARM platform for that is Dove right now, so I'm not motivated
to put much effort into the iMX6 video playback issues, basically because
I can't decently test them.

As for the overlay attributes, don't worry about them - imx-drm doesn't
support the properties on overlay at all.  They're exposed because once
the Xorg atoms exist, you can't then return a BadMatch when getting or
setting them - applications tend to have a dislike for that.  Maybe I
should arrange it to return a more sensible value though.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-07 11:25 ` Russell King - ARM Linux
  2015-09-07 14:04   ` Krzysztof Hałasa
@ 2015-09-08 10:45   ` Krzysztof Hałasa
  2015-09-08 10:56     ` Lucas Stach
  1 sibling, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-08 10:45 UTC (permalink / raw)
  To: linux-arm-kernel

Trying to make some progress... I was missing the etnaviv DRM kernel
driver. Now I have both IMX and etnaviv drivers, Linux v4.0-stable:

git://git.pengutronix.de/git/lst/linux.git (etnaviv DRM driver)
PLL5 DTS patch (enables HDMI with LVDS driver loaded):

--- a/arch/arm/boot/dts/imx6q-gw54xx.dts
+++ b/arch/arm/boot/dts/imx6q-gw54xx.dts
@@ -21,3 +21,11 @@
 &sata {
 	status = "okay";
 };
+
+&clks {
+	assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
+			  <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
+	assigned-clock-parents = <&clks IMX6QDL_CLK_PLL3_USB_OTG>,
+				 <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
+};
+

also had to apply:

--- a/drivers/staging/etnaviv/Makefile
+++ b/drivers/staging/etnaviv/Makefile
@@ -11,7 +11,6 @@ etnaviv-y := \
 	etnaviv_gem_submit.o \
 	etnaviv_gpu.o \
 	etnaviv_iommu.o \
-	etnaviv_iommu_v2.o \
 	etnaviv_mmu.o \
 	etnaviv_buffer.o
 

X.org etc.:
	git://github.com/laanwj/etna_viv.git
        git://ftp.arm.linux.org.uk/~rmk/libdrm-armada.git/
        git://ftp.arm.linux.org.uk/~rmk/xf86-video-armada.git unstable-devel
(I can't use master branch of xf86-video-armada.git because it doesn't
support etnaviv - does it?)

X log (relevant(?) stuff only):

[ 18919.848] (II) armada(0): hardware: imx-drm
[ 18919.923] (--) armada(0): Vivante GC320 GPU revision 5007 (etnaviv) 2d PE2.0
[ 18919.925] (II) armada(0): [DRI2] Setup complete
[ 18919.925] (II) armada(0): [DRI2]   DRI driver: etnadrm
[ 18919.925] (II) armada(0): direct rendering: DRI2 enabled
[ 18919.925] (II) armada(0): RandR 1.2 enabled, ignore the following RandR disabled message.
[ 18919.927] (==) armada(0): DPMS enabled
[ 18919.927] (==) armada(0): hotplug detection enabled
[ 18919.928] (II) armada(0): etnaviv: Xv: using YUY2 tiled format intermediate YUV target
[ 18919.971] (EE) AIGLX error: dlopen of /lib/dri/etnadrm_dri.so failed (I don't have this yet)
[ 18920.072] (II) armada(0): etnaviv: A8 target not supported

If I try to use pengutronix/etnaviv-4.1-wip branch (etnaviv DRM - for
v4.2), dmesg contains a lot of:
 [drm:etnaviv_ioctl_gem_submit [etnaviv]] *ERROR* cmdstream bo has flag ETNA_BO_CMDSTREAM not set
and it doesn't work. I assume I shouldn't use it yet?

Changing to pengutronix/etnaviv-for-upstream, it works - sort of.

I now have two Xvideo adapters:
Adaptor: 0
Name: Marvell Armada Overlay Video
 Port: 88
(which unfortunately doesn't work, the window is black, the XV
attributes are set to minimums and I can't set them).

Is it expected?

Adaptor: 1
Name: Etnaviv Textured Video
 Port(s): 89 - 104

  Name: XV_SYNC_TO_VBLANK
   Flags: XvGettable XvSettable
   Min value: 0
   Max value: 1
   Current value: 1
  Name: XV_PIPE
   Flags: XvGettable XvSettable
   Min value: -1
   Max value: 3
   Current value: -1
  Name: XV_ENCODING
   Flags: XvGettable XvSettable
   Min value: 0
   Max value: 0
   Current value: 0

This adapter works, though there are some image distortions (horizontal
lines apparently caused by changes in color between frames).

Any input?
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 10:45   ` Krzysztof Hałasa
@ 2015-09-08 10:56     ` Lucas Stach
  2015-09-08 11:01       ` Russell King - ARM Linux
                         ` (2 more replies)
  0 siblings, 3 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-08 10:56 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 08.09.2015, 12:45 +0200 schrieb Krzysztof Ha?asa:
> Trying to make some progress... I was missing the etnaviv DRM kernel
> driver. Now I have both IMX and etnaviv drivers, Linux v4.0-stable:
> 
> git://git.pengutronix.de/git/lst/linux.git (etnaviv DRM driver)
> PLL5 DTS patch (enables HDMI with LVDS driver loaded):
> 
> --- a/arch/arm/boot/dts/imx6q-gw54xx.dts
> +++ b/arch/arm/boot/dts/imx6q-gw54xx.dts
> @@ -21,3 +21,11 @@
>  &sata {
>  	status = "okay";
>  };
> +
> +&clks {
> +	assigned-clocks = <&clks IMX6QDL_CLK_LDB_DI0_SEL>,
> +			  <&clks IMX6QDL_CLK_LDB_DI1_SEL>;
> +	assigned-clock-parents = <&clks IMX6QDL_CLK_PLL3_USB_OTG>,
> +				 <&clks IMX6QDL_CLK_PLL3_USB_OTG>;
> +};
> +
> 
> also had to apply:
> 
> --- a/drivers/staging/etnaviv/Makefile
> +++ b/drivers/staging/etnaviv/Makefile
> @@ -11,7 +11,6 @@ etnaviv-y := \
>  	etnaviv_gem_submit.o \
>  	etnaviv_gpu.o \
>  	etnaviv_iommu.o \
> -	etnaviv_iommu_v2.o \
>  	etnaviv_mmu.o \
>  	etnaviv_buffer.o
>  
> 
> X.org etc.:
> 	git://github.com/laanwj/etna_viv.git
>         git://ftp.arm.linux.org.uk/~rmk/libdrm-armada.git/
>         git://ftp.arm.linux.org.uk/~rmk/xf86-video-armada.git unstable-devel
> (I can't use master branch of xf86-video-armada.git because it doesn't
> support etnaviv - does it?)
> 
> X log (relevant(?) stuff only):
> 
> [ 18919.848] (II) armada(0): hardware: imx-drm
> [ 18919.923] (--) armada(0): Vivante GC320 GPU revision 5007 (etnaviv) 2d PE2.0
> [ 18919.925] (II) armada(0): [DRI2] Setup complete
> [ 18919.925] (II) armada(0): [DRI2]   DRI driver: etnadrm
> [ 18919.925] (II) armada(0): direct rendering: DRI2 enabled
> [ 18919.925] (II) armada(0): RandR 1.2 enabled, ignore the following RandR disabled message.
> [ 18919.927] (==) armada(0): DPMS enabled
> [ 18919.927] (==) armada(0): hotplug detection enabled
> [ 18919.928] (II) armada(0): etnaviv: Xv: using YUY2 tiled format intermediate YUV target
> [ 18919.971] (EE) AIGLX error: dlopen of /lib/dri/etnadrm_dri.so failed (I don't have this yet)
> [ 18920.072] (II) armada(0): etnaviv: A8 target not supported
> 
> If I try to use pengutronix/etnaviv-4.1-wip branch (etnaviv DRM - for
> v4.2), dmesg contains a lot of:
>  [drm:etnaviv_ioctl_gem_submit [etnaviv]] *ERROR* cmdstream bo has flag ETNA_BO_CMDSTREAM not set
> and it doesn't work. I assume I shouldn't use it yet?
> 
You need changes to the X.Org driver for that to work. I'm currently
working on a new version of the etnaviv-drm driver which will break the
kernel userspace interface another time - hopefully for the last time
now.

I'm almost done and will publish patches for both the kernel and the
X.Org driver today.

> Changing to pengutronix/etnaviv-for-upstream, it works - sort of.
> 
> I now have two Xvideo adapters:
> Adaptor: 0
> Name: Marvell Armada Overlay Video
>  Port: 88
> (which unfortunately doesn't work, the window is black, the XV
> attributes are set to minimums and I can't set them).
> 
> Is it expected?
> 
This is expected, it's the overlay adapter which doesn't really work
with imx-drm yet.

Regards,
Lucas


-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* I.MX6 HDMI support in v4.2
  2015-09-08 10:56     ` Lucas Stach
@ 2015-09-08 11:01       ` Russell King - ARM Linux
  2015-09-08 11:07         ` Lucas Stach
  2015-09-08 11:06       ` Krzysztof Hałasa
  2015-09-14  8:39       ` Krzysztof Hałasa
  2 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08 11:01 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 08, 2015 at 12:56:18PM +0200, Lucas Stach wrote:
> This is expected, it's the overlay adapter which doesn't really work
> with imx-drm yet.

No, it's imx-drm which isn't working.  As I explained in my previous
email, overlay planes are expected to do scaling.  imx-drm errors out
attempts for that.  This is a kernel bug, not an Xorg driver bug.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-08  9:16     ` Russell King - ARM Linux
@ 2015-09-08 11:01       ` Krzysztof Hałasa
  2015-09-08 12:57         ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-08 11:01 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

> Do you have DRM configured as modules?  I can't think of anything else
> that would change the probe order like this.

Yes, they are modules.

> You seem to have the interrupt generated

Right.

> (though you don't print what the
> IRQ status register contained).  It should cause drm_helper_hpd_irq_event()
> to be called, which then polls the connector detect functions.
>
> If that detects any connector having changed status, it goes on to call
> drm_kms_helper_hotplug_event(), which then goes on to call (via a few
> other functions) drm_fb_helper_hotplug_event() and
> drm_fb_helper_probe_connector_modes().

Ok, I will queue this for investigation.

>> imx-drm display-subsystem: failed to allocate buffer with size 8294400
>> imx-drm display-subsystem: failed to allocate buffer with size 8294400
>
> Why are you getting those errors?  Do you have CMA disabled?  Maybe you
> need to use cma=128M or something on the command line.

Yes, I had it disabled.

>> Now, having the HDMI output on the screen, I'm trying to get XVideo
>> working. It seems all XV attributes are set to their minimum values and
>> I can't change that. Is it normal? For this or other reason, I can see
>> a black video window only (I'm trying to use I420 overlay). Could be
>> unrelated problem, though.
>
> That's probably because of the restrictions in the IPU - the mainline
> IPU code is unable to scale overlays at all - it's not supported.  The
> problem is most Xorg drivers assume that overlays can be scaled.  I've
> said about this before, and how this is broken, but I've no idea whether
> it's going to get fixed.  As far as I know, this only affects platforms
> using the IPU.

I see. But I'm ok with unscaled Xvideo. I only need a (fast) way to send
YUV (preferably YUV420) image to the screen.

> The only alternative there is to switch to using the GPU to blit the
> XVideo frame onto the display (but then you need all the etnaviv bits
> in place, including the etnaviv DRM driver.)  This works up to a point,
> but suffers from tearing, because there's no sane good way to synchronise
> the GPU blit with the video scanout (because they're two different
> completely unrelated chunks of hardware: the reason Intel i965 can do
> this is because it seems possible to put into the GPU stream "wait for
> scan line X before continuing" thereby preventing the blit modifying
> scanlines that are about to be displayed.

This could be the horizontal lines that I observed. Something similar
to what the old S3 Trio64 were doing.

> As long as the video playback situation (as a whole, I'm talking about
> the VPU) is poorly supported both in userspace and mainline kernels (it
> only supports H264, not MPEG2/4, and requires bleeding edge gstreamer
> support), video decode and overlay on iMX6 doesn't interest me.  My
> preferred ARM platform for that is Dove right now, so I'm not motivated
> to put much effort into the iMX6 video playback issues, basically because
> I can't decently test them.

I see. At the moment I'm able to use the hardware decoder (with a bit
long latencies, though), I'm getting a YUV420 image out of it. Also, the
encoder works.

> As for the overlay attributes, don't worry about them - imx-drm doesn't
> support the properties on overlay at all.  They're exposed because once
> the Xorg atoms exist, you can't then return a BadMatch when getting or
> setting them - applications tend to have a dislike for that.  Maybe I
> should arrange it to return a more sensible value though.

I see.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 10:56     ` Lucas Stach
  2015-09-08 11:01       ` Russell King - ARM Linux
@ 2015-09-08 11:06       ` Krzysztof Hałasa
  2015-09-14  8:39       ` Krzysztof Hałasa
  2 siblings, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-08 11:06 UTC (permalink / raw)
  To: linux-arm-kernel

Lucas Stach <l.stach@pengutronix.de> writes:

>>  [drm:etnaviv_ioctl_gem_submit [etnaviv]] *ERROR* cmdstream bo has flag ETNA_BO_CMDSTREAM not set
>> and it doesn't work. I assume I shouldn't use it yet?
>> 
> You need changes to the X.Org driver for that to work. I'm currently
> working on a new version of the etnaviv-drm driver which will break the
> kernel userspace interface another time - hopefully for the last time
> now.
>
> I'm almost done and will publish patches for both the kernel and the
> X.Org driver today.

Great, I'm looking forward to be the first guinea pig :-)
Thanks.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 11:01       ` Russell King - ARM Linux
@ 2015-09-08 11:07         ` Lucas Stach
  2015-09-08 11:29           ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas Stach @ 2015-09-08 11:07 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 08.09.2015, 12:01 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 08, 2015 at 12:56:18PM +0200, Lucas Stach wrote:
> > This is expected, it's the overlay adapter which doesn't really work
> > with imx-drm yet.
> 
> No, it's imx-drm which isn't working.  As I explained in my previous
> email, overlay planes are expected to do scaling.  imx-drm errors out
> attempts for that.  This is a kernel bug, not an Xorg driver bug.
> 
I would argue that this is a bug of the interface between kernel and
userspace.
Scaling isn't something that can be expected to be usable on every
hardware (and in fact the IPU isn't able to do arbitrary scaling with
its 1024 in/out pixel constraints), but there is no clear way to
communicate this to userspace other than flat out rejecting the plane
update. Atomic may provide some better ways, but we are not there yet
for imx-drm.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* I.MX6 HDMI support in v4.2
  2015-09-08 11:07         ` Lucas Stach
@ 2015-09-08 11:29           ` Russell King - ARM Linux
  2015-09-08 12:43             ` Lucas Stach
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08 11:29 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 08, 2015 at 01:07:47PM +0200, Lucas Stach wrote:
> Am Dienstag, den 08.09.2015, 12:01 +0100 schrieb Russell King - ARM
> Linux:
> > On Tue, Sep 08, 2015 at 12:56:18PM +0200, Lucas Stach wrote:
> > > This is expected, it's the overlay adapter which doesn't really work
> > > with imx-drm yet.
> > 
> > No, it's imx-drm which isn't working.  As I explained in my previous
> > email, overlay planes are expected to do scaling.  imx-drm errors out
> > attempts for that.  This is a kernel bug, not an Xorg driver bug.
> > 
> I would argue that this is a bug of the interface between kernel and
> userspace.

Yes, only in so far as knowing beforehand whether scaling is possible.
The only time that you get to know is when the call to display the plane
fails.  That's a really poor interface.

> Scaling isn't something that can be expected to be usable on every
> hardware (and in fact the IPU isn't able to do arbitrary scaling with
> its 1024 in/out pixel constraints), but there is no clear way to
> communicate this to userspace other than flat out rejecting the plane
> update. Atomic may provide some better ways, but we are not there yet
> for imx-drm.

I think that depends on your point of view - I suspect x86 people would
be surprised by that comment. :)

There was talk a while back when the overlay plane support went in that
it was possible to do >1024 pixels, but it was complex, but the impression
I was left with was one day it would work - and I'm still waiting.  I
suspect that the iMX6 is going to be obsolete before we have a decent
working video playback story on this hardware.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-08 11:29           ` Russell King - ARM Linux
@ 2015-09-08 12:43             ` Lucas Stach
  2015-09-08 13:40               ` Russell King - ARM Linux
  2015-09-08 14:17               ` Robert Nelson
  0 siblings, 2 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-08 12:43 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 08.09.2015, 12:29 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 08, 2015 at 01:07:47PM +0200, Lucas Stach wrote:
> > Am Dienstag, den 08.09.2015, 12:01 +0100 schrieb Russell King - ARM
> > Linux:
> > > On Tue, Sep 08, 2015 at 12:56:18PM +0200, Lucas Stach wrote:
> > > > This is expected, it's the overlay adapter which doesn't really work
> > > > with imx-drm yet.
> > > 
> > > No, it's imx-drm which isn't working.  As I explained in my previous
> > > email, overlay planes are expected to do scaling.  imx-drm errors out
> > > attempts for that.  This is a kernel bug, not an Xorg driver bug.
> > > 
> > I would argue that this is a bug of the interface between kernel and
> > userspace.
> 
> Yes, only in so far as knowing beforehand whether scaling is possible.
> The only time that you get to know is when the call to display the plane
> fails.  That's a really poor interface.
> 
> > Scaling isn't something that can be expected to be usable on every
> > hardware (and in fact the IPU isn't able to do arbitrary scaling with
> > its 1024 in/out pixel constraints), but there is no clear way to
> > communicate this to userspace other than flat out rejecting the plane
> > update. Atomic may provide some better ways, but we are not there yet
> > for imx-drm.
> 
> I think that depends on your point of view - I suspect x86 people would
> be surprised by that comment. :)
> 
I think some of the recent Intel chips had the same problem, in that
they lost the ability to scale planes and ended up not exposing them due
to the poor interface.

> There was talk a while back when the overlay plane support went in that
> it was possible to do >1024 pixels, but it was complex, but the impression
> I was left with was one day it would work - and I'm still waiting. 

Don't wait for that. We can't do >1024 without doing a copy in memory,
which would be a big stretch of the plane definition and benefit.

In addition the IPU scaler has pitch and alignment constraints that make
the needed tiling extremely complex to get right. We fiddled with this
extensively to get it to the point that it is usable as a V4L2 mem2mem
device. Moving this to the display path is not going to happen, ever.

As all relevant resolutions already require a copy you are much better
of doing it with the GPU and get all the testing effort focused on that
path.

> I
> suspect that the iMX6 is going to be obsolete before we have a decent
> working video playback story on this hardware.
> 
MX6Plus is just around the corner and will probably keep us busy for a
while. ;)

Regards,
Lucas

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* I.MX6 HDMI support in v4.2
  2015-09-08 11:01       ` Krzysztof Hałasa
@ 2015-09-08 12:57         ` Russell King - ARM Linux
  2015-09-08 14:59           ` Krzysztof Hałasa
  2015-09-10 10:25           ` Krzysztof Hałasa
  0 siblings, 2 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08 12:57 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 08, 2015 at 01:01:47PM +0200, Krzysztof Ha?asa wrote:
> Russell King - ARM Linux <linux@arm.linux.org.uk> writes:
> > That's probably because of the restrictions in the IPU - the mainline
> > IPU code is unable to scale overlays at all - it's not supported.  The
> > problem is most Xorg drivers assume that overlays can be scaled.  I've
> > said about this before, and how this is broken, but I've no idea whether
> > it's going to get fixed.  As far as I know, this only affects platforms
> > using the IPU.
> 
> I see. But I'm ok with unscaled Xvideo. I only need a (fast) way to send
> YUV (preferably YUV420) image to the screen.

Note that most (all?) video requires some scaling.  A 720x576 video on
square pixels needs to be scaled to 768x576, but at "modern" aspect
ratio of 16:9, it needs to be scaled horizontally to 1024x576.

This pretty much makes the video overlay which imx-drm publishes to
userspace as useful as a chocolate teapot.  I suppose you could eat the
chocolate teapot, but it's not useful for its intended purpose of making
tea.

> > The only alternative there is to switch to using the GPU to blit the
> > XVideo frame onto the display (but then you need all the etnaviv bits
> > in place, including the etnaviv DRM driver.)  This works up to a point,
> > but suffers from tearing, because there's no sane good way to synchronise
> > the GPU blit with the video scanout (because they're two different
> > completely unrelated chunks of hardware: the reason Intel i965 can do
> > this is because it seems possible to put into the GPU stream "wait for
> > scan line X before continuing" thereby preventing the blit modifying
> > scanlines that are about to be displayed.
> 
> This could be the horizontal lines that I observed. Something similar
> to what the old S3 Trio64 were doing.

They're probably not the tearing - tearing is where you scan out part of
the old frame and part of the new frame, which appears as a particularly
noticable effect on scenes with a lot of change.

Horizontal lines which are significantly different (eg, short black lines)
will be CPU cache corruption - both the main etnaviv DRM and Lucas' "fixed"
cache handling suffer from this.  My patch set doesn't.

 git://ftp.arm.linux.org.uk/~rmk/linux-arm.git drm-etnaviv-devel

contains my code.

Etnaviv DRM development has stalled because of Pengutronix, and their
attitude towards open source development - which is to develop their
patches behind closed doors, and publish part of a story once in a blue
moon.  (Sorry Lucas, but Pengutronix has this criticism coming.)  Both
myself and Christian have tried to get more of their work out in the
open, and failed.  I think Christian has stopped work on the project
completely because of this, as he doesn't want to waste time duplicating
effort.  I've certainly asked for Lucas' modifications to my Xorg driver,
and got nowhere (I've had to update it myself, to align the kernel/user
API with Pengutronix' efforts.)  I think Christian has virtually given
up on it because of the lack of communication.

Etnaviv DRM is not a happy place to be right now, because of Pengutronix'
involvement in it, and their lack of sharing.  The only thing that they've
shared so far is a set of kernel patches.  Everything else is kept behind
their closed doors.

I think part of this is because Pengutronix want to be ones to claim "oh
look what we've done for the community" all the time - I see that a lot
on google+, where they're always posting "this is what we did in Linux
4.whatever" and they don't want anyone taking away their "thunder".
Quite sad really, because it means that development is actually being
hindered by such an approach, and people are getting pissed off with it.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-08 12:43             ` Lucas Stach
@ 2015-09-08 13:40               ` Russell King - ARM Linux
  2015-09-08 14:17               ` Robert Nelson
  1 sibling, 0 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08 13:40 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 08, 2015 at 02:43:53PM +0200, Lucas Stach wrote:
> Am Dienstag, den 08.09.2015, 12:29 +0100 schrieb Russell King - ARM
> Linux:
> > There was talk a while back when the overlay plane support went in that
> > it was possible to do >1024 pixels, but it was complex, but the impression
> > I was left with was one day it would work - and I'm still waiting. 
> 
> Don't wait for that. We can't do >1024 without doing a copy in memory,
> which would be a big stretch of the plane definition and benefit.
> 
> In addition the IPU scaler has pitch and alignment constraints that make
> the needed tiling extremely complex to get right. We fiddled with this
> extensively to get it to the point that it is usable as a V4L2 mem2mem
> device. Moving this to the display path is not going to happen, ever.
> 
> As all relevant resolutions already require a copy you are much better
> of doing it with the GPU and get all the testing effort focused on that
> path.

And at that point, you might as well use the filter blit and blit directly
to the screen.

I've run some performance analysis on this on iMX6 hardware, and the time
taken for the CPU to copy the Xv data passed to it is about the same time
that it takes the CPU to flush the caches, then ask the GPU to copy the
data, and then wait for the GPU to report that the copy has finished.  My
analysis shows that you actually lose performance by using the GPU to
merely copy and then pass it to Xv.

Also, you mention that the IPU scaler has pitch and alignment constraints.
So does the GPU.  The Xv interface can cope with that just fine, because
the Xv backend gets to define the pitch and buffer size for any given
format/width/height, and offsets in the buffer for planar image formats.

It isn't able to specify the alignment of the actual buffer though - for
SHM, that's going to be the size of a struct page due to the way shmem
works.  For raw XvPutImage, things are harder to cope with, but the GPU
can cope provided the offset is aligned to a pixel boundary.

> MX6Plus is just around the corner and will probably keep us busy for a
> while. ;)

You might be excited about that, but for the rest of us, we have to put
up with the hardware we have, which is basically iMX6.  We need solutions
now on existing iMX6 hardware, not the next set of likely to be
problematical hardware.

I know the grass is always greener on the other side - and I expect that
when MX6+ comes out, you'll then have no time to work on etnaviv DRM,
and we'll still be stuck without any progress on that.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-08 12:43             ` Lucas Stach
  2015-09-08 13:40               ` Russell King - ARM Linux
@ 2015-09-08 14:17               ` Robert Nelson
  2015-09-08 14:45                 ` Krzysztof Hałasa
                                   ` (2 more replies)
  1 sibling, 3 replies; 47+ messages in thread
From: Robert Nelson @ 2015-09-08 14:17 UTC (permalink / raw)
  To: linux-arm-kernel

>> I
>> suspect that the iMX6 is going to be obsolete before we have a decent
>> working video playback story on this hardware.
>>
> MX6Plus is just around the corner and will probably keep us busy for a
> while. ;)

Lucas,

In which case, it "might" be a good idea to get the current version of
etnaviv in mainline for current imx6's before you guys disappear again
for mx6plus development..

As you guys are basically repeating what happened with the limadriver:
http://limadriver.org/

Remember, there is an etnaviv community.

Russell:
is there any reason to not just push your version for mainline and let
Pengutronix submit patches.

Regards,

-- 
Robert Nelson
https://rcn-ee.com/

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

* I.MX6 HDMI support in v4.2
  2015-09-08 14:17               ` Robert Nelson
@ 2015-09-08 14:45                 ` Krzysztof Hałasa
  2015-09-08 14:48                 ` Lucas Stach
  2015-09-08 15:55                 ` Russell King - ARM Linux
  2 siblings, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-08 14:45 UTC (permalink / raw)
  To: linux-arm-kernel

Robert Nelson <robertcnelson@gmail.com> writes:

> In which case, it "might" be a good idea to get the current version of
> etnaviv in mainline for current imx6's before you guys disappear again
> for mx6plus development..

Definitely. This also includes the userspace parts.
Bugs can always be squashed, but everything is much easier when the
whole environment is already set up.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 14:17               ` Robert Nelson
  2015-09-08 14:45                 ` Krzysztof Hałasa
@ 2015-09-08 14:48                 ` Lucas Stach
  2015-09-08 15:55                 ` Russell King - ARM Linux
  2 siblings, 0 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-08 14:48 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 08.09.2015, 09:17 -0500 schrieb Robert Nelson:
> >> I
> >> suspect that the iMX6 is going to be obsolete before we have a decent
> >> working video playback story on this hardware.
> >>
> > MX6Plus is just around the corner and will probably keep us busy for a
> > while. ;)
> 
> Lucas,
> 
> In which case, it "might" be a good idea to get the current version of
> etnaviv in mainline for current imx6's before you guys disappear again
> for mx6plus development..
> 
This wasn't to signal that we are moving away from MX6 just to say that
there might be a lot more life in MX6 than what the above implies.

> As you guys are basically repeating what happened with the limadriver:
> http://limadriver.org/
> 
We have no intention to repeat that.

> Remember, there is an etnaviv community.
> 
I would love to get review feedback for what is currently in the open
from that community.

Regards,
Lucas

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* I.MX6 HDMI support in v4.2
  2015-09-08 12:57         ` Russell King - ARM Linux
@ 2015-09-08 14:59           ` Krzysztof Hałasa
  2015-09-10 10:25           ` Krzysztof Hałasa
  1 sibling, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-08 14:59 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

> Note that most (all?) video requires some scaling.  A 720x576 video on
> square pixels needs to be scaled to 768x576, but at "modern" aspect
> ratio of 16:9, it needs to be scaled horizontally to 1024x576.

Sure. What I meant was the very application I'm currently working on
is, at least at the moment, ok with unscaled video (because it's all
1920x1080p).

> They're probably not the tearing - tearing is where you scan out part of
> the old frame and part of the new frame, which appears as a particularly
> noticable effect on scenes with a lot of change.

Right, basically a set of two "halves", moving slowly up or down.
This is BTW what can be observed on unsynchronized displays (e.g. on
multi-display machine usually only one display can be synchronized with
a video stream).

> Horizontal lines which are significantly different (eg, short black lines)
> will be CPU cache corruption - both the main etnaviv DRM and Lucas' "fixed"
> cache handling suffer from this.  My patch set doesn't.
>
>  git://ftp.arm.linux.org.uk/~rmk/linux-arm.git drm-etnaviv-devel
>
> contains my code.

Great, will switch to it tomorrow.
Thanks again.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 14:17               ` Robert Nelson
  2015-09-08 14:45                 ` Krzysztof Hałasa
  2015-09-08 14:48                 ` Lucas Stach
@ 2015-09-08 15:55                 ` Russell King - ARM Linux
  2015-09-08 17:07                   ` Jon Nettleton
  2 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-08 15:55 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 08, 2015 at 09:17:06AM -0500, Robert Nelson wrote:
> >> I
> >> suspect that the iMX6 is going to be obsolete before we have a decent
> >> working video playback story on this hardware.
> >>
> > MX6Plus is just around the corner and will probably keep us busy for a
> > while. ;)
> 
> Lucas,
> 
> In which case, it "might" be a good idea to get the current version of
> etnaviv in mainline for current imx6's before you guys disappear again
> for mx6plus development..
> 
> As you guys are basically repeating what happened with the limadriver:
> http://limadriver.org/
> 
> Remember, there is an etnaviv community.
> 
> Russell:
> is there any reason to not just push your version for mainline and let
> Pengutronix submit patches.

The basic problem is getting the kernel<->user API stable before it
goes into mainline, which is an absolute must.  We can't drop it into
mainline and then break the user API.

We also want to avoid putting it into the staging tree and have it
sit around there for years.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-08 15:55                 ` Russell King - ARM Linux
@ 2015-09-08 17:07                   ` Jon Nettleton
  0 siblings, 0 replies; 47+ messages in thread
From: Jon Nettleton @ 2015-09-08 17:07 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 8, 2015 at 5:55 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Tue, Sep 08, 2015 at 09:17:06AM -0500, Robert Nelson wrote:
>> >> I
>> >> suspect that the iMX6 is going to be obsolete before we have a decent
>> >> working video playback story on this hardware.
>> >>
>> > MX6Plus is just around the corner and will probably keep us busy for a
>> > while. ;)
>>
>> Lucas,
>>
>> In which case, it "might" be a good idea to get the current version of
>> etnaviv in mainline for current imx6's before you guys disappear again
>> for mx6plus development..
>>
>> As you guys are basically repeating what happened with the limadriver:
>> http://limadriver.org/
>>
>> Remember, there is an etnaviv community.
>>
>> Russell:
>> is there any reason to not just push your version for mainline and let
>> Pengutronix submit patches.
>
> The basic problem is getting the kernel<->user API stable before it
> goes into mainline, which is an absolute must.  We can't drop it into
> mainline and then break the user API.
>
> We also want to avoid putting it into the staging tree and have it
> sit around there for years.
>

If you don't have much time to work on it then lets get it pushed to
the github community repos where we can have everyone else submit
patches.  We have #etnaviv where we can coordinate efforts.  Even if
something is on a todo list lets get it out where we someone else can
work on it.  I think our community is strong enough that we can all
make progress without stepping on each others feet.

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

* I.MX6 HDMI support in v4.2
  2015-09-08 12:57         ` Russell King - ARM Linux
  2015-09-08 14:59           ` Krzysztof Hałasa
@ 2015-09-10 10:25           ` Krzysztof Hałasa
  2015-09-10 10:49             ` Russell King - ARM Linux
  1 sibling, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-10 10:25 UTC (permalink / raw)
  To: linux-arm-kernel

Now I'm trying to use the imxdrm Xv output.

$ mplayer -vo xv test.mp4 -x 720

VO Config (720x576->720x576,flags=0,'MPlayer',0x32315659)
VO: [xv] 720x576 => 720x576 Planar YV12
Xvideo image format: 0x34325241 (AR24) packed
Xvideo image format: 0x34325258 (XR24) packed
Xvideo image format: 0x34324241 (AB24) packed
Xvideo image format: 0x34324258 (XB24) packed
Xvideo image format: 0x32595559 (YUY2) packed
Xvideo image format: 0x30323449 (I420) planar
Xvideo image format: 0x32315659 (YV12) planar
Xvideo image format: 0x4f425658 (XVBO) planar
using Xvideo port 85 for hw scaling
*** [vo] Exporting mp_image_t, 720x576x12bpp YUV planar, 622080 bytes

Adaptor #0: "Marvell Armada Overlay Video"
number of ports: 1
port base: 85

The Y plane is ok, but the Xv window is green, like on old monochrome
CRTs - what could that be? It looks like the UV planes are all wrong.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-10 10:25           ` Krzysztof Hałasa
@ 2015-09-10 10:49             ` Russell King - ARM Linux
  2015-09-10 11:29               ` Krzysztof Hałasa
  2015-09-17  7:21               ` Philipp Zabel
  0 siblings, 2 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-10 10:49 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Sep 10, 2015 at 12:25:32PM +0200, Krzysztof Ha?asa wrote:
> The Y plane is ok, but the Xv window is green, like on old monochrome
> CRTs - what could that be? It looks like the UV planes are all wrong.

>From a quick read of the imx-drm ipuv3-plane code, it looks like it
doesn't bother with the U/V planes for planar images.  Nothing looks
at fb->offsets[1,2] nor fb->pitches[1,2].  However, it claims to
support DRM_FORMAT_YUV420 and DRM_FORMAT_YVU420 formats - which is
wrong if it doesn't look at these other offsets and pitches.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-10 10:49             ` Russell King - ARM Linux
@ 2015-09-10 11:29               ` Krzysztof Hałasa
  2015-09-17  7:21               ` Philipp Zabel
  1 sibling, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-10 11:29 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

>>From a quick read of the imx-drm ipuv3-plane code, it looks like it
> doesn't bother with the U/V planes for planar images.  Nothing looks
> at fb->offsets[1,2] nor fb->pitches[1,2].  However, it claims to
> support DRM_FORMAT_YUV420 and DRM_FORMAT_YVU420 formats - which is
> wrong if it doesn't look at these other offsets and pitches.

Well... I have to agree.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-08 10:56     ` Lucas Stach
  2015-09-08 11:01       ` Russell King - ARM Linux
  2015-09-08 11:06       ` Krzysztof Hałasa
@ 2015-09-14  8:39       ` Krzysztof Hałasa
  2015-09-15  8:24         ` Krzysztof Hałasa
  2015-09-15 15:53         ` Lucas Stach
  2 siblings, 2 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-14  8:39 UTC (permalink / raw)
  To: linux-arm-kernel

Another round of tests, I noticed the new git versions :-)
Testing Linux v4.2 + PLL5 DTS patch (for HDMI output with enabled LVDS).
Using mplayer with YUV420 (DRM Xvideo would probably work with packed
UYVY-alike formats but I need YUV420 because H.264 decoder produces it).
The driver is git://ftp.arm.linux.org.uk/~rmk/xf86-video-armada.git,
branch unstable-devel, and it uses
git://ftp.arm.linux.org.uk/~rmk/libdrm-armada.git/.

	IMX DRM Xvideo output:

Only unscaled video: no color (luminance is good but the color
components are green). The driver doesn't use color information.
I hope this is easily fixable.


	rmk/drm-etnaviv-devel:

With unscaled video, the only visible problem is tearing in the middle
of the screen (unability to sync with screen refresh).

With scaling, I'm getting horizontal lines (mostly visible when the
scene changes) and some sort of stalls - sometimes two frames are
alternating for few seconds then it goes forward.


	pengutronix/etnaviv-for-upstream:
No etnaviv Xvideo:
(==) armada(0): Backing store enabled
(==) armada(0): Silken mouse enabled
(EE) armada(0): etnaviv: unable to open: Not a directory
(WW) armada(0): [drm] Vivante initialization failed, running unaccelerated

I assume I need a newer something.


	pengutronix/v4.2/topic/etnaviv-for-rmk:
It requires:
--- a/drivers/base/dma-contiguous.c
+++ b/drivers/base/dma-contiguous.c
@@ -216,6 +216,7 @@ phys_addr_t dma_get_contiguous_base(struct device *dev)
 {
 	return cma_get_base(dev_get_cma_area(dev));
 }
+EXPORT_SYMBOL(dma_get_contiguous_base);
 
 /*
  * Support for reserved memory regions defined in device tree


Likewise, no etnaviv XVideo:
(--) armada(0): Vivante GC320 GPU revision 5007 (etnaviv) 2d PE2.0
(EE) armada(0): etnaviv: unable to create context: (null)
(WW) armada(0): [drm] Vivante initialization failed, running unaccelerated


Comments?
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-14  8:39       ` Krzysztof Hałasa
@ 2015-09-15  8:24         ` Krzysztof Hałasa
  2015-09-15 10:12           ` Russell King - ARM Linux
  2015-09-15 15:53         ` Lucas Stach
  1 sibling, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-15  8:24 UTC (permalink / raw)
  To: linux-arm-kernel

> Testing Linux v4.2 + PLL5 DTS patch (for HDMI output with enabled LVDS).
> Using mplayer with YUV420 (DRM Xvideo would probably work with packed
> UYVY-alike formats but I need YUV420 because H.264 decoder produces it).
> The driver is git://ftp.arm.linux.org.uk/~rmk/xf86-video-armada.git,
> branch unstable-devel, and it uses
> git://ftp.arm.linux.org.uk/~rmk/libdrm-armada.git/.
>
> 	IMX DRM Xvideo output:
>
> Only unscaled video: no color (luminance is good but the color
> components are green). The driver doesn't use color information.

1024 x 768 for now. I noticed a strange thing: XvShmPutImage() usually
takes (much) less than 4 milliseconds, but every 315 frames, it takes
much longer (when started, it takes 1259 frames). The following is with
constant image, i.e., not altered between frames. Source attached (one
may need to change xv_port variable).

Now what?

XVideo: using adaptor #0, port 85
Image ID 30323449 1024x768 data_size 1179648 num_planes 3 pitches 1024 512 512 data 0x76b86000
Frame#  frame count from the last such event
  vvvv   vvvv
  1259   1259: Took 0.665640667 s, avg 0.000530765 s
  1574    315: Took 0.501529334 s, avg 0.000743380 s
  1889    315: Took 0.496656667 s, avg 0.000882432 s
  2204    315: Took 0.496726667 s, avg 0.000981782 s
  2519    315: Took 0.496672333 s, avg 0.001056277 s
  2834    315: Took 0.496910000 s, avg 0.001114301 s
  3149    315: Took 0.497260667 s, avg 0.001160832 s
  3464    315: Took 0.499651334 s, avg 0.001199600 s
  3779    315: Took 0.495202334 s, avg 0.001230718 s
  4094    315: Took 0.499449667 s, avg 0.001258081 s
  4409    315: Took 0.525910333 s, avg 0.001287535 s
  4724    315: Took 0.510400000 s, avg 0.001309786 s
  5039    315: Took 0.541753334 s, avg 0.001335467 s
  5354    315: Took 0.537526666 s, avg 0.001357350 s
  5669    315: Took 0.542006000 s, avg 0.001377594 s
  5984    315: Took 0.539530333 s, avg 0.001395288 s
  6299    315: Took 0.541836000 s, avg 0.001411578 s
  6614    315: Took 0.541556333 s, avg 0.001426275 s
  6929    315: Took 0.543209666 s, avg 0.001439874 s
  7244    315: Took 0.540764000 s, avg 0.001451956 s
  7559    315: Took 0.512616666 s, avg 0.001459303 s
  7874    315: Took 0.541380000 s, avg 0.001469720 s
  8189    315: Took 0.535251333 s, avg 0.001478584 s
  8504    315: Took 0.536773334 s, avg 0.001486975 s
  8819    315: Took 0.521379000 s, avg 0.001493018 s
  9134    315: Took 0.492112667 s, avg 0.001495438 s
  9449    315: Took 0.616766000 s, avg 0.001510886 s
  9764    315: Took 0.492945666 s, avg 0.001512657 s
 10079    315: Took 0.492615000 s, avg 0.001514286 s
 10394    315: Took 0.493068000 s, avg 0.001515858 s
 10709    315: Took 0.496838000 s, avg 0.001517693 s
 11024    315: Took 0.516352333 s, avg 0.001521193 s
 11339    315: Took 0.500899333 s, avg 0.001523138 s
 11654    315: Took 0.494034334 s, avg 0.001524386 s
 11969    315: Took 0.492401000 s, avg 0.001525430 s
 12284    315: Took 0.505440000 s, avg 0.001527485 s
 12599    315: Took 0.511242666 s, avg 0.001529898 s
 12914    315: Took 0.493489333 s, avg 0.001530816 s

With etnaviv Xvideo, the effect is similar but much worse:

> 	rmk/drm-etnaviv-devel:
>
> With unscaled video, the only visible problem is tearing in the middle
> of the screen (unability to sync with screen refresh).

XVideo: using adaptor #1, port 90
Image ID 30323449 1024x768 data_size 1179648 num_planes 3 pitches 1024 512 512 data 0x76b8d000
  1259   1259: Took 18.864969669 s, avg 0.014974047 s
  1574    315: Took 20.758470002 s, avg 0.025159601 s
  1889    315: Took 20.720458336 s, avg 0.031929827 s
  2204    315: Took 20.831572669 s, avg 0.036815999 s
  2519    315: Took 20.807073336 s, avg 0.040470906 s
  2834    315: Took 20.789431003 s, avg 0.043307485 s
  3149    315: Took 20.809190003 s, avg 0.045582932 s
  3464    315: Took 20.803870003 s, avg 0.047443189 s
  3779    315: Took 20.798422002 s, avg 0.048991905 s
  4094    315: Took 20.809182336 s, avg 0.050304985 s
  4409    315: Took 20.812659336 s, avg 0.051431326 s
  4724    315: Took 20.816828669 s, avg 0.052408363 s
  5039    315: Took 20.814890002 s, avg 0.053262894 s
  5354    315: Took 20.803809003 s, avg 0.054014822 s
  5669    315: Took 20.798233669 s, avg 0.054682176 s
  5984    315: Took 20.809503336 s, avg 0.055281168 s
  6299    315: Took 20.814339002 s, avg 0.055821065 s
  6614    315: Took 20.812699003 s, avg 0.056309294 s
  6929    315: Took 20.800363670 s, avg 0.056751361 s
  7244    315: Took 20.814518669 s, avg 0.057156941 s
  7559    315: Took 20.814902002 s, avg 0.057528773 s
  7874    315: Took 20.814914336 s, avg 0.057870859 s
  8189    315: Took 20.803919669 s, avg 0.058185288 s
  8504    315: Took 20.807010336 s, avg 0.058476760 s
  8819    315: Took 20.855880669 s, avg 0.058752983 s
  9134    315: Took 20.809301669 s, avg 0.059005029 s
  9449    315: Took 26.004653003 s, avg 0.059790071 s
  9764    315: Took 20.796989002 s, avg 0.059991163 s
 10079    315: Took 20.798379670 s, avg 0.060179803 s
 10394    315: Took 20.809240335 s, avg 0.060358055 s
 10709    315: Took 20.814655003 s, avg 0.060526351 s
 11024    315: Took 20.803836002 s, avg 0.060684046 s
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

#include <ctype.h>
#include <signal.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/shm.h>
#include <sys/time.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/extensions/Xv.h>
#include <X11/extensions/Xvlib.h>
#include <X11/extensions/XShm.h>

#define IMAGE_FORMAT_NAME "planar I420"
#define IMAGE_FORMAT      0x30323449
#define PIXEL_FORMAT      AV_PIX_FMT_YUV420P

static Display *display;
static Window window;
static XShmSegmentInfo shminfo;
static XvImage *image;
static GC gc;
static unsigned w, h;
static unsigned xv_port = 90;

static void test_xv(void)
{
	fprintf(stderr, "Image ID %X %ux%u data_size %u num_planes %u pitches %u %u %u data %p\n",
			image->id, image->width, image->height, image->data_size, image->num_planes, image->pitches[0], image->pitches[1], image->pitches[2], image->data);

	struct timespec ts;
	if (clock_gettime(CLOCK_MONOTONIC, &ts)) {
		fprintf(stderr, "clock_gettime(MONOTONIC) failed: %m\n");
		exit(1);
	}

	unsigned long long prev_t = (unsigned long long)ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
	unsigned long long start_t = prev_t;
	unsigned count = 0, prev_count = 0;

	while (1) {
		memset(image->data, count, image->data_size);
		XvShmPutImage(display, xv_port, window, gc, image, 0, 0, w, h, 0, 0, w, h, True);

		if (clock_gettime(CLOCK_MONOTONIC, &ts)) {
			fprintf(stderr, "clock_gettime(MONOTONIC) failed: %m\n");
			exit(1);
		}
		unsigned long long t = (unsigned long long)ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
		if (t - prev_t > 4 * 1000 * 1000) {
			fprintf(stdout, "%6u %6u: Took %llu.%09llu s, avg %llu.%09llu s\n",
					count, count - prev_count,
					(t - prev_t) / (1000 * 1000 * 1000),
					(t - prev_t) % (1000 * 1000 * 1000),
					(t - start_t) / (count + 1) / (1000 * 1000 * 1000),
					(t - start_t) / (count + 1) % (1000 * 1000 * 1000));
			prev_count = count;
		}
		prev_t = t;
		count++;
	}
}

int main(void)
{
	display = XOpenDisplay(NULL);
	if (!display) {
		fprintf(stderr, "Unable to open X11 display\n");
		exit(1);
	}

	unsigned int screen = DefaultScreen(display);
	Window rdw;
	unsigned rb, rd;
	int x, y;
	if (!XGetGeometry(display, XRootWindow(display, screen), &rdw, &x, &y, &w, &h, &rb, &rd)) {
		fprintf(stderr, "Unable to get root window geometry\n");
		exit(1);
	}

	fprintf(stderr, "Creating %ux%u window at %ux%u\n", w, h, x, y);
	window = XCreateSimpleWindow(display, XRootWindow(display, screen), x, y, w, h, 0, 0, 0);

	static XClassHint class_hints = {.res_name = "Xvideo test", .res_class = "XVideo test"};
	XSetClassHint(display, window, &class_hints);

	XMapWindow(display, window);
	XStoreName(display, window, "Xvideo test");
	XSetIconName(display, window, "Xvideo test");
	XFlush(display);

	// Search for Xvideo ports
	XvAdaptorInfo *info;
	unsigned adaptors;
	if (XvQueryAdaptors(display, window, &adaptors, &info) != Success) {
		fprintf(stderr, "No XVideo adaptors found\n");
		exit(1);
	}

	unsigned cnt, found = 0;
	for (cnt = 0; cnt < adaptors; cnt++) {
		XvAdaptorInfo *adaptor = &info[cnt];
#if 0
		fprintf(stderr, "Xv adaptor: %s, port base %lu, count %lu, type 0x%X, %lu format(s)\n",
				adaptor->name, adaptor->base_id, adaptor->num_ports, adaptor->type, adaptor->num_formats);
		for (unsigned cnt1 = 0; cnt1 < adaptor->num_formats; cnt1++) {
			XvFormat *format = &adaptor->formats[cnt1];
			fprintf(stderr, "   depth %u, visual ID 0x%lX\n", format->depth, format->visual_id);
		}
#endif

		for (unsigned cnt1 = 0; cnt1 < adaptor->num_ports; cnt1++) {
			int num_formats;
			XvImageFormatValues *image_formats = XvListImageFormats(display, adaptor->base_id + cnt1, &num_formats);
			for (int cnt2 = 0; cnt2 < num_formats; cnt2++) {
				XvImageFormatValues *image_format = &image_formats[cnt2];

#if 0
				fprintf(stderr, "   Port %lu: type %i ID 0x%X (%c%c%c%c) byte order %i\n",
						adaptor->base_id + cnt1, image_format->type, image_format->id,
						isprint( image_format->id        & 0xFF) ?  image_format->id        & 0xFF : '?',
						isprint((image_format->id >>  8) & 0xFF) ? (image_format->id >>  8) & 0xFF : '?',
						isprint((image_format->id >> 16) & 0xFF) ? (image_format->id >> 16) & 0xFF : '?',
						isprint((image_format->id >> 24) & 0xFF) ? (image_format->id >> 24) & 0xFF : '?',
						image_format->byte_order);
#endif

				if (!found) {
					if (xv_port) {
						if (xv_port >= adaptor->base_id && xv_port < adaptor->base_id + adaptor->num_ports) {
							if (!(adaptor->type & XvImageMask))
								fprintf(stderr, "XVideo port %u doesn't have XvImageMask capability\n", xv_port);
							else if (image_format->id == IMAGE_FORMAT)
								found = 1;
							else if (xv_port == adaptor->base_id + adaptor->num_ports - 1)
								fprintf(stderr, "XVideo port %u doesn't support " IMAGE_FORMAT_NAME "image format\n", xv_port);
						}
					} else {
						if (adaptor->type & XvImageMask && adaptor->num_ports && image_format->id == IMAGE_FORMAT) {
							xv_port = adaptor->base_id;
							found = 1;
						}
					}
					if (found)
						fprintf(stderr, "XVideo: using adaptor #%u, port %u\n", cnt, xv_port);
				}
			}

			XFree(image_formats);
		}
	}
	XvFreeAdaptorInfo(info);

	if (!found) {
		fprintf(stderr, "No valid XVideo adaptor found\n");
		exit(1);
	}

	image = XvShmCreateImage(display, xv_port, IMAGE_FORMAT, NULL, w, h, &shminfo);
	shminfo.shmid = shmget(IPC_PRIVATE, image->data_size, IPC_CREAT | 0777);
	if (shminfo.shmid < 0)
		exit(1);

	shminfo.shmaddr = image->data = shmat(shminfo.shmid, 0, 0);
	if (shminfo.shmaddr == (void*) -1)
		exit(1);

	shminfo.readOnly = False;

	if (!XShmAttach(display, &shminfo))
		exit(1);

	gc = XCreateGC(display, window, 0, 0);
	test_xv();
	exit(0);
}

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

* I.MX6 HDMI support in v4.2
  2015-09-15  8:24         ` Krzysztof Hałasa
@ 2015-09-15 10:12           ` Russell King - ARM Linux
  2015-09-15 11:01             ` Krzysztof Hałasa
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-15 10:12 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 15, 2015 at 10:24:55AM +0200, Krzysztof Ha?asa wrote:
> 1024 x 768 for now. I noticed a strange thing: XvShmPutImage() usually
> takes (much) less than 4 milliseconds, but every 315 frames, it takes
> much longer (when started, it takes 1259 frames). The following is with
> constant image, i.e., not altered between frames. Source attached (one
> may need to change xv_port variable).

Testing on Dove and Armada DRM, I've had to make several changes to your
program:

1. Don't hard code the Xv port ID (worth mentioning somewhere so people
   testing it don't spend something like a quarter of an hour trying to
   debug why it doesn't work.)

2. Added _GNU_SOURCE at the top to get various structs and functions
   that the program uses.

3. Added a line detailing the GCC flags to be used

4. A description of what the program is doing would be nice.  For the
   record, it appears to try and call XvShmPutImage() as quickly as
   possible, recording the absolute time between calls, and reporting
   when it is more than 4ms.

5. Added a call to XSync(display, 1) after the call to XvShmPutImage()
   to ensure that the XvShmPutImage() gets pushed to the X server in a
   timely manner, doesn't sit in the applications X queue, and ensure
   that we wait for the X server to respond.

6. Extended the 4ms timeout to something sane, like 17ms.  If we're
   talking about synchronising to the vertical sync, then the period
   when we want to complain is when it takes much longer than that.

   If the display is synchronised to the vertical sync to avoid tearing,
   then you can only update the display once per vertical sync, and at
   60Hz, that's about 17ms.  At 50Hz, that's 20ms.

Now, running on Dove overlay, I see about 17ms being the average time,
which is slightly longer than the vsync.

Further analysis with strace of the X server (which pushes things up to
20ms average time):
- The X server takes about 1ms between select() indicating that there's
  an event available, and reading the event.
- It takes 14ms from reading the event to the DDX calling the DRM ioctl
  to display the image - mostly spent memcpy()'ing the image.
- 900us to return the response to the X client
- The X server then takes about 4ms to get back to calling select().

The big chunk of that is the memcpy() - that's something which can't be
eliminated for several reasons:
- With XvShm, the image buffer is shared between the X client and the
  X server.  The X server has no control over how the X client manipulates
  that buffer after the X server has returned from its call - however the
  displayed image must remain stable and free from manipulation until the
  next PutImage call.
- The X shm buffer can't be passed directly into DRM - DRM needs the
  image to be displayed to be in DRM buffer objects, which are then
  wrapped as frame buffers (a frame buffer can contain several buffer
  objects, one for each plane), and lastly the overlay plane updated
  with the new framebuffer.

Let's not forget that Dove hardware is slower than iMX6, so I think that
iMX6 should manage to comfortably achieve the 16.6ms required for
frame-by-frame display from your program.

Now, as for using the GPU, X server analysis:
- Again about 1ms between select() and read() of the event
- 1ms to the first WAIT_VBLANK ioctl on the display adapter to read the
  last VSYNC time
- 200us later to map the user pointer
- 300us to the WAIT_VBLANK ioctl to wait for the vblank (which takes in this
  instance 3.5ms to fire)
- 130us to first attempt to submit the GPU queue, which returns -EAGAIN
  after 6.4ms
- second attempt takes 9.5ms to complete successfully
- 1ms (with intervening SIGALRM handler) to wait for the GPU to finish,
  which takes 11.5ms
- 450us to ask DRM to release the user pointer buffer, which takes 9.4ms
- 1ms (with intervening SIGALRM handler) to report completion of the operation
- The X server then takes about 4ms to get back to calling select().

So, you can see that using the GPU is a much heavier and complex operation
all round.  The long delays in mapping and releasing the buffer are of
course the DMA mapping/unmapping of the buffer object to ensure that the
GPU can see the data in those buffers.

What's also notable is that it takes the GPU on the order of 10ms to do the
operation - it's actually two operations: a vertical filter blit followed
by a horizontal filter blit.  None of the Vivante GPUs that I've access to
support a single-pass filter blit scaling in both directions (the feature
bit for that is clear on both Dove's GC600 and iMX6 GC320 GPUs.)  I
suspect a Vivante GPU supporting that would take around half the time,
or better.

Of course, the time each of these operations take scales with the image
size, so an image half the width and height (which will be a quarter of
the size) will take a quarter of the time, and will be comfortably
within 17ms.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-15 10:12           ` Russell King - ARM Linux
@ 2015-09-15 11:01             ` Krzysztof Hałasa
  2015-09-15 14:29               ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-15 11:01 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

>> 1024 x 768 for now. I noticed a strange thing: XvShmPutImage() usually
>> takes (much) less than 4 milliseconds, but every 315 frames, it takes
>> much longer (when started, it takes 1259 frames). The following is with
>> constant image, i.e., not altered between frames. Source attached (one
>> may need to change xv_port variable).
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

> 1. Don't hard code the Xv port ID (worth mentioning somewhere so people
>    testing it don't spend something like a quarter of an hour trying to
>    debug why it doesn't work.)

Well, I actually mentioned it.


So this means the delay was only "grouped" by the X protocol, and it
won't be magically faster.

> Now, running on Dove overlay, I see about 17ms being the average time,
> which is slightly longer than the vsync.

> Let's not forget that Dove hardware is slower than iMX6, so I think that
> iMX6 should manage to comfortably achieve the 16.6ms required for
> frame-by-frame display from your program.

Interestingly, i.MX6 seems to achive about 3.2 ms, which is much faster.
If not for the missing color planes (and scaling), it would be perfect.
(and I only need 30 FPS).

> Now, as for using the GPU, X server analysis:
> - Again about 1ms between select() and read() of the event
> - 1ms to the first WAIT_VBLANK ioctl on the display adapter to read the
>   last VSYNC time
> - 200us later to map the user pointer
> - 300us to the WAIT_VBLANK ioctl to wait for the vblank (which takes in this
>   instance 3.5ms to fire)
> - 130us to first attempt to submit the GPU queue, which returns -EAGAIN
>   after 6.4ms
> - second attempt takes 9.5ms to complete successfully
> - 1ms (with intervening SIGALRM handler) to wait for the GPU to finish,
>   which takes 11.5ms
> - 450us to ask DRM to release the user pointer buffer, which takes 9.4ms
> - 1ms (with intervening SIGALRM handler) to report completion of the operation
> - The X server then takes about 4ms to get back to calling select().

Sure, I know it has to be slower.

So this takes (on Dove) about 50 ms (at 1024x768), thus is way too slow
to display video at this (or higher) resolution and frame rate.
On i.MX6q, it takes about 66 - 74 ms, depending on actual clock speed
(frequency scaling, up to 1 GHz).

Thanks for testing.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-15 11:01             ` Krzysztof Hałasa
@ 2015-09-15 14:29               ` Russell King - ARM Linux
  2015-09-15 16:53                 ` Krzysztof Hałasa
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-15 14:29 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 15, 2015 at 01:01:25PM +0200, Krzysztof Ha?asa wrote:
> Russell King - ARM Linux <linux@arm.linux.org.uk> writes:
> > Let's not forget that Dove hardware is slower than iMX6, so I think that
> > iMX6 should manage to comfortably achieve the 16.6ms required for
> > frame-by-frame display from your program.
> 
> Interestingly, i.MX6 seems to achive about 3.2 ms, which is much faster.
> If not for the missing color planes (and scaling), it would be perfect.
> (and I only need 30 FPS).

That means iMX6 isn't synchronising to the vertical sync, so would be
subject to tearing.

> 
> > Now, as for using the GPU, X server analysis:
> > - Again about 1ms between select() and read() of the event
> > - 1ms to the first WAIT_VBLANK ioctl on the display adapter to read the
> >   last VSYNC time
> > - 200us later to map the user pointer
> > - 300us to the WAIT_VBLANK ioctl to wait for the vblank (which takes in this
> >   instance 3.5ms to fire)
> > - 130us to first attempt to submit the GPU queue, which returns -EAGAIN
> >   after 6.4ms
> > - second attempt takes 9.5ms to complete successfully
> > - 1ms (with intervening SIGALRM handler) to wait for the GPU to finish,
> >   which takes 11.5ms
> > - 450us to ask DRM to release the user pointer buffer, which takes 9.4ms
> > - 1ms (with intervening SIGALRM handler) to report completion of the operation
> > - The X server then takes about 4ms to get back to calling select().
> 
> Sure, I know it has to be slower.
> 
> So this takes (on Dove) about 50 ms (at 1024x768), thus is way too slow
> to display video at this (or higher) resolution and frame rate.
> On i.MX6q, it takes about 66 - 74 ms, depending on actual clock speed
> (frequency scaling, up to 1 GHz).

It's interesting that iMX6 takes longer - without analysing what's going
on, I'd guess that will be because the GC320's memory bandwidth is
throttled compared to Dove.

iMX6 seems to have a problem with the bus arbitration in that each master
which can access DDR is given a fixed timeslot, whether or not there are
any other masters wanting access.  Performance measurement with 64-bit
DDR has shown that out of iMX6Q,D,DL,S the iMX6DL performs the best for
raw IO as there are fewer masters (fewer CPUs and fewer peripherals
wanting DDR access), so the timeslots are bigger.

I've found that it is very difficult to get iMX6's GPUs to out-perform
neon optimised libpixman in terms of performance measurements - and I
think the reason for this is because both Neon optimised libpixman and
the GPUs are running up against the same bottleneck - the available
DDR bandwidth.  However, what you do get is CPU offload of that effort
- filling one of those non-CPU DDR access timeslots with useful work,
freeing up the CPU DDR timeslot to do other tasks.

I have no idea how much truth there is to this, this is all based upon
performance measurement, and drawing conclusions from those measurements.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-14  8:39       ` Krzysztof Hałasa
  2015-09-15  8:24         ` Krzysztof Hałasa
@ 2015-09-15 15:53         ` Lucas Stach
  2015-09-15 16:36           ` Russell King - ARM Linux
                             ` (2 more replies)
  1 sibling, 3 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-15 15:53 UTC (permalink / raw)
  To: linux-arm-kernel

Am Montag, den 14.09.2015, 10:39 +0200 schrieb Krzysztof Ha?asa:
> Another round of tests, I noticed the new git versions :-)
> Testing Linux v4.2 + PLL5 DTS patch (for HDMI output with enabled
> LVDS).
> Using mplayer with YUV420 (DRM Xvideo would probably work with packed
> UYVY-alike formats but I need YUV420 because H.264 decoder produces
> it).
> The driver is git://ftp.arm.linux.org.uk/~rmk/xf86-video-armada.git,
> branch unstable-devel, and it uses
> git://ftp.arm.linux.org.uk/~rmk/libdrm-armada.git/.
> 
> 	IMX DRM Xvideo output:
> 
> Only unscaled video: no color (luminance is good but the color
> components are green). The driver doesn't use color information.
> I hope this is easily fixable.
> 
There were patches for that some weeks ago already, I would hope they
got applied to some tree destinied for upstream. Will look at that and
ping people if necessary.

> 
> 	rmk/drm-etnaviv-devel:
> 
> With unscaled video, the only visible problem is tearing in the
> middle
> of the screen (unability to sync with screen refresh).
> 
> With scaling, I'm getting horizontal lines (mostly visible when the
> scene changes) and some sort of stalls - sometimes two frames are
> alternating for few seconds then it goes forward.
> 
> 
> 	pengutronix/etnaviv-for-upstream:
That is the right branch, containing the changes I sent out for review.

It includes a new kernel<->userspace interface, so needs a modified
xf86-video-armada to go with it. You can pick that up here:
git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk

Caution: the armada code is WIP and needs further cleanups. It should
work though.

> No etnaviv Xvideo:
> (==) armada(0): Backing store enabled
> (==) armada(0): Silken mouse enabled
> (EE) armada(0): etnaviv: unable to open: Not a directory
> (WW) armada(0): [drm] Vivante initialization failed, running
> unaccelerated
> 
> I assume I need a newer something.
> 
> 
> 	pengutronix/v4.2/topic/etnaviv-for-rmk:

Please don't use that branch. It just there to keep stability for
people that already know about it.

Regards,
Lucas

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

* I.MX6 HDMI support in v4.2
  2015-09-15 15:53         ` Lucas Stach
@ 2015-09-15 16:36           ` Russell King - ARM Linux
  2015-09-15 16:53             ` Lucas Stach
  2015-09-15 16:57           ` I.MX6 HDMI support in v4.2 Krzysztof Hałasa
  2015-09-16  7:57           ` Krzysztof Hałasa
  2 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-15 16:36 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 15, 2015 at 05:53:45PM +0200, Lucas Stach wrote:
> It includes a new kernel<->userspace interface, so needs a modified
> xf86-video-armada to go with it. You can pick that up here:
> git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk
> 
> Caution: the armada code is WIP and needs further cleanups. It should
> work though.

And it needs updating to the latest version - you seem to be missing
a whole load of changes, including the changes which update the
kernel API.

So... you seem to be talking about the kernel API having changed from
the version which you picked up years ago, rather than the current
version.  It's really unclear what you're talking about.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-15 14:29               ` Russell King - ARM Linux
@ 2015-09-15 16:53                 ` Krzysztof Hałasa
  0 siblings, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-15 16:53 UTC (permalink / raw)
  To: linux-arm-kernel

Russell King - ARM Linux <linux@arm.linux.org.uk> writes:

>> Interestingly, i.MX6 seems to achive about 3.2 ms, which is much faster.
>> If not for the missing color planes (and scaling), it would be perfect.
>> (and I only need 30 FPS).
>
> That means iMX6 isn't synchronising to the vertical sync, so would be
> subject to tearing.

Right. However the bigger problem ATM is the lack of color, or actually
wrong colors (such as solid green or magenta etc). I'm looking if the
support can be added easily, this whole IPU stuff is a bit complicated.

> It's interesting that iMX6 takes longer - without analysing what's going
> on, I'd guess that will be because the GC320's memory bandwidth is
> throttled compared to Dove.

Well, one would think the bandwidths should be an order of magnitude
larger than needed here. The boards I have here (Ventana GW5xxx) are
using e.g. 4 * MT41K128M16JT-125 DDR3 chips, for a total of (if
configured correctly) 12 GB/s. Now, a single burst read (or write) at
1024x768 32 bit requires 3 MB, for 30 FPS it means 90 MB/s.
I realize the buffers may be copied many times, and the timeslots you
describe don't make it easier. 66 ms for a frame is rather long, though.

I guess, in this case, it would be better to convert YUV420 planar ->
YUV422 packed (perhaps with NEON - the packed mode(s) work correctly),
and use the more traditional overlay instead of the textured adapter.
Or maybe I will make this YUV420 mode work.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-15 16:36           ` Russell King - ARM Linux
@ 2015-09-15 16:53             ` Lucas Stach
  2015-09-15 17:04               ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas Stach @ 2015-09-15 16:53 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Russell,

Am Dienstag, den 15.09.2015, 17:36 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 15, 2015 at 05:53:45PM +0200, Lucas Stach wrote:
> > It includes a new kernel<->userspace interface, so needs a modified
> > xf86-video-armada to go with it. You can pick that up here:
> > git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk
> > 
> > Caution: the armada code is WIP and needs further cleanups. It
> > should
> > work though.
> 
> And it needs updating to the latest version - you seem to be missing
> a whole load of changes, including the changes which update the
> kernel API.
> 
> So... you seem to be talking about the kernel API having changed from
> the version which you picked up years ago, rather than the current
> version.  It's really unclear what you're talking about.
> 
What do you mean with missing a lot of stuff? The "for-rmk" branch in
that repo is your upstream "unstable-devel" branch minus the few XvBO
commits with my changes on top.

Regards,
Lucas

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

* I.MX6 HDMI support in v4.2
  2015-09-15 15:53         ` Lucas Stach
  2015-09-15 16:36           ` Russell King - ARM Linux
@ 2015-09-15 16:57           ` Krzysztof Hałasa
  2015-09-16  7:57           ` Krzysztof Hałasa
  2 siblings, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-15 16:57 UTC (permalink / raw)
  To: linux-arm-kernel

Lucas Stach <l.stach@pengutronix.de> writes:

>> Only unscaled video: no color (luminance is good but the color
>> components are green). The driver doesn't use color information.
>> I hope this is easily fixable.

> There were patches for that some weeks ago already, I would hope they
> got applied to some tree destinied for upstream. Will look at that and
> ping people if necessary.

Good, this probably resolves one of main problems.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-15 16:53             ` Lucas Stach
@ 2015-09-15 17:04               ` Russell King - ARM Linux
  2015-09-15 19:01                 ` Lucas Stach
  2015-09-28 14:48                 ` xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2) Lucas Stach
  0 siblings, 2 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-15 17:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 15, 2015 at 12:53:54PM -0400, Lucas Stach wrote:
> Hi Russell,
> 
> Am Dienstag, den 15.09.2015, 17:36 +0100 schrieb Russell King - ARM
> Linux:
> > On Tue, Sep 15, 2015 at 05:53:45PM +0200, Lucas Stach wrote:
> > > It includes a new kernel<->userspace interface, so needs a modified
> > > xf86-video-armada to go with it. You can pick that up here:
> > > git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk
> > > 
> > > Caution: the armada code is WIP and needs further cleanups. It
> > > should
> > > work though.
> > 
> > And it needs updating to the latest version - you seem to be missing
> > a whole load of changes, including the changes which update the
> > kernel API.
> > 
> > So... you seem to be talking about the kernel API having changed from
> > the version which you picked up years ago, rather than the current
> > version.  It's really unclear what you're talking about.
> > 
> What do you mean with missing a lot of stuff? The "for-rmk" branch in
> that repo is your upstream "unstable-devel" branch minus the few XvBO
> commits with my changes on top.

Ah, probably because I haven't pushed the stuff out :)

Anyway, I've taken two of your patches, reworking the second slightly:

1fec728 etnaviv: fix compilation without DRI2 support
1663382 make sure that system strndup doesn't collide with X.Org server version

which are _both_ fixes, and would have been nice for them to have been
sent in a timely manner.

Looking at "etnaviv: fix XV resize for UYVY source format", this is wrong
to the documentation for the GC320.  Documentation which was around for
the GC320 indicates that the _only_ YUV format it supports as a target
is YUY2 with the vertical filter blit.  It's very specifically worded to
indicate that this is the only YUV target format which is supported.
What testing have you done to prove uyvy support, and on which GPUs?

"etnaviv: align vximage buffer size to pagesize" I have issues with as
well - mapping more memory than was passed to the X server is really not
permissible.  If we need the image size to be larger, we need to report
a larger buffer size - and in fact, that's already done.
QueryImageAttributes indicates that the image size is to be rounded
up to a page size.  The X server will reject smaller buffers at higher
levels.  So, this patch isn't required.

The last patch is your final one, I'll look at that at some point,
but for now I'm pushing out the tree as it now stands.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* I.MX6 HDMI support in v4.2
  2015-09-15 17:04               ` Russell King - ARM Linux
@ 2015-09-15 19:01                 ` Lucas Stach
  2015-09-28 14:48                 ` xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2) Lucas Stach
  1 sibling, 0 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-15 19:01 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 15.09.2015, 18:04 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 15, 2015 at 12:53:54PM -0400, Lucas Stach wrote:
> > Hi Russell,
> > 
> > Am Dienstag, den 15.09.2015, 17:36 +0100 schrieb Russell King - ARM
> > Linux:
> > > On Tue, Sep 15, 2015 at 05:53:45PM +0200, Lucas Stach wrote:
> > > > It includes a new kernel<->userspace interface, so needs a
> > > > modified
> > > > xf86-video-armada to go with it. You can pick that up here:
> > > > git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk
> > > > 
> > > > Caution: the armada code is WIP and needs further cleanups. It
> > > > should
> > > > work though.
> > > 
> > > And it needs updating to the latest version - you seem to be
> > > missing
> > > a whole load of changes, including the changes which update the
> > > kernel API.
> > > 
> > > So... you seem to be talking about the kernel API having changed
> > > from
> > > the version which you picked up years ago, rather than the
> > > current
> > > version.  It's really unclear what you're talking about.
> > > 
> > What do you mean with missing a lot of stuff? The "for-rmk" branch
> > in
> > that repo is your upstream "unstable-devel" branch minus the few
> > XvBO
> > commits with my changes on top.
> 
> Ah, probably because I haven't pushed the stuff out :)
> 
> Anyway, I've taken two of your patches, reworking the second
> slightly:
> 
> 1fec728 etnaviv: fix compilation without DRI2 support
> 1663382 make sure that system strndup doesn't collide with X.Org
> server version
> 
> which are _both_ fixes, and would have been nice for them to have
> been
> sent in a timely manner.
> 
Sorry about that. I'll try to single out the fixes more quickly going
forward.

> Looking at "etnaviv: fix XV resize for UYVY source format", this is
> wrong
> to the documentation for the GC320.  Documentation which was around
> for
> the GC320 indicates that the _only_ YUV format it supports as a
> target
> is YUY2 with the vertical filter blit.  It's very specifically worded
> to
> indicate that this is the only YUV target format which is supported.
> What testing have you done to prove uyvy support, and on which GPUs?
> 
I've tested this on i.MX6Q hardware with some GStreamer pipelines using
the videotestsrc. Without this commit the GPU will write out only zerosin the first step, so the video image will show up as fully green after CSC.

I don't think I have that documentation you are talking about. Is this
doc under NDA?

Chapter "31.4.1.6 Filter BLT" of the i.MX6 RM seems to agree with you,
so this commit depends on unspecified behavior. But it fixes a real bug
where the GPU writes out only zeros to the intermediate buffer if the
source is UYVY, so videos show up as fully green after CSC. So this
needs more investigation.

> "etnaviv: align vximage buffer size to pagesize" I have issues with
> as
> well - mapping more memory than was passed to the X server is really
> not
> permissible.  If we need the image size to be larger, we need to
> report
> a larger buffer size - and in fact, that's already done.
> QueryImageAttributes indicates that the image size is to be rounded
> up to a page size.  The X server will reject smaller buffers at
> higher
> levels.  So, this patch isn't required.
> 
This does not seem to be be working. I've certainly seen GStreamer
pushing non-aligned buffers which cause the GEM import to fail.
Ignoring the real size may well be a GStreamer bug (I'll look into that
code), but the server doesn't seem to reject that.

> The last patch is your final one, I'll look at that at some point,
> but for now I'm pushing out the tree as it now stands.
> 
If you're not going to look at this too soonish I can rebase that on
top of what you just pushed out and mybe clean it up some more. But
certainly not this week, as I'm physically away from any test hardware.

Regards,
Lucas

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

* I.MX6 HDMI support in v4.2
  2015-09-15 15:53         ` Lucas Stach
  2015-09-15 16:36           ` Russell King - ARM Linux
  2015-09-15 16:57           ` I.MX6 HDMI support in v4.2 Krzysztof Hałasa
@ 2015-09-16  7:57           ` Krzysztof Hałasa
  2015-09-16 15:52             ` Lucas Stach
  2 siblings, 1 reply; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-16  7:57 UTC (permalink / raw)
  To: linux-arm-kernel

Lucas Stach <l.stach@pengutronix.de> writes:

>> 	IMX DRM Xvideo output:
>> 
>> Only unscaled video: no color (luminance is good but the color
>> components are green). The driver doesn't use color information.
>> I hope this is easily fixable.
>> 
> There were patches for that some weeks ago already, I would hope they
> got applied to some tree destinied for upstream. Will look at that and
> ping people if necessary.

BTW: any pointer to the patches?
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-16  7:57           ` Krzysztof Hałasa
@ 2015-09-16 15:52             ` Lucas Stach
  0 siblings, 0 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-16 15:52 UTC (permalink / raw)
  To: linux-arm-kernel

Am Mittwoch, den 16.09.2015, 09:57 +0200 schrieb Krzysztof Ha?asa:
> Lucas Stach <l.stach@pengutronix.de> writes:
> 
> > > 	IMX DRM Xvideo output:
> > > 
> > > Only unscaled video: no color (luminance is good but the color
> > > components are green). The driver doesn't use color information.
> > > I hope this is easily fixable.
> > > 
> > There were patches for that some weeks ago already, I would hope
> > they
> > got applied to some tree destinied for upstream. Will look at that
> > and
> > ping people if necessary.
> 
> BTW: any pointer to the patches?

I just digged a bit and it seems they didn't make it out. I've pinged
Philipp about that.

Regards,
Lucas

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

* I.MX6 HDMI support in v4.2
  2015-09-10 10:49             ` Russell King - ARM Linux
  2015-09-10 11:29               ` Krzysztof Hałasa
@ 2015-09-17  7:21               ` Philipp Zabel
  2015-09-17  8:38                 ` Krzysztof Hałasa
  2015-09-17  9:23                 ` Russell King - ARM Linux
  1 sibling, 2 replies; 47+ messages in thread
From: Philipp Zabel @ 2015-09-17  7:21 UTC (permalink / raw)
  To: linux-arm-kernel

Am Donnerstag, den 10.09.2015, 11:49 +0100 schrieb Russell King - ARM
Linux:
> On Thu, Sep 10, 2015 at 12:25:32PM +0200, Krzysztof Ha?asa wrote:
> > The Y plane is ok, but the Xv window is green, like on old monochrome
> > CRTs - what could that be? It looks like the UV planes are all wrong.
> 
> From a quick read of the imx-drm ipuv3-plane code, it looks like it
> doesn't bother with the U/V planes for planar images.  Nothing looks
> at fb->offsets[1,2] nor fb->pitches[1,2].  However, it claims to
> support DRM_FORMAT_YUV420 and DRM_FORMAT_YVU420 formats - which is
> wrong if it doesn't look at these other offsets and pitches.

The IDMAC has a few funny restrictions for multiplanar formats, and the
current code silently assumes that the U and V planes follow right after
Y.

I have a patch to enforce the same base address:
http://lists.freedesktop.org/archives/dri-devel/2015-August/089293.html
but it still doesn't check the offset/pitch limitations properly.

best regards
Philipp

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

* I.MX6 HDMI support in v4.2
  2015-09-17  7:21               ` Philipp Zabel
@ 2015-09-17  8:38                 ` Krzysztof Hałasa
  2015-09-17  9:23                 ` Russell King - ARM Linux
  1 sibling, 0 replies; 47+ messages in thread
From: Krzysztof Hałasa @ 2015-09-17  8:38 UTC (permalink / raw)
  To: linux-arm-kernel

Philipp Zabel <p.zabel@pengutronix.de> writes:

> The IDMAC has a few funny restrictions for multiplanar formats, and the
> current code silently assumes that the U and V planes follow right after
> Y.
>
> I have a patch to enforce the same base address:
> http://lists.freedesktop.org/archives/dri-devel/2015-August/089293.html
> but it still doesn't check the offset/pitch limitations properly.

Do you mean the current code as in e.g. v4.2?
I'm passing it (the i.MX6 IMX DRM overlay) a 1024x768 buffer:

ipu_plane_mode_set pitches 1024 512 512 0 offsets 0 786432 983040 0

so the U and V planes closely follow Y, and it doesn't work. The screen
is green to magenta, sometimes there are diagonal stripes (color only,
Y is fine).

Also, e.g. mplayer shows a greenish output.

I've posted a short test program:
http://lists.infradead.org/pipermail/linux-arm-kernel/2015-September/369988.html

You will need to set xv_port = 0 (it will then use the first
YUV420-capable adapter, which on my system is IMX DRM overlay) and you
may want to stick "XSync(display, 0);" after the XvShmPutImage() call.

Also, you may change the "memset(image->data, count, image->data_size)"
into something smaller, e.g. to a subset of Y plane, leaving UV alone.
For example:
	memset(image->data, count % 0x100, 12345);
	memset(image->data + image->pitches[0] * h, 0, (image->pitches[1] + image->pitches[2]) * h / 2);

will set the first 12345 bytes of Y plane, while the U and V will be
zero.

Thanks for looking into this.
-- 
Krzysztof Halasa

Industrial Research Institute for Automation and Measurements PIAP
Al. Jerozolimskie 202, 02-486 Warsaw, Poland

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

* I.MX6 HDMI support in v4.2
  2015-09-17  7:21               ` Philipp Zabel
  2015-09-17  8:38                 ` Krzysztof Hałasa
@ 2015-09-17  9:23                 ` Russell King - ARM Linux
  1 sibling, 0 replies; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-17  9:23 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Sep 17, 2015 at 09:21:56AM +0200, Philipp Zabel wrote:
> Am Donnerstag, den 10.09.2015, 11:49 +0100 schrieb Russell King - ARM
> Linux:
> > On Thu, Sep 10, 2015 at 12:25:32PM +0200, Krzysztof Ha?asa wrote:
> > > The Y plane is ok, but the Xv window is green, like on old monochrome
> > > CRTs - what could that be? It looks like the UV planes are all wrong.
> > 
> > From a quick read of the imx-drm ipuv3-plane code, it looks like it
> > doesn't bother with the U/V planes for planar images.  Nothing looks
> > at fb->offsets[1,2] nor fb->pitches[1,2].  However, it claims to
> > support DRM_FORMAT_YUV420 and DRM_FORMAT_YVU420 formats - which is
> > wrong if it doesn't look at these other offsets and pitches.
> 
> The IDMAC has a few funny restrictions for multiplanar formats, and the
> current code silently assumes that the U and V planes follow right after
> Y.
> 
> I have a patch to enforce the same base address:
> http://lists.freedesktop.org/archives/dri-devel/2015-August/089293.html
> but it still doesn't check the offset/pitch limitations properly.

	int planes = drm_format_num_planes(fb->pixel_format);
	dma_addr_t base, end;

	for (i = 0; i < planes; i++) {
		cma_obj[i] = drm_fb_cma_get_gem_obj(fb, i);
		if (!cma_obj[i]) {
			DRM_DEBUG_KMS("plane %d entry is null.\n", i);
			return -EINVAL;
		}
	}

EFAULT is not appropriate there - EFAULT means "userspace passed a bad
address into kernel space".  That's not what you're trying to convey
there, so EINVAL or some other error code more suited to the error
condition would be more appropriate.

	base = cma_obj[0]->paddr + fb->offsets[0];
	end = base + fb->pitches[0] * fb->height;
	eba = base + fb->pitches[0] * y + (fb->bits_per_pixel >> 3) * x;

	for (i = 1; i < planes; i++) {
		dma_addr_t this_base;

		if (y || x) {
			DRM_DEBUG_KMS("can't support planar with offset\n");
			return -EINVAL;
		}

		this_base = cma_obj[i]->paddr + fb->offsets[i];
		if (this_base != end) {
			DRM_DEBUG_KMS("plane does follow previous.\n");
			return -EINVAL;
		}

		end += fb->pitches[i] * fb->height;
	}

should do the trick.  Note that if x or y is non-zero, it's specifying
an offset into the image, which means that there _will_ be a gap
between the planes (consisting of the undisplayed portion of the plane.)
As you said they need to be contiguous, they aren't contiguous in this
situation, so we have to error that out if there's more than one plane.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-15 17:04               ` Russell King - ARM Linux
  2015-09-15 19:01                 ` Lucas Stach
@ 2015-09-28 14:48                 ` Lucas Stach
  2015-09-28 15:24                   ` Russell King - ARM Linux
  1 sibling, 1 reply; 47+ messages in thread
From: Lucas Stach @ 2015-09-28 14:48 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 15.09.2015, 18:04 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 15, 2015 at 12:53:54PM -0400, Lucas Stach wrote:
> > Hi Russell,
> > 
> > Am Dienstag, den 15.09.2015, 17:36 +0100 schrieb Russell King - ARM
> > Linux:
> > > On Tue, Sep 15, 2015 at 05:53:45PM +0200, Lucas Stach wrote:
> > > > It includes a new kernel<->userspace interface, so needs a modified
> > > > xf86-video-armada to go with it. You can pick that up here:
> > > > git://git.pengutronix.de/git/lst/xf86-video-armada.git for-rmk
> > > > 
> > > > Caution: the armada code is WIP and needs further cleanups. It
> > > > should
> > > > work though.
> > > 
> > > And it needs updating to the latest version - you seem to be missing
> > > a whole load of changes, including the changes which update the
> > > kernel API.
> > > 
> > > So... you seem to be talking about the kernel API having changed from
> > > the version which you picked up years ago, rather than the current
> > > version.  It's really unclear what you're talking about.
> > > 
> > What do you mean with missing a lot of stuff? The "for-rmk" branch in
> > that repo is your upstream "unstable-devel" branch minus the few XvBO
> > commits with my changes on top.
> 
> Ah, probably because I haven't pushed the stuff out :)
> 
> Anyway, I've taken two of your patches, reworking the second slightly:
> 
> 1fec728 etnaviv: fix compilation without DRI2 support
> 1663382 make sure that system strndup doesn't collide with X.Org server version
> 
> which are _both_ fixes, and would have been nice for them to have been
> sent in a timely manner.
> 
> Looking at "etnaviv: fix XV resize for UYVY source format", this is wrong
> to the documentation for the GC320.  Documentation which was around for
> the GC320 indicates that the _only_ YUV format it supports as a target
> is YUY2 with the vertical filter blit.  It's very specifically worded to
> indicate that this is the only YUV target format which is supported.
> What testing have you done to prove uyvy support, and on which GPUs?
> 
> "etnaviv: align vximage buffer size to pagesize" I have issues with as
> well - mapping more memory than was passed to the X server is really not
> permissible.  If we need the image size to be larger, we need to report
> a larger buffer size - and in fact, that's already done.
> QueryImageAttributes indicates that the image size is to be rounded
> up to a page size.  The X server will reject smaller buffers at higher
> levels.  So, this patch isn't required.
> 
I've looked at that again and the issue here seems to be that GStreamer
is handing us a pointer to a buffer that isn't aligned to a page. The
buffers size is properly rounded up to a pagesize, as requested by
QueryImageAttributes, but if the buffer start pointer isn't aligned to a
page boundary we end up with an non-mappable buffer anyway.

Unfortunately there is no obvious way for a driver to request a minimum
alignment for the buffer. The only possible fix is for the client to
always align the buffer to a page boundary in hopes that this is enough
for the hardware to map it directly and allow to skip any unwanted
copying.

Regards,
Lucas

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-28 14:48                 ` xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2) Lucas Stach
@ 2015-09-28 15:24                   ` Russell King - ARM Linux
  2015-09-28 15:40                     ` Lucas Stach
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-28 15:24 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 28, 2015 at 04:48:08PM +0200, Lucas Stach wrote:
> I've looked at that again and the issue here seems to be that GStreamer
> is handing us a pointer to a buffer that isn't aligned to a page. The
> buffers size is properly rounded up to a pagesize, as requested by
> QueryImageAttributes, but if the buffer start pointer isn't aligned to a
> page boundary we end up with an non-mappable buffer anyway.
> 
> Unfortunately there is no obvious way for a driver to request a minimum
> alignment for the buffer. The only possible fix is for the client to
> always align the buffer to a page boundary in hopes that this is enough
> for the hardware to map it directly and allow to skip any unwanted
> copying.

We can't just "round up" the size.  We've no idea whether the buffer
came from shmem (for XvShmPutImage), or whether it's part of an internal
X buffer (for XvPutImage).  In the latter case, we've no idea whether
data in the remainder of the page will be read or written by the CPU
when, eg, a signal occurs - and X does use signals.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-28 15:24                   ` Russell King - ARM Linux
@ 2015-09-28 15:40                     ` Lucas Stach
  2015-09-28 16:50                       ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas Stach @ 2015-09-28 15:40 UTC (permalink / raw)
  To: linux-arm-kernel

Am Montag, den 28.09.2015, 16:24 +0100 schrieb Russell King - ARM Linux:
> On Mon, Sep 28, 2015 at 04:48:08PM +0200, Lucas Stach wrote:
> > I've looked at that again and the issue here seems to be that GStreamer
> > is handing us a pointer to a buffer that isn't aligned to a page. The
> > buffers size is properly rounded up to a pagesize, as requested by
> > QueryImageAttributes, but if the buffer start pointer isn't aligned to a
> > page boundary we end up with an non-mappable buffer anyway.
> > 
> > Unfortunately there is no obvious way for a driver to request a minimum
> > alignment for the buffer. The only possible fix is for the client to
> > always align the buffer to a page boundary in hopes that this is enough
> > for the hardware to map it directly and allow to skip any unwanted
> > copying.
> 
> We can't just "round up" the size.  We've no idea whether the buffer
> came from shmem (for XvShmPutImage), or whether it's part of an internal
> X buffer (for XvPutImage).  In the latter case, we've no idea whether
> data in the remainder of the page will be read or written by the CPU
> when, eg, a signal occurs - and X does use signals.
> 
I'm not talking about the driver rounding up the size. That is obviously
(contrary to what my patch did) the wrong thing to do.

I was talking of the client (as in VLC, GStreamer, whatever) aligning
the buffer to a page boundary. As there is no way for the client to
query the alignment restrictions, we may still need a fallback path in
the driver, so that if an unaligned buffer comes in we don't do a
buffer_from_userptr but actually copy client memory to a new buffer.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-28 15:40                     ` Lucas Stach
@ 2015-09-28 16:50                       ` Russell King - ARM Linux
  2015-09-29  8:28                         ` Lucas Stach
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-28 16:50 UTC (permalink / raw)
  To: linux-arm-kernel

On Mon, Sep 28, 2015 at 05:40:13PM +0200, Lucas Stach wrote:
> Am Montag, den 28.09.2015, 16:24 +0100 schrieb Russell King - ARM Linux:
> > On Mon, Sep 28, 2015 at 04:48:08PM +0200, Lucas Stach wrote:
> > > I've looked at that again and the issue here seems to be that GStreamer
> > > is handing us a pointer to a buffer that isn't aligned to a page. The
> > > buffers size is properly rounded up to a pagesize, as requested by
> > > QueryImageAttributes, but if the buffer start pointer isn't aligned to a
> > > page boundary we end up with an non-mappable buffer anyway.
> > > 
> > > Unfortunately there is no obvious way for a driver to request a minimum
> > > alignment for the buffer. The only possible fix is for the client to
> > > always align the buffer to a page boundary in hopes that this is enough
> > > for the hardware to map it directly and allow to skip any unwanted
> > > copying.
> > 
> > We can't just "round up" the size.  We've no idea whether the buffer
> > came from shmem (for XvShmPutImage), or whether it's part of an internal
> > X buffer (for XvPutImage).  In the latter case, we've no idea whether
> > data in the remainder of the page will be read or written by the CPU
> > when, eg, a signal occurs - and X does use signals.
> > 
> I'm not talking about the driver rounding up the size. That is obviously
> (contrary to what my patch did) the wrong thing to do.
> 
> I was talking of the client (as in VLC, GStreamer, whatever) aligning
> the buffer to a page boundary. As there is no way for the client to
> query the alignment restrictions, we may still need a fallback path in
> the driver, so that if an unaligned buffer comes in we don't do a
> buffer_from_userptr but actually copy client memory to a new buffer.

You really do _not_ want to do be copying image data.  With large images
(1080p) that will consume lots of CPU, and tie up the X server doing not
much other than copying data.  You might as well manually convert and
copy the data to the screen at that point.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-28 16:50                       ` Russell King - ARM Linux
@ 2015-09-29  8:28                         ` Lucas Stach
  2015-09-29  8:41                           ` Russell King - ARM Linux
  0 siblings, 1 reply; 47+ messages in thread
From: Lucas Stach @ 2015-09-29  8:28 UTC (permalink / raw)
  To: linux-arm-kernel

Am Montag, den 28.09.2015, 17:50 +0100 schrieb Russell King - ARM Linux:
> On Mon, Sep 28, 2015 at 05:40:13PM +0200, Lucas Stach wrote:
> > Am Montag, den 28.09.2015, 16:24 +0100 schrieb Russell King - ARM Linux:
> > > On Mon, Sep 28, 2015 at 04:48:08PM +0200, Lucas Stach wrote:
> > > > I've looked at that again and the issue here seems to be that GStreamer
> > > > is handing us a pointer to a buffer that isn't aligned to a page. The
> > > > buffers size is properly rounded up to a pagesize, as requested by
> > > > QueryImageAttributes, but if the buffer start pointer isn't aligned to a
> > > > page boundary we end up with an non-mappable buffer anyway.
> > > > 
> > > > Unfortunately there is no obvious way for a driver to request a minimum
> > > > alignment for the buffer. The only possible fix is for the client to
> > > > always align the buffer to a page boundary in hopes that this is enough
> > > > for the hardware to map it directly and allow to skip any unwanted
> > > > copying.
> > > 
> > > We can't just "round up" the size.  We've no idea whether the buffer
> > > came from shmem (for XvShmPutImage), or whether it's part of an internal
> > > X buffer (for XvPutImage).  In the latter case, we've no idea whether
> > > data in the remainder of the page will be read or written by the CPU
> > > when, eg, a signal occurs - and X does use signals.
> > > 
> > I'm not talking about the driver rounding up the size. That is obviously
> > (contrary to what my patch did) the wrong thing to do.
> > 
> > I was talking of the client (as in VLC, GStreamer, whatever) aligning
> > the buffer to a page boundary. As there is no way for the client to
> > query the alignment restrictions, we may still need a fallback path in
> > the driver, so that if an unaligned buffer comes in we don't do a
> > buffer_from_userptr but actually copy client memory to a new buffer.
> 
> You really do _not_ want to do be copying image data.  With large images
> (1080p) that will consume lots of CPU, and tie up the X server doing not
> much other than copying data.  You might as well manually convert and
> copy the data to the screen at that point.
> 
So what other possibilities do we have if the client hands us a non page
aligned buffer, other than failing the PutImage? Converting the image
manually and possibly doubling the amount of bytes to write out
(YUV->RGB) will tie up the X server even longer.

This all doesn't seem to be a problem as long as the client allocates
from XShm, as this seems to hand out page aligned memory. Only if the
client mallocs the image buffer we might end up with unaligned buffers.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-29  8:28                         ` Lucas Stach
@ 2015-09-29  8:41                           ` Russell King - ARM Linux
  2015-09-29  9:01                             ` Lucas Stach
  0 siblings, 1 reply; 47+ messages in thread
From: Russell King - ARM Linux @ 2015-09-29  8:41 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Sep 29, 2015 at 10:28:19AM +0200, Lucas Stach wrote:
> Am Montag, den 28.09.2015, 17:50 +0100 schrieb Russell King - ARM Linux:
> > You really do _not_ want to do be copying image data.  With large images
> > (1080p) that will consume lots of CPU, and tie up the X server doing not
> > much other than copying data.  You might as well manually convert and
> > copy the data to the screen at that point.
> > 
> So what other possibilities do we have if the client hands us a non page
> aligned buffer, other than failing the PutImage? Converting the image
> manually and possibly doubling the amount of bytes to write out
> (YUV->RGB) will tie up the X server even longer.

Are you sure about that?

If you memcpy() the buffer, you have to read about 6MB of data, write
6MB of data, flush the caches of that, then ask the GPU to perform two
blits (which on my measurements just about fit in one field scan), wait
for the blit to finish before then returning to the client.

I can tell you that VLC uses memcpy() on images internally, and you can't
get away with it for 1080p video.

> This all doesn't seem to be a problem as long as the client allocates
> from XShm, as this seems to hand out page aligned memory. Only if the
> client mallocs the image buffer we might end up with unaligned buffers.

I don't see that.  How does a malloc()'d buffer get to the X server,
other than throuh XvPutImage?  If you're using XvPutImage(), you'll
be incurring an even _larger_ overhead because the kernel will have
to copy the image data as well.  AFAIK, you can't pass arbitary malloc()d
buffers to sysvipc and therefore via XShm.

-- 
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2)
  2015-09-29  8:41                           ` Russell King - ARM Linux
@ 2015-09-29  9:01                             ` Lucas Stach
  0 siblings, 0 replies; 47+ messages in thread
From: Lucas Stach @ 2015-09-29  9:01 UTC (permalink / raw)
  To: linux-arm-kernel

Am Dienstag, den 29.09.2015, 09:41 +0100 schrieb Russell King - ARM
Linux:
> On Tue, Sep 29, 2015 at 10:28:19AM +0200, Lucas Stach wrote:
> > Am Montag, den 28.09.2015, 17:50 +0100 schrieb Russell King - ARM Linux:
> > > You really do _not_ want to do be copying image data.  With large images
> > > (1080p) that will consume lots of CPU, and tie up the X server doing not
> > > much other than copying data.  You might as well manually convert and
> > > copy the data to the screen at that point.
> > > 
> > So what other possibilities do we have if the client hands us a non page
> > aligned buffer, other than failing the PutImage? Converting the image
> > manually and possibly doubling the amount of bytes to write out
> > (YUV->RGB) will tie up the X server even longer.
> 
> Are you sure about that?
> 
> If you memcpy() the buffer, you have to read about 6MB of data, write
> 6MB of data, flush the caches of that, then ask the GPU to perform two
> blits (which on my measurements just about fit in one field scan), wait
> for the blit to finish before then returning to the client.
> 
The cache flush can easily be avoided if you copy into a WC buffer.

And I don't see why we would need to wait for the blit to finish before
returning to the client. If we copy the userdata there is no need to
block the client until the GPU is done with the data.

Or is there something in the spec I'm not aware of which would mandate
such blocking?

> I can tell you that VLC uses memcpy() on images internally, and you can't
> get away with it for 1080p video.
> 
I'm not disputing that it's a really bad idea if you care about
performance.

> > This all doesn't seem to be a problem as long as the client allocates
> > from XShm, as this seems to hand out page aligned memory. Only if the
> > client mallocs the image buffer we might end up with unaligned buffers.
> 
> I don't see that.  How does a malloc()'d buffer get to the X server,
> other than throuh XvPutImage?  If you're using XvPutImage(), you'll
> be incurring an even _larger_ overhead because the kernel will have
> to copy the image data as well.  AFAIK, you can't pass arbitary malloc()d
> buffers to sysvipc and therefore via XShm.
> 
Right I'm talking about XvPutImage. I'm not saying it is a good way to
hand off your image data to the X server, all I'm saying is that this is
a path that applications _might_ use.

We can just choose to ignore this for the time being, as it's a
non-issue if the client is using XShm.

Regards,
Lucas
-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |

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

end of thread, other threads:[~2015-09-29  9:01 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-07 10:55 I.MX6 HDMI support in v4.2 Krzysztof Hałasa
2015-09-07 11:25 ` Russell King - ARM Linux
2015-09-07 14:04   ` Krzysztof Hałasa
2015-09-08  9:16     ` Russell King - ARM Linux
2015-09-08 11:01       ` Krzysztof Hałasa
2015-09-08 12:57         ` Russell King - ARM Linux
2015-09-08 14:59           ` Krzysztof Hałasa
2015-09-10 10:25           ` Krzysztof Hałasa
2015-09-10 10:49             ` Russell King - ARM Linux
2015-09-10 11:29               ` Krzysztof Hałasa
2015-09-17  7:21               ` Philipp Zabel
2015-09-17  8:38                 ` Krzysztof Hałasa
2015-09-17  9:23                 ` Russell King - ARM Linux
2015-09-08 10:45   ` Krzysztof Hałasa
2015-09-08 10:56     ` Lucas Stach
2015-09-08 11:01       ` Russell King - ARM Linux
2015-09-08 11:07         ` Lucas Stach
2015-09-08 11:29           ` Russell King - ARM Linux
2015-09-08 12:43             ` Lucas Stach
2015-09-08 13:40               ` Russell King - ARM Linux
2015-09-08 14:17               ` Robert Nelson
2015-09-08 14:45                 ` Krzysztof Hałasa
2015-09-08 14:48                 ` Lucas Stach
2015-09-08 15:55                 ` Russell King - ARM Linux
2015-09-08 17:07                   ` Jon Nettleton
2015-09-08 11:06       ` Krzysztof Hałasa
2015-09-14  8:39       ` Krzysztof Hałasa
2015-09-15  8:24         ` Krzysztof Hałasa
2015-09-15 10:12           ` Russell King - ARM Linux
2015-09-15 11:01             ` Krzysztof Hałasa
2015-09-15 14:29               ` Russell King - ARM Linux
2015-09-15 16:53                 ` Krzysztof Hałasa
2015-09-15 15:53         ` Lucas Stach
2015-09-15 16:36           ` Russell King - ARM Linux
2015-09-15 16:53             ` Lucas Stach
2015-09-15 17:04               ` Russell King - ARM Linux
2015-09-15 19:01                 ` Lucas Stach
2015-09-28 14:48                 ` xf86-video-armada + etnaviv (Was: Re: I.MX6 HDMI support in v4.2) Lucas Stach
2015-09-28 15:24                   ` Russell King - ARM Linux
2015-09-28 15:40                     ` Lucas Stach
2015-09-28 16:50                       ` Russell King - ARM Linux
2015-09-29  8:28                         ` Lucas Stach
2015-09-29  8:41                           ` Russell King - ARM Linux
2015-09-29  9:01                             ` Lucas Stach
2015-09-15 16:57           ` I.MX6 HDMI support in v4.2 Krzysztof Hałasa
2015-09-16  7:57           ` Krzysztof Hałasa
2015-09-16 15:52             ` Lucas Stach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).