xref: /pciutils/bitops.h (revision a213399f)
11ffd04a8SMartin Mares /*
21ffd04a8SMartin Mares  *	The PCI Utilities -- Decode bits and bit fields
31ffd04a8SMartin Mares  *
41ffd04a8SMartin Mares  *	Copyright (c) 2023 Martin Mares <[email protected]>
51ffd04a8SMartin Mares  *	Copyright (c) 2023 KNS Group LLC (YADRO)
61ffd04a8SMartin Mares  *
71ffd04a8SMartin Mares  *	Can be freely distributed and used under the terms of the GNU GPL v2+.
81ffd04a8SMartin Mares  *
91ffd04a8SMartin Mares  *	SPDX-License-Identifier: GPL-2.0-or-later
101ffd04a8SMartin Mares  */
111ffd04a8SMartin Mares 
121ffd04a8SMartin Mares #ifndef _BITOPS_H
131ffd04a8SMartin Mares #define _BITOPS_H
141ffd04a8SMartin Mares 
151ffd04a8SMartin Mares #ifndef _PCI_LIB_H
161ffd04a8SMartin Mares #error Import only from pci.h
171ffd04a8SMartin Mares #endif
181ffd04a8SMartin Mares 
191ffd04a8SMartin Mares /* Useful macros for decoding of bits and bit fields */
201ffd04a8SMartin Mares 
211ffd04a8SMartin Mares #define FLAG(x, y) ((x & y) ? '+' : '-')
221ffd04a8SMartin Mares 
231ffd04a8SMartin Mares // Generate mask
241ffd04a8SMartin Mares 
251ffd04a8SMartin Mares #define BIT(at) ((u64)1 << (at))
261ffd04a8SMartin Mares // Boundaries inclusive
271ffd04a8SMartin Mares #define MASK(h, l)   ((((u64)1 << ((h) + 1)) - 1) & ~(((u64)1 << (l)) - 1))
281ffd04a8SMartin Mares 
291ffd04a8SMartin Mares // Get/set from register
301ffd04a8SMartin Mares 
311ffd04a8SMartin Mares #define BITS(x, at, width)      (((x) >> (at)) & ((1 << (width)) - 1))
321ffd04a8SMartin Mares #define GET_REG_MASK(reg, mask) (((reg) & (mask)) / ((mask) & ~((mask) << 1)))
331ffd04a8SMartin Mares #define SET_REG_MASK(reg, mask, val)                                                               \
341ffd04a8SMartin Mares   (((reg) & ~(mask)) | (((val) * ((mask) & ~((mask) << 1))) & (mask)))
351ffd04a8SMartin Mares 
361ffd04a8SMartin Mares #define TABLE(tab, x, buf)                                                                         \
37*a213399fSMingjie Shen   ((x) < sizeof(tab) / sizeof((tab)[0]) ? (tab)[x] : (snprintf((buf), sizeof(buf), "??%d", (x)), (buf)))
381ffd04a8SMartin Mares 
391ffd04a8SMartin Mares #endif
40