# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
# Copyright 2019 Bootlin
%YAML 1.2
---
$id: http://devicetree.org/schemas/display/xylon,logicvc-display.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Xylon LogiCVC display controller
maintainers:
- Paul Kocialkowski <[email protected]>
description: |
The Xylon LogiCVC is a display controller that supports multiple layers.
It is usually implemented as programmable logic and was optimized for use
with Xilinx Zynq-7000 SoCs and Xilinx FPGAs.
Because the controller is intended for use in a FPGA, most of the
configuration of the controller takes place at logic configuration bitstream
synthesis time. As a result, many of the device-tree bindings are meant to
reflect the synthesis configuration and must not be configured differently.
Matching synthesis parameters are provided when applicable.
Layers are declared in the "layers" sub-node and have dedicated configuration.
In version 3 of the controller, each layer has fixed memory offset and address
starting from the video memory base address for its framebuffer. In version 4,
framebuffers are configured with a direct memory address instead.
properties:
compatible:
enum:
- xylon,logicvc-3.02.a-display
- xylon,logicvc-4.01.a-display
reg:
maxItems: 1
clocks:
minItems: 1
maxItems: 4
clock-names:
minItems: 1
items:
# vclk is required and must be provided as first item.
- const: vclk
# Other clocks are optional and can be provided in any order.
- enum:
- vclk2
- lvdsclk
- lvdsclkn
- enum:
- vclk2
- lvdsclk
- lvdsclkn
- enum:
- vclk2
- lvdsclk
- lvdsclkn
interrupts:
maxItems: 1
memory-region:
maxItems: 1
xylon,display-interface:
enum:
# Parallel RGB interface (C_DISPLAY_INTERFACE == 0)
- parallel-rgb
# ITU-T BR656 interface (C_DISPLAY_INTERFACE == 1)
- bt656
# 4-bit LVDS interface (C_DISPLAY_INTERFACE == 2)
- lvds-4bits
# 3-bit LVDS interface (C_DISPLAY_INTERFACE == 4)
- lvds-3bits
# DVI interface (C_DISPLAY_INTERFACE == 5)
- dvi
description: Display output interface (C_DISPLAY_INTERFACE).
xylon,display-colorspace:
enum:
# RGB colorspace (C_DISPLAY_COLOR_SPACE == 0)
- rgb
# YUV 4:2:2 colorspace (C_DISPLAY_COLOR_SPACE == 1)
- yuv422
# YUV 4:4:4 colorspace (C_DISPLAY_COLOR_SPACE == 2)
- yuv444
description: Display output colorspace (C_DISPLAY_COLOR_SPACE).
xylon,display-depth:
$ref: /schemas/types.yaml#/definitions/uint32
description: Display output depth (C_PIXEL_DATA_WIDTH).
xylon,row-stride:
$ref: /schemas/types.yaml#/definitions/uint32
description: Fixed number of pixels in a framebuffer row (C_ROW_STRIDE).
xylon,dithering:
$ref: /schemas/types.yaml#/definitions/flag
description: Dithering module is enabled (C_XCOLOR)
xylon,background-layer:
$ref: /schemas/types.yaml#/definitions/flag
description: |
The last layer is used to display a black background (C_USE_BACKGROUND).
The layer must still be registered.
xylon,layers-configurable:
$ref: /schemas/types.yaml#/definitions/flag
description: |
Configuration of layers' size, position and offset is enabled
(C_USE_SIZE_POSITION).
layers:
type: object
properties:
"#address-cells":
const: 1
"#size-cells":
const: 0
patternProperties:
"^layer@[0-9]+$":
type: object
properties:
reg:
maxItems: 1
xylon,layer-depth:
$ref: /schemas/types.yaml#/definitions/uint32
description: Layer depth (C_LAYER_X_DATA_WIDTH).
xylon,layer-colorspace:
enum:
# RGB colorspace (C_LAYER_X_TYPE == 0)
- rgb
# YUV packed colorspace (C_LAYER_X_TYPE == 0)
- yuv
description: Layer colorspace (C_LAYER_X_TYPE).
xylon,layer-alpha-mode:
enum:
# Alpha is configured layer-wide (C_LAYER_X_ALPHA_MODE == 0)
- layer
# Alpha is configured per-pixel (C_LAYER_X_ALPHA_MODE == 1)
- pixel
description: Alpha mode for the layer (C_LAYER_X_ALPHA_MODE).
xylon,layer-base-offset:
$ref: /schemas/types.yaml#/definitions/uint32
description: |
Offset in number of lines (C_LAYER_X_OFFSET) starting from the
video RAM base (C_VMEM_BASEADDR), only for version 3.
xylon,layer-buffer-offset:
$ref: /schemas/types.yaml#/definitions/uint32
description: |
Offset in number of lines (C_BUFFER_*_OFFSET) starting from the
layer base offset for the second buffer used in double-buffering.
xylon,layer-primary:
$ref: /schemas/types.yaml#/definitions/flag
description: |
Layer should be registered as a primary plane (exactly one is
required).
additionalProperties: false
required:
- reg
- xylon,layer-depth
- xylon,layer-colorspace
- xylon,layer-alpha-mode
required:
- "#address-cells"
- "#size-cells"
- layer@0
additionalProperties: false
description: |
The description of the display controller layers, containing layer
sub-nodes that each describe a registered layer.
port:
$ref: /schemas/graph.yaml#/properties/port
description: |
Video output port, typically connected to a panel or bridge.
additionalProperties: false
required:
- compatible
- reg
- clocks
- clock-names
- interrupts
- xylon,display-interface
- xylon,display-colorspace
- xylon,display-depth
- xylon,row-stride
- layers
- port
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
logicvc: logicvc@43c00000 {
compatible = "xylon,logicvc-3.02.a", "syscon", "simple-mfd";
reg = <0x43c00000 0x6000>;
#address-cells = <1>;
#size-cells = <1>;
logicvc_display: display@0 {
compatible = "xylon,logicvc-3.02.a-display";
reg = <0x0 0x6000>;
memory-region = <&logicvc_cma>;
clocks = <&logicvc_vclk 0>, <&logicvc_lvdsclk 0>;
clock-names = "vclk", "lvdsclk";
interrupt-parent = <&intc>;
interrupts = <0 34 IRQ_TYPE_LEVEL_HIGH>;
xylon,display-interface = "lvds-4bits";
xylon,display-colorspace = "rgb";
xylon,display-depth = <16>;
xylon,row-stride = <1024>;
xylon,layers-configurable;
layers {
#address-cells = <1>;
#size-cells = <0>;
layer@0 {
reg = <0>;
xylon,layer-depth = <16>;
xylon,layer-colorspace = "rgb";
xylon,layer-alpha-mode = "layer";
xylon,layer-base-offset = <0>;
xylon,layer-buffer-offset = <480>;
xylon,layer-primary;
};
layer@1 {
reg = <1>;
xylon,layer-depth = <16>;
xylon,layer-colorspace = "rgb";
xylon,layer-alpha-mode = "layer";
xylon,layer-base-offset = <2400>;
xylon,layer-buffer-offset = <480>;
};
layer@2 {
reg = <2>;
xylon,layer-depth = <16>;
xylon,layer-colorspace = "rgb";
xylon,layer-alpha-mode = "layer";
xylon,layer-base-offset = <960>;
xylon,layer-buffer-offset = <480>;
};
layer@3 {
reg = <3>;
xylon,layer-depth = <16>;
xylon,layer-colorspace = "rgb";
xylon,layer-alpha-mode = "layer";
xylon,layer-base-offset = <480>;
xylon,layer-buffer-offset = <480>;
};
layer@4 {
reg = <4>;
xylon,layer-depth = <16>;
xylon,layer-colorspace = "rgb";
xylon,layer-alpha-mode = "layer";
xylon,layer-base-offset = <8192>;
xylon,layer-buffer-offset = <480>;
};
};
port {
#address-cells = <1>;
#size-cells = <0>;
logicvc_output: endpoint@0 {
reg = <0>;
remote-endpoint = <&panel_input>;
};
};
};
};