.. -*- 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

       -  __u32

       -  ``num_entities``

       -  Number of entities in the graph

    -  .. row 3

       -  __u32

       -  ``reserved1``

       -  Applications and drivers shall set this to 0.

    -  .. row 4

       -  __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 5

       -  __u32

       -  ``num_interfaces``

       -  Number of interfaces in the graph

    -  .. row 6

       -  __u32

       -  ``reserved2``

       -  Applications and drivers shall set this to 0.

    -  .. row 7

       -  __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 8

       -  __u32

       -  ``num_pads``

       -  Total number of pads in the graph

    -  .. row 9

       -  __u32

       -  ``reserved3``

       -  Applications and drivers shall set this to 0.

    -  .. row 10

       -  __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 11

       -  __u32

       -  ``num_links``

       -  Total number of data and interface links in the graph

    -  .. row 12

       -  __u32

       -  ``reserved4``

       -  Applications and drivers shall set this to 0.

    -  .. row 13

       -  __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-functions` for details.

    -  .. row 4

       -  __u32

       -  ``reserved``\ [6]

       -  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``\ [5]

       -  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 interface.

    -  .. 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``\ [6]

       -  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.
