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