LCOV - code coverage report
Current view: top level - core - time-utils.c (source / functions) Coverage Total Hit
Test: skiboot.info Lines: 100.0 % 18 18
Test Date: 2025-01-15 20:37:39 Functions: 100.0 % 2 2
Branches: - 0 0

             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 : }
        

Generated by: LCOV version 2.0-1