| // Copyright 2020 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | library fuchsia.driver.framework; | 
 |  | 
 | using fuchsia.component; | 
 |  | 
 | using zx; | 
 | alias NodePropertyKey = string:256; | 
 | alias NodePropertyValueUint = uint32; | 
 | alias NodePropertyValueString = string:256; | 
 | alias NodePropertyValueBool = bool; | 
 | alias NodePropertyValueEnum = string:256; | 
 |  | 
 | const uint8 MAX_OFFER_COUNT = 64; | 
 | const uint8 MAX_SYMBOL_COUNT = 64; | 
 | const uint8 MAX_PROPERTY_COUNT = 64; | 
 |  | 
 | const uint8 MAX_NODE_NAME_LENGTH = 128; | 
 | const uint8 MAX_SYMBOL_NAME_LENGTH = 128; | 
 |  | 
 | /// Definition of a symbol provided by a driver for a node. A symbol is local to | 
 | /// a driver host. | 
 | table NodeSymbol { | 
 |     /// Name of the symbol. | 
 |     1: string:MAX_SYMBOL_NAME_LENGTH name; | 
 |  | 
 |     /// Virtual address of the symbol, within a driver host's process. | 
 |     2: zx.vaddr address; | 
 | }; | 
 |  | 
 | /// Definition of a property for a node. A property is commonly used to match a | 
 | /// node to a driver for driver binding. | 
 | table NodeProperty { | 
 |     /// Key for the property. | 
 |     1: uint32 key; | 
 |  | 
 |     /// Value for the property. | 
 |     2: uint32 value; | 
 | }; | 
 |  | 
 | /// Arguments for adding a node. | 
 | table NodeAddArgs { | 
 |     /// Name of the node. | 
 |     1: string:MAX_NODE_NAME_LENGTH name; | 
 |  | 
 |     /// FIDL services to offer to the driver that is bound to this node. | 
 |     2: vector<fuchsia.component.name>:MAX_OFFER_COUNT offers; | 
 |  | 
 |     /// Functions to provide to the driver that is bound to this node. | 
 |     3: vector<NodeSymbol>:MAX_SYMBOL_COUNT symbols; | 
 |  | 
 |     /// Properties of the node. | 
 |     4: vector<NodeProperty>:MAX_PROPERTY_COUNT properties; | 
 | }; | 
 |  | 
 | /// Protocol through which a parent node controls one of its children. | 
 | protocol NodeController { | 
 |     /// Removes the node and all of its children. | 
 |     Remove(); | 
 | }; | 
 |  | 
 | /// Protocol through which a driver manages a node that it is bound to. | 
 | protocol Node { | 
 |     /// Adds a child node to this node. | 
 |     /// | 
 |     /// If `node` is present, this driver takes responsibility for binding to | 
 |     /// the newly created child. Otherwise, the driver framework will locate an | 
 |     /// appropriate driver to bind the child to. | 
 |     AddChild(NodeAddArgs args, | 
 |              request<NodeController> controller, | 
 |              request<Node>? node); | 
 | }; |