Received: by 2002:a05:6a10:16a7:0:0:0:0 with SMTP id gp39csp375077pxb; Wed, 11 Nov 2020 06:03:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJzVV1HhsYUFBw0/lTxResYSpCJOed9hty0cKaHM6nWgleEzQMDQhjXDS+aoIg3RJ0VQsixp X-Received: by 2002:a5d:5643:: with SMTP id j3mr20490986wrw.43.1605103432645; Wed, 11 Nov 2020 06:03:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1605103432; cv=none; d=google.com; s=arc-20160816; b=hEj7604tSdnaAM6eLzc/7it2dB762kF3EJ7manTkAJhOhxD2CSLz8QNBLdFb9hBd2Q xe75aP5dMQxwMM8hxYK/VNKiZzANwz4lazOQB0wL4CUiFTjxsR0WkXDKKEQ3zzqFKT1z a7wPQ211wW3/GQ+ooQnwQlhvYmUzk0SECqVV/2Ew6SULWcpyaBwV3uKl+Q7q9F+EnPmJ tsOtb9YLuXjKPNbrn0gbrHJcmfKCUCKq3AZyp70sBkjNt0+DUSev7Aw+bWRw7rvEuWgz EFgyJS4nH4FQnptgVzNHNYzxW8HKrTh+sV5DDiescW6oJBmne+7COyVrERp61P9rIL7C UELw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=WqF6vdqUrO2LcNRJhEE1G0gegtJE061NzzfEi2QzxPo=; b=MeQANXfvaaIw7tZYZ1lejMuJ6CfPlIBXGWWqtMSQkIbCzw54FWm5lLwaSeWbrl9J0k crlEArdsqiZ2loDrdiJQ9szMrKy0I0RfkJ4BKt5ZDVVMrAZydXz1buG0B7kNo2HAxtDb f/pfwSv0/XvTsPnp321i7L+MhktrzbPqZxIfXqDGW8Tf/r0FYceJrmvg4S2bxVBEjXKQ X9HlYVlo9/w2e3cX9Qfq+SN27i8jmWUucAGo8VNMeNGSMOaQ5lYMc5+sGmInFqRaBqu8 q21+ZTnCVA1dT/pSVqc9yiSP9hrPkXr80AgDHE4ikxL1mdWKSGum3mbYc4WmfSeuzIrZ es4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=u96T04zA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b4si1581213edy.510.2020.11.11.06.03.26; Wed, 11 Nov 2020 06:03:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=u96T04zA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727027AbgKKOAU (ORCPT + 99 others); Wed, 11 Nov 2020 09:00:20 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726204AbgKKOAR (ORCPT ); Wed, 11 Nov 2020 09:00:17 -0500 Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7224DC0613D1; Wed, 11 Nov 2020 06:00:17 -0800 (PST) Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1B976A19; Wed, 11 Nov 2020 15:00:13 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1605103213; bh=mKuIU8+K1pEz/DAf9qGA5X2ulnU2pOxz9ZcXmP8HD6g=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=u96T04zATw1qPei0aXyrH2433zbXh1G9obPHYvbsb8oJMPdKIUvmSL36VIwDE1xyl VPpviWXc3ojSf7nYbaZOj23SUvEKeaaCjpLtrkcQLizYbR5OS4C4Bbont2A0FFfQ5I N7mD3h0IsIAtd7QLOpOVEDiK3qeLIgX3/nlBVjEE= Date: Wed, 11 Nov 2020 16:00:09 +0200 From: Laurent Pinchart To: Rob Herring Cc: devicetree@vger.kernel.org, Sameer Pujar , Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Thierry Reding , Sam Ravnborg , Philipp Zabel , kuninori.morimoto.gx@renesas.com, Jacopo Mondi Subject: Re: [PATCH v3 1/3] dt-bindings: Convert graph bindings to json-schema Message-ID: <20201111140009.GD4115@pendragon.ideasonboard.com> References: <20201102203656.220187-1-robh@kernel.org> <20201102203656.220187-2-robh@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20201102203656.220187-2-robh@kernel.org> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Rob and Sameer, Thank you for the patch. On Mon, Nov 02, 2020 at 02:36:54PM -0600, Rob Herring wrote: > From: Sameer Pujar > > Convert device tree bindings of graph to YAML format. Currently graph.txt > doc is referenced in multiple files and all of these need to use schema > references. For now graph.txt is updated to refer to graph.yaml. > > For users of the graph binding, they should reference to the graph > schema from either 'ports' or 'port' property: > > properties: > ports: > type: object > $ref: graph.yaml#/properties/ports > > properties: > port@0: > description: What data this port has > > ... > > Or: > > properties: > port: > description: What data this port has > type: object > $ref: graph.yaml#/properties/port Sounds like a good approach. > Signed-off-by: Sameer Pujar > Acked-by: Philipp Zabel > Signed-off-by: Rob Herring > --- > v3: > - Move port 'reg' to port@* and make required > - Make remote-endpoint required > - Add 'additionalProperties: true' now required > - Fix yamllint warnings > > Documentation/devicetree/bindings/graph.txt | 129 +----------- > Documentation/devicetree/bindings/graph.yaml | 199 +++++++++++++++++++ > 2 files changed, 200 insertions(+), 128 deletions(-) > create mode 100644 Documentation/devicetree/bindings/graph.yaml > > diff --git a/Documentation/devicetree/bindings/graph.txt b/Documentation/devicetree/bindings/graph.txt > index 0415e2c53ba0..b7818d61cef7 100644 > --- a/Documentation/devicetree/bindings/graph.txt > +++ b/Documentation/devicetree/bindings/graph.txt > @@ -1,128 +1 @@ > -Common bindings for device graphs > - > -General concept > ---------------- > - > -The hierarchical organisation of the device tree is well suited to describe > -control flow to devices, but there can be more complex connections between > -devices that work together to form a logical compound device, following an > -arbitrarily complex graph. > -There already is a simple directed graph between devices tree nodes using > -phandle properties pointing to other nodes to describe connections that > -can not be inferred from device tree parent-child relationships. The device > -tree graph bindings described herein abstract more complex devices that can > -have multiple specifiable ports, each of which can be linked to one or more > -ports of other devices. > - > -These common bindings do not contain any information about the direction or > -type of the connections, they just map their existence. Specific properties > -may be described by specialized bindings depending on the type of connection. > - > -To see how this binding applies to video pipelines, for example, see > -Documentation/devicetree/bindings/media/video-interfaces.txt. > -Here the ports describe data interfaces, and the links between them are > -the connecting data buses. A single port with multiple connections can > -correspond to multiple devices being connected to the same physical bus. > - > -Organisation of ports and endpoints > ------------------------------------ > - > -Ports are described by child 'port' nodes contained in the device node. > -Each port node contains an 'endpoint' subnode for each remote device port > -connected to this port. If a single port is connected to more than one > -remote device, an 'endpoint' child node must be provided for each link. > -If more than one port is present in a device node or there is more than one > -endpoint at a port, or a port node needs to be associated with a selected > -hardware interface, a common scheme using '#address-cells', '#size-cells' > -and 'reg' properties is used to number the nodes. > - > -device { > - ... > - #address-cells = <1>; > - #size-cells = <0>; > - > - port@0 { > - #address-cells = <1>; > - #size-cells = <0>; > - reg = <0>; > - > - endpoint@0 { > - reg = <0>; > - ... > - }; > - endpoint@1 { > - reg = <1>; > - ... > - }; > - }; > - > - port@1 { > - reg = <1>; > - > - endpoint { ... }; > - }; > -}; > - > -All 'port' nodes can be grouped under an optional 'ports' node, which > -allows to specify #address-cells, #size-cells properties for the 'port' > -nodes independently from any other child device nodes a device might > -have. > - > -device { > - ... > - ports { > - #address-cells = <1>; > - #size-cells = <0>; > - > - port@0 { > - ... > - endpoint@0 { ... }; > - endpoint@1 { ... }; > - }; > - > - port@1 { ... }; > - }; > -}; > - > -Links between endpoints > ------------------------ > - > -Each endpoint should contain a 'remote-endpoint' phandle property that points > -to the corresponding endpoint in the port of the remote device. In turn, the > -remote endpoint should contain a 'remote-endpoint' property. If it has one, it > -must not point to anything other than the local endpoint. Two endpoints with > -their 'remote-endpoint' phandles pointing at each other form a link between the > -containing ports. > - > -device-1 { > - port { > - device_1_output: endpoint { > - remote-endpoint = <&device_2_input>; > - }; > - }; > -}; > - > -device-2 { > - port { > - device_2_input: endpoint { > - remote-endpoint = <&device_1_output>; > - }; > - }; > -}; > - > -Required properties > -------------------- > - > -If there is more than one 'port' or more than one 'endpoint' node or 'reg' > -property present in the port and/or endpoint nodes then the following > -properties are required in a relevant parent node: > - > - - #address-cells : number of cells required to define port/endpoint > - identifier, should be 1. > - - #size-cells : should be zero. > - > -Optional endpoint properties > ----------------------------- > - > -- remote-endpoint: phandle to an 'endpoint' subnode of a remote device node. > - > +This file has moved to graph.yaml > diff --git a/Documentation/devicetree/bindings/graph.yaml b/Documentation/devicetree/bindings/graph.yaml > new file mode 100644 > index 000000000000..b56720c5a13e > --- /dev/null > +++ b/Documentation/devicetree/bindings/graph.yaml > @@ -0,0 +1,199 @@ > +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/graph.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: Common bindings for device graphs > + > +description: | > + The hierarchical organisation of the device tree is well suited to describe > + control flow to devices, but there can be more complex connections between > + devices that work together to form a logical compound device, following an > + arbitrarily complex graph. > + There already is a simple directed graph between devices tree nodes using > + phandle properties pointing to other nodes to describe connections that > + can not be inferred from device tree parent-child relationships. The device > + tree graph bindings described herein abstract more complex devices that can > + have multiple specifiable ports, each of which can be linked to one or more > + ports of other devices. > + > + These common bindings do not contain any information about the direction or > + type of the connections, they just map their existence. Specific properties > + may be described by specialized bindings depending on the type of connection. > + > + To see how this binding applies to video pipelines, for example, see > + Documentation/devicetree/bindings/media/video-interfaces.txt. > + Here the ports describe data interfaces, and the links between them are > + the connecting data buses. A single port with multiple connections can > + correspond to multiple devices being connected to the same physical bus. > + > +maintainers: > + - Philipp Zabel > + > +select: false > + > +properties: > + port: > + type: object > + description: > + If there is more than one endpoint node or 'reg' property present in > + endpoint nodes then '#address-cells' and '#size-cells' properties are > + required. > + > + properties: > + "#address-cells": > + const: 1 > + > + "#size-cells": > + const: 0 > + > + patternProperties: > + "^endpoint(@[0-9a-f]+)?$": > + type: object > + properties: > + reg: > + maxItems: 1 > + > + remote-endpoint: > + description: | > + phandle to an 'endpoint' subnode of a remote device node. > + $ref: /schemas/types.yaml#/definitions/phandle > + > + required: > + - remote-endpoint As noted elsewhere, this shouldn't be required. Should we set additionalProperties: false here ? > + > + ports: > + type: object > + description: | > + If there is more than one port node or 'reg' property present in port > + nodes then '#address-cells' and '#size-cells' properties are required. > + In such cases all port nodes can be grouped under 'ports' independently > + from any other child device nodes a device might have. Allowing multiple port nodes not grouped in a ports node has created complexity, with very little gain. Should we forbid that going forward ? > + > + properties: > + "#address-cells": > + const: 1 > + > + "#size-cells": > + const: 0 > + > + patternProperties: > + "^port(@[0-9a-f]+)?$": > + $ref: "#/properties/port" > + type: object > + > + properties: > + reg: > + maxItems: 1 > + > + required: > + - reg > + > + Maybe a single blank line ? Reviewed-by: Laurent Pinchart > + additionalProperties: false > + > +additionalProperties: true > + > +examples: > + # Organisation of ports and endpoints: > + # > + # Ports are described by child 'port' nodes contained in the device node. > + # Each port node contains an 'endpoint' subnode for each remote device port > + # connected to this port. If a single port is connected to more than one > + # remote device, an 'endpoint' child node must be provided for each link. > + # If more than one port is present in a device node or there is more than > + # one endpoint at a port, or a port node needs to be associated with a > + # selected hardware interface, a common scheme using '#address-cells', > + # '#size-cells' and 'reg' properties is used to number the nodes. > + - | > + device { > + #address-cells = <1>; > + #size-cells = <0>; > + > + port@0 { > + #address-cells = <1>; > + #size-cells = <0>; > + reg = <0>; > + > + endpoint@0 { > + reg = <0>; > + // ... > + }; > + endpoint@1 { > + reg = <1>; > + // ... > + }; > + }; > + > + port@1 { > + reg = <1>; > + > + endpoint { > + // ... > + }; > + }; > + }; > + > + # All 'port' nodes can be grouped under an optional 'ports' node, which > + # allows to specify #address-cells, #size-cells properties for the 'port' > + # nodes independently from any other child device nodes a device might > + # have. > + - | > + device { > + // ... > + ports { > + #address-cells = <1>; > + #size-cells = <0>; > + > + port@0 { > + #address-cells = <1>; > + #size-cells = <0>; > + reg = <0>; > + // ... > + > + endpoint@0 { > + reg = <0>; > + // ... > + }; > + endpoint@1 { > + reg = <1>; > + // ... > + }; > + }; > + > + port@1 { > + #address-cells = <1>; > + #size-cells = <0>; > + reg = <1>; > + // ... > + }; > + }; > + }; > + > + # Links between endpoints: > + # > + # Each endpoint should contain a 'remote-endpoint' phandle property that > + # points to the corresponding endpoint in the port of the remote device. > + # In turn, the remote endpoint should contain a 'remote-endpoint' property. > + # If it has one, it must not point to anything other than the local endpoint. > + # Two endpoints with their 'remote-endpoint' phandles pointing at each other > + # form a link between the containing ports. > + - | > + device-1 { > + port { > + device_1_output: endpoint { > + remote-endpoint = <&device_2_input>; > + }; > + }; > + }; > + > + device-2 { > + port { > + device_2_input: endpoint { > + remote-endpoint = <&device_1_output>; > + }; > + }; > + }; > + > +... -- Regards, Laurent Pinchart