linux/drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2018, Mellanox Technologies. All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#ifndef __LIB_TRACER_H__
  34#define __LIB_TRACER_H__
  35
  36#include <linux/mlx5/driver.h>
  37#include "mlx5_core.h"
  38
  39#define STRINGS_DB_SECTIONS_NUM 8
  40#define STRINGS_DB_READ_SIZE_BYTES 256
  41#define STRINGS_DB_LEFTOVER_SIZE_BYTES 64
  42#define TRACER_BUFFER_PAGE_NUM 64
  43#define TRACER_BUFFER_CHUNK 4096
  44#define TRACE_BUFFER_SIZE_BYTE (TRACER_BUFFER_PAGE_NUM * TRACER_BUFFER_CHUNK)
  45
  46#define TRACER_BLOCK_SIZE_BYTE 256
  47#define TRACES_PER_BLOCK 32
  48
  49#define TRACE_STR_MSG 256
  50#define SAVED_TRACES_NUM 8192
  51
  52#define TRACER_MAX_PARAMS 7
  53#define MESSAGE_HASH_BITS 6
  54#define MESSAGE_HASH_SIZE BIT(MESSAGE_HASH_BITS)
  55
  56#define MASK_52_7 (0x1FFFFFFFFFFF80)
  57#define MASK_6_0  (0x7F)
  58
  59struct mlx5_fw_trace_data {
  60        u64 timestamp;
  61        bool lost;
  62        u8 event_id;
  63        char msg[TRACE_STR_MSG];
  64};
  65
  66struct mlx5_fw_tracer {
  67        struct mlx5_core_dev *dev;
  68        struct mlx5_nb        nb;
  69        bool owner;
  70        u8   trc_ver;
  71        struct workqueue_struct *work_queue;
  72        struct work_struct ownership_change_work;
  73        struct work_struct read_fw_strings_work;
  74
  75        /* Strings DB */
  76        struct {
  77                u8 first_string_trace;
  78                u8 num_string_trace;
  79                u32 num_string_db;
  80                u32 base_address_out[STRINGS_DB_SECTIONS_NUM];
  81                u32 size_out[STRINGS_DB_SECTIONS_NUM];
  82                void *buffer[STRINGS_DB_SECTIONS_NUM];
  83                bool loaded;
  84        } str_db;
  85
  86        /* Log Buffer */
  87        struct {
  88                u32 pdn;
  89                void *log_buf;
  90                dma_addr_t dma;
  91                u32 size;
  92                struct mlx5_core_mkey mkey;
  93                u32 consumer_index;
  94        } buff;
  95
  96        /* Saved Traces Array */
  97        struct {
  98                struct mlx5_fw_trace_data straces[SAVED_TRACES_NUM];
  99                u32 saved_traces_index;
 100                struct mutex lock; /* Protect st_arr access */
 101        } st_arr;
 102
 103        u64 last_timestamp;
 104        struct work_struct handle_traces_work;
 105        struct hlist_head hash[MESSAGE_HASH_SIZE];
 106        struct list_head ready_strings_list;
 107};
 108
 109struct tracer_string_format {
 110        char *string;
 111        int params[TRACER_MAX_PARAMS];
 112        int num_of_params;
 113        int last_param_num;
 114        u8 event_id;
 115        u32 tmsn;
 116        struct hlist_node hlist;
 117        struct list_head list;
 118        u32 timestamp;
 119        bool lost;
 120};
 121
 122enum mlx5_fw_tracer_ownership_state {
 123        MLX5_FW_TRACER_RELEASE_OWNERSHIP,
 124        MLX5_FW_TRACER_ACQUIRE_OWNERSHIP,
 125};
 126
 127enum tracer_ctrl_fields_select {
 128        TRACE_STATUS = 1 << 0,
 129};
 130
 131enum tracer_event_type {
 132        TRACER_EVENT_TYPE_STRING,
 133        TRACER_EVENT_TYPE_TIMESTAMP = 0xFF,
 134        TRACER_EVENT_TYPE_UNRECOGNIZED,
 135};
 136
 137enum tracing_mode {
 138        TRACE_TO_MEMORY = 1 << 0,
 139};
 140
 141struct tracer_timestamp_event {
 142        u64        timestamp;
 143        u8         unreliable;
 144};
 145
 146struct tracer_string_event {
 147        u32        timestamp;
 148        u32        tmsn;
 149        u32        tdsn;
 150        u32        string_param;
 151};
 152
 153struct tracer_event {
 154        bool      lost_event;
 155        u32       type;
 156        u8        event_id;
 157        union {
 158                struct tracer_string_event string_event;
 159                struct tracer_timestamp_event timestamp_event;
 160        };
 161};
 162
 163struct mlx5_ifc_tracer_event_bits {
 164        u8         lost[0x1];
 165        u8         timestamp[0x7];
 166        u8         event_id[0x8];
 167        u8         event_data[0x30];
 168};
 169
 170struct mlx5_ifc_tracer_string_event_bits {
 171        u8         lost[0x1];
 172        u8         timestamp[0x7];
 173        u8         event_id[0x8];
 174        u8         tmsn[0xd];
 175        u8         tdsn[0x3];
 176        u8         string_param[0x20];
 177};
 178
 179struct mlx5_ifc_tracer_timestamp_event_bits {
 180        u8         timestamp7_0[0x8];
 181        u8         event_id[0x8];
 182        u8         urts[0x3];
 183        u8         timestamp52_40[0xd];
 184        u8         timestamp39_8[0x20];
 185};
 186
 187struct mlx5_fw_tracer *mlx5_fw_tracer_create(struct mlx5_core_dev *dev);
 188int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer);
 189void mlx5_fw_tracer_cleanup(struct mlx5_fw_tracer *tracer);
 190void mlx5_fw_tracer_destroy(struct mlx5_fw_tracer *tracer);
 191int mlx5_fw_tracer_trigger_core_dump_general(struct mlx5_core_dev *dev);
 192int mlx5_fw_tracer_get_saved_traces_objects(struct mlx5_fw_tracer *tracer,
 193                                            struct devlink_fmsg *fmsg);
 194int mlx5_fw_tracer_reload(struct mlx5_fw_tracer *tracer);
 195
 196#endif
 197