64 lines
1.8 KiB
C
64 lines
1.8 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/*
|
|
* Converts an OPAL formatted datetime into a struct tm. We ignore microseconds
|
|
* as Linux doesn't use them anyway.
|
|
*
|
|
* | year | month | mday |
|
|
* +------------------------------------+
|
|
* | hour | minute | secs | reserved |
|
|
* +------------------------------------+
|
|
* | microseconds |
|
|
*
|
|
* Copyright 2013-2014 IBM Corp.
|
|
*/
|
|
|
|
#include <time-utils.h>
|
|
|
|
void datetime_to_tm(uint32_t y_m_d, uint64_t h_m_s_m, struct tm *tm)
|
|
{
|
|
uint32_t x;
|
|
|
|
tm->tm_year = bcd_byte(y_m_d, 3) * 100 + bcd_byte(y_m_d, 2);
|
|
tm->tm_mon = bcd_byte(y_m_d, 1) - 1;
|
|
tm->tm_mday = bcd_byte(y_m_d, 0);
|
|
|
|
x = h_m_s_m >> 32;
|
|
tm->tm_hour = bcd_byte(x, 3);
|
|
tm->tm_min = bcd_byte(x, 2);
|
|
tm->tm_sec = bcd_byte(x, 1);
|
|
}
|
|
|
|
/*
|
|
* The OPAL API is defined as returned a u64 of a similar
|
|
* format to the FSP message; the 32-bit date field is
|
|
* in the format:
|
|
*
|
|
* | year | month | mday |
|
|
*
|
|
* ... and the 64-bit time field is in the format
|
|
*
|
|
* | hour | minutes | secs | millisec |
|
|
* | -------------------------------------
|
|
* | millisec | reserved |
|
|
*
|
|
* We simply ignore the microseconds/milliseconds for now
|
|
* as I don't quite understand why the OPAL API defines that
|
|
* it needs 6 digits for the milliseconds :-) I suspect the
|
|
* doc got that wrong and it's supposed to be micro but
|
|
* let's ignore it.
|
|
*
|
|
* Note that Linux doesn't use nor set the ms field anyway.
|
|
*/
|
|
void tm_to_datetime(struct tm *tm, uint32_t *y_m_d, uint64_t *h_m_s_m)
|
|
{
|
|
uint64_t h_m_s;
|
|
*y_m_d = int_to_bcd4(tm->tm_year) << 16 |
|
|
int_to_bcd2(tm->tm_mon + 1) << 8 |
|
|
int_to_bcd2(tm->tm_mday);
|
|
|
|
h_m_s = int_to_bcd2(tm->tm_hour) << 24 |
|
|
int_to_bcd2(tm->tm_min) << 16 |
|
|
int_to_bcd2(tm->tm_sec) << 8;
|
|
|
|
*h_m_s_m = h_m_s << 32;
|
|
}
|