Annotation of embedaddon/pciutils/lib/init.c, revision 1.1
1.1 ! misho 1: /*
! 2: * The PCI Library -- Initialization and related things
! 3: *
! 4: * Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
! 5: *
! 6: * Can be freely distributed and used under the terms of the GNU GPL.
! 7: */
! 8:
! 9: #include <stdio.h>
! 10: #include <stdlib.h>
! 11: #include <stdarg.h>
! 12: #include <string.h>
! 13:
! 14: #include "internal.h"
! 15:
! 16: static struct pci_methods *pci_methods[PCI_ACCESS_MAX] = {
! 17: NULL,
! 18: #ifdef PCI_HAVE_PM_LINUX_SYSFS
! 19: &pm_linux_sysfs,
! 20: #else
! 21: NULL,
! 22: #endif
! 23: #ifdef PCI_HAVE_PM_LINUX_PROC
! 24: &pm_linux_proc,
! 25: #else
! 26: NULL,
! 27: #endif
! 28: #ifdef PCI_HAVE_PM_INTEL_CONF
! 29: &pm_intel_conf1,
! 30: &pm_intel_conf2,
! 31: #else
! 32: NULL,
! 33: NULL,
! 34: #endif
! 35: #ifdef PCI_HAVE_PM_FBSD_DEVICE
! 36: &pm_fbsd_device,
! 37: #else
! 38: NULL,
! 39: #endif
! 40: #ifdef PCI_HAVE_PM_AIX_DEVICE
! 41: &pm_aix_device,
! 42: #else
! 43: NULL,
! 44: #endif
! 45: #ifdef PCI_HAVE_PM_NBSD_LIBPCI
! 46: &pm_nbsd_libpci,
! 47: #else
! 48: NULL,
! 49: #endif
! 50: #ifdef PCI_HAVE_PM_OBSD_DEVICE
! 51: &pm_obsd_device,
! 52: #else
! 53: NULL,
! 54: #endif
! 55: #ifdef PCI_HAVE_PM_DUMP
! 56: &pm_dump,
! 57: #else
! 58: NULL,
! 59: #endif
! 60: };
! 61:
! 62: void *
! 63: pci_malloc(struct pci_access *a, int size)
! 64: {
! 65: void *x = malloc(size);
! 66:
! 67: if (!x)
! 68: a->error("Out of memory (allocation of %d bytes failed)", size);
! 69: return x;
! 70: }
! 71:
! 72: void
! 73: pci_mfree(void *x)
! 74: {
! 75: if (x)
! 76: free(x);
! 77: }
! 78:
! 79: char *
! 80: pci_strdup(struct pci_access *a, char *s)
! 81: {
! 82: int len = strlen(s) + 1;
! 83: char *t = pci_malloc(a, len);
! 84: memcpy(t, s, len);
! 85: return t;
! 86: }
! 87:
! 88: static void
! 89: pci_generic_error(char *msg, ...)
! 90: {
! 91: va_list args;
! 92:
! 93: va_start(args, msg);
! 94: fputs("pcilib: ", stderr);
! 95: vfprintf(stderr, msg, args);
! 96: fputc('\n', stderr);
! 97: exit(1);
! 98: }
! 99:
! 100: static void
! 101: pci_generic_warn(char *msg, ...)
! 102: {
! 103: va_list args;
! 104:
! 105: va_start(args, msg);
! 106: fputs("pcilib: ", stderr);
! 107: vfprintf(stderr, msg, args);
! 108: fputc('\n', stderr);
! 109: }
! 110:
! 111: static void
! 112: pci_generic_debug(char *msg, ...)
! 113: {
! 114: va_list args;
! 115:
! 116: va_start(args, msg);
! 117: vfprintf(stdout, msg, args);
! 118: va_end(args);
! 119: }
! 120:
! 121: static void
! 122: pci_null_debug(char *msg UNUSED, ...)
! 123: {
! 124: }
! 125:
! 126: int
! 127: pci_lookup_method(char *name)
! 128: {
! 129: int i;
! 130:
! 131: for (i=0; i<PCI_ACCESS_MAX; i++)
! 132: if (pci_methods[i] && !strcmp(pci_methods[i]->name, name))
! 133: return i;
! 134: return -1;
! 135: }
! 136:
! 137: char *
! 138: pci_get_method_name(int index)
! 139: {
! 140: if (index < 0 || index >= PCI_ACCESS_MAX)
! 141: return NULL;
! 142: else if (!pci_methods[index])
! 143: return "";
! 144: else
! 145: return pci_methods[index]->name;
! 146: }
! 147:
! 148: struct pci_access *
! 149: pci_alloc(void)
! 150: {
! 151: struct pci_access *a = malloc(sizeof(struct pci_access));
! 152: int i;
! 153:
! 154: memset(a, 0, sizeof(*a));
! 155: pci_set_name_list_path(a, PCI_PATH_IDS_DIR "/" PCI_IDS, 0);
! 156: #ifdef PCI_USE_DNS
! 157: pci_define_param(a, "net.domain", PCI_ID_DOMAIN, "DNS domain used for resolving of ID's");
! 158: pci_define_param(a, "net.cache_name", "~/.pciids-cache", "Name of the ID cache file");
! 159: a->id_lookup_mode = PCI_LOOKUP_CACHE;
! 160: #endif
! 161: for (i=0; i<PCI_ACCESS_MAX; i++)
! 162: if (pci_methods[i] && pci_methods[i]->config)
! 163: pci_methods[i]->config(a);
! 164: return a;
! 165: }
! 166:
! 167: void
! 168: pci_init(struct pci_access *a)
! 169: {
! 170: if (!a->error)
! 171: a->error = pci_generic_error;
! 172: if (!a->warning)
! 173: a->warning = pci_generic_warn;
! 174: if (!a->debug)
! 175: a->debug = pci_generic_debug;
! 176: if (!a->debugging)
! 177: a->debug = pci_null_debug;
! 178:
! 179: if (a->method)
! 180: {
! 181: if (a->method >= PCI_ACCESS_MAX || !pci_methods[a->method])
! 182: a->error("This access method is not supported.");
! 183: a->methods = pci_methods[a->method];
! 184: }
! 185: else
! 186: {
! 187: unsigned int i;
! 188: for (i=0; i<PCI_ACCESS_MAX; i++)
! 189: if (pci_methods[i])
! 190: {
! 191: a->debug("Trying method %d...", i);
! 192: if (pci_methods[i]->detect(a))
! 193: {
! 194: a->debug("...OK\n");
! 195: a->methods = pci_methods[i];
! 196: a->method = i;
! 197: break;
! 198: }
! 199: a->debug("...No.\n");
! 200: }
! 201: if (!a->methods)
! 202: a->error("Cannot find any working access method.");
! 203: }
! 204: a->debug("Decided to use %s\n", a->methods->name);
! 205: a->methods->init(a);
! 206: }
! 207:
! 208: void
! 209: pci_cleanup(struct pci_access *a)
! 210: {
! 211: struct pci_dev *d, *e;
! 212:
! 213: for (d=a->devices; d; d=e)
! 214: {
! 215: e = d->next;
! 216: pci_free_dev(d);
! 217: }
! 218: if (a->methods)
! 219: a->methods->cleanup(a);
! 220: pci_free_name_list(a);
! 221: pci_free_params(a);
! 222: pci_set_name_list_path(a, NULL, 0);
! 223: pci_mfree(a);
! 224: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>