LCOV - code coverage report
Current view: top level - zephyr/logging - log_frontend_stmesp_demux.h Hit Total Coverage
Test: new.info Lines: 72 73 98.6 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2024 Nordic Semiconductor ASA
       3             :  *
       4             :  * SPDX-License-Identifier: Apache-2.0
       5             :  */
       6             : 
       7             : #ifndef ZEPHYR_INCLUDE_LOGGING_LOG_FRONTEND_STMESP_DEMUX_H_
       8             : #define ZEPHYR_INCLUDE_LOGGING_LOG_FRONTEND_STMESP_DEMUX_H_
       9             : 
      10             : #include <zephyr/kernel.h>
      11             : #include <zephyr/sys/mpsc_packet.h>
      12             : 
      13             : #ifdef __cplusplus
      14             : extern "C" {
      15             : #endif
      16             : 
      17             : /**
      18             :  * @defgroup log_frontend_stmesp_apis Trace and Debug Domain APIs
      19             :  * @{
      20             :  * @}
      21             :  * @defgroup log_frontend_stpesp_demux_apis Logging frontend STMESP Demultiplexer API
      22             :  * @ingroup log_frontend_stmesp_apis
      23             :  * @{
      24             :  */
      25             : 
      26             : /** @brief Bits used to store major index. */
      27           1 : #define LOG_FRONTEND_STMESP_DEMUX_MAJOR_BITS 3
      28             : 
      29             : /** @brief Bits used to store severity level. */
      30           1 : #define LOG_FRONTEND_STMESP_DEMUX_LEVEL_BITS 3
      31             : 
      32             : /** @brief Bits used to store total length. */
      33           1 : #define LOG_FRONTEND_STMESP_DEMUX_TLENGTH_BITS 16
      34             : 
      35             : /** @brief Bits used to store package length. */
      36           1 : #define LOG_FRONTEND_STMESP_DEMUX_PLENGTH_BITS 10
      37             : 
      38             : /** @brief Maximum number of supported majors. */
      39           1 : #define LOG_FRONTEND_STMESP_DEMUX_MAJOR_MAX BIT(LOG_FRONTEND_STMESP_DEMUX_MAJOR_BITS)
      40             : 
      41             : /** @brief Log message type. */
      42           1 : #define LOG_FRONTEND_STMESP_DEMUX_TYPE_LOG 0
      43             : 
      44             : /** @brief Trace point message type. */
      45           1 : #define LOG_FRONTEND_STMESP_DEMUX_TYPE_TRACE_POINT 1
      46             : 
      47             : /** @brief HW event message type. */
      48           1 : #define LOG_FRONTEND_STMESP_DEMUX_TYPE_HW_EVENT 2
      49             : 
      50             : /** @brief Logging message header. */
      51           1 : struct log_frontend_stmesp_demux_log_header {
      52             :         /** Major index. */
      53           1 :         uint32_t major : LOG_FRONTEND_STMESP_DEMUX_MAJOR_BITS;
      54             : 
      55             :         /** Severity level. */
      56           1 :         uint32_t level : LOG_FRONTEND_STMESP_DEMUX_LEVEL_BITS;
      57             : 
      58             :         /** Total length excluding this header. */
      59           1 :         uint32_t total_len : LOG_FRONTEND_STMESP_DEMUX_TLENGTH_BITS;
      60             : 
      61             :         /** Hexdump data length. */
      62           1 :         uint32_t package_len : LOG_FRONTEND_STMESP_DEMUX_PLENGTH_BITS;
      63             : };
      64             : 
      65             : /** @brief Union for writing raw data to the logging message header. */
      66           1 : union log_frontend_stmesp_demux_header {
      67             :         /** Log header structure. */
      68           1 :         struct log_frontend_stmesp_demux_log_header log;
      69             : 
      70             :         /** Raw word. */
      71           1 :         uint32_t raw;
      72             : };
      73             : 
      74             : /** @brief Generic STP demux packet. */
      75           1 : struct log_frontend_stmesp_demux_packet_generic {
      76             :         /** Data for MPSC packet handling. */
      77           1 :         MPSC_PBUF_HDR;
      78             : 
      79             :         /** Type. */
      80           1 :         uint64_t type: 2;
      81             : 
      82             :         /** Flag indicating if packet is valid. */
      83           1 :         uint64_t content_invalid: 1;
      84             : };
      85             : 
      86             : /** @brief Packet with logging message. */
      87           1 : struct log_frontend_stmesp_demux_log {
      88             :         /** Data for MPSC packet handling. */
      89           1 :         MPSC_PBUF_HDR;
      90             : 
      91             :         /** Type. */
      92           1 :         uint64_t type: 2;
      93             : 
      94             :         /** Flag indicating if packet is valid. */
      95           1 :         uint64_t content_invalid: 1;
      96             : 
      97             :         /** Timestamp. */
      98           1 :         uint64_t timestamp: 59;
      99             : 
     100             :         /** Logging header. */
     101           1 :         struct log_frontend_stmesp_demux_log_header hdr;
     102             : 
     103             :         /** Padding so that data is 8 bytes aligned. */
     104           1 :         uint32_t padding;
     105             : 
     106             :         /** Content. */
     107           1 :         uint8_t data[];
     108             : };
     109             : 
     110             : /** @brief Packet with trace point. */
     111           1 : struct log_frontend_stmesp_demux_trace_point {
     112             :         /** Data for MPSC packet handling. */
     113           1 :         MPSC_PBUF_HDR;
     114             : 
     115             :         /** Type. */
     116           1 :         uint64_t type: 2;
     117             : 
     118             :         /** Flag indicating if packet is valid. */
     119           1 :         uint64_t content_invalid: 1;
     120             : 
     121             :         /** Flag indicating if trace point includes data. */
     122           1 :         uint64_t has_data: 1;
     123             : 
     124             :         /** Timestamp. 54 bits at 40MHz is >14 years. */
     125           1 :         uint64_t timestamp: 54;
     126             : 
     127             :         /** Major ID. */
     128           1 :         uint64_t major: 4;
     129             : 
     130             :         /** Source ID - used for compressed logging. */
     131           1 :         uint16_t source_id;
     132             : 
     133             :         /** ID */
     134           1 :         uint16_t id;
     135             : 
     136             :         /** Content. */
     137           1 :         uint32_t data;
     138             : };
     139             : 
     140             : /** @brief Packet with HW event. */
     141           1 : struct log_frontend_stmesp_demux_hw_event {
     142             :         /** Data for MPSC packet handling. */
     143           1 :         MPSC_PBUF_HDR;
     144             : 
     145             :         /** Type. */
     146           1 :         uint64_t type: 2;
     147             : 
     148             :         /** Flag indicating if packet is valid. */
     149           1 :         uint64_t content_invalid: 1;
     150             : 
     151             :         /** Timestamp. */
     152           1 :         uint64_t timestamp: 59;
     153             : 
     154             :         /** HW event ID. */
     155           1 :         uint8_t evt;
     156             : };
     157             : 
     158             : /** @brief Union of all packet types. */
     159           1 : union log_frontend_stmesp_demux_packet {
     160             :         /** Pointer to generic mpsc_pbuf const packet. */
     161           1 :         const union mpsc_pbuf_generic *rgeneric;
     162             : 
     163             :         /** Pointer to generic mpsc_pbuf packet. */
     164           1 :         union mpsc_pbuf_generic *generic;
     165             : 
     166             :         /** Pointer to the log message. */
     167           1 :         struct log_frontend_stmesp_demux_log *log;
     168             : 
     169             :         /** Pointer to the trace point message. */
     170           1 :         struct log_frontend_stmesp_demux_trace_point *trace_point;
     171             : 
     172             :         /** Pointer to the HW event message. */
     173           1 :         struct log_frontend_stmesp_demux_hw_event *hw_event;
     174             : 
     175             :         /** Pointer to the generic log_frontend_stmesp_demux packet. */
     176           1 :         struct log_frontend_stmesp_demux_packet_generic *generic_packet;
     177             : };
     178             : 
     179             : /** @brief Demultiplexer configuration. */
     180           1 : struct log_frontend_stmesp_demux_config {
     181             :         /** Array with expected major ID's. */
     182           1 :         const uint16_t *m_ids;
     183             : 
     184             :         /** Array length. Must be not bigger than @ref LOG_FRONTEND_STMESP_DEMUX_MAJOR_MAX. */
     185           1 :         uint32_t m_ids_cnt;
     186             : 
     187             :         /** Buffer for storing source ID's. Used for turbo logging. */
     188           1 :         uint32_t *source_id_buf;
     189             : 
     190             :         /** It must be multiple of number of major ID's count. */
     191           1 :         size_t source_id_buf_len;
     192             : };
     193             : 
     194             : /** @brief Initialize the demultiplexer.
     195             :  *
     196             :  * @param config Configuration.
     197             :  *
     198             :  * @retval 0 on success.
     199             :  * @retval -EINVAL on invalid configuration.
     200             :  */
     201           1 : int log_frontend_stmesp_demux_init(const struct log_frontend_stmesp_demux_config *config);
     202             : 
     203             : /** @brief Indicate major opcode in the STPv2 stream.
     204             :  *
     205             :  * @param id    Master ID.
     206             :  */
     207           1 : void log_frontend_stmesp_demux_major(uint16_t id);
     208             : 
     209             : /** @brief Indicate channel opcode in the STPv2 stream.
     210             :  *
     211             :  * @param id    Channel ID.
     212             :  */
     213           1 : void log_frontend_stmesp_demux_channel(uint16_t id);
     214             : 
     215             : /** @brief Indicate detected packet start (DMTS).
     216             :  *
     217             :  * @param data  Data. Can be NULL which indicates trace point without data.
     218             :  * @param ts    Timestamp. Can be NULL.
     219             :  */
     220           1 : int log_frontend_stmesp_demux_packet_start(uint32_t *data, uint64_t *ts);
     221             : 
     222             : /** @brief Indicate optimized log message with no arguments.
     223             :  *
     224             :  * @param source_id Source ID.
     225             :  * @param ts    Timestamp. Can be NULL.
     226             :  */
     227           1 : int log_frontend_stmesp_demux_log0(uint16_t source_id, uint64_t *ts);
     228             : 
     229             : /** @brief Indicate source ID.
     230             :  *
     231             :  * @param source_id Source ID.
     232             :  */
     233           1 : void log_frontend_stmesp_demux_source_id(uint16_t source_id);
     234             : 
     235             : /** @brief Indicate timestamp.
     236             :  *
     237             :  * Timestamp is separated from packet start because according to STM spec (3.2.2)
     238             :  * it is possible that timestamp is assigned to a later packet.
     239             :  *
     240             :  * @param ts    Timestamp.
     241             :  */
     242           1 : void log_frontend_stmesp_demux_timestamp(uint64_t ts);
     243             : 
     244             : /** @brief Indicate data.
     245             :  *
     246             :  * @param data  Data buffer.
     247             :  * @param len   Length.
     248             :  */
     249           1 : void log_frontend_stmesp_demux_data(uint8_t *data, size_t len);
     250             : 
     251             : /** @brief Indicate packet end (Flag). */
     252           1 : void log_frontend_stmesp_demux_packet_end(void);
     253             : 
     254             : /** @brief Get number of dropped messages and reset the counter.
     255             :  *
     256             :  * Message can be dropped if there is no room in the packet buffer.
     257             :  *
     258             :  * @return Number of dropped messages.
     259             :  */
     260           1 : uint32_t log_frontend_stmesp_demux_get_dropped(void);
     261             : 
     262             : /** @brief Claim packet.
     263             :  *
     264             :  * Get pointer to the pending packet with logging message. Packet must be freed
     265             :  * using @ref log_frontend_stmesp_demux_free.
     266             :  *
     267             :  * @return Pointer to the packet or NULL.
     268             :  */
     269           1 : union log_frontend_stmesp_demux_packet log_frontend_stmesp_demux_claim(void);
     270             : 
     271             : /** @brief Free previously claimed packet.
     272             :  *
     273             :  * See @ref log_frontend_stmesp_demux_claim.
     274             :  *
     275             :  * @param packet Packet.
     276             :  */
     277           1 : void log_frontend_stmesp_demux_free(union log_frontend_stmesp_demux_packet packet);
     278             : 
     279             : /** @brief Get source name for a turbo log message.
     280             :  *
     281             :  * During a boot cooprocessors (FLPR and PPR) are sending location in memory where
     282             :  * their source data is stored. If application core is an owner of those cores
     283             :  * it has access to that memory and based on chip ID and source ID it can retrieve
     284             :  * the source name.
     285             :  *
     286             :  * @param m_id Major ID.
     287             :  * @param s_id Source ID.
     288             :  *
     289             :  * @return Pointer to a string which is a source name or unknown name if source name
     290             :  *         cannot be retrieved.
     291             :  */
     292           1 : const char *log_frontend_stmesp_demux_sname_get(uint32_t m_id, uint16_t s_id);
     293             : 
     294             : /** @brief Check if there are any started but not completed log messages.
     295             :  *
     296             :  * @retval True There is no pending started log message.
     297             :  * @retval False There is pending message.
     298             :  */
     299           1 : bool log_frontend_stmesp_demux_is_idle(void);
     300             : 
     301             : /** @brief Close any opened messages and mark them as invalid. */
     302           1 : void log_frontend_stmesp_demux_reset(void);
     303             : 
     304             : /** @brief Get maximum buffer utilization.
     305             :  *
     306             :  * @retval Non-negative Maximum buffer utilization.
     307             :  * @retval -ENOTSUP Feature not enabled.
     308             :  */
     309           1 : int log_frontend_stmesp_demux_max_utilization(void);
     310             : 
     311             : /**
     312             :  * @}
     313             :  */
     314             : 
     315             : #ifdef __cplusplus
     316             : }
     317             : #endif
     318             : 
     319             : #endif /* ZEPHYR_INCLUDE_LOGGING_LOG_FRONTEND_STMESP_DEMUX_H_ */

Generated by: LCOV version 1.14