xref: /openbmc/qemu/docs/devel/clocks.rst (revision f774a677507966222624a9b2859f06ede7608100)
131e5784aSPeter MaydellModelling a clock tree in QEMU
231e5784aSPeter Maydell==============================
331e5784aSPeter Maydell
431e5784aSPeter MaydellWhat are clocks?
531e5784aSPeter Maydell----------------
631e5784aSPeter Maydell
731e5784aSPeter MaydellClocks are QOM objects developed for the purpose of modelling the
831e5784aSPeter Maydelldistribution of clocks in QEMU.
931e5784aSPeter Maydell
1031e5784aSPeter MaydellThey allow us to model the clock distribution of a platform and detect
1131e5784aSPeter Maydellconfiguration errors in the clock tree such as badly configured PLL, clock
1231e5784aSPeter Maydellsource selection or disabled clock.
1331e5784aSPeter Maydell
1431e5784aSPeter MaydellThe object is *Clock* and its QOM name is ``clock`` (in C code, the macro
1531e5784aSPeter Maydell``TYPE_CLOCK``).
1631e5784aSPeter Maydell
1731e5784aSPeter MaydellClocks are typically used with devices where they are used to model inputs
1831e5784aSPeter Maydelland outputs. They are created in a similar way to GPIOs. Inputs and outputs
1931e5784aSPeter Maydellof different devices can be connected together.
2031e5784aSPeter Maydell
2131e5784aSPeter MaydellIn these cases a Clock object is a child of a Device object, but this
2231e5784aSPeter Maydellis not a requirement. Clocks can be independent of devices. For
2331e5784aSPeter Maydellexample it is possible to create a clock outside of any device to
2431e5784aSPeter Maydellmodel the main clock source of a machine.
2531e5784aSPeter Maydell
2631e5784aSPeter MaydellHere is an example of clocks::
2731e5784aSPeter Maydell
2831e5784aSPeter Maydell    +---------+      +----------------------+   +--------------+
2931e5784aSPeter Maydell    | Clock 1 |      |       Device B       |   |   Device C   |
3031e5784aSPeter Maydell    |         |      | +-------+  +-------+ |   | +-------+    |
3131e5784aSPeter Maydell    |         |>>-+-->>|Clock 2|  |Clock 3|>>--->>|Clock 6|    |
3231e5784aSPeter Maydell    +---------+   |  | | (in)  |  | (out) | |   | | (in)  |    |
3331e5784aSPeter Maydell                  |  | +-------+  +-------+ |   | +-------+    |
3431e5784aSPeter Maydell                  |  |            +-------+ |   +--------------+
3531e5784aSPeter Maydell                  |  |            |Clock 4|>>
3631e5784aSPeter Maydell                  |  |            | (out) | |   +--------------+
3731e5784aSPeter Maydell                  |  |            +-------+ |   |   Device D   |
3831e5784aSPeter Maydell                  |  |            +-------+ |   | +-------+    |
3931e5784aSPeter Maydell                  |  |            |Clock 5|>>--->>|Clock 7|    |
4031e5784aSPeter Maydell                  |  |            | (out) | |   | | (in)  |    |
4131e5784aSPeter Maydell                  |  |            +-------+ |   | +-------+    |
4231e5784aSPeter Maydell                  |  +----------------------+   |              |
4331e5784aSPeter Maydell                  |                             | +-------+    |
4431e5784aSPeter Maydell                  +----------------------------->>|Clock 8|    |
4531e5784aSPeter Maydell                                                | | (in)  |    |
4631e5784aSPeter Maydell                                                | +-------+    |
4731e5784aSPeter Maydell                                                +--------------+
4831e5784aSPeter Maydell
4931e5784aSPeter MaydellClocks are defined in the ``include/hw/clock.h`` header and device
5031e5784aSPeter Maydellrelated functions are defined in the ``include/hw/qdev-clock.h``
5131e5784aSPeter Maydellheader.
5231e5784aSPeter Maydell
5331e5784aSPeter MaydellThe clock state
5431e5784aSPeter Maydell---------------
5531e5784aSPeter Maydell
5631e5784aSPeter MaydellThe state of a clock is its period; it is stored as an integer
5731e5784aSPeter Maydellrepresenting it in units of 2 :sup:`-32` ns. The special value of 0 is used to
5831e5784aSPeter Maydellrepresent the clock being inactive or gated. The clocks do not model
5931e5784aSPeter Maydellthe signal itself (pin toggling) or other properties such as the duty
6031e5784aSPeter Maydellcycle.
6131e5784aSPeter Maydell
6231e5784aSPeter MaydellAll clocks contain this state: outputs as well as inputs. This allows
6331e5784aSPeter Maydellthe current period of a clock to be fetched at any time. When a clock
6431e5784aSPeter Maydellis updated, the value is immediately propagated to all connected
6531e5784aSPeter Maydellclocks in the tree.
6631e5784aSPeter Maydell
6731e5784aSPeter MaydellTo ease interaction with clocks, helpers with a unit suffix are defined for
6831e5784aSPeter Maydellevery clock state setter or getter. The suffixes are:
6931e5784aSPeter Maydell
7031e5784aSPeter Maydell- ``_ns`` for handling periods in nanoseconds
7131e5784aSPeter Maydell- ``_hz`` for handling frequencies in hertz
7231e5784aSPeter Maydell
7331e5784aSPeter MaydellThe 0 period value is converted to 0 in hertz and vice versa. 0 always means
7431e5784aSPeter Maydellthat the clock is disabled.
7531e5784aSPeter Maydell
7631e5784aSPeter MaydellAdding a new clock
7731e5784aSPeter Maydell------------------
7831e5784aSPeter Maydell
7931e5784aSPeter MaydellAdding clocks to a device must be done during the init method of the Device
8031e5784aSPeter Maydellinstance.
8131e5784aSPeter Maydell
8231e5784aSPeter MaydellTo add an input clock to a device, the function ``qdev_init_clock_in()``
835ee0abedSPeter Maydellmust be used.  It takes the name, a callback, an opaque parameter
845ee0abedSPeter Maydellfor the callback and a mask of events when the callback should be
855ee0abedSPeter Maydellcalled (this will be explained in a following section).
8631e5784aSPeter MaydellOutput is simpler; only the name is required. Typically::
8731e5784aSPeter Maydell
885ee0abedSPeter Maydell    qdev_init_clock_in(DEVICE(dev), "clk_in", clk_in_callback, dev, ClockUpdate);
8931e5784aSPeter Maydell    qdev_init_clock_out(DEVICE(dev), "clk_out");
9031e5784aSPeter Maydell
9131e5784aSPeter MaydellBoth functions return the created Clock pointer, which should be saved in the
9231e5784aSPeter Maydelldevice's state structure for further use.
9331e5784aSPeter Maydell
9431e5784aSPeter MaydellThese objects will be automatically deleted by the QOM reference mechanism.
9531e5784aSPeter Maydell
9631e5784aSPeter MaydellNote that it is possible to create a static array describing clock inputs and
9731e5784aSPeter Maydelloutputs. The function ``qdev_init_clocks()`` must be called with the array as
9831e5784aSPeter Maydellparameter to initialize the clocks: it has the same behaviour as calling the
9931e5784aSPeter Maydell``qdev_init_clock_in/out()`` for each clock in the array. To ease the array
10031e5784aSPeter Maydellconstruction, some macros are defined in ``include/hw/qdev-clock.h``.
10131e5784aSPeter MaydellAs an example, the following creates 2 clocks to a device: one input and one
10231e5784aSPeter Maydelloutput.
10331e5784aSPeter Maydell
10431e5784aSPeter Maydell.. code-block:: c
10531e5784aSPeter Maydell
10631e5784aSPeter Maydell    /* device structure containing pointers to the clock objects */
10731e5784aSPeter Maydell    typedef struct MyDeviceState {
10831e5784aSPeter Maydell        DeviceState parent_obj;
10931e5784aSPeter Maydell        Clock *clk_in;
11031e5784aSPeter Maydell        Clock *clk_out;
11131e5784aSPeter Maydell    } MyDeviceState;
11231e5784aSPeter Maydell
11331e5784aSPeter Maydell    /*
11431e5784aSPeter Maydell     * callback for the input clock (see "Callback on input clock
11531e5784aSPeter Maydell     * change" section below for more information).
11631e5784aSPeter Maydell     */
1175ee0abedSPeter Maydell    static void clk_in_callback(void *opaque, ClockEvent event);
11831e5784aSPeter Maydell
11931e5784aSPeter Maydell    /*
12031e5784aSPeter Maydell     * static array describing clocks:
12131e5784aSPeter Maydell     * + a clock input named "clk_in", whose pointer is stored in
12231e5784aSPeter Maydell     *   the clk_in field of a MyDeviceState structure with callback
12331e5784aSPeter Maydell     *   clk_in_callback.
12431e5784aSPeter Maydell     * + a clock output named "clk_out" whose pointer is stored in
12531e5784aSPeter Maydell     *   the clk_out field of a MyDeviceState structure.
12631e5784aSPeter Maydell     */
12731e5784aSPeter Maydell    static const ClockPortInitArray mydev_clocks = {
1285ee0abedSPeter Maydell        QDEV_CLOCK_IN(MyDeviceState, clk_in, clk_in_callback, ClockUpdate),
12931e5784aSPeter Maydell        QDEV_CLOCK_OUT(MyDeviceState, clk_out),
13031e5784aSPeter Maydell        QDEV_CLOCK_END
13131e5784aSPeter Maydell    };
13231e5784aSPeter Maydell
13331e5784aSPeter Maydell    /* device initialization function */
13431e5784aSPeter Maydell    static void mydev_init(Object *obj)
13531e5784aSPeter Maydell    {
13631e5784aSPeter Maydell        /* cast to MyDeviceState */
13731e5784aSPeter Maydell        MyDeviceState *mydev = MYDEVICE(obj);
13831e5784aSPeter Maydell        /* create and fill the pointer fields in the MyDeviceState */
13931e5784aSPeter Maydell        qdev_init_clocks(mydev, mydev_clocks);
14031e5784aSPeter Maydell        [...]
14131e5784aSPeter Maydell    }
14231e5784aSPeter Maydell
14331e5784aSPeter MaydellAn alternative way to create a clock is to simply call
14431e5784aSPeter Maydell``object_new(TYPE_CLOCK)``. In that case the clock will neither be an
14531e5784aSPeter Maydellinput nor an output of a device. After the whole QOM hierarchy of the
14631e5784aSPeter Maydellclock has been set ``clock_setup_canonical_path()`` should be called.
14731e5784aSPeter Maydell
14831e5784aSPeter MaydellAt creation, the period of the clock is 0: the clock is disabled. You can
14931e5784aSPeter Maydellchange it using ``clock_set_ns()`` or ``clock_set_hz()``.
15031e5784aSPeter Maydell
15131e5784aSPeter MaydellNote that if you are creating a clock with a fixed period which will never
15231e5784aSPeter Maydellchange (for example the main clock source of a board), then you'll have
15331e5784aSPeter Maydellnothing else to do. This value will be propagated to other clocks when
15431e5784aSPeter Maydellconnecting the clocks together and devices will fetch the right value during
15531e5784aSPeter Maydellthe first reset.
15631e5784aSPeter Maydell
1575ee0abedSPeter MaydellClock callbacks
1585ee0abedSPeter Maydell---------------
1595ee0abedSPeter Maydell
1605ee0abedSPeter MaydellYou can give a clock a callback function in several ways:
1615ee0abedSPeter Maydell
1625ee0abedSPeter Maydell * by passing it as an argument to ``qdev_init_clock_in()``
1635ee0abedSPeter Maydell * as an argument to the ``QDEV_CLOCK_IN()`` macro initializing an
1645ee0abedSPeter Maydell   array to be passed to ``qdev_init_clocks()``
1655ee0abedSPeter Maydell * by directly calling the ``clock_set_callback()`` function
1665ee0abedSPeter Maydell
1675ee0abedSPeter MaydellThe callback function must be of this type:
1685ee0abedSPeter Maydell
1695ee0abedSPeter Maydell.. code-block:: c
1705ee0abedSPeter Maydell
1715ee0abedSPeter Maydell   typedef void ClockCallback(void *opaque, ClockEvent event);
1725ee0abedSPeter Maydell
1735ee0abedSPeter MaydellThe ``opaque`` argument is the pointer passed to ``qdev_init_clock_in()``
1745ee0abedSPeter Maydellor ``clock_set_callback()``; for ``qdev_init_clocks()`` it is the
1755ee0abedSPeter Maydell``dev`` device pointer.
1765ee0abedSPeter Maydell
1775ee0abedSPeter MaydellThe ``event`` argument specifies why the callback has been called.
1785ee0abedSPeter MaydellWhen you register the callback you specify a mask of ClockEvent values
1795ee0abedSPeter Maydellthat you are interested in. The callback will only be called for those
1805ee0abedSPeter Maydellevents.
1815ee0abedSPeter Maydell
1825ee0abedSPeter MaydellThe events currently supported are:
1835ee0abedSPeter Maydell
184e4341623SPeter Maydell * ``ClockPreUpdate`` : called when the input clock's period is about to
185e4341623SPeter Maydell   update. This is useful if the device needs to do some action for
186e4341623SPeter Maydell   which it needs to know the old value of the clock period. During
187e4341623SPeter Maydell   this callback, Clock API functions like ``clock_get()`` or
188e4341623SPeter Maydell   ``clock_ticks_to_ns()`` will use the old period.
189e4341623SPeter Maydell * ``ClockUpdate`` : called after the input clock's period has changed.
190e4341623SPeter Maydell   During this callback, Clock API functions like ``clock_ticks_to_ns()``
191e4341623SPeter Maydell   will use the new period.
1925ee0abedSPeter Maydell
1935ee0abedSPeter MaydellNote that a clock only has one callback: it is not possible to register
1945ee0abedSPeter Maydelldifferent functions for different events. You must register a single
1955ee0abedSPeter Maydellcallback which listens for all of the events you are interested in,
1965ee0abedSPeter Maydelland use the ``event`` argument to identify which event has happened.
1975ee0abedSPeter Maydell
19831e5784aSPeter MaydellRetrieving clocks from a device
19931e5784aSPeter Maydell-------------------------------
20031e5784aSPeter Maydell
20131e5784aSPeter Maydell``qdev_get_clock_in()`` and ``dev_get_clock_out()`` are available to
20231e5784aSPeter Maydellget the clock inputs or outputs of a device. For example:
20331e5784aSPeter Maydell
20431e5784aSPeter Maydell.. code-block:: c
20531e5784aSPeter Maydell
20631e5784aSPeter Maydell   Clock *clk = qdev_get_clock_in(DEVICE(mydev), "clk_in");
20731e5784aSPeter Maydell
20831e5784aSPeter Maydellor:
20931e5784aSPeter Maydell
21031e5784aSPeter Maydell.. code-block:: c
21131e5784aSPeter Maydell
21231e5784aSPeter Maydell   Clock *clk = qdev_get_clock_out(DEVICE(mydev), "clk_out");
21331e5784aSPeter Maydell
21431e5784aSPeter MaydellConnecting two clocks together
21531e5784aSPeter Maydell------------------------------
21631e5784aSPeter Maydell
21731e5784aSPeter MaydellTo connect two clocks together, use the ``clock_set_source()`` function.
21831e5784aSPeter MaydellGiven two clocks ``clk1``, and ``clk2``, ``clock_set_source(clk2, clk1);``
21931e5784aSPeter Maydellconfigures ``clk2`` to follow the ``clk1`` period changes. Every time ``clk1``
22031e5784aSPeter Maydellis updated, ``clk2`` will be updated too.
22131e5784aSPeter Maydell
22231e5784aSPeter MaydellWhen connecting clock between devices, prefer using the
22331e5784aSPeter Maydell``qdev_connect_clock_in()`` function to set the source of an input
22431e5784aSPeter Maydelldevice clock.  For example, to connect the input clock ``clk2`` of
22531e5784aSPeter Maydell``devB`` to the output clock ``clk1`` of ``devA``, do:
22631e5784aSPeter Maydell
22731e5784aSPeter Maydell.. code-block:: c
22831e5784aSPeter Maydell
22931e5784aSPeter Maydell    qdev_connect_clock_in(devB, "clk2", qdev_get_clock_out(devA, "clk1"))
23031e5784aSPeter Maydell
23131e5784aSPeter MaydellWe used ``qdev_get_clock_out()`` above, but any clock can drive an
23231e5784aSPeter Maydellinput clock, even another input clock. The following diagram shows
23331e5784aSPeter Maydellsome examples of connections. Note also that a clock can drive several
23431e5784aSPeter Maydellother clocks.
23531e5784aSPeter Maydell
23631e5784aSPeter Maydell::
23731e5784aSPeter Maydell
23831e5784aSPeter Maydell  +------------+  +--------------------------------------------------+
23931e5784aSPeter Maydell  |  Device A  |  |                   Device B                       |
24031e5784aSPeter Maydell  |            |  |               +---------------------+            |
24131e5784aSPeter Maydell  |            |  |               |       Device C      |            |
24231e5784aSPeter Maydell  |  +-------+ |  | +-------+     | +-------+ +-------+ |  +-------+ |
24331e5784aSPeter Maydell  |  |Clock 1|>>-->>|Clock 2|>>+-->>|Clock 3| |Clock 5|>>>>|Clock 6|>>
24431e5784aSPeter Maydell  |  | (out) | |  | | (in)  |  |  | | (in)  | | (out) | |  | (out) | |
24531e5784aSPeter Maydell  |  +-------+ |  | +-------+  |  | +-------+ +-------+ |  +-------+ |
24631e5784aSPeter Maydell  +------------+  |            |  +---------------------+            |
24731e5784aSPeter Maydell                  |            |                                     |
24831e5784aSPeter Maydell                  |            |  +--------------+                   |
24931e5784aSPeter Maydell                  |            |  |   Device D   |                   |
25031e5784aSPeter Maydell                  |            |  | +-------+    |                   |
25131e5784aSPeter Maydell                  |            +-->>|Clock 4|    |                   |
25231e5784aSPeter Maydell                  |               | | (in)  |    |                   |
25331e5784aSPeter Maydell                  |               | +-------+    |                   |
25431e5784aSPeter Maydell                  |               +--------------+                   |
25531e5784aSPeter Maydell                  +--------------------------------------------------+
25631e5784aSPeter Maydell
25731e5784aSPeter MaydellIn the above example, when *Clock 1* is updated by *Device A*, three
25831e5784aSPeter Maydellclocks get the new clock period value: *Clock 2*, *Clock 3* and *Clock 4*.
25931e5784aSPeter Maydell
26031e5784aSPeter MaydellIt is not possible to disconnect a clock or to change the clock connection
26131e5784aSPeter Maydellafter it is connected.
26231e5784aSPeter Maydell
26399abcbc7SPeter MaydellClock multiplier and divider settings
26499abcbc7SPeter Maydell-------------------------------------
26599abcbc7SPeter Maydell
26699abcbc7SPeter MaydellBy default, when clocks are connected together, the child
26799abcbc7SPeter Maydellclocks run with the same period as their source (parent) clock.
26899abcbc7SPeter MaydellThe Clock API supports a built-in period multiplier/divider
26999abcbc7SPeter Maydellmechanism so you can configure a clock to make its children
27099abcbc7SPeter Maydellrun at a different period from its own. If you call the
27199abcbc7SPeter Maydell``clock_set_mul_div()`` function you can specify the clock's
27299abcbc7SPeter Maydellmultiplier and divider values. The children of that clock
27399abcbc7SPeter Maydellwill all run with a period of ``parent_period * multiplier / divider``.
27499abcbc7SPeter MaydellFor instance, if the clock has a frequency of 8MHz and you set its
27599abcbc7SPeter Maydellmultiplier to 2 and its divider to 3, the child clocks will run
27699abcbc7SPeter Maydellat 12MHz.
27799abcbc7SPeter Maydell
27899abcbc7SPeter MaydellYou can change the multiplier and divider of a clock at runtime,
27999abcbc7SPeter Maydellso you can use this to model clock controller devices which
28099abcbc7SPeter Maydellhave guest-programmable frequency multipliers or dividers.
28199abcbc7SPeter Maydell
282f6822feeSStefan WeilSimilarly to ``clock_set()``, ``clock_set_mul_div()`` returns ``true`` if
28352405b7fSPhilippe Mathieu-Daudéthe clock state was modified; that is, if the multiplier or the diviser
28452405b7fSPhilippe Mathieu-Daudéor both were changed by the call.
28552405b7fSPhilippe Mathieu-Daudé
28699abcbc7SPeter MaydellNote that ``clock_set_mul_div()`` does not automatically call
28799abcbc7SPeter Maydell``clock_propagate()``. If you make a runtime change to the
28899abcbc7SPeter Maydellmultiplier or divider you must call clock_propagate() yourself.
28999abcbc7SPeter Maydell
29031e5784aSPeter MaydellUnconnected input clocks
29131e5784aSPeter Maydell------------------------
29231e5784aSPeter Maydell
29331e5784aSPeter MaydellA newly created input clock is disabled (period of 0). This means the
29431e5784aSPeter Maydellclock will be considered as disabled until the period is updated. If
29531e5784aSPeter Maydellthe clock remains unconnected it will always keep its initial value
29631e5784aSPeter Maydellof 0. If this is not the desired behaviour, ``clock_set()``,
29731e5784aSPeter Maydell``clock_set_ns()`` or ``clock_set_hz()`` should be called on the Clock
29831e5784aSPeter Maydellobject during device instance init. For example:
29931e5784aSPeter Maydell
30031e5784aSPeter Maydell.. code-block:: c
30131e5784aSPeter Maydell
30231e5784aSPeter Maydell    clk = qdev_init_clock_in(DEVICE(dev), "clk-in", clk_in_callback,
3035ee0abedSPeter Maydell                             dev, ClockUpdate);
30431e5784aSPeter Maydell    /* set initial value to 10ns / 100MHz */
30531e5784aSPeter Maydell    clock_set_ns(clk, 10);
30631e5784aSPeter Maydell
307132b1025SPeter MaydellTo enforce that the clock is wired up by the board code, you can
308132b1025SPeter Maydellcall ``clock_has_source()`` in your device's realize method:
309132b1025SPeter Maydell
310132b1025SPeter Maydell.. code-block:: c
311132b1025SPeter Maydell
312132b1025SPeter Maydell   if (!clock_has_source(s->clk)) {
313132b1025SPeter Maydell       error_setg(errp, "MyDevice: clk input must be connected");
314132b1025SPeter Maydell       return;
315132b1025SPeter Maydell   }
316132b1025SPeter Maydell
317132b1025SPeter MaydellNote that this only checks that the clock has been wired up; it is
318132b1025SPeter Maydellstill possible that the output clock connected to it is disabled
319132b1025SPeter Maydellor has not yet been configured, in which case the period will be
320132b1025SPeter Maydellzero. You should use the clock callback to find out when the clock
321132b1025SPeter Maydellperiod changes.
322132b1025SPeter Maydell
32331e5784aSPeter MaydellFetching clock frequency/period
32431e5784aSPeter Maydell-------------------------------
32531e5784aSPeter Maydell
326de6a65f1SPeter MaydellTo get the current state of a clock, use the functions ``clock_get()``
327de6a65f1SPeter Maydellor ``clock_get_hz()``.
328de6a65f1SPeter Maydell
329de6a65f1SPeter Maydell``clock_get()`` returns the period of the clock in its fully precise
330de6a65f1SPeter Maydellinternal representation, as an unsigned 64-bit integer in units of
331de6a65f1SPeter Maydell2^-32 nanoseconds. (For many purposes ``clock_ticks_to_ns()`` will
332de6a65f1SPeter Maydellbe more convenient; see the section below on expiry deadlines.)
333de6a65f1SPeter Maydell
334de6a65f1SPeter Maydell``clock_get_hz()`` returns the frequency of the clock, rounded to the
335de6a65f1SPeter Maydellnext lowest integer. This implies some inaccuracy due to the rounding,
336de6a65f1SPeter Maydellso be cautious about using it in calculations.
33731e5784aSPeter Maydell
33831e5784aSPeter MaydellIt is also possible to register a callback on clock frequency changes.
3395ee0abedSPeter MaydellHere is an example, which assumes that ``clock_callback`` has been
3405ee0abedSPeter Maydellspecified as the callback for the ``ClockUpdate`` event:
34131e5784aSPeter Maydell
34231e5784aSPeter Maydell.. code-block:: c
34331e5784aSPeter Maydell
3445ee0abedSPeter Maydell    void clock_callback(void *opaque, ClockEvent event) {
34531e5784aSPeter Maydell        MyDeviceState *s = (MyDeviceState *) opaque;
34631e5784aSPeter Maydell        /*
34731e5784aSPeter Maydell         * 'opaque' is the argument passed to qdev_init_clock_in();
34831e5784aSPeter Maydell         * usually this will be the device state pointer.
34931e5784aSPeter Maydell         */
35031e5784aSPeter Maydell
35131e5784aSPeter Maydell        /* do something with the new period */
352de6a65f1SPeter Maydell        fprintf(stdout, "device new period is %" PRIu64 "* 2^-32 ns\n",
353de6a65f1SPeter Maydell                        clock_get(dev->my_clk_input));
35431e5784aSPeter Maydell    }
35531e5784aSPeter Maydell
356b7cd9c1eSPeter MaydellIf you are only interested in the frequency for displaying it to
357b7cd9c1eSPeter Maydellhumans (for instance in debugging), use ``clock_display_freq()``,
358b7cd9c1eSPeter Maydellwhich returns a prettified string-representation, e.g. "33.3 MHz".
359b7cd9c1eSPeter MaydellThe caller must free the string with g_free() after use.
360b7cd9c1eSPeter Maydell
361*9240d65eSInès VarholIt's also possible to retrieve the clock period from a QTest by
362*9240d65eSInès Varholaccessing QOM property ``qtest-clock-period`` using a QMP command.
363*9240d65eSInès VarholThis property is only present when the device is being run under
364*9240d65eSInès Varholthe ``qtest`` accelerator; it is not available when QEMU is
365*9240d65eSInès Varholbeing run normally.
366*9240d65eSInès Varhol
367554d5237SPeter MaydellCalculating expiry deadlines
368554d5237SPeter Maydell----------------------------
369554d5237SPeter Maydell
370554d5237SPeter MaydellA commonly required operation for a clock is to calculate how long
371554d5237SPeter Maydellit will take for the clock to tick N times; this can then be used
372554d5237SPeter Maydellto set a timer expiry deadline. Use the function ``clock_ticks_to_ns()``,
373554d5237SPeter Maydellwhich takes an unsigned 64-bit count of ticks and returns the length
374554d5237SPeter Maydellof time in nanoseconds required for the clock to tick that many times.
375554d5237SPeter Maydell
376554d5237SPeter MaydellIt is important not to try to calculate expiry deadlines using a
377554d5237SPeter Maydellshortcut like multiplying a "period of clock in nanoseconds" value
378554d5237SPeter Maydellby the tick count, because clocks can have periods which are not a
379554d5237SPeter Maydellwhole number of nanoseconds, and the accumulated error in the
380554d5237SPeter Maydellmultiplication can be significant.
381554d5237SPeter Maydell
382554d5237SPeter MaydellFor a clock with a very long period and a large number of ticks,
383554d5237SPeter Maydellthe result of this function could in theory be too large to fit in
384554d5237SPeter Maydella 64-bit value. To avoid overflow in this case, ``clock_ticks_to_ns()``
385554d5237SPeter Maydellsaturates the result to INT64_MAX (because this is the largest valid
386554d5237SPeter Maydellinput to the QEMUTimer APIs). Since INT64_MAX nanoseconds is almost
387554d5237SPeter Maydell300 years, anything with an expiry later than that is in the "will
388554d5237SPeter Maydellnever happen" category. Callers of ``clock_ticks_to_ns()`` should
389554d5237SPeter Maydelltherefore generally not special-case the possibility of a saturated
390554d5237SPeter Maydellresult but just allow the timer to be set to that far-future value.
391554d5237SPeter Maydell(If you are performing further calculations on the returned value
392554d5237SPeter Maydellrather than simply passing it to a QEMUTimer function like
393554d5237SPeter Maydell``timer_mod_ns()`` then you should be careful to avoid overflow
394554d5237SPeter Maydellin those calculations, of course.)
395554d5237SPeter Maydell
396cd3a53b7SPeter MaydellObtaining tick counts
397cd3a53b7SPeter Maydell---------------------
398cd3a53b7SPeter Maydell
399cd3a53b7SPeter MaydellFor calculations where you need to know the number of ticks in
400cd3a53b7SPeter Maydella given duration, use ``clock_ns_to_ticks()``. This function handles
401cd3a53b7SPeter Maydellpossible non-whole-number-of-nanoseconds periods and avoids
402cd3a53b7SPeter Maydellpotential rounding errors. It will return '0' if the clock is stopped
403cd3a53b7SPeter Maydell(i.e. it has period zero). If the inputs imply a tick count that
404cd3a53b7SPeter Maydelloverflows a 64-bit value (a very long duration for a clock with a
405cd3a53b7SPeter Maydellvery short period) the output value is truncated, so effectively
406cd3a53b7SPeter Maydellthe 64-bit output wraps around.
407cd3a53b7SPeter Maydell
40831e5784aSPeter MaydellChanging a clock period
40931e5784aSPeter Maydell-----------------------
41031e5784aSPeter Maydell
41131e5784aSPeter MaydellA device can change its outputs using the ``clock_update()``,
41231e5784aSPeter Maydell``clock_update_ns()`` or ``clock_update_hz()`` function. It will trigger
41331e5784aSPeter Maydellupdates on every connected input.
41431e5784aSPeter Maydell
41531e5784aSPeter MaydellFor example, let's say that we have an output clock *clkout* and we
41631e5784aSPeter Maydellhave a pointer to it in the device state because we did the following
41731e5784aSPeter Maydellin init phase:
41831e5784aSPeter Maydell
41931e5784aSPeter Maydell.. code-block:: c
42031e5784aSPeter Maydell
42131e5784aSPeter Maydell   dev->clkout = qdev_init_clock_out(DEVICE(dev), "clkout");
42231e5784aSPeter Maydell
42331e5784aSPeter MaydellThen at any time (apart from the cases listed below), it is possible to
42431e5784aSPeter Maydellchange the clock value by doing:
42531e5784aSPeter Maydell
42631e5784aSPeter Maydell.. code-block:: c
42731e5784aSPeter Maydell
42831e5784aSPeter Maydell   clock_update_hz(dev->clkout, 1000 * 1000 * 1000); /* 1GHz */
42931e5784aSPeter Maydell
43031e5784aSPeter MaydellBecause updating a clock may trigger any side effects through
43131e5784aSPeter Maydellconnected clocks and their callbacks, this operation must be done
43231e5784aSPeter Maydellwhile holding the qemu io lock.
43331e5784aSPeter Maydell
43431e5784aSPeter MaydellFor the same reason, one can update clocks only when it is allowed to have
43531e5784aSPeter Maydellside effects on other objects. In consequence, it is forbidden:
43631e5784aSPeter Maydell
43731e5784aSPeter Maydell* during migration,
43831e5784aSPeter Maydell* and in the enter phase of reset.
43931e5784aSPeter Maydell
44031e5784aSPeter MaydellNote that calling ``clock_update[_ns|_hz]()`` is equivalent to calling
44131e5784aSPeter Maydell``clock_set[_ns|_hz]()`` (with the same arguments) then
44231e5784aSPeter Maydell``clock_propagate()`` on the clock. Thus, setting the clock value can
44331e5784aSPeter Maydellbe separated from triggering the side-effects. This is often required
44431e5784aSPeter Maydellto factorize code to handle reset and migration in devices.
44531e5784aSPeter Maydell
44631e5784aSPeter MaydellAliasing clocks
44731e5784aSPeter Maydell---------------
44831e5784aSPeter Maydell
44931e5784aSPeter MaydellSometimes, one needs to forward, or inherit, a clock from another
45031e5784aSPeter Maydelldevice.  Typically, when doing device composition, a device might
45131e5784aSPeter Maydellexpose a sub-device's clock without interfering with it.  The function
45231e5784aSPeter Maydell``qdev_alias_clock()`` can be used to achieve this behaviour. Note
45331e5784aSPeter Maydellthat it is possible to expose the clock under a different name.
45431e5784aSPeter Maydell``qdev_alias_clock()`` works for both input and output clocks.
45531e5784aSPeter Maydell
45631e5784aSPeter MaydellFor example, if device B is a child of device A,
45731e5784aSPeter Maydell``device_a_instance_init()`` may do something like this:
45831e5784aSPeter Maydell
45931e5784aSPeter Maydell.. code-block:: c
46031e5784aSPeter Maydell
46131e5784aSPeter Maydell    void device_a_instance_init(Object *obj)
46231e5784aSPeter Maydell    {
46331e5784aSPeter Maydell        AState *A = DEVICE_A(obj);
46431e5784aSPeter Maydell        BState *B;
46531e5784aSPeter Maydell        /* create object B as child of A */
46631e5784aSPeter Maydell        [...]
46731e5784aSPeter Maydell        qdev_alias_clock(B, "clk", A, "b_clk");
46831e5784aSPeter Maydell        /*
46931e5784aSPeter Maydell         * Now A has a clock "b_clk" which is an alias to
47031e5784aSPeter Maydell         * the clock "clk" of its child B.
47131e5784aSPeter Maydell         */
47231e5784aSPeter Maydell    }
47331e5784aSPeter Maydell
47431e5784aSPeter MaydellThis function does not return any clock object. The new clock has the
47531e5784aSPeter Maydellsame direction (input or output) as the original one. This function
47631e5784aSPeter Maydellonly adds a link to the existing clock. In the above example, object B
47731e5784aSPeter Maydellremains the only object allowed to use the clock and device A must not
47831e5784aSPeter Maydelltry to change the clock period or set a callback to the clock. This
47931e5784aSPeter Maydelldiagram describes the example with an input clock::
48031e5784aSPeter Maydell
48131e5784aSPeter Maydell    +--------------------------+
48231e5784aSPeter Maydell    |        Device A          |
48331e5784aSPeter Maydell    |         +--------------+ |
48431e5784aSPeter Maydell    |         |   Device B   | |
48531e5784aSPeter Maydell    |         | +-------+    | |
48631e5784aSPeter Maydell    >>"b_clk">>>| "clk" |    | |
48731e5784aSPeter Maydell    |  (in)   | |  (in) |    | |
48831e5784aSPeter Maydell    |         | +-------+    | |
48931e5784aSPeter Maydell    |         +--------------+ |
49031e5784aSPeter Maydell    +--------------------------+
49131e5784aSPeter Maydell
49231e5784aSPeter MaydellMigration
49331e5784aSPeter Maydell---------
49431e5784aSPeter Maydell
49531e5784aSPeter MaydellClock state is not migrated automatically. Every device must handle its
49631e5784aSPeter Maydellclock migration. Alias clocks must not be migrated.
49731e5784aSPeter Maydell
49831e5784aSPeter MaydellTo ensure clock states are restored correctly during migration, there
49931e5784aSPeter Maydellare two solutions.
50031e5784aSPeter Maydell
50131e5784aSPeter MaydellClock states can be migrated by adding an entry into the device
50231e5784aSPeter Maydellvmstate description. You should use the ``VMSTATE_CLOCK`` macro for this.
50331e5784aSPeter MaydellThis is typically used to migrate an input clock state. For example:
50431e5784aSPeter Maydell
50531e5784aSPeter Maydell.. code-block:: c
50631e5784aSPeter Maydell
50731e5784aSPeter Maydell    MyDeviceState {
50831e5784aSPeter Maydell        DeviceState parent_obj;
50931e5784aSPeter Maydell        [...] /* some fields */
51031e5784aSPeter Maydell        Clock *clk;
51131e5784aSPeter Maydell    };
51231e5784aSPeter Maydell
51331e5784aSPeter Maydell    VMStateDescription my_device_vmstate = {
51431e5784aSPeter Maydell        .name = "my_device",
5152563c97fSRichard Henderson        .fields = (const VMStateField[]) {
51631e5784aSPeter Maydell            [...], /* other migrated fields */
51731e5784aSPeter Maydell            VMSTATE_CLOCK(clk, MyDeviceState),
51831e5784aSPeter Maydell            VMSTATE_END_OF_LIST()
51931e5784aSPeter Maydell        }
52031e5784aSPeter Maydell    };
52131e5784aSPeter Maydell
52231e5784aSPeter MaydellThe second solution is to restore the clock state using information already
52331e5784aSPeter Maydellat our disposal. This can be used to restore output clock states using the
52431e5784aSPeter Maydelldevice state. The functions ``clock_set[_ns|_hz]()`` can be used during the
52531e5784aSPeter Maydell``post_load()`` migration callback.
52631e5784aSPeter Maydell
52731e5784aSPeter MaydellWhen adding clock support to an existing device, if you care about
52831e5784aSPeter Maydellmigration compatibility you will need to be careful, as simply adding
52931e5784aSPeter Maydella ``VMSTATE_CLOCK()`` line will break compatibility. Instead, you can
53031e5784aSPeter Maydellput the ``VMSTATE_CLOCK()`` line into a vmstate subsection with a
53131e5784aSPeter Maydellsuitable ``needed`` function, and use ``clock_set()`` in a
53231e5784aSPeter Maydell``pre_load()`` function to set the default value that will be used if
53331e5784aSPeter Maydellthe source virtual machine in the migration does not send the clock
53431e5784aSPeter Maydellstate.
53531e5784aSPeter Maydell
53631e5784aSPeter MaydellCare should be taken not to use ``clock_update[_ns|_hz]()`` or
53731e5784aSPeter Maydell``clock_propagate()`` during the whole migration procedure because it
53831e5784aSPeter Maydellwill trigger side effects to other devices in an unknown state.
539