/******************************************************************************
 *
 * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2015 - 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_DBG_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_DBG_H_

#include "src/iwlwifi/fw/api/commands.h"
#include "src/iwlwifi/fw/api/dbg-tlv.h"
#include "src/iwlwifi/fw/error-dump.h"
#include "src/iwlwifi/fw/file.h"
#include "src/iwlwifi/fw/runtime.h"
#include "src/iwlwifi/iwl-io.h"
#include "src/iwlwifi/iwl-prph.h"
#include "src/iwlwifi/platform/compiler.h"
#include "src/iwlwifi/platform/kernel.h"

/**
 * struct iwl_fw_dump_desc - describes the dump
 * @len: length of trig_desc->data
 * @trig_desc: the description of the dump
 */
struct iwl_fw_dump_desc {
  size_t len;
  /* must be last */
  struct iwl_fw_error_dump_trigger_desc trig_desc;
};

/**
 * struct iwl_fw_dbg_params - register values to restore
 * @in_sample: DBGC_IN_SAMPLE value
 * @out_ctrl: DBGC_OUT_CTRL value
 */
struct iwl_fw_dbg_params {
  uint32_t in_sample;
  uint32_t out_ctrl;
};

extern const struct iwl_fw_dump_desc iwl_dump_desc_assert;

static inline void iwl_fw_free_dump_desc(struct iwl_fw_runtime* fwrt) {
  if (fwrt->dump.desc != &iwl_dump_desc_assert) {
    kfree((void*)fwrt->dump.desc);
  }
  fwrt->dump.desc = NULL;
  fwrt->dump.lmac_err_id[0] = 0;
  if (fwrt->smem_cfg.num_lmacs > 1) {
    fwrt->dump.lmac_err_id[1] = 0;
  }
  fwrt->dump.umac_err_id = 0;
}

void iwl_fw_error_dump(struct iwl_fw_runtime* fwrt);
int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime* fwrt, const struct iwl_fw_dump_desc* desc,
                            bool monitor_only, zx_duration_t delay);
int _iwl_fw_dbg_collect(struct iwl_fw_runtime* fwrt, enum iwl_fw_dbg_trigger trig, const char* str,
                        size_t len, struct iwl_fw_dbg_trigger_tlv* trigger);
int iwl_fw_dbg_collect(struct iwl_fw_runtime* fwrt, uint32_t id, const char* str, size_t len);
int iwl_fw_dbg_collect_trig(struct iwl_fw_runtime* fwrt, struct iwl_fw_dbg_trigger_tlv* trigger,
                            const char* fmt, ...);
int iwl_fw_start_dbg_conf(struct iwl_fw_runtime* fwrt, uint8_t id);

#define iwl_fw_dbg_trigger_enabled(fw, id)             \
  ({                                                   \
    void* __dbg_trigger = (fw)->dbg.trigger_tlv[(id)]; \
    unlikely(__dbg_trigger);                           \
  })

static inline struct iwl_fw_dbg_trigger_tlv* _iwl_fw_dbg_get_trigger(const struct iwl_fw* fw,
                                                                     enum iwl_fw_dbg_trigger id) {
  return fw->dbg.trigger_tlv[id];
}

#define iwl_fw_dbg_get_trigger(fw, id)        \
  ({                                          \
    BUILD_BUG_ON(!__builtin_constant_p(id));  \
    BUILD_BUG_ON((id) >= FW_DBG_TRIGGER_MAX); \
    _iwl_fw_dbg_get_trigger((fw), (id));      \
  })

#if 0   // NEEDS_PORTING
static inline bool iwl_fw_dbg_trigger_vif_match(struct iwl_fw_dbg_trigger_tlv* trig,
                                                struct wireless_dev* wdev) {
  uint32_t trig_vif = le32_to_cpu(trig->vif_type);

  return trig_vif == IWL_FW_DBG_CONF_VIF_ANY || wdev->iftype == trig_vif;
}
#endif  // NEEDS_PORTING

static inline bool iwl_fw_dbg_trigger_stop_conf_match(struct iwl_fw_runtime* fwrt,
                                                      struct iwl_fw_dbg_trigger_tlv* trig) {
  return ((trig->mode & IWL_FW_DBG_TRIGGER_STOP) &&
          (fwrt->dump.conf == FW_DBG_INVALID ||
           (BIT(fwrt->dump.conf) & le32_to_cpu(trig->stop_conf_ids))));
}

#if 0  // NEEDS_PORTING
static inline bool iwl_fw_dbg_no_trig_window(struct iwl_fw_runtime* fwrt, uint32_t id,
                                             uint32_t dis_ms) {
    unsigned long wind_jiff = msecs_to_jiffies(dis_ms);

    /* If this is the first event checked, jump to update start ts */
    if (fwrt->dump.non_collect_ts_start[id] &&
        (time_after(fwrt->dump.non_collect_ts_start[id] + wind_jiff, jiffies))) {
        return true;
    }

    fwrt->dump.non_collect_ts_start[id] = jiffies;
    return false;
}

static inline bool iwl_fw_dbg_trigger_check_stop(struct iwl_fw_runtime* fwrt,
                                                 struct wireless_dev* wdev,
                                                 struct iwl_fw_dbg_trigger_tlv* trig) {
    if (wdev && !iwl_fw_dbg_trigger_vif_match(trig, wdev)) { return false; }

    if (iwl_fw_dbg_no_trig_window(fwrt, le32_to_cpu(trig->id), le16_to_cpu(trig->trig_dis_ms))) {
        IWL_WARN(fwrt, "Trigger %d occurred while no-collect window.\n", trig->id);
        return false;
    }

    return iwl_fw_dbg_trigger_stop_conf_match(fwrt, trig);
}

static inline struct iwl_fw_dbg_trigger_tlv* _iwl_fw_dbg_trigger_on(
    struct iwl_fw_runtime* fwrt, struct wireless_dev* wdev, const enum iwl_fw_dbg_trigger id) {
    struct iwl_fw_dbg_trigger_tlv* trig;

    if (fwrt->trans->ini_valid) { return NULL; }

    if (!iwl_fw_dbg_trigger_enabled(fwrt->fw, id)) { return NULL; }

    trig = _iwl_fw_dbg_get_trigger(fwrt->fw, id);

    if (!iwl_fw_dbg_trigger_check_stop(fwrt, wdev, trig)) { return NULL; }

    return trig;
}

#define iwl_fw_dbg_trigger_on(fwrt, wdev, id)     \
  ({                                              \
    BUILD_BUG_ON(!__builtin_constant_p(id));      \
    BUILD_BUG_ON((id) >= FW_DBG_TRIGGER_MAX);     \
    _iwl_fw_dbg_trigger_on((fwrt), (wdev), (id)); \
  })

static inline bool _iwl_fw_ini_trigger_on(struct iwl_fw_runtime* fwrt,
                                          const enum iwl_fw_dbg_trigger id) {
    struct iwl_fw_ini_active_triggers* trig = &fwrt->dump.active_trigs[id];
    uint32_t ms;

    if (!fwrt->trans->ini_valid) { return false; }

    if (!trig || !trig->active) { return false; }

    ms = le32_to_cpu(trig->conf->ignore_consec);
    if (ms) { ms /= USEC_PER_MSEC; }

    if (iwl_fw_dbg_no_trig_window(fwrt, id, ms)) {
        IWL_WARN(fwrt, "Trigger %d fired in no-collect window\n", id);
        return false;
    }

    return true;
}

#define iwl_fw_ini_trigger_on(fwrt, wdev, id)     \
  ({                                              \
    BUILD_BUG_ON(!__builtin_constant_p(id));      \
    BUILD_BUG_ON((id) >= IWL_FW_TRIGGER_ID_NUM);  \
    _iwl_fw_ini_trigger_on((fwrt), (wdev), (id)); \
  })

static inline void _iwl_fw_dbg_trigger_simple_stop(struct iwl_fw_runtime* fwrt,
                                                   struct wireless_dev* wdev,
                                                   struct iwl_fw_dbg_trigger_tlv* trigger) {
    if (!trigger) { return; }

    if (!iwl_fw_dbg_trigger_check_stop(fwrt, wdev, trigger)) { return; }

    iwl_fw_dbg_collect_trig(fwrt, trigger, NULL);
}

#define iwl_fw_dbg_trigger_simple_stop(fwrt, wdev, trig) \
  _iwl_fw_dbg_trigger_simple_stop((fwrt), (wdev), iwl_fw_dbg_get_trigger((fwrt)->fw, (trig)))

#endif  // NEEDS_PORTING

static inline void iwl_fw_dump_conf_clear(struct iwl_fw_runtime* fwrt) {
  fwrt->dump.conf = FW_DBG_INVALID;
}

void iwl_fw_error_dump_wk(void* data);

static inline bool iwl_fw_dbg_type_on(struct iwl_fw_runtime* fwrt, uint32_t type) {
    return (fwrt->fw->dbg.dump_mask & BIT(type) || fwrt->trans->ini_valid);
}

static inline bool iwl_fw_dbg_is_d3_debug_enabled(struct iwl_fw_runtime* fwrt) {
  return false;
#if 0   // NEEDS_PORTING
    return fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_D3_DEBUG) &&
           fwrt->trans->cfg->d3_debug_data_length &&
           iwl_fw_dbg_type_on(fwrt, IWL_FW_ERROR_DUMP_D3_DEBUG_DATA);
#endif  // NEEDS_PORTING
}

static inline bool iwl_fw_dbg_is_paging_enabled(struct iwl_fw_runtime* fwrt) {
  return iwl_fw_dbg_type_on(fwrt, IWL_FW_ERROR_DUMP_PAGING) && !fwrt->trans->cfg->gen2 &&
         fwrt->fw->img[fwrt->cur_fw_img].paging_mem_size && fwrt->fw_paging_db[0].io_buf;
}

#if 0  // NEEDS_PORTING
void iwl_fw_dbg_read_d3_debug_data(struct iwl_fw_runtime* fwrt);
#endif  // NEEDS_PORTING

static inline void iwl_fw_flush_dump(struct iwl_fw_runtime* fwrt) { iwl_task_wait(fwrt->dump.wk); }

static inline void iwl_fw_cancel_dump(struct iwl_fw_runtime* fwrt) {
  iwl_task_cancel_sync(fwrt->dump.wk);
}

#ifdef CPTCFG_IWLWIFI_DEBUGFS
static inline void iwl_fw_cancel_timestamp(struct iwl_fw_runtime* fwrt) {
  fwrt->timestamp.delay = 0;
  cancel_delayed_work_sync(&fwrt->timestamp.wk);
}

void iwl_fw_trigger_timestamp(struct iwl_fw_runtime* fwrt, uint32_t delay);

static inline void iwl_fw_suspend_timestamp(struct iwl_fw_runtime* fwrt) {
  cancel_delayed_work_sync(&fwrt->timestamp.wk);
}

static inline void iwl_fw_resume_timestamp(struct iwl_fw_runtime* fwrt) {
  if (!fwrt->timestamp.delay) {
    return;
  }

  schedule_delayed_work(&fwrt->timestamp.wk, round_jiffies_relative(fwrt->timestamp.delay));
}

#else

static inline void iwl_fw_cancel_timestamp(struct iwl_fw_runtime* fwrt) {}

static inline void iwl_fw_trigger_timestamp(struct iwl_fw_runtime* fwrt, uint32_t delay) {}

static inline void iwl_fw_suspend_timestamp(struct iwl_fw_runtime* fwrt) {}

static inline void iwl_fw_resume_timestamp(struct iwl_fw_runtime* fwrt) {}

#endif /* CPTCFG_IWLWIFI_DEBUGFS */

void iwl_fw_assert_error_dump(struct iwl_fw_runtime* fwrt);
void iwl_fw_alive_error_dump(struct iwl_fw_runtime* fwrt);
void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime* fwrt);
void iwl_fw_dbg_apply_point(struct iwl_fw_runtime* fwrt, enum iwl_fw_ini_apply_point apply_point);

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_FW_DBG_H_
