*
* Copyright (c) 1997--2018 Martin Mares <mj@ucw.cz>
*
- * Can be freely distributed and used under the terms of the GNU GPL.
+ * Can be freely distributed and used under the terms of the GNU GPL v2+.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <stdio.h>
NULL,
NULL,
#endif
+#if defined(PCI_HAVE_PM_ECAM)
+ &pm_ecam,
+#else
+ NULL,
+#endif
};
// If PCI_ACCESS_AUTO is selected, we probe the access methods in this order
PCI_ACCESS_WIN32_KLDBG,
PCI_ACCESS_WIN32_SYSDBG,
// Low-level methods poking the hardware directly
+ PCI_ACCESS_ECAM,
PCI_ACCESS_I386_TYPE1,
PCI_ACCESS_I386_TYPE2,
PCI_ACCESS_MMIO_TYPE1_EXT,
return a;
}
-void
-pci_init_internal(struct pci_access *a, int throw_errors, int skip_method)
+int
+pci_init_internal(struct pci_access *a, int skip_method)
{
if (!a->error)
a->error = pci_generic_error;
if (!a->debugging)
a->debug = pci_null_debug;
- if (a->method)
+ if (a->method != PCI_ACCESS_AUTO)
{
if (a->method >= PCI_ACCESS_MAX || !pci_methods[a->method])
- {
- if (throw_errors)
- a->error("This access method is not supported.");
- return;
- }
+ a->error("This access method is not supported.");
a->methods = pci_methods[a->method];
}
else
a->debug("...No.\n");
}
if (!a->methods)
- {
- if (throw_errors)
- a->error("Cannot find any working access method.");
- return;
- }
+ return 0;
}
a->debug("Decided to use %s\n", a->methods->name);
a->methods->init(a);
+ return 1;
}
void
pci_init_v35(struct pci_access *a)
{
- pci_init_internal(a, 1, -1);
+ if (!pci_init_internal(a, -1))
+ a->error("Cannot find any working access method.");
}
STATIC_ALIAS(void pci_init(struct pci_access *a), pci_init_v35(a));
SYMBOL_VERSION(pci_init_v30, pci_init@LIBPCI_3.0);
SYMBOL_VERSION(pci_init_v35, pci_init@@LIBPCI_3.5);
+struct pci_access *
+pci_clone_access(struct pci_access *a)
+{
+ struct pci_access *b = pci_alloc();
+
+ b->writeable = a->writeable;
+ b->buscentric = a->buscentric;
+ b->debugging = a->debugging;
+ b->error = a->error;
+ b->warning = a->warning;
+ b->debug = a->debug;
+
+ return b;
+}
+
void
pci_cleanup(struct pci_access *a)
{