/******************************************************************************
 *
 * Copyright(c) 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2014 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
 * Copyright (C) 2018 Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_ERROR_DUMP_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_ERROR_DUMP_H_

#include "file.h"

#define IWL_FW_ERROR_DUMP_BARKER 0x14789632

/**
 * enum iwl_fw_error_dump_type - types of data in the dump file
 * @IWL_FW_ERROR_DUMP_CSR: Control Status Registers - from offset 0
 * @IWL_FW_ERROR_DUMP_RXF:
 * @IWL_FW_ERROR_DUMP_TXCMD: last TX command data, structured as
 *  &struct iwl_fw_error_dump_txcmd packets
 * @IWL_FW_ERROR_DUMP_DEV_FW_INFO:  struct %iwl_fw_error_dump_info
 *  info on the device / firmware.
 * @IWL_FW_ERROR_DUMP_FW_MONITOR: firmware monitor
 * @IWL_FW_ERROR_DUMP_PRPH: range of periphery registers - there can be several
 *  sections like this in a single file.
 * @IWL_FW_ERROR_DUMP_FH_REGS: range of FH registers
 * @IWL_FW_ERROR_DUMP_MEM: chunk of memory
 * @IWL_FW_ERROR_DUMP_ERROR_INFO: description of what triggered this dump.
 *  Structured as &struct iwl_fw_error_dump_trigger_desc.
 * @IWL_FW_ERROR_DUMP_RB: the content of an RB structured as
 *  &struct iwl_fw_error_dump_rb
 * @IWL_FW_ERROR_PAGING: UMAC's image memory segments which were
 *  paged to the DRAM.
 * @IWL_FW_ERROR_DUMP_RADIO_REG: Dump the radio registers.
 * @IWL_FW_ERROR_DUMP_EXTERNAL: used only by external code utilities, and
 *  for that reason is not in use in any other place in the Linux Wi-Fi
 *  stack.
 * @IWL_FW_ERROR_DUMP_MEM_CFG: the addresses and sizes of fifos in the smem,
 *  which we get from the fw after ALIVE. The content is structured as
 *  &struct iwl_fw_error_dump_smem_cfg.
 */
enum iwl_fw_error_dump_type {
    /* 0 is deprecated */
    IWL_FW_ERROR_DUMP_CSR = 1,
    IWL_FW_ERROR_DUMP_RXF = 2,
    IWL_FW_ERROR_DUMP_TXCMD = 3,
    IWL_FW_ERROR_DUMP_DEV_FW_INFO = 4,
    IWL_FW_ERROR_DUMP_FW_MONITOR = 5,
    IWL_FW_ERROR_DUMP_PRPH = 6,
    IWL_FW_ERROR_DUMP_TXF = 7,
    IWL_FW_ERROR_DUMP_FH_REGS = 8,
    IWL_FW_ERROR_DUMP_MEM = 9,
    IWL_FW_ERROR_DUMP_ERROR_INFO = 10,
    IWL_FW_ERROR_DUMP_RB = 11,
    IWL_FW_ERROR_DUMP_PAGING = 12,
    IWL_FW_ERROR_DUMP_RADIO_REG = 13,
    IWL_FW_ERROR_DUMP_INTERNAL_TXF = 14,
    IWL_FW_ERROR_DUMP_EXTERNAL = 15, /* Do not move */
    IWL_FW_ERROR_DUMP_MEM_CFG = 16,
    IWL_FW_ERROR_DUMP_D3_DEBUG_DATA = 17,

    IWL_FW_ERROR_DUMP_MAX,
};

/**
 * struct iwl_fw_error_dump_data - data for one type
 * @type: &enum iwl_fw_error_dump_type
 * @len: the length starting from %data
 * @data: the data itself
 */
struct iwl_fw_error_dump_data {
    __le32 type;
    __le32 len;
    __u8 data[];
} __packed;

/**
 * struct iwl_fw_error_dump_file - the layout of the header of the file
 * @barker: must be %IWL_FW_ERROR_DUMP_BARKER
 * @file_len: the length of all the file starting from %barker
 * @data: array of &struct iwl_fw_error_dump_data
 */
struct iwl_fw_error_dump_file {
    __le32 barker;
    __le32 file_len;
    uint8_t data[0];
} __packed;

/**
 * struct iwl_fw_error_dump_txcmd - TX command data
 * @cmdlen: original length of command
 * @caplen: captured length of command (may be less)
 * @data: captured command data, @caplen bytes
 */
struct iwl_fw_error_dump_txcmd {
    __le32 cmdlen;
    __le32 caplen;
    uint8_t data[];
} __packed;

/**
 * struct iwl_fw_error_dump_fifo - RX/TX FIFO data
 * @fifo_num: number of FIFO (starting from 0)
 * @available_bytes: num of bytes available in FIFO (may be less than FIFO size)
 * @wr_ptr: position of write pointer
 * @rd_ptr: position of read pointer
 * @fence_ptr: position of fence pointer
 * @fence_mode: the current mode of the fence (before locking) -
 *  0=follow RD pointer ; 1 = freeze
 * @data: all of the FIFO's data
 */
struct iwl_fw_error_dump_fifo {
    __le32 fifo_num;
    __le32 available_bytes;
    __le32 wr_ptr;
    __le32 rd_ptr;
    __le32 fence_ptr;
    __le32 fence_mode;
    uint8_t data[];
} __packed;

enum iwl_fw_error_dump_family {
    IWL_FW_ERROR_DUMP_FAMILY_7 = 7,
    IWL_FW_ERROR_DUMP_FAMILY_8 = 8,
};

#define MAX_NUM_LMAC 2

/**
 * struct iwl_fw_error_dump_info - info on the device / firmware
 * @device_family: the family of the device (7 / 8)
 * @hw_step: the step of the device
 * @fw_human_readable: human readable FW version
 * @dev_human_readable: name of the device
 * @bus_human_readable: name of the bus used
 * @num_of_lmacs: the number of lmacs
 * @lmac_err_id: the lmac 0/1 error_id/rt_status that triggered the latest dump
 *  if the dump collection was not initiated by an assert, the value is 0
 * @umac_err_id: the umac error_id/rt_status that triggered the latest dump
 *  if the dump collection was not initiated by an assert, the value is 0
 */
struct iwl_fw_error_dump_info {
    __le32 device_family;
    __le32 hw_step;
    uint8_t fw_human_readable[FW_VER_HUMAN_READABLE_SZ];
    uint8_t dev_human_readable[64];
    uint8_t bus_human_readable[8];
    uint8_t num_of_lmacs;
    __le32 umac_err_id;
    __le32 lmac_err_id[MAX_NUM_LMAC];
} __packed;

/**
 * struct iwl_fw_error_dump_fw_mon - FW monitor data
 * @fw_mon_wr_ptr: the position of the write pointer in the cyclic buffer
 * @fw_mon_base_ptr: base pointer of the data
 * @fw_mon_cycle_cnt: number of wraparounds
 * @reserved: for future use
 * @data: captured data
 */
struct iwl_fw_error_dump_fw_mon {
    __le32 fw_mon_wr_ptr;
    __le32 fw_mon_base_ptr;
    __le32 fw_mon_cycle_cnt;
    __le32 reserved[3];
    uint8_t data[];
} __packed;

#define MAX_NUM_LMAC 2
#define TX_FIFO_INTERNAL_MAX_NUM 6
#define TX_FIFO_MAX_NUM 15
/**
 * struct iwl_fw_error_dump_smem_cfg - Dump SMEM configuration
 *  This must follow &struct iwl_fwrt_shared_mem_cfg.
 * @num_lmacs: number of lmacs
 * @num_txfifo_entries: number of tx fifos
 * @lmac: sizes of lmacs txfifos and rxfifo1
 * @rxfifo2_size: size of rxfifo2
 * @internal_txfifo_addr: address of internal tx fifo
 * @internal_txfifo_size: size of internal tx fifo
 */
struct iwl_fw_error_dump_smem_cfg {
    __le32 num_lmacs;
    __le32 num_txfifo_entries;
    struct {
        __le32 txfifo_size[TX_FIFO_MAX_NUM];
        __le32 rxfifo1_size;
    } lmac[MAX_NUM_LMAC];
    __le32 rxfifo2_size;
    __le32 internal_txfifo_addr;
    __le32 internal_txfifo_size[TX_FIFO_INTERNAL_MAX_NUM];
} __packed;
/**
 * struct iwl_fw_error_dump_prph - periphery registers data
 * @prph_start: address of the first register in this chunk
 * @data: the content of the registers
 */
struct iwl_fw_error_dump_prph {
    __le32 prph_start;
    __le32 data[];
};

enum iwl_fw_error_dump_mem_type {
    IWL_FW_ERROR_DUMP_MEM_SRAM,
    IWL_FW_ERROR_DUMP_MEM_SMEM,
    IWL_FW_ERROR_DUMP_MEM_NAMED_MEM = 10,
};

/**
 * struct iwl_fw_error_dump_mem - chunk of memory
 * @type: &enum iwl_fw_error_dump_mem_type
 * @offset: the offset from which the memory was read
 * @data: the content of the memory
 */
struct iwl_fw_error_dump_mem {
    __le32 type;
    __le32 offset;
    uint8_t data[];
};

/**
 * struct iwl_fw_error_dump_named_mem - chunk of memory
 * @type: &enum iwl_fw_error_dump_mem_type
 * @offset: the offset from which the memory was read
 * @name_len: name length
 * @name: file name
 * @data: the content of the memory
 */
struct iwl_fw_error_dump_named_mem {
    __le32 type;
    __le32 offset;
    uint8_t name_len;
    uint8_t name[32];
    uint8_t data[];
};

/**
 * struct iwl_fw_error_dump_rb - content of an Receive Buffer
 * @index: the index of the Receive Buffer in the Rx queue
 * @rxq: the RB's Rx queue
 * @reserved:
 * @data: the content of the Receive Buffer
 */
struct iwl_fw_error_dump_rb {
    __le32 index;
    __le32 rxq;
    __le32 reserved;
    uint8_t data[];
};

/**
 * struct iwl_fw_error_dump_paging - content of the UMAC's image page
 *  block on DRAM
 * @index: the index of the page block
 * @reserved:
 * @data: the content of the page block
 */
struct iwl_fw_error_dump_paging {
    __le32 index;
    __le32 reserved;
    uint8_t data[];
};

/**
 * iwl_fw_error_next_data - advance fw error dump data pointer
 * @data: previous data block
 * Returns: next data block
 */
static inline struct iwl_fw_error_dump_data* iwl_fw_error_next_data(
    struct iwl_fw_error_dump_data* data) {
    return (struct iwl_fw_error_dump_data*)(data->data + le32_to_cpu(data->len));
}

/**
 * enum iwl_fw_dbg_trigger - triggers available
 *
 * @FW_DBG_TRIGGER_USER: trigger log collection by user
 *  This should not be defined as a trigger to the driver, but a value the
 *  driver should set to indicate that the trigger was initiated by the
 *  user.
 * @FW_DBG_TRIGGER_FW_ASSERT: trigger log collection when the firmware asserts
 * @FW_DBG_TRIGGER_MISSED_BEACONS: trigger log collection when beacons are
 *  missed.
 * @FW_DBG_TRIGGER_CHANNEL_SWITCH: trigger log collection upon channel switch.
 * @FW_DBG_TRIGGER_FW_NOTIF: trigger log collection when the firmware sends a
 *  command response or a notification.
 * @FW_DBG_TRIGGER_MLME: trigger log collection upon MLME event.
 * @FW_DBG_TRIGGER_STATS: trigger log collection upon statistics threshold.
 * @FW_DBG_TRIGGER_RSSI: trigger log collection when the rssi of the beacon
 *  goes below a threshold.
 * @FW_DBG_TRIGGER_TXQ_TIMERS: configures the timers for the Tx queue hang
 *  detection.
 * @FW_DBG_TRIGGER_TIME_EVENT: trigger log collection upon time events related
 *  events.
 * @FW_DBG_TRIGGER_BA: trigger log collection upon BlockAck related events.
 * @FW_DBG_TX_LATENCY: trigger log collection when the tx latency goes above a
 *  threshold.
 * @FW_DBG_TDLS: trigger log collection upon TDLS related events.
 * @FW_DBG_TRIGGER_TX_STATUS: trigger log collection upon tx status when
 *  the firmware sends a tx reply.
 * @FW_DBG_TRIGGER_USER_EXTENDED: trigger log collection upon user space
 *  request.
 * @FW_DBG_TRIGGER_NO_ALIVE: trigger log collection if alive flow fails
 */
enum iwl_fw_dbg_trigger {
    FW_DBG_TRIGGER_INVALID = 0,
    FW_DBG_TRIGGER_USER,
    FW_DBG_TRIGGER_FW_ASSERT,
    FW_DBG_TRIGGER_MISSED_BEACONS,
    FW_DBG_TRIGGER_CHANNEL_SWITCH,
    FW_DBG_TRIGGER_FW_NOTIF,
    FW_DBG_TRIGGER_MLME,
    FW_DBG_TRIGGER_STATS,
    FW_DBG_TRIGGER_RSSI,
    FW_DBG_TRIGGER_TXQ_TIMERS,
    FW_DBG_TRIGGER_TIME_EVENT,
    FW_DBG_TRIGGER_BA,
    FW_DBG_TRIGGER_TX_LATENCY,
    FW_DBG_TRIGGER_TDLS,
    FW_DBG_TRIGGER_TX_STATUS,
    FW_DBG_TRIGGER_USER_EXTENDED,
    FW_DBG_TRIGGER_NO_ALIVE,

    /* must be last */
    FW_DBG_TRIGGER_MAX,
};

/**
 * struct iwl_fw_error_dump_trigger_desc - describes the trigger condition
 * @type: &enum iwl_fw_dbg_trigger
 * @data: raw data about what happened
 */
struct iwl_fw_error_dump_trigger_desc {
    __le32 type;
    uint8_t data[];
};

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_ERROR_DUMP_H_
