Message ID | 20241210193904.883225-1-shreeya.patel@collabora.com |
---|---|
Headers | show |
Series | Add Synopsys DesignWare HDMI RX Controller | expand |
Hi Shreeya, I applied your patch to rockchip/next on an FriendlyElec CM3588 device with arm-trusted-firmware 2.12. This is the same hardware/cable/sources I used previously Sadly I could not get it to work at all. After connection to a HDMI source I get the following error with all devices and resolutions I tested # dmesg snps_hdmirx fdee0000.hdmi_receiver: hdmirx_controller_init wait timer base lock failed snps_hdmirx fdee0000.hdmi_receiver: hdmirx_phy_register_write wait cr write done failed (repeating multiple times) # v4l2-ctl --list-devices [...] snps_hdmirx (platform:fdee0000.hdmi_receiver): /dev/video2 With the source set to 1920x1080, 60hz RGB I get the following output, it freezes and creates no file. Notice the wrong resolution # v4l2-ctl --verbose -d /dev/video2 --set-fmt-video=width=1920,height=1080,pixelformat='BGR3' --stream-mmap=4 --stream-skip=3 --stream-count=100 --stream-to=hdmiin4k.raw --stream-poll VIDIOC_QUERYCAP: ok VIDIOC_G_FMT: ok VIDIOC_S_FMT: ok Format Video Capture Multiplanar: Width/Height : 640/480 Pixel Format : 'BGR3' (24-bit BGR 8-8-8) Field : None Number of planes : 1 Flags : Colorspace : sRGB Transfer Function : Default YCbCr/HSV Encoding: Default Quantization : Default Plane 0 : Bytes per Line : 1920 Size Image : 921600 Sometimes I could get a very distorted picture with gstreamer # dmesg fdee0000.hdmi_receiver: hdmirx_query_dv_timings: signal is not locked rockchip-rga fdb80000.rga: [CAPTURE] fmt - BGR3 little-endian (0x33524742) 1920x1080 (stride 5760, sizeimage 6220800) rockchip-rga fdb80000.rga: plane[0]: size 6220800, bytesperline 5760 # v4l2-ctl --all -L --list-formats-ext -d /dev/video2 Driver Info: Driver name : snps_hdmirx Card type : snps_hdmirx Bus info : platform:fdee0000.hdmi_receiver Driver version : 6.13.0 Capabilities : 0x84201000 Video Capture Multiplanar Streaming Extended Pix Format Device Capabilities Device Caps : 0x04201000 Video Capture Multiplanar Streaming Extended Pix Format Priority: 2 Video input : 0 (HDMI IN: ok) DV timings: Active width: 640 Active height: 480 Total width: 800 Total height: 525 Frame format: progressive Polarities: -vsync -hsync Pixelclock: 25175000 Hz (59.94 frames per second) Horizontal frontporch: 16 Horizontal sync: 96 Horizontal backporch: 48 Vertical frontporch: 10 Vertical sync: 2 Vertical backporch: 33 Standards: CTA-861, DMT CTA-861 VIC: 1 Flags: has CTA-861 VIC DV timings capabilities: Minimum Width: 640 Maximum Width: 4096 Minimum Height: 480 Maximum Height: 2160 Minimum PClock: 20000000 Maximum PClock: 600000000 Standards: CTA-861 Capabilities: Interlaced, Progressive Format Video Capture Multiplanar: Width/Height : 640/480 Pixel Format : 'BGR3' (24-bit BGR 8-8-8) Field : None Number of planes : 1 Flags : Colorspace : sRGB Transfer Function : Default YCbCr/HSV Encoding: Default Quantization : Default Plane 0 : Bytes per Line : 1920 Size Image : 921600 Digital Video Controls power_present 0x00a00964 (bitmask): max=0x00000001 default=0x00000000 value=1 flags=read-only rx_rgb_quantization_range 0x00a00965 (menu) : min=0 max=2 default=0 value=0 (Automatic) flags=read-only 0: Automatic 1: RGB Limited Range (16-235) 2: RGB Full Range (0-255) rx_it_content_type 0x00a00966 (menu) : min=0 max=4 default=4 value=4 (No IT Content) flags=read-only 0: Graphics 1: Photo 2: Cinema 3: Game 4: No IT Content ioctl: VIDIOC_ENUM_FMT Type: Video Capture Multiplanar [0]: 'BGR3' (24-bit BGR 8-8-8) Best regards, Tim On 12/10/24 20:39, Shreeya Patel wrote: > This series implements support for the Synopsys DesignWare > HDMI RX Controller, being compliant with standard HDMI 1.4b > and HDMI 2.0. > > Features that are currently supported by the HDMI RX driver > have been tested on rock5b board using a HDMI to micro-HDMI cable. > It is recommended to use a good quality cable as there were > multiple issues seen during testing the driver. > > Please note the below information :- > * HDMIRX driver now only works with the opensource TF-A. > * We have tested the working of OBS studio with HDMIRX driver and > there were no issues seen. > * We also tested and verified the support for interlaced video. > > To test the HDMI RX Controller driver, following example commands can be used :- > > root@debian-rockchip-rock5b-rk3588:~# v4l2-ctl --verbose -d /dev/video0 \ > --set-fmt-video=width=1920,height=1080,pixelformat='BGR3' --stream-mmap=4 \ > --stream-skip=3 --stream-count=100 --stream-to=/home/hdmiin4k.raw --stream-poll > > root@debian-rockchip-rock5b-rk3588:~# ffmpeg -f rawvideo -vcodec rawvideo \ > -s 1920x1080 -r 60 -pix_fmt bgr24 -i /home/hdmiin4k.raw output.mkv > > CEC compliance test results :- > > * https://gitlab.collabora.com/-/snippets/380 > * https://gitlab.collabora.com/-/snippets/381 > > Following is the v4l2-compliance test result :- > > root@debian-rockchip-rock5b-rk3588:~# v4l2-compliance -d /dev/video0 > v4l2-compliance 1.29.0-5278, 64 bits, 64-bit time_t > v4l2-compliance SHA: 791da13728d9 2024-11-25 10:01:57 > > Compliance test for snps_hdmirx device /dev/video0: > > Driver Info: > Driver name : snps_hdmirx > Card type : snps_hdmirx > Bus info : platform:fdee0000.hdmi_receiver > Driver version : 6.12.0 > Capabilities : 0x84201000 > Video Capture Multiplanar > Streaming > Extended Pix Format > Device Capabilities > Device Caps : 0x04201000 > Video Capture Multiplanar > Streaming > Extended Pix Format > > Required ioctls: > test VIDIOC_QUERYCAP: OK > test invalid ioctls: OK > > Allow for multiple opens: > test second /dev/video0 open: OK > test VIDIOC_QUERYCAP: OK > test VIDIOC_G/S_PRIORITY: OK > test for unlimited opens: OK > > Debug ioctls: > test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported) > test VIDIOC_LOG_STATUS: OK > > Input ioctls: > test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported) > test VIDIOC_G/S_FREQUENCY: OK (Not Supported) > test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported) > test VIDIOC_ENUMAUDIO: OK (Not Supported) > test VIDIOC_G/S/ENUMINPUT: OK > test VIDIOC_G/S_AUDIO: OK (Not Supported) > Inputs: 1 Audio Inputs: 0 Tuners: 0 > > Output ioctls: > test VIDIOC_G/S_MODULATOR: OK (Not Supported) > test VIDIOC_G/S_FREQUENCY: OK (Not Supported) > test VIDIOC_ENUMAUDOUT: OK (Not Supported) > test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported) > test VIDIOC_G/S_AUDOUT: OK (Not Supported) > Outputs: 0 Audio Outputs: 0 Modulators: 0 > > Input/Output configuration ioctls: > test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported) > test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK > test VIDIOC_DV_TIMINGS_CAP: OK > test VIDIOC_G/S_EDID: OK > > Control ioctls (Input 0): > test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK > test VIDIOC_QUERYCTRL: OK > test VIDIOC_G/S_CTRL: OK > test VIDIOC_G/S/TRY_EXT_CTRLS: OK > test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK > test VIDIOC_G/S_JPEGCOMP: OK (Not Supported) > Standard Controls: 4 Private Controls: 0 > > Format ioctls (Input 0): > test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK > test VIDIOC_G/S_PARM: OK > test VIDIOC_G_FBUF: OK (Not Supported) > test VIDIOC_G_FMT: OK > test VIDIOC_TRY_FMT: OK > test VIDIOC_S_FMT: OK > test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported) > test Cropping: OK (Not Supported) > test Composing: OK (Not Supported) > test Scaling: OK (Not Supported) > > Codec ioctls (Input 0): > test VIDIOC_(TRY_)ENCODER_CMD: OK (Not Supported) > test VIDIOC_G_ENC_INDEX: OK (Not Supported) > test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported) > > Buffer ioctls (Input 0): > test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK > test CREATE_BUFS maximum buffers: OK > test VIDIOC_REMOVE_BUFS: OK > test VIDIOC_EXPBUF: OK > test Requests: OK (Not Supported) > test blocking wait: OK > > Total for snps_hdmirx device /dev/video0: 48, Succeeded: 48, Failed: 0, Warnings: 0 > > --- > > Resending the patch series due to mail server timeout issue > when sending v5 patchset > > Changes in v5 :- > - Fix the interrupt IRQ number in the dt-bindings and device tree > - Add alignment property to ensure hdmi-receiver-cma > starts at a 64KB-aligned address > - Change the MODULE_DESCRIPTION > - Add VIDEO_SYNOPSYS_HDMIRX as prefix to the default edid config > - Drop the enabling of default edid in the Kconfig > - Replace the default EDID with hdmi-4k-300mhz EDID produced > by v4l2-ctl tool for better compatibility with various HDMI > cables and adapters > - Rework the write_edid and set_edid functions > - During format change, retrieve the current pixel format, > color depth, and AVI infoframe details instead of only > detecting the format > - Improve the logging mechanism and delays in the > hdmirx_wait_signal_lock function > - Fix the 4K@60 capturing for RGB format > - Document what hdmirx_check_timing_valid function does > - Rework the hdmirx_get_detected_timings function > - Fix the NV16/24 size image value > - Add the implementation from Benjamin Hoff to expose the > ITC type to v4l2 > - Remove all the firmware related code > > Changes in v4 :- > - Remove DTS changes included in the device tree patch > - Remove the hdmi rx pin info as it's already present > in the rk3588-base-pinctrl.dtsi > - Create a separate config option for selecting the EDID > and enable it by default > - Improve the comment related to DV timings and move it > to the side of hdmirx_get_detected_timings > - Add 100ms delay before pulling the HPD high > - Do not return the detected timings from VIDIOC_G_DV_TIMINGS > - Drop the bus info from hdmirx_querycap > - If *num_planes != 0 then return 0 in hdmirx_queue_setup > - Set queue->min_queued_buffers to 1 > - Drop q->allow_cache_hints = 0; as it's always 0 by default > - Add a comment for q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS; > - Drop .read = vb2_fop_read as it's not supported by driver > - Remove redundant edid_init_data_600M > - Make HPD low when driver is loaded > - Add support for reading AVI Infoframe > - Remove msg_len checks from hdmirx_cec_transmit > - Add info about the CEC compliance test in the cover letter > - Add arbitration lost status > - Validate the physical address inside the EDID > > Changes in v3 :- > - Use v4l2-common helpers in the HDMIRX driver > - Rename cma node and phandle names > - Elaborate the comment to explain 160MiB calculation > - Move &hdmi_receiver_cma to the rock5b dts file > - Add information about interlaced video testing in the > cover-letter > > Changes in v2 :- > - Fix checkpatch --strict warnings > - Move the dt-binding include file changes in a separate patch > - Add a description for the hardware in the dt-bindings file > - Rename resets, vo1 grf and HPD properties > - Add a proper description for grf and vo1-grf phandles in the > bindings > - Rename the HDMI RX node name to hdmi-receiver > - Include gpio header file in binding example to fix the > dt_binding_check failure > - Move hdmirx_cma node to the rk3588.dtsi file > - Add an entry to MAINTAINERS file for the HDMIRX driver > > Shreeya Patel (4): > MAINTAINERS: Add entry for Synopsys DesignWare HDMI RX Driver > dt-bindings: media: Document bindings for HDMI RX Controller > arm64: dts: rockchip: Add device tree support for HDMI RX Controller > media: platform: synopsys: Add support for HDMI input driver > > .../bindings/media/snps,dw-hdmi-rx.yaml | 132 + > MAINTAINERS | 8 + > .../dts/rockchip/rk3588-base-pinctrl.dtsi | 14 + > .../arm64/boot/dts/rockchip/rk3588-extra.dtsi | 57 + > drivers/media/platform/Kconfig | 1 + > drivers/media/platform/Makefile | 1 + > drivers/media/platform/synopsys/Kconfig | 3 + > drivers/media/platform/synopsys/Makefile | 2 + > .../media/platform/synopsys/hdmirx/Kconfig | 27 + > .../media/platform/synopsys/hdmirx/Makefile | 4 + > .../platform/synopsys/hdmirx/snps_hdmirx.c | 2662 +++++++++++++++++ > .../platform/synopsys/hdmirx/snps_hdmirx.h | 394 +++ > .../synopsys/hdmirx/snps_hdmirx_cec.c | 283 ++ > .../synopsys/hdmirx/snps_hdmirx_cec.h | 44 + > 14 files changed, 3633 insertions(+) > create mode 100644 Documentation/devicetree/bindings/media/snps,dw-hdmi-rx.yaml > create mode 100644 drivers/media/platform/synopsys/Kconfig > create mode 100644 drivers/media/platform/synopsys/Makefile > create mode 100644 drivers/media/platform/synopsys/hdmirx/Kconfig > create mode 100644 drivers/media/platform/synopsys/hdmirx/Makefile > create mode 100644 drivers/media/platform/synopsys/hdmirx/snps_hdmirx.c > create mode 100644 drivers/media/platform/synopsys/hdmirx/snps_hdmirx.h > create mode 100644 drivers/media/platform/synopsys/hdmirx/snps_hdmirx_cec.c > create mode 100644 drivers/media/platform/synopsys/hdmirx/snps_hdmirx_cec.h >
Hi, On 1/6/25 03:16, Tim Surber wrote: > I applied your patch to rockchip/next on an FriendlyElec CM3588 device with arm- > trusted-firmware 2.12. This is the same hardware/cable/sources I used previously > Sadly I could not get it to work at all. > > After connection to a HDMI source I get the following error with all devices and > resolutions I tested > # dmesg > snps_hdmirx fdee0000.hdmi_receiver: hdmirx_controller_init wait timer base lock > failed > snps_hdmirx fdee0000.hdmi_receiver: hdmirx_phy_register_write wait cr write done > failed (repeating multiple times) Sounds like interrupt may be not working for you. Interrupt won't work using downstream version of AT-F, though I assume you're using vanilla version of the AT-F. Could you please show output of `cat /proc/interrupts | grep rk_hdmirx` after plugging the HDMI cable.
Hi Dmitry, that was my fault, my build script did not copy over the new ATF properly. Now it works, I will update with test results with many different resolutions/formats here soon. Best regards, Tim On 1/6/25 12:22, Dmitry Osipenko wrote: > Hi, > > On 1/6/25 03:16, Tim Surber wrote: >> I applied your patch to rockchip/next on an FriendlyElec CM3588 device with arm- >> trusted-firmware 2.12. This is the same hardware/cable/sources I used previously >> Sadly I could not get it to work at all. >> >> After connection to a HDMI source I get the following error with all devices and >> resolutions I tested >> # dmesg >> snps_hdmirx fdee0000.hdmi_receiver: hdmirx_controller_init wait timer base lock >> failed >> snps_hdmirx fdee0000.hdmi_receiver: hdmirx_phy_register_write wait cr write done >> failed (repeating multiple times) > > Sounds like interrupt may be not working for you. Interrupt won't work > using downstream version of AT-F, though I assume you're using vanilla > version of the AT-F. Could you please show output of `cat > /proc/interrupts | grep rk_hdmirx` after plugging the HDMI cable. >
On 1/7/25 03:08, Tim Surber wrote: > Hi Dmitry, > > that was my fault, my build script did not copy over the new ATF properly. > > Now it works, I will update with test results with many different > resolutions/formats here soon. Thanks for the quick update, please post the results once ready.
Hi, I tested your patch with the command # gst-launch-1.0 -v v4l2src device=/dev/video1 ! fakesink If this worked I moved on to a visual test using # gst-launch-1.0 -v v4l2src device=/dev/video1 ! queue ! v4l2convert ! waylandsink I used a Windows PC with a Nvidia GTX 4060 as my source for the following tests. | Format | Result | | ------------ | ------------------------------------------- | | 4k60p RGB | Recognized as 1080p / 120 fps - no output | | 4k60p 4:2:2 | Recognized as 1080p / 120 fps - no output | | 4k60p 4:4:4 | Error: Device wants 1 planes | | 4k30p RGB | ok | | 4k30p 4:2:2 | ok | | 4k30p 4:4:4 | Error: Device wants 1 planes | | FHD60p RGB | ok | | FHD60p 4:2:2 | ok | | FHD60p 4:4:4 | Error: Device wants 1 planes | When testing 4:4:4 chroma I got the following error: # gst-launch-1.0 -v v4l2src device=/dev/video1 ! fakesink /sys/v4l2/gstv4l2object.c(4344): gst_v4l2_object_set_format_full (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device wants 1 planes I could record and convert (with errors) the files with 4:4:4 chroma using the command Shreeya posted, but the resulting video had wrong colors and was flashing. I was not able to test 4:2:0 chroma. I tried to generate an custom EDID with support for it but I could not select it in the graphics driver in the source, maybe this is just an issue with my setup. I also observed that the the framerate is reported wrong, for example setting the source to FHD60p RGB resulted in the following: # v4l2-ctl --all -L --list-formats-ext -d /dev/video0 Active width: 1920 Active height: 1080 Total width: 2200 Total height: 1125 Frame format: progressive Polarities: -vsync -hsync Pixelclock: 214076000 Hz (86.50 frames per second) This wrong framerate reporting seemed to happen across all framerates and resolutions. Gstreamer Pipeline negotation showed the same results. During my testing I got sometimes an error # dmesg dma alloc of size 24883200 failed I'm not sure when this happened and how to reproduce it. Then I tried to use an AppleTV 4k as source. I don't know what resolution it tried to negotiate but I got this error in addition to the previous "Device wants 1 planes" and no connection: # dmesg fdee0000.hdmi_receiver: hdmirx_query_dv_timings: signal is not locked fdee0000.hdmi_receiver: hdmirx_wait_signal_lock: signal not lock, tmds_clk_ratio:0 fdee0000.hdmi_receiver: hdmirx_wait_signal_lock: mu_st:0x0, scdc_st:0x0, dma_st10:0x10 fdee0000.hdmi_receiver: hdmirx_wait_signal_lock: signal not lock, tmds_clk_ratio:0 fdee0000.hdmi_receiver: hdmirx_wait_signal_lock: mu_st:0x0, scdc_st:0x0, dma_st10:0x14 Best regards, Tim