.. -*- coding: utf-8; mode: rst -*-

.. _media_ioc_g_topology:

**************************
ioctl MEDIA_IOC_G_TOPOLOGY
**************************

Name
====

MEDIA_IOC_G_TOPOLOGY - Enumerate the graph topology and graph element properties


Synopsis
========

.. c:function:: int ioctl( int fd, MEDIA_IOC_G_TOPOLOGY, struct media_v2_topology *argp )
    :name: MEDIA_IOC_G_TOPOLOGY


Arguments
=========

``fd``
    File descriptor returned by :ref:`open() <media-func-open>`.

``argp``


Description
===========

The typical usage of this ioctl is to call it twice. On the first call,
the structure defined at struct
:c:type:`media_v2_topology` should be zeroed. At
return, if no errors happen, this ioctl will return the
``topology_version`` and the total number of entities, interfaces, pads
and links.

Before the second call, the userspace should allocate arrays to store
the graph elements that are desired, putting the pointers to them at the
ptr_entities, ptr_interfaces, ptr_links and/or ptr_pads, keeping the
other values untouched.

If the ``topology_version`` remains the same, the ioctl should fill the
desired arrays with the media graph elements.

.. tabularcolumns:: |p{1.6cm}|p{3.4cm}|p{12.5cm}|

.. c:type:: media_v2_topology

.. flat-table:: struct media_v2_topology
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8


    -  .. row 1

       -  __u64

       -  ``topology_version``

       -  Version of the media graph topology. When the graph is created,
	  this field starts with zero. Every time a graph element is added
	  or removed, this field is incremented.

    -  .. row 2

       -  __u64

       -  ``num_entities``

       -  Number of entities in the graph

    -  .. row 3

       -  __u64

       -  ``ptr_entities``

       -  A pointer to a memory area where the entities array will be
	  stored, converted to a 64-bits integer. It can be zero. if zero,
	  the ioctl won't store the entities. It will just update
	  ``num_entities``

    -  .. row 4

       -  __u64

       -  ``num_interfaces``

       -  Number of interfaces in the graph

    -  .. row 5

       -  __u64

       -  ``ptr_interfaces``

       -  A pointer to a memory area where the interfaces array will be
	  stored, converted to a 64-bits integer. It can be zero. if zero,
	  the ioctl won't store the interfaces. It will just update
	  ``num_interfaces``

    -  .. row 6

       -  __u64

       -  ``num_pads``

       -  Total number of pads in the graph

    -  .. row 7

       -  __u64

       -  ``ptr_pads``

       -  A pointer to a memory area where the pads array will be stored,
	  converted to a 64-bits integer. It can be zero. if zero, the ioctl
	  won't store the pads. It will just update ``num_pads``

    -  .. row 8

       -  __u64

       -  ``num_links``

       -  Total number of data and interface links in the graph

    -  .. row 9

       -  __u64

       -  ``ptr_links``

       -  A pointer to a memory area where the links array will be stored,
	  converted to a 64-bits integer. It can be zero. if zero, the ioctl
	  won't store the links. It will just update ``num_links``


.. tabularcolumns:: |p{1.6cm}|p{3.2cm}|p{12.7cm}|

.. c:type:: media_v2_entity

.. flat-table:: struct media_v2_entity
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8


    -  .. row 1

       -  __u32

       -  ``id``

       -  Unique ID for the entity.

    -  .. row 2

       -  char

       -  ``name``\ [64]

       -  Entity name as an UTF-8 NULL-terminated string.

    -  .. row 3

       -  __u32

       -  ``function``

       -  Entity main function, see :ref:`media-entity-type` for details.

    -  .. row 4

       -  __u32

       -  ``reserved``\ [12]

       -  Reserved for future extensions. Drivers and applications must set
	  this array to zero.


.. tabularcolumns:: |p{1.6cm}|p{3.2cm}|p{12.7cm}|

.. c:type:: media_v2_interface

.. flat-table:: struct media_v2_interface
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8

    -  .. row 1

       -  __u32

       -  ``id``

       -  Unique ID for the interface.

    -  .. row 2

       -  __u32

       -  ``intf_type``

       -  Interface type, see :ref:`media-intf-type` for details.

    -  .. row 3

       -  __u32

       -  ``flags``

       -  Interface flags. Currently unused.

    -  .. row 4

       -  __u32

       -  ``reserved``\ [9]

       -  Reserved for future extensions. Drivers and applications must set
	  this array to zero.

    -  .. row 5

       -  struct media_v2_intf_devnode

       -  ``devnode``

       -  Used only for device node interfaces. See
	  :c:type:`media_v2_intf_devnode` for details..


.. tabularcolumns:: |p{1.6cm}|p{3.2cm}|p{12.7cm}|

.. c:type:: media_v2_intf_devnode

.. flat-table:: struct media_v2_intf_devnode
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8


    -  .. row 1

       -  __u32

       -  ``major``

       -  Device node major number.

    -  .. row 2

       -  __u32

       -  ``minor``

       -  Device node minor number.


.. tabularcolumns:: |p{1.6cm}|p{3.2cm}|p{12.7cm}|

.. c:type:: media_v2_pad

.. flat-table:: struct media_v2_pad
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8


    -  .. row 1

       -  __u32

       -  ``id``

       -  Unique ID for the pad.

    -  .. row 2

       -  __u32

       -  ``entity_id``

       -  Unique ID for the entity where this pad belongs.

    -  .. row 3

       -  __u32

       -  ``flags``

       -  Pad flags, see :ref:`media-pad-flag` for more details.

    -  .. row 4

       -  __u32

       -  ``reserved``\ [9]

       -  Reserved for future extensions. Drivers and applications must set
	  this array to zero.


.. tabularcolumns:: |p{1.6cm}|p{3.2cm}|p{12.7cm}|

.. c:type:: media_v2_link

.. flat-table:: struct media_v2_link
    :header-rows:  0
    :stub-columns: 0
    :widths: 1 2 8


    -  .. row 1

       -  __u32

       -  ``id``

       -  Unique ID for the link.

    -  .. row 2

       -  __u32

       -  ``source_id``

       -  On pad to pad links: unique ID for the source pad.

	  On interface to entity links: unique ID for the entity.

    -  .. row 3

       -  __u32

       -  ``sink_id``

       -  On pad to pad links: unique ID for the sink pad.

	  On interface to entity links: unique ID for the entity.

    -  .. row 4

       -  __u32

       -  ``flags``

       -  Link flags, see :ref:`media-link-flag` for more details.

    -  .. row 5

       -  __u32

       -  ``reserved``\ [5]

       -  Reserved for future extensions. Drivers and applications must set
	  this array to zero.


Return Value
============

On success 0 is returned, on error -1 and the ``errno`` variable is set
appropriately. The generic error codes are described at the
:ref:`Generic Error Codes <gen-errors>` chapter.

ENOSPC
    This is returned when either one or more of the num_entities,
    num_interfaces, num_links or num_pads are non-zero and are
    smaller than the actual number of elements inside the graph. This
    may happen if the ``topology_version`` changed when compared to the
    last time this ioctl was called. Userspace should usually free the
    area for the pointers, zero the struct elements and call this ioctl
    again.
