/*
 * Copyright 2018 The Fuchsia Authors.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_MACROS_H_
#define GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_MACROS_H_

#include <zircon/assert.h>

#define ASSERT_MTX_HELD(mtx) ZX_ASSERT(mtx_trylock(mtx) != thrd_success)

#define BITMASK1(val) ((1UL << (val)) - 1)
#define BITMASK(lo, hi) ((BITMASK1((hi) + 1) & ~BITMASK1(lo)))

#define COND_WARN1(cond, filename, lineno) \
    ath10k_warn("unexpected condition %s at %s:%d\n", cond, filename, lineno)
#define COND_WARN(cond)                                        \
    ({                                                         \
        bool result = cond;                                    \
        if (result) { COND_WARN1(#cond, __FILE__, __LINE__); } \
        result;                                                \
    })
#define WARN_ONCE()                                                                     \
    do {                                                                                \
        static bool warn_next = true;                                                   \
        if (warn_next) {                                                                \
            ath10k_warn("code at %s:%d not expected to execute\n", __FILE__, __LINE__); \
            warn_next = false;                                                          \
        }                                                                               \
    } while (0)
#define COND_WARN_ONCE(cond)                       \
    ({                                             \
        static bool warn_next = true;              \
        bool result = cond;                        \
        if (result && warn_next) {                 \
            COND_WARN1(#cond, __FILE__, __LINE__); \
            warn_next = false;                     \
        }                                          \
        result;                                    \
    })

#define DIV_ROUNDUP(n, m) (((n) + ((m)-1)) / (m))

#define IS_ALIGNED(a, b) (!(((uintptr_t)(a)) & (((uintptr_t)(b)) - 1)))

#define IS_POW2(x) (((x) != 0) && (((x) & ((x)-1)) == 0))

#define LOG2(val) \
    (((val) == 0) ? 0 : (((sizeof(unsigned long long) * 8) - 1) - __builtin_clzll(val)))

#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MIN_T(t, a, b) (((t)(a) < (t)(b)) ? (t)(a) : (t)(b))

#define READ32(addr) (*(volatile uint32_t*)(uintptr_t)(addr))
#define WRITE32(addr, value)                                \
    do {                                                    \
        (*(volatile uint32_t*)(uintptr_t)(addr)) = (value); \
    } while (0)

#define ROUNDUP_POW2(val)              \
    ((unsigned long)(val) == 0 ? (val) \
                               : 1UL << ((sizeof(unsigned long) * 8) - __builtin_clzl((val)-1)))
#define ROUNDUP_LOG2(val) \
    ((unsigned long)(val) == 0 ? (val) : ((sizeof(unsigned long) * 8) - __builtin_clzl((val)-1)))

// Similar to snprintf, but returns actual size used, not size needed
#define SNPRINTF_USED(buf, size, format, ...)                  \
    ({                                                         \
        int result = snprintf(buf, size, format, __VA_ARGS__); \
        MIN_T(int, size, result);                              \
    })

#endif  // GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_MACROS_H_
