#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/bitfield.h>
#define CHECK_ENC_GET_U(tp, v, field, res) do { \
_res = u##tp##_encode_bits(v, field); \
pr_warn("u" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != " #res "\n",\
if (u##tp##_get_bits(_res, field) != v) \
#define CHECK_ENC_GET_LE(tp, v, field, res) do { \
_res = le##tp##_encode_bits(v, field); \
if (_res != cpu_to_le##tp(res)) { \
pr_warn("le" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx\n",\
(u64)le##tp##_to_cpu(_res), \
if (le##tp##_get_bits(_res, field) != v) \
#define CHECK_ENC_GET_BE(tp, v, field, res) do { \
_res = be##tp##_encode_bits(v, field); \
if (_res != cpu_to_be##tp(res)) { \
pr_warn("be" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx\n",\
(u64)be##tp##_to_cpu(_res), \
if (be##tp##_get_bits(_res, field) != v) \
#define CHECK_ENC_GET(tp, v, field, res) do { \
CHECK_ENC_GET_U(tp, v, field, res); \
CHECK_ENC_GET_LE(tp, v, field, res); \
CHECK_ENC_GET_BE(tp, v, field, res); \