Xilinx DRM KMS SDI-Tx Driver
Table of Contents
The purpose of this page is to describe the Linux DRM driver for Xilinx SDI-Tx Soft IP for Zynq Ultrascale+ MPSOC
Introduction
The Society of Motion Picture and Television Engineers (SMPTE) UHD-SDI transmitter subsystem implements a SDI transmit interface in accordance to the serial digital interface (SDI) family of standards. The subsystem accepts video from AXI-4 Stream Video interface and outputs. Native Video stream, and allows for fast selection of the top-level parameters and automates most of the lower level parameterization. The AXI4-stream video interface allows a seamless interface to other AXI4-Stream-based subsystems. The SMPTE UHD-SDI Transmitter Subsystem allows you to quickly create systems based on SMPTE SDI protocols. It accepts AXI-4 Video stream and outputs native SDI stream by using Xilinx transceivers as physical layer. The top level customization parameters select the required hardware blocks needed to build the subsystem.
Driver Overview
SDITx is the last node in the display pipeline. The Linux driver is implemented as a sub-component of the Xilinx DRM KMS bridge driver and implements the encoder/connector interface. The subsystem includes the video timing controller(VTC), Axi-4 Stream to Video, SDI Tx bridge and Tx sub-core. Driver implements the DRM callbacks to read the supported resolutions from driver and provide to DRM framework anytime queried. On mode change request from user application driver works in conjunction with DRM framework to validate the requested mode to ensure the stream can be generated by Tx core and is supported by the driver. If requested mode is supported the driver will configure Tx sub-core for new mode and the configure the video timing controller (VTC) to generate requisite video timing for it. This driver also supports user parameters for SDi-mode, number of data stream and fractional frame rates.
IP/Driver Features
IP feature | 2019.1/2020.1/2021.1/2021.2/2022.1/2022.2/2023.1/2024.1/2024.2/2025.1/2025.2 |
|---|---|
IP version | 2.0 |
Supports AXI4-Stream, native video and native SDI user interfaces. | Supports only AXI4-Stream output interface |
Support for 2 pixel per sample | Yes |
10-bit per color component | Yes |
Supports YUV 4:2:2 and YUV 4:2:0 color space | Yes |
AXI4-Lite interface for register access to configure different subsystem options | Yes |
Audio support | Separate driver |
Standards compliance
| Yes* |
Supports upto 8 data streams | Yes |
Supports Fractional/Integer framerate | Yes** |
Supports progressive/interlaced modes | Yes** |
Supports YUV 4:4:4 | Yes*** |
HFR Supports | Yes*** |
Dynamic BPC Support | Not yet supported in software(2025.2) |
Missing Features / Known Issues / Limitations in Driver
*Multiple instances capability not tested
**Few fractional fps with interlaced modes are recognized as round off value on SDI tester equipment
ex: 1920x1080i@47.95 shown 48 fps on Omnitek.
Tested with Phabrix and Omnitek Ultra4K
Kernel Configuration Options for Driver
>=2018.1
CONFIG_DRM_XLNX_SDI should be enabled. This depends on CONFIG_DRM_XLNX and CONFIG_DRM
<2018.1
CONFIG_DRM_XILINX_SDI and CONFIG_VIDEO_XILINX should be enabled
Device Tree Binding
The dts node should be defined with correct hardware configuration. How to define the node is documented in
>=2025.1 onwards: linux-xlnx/Documentation/devicetree/bindings/display/xlnx/xlnx,sdi-tx.yaml at master · Xilinx/linux-xlnx · GitHub
>=2018.1
<2018.1
Documentation/devicetree/bindings/drm/xilinx/sdi.txt
Below is the example device tree for a design where the display pipeline flows from DDR memory through a framebuffer read DMA to an SDI transmitter. Below device tree nodes are generated by SDT.
v_smpte_uhdsdi_tx_ss: v_smpte_uhdsdi_tx_ss@80020000 {
interrupts = < 0 90 4 0 108 4 >;
compatible = "xlnx,v-smpte-uhdsdi-tx-ss-2.0" , "xlnx,sdi-tx";
xlnx,include-edh;
xlnx,exdes-config = "Pass-through_with_Picxo";
xlnx,include-ycbcr-444 = <1>;
interrupt-parent = <&imux>;
xlnx,rable = <0>;
xlnx,ip-name = "v_smpte_uhdsdi_tx_ss";
reg = <0x0 0x80020000 0x0 0x20000>;
xlnx,sdiline-rate = <2>;
clocks = <&misc_clk_100>, <&si5328 0>, <&misc_clk_300>;
xlnx,line-rate = "12G_SDI_8DS";
xlnx,tx-insert-c-str-st352 = "true";
xlnx,pixels-per-clock = <2>;
xlnx,bpp = <10>;
sditx-present = <1>;
xlnx,edk-iptype = "PERIPHERAL";
sdivtc-present = <1>;
xlnx,video-intf = "AXI4_Stream";
sditx-connected = <&v_smpte_uhdsdi_tx_ss_v_smpte_uhdsdi_tx>;
status = "okay";
xlnx,exdes-board = "ZCU106";
sdivtc-connected = <&v_smpte_uhdsdi_tx_ss_v_tc>;
clock-names = "s_axi_aclk" , "sdi_tx_clk" , "video_in_clk";
xlnx,Isstd_352 = <1>;
interrupt-names = "sdi_tx_irq" , "vtc_irq";
xlnx,include-adv-features;
xlnx,name = "v_smpte_uhdsdi_tx_ss";
xlnx,include-axilite;
xlnx,include-hfr = <1>;
sditx_portsv_smpte_uhdsdi_tx_ss: ports {
#address-cells = <1>;
#size-cells = <0>;
encoder_sdi_portv_smpte_uhdsdi_tx_ss: port@0 {
reg = <0>;
encoderv_smpte_uhdsdi_tx_ss: endpoint {
remote-endpoint = <&v_frmbuf_rd_0v_smpte_uhdsdi_tx_ss>;
};
};
sdi_audio_port: port@1 {
reg = <1>;
sdi_audio_sink_port: endpoint {
remote-endpoint = <&sditx_audio_embed_src>;
};
};
};
}; v_pl_dispv_smpte_uhdsdi_tx_ss: drm-pl-disp-drvv_smpte_uhdsdi_tx_ss {
compatible = "xlnx,pl-disp";
#address-cells = <1>;
xlnx,vformat = "YUYV";
dmas = <&v_frmbuf_rd_0 0>;
#size-cells = <0>;
dma-names = "dma0";
pl_display_portv_smpte_uhdsdi_tx_ss: port@0 {
reg = <0>;
v_frmbuf_rd_0v_smpte_uhdsdi_tx_ss: endpoint {
remote-endpoint = <&encoderv_smpte_uhdsdi_tx_ss>;
};
};
}; audio_ss_v_uhdsdi_audio_embed_0: v_uhdsdi_audio@800a0000 {
interrupts = < 0 107 4 >;
compatible = "xlnx,v-uhdsdi-audio-2.0" , "xlnx,v-uhdsdi-audio-2.0";
xlnx,audio-function = <0>;
interrupt-parent = <&imux>;
xlnx,rable = <0>;
xlnx,sdi-aud-stat-ext;
xlnx,enable-clock-phase;
xlnx,ip-name = "v_uhdsdi_audio";
xlnx,aes-chan-stat-ext;
reg = <0x0 0x800a0000 0x0 0x10000>;
xlnx,axis-tid-width = <3>;
xlnx,sdiline-rate = <2>;
clocks = <&misc_clk_0>, <&misc_clk_0>, <&misc_clk_1>;
xlnx,enable-channel-padding;
xlnx,line-rate = "12G_SDI_8DS";
xlnx,snd-pcm = <&audio_ss_audio_formatter_0>;
xlnx,edk-iptype = "PERIPHERAL";
xlnx,num-audio-groups = <2>;
xlnx,max-audio-channels = <8>;
status = "okay";
clock-names = "s_axi_aclk" , "s_axis_clk" , "sdi_embed_clk";
interrupt-names = "interrupt";
xlnx,name = "audio_ss_v_uhdsdi_audio_embed_0";
xlnx,include-axilite;
sdiaudio_ss_v_uhdsdi_audio_embed_0: ports {
#address-cells = <1>;
#size-cells = <0>;
sdi_av_port: port@0 {
reg = <0>;
sditx_audio_embed_src: endpoint {
remote-endpoint = <&sdi_audio_sink_port>;
};
};
};
};&amba_pl {
misc_clk_100: misc_clk_100 {
#clock-cells = <0>;
clock-frequency = <100000000>;
compatible = "fixed-clock";
};
misc_clk_297: misc_clk_297 {
#clock-cells = <0>;
clock-frequency = <297000000>;
compatible = "fixed-clock";
};
misc_clk_300: misc_clk_300 {
#clock-cells = <0>;
clock-frequency = <300000000>;
compatible = "fixed-clock";
};
};
&si5328 {
compatible = "silabs,si5328";
reg =<0x69>;
#address-cells = <1>;
#size-cells = <0>;
#clock-cells = <1>;
/*input clock(s); the xtal is hard-wired on the zcu106 board /
clock-names = "xtal";
/ output clocks */
clk0 {
reg = <0>;
/*QPLL1 reference clock output frequency */
clock-frequency = <148500000>;
};
};
&si570_2 {
clock-frequency = <148500000>;
};
&v_smpte_uhdsdi_tx_ss {
clock-names = "s_axi_aclk" , "sdi_tx_clk" , "video_in_clk";
clocks = <&misc_clk_100>, <&si5328 0>, <&misc_clk_297>;
phy-reset-gpio = <&axi_gpio_0 0 0 0>;
xlnx,qpll1_enabled = <0x1>;
};
&v_smpte_uhdsdi_rx_ss {
clock-names = "s_axi_aclk" , "sdi_rx_clk" , "video_out_clk";
clocks = <&misc_clk_100>, <&si570_2>, <&misc_clk_297>;
reset_gt-gpios = <&axi_gpio_1 0 0 0>;
};
Test Procedure
SDI-Tx can be manually configured to generate the required mode. An open source utility like modetest can be used to configure the display pipeline. Pipeline: DDR ==> Framebuffer read ==> SDI-Tx
Sample command to set a mode is shown below
modetest –M xlnx -s <connector_id>[@<crtc_id>]:<mode>[-<vrefresh>][@<format> - w <connector_id>:<property_name>:<property_value>
For ex:
modetest -M xlnx -s 27:1280x720-30@YUYV -w 27:sdi_mode:0 -w 27:sdi_data_stream:2 -w 27:is_frac:0
Above command will generate a color bar pattern at requested resolution in DDR, configures the DMA to read the frame from DDR and configures the SDI-TX for said resolution. As a final result Color Bar at defined resolution should be visible on screen.
sdi_mode | sdi_data_stream | Typical resolutions | 2018.1 and later modetest examples for 8-bit video | |
|---|---|---|---|---|
HD-SDI | 0 | 2 | 720p50, 1080p24,25,30 1080i,60 | modetest -M xlnx -s 36:1280x720-60@YUYV -w 36:sdi_mode:0 -w 36:sdi_data_stream:2 -w 36:is_frac:0
modetest -M xlnx -s 36:1920x1080-30@YUYV -w 36:sdi_mode:0 -w 36:sdi_data_stream:2 -w 36:is_frac:0
modetest -M xlnx -s 36:1920x1080i-60@YUYV -w 36:sdi_mode:0 -w 36:sdi_data_stream:2 -w 36:is_frac:0 |
SD-SDI | 1 | 2 | NTSC, PAL | modetest -M xlnx -s 36:720x486i-60@YUYV -w 36:sdi_mode:1 -w 36:sdi_data_stream:2 -w 36:is_frac:0
modetest -M xlnx -s 36:720x576i-50@YUYV -w 36:sdi_mode:1 -w 36:sdi_data_stream:2 -w 36:is_frac:0 |
3G-SDI Level A | 2 | 2 | 1080p50,60 | modetest -M xlnx -s 36:1920x1080-60@YUYV -w 36:sdi_mode:2 -w 36:sdi_data_stream:2 -w 36:is_frac:0 |
3G-SDI Level B | 3 | 4 | 1080p24,25,30 (Dual Stream) | |
6G-SDI | 4 | 8 | 2160p25,30 | modetest -M xlnx -s 36:3840x2160-30@YUYV -w 36:sdi_mode:4 -w 36:sdi_data_stream:8 -w 36:is_frac:0 |
12G-SDI | 5 | 8 (default) or 16 | 2160p50,60 | modetest -M xlnx -s 36:3840x2160-60@YUYV -w 36:sdi_mode:5 -w 36:sdi_data_stream:8 -w 36:is_frac:0 |
Note:
<2018.1:
Test command will be as follows:
modetest –M xilinx_drm -s <connector_id>[@<crtc_id>]:<mode>[-<vrefresh>][@<format> - w <connector_id>:<property_name>:<property_value>
Debug capability
The driver debug messages can be enabled by adding "#define DEBUG" at the top of the file. All debug prints are sent to serial console and can be viewed in kernel dmesg buffer.
Boards Supported
Driver has been tested on ZCU106 Rev1.0
Known Issues
AR68767 - SMPTE UHD-SDI Transmitter Subsystem - Release Notes and Known Issues for the Vivado 2017.3 tool and later versions.
Changelog
2025.2
Summary:
No changes
2025.1
Summary:
2024.2
Summary:
No changes on drivers
Hence, for device tree related changes please refer: Video PL-IP Linux Drivers SDT Reference - Xilinx Wiki - Confluence
2024.1
Summary:
No changes
2023.1 & 2023.2
Summary:
No changes
2022.2
Summary:
Add an extra check to get the correct timing table index.
reset the gt-phy based on device tree property.
Fix the typo in kernel-doc.
Add YUV444 format support.
HFR feature support
Fix coding style (double space)
Commits:
2022.1
Summary:
No changes
2021.2
Summary:
No changes
2021.1
Summary:
Updated sdi audio parameters
Commits:
d4ce79 drm: xlnx: sdi: Update sdi audio parameters
2020.2
Summary:
Add mode_valid helper function
Add supported EOTF's list to connector
Add support to non-picxo designs
Update EOTF and colorimetry fields in payload
Fix dynamic clock config to support QPLL1 reset
Added clock config to support integer and fractional framerate
Commits:
26518e drm: xlnx: sdi: Add mode_valid helper function
13e7b5 drm: xlnx: sdi: Add supported EOTF's list to connector
801956 drm: xlnx: sdi: Add support to non-picxo designs
d8b6fd drm: xlnx: sdi: Update EOTF and colorimetry fields in payload
6102a0 drm: xlnx: sdi: Fix dynamic clock config to support QPLL1 reset
06add1 drm: xlnx: sdi: Add clock config to support integer and fractional framerate
2020.1
Summary:
Updated irq name
Commits:
54aef6 drm: xlnx: sdi: Use the named IRQ when available
2019.2
No update
2019.1
Summary:
Updated drm property creation logic
Added clock framework support
Commits:
2018.3
Summary:
Added bridge disable under sdi disable
Fix clearing en_st352 and use_ds2_3ga drm properties
Added support to DS2 payload in 3GA mode
Add ST352 payload insertion in chroma stream
Enabled support to ancillary data
Added video mode hdisplay and flags to shared data
Enabled audio
Fixed Vertical field 1 size calculation
Fixed HSIZE calculation
Commits:
9b071b drm: xlnx: sdi: Disable bridge instance
883a92 drm: xlnx: sdi: Fix clearing en_st352_c and use_ds2_3ga drm properties
484c16 drm: xlnx: sdi: Add support for DS2 payload in 3GA mode
3358cc drm: xlnx: sdi: Add ST352 payload insertion in Chroma stream
b755ed drm: xlnx: sdi: Enable support for ancillary data
fef944 drm: xlnx: sdi: Add video mode hdisplay, flags to the shared data
d42f4f drm: xlnx: sdi: Enable audio
c7cacf drm: xlnx: sdi: Fix the Vertical Field 1 Size calculation
5d4a1b drm: xlnx: sdi: Fix the HSIZE calculation
2018.2
Summary
No change
2018.1
Summary:
Added YUV420 support
Added xlnx bridge support
Added initial version based on xlnx drm framework
Commits:
2017.4
Added vblank support
Added psf mode support
Added 3G-B and 12G support
Driver in drivers/gpu/drm/Xilinx/Xilinx_drm_sdi.c and maintained at a special branch
https://github.com/Xilinx/linux-xlnx/tree/2017.3_video_ea
2017.3
Initial version.
Driver in drivers/gpu/drm/Xilinx/Xilinx_drm_sdi.c and maintained at a special branch
https://github.com/Xilinx/linux-xlnx/tree/2017.3_video_ea
Related Links
© 2025 Advanced Micro Devices, Inc. Privacy Policy