]> git.ipfire.org Git - thirdparty/pciutils.git/blame - lib/internal.h
header.h: Fix type 1 header comment
[thirdparty/pciutils.git] / lib / internal.h
CommitLineData
727ce158 1/*
489233b4 2 * The PCI Library -- Internal Stuff
727ce158 3 *
8e9299e4 4 * Copyright (c) 1997--2022 Martin Mares <mj@ucw.cz>
727ce158 5 *
61829219
MM
6 * Can be freely distributed and used under the terms of the GNU GPL v2+
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
727ce158
MM
9 */
10
5b52ae79
A
11#ifndef _INTERNAL_H
12#define _INTERNAL_H
13
59a0211a
MM
14#include "config.h"
15
16#ifdef PCI_SHARED_LIB
2f421184 17#define PCI_ABI __attribute__((visibility("default")))
6e4adbf5
MM
18// Functions, which are bound to externally visible symbols by the versioning
19// mechanism, have to be declared as VERSIONED. Otherwise, GCC with global
20// optimizations is happy to optimize them away, leading to linker failures.
52aecc75 21#define VERSIONED_ABI __attribute__((used)) PCI_ABI
8d1cb3d7 22#ifdef __APPLE__
e5d1d2db 23#define STATIC_ALIAS(_decl, _for) VERSIONED_ABI _decl { return _for; }
35383c12
MM
24#define DEFINE_ALIAS(_decl, _for)
25#define SYMBOL_VERSION(_int, _ext)
52aecc75 26#else
2d16e3a7 27#define DEFINE_ALIAS(_decl, _for) extern _decl __attribute__((alias(#_for))) VERSIONED_ABI
32934d5b 28#ifdef _WIN32
0e48f9b7 29#define STATIC_ALIAS(_decl, _for) VERSIONED_ABI _decl { return _for; }
32934d5b
PR
30/* GCC does not support asm .symver directive for Windows targets, so define new external global function symbol as alias to internal symbol */
31#define SYMBOL_VERSION(_int, _ext) asm(".globl\t" PCI_STRINGIFY(__MINGW_USYMBOL(_ext)) "\n\t" \
32 ".def\t" PCI_STRINGIFY(__MINGW_USYMBOL(_ext)) ";\t.scl\t2;\t.type\t32;\t.endef\n\t" \
33 ".set\t" PCI_STRINGIFY(__MINGW_USYMBOL(_ext)) "," PCI_STRINGIFY(__MINGW_USYMBOL(_int)))
34#else
0e48f9b7 35#define STATIC_ALIAS(_decl, _for)
52aecc75 36#define SYMBOL_VERSION(_int, _ext) asm(".symver " #_int "," #_ext)
8d1cb3d7 37#endif
32934d5b 38#endif
89c51b98 39#else
52aecc75 40#define VERSIONED_ABI
89c51b98
MM
41#define STATIC_ALIAS(_decl, _for) _decl { return _for; }
42#define DEFINE_ALIAS(_decl, _for)
43#define SYMBOL_VERSION(_int, _ext)
2f421184
MM
44#endif
45
727ce158 46#include "pci.h"
489233b4 47#include "sysdep.h"
727ce158 48
32934d5b
PR
49/* Old 32-bit-only versions of MinGW32 do not define __MINGW_USYMBOL macro */
50#ifdef __MINGW32__
51#ifndef __MINGW_USYMBOL
52#define __MINGW_USYMBOL(sym) _##sym
53#endif
54#endif
55
56#define _PCI_STRINGIFY(x) #x
57#define PCI_STRINGIFY(x) _PCI_STRINGIFY(x)
58
727ce158
MM
59struct pci_methods {
60 char *name;
9ff67879 61 char *help;
727ce158
MM
62 void (*config)(struct pci_access *);
63 int (*detect)(struct pci_access *);
64 void (*init)(struct pci_access *);
65 void (*cleanup)(struct pci_access *);
66 void (*scan)(struct pci_access *);
8e9299e4 67 void (*fill_info)(struct pci_dev *, unsigned int flags);
727ce158
MM
68 int (*read)(struct pci_dev *, int pos, byte *buf, int len);
69 int (*write)(struct pci_dev *, int pos, byte *buf, int len);
52c81519 70 int (*read_vpd)(struct pci_dev *, int pos, byte *buf, int len);
727ce158
MM
71 void (*init_dev)(struct pci_dev *);
72 void (*cleanup_dev)(struct pci_dev *);
73};
74
6d5e39ac 75/* generic.c */
8d750a8d
PR
76void pci_generic_scan_bus(struct pci_access *, byte *busmap, int domain, int bus);
77void pci_generic_scan_domain(struct pci_access *, int domain);
727ce158 78void pci_generic_scan(struct pci_access *);
8e9299e4 79void pci_generic_fill_info(struct pci_dev *, unsigned int flags);
727ce158
MM
80int pci_generic_block_read(struct pci_dev *, int pos, byte *buf, int len);
81int pci_generic_block_write(struct pci_dev *, int pos, byte *buf, int len);
82
08609192
PR
83/* emulated.c */
84int pci_emulated_read(struct pci_dev *d, int pos, byte *buf, int len);
85
6d5e39ac 86/* init.c */
727ce158
MM
87void *pci_malloc(struct pci_access *, int);
88void pci_mfree(void *);
ac357d3b 89char *pci_strdup(struct pci_access *a, const char *s);
ea404c2a
MM
90struct pci_access *pci_clone_access(struct pci_access *a);
91int pci_init_internal(struct pci_access *a, int skip_method);
727ce158 92
25471140 93void pci_init_v30(struct pci_access *a) VERSIONED_ABI;
2afb0889 94void pci_init_v35(struct pci_access *a) VERSIONED_ABI;
ab61451d 95
6d5e39ac 96/* access.c */
727ce158
MM
97struct pci_dev *pci_alloc_dev(struct pci_access *);
98int pci_link_dev(struct pci_access *, struct pci_dev *);
99
52aecc75
MM
100int pci_fill_info_v30(struct pci_dev *, int flags) VERSIONED_ABI;
101int pci_fill_info_v31(struct pci_dev *, int flags) VERSIONED_ABI;
102int pci_fill_info_v32(struct pci_dev *, int flags) VERSIONED_ABI;
103int pci_fill_info_v33(struct pci_dev *, int flags) VERSIONED_ABI;
7ef7f3ec 104int pci_fill_info_v34(struct pci_dev *, int flags) VERSIONED_ABI;
3d0a6d88 105int pci_fill_info_v35(struct pci_dev *, int flags) VERSIONED_ABI;
119c1376 106int pci_fill_info_v38(struct pci_dev *, int flags) VERSIONED_ABI;
ef78f397 107int pci_fill_info_v313(struct pci_dev *, int flags) VERSIONED_ABI;
89c51b98 108
8e9299e4
MM
109static inline int want_fill(struct pci_dev *d, unsigned want_fields, unsigned int try_fields)
110{
111 want_fields &= try_fields;
112 if ((d->known_fields & want_fields) == want_fields)
113 return 0;
114 else
115 {
116 d->known_fields |= try_fields;
117 return 1;
118 }
119}
120
119c1376
PR
121static inline void clear_fill(struct pci_dev *d, unsigned clear_fields)
122{
123 d->known_fields &= ~clear_fields;
124}
125
c02d903c
MM
126struct pci_property {
127 struct pci_property *next;
128 u32 key;
129 char value[1];
130};
131
132char *pci_set_property(struct pci_dev *d, u32 key, char *value);
133
6d5e39ac 134/* params.c */
d32e8a44 135struct pci_param *pci_define_param(struct pci_access *acc, char *param, char *val, char *help);
98ccf6d6 136int pci_set_param_internal(struct pci_access *acc, char *param, char *val, int copy);
d6dcc545 137void pci_free_params(struct pci_access *acc);
fa182368 138
6d5e39ac 139/* caps.c */
8e9299e4 140void pci_scan_caps(struct pci_dev *, unsigned int want_fields);
6d5e39ac
MM
141void pci_free_caps(struct pci_dev *);
142
727ce158 143extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc,
94db5c82 144 pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_obsd_device,
26c8b543 145 pm_dump, pm_linux_sysfs, pm_darwin, pm_sylixos_device, pm_hurd,
2ba0f6f4 146 pm_mmio_conf1, pm_mmio_conf1_ext, pm_ecam,
021d41cf
GG
147 pm_win32_cfgmgr32, pm_win32_kldbg, pm_win32_sysdbg, pm_aos_expansion,
148 pm_rt_thread_smart_dm;
5b52ae79
A
149
150#endif