blob: d19c65ae4148ddc1bb0d725039183f8add3f4c85 [file] [log] [blame]
/*
* 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_