Branch data Line data Source code
1 : : // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2 : : /*
3 : : * Converts an OPAL formatted datetime into a struct tm. We ignore microseconds
4 : : * as Linux doesn't use them anyway.
5 : : *
6 : : * | year | month | mday |
7 : : * +------------------------------------+
8 : : * | hour | minute | secs | reserved |
9 : : * +------------------------------------+
10 : : * | microseconds |
11 : : *
12 : : * Copyright 2013-2014 IBM Corp.
13 : : */
14 : :
15 : : #include <time-utils.h>
16 : :
17 : 1 : void datetime_to_tm(uint32_t y_m_d, uint64_t h_m_s_m, struct tm *tm)
18 : : {
19 : : uint32_t x;
20 : :
21 : 1 : tm->tm_year = bcd_byte(y_m_d, 3) * 100 + bcd_byte(y_m_d, 2);
22 : 1 : tm->tm_mon = bcd_byte(y_m_d, 1) - 1;
23 : 1 : tm->tm_mday = bcd_byte(y_m_d, 0);
24 : :
25 : 1 : x = h_m_s_m >> 32;
26 : 1 : tm->tm_hour = bcd_byte(x, 3);
27 : 1 : tm->tm_min = bcd_byte(x, 2);
28 : 1 : tm->tm_sec = bcd_byte(x, 1);
29 : 1 : }
30 : :
31 : : /*
32 : : * The OPAL API is defined as returned a u64 of a similar
33 : : * format to the FSP message; the 32-bit date field is
34 : : * in the format:
35 : : *
36 : : * | year | month | mday |
37 : : *
38 : : * ... and the 64-bit time field is in the format
39 : : *
40 : : * | hour | minutes | secs | millisec |
41 : : * | -------------------------------------
42 : : * | millisec | reserved |
43 : : *
44 : : * We simply ignore the microseconds/milliseconds for now
45 : : * as I don't quite understand why the OPAL API defines that
46 : : * it needs 6 digits for the milliseconds :-) I suspect the
47 : : * doc got that wrong and it's supposed to be micro but
48 : : * let's ignore it.
49 : : *
50 : : * Note that Linux doesn't use nor set the ms field anyway.
51 : : */
52 : 1 : void tm_to_datetime(struct tm *tm, uint32_t *y_m_d, uint64_t *h_m_s_m)
53 : : {
54 : : uint64_t h_m_s;
55 : 1 : *y_m_d = int_to_bcd4(tm->tm_year) << 16 |
56 : 1 : int_to_bcd2(tm->tm_mon + 1) << 8 |
57 : 1 : int_to_bcd2(tm->tm_mday);
58 : :
59 : 1 : h_m_s = int_to_bcd2(tm->tm_hour) << 24 |
60 : 1 : int_to_bcd2(tm->tm_min) << 16 |
61 : 1 : int_to_bcd2(tm->tm_sec) << 8;
62 : :
63 : 1 : *h_m_s_m = h_m_s << 32;
64 : 1 : }
|