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