]> mj.ucw.cz Git - pciutils.git/commitdiff
libpci: Add separate file for bit manipulation functions
authorNikita Proshkin <n.proshkin@yadro.com>
Wed, 27 Dec 2023 09:44:53 +0000 (14:44 +0500)
committerMartin Mares <mj@ucw.cz>
Sat, 17 Feb 2024 22:44:34 +0000 (23:44 +0100)
Move several macros from lspci and add some more for operations with
bit masks.

Reviewed-by: Sergei Miroshnichenko <s.miroshnichenko@yadro.com>
Signed-off-by: Nikita Proshkin <n.proshkin@yadro.com>
Makefile
lib/bitops.h [new file with mode: 0644]
lib/pci.h
lspci.h

index 228cb5693aaf7fa0297e295ec3539708eb1e67dc..52538e8ba3771f3a47060e347a1dc72e518cf9ee 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -62,7 +62,7 @@ LIBNAME=libpci
 
 -include lib/config.mk
 
-PCIINC=lib/config.h lib/header.h lib/pci.h lib/types.h lib/sysdep.h
+PCIINC=lib/config.h lib/header.h lib/pci.h lib/types.h lib/sysdep.h lib/bitops.h
 PCIINC_INS=lib/config.h lib/header.h lib/pci.h lib/types.h
 
 export
diff --git a/lib/bitops.h b/lib/bitops.h
new file mode 100644 (file)
index 0000000..029741e
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *     The PCI Utilities -- Decode bits and bit fields
+ *
+ *     Copyright (c) 2023 Martin Mares <mj@ucw.cz>
+ *     Copyright (c) 2023 KNS Group LLC (YADRO)
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL v2+.
+ *
+ *     SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef _BITOPS_H
+#define _BITOPS_H
+
+#ifndef _PCI_LIB_H
+#error Import only from pci.h
+#endif
+
+/* Useful macros for decoding of bits and bit fields */
+
+#define FLAG(x, y) ((x & y) ? '+' : '-')
+
+// Generate mask
+
+#define BIT(at) ((u64)1 << (at))
+// Boundaries inclusive
+#define MASK(h, l)   ((((u64)1 << ((h) + 1)) - 1) & ~(((u64)1 << (l)) - 1))
+
+// Get/set from register
+
+#define BITS(x, at, width)      (((x) >> (at)) & ((1 << (width)) - 1))
+#define GET_REG_MASK(reg, mask) (((reg) & (mask)) / ((mask) & ~((mask) << 1)))
+#define SET_REG_MASK(reg, mask, val)                                                               \
+  (((reg) & ~(mask)) | (((val) * ((mask) & ~((mask) << 1))) & (mask)))
+
+#define TABLE(tab, x, buf)                                                                         \
+  ((x) < sizeof(tab) / sizeof((tab)[0]) ? (tab)[x] : (sprintf((buf), "??%d", (x)), (buf)))
+
+#endif
index 03b4c41694ff03d4302f6564336d4e6757f43162..d309cbba6bc3c87f317b8da3cb62dee09ec108ea 100644 (file)
--- a/lib/pci.h
+++ b/lib/pci.h
@@ -17,6 +17,7 @@
 
 #include "header.h"
 #include "types.h"
+#include "bitops.h"
 
 #define PCI_LIB_VERSION 0x030a00
 
diff --git a/lspci.h b/lspci.h
index c5a9ec726871770cbeb23206a2530c63610997a1..4d711a555d65f7a5233e120afc56de56fcc07383 100644 (file)
--- a/lspci.h
+++ b/lspci.h
@@ -58,12 +58,6 @@ u32 get_conf_long(struct device *d, unsigned int pos);
 word get_conf_word(struct device *d, unsigned int pos);
 byte get_conf_byte(struct device *d, unsigned int pos);
 
-/* Useful macros for decoding of bits and bit fields */
-
-#define FLAG(x,y) ((x & y) ? '+' : '-')
-#define BITS(x,at,width) (((x) >> (at)) & ((1 << (width)) - 1))
-#define TABLE(tab,x,buf) ((x) < sizeof(tab)/sizeof((tab)[0]) ? (tab)[x] : (sprintf((buf), "??%d", (x)), (buf)))
-
 /* ls-vpd.c */
 
 void cap_vpd(struct device *d);