// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DEBUG_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DEBUG_H_

// This file contains Fuchsia-specific debug compilation support.

#include <lib/ddk/debug.h>
#include <stddef.h>
#include <stdio.h>
#include <zircon/assert.h>
#include <zircon/types.h>

#if defined(__cplusplus)
extern "C" {
#endif  // defined(__cplusplus)

struct device;

// NEEDS_TYPES
#define WARN(cond, y, z...) (!!(cond))
#define WARN_ON(x) (!!(x))
#define WARN_ON_ONCE(x) (!!(x))
#define BUILD_BUG_ON(x) ZX_ASSERT(!(x))

#define iwl_assert_lock_held(x) ZX_DEBUG_ASSERT(mtx_trylock(x) == thrd_busy)

// Print a message to the kernel, of different severities. Removes the trailing newline that is
// unnecessary for zxlogf() and creates blank lines in the logs. It's a bit ugly, but it allows
// us to reduce the diffs between our code and the original driver code. If that is no longer a
// concern at some point in the future, we can remove the newlines in the format strings and
// this extra step. This potential future improvement is tracked by fxbug.dev/80797.
#define IWL_ZXLOGF(level, fmt, args...)    \
  do {                                     \
    char* buf;                             \
    size_t buf_len;                        \
    buf_len = asprintf(&buf, fmt, ##args); \
    ZX_ASSERT(buf_len > 0 && buf);         \
    if (buf[buf_len - 1] == '\n') {        \
      buf[buf_len - 1] = '\0';             \
    }                                      \
    zxlogf(level, "%s", buf);              \
    free(buf);                             \
  } while (0)
#define __iwl_err(dev, rfkill_prefix, only_trace, fmt, args...) IWL_ZXLOGF(ERROR, fmt, ##args)
#define __iwl_warn(dev, fmt, args...) IWL_ZXLOGF(WARNING, fmt, ##args)
#define __iwl_info(dev, fmt, args...) IWL_ZXLOGF(INFO, fmt, ##args)
#define __iwl_crit(dev, fmt, args...) IWL_ZXLOGF(ERROR, fmt, ##args)
#define __iwl_dbg(dev, level, limit, function, fmt, args...) \
  IWL_ZXLOGF(TRACE, "(%s): " fmt, function, ##args)

// Publish a core dump.
zx_status_t iwl_debug_core_dump(struct device* dev, const char* core_dump_name,
                                const char** core_dump_ptrs, size_t* core_dump_sizes,
                                size_t core_dump_count);

// Hex dump function
//
// This function will dump the specified memory range with hex values and ASCII chars.
//
// - hex_dump(): the actual function printing the output.
//
//   Args:
//     prefix: a string outputting before each line.
//     ptr: the starting memory address to dump.
//     len: the length to dump (in bytes).
//
// - hex_dump_str(): for testing, returns one line only.
//
//   Args:
//     output: a output buffer larger than or equal to HEX_DUMP_BUF_SIZE bytes.
//     ptr: the starting memory address to dump.
//     len: the length to dump (in bytes).
//
//   Returns:
//     The output buffer given in the input argument. This is helpful in printf("%s").
//     NULL if the output buffer is too small.
//
static const char kNP = '.';  // the character used to show non-printable character.
void hex_dump(const char* prefix, const void* ptr, size_t len);
// for testing
#define HEX_DUMP_BUF_SIZE 70
char* hex_dump_str(char* output, size_t output_size, const void* ptr, size_t len);

#if defined(__cplusplus)
}  // extern "C"
#endif  // defined(__cplusplus)

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_PLATFORM_DEBUG_H_
