DCP platforms place the display pipeline under firmware control, so Linux cannot discover display resources through direct register access. The DRM driver therefore needs device-tree descriptions of the Qualcomm transport wrapper, display topology, IOMMU contexts, and panel connections.
Add bindings for the Qualcomm DCP transport wrapper and VirtIO display subsystem. Document the IPCC power-notify resources, transport and framebuffer IOMMU contexts, firmware-visible IOVA range, INTF graph, and DSI panel connections. The wrapper creates a standard VirtIO-MMIO child after the IPCC power-notify sequence has completed. Assisted-by: LLM Signed-off-by: Jayant Shekhar <[email protected]> --- .../bindings/display/msm/qcom,dcp-dsi.yaml | 79 ++++++++++++ .../devicetree/bindings/display/msm/qcom,dcp.yaml | 123 +++++++++++++++++++ .../bindings/virtio/qcom,dcp-virtio.yaml | 132 +++++++++++++++++++++ 3 files changed, 334 insertions(+) diff --git a/Documentation/devicetree/bindings/display/msm/qcom,dcp-dsi.yaml b/Documentation/devicetree/bindings/display/msm/qcom,dcp-dsi.yaml new file mode 100644 index 000000000000..9a0acaf00bb3 --- /dev/null +++ b/Documentation/devicetree/bindings/display/msm/qcom,dcp-dsi.yaml @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/msm/qcom,dcp-dsi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm DCP DSI host + +maintainers: + - Jayant Shekhar <[email protected]> + +description: | + A MIPI DSI host exposed by the Qualcomm DCP VirtIO device (see + qcom,dcp.yaml). It follows the generic DSI controller binding, with panel + devices described as child nodes. The DCP INTF graph endpoint connects + directly to the panel; the DSI host node is not a graph endpoint. The host + node uses the dsi@N naming convention, and its reg property identifies the + DSI host index. + +allOf: + - $ref: /schemas/display/dsi-controller.yaml# + +properties: + reg: + maxItems: 1 + description: DSI host index matching the DCP output port. + +required: + - reg + - "#address-cells" + - "#size-cells" + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dcp-subsystem { + compatible = "virtio,device34"; + iommus = <&apps_smmu 0x400 0x2>; + + #address-cells = <1>; + #size-cells = <0>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dcp_intf0_out: endpoint { + remote-endpoint = <&panel_dcp_in>; + }; + }; + }; + + dsi@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + panel@0 { + compatible = "novatek,nt37801"; + reg = <0>; + + vddio-supply = <&vreg_l12b_1p8>; + vci-supply = <&vreg_l13b_3p0>; + vdd-supply = <&display_panel_vdd>; + reset-gpios = <&tlmm 210 GPIO_ACTIVE_LOW>; + + port { + panel_dcp_in: endpoint { + remote-endpoint = <&dcp_intf0_out>; + }; + }; + }; + }; + }; diff --git a/Documentation/devicetree/bindings/display/msm/qcom,dcp.yaml b/Documentation/devicetree/bindings/display/msm/qcom,dcp.yaml new file mode 100644 index 000000000000..96f6c2a17e9e --- /dev/null +++ b/Documentation/devicetree/bindings/display/msm/qcom,dcp.yaml @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/msm/qcom,dcp.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm Display Co-Processor (DCP) + +maintainers: + - Jayant Shekhar <[email protected]> + +description: | + The Display Co-Processor (DCP) is a firmware-owned display subsystem. + Linux communicates with DCP over HFI through VirtIO and does not access + display hardware registers directly. + + This node describes the externally connected display graph between DCP + INTF outputs and attached DSI panels. It is assigned to the VirtIO device + by the Qualcomm transport driver and is not independently enumerated. + Firmware capabilities and internal resources, including pipes, mixers, + CRTCs, and clocks, are discovered at runtime. + +allOf: + - $ref: /schemas/virtio/virtio-device.yaml# + +properties: + compatible: + const: virtio,device34 + + iommus: + maxItems: 1 + description: + SMMU context used by DCP firmware to access GEM framebuffers. This + is separate from the HFI transport context specified by the + iommus property on the parent DCP transport node. + The child context is used for framebuffer DMA performed by DCP + firmware, while the parent context is used for VirtIO transport and HFI + queue buffers. These contexts represent distinct firmware-visible DMA + address spaces and must not be used interchangeably. + + "#address-cells": + const: 1 + + "#size-cells": + const: 0 + + ports: + $ref: /schemas/graph.yaml#/properties/ports + description: | + DPU INTF output-only ports. The port number matches the firmware INTF + index. The corresponding DSI host is the child node whose reg value + matches the port number; the graph endpoint itself connects directly to + the attached panel. Unused INTF ports are omitted. + unevaluatedProperties: false + patternProperties: + "^port@[0-9a-f]+$": + $ref: /schemas/graph.yaml#/$defs/port-base + unevaluatedProperties: false + properties: + endpoint: + $ref: /schemas/graph.yaml#/$defs/endpoint-base + unevaluatedProperties: false + required: + - remote-endpoint + +patternProperties: + "^dsi@[0-9a-f]+$": + $ref: qcom,dcp-dsi.yaml# + +required: + - compatible + - iommus + - "#address-cells" + - "#size-cells" + - ports + +unevaluatedProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + + dcp-subsystem { + compatible = "virtio,device34"; + iommus = <&apps_smmu 0x400 0x2>; + + #address-cells = <1>; + #size-cells = <0>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dcp_intf0_out: endpoint { + remote-endpoint = <&panel_dcp_in>; + }; + }; + }; + + dsi@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + panel@0 { + compatible = "novatek,nt37801"; + reg = <0>; + + vddio-supply = <&vreg_l12b_1p8>; + vci-supply = <&vreg_l13b_3p0>; + vdd-supply = <&display_panel_vdd>; + reset-gpios = <&tlmm 210 GPIO_ACTIVE_LOW>; + + port { + panel_dcp_in: endpoint { + remote-endpoint = <&dcp_intf0_out>; + }; + }; + }; + }; + }; diff --git a/Documentation/devicetree/bindings/virtio/qcom,dcp-virtio.yaml b/Documentation/devicetree/bindings/virtio/qcom,dcp-virtio.yaml new file mode 100644 index 000000000000..6020e848ce25 --- /dev/null +++ b/Documentation/devicetree/bindings/virtio/qcom,dcp-virtio.yaml @@ -0,0 +1,132 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/virtio/qcom,dcp-virtio.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm DCP VirtIO transport + +maintainers: + - Jayant Shekhar <[email protected]> + +description: | + Qualcomm DCP VirtIO transport. The IPCC power-notify channel and + associated interrupts are required before the transport can access its + MMIO registers. This is a Qualcomm-specific transport and must not use the + generic virtio-mmio driver. The DCP VirtIO function is described as a child + node and is assigned to the registered VirtIO device by this transport. + +properties: + compatible: + const: qcom,dcp-virtio + + reg: + maxItems: 1 + + interrupts-extended: + minItems: 2 + maxItems: 2 + description: The VirtIO-MMIO and DCP power-notify interrupts, in that order. + + iommus: + maxItems: 1 + + iommu-ranges: + $ref: /schemas/types.yaml#/definitions/uint32-array + description: | + The firmware-visible IOVA range, specified as a four-cell tuple + containing a 64-bit IOVA base followed by a 64-bit range size. + items: + - description: IOVA base, high cell + $ref: /schemas/types.yaml#/definitions/uint32 + - description: IOVA base, low cell + $ref: /schemas/types.yaml#/definitions/uint32 + - description: IOVA range size, high cell + $ref: /schemas/types.yaml#/definitions/uint32 + - description: IOVA range size, low cell + $ref: /schemas/types.yaml#/definitions/uint32 + + dma-coherent: true + + mboxes: + maxItems: 1 + + mbox-names: + const: dcp-power-tx + + dcp-subsystem: + $ref: ../display/msm/qcom,dcp.yaml# + +required: + - compatible + - reg + - interrupts-extended + - iommus + - iommu-ranges + - dma-coherent + - mboxes + - mbox-names + - dcp-subsystem + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/interrupt-controller/irq.h> + #include <dt-bindings/mailbox/qcom-ipcc.h> + + virtio@9be8000 { + compatible = "qcom,dcp-virtio"; + reg = <0x09be8000 0x1000>; + interrupts-extended = <&intc GIC_ESPI 956 IRQ_TYPE_LEVEL_HIGH>, + <&ipcc 13 5 IRQ_TYPE_EDGE_RISING>; + iommus = <&apps_smmu 0x15a3 0x0>; + iommu-ranges = <0x0 0x84000000 0x0 0x04000000>; + dma-coherent; + mboxes = <&ipcc 13 5>; + mbox-names = "dcp-power-tx"; + + dcp-subsystem { + compatible = "virtio,device34"; + iommus = <&apps_smmu 0x400 0x2>; + + #address-cells = <1>; + #size-cells = <0>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dcp_intf0_out: endpoint { + remote-endpoint = <&panel_dcp_in>; + }; + }; + }; + + dsi@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + panel@0 { + compatible = "novatek,nt37801"; + reg = <0>; + + vddio-supply = <&vreg_l12b_1p8>; + vci-supply = <&vreg_l13b_3p0>; + vdd-supply = <&display_panel_vdd>; + reset-gpios = <&tlmm 210 GPIO_ACTIVE_LOW>; + + port { + panel_dcp_in: endpoint { + remote-endpoint = <&dcp_intf0_out>; + }; + }; + }; + }; + }; + }; -- 2.43.0
