NvDisplay

NvDisplay is the display architecture supported on QNX starting in NVIDIA DRIVE OS 6.0.

Display Serializer

The following sections describe the display serializer.

Configuring Video Timings

For both SST and MST mode, the mode timings that are used for each stream need to be configured in Device Tree. Only one mode timing can be specified at a time for each video stream. The timings that are exposed in the EDIDs of the serializer and the panels connected to the downstream deserializer are completely ignored.

An example Device Tree fragment is shown below. In this example, a standard 1920x1080 at 60 Hz timing is specified for the first video stream, and a 1280x720 at 60 Hz timing is specified for the second video stream:

\ {
    display@13800000 {
        display-timings {
            display-connector-0 {
                dcb-index = <0>;

                stream-0 {
                    timings-phandle = <&mode0>;
                };

                stream-1 {
                    timings-phandle = <&mode1>;
                };
            };
        };

        mode0: 1920-1080-60Hz {
            clock-frequency-khz = <148500>;
            hactive = <1920>;
            vactive = <1080>;
            hfront-porch = <88>;
            hback-porch = <148>;
            hsync-len = <44>;
            vfront-porch = <4>;
            vback-porch = <36>;
            vsync-len = <5>;
            rrx1k = <60000>;
        };

        mode1: 1280-720-60Hz {
            clock-frequency-khz = <74250>;
            hactive = <1280>;
            vactive = <720>;
            hfront-porch = <110>;
            hback-porch = <220>;
            hsync-len = <40>;
            vfront-porch = <5>;
            vback-porch = <20>;
            vsync-len = <5>;
            rrx1k = <60000>;
        };
    };
};
In the above example:
  • "display@13800000" is the overall parent node for the entire display device. This node already exists today.
    • "display-timings" is used to specify which timings are used for each stream.
      • "display-connector-0" specifies the timing information for the first display connector. If there are multiple display connectors present on the board that require fixed timings, then a new "display-connector" node must be created for each connector.
        • "dcb-index" specifies the logical index X of the DCB -> Display Devices -> Display Device X entry in the display DCB blob that this connector entry applies to. If there is only one display connector on the board, then "dcb-index" defaults to 0.
        • The "stream" nodes specify the phandle of the mode timing node that applies to the given video stream.
    • Each "mode" node contains the actual mode timing parameters that will be used for a given video stream.
      • "clock-frequency-khz" : Pixel clock frequency in KHz
      • "hactive" : Horizontal active
      • "vactive" : Vertical active
      • "hfront-porch" : Horizontal front porch
      • "hback-porch" : Horizontal back porch
      • "hsync-len" : Horizontal sync width
      • "vfront-porch" : Vertical front porch
      • "vback-porch" : Vertical back porch
      • "vsync-len" : Vertical sync width
      • "rrx1k" : Refresh rate in units of 0.001Hz

Each "display-connector" can only have up to two (2) "stream" nodes. Note that it is fine to specify two (2) "stream" nodes even if the display serializer operates in SST mode since only the first "stream" node is consumed by the display driver. The extra node is ignored.

Configuring the Serializer Driver

If you are using NVIDIA's reference Maxim serializer driver, there are various ways to configure the driver via Device Tree. An example Device Tree fragment is shown below that configures the Maxim serializer chip in MST mode:

i2c@31e0000 {
    status = "okay";
    maxim_ser: max_gmsl_dp_ser@40 {
        compatible = "maxim,max_gmsl_dp_ser";
        reg = <0x40>;
        status = "okay";
        max_gmsl_dp_ser-pwrdn = <&tegra_main_gpio TEGRA234_MAIN_GPIO(G, 3) GPIO_ACTIVE_HIGH>;
        ser-errb = <&tegra_main_gpio TEGRA234_MAIN_GPIO(G, 7) 0>;
        dprx-link-rate = <0x1e>;
        dprx-lane-count = <0x4>;
        enable-mst;
        mst-payload-ids  = /bits/ 8 <0x1 0x3 0x2 0x4>;
        gmsl-stream-ids  = /bits/ 8 <0x0 0x1 0x2 0x3>;
        gmsl-link-select = /bits/ 8 <0x0 0x0 0x1 0x1>;
    };
};

A description of each of the above properties:

  • Required properties:
    • compatible : Must be "maxim,max_gmsl_dp_ser".
    • reg : I2C address of the Maxim display serializer.
    • max_gmsl_dp_ser-pwrdn : GPIO pin number of the PWRDN pin. This is the pin that's used to power up the Maxim display serializer chip.
    • gmsl-link-select : This property is an array of 4 unsigned 8 bit values that determines the GMSL output link to enable for each video pipe X, Y, Z, and U. The possible values for each pipe are:
      • 0x0 (Link A)
      • 0x1 (Link B)
      • 0x2 (Link A + B)
  • Optional properties:
    • dprx-link-rate : Configures the DP link rate of the serializer chip.

      The default value is 0x1E (HBR3). The possible values are:
      • 0xA (HBR)
      • 0x14 (HBR2)
      • 0x1E (HBR3)
    • dprx-lane-count : Configures the DP lane count of the serializer chip.

      The default value is 0x4. The possible values are:
      • 0x1
      • 0x2
      • 0x4
    • ser-errb : GPIO pin number of the ERRB pin. This pin is used for error and fault reporting by the serializer chip.

    • enable-mst : This is a boolean property. If this property is present the driver will enable MST mode.

    • mst-payload-ids : This property is an array of 4 unsigned 8 bit values which represent MST payload IDs of pipe X, Y, Z, U. This property is mandatory if enable-mst property is mentioned in dt.

    • gmsl-stream-ids : This property is an array of 4 unsigned 8 bit values which represent GMSL stream IDs of pipe X, Y, Z, U. This property is mandatory if enable-mst property is mentioned in dt.

Modeset Limitations

The Maxim display serializers do not support dynamic mode changes in MST mode without requiring a reset of the serializer chip in-between. In this context, a mode change refers to changing the number of video streams and/or the display timings that are used for each stream. As such, if the Maxim display serializers are configured in MST mode, it is recommended to always enable all video streams that will be used at once.

Head to Window Assignment

The following sections describe head to window assignment.

Configuring Head to Window Assignment

Configure head to window assignment in the Device Tree. If an assignment is not specified in the DT, the driver assigns windows (2N) and (2N + 1) to HEAD N. In DT, specify the assignment using 64 bit mask, which is interpreted as:

Head-Bitmask Window-Number
BITMASK(0-7) 0
BITMASK(8-15) 1
BITMASK(16-23) 2
BITMASK(24-31) 3
BITMASK(32-39) 4
BITMASK(40-47) 5
BITMASK(48-55) 6
BITMASK(56-63) 7

The display driver fails to load if an invalid assignment is specified in the DT. The specified assignment must adhere to the conditions below:

  1. The specified window number must be supported by hardware.
  2. The specified head number must be supported by hardware.
  3. The same window must not be assigned simultaneously for multiple heads.
  4. At least one window must be assigned to at least one head (i.e., specified window-head mask should not be 0).

The display driver culls the head with no windows assigned, and all the heads above it. For example, if hardware supports 3 heads and the user uses the assignment mask to assign valid windows to head-0 and head-2 but no windows to head-1, then head-1 and head-2 is culled.

An example Device Tree fragment is shown below. In this example, window-0, window-1, and window-2 is assigned to head-0 and window-3 is assigned to head-1.

\ {
    display@13800000 {
        nvidia,window-head-mask = <0x00000000 0x02010101>;
    };
};

In the above example:

  • display@13800000 is the overall parent node for the entire display device. This node already exists today.
    • nvidia,window-head-mask is used to specify the 64 bit window head assignment mask.