xref: /pciutils/lib/types.h (revision e52b479a)
1489233b4SMartin Mares /*
2489233b4SMartin Mares  *	The PCI Library -- Types and Format Strings
3489233b4SMartin Mares  *
4884a1634SMartin Mares  *	Copyright (c) 1997--2022 Martin Mares <[email protected]>
5489233b4SMartin Mares  *
661829219SMartin Mares  *	Can be freely distributed and used under the terms of the GNU GPL v2+
761829219SMartin Mares  *
861829219SMartin Mares  *	SPDX-License-Identifier: GPL-2.0-or-later
9489233b4SMartin Mares  */
10489233b4SMartin Mares 
11489233b4SMartin Mares #include <sys/types.h>
12*e52b479aSMartin Mares #include <stddef.h>
13489233b4SMartin Mares 
14489233b4SMartin Mares #ifndef PCI_HAVE_Uxx_TYPES
15489233b4SMartin Mares 
16489233b4SMartin Mares #ifdef PCI_OS_WINDOWS
17e4ec9322SPali Rohár /* On Windows compilers, use <windows.h> */
18e4ec9322SPali Rohár #include <windows.h>
1909156b3bSMartin Mares typedef BYTE u8;
2009156b3bSMartin Mares typedef WORD u16;
2109156b3bSMartin Mares typedef DWORD u32;
223f30d0d1SMartin Mares typedef unsigned __int64 u64;
233f30d0d1SMartin Mares #define PCI_U64_FMT_X "I64x"
24c3d1d465SPali Rohár #define PCI_U64_FMT_U "I64u"
253f30d0d1SMartin Mares 
260128c5b1SMartin Mares #else
273f30d0d1SMartin Mares /* Use standard types in C99 and newer */
28e49ed044SMartin Mares #include <stdint.h>
293f30d0d1SMartin Mares #include <inttypes.h>
30e49ed044SMartin Mares typedef uint8_t u8;
31e49ed044SMartin Mares typedef uint16_t u16;
32e49ed044SMartin Mares typedef uint32_t u32;
333f30d0d1SMartin Mares typedef uint64_t u64;
343f30d0d1SMartin Mares #define PCI_U64_FMT_X PRIx64
35c3d1d465SPali Rohár #define PCI_U64_FMT_U PRIu64
36489233b4SMartin Mares #endif
37489233b4SMartin Mares 
38489233b4SMartin Mares #endif	/* PCI_HAVE_Uxx_TYPES */
39489233b4SMartin Mares 
40489233b4SMartin Mares #ifdef PCI_HAVE_64BIT_ADDRESS
41489233b4SMartin Mares typedef u64 pciaddr_t;
423f30d0d1SMartin Mares #define PCIADDR_T_FMT "%08" PCI_U64_FMT_X
433f30d0d1SMartin Mares #define PCIADDR_PORT_FMT "%04" PCI_U64_FMT_X
44489233b4SMartin Mares #else
45489233b4SMartin Mares typedef u32 pciaddr_t;
46489233b4SMartin Mares #define PCIADDR_T_FMT "%08x"
47489233b4SMartin Mares #define PCIADDR_PORT_FMT "%04x"
48489233b4SMartin Mares #endif
49489233b4SMartin Mares 
50489233b4SMartin Mares #ifdef PCI_ARCH_SPARC64
51489233b4SMartin Mares /* On sparc64 Linux the kernel reports remapped port addresses and IRQ numbers */
52489233b4SMartin Mares #undef PCIADDR_PORT_FMT
53489233b4SMartin Mares #define PCIADDR_PORT_FMT PCIADDR_T_FMT
54489233b4SMartin Mares #define PCIIRQ_FMT "%08x"
55489233b4SMartin Mares #else
56489233b4SMartin Mares #define PCIIRQ_FMT "%d"
57489233b4SMartin Mares #endif
584f6b38caSMartin Mares 
5917c39b8aSFrançois Revol #if defined(__GNUC__) && __GNUC__ > 2
604f6b38caSMartin Mares #define PCI_PRINTF(x,y) __attribute__((format(printf, x, y)))
61884a1634SMartin Mares #define PCI_NONRET __attribute((noreturn))
62aa5a16efSPali Rohár #define PCI_PACKED __attribute((packed))
634f6b38caSMartin Mares #else
644f6b38caSMartin Mares #define PCI_PRINTF(x,y)
65884a1634SMartin Mares #define PCI_NONRET
66aa5a16efSPali Rohár #define PCI_PACKED
674f6b38caSMartin Mares #endif
68