Annotation of embedaddon/pciutils/lib/init.c, revision 1.1.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>