<?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 Use is subject to license terms.

 CDDL HEADER START

 The contents of this file are subject to the terms of the
 Common Development and Distribution License (the "License").
 You may not use this file except in compliance with the License.

 You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 or http://www.opensolaris.org/os/licensing.
 See the License for the specific language governing permissions
 and limitations under the License.

 When distributing Covered Code, include this CDDL HEADER in each
 file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 If applicable, add the following below this CDDL HEADER, with the
 fields enclosed by brackets "[]" replaced with your own identifying
 information: Portions Copyright [yyyy] [name of copyright owner]

 CDDL HEADER END

    ident	"%Z%%M%	%I%	%E% SMI"
-->

<!--
  Topology description DTD

    Most attributes are string values (or an individual string from a
    restricted set), but attributes with a specific type requirement are
    noted in the comment describing the element.
-->

<!--
  XInclude support

    Topologies may be composed via the xi:include tag.
    libtopo(3LIB) interfaces enforce that all composed topologies be of the
    same scheme.
-->

<!ELEMENT xi:include
	(xi:fallback) >

<!ATTLIST xi:include
  href CDATA #REQUIRED
  parse (xml|text) "xml"
  encoding CDATA #IMPLIED
  xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude"
  >

<!ELEMENT xi:fallback
  ANY
  >
<!ATTLIST xi:fallback
  xmlns:xi CDATA #FIXED "http://www.w3.org/2001/XInclude"
  >

<!-- Properties and property groups -->

<!--
   propval

     This element is for a singly valued property within a property
     group.

     Its attributes are

	name	The name of this property.

	type	The data type for this property.

	value	The value for this property.  Must match type
		restriction of type attribute.

	immutable This value remains unchanged for the lifetime of a snapshot.
-->

<!ELEMENT propval EMPTY >

<!ATTLIST propval
	name		CDATA #REQUIRED
	type		( int32 | uint32 | int64 | uint64 |
			  string | fmri ) #REQUIRED
	value		CDATA #REQUIRED
	immutable	( true | false ) "true" >

<!--
  propgroup

    This element is for a set of related properties on a topo node
    It contains an optional stability element, as well as
    zero or more property-containing elements.

    Its attributes are

	name		The name of this property group.
	name-stability	Stability level of the property group name
	data-stability	Stability level of the property names and content
	version		Version of the propery group definition

-->

<!ELEMENT propgroup
	( propval* ) >

<!ATTLIST propgroup
	name		CDATA #REQUIRED
	version		CDATA #REQUIRED
	name-stability	( Private | Standard | Stable | Evolving | Unstable |
                        External | Obsolete ) #REQUIRED
	data-stability	( Private | Standard | Stable | Evolving | Unstable |
                        External | Obsolete ) #REQUIRED >

<!-- Methods -->

<!--
  enum-method

    This element describes the enumeration method used to
    populate a composition of topo nodes.  Its interpretation is
    left to the enumerator to which a particular topo node is
    assigned.  It contains a set of attributes, context, and an optional
    stability element for the optional args that can be included.

    Its attributes are

	name	Name of this method.  The method names are
		usually a defined interface of the enumerator to which a
		topo instance assigned.

	version Version of the enumeration API

-->

<!ELEMENT enum-method EMPTY >

<!ATTLIST enum-method
	name		CDATA #REQUIRED
	version		CDATA #REQUIRED >

<!--
  node

    This element identifies a known topology node.

    Its attributes are

	instance The instance number of the known node

	static	Boolean to determine if node is statically created
		by the XML parser or an enumerator

-->

<!ELEMENT node
	( propgroup*, dependents* ) >

<!ATTLIST node
	instance	CDATA #REQUIRED
	static          ( true | false ) "false" >

<!--
  dependents

	Ranges may have a number of "dependent" ranges, linked to
	the original range hierarchically as children or siblings. 

	Its attribute is:
		grouping	"children", "siblings"
-->

<!ELEMENT dependents 
	( range | xi:include )+ >

<!ATTLIST dependents 
	grouping ( children | siblings ) #REQUIRED >

<!--
  range

    This element identifies a range of possible topology nodes.

    Its attributes are

	name	The common name of all the possible topo nodes

	min	The smallest allowed instance number for an
		actual topo node.

	max	The largest allowed instance number for an
		actual topo node.

-->

<!ELEMENT range
	( enum-method?, node*, propgroup*, dependents* ) >

<!ATTLIST range
	name		CDATA #REQUIRED
	min		CDATA #REQUIRED
	max		CDATA #REQUIRED >

<!--
  topology

	This is the root-level for the scheme-specific topology

	Its attributes are:
		name	topology name
		scheme  "hc", "dev"
-->

<!ELEMENT topology
	(range* | xi:include*)>

<!ATTLIST topology
	name	CDATA #REQUIRED
	scheme (hc | dev) #REQUIRED >