1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker * The PCI Utilities -- Common Functions
3*c2e0c6b5SAndroid Build Coastguard Worker *
4*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 1997--2016 Martin Mares <[email protected]>
5*c2e0c6b5SAndroid Build Coastguard Worker *
6*c2e0c6b5SAndroid Build Coastguard Worker * Can be freely distributed and used under the terms of the GNU GPL v2+.
7*c2e0c6b5SAndroid Build Coastguard Worker *
8*c2e0c6b5SAndroid Build Coastguard Worker * SPDX-License-Identifier: GPL-2.0-or-later
9*c2e0c6b5SAndroid Build Coastguard Worker */
10*c2e0c6b5SAndroid Build Coastguard Worker
11*c2e0c6b5SAndroid Build Coastguard Worker #include <stdio.h>
12*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
13*c2e0c6b5SAndroid Build Coastguard Worker #include <stdlib.h>
14*c2e0c6b5SAndroid Build Coastguard Worker #include <stdarg.h>
15*c2e0c6b5SAndroid Build Coastguard Worker
16*c2e0c6b5SAndroid Build Coastguard Worker #include "pciutils.h"
17*c2e0c6b5SAndroid Build Coastguard Worker
18*c2e0c6b5SAndroid Build Coastguard Worker void NONRET
die(char * msg,...)19*c2e0c6b5SAndroid Build Coastguard Worker die(char *msg, ...)
20*c2e0c6b5SAndroid Build Coastguard Worker {
21*c2e0c6b5SAndroid Build Coastguard Worker va_list args;
22*c2e0c6b5SAndroid Build Coastguard Worker
23*c2e0c6b5SAndroid Build Coastguard Worker va_start(args, msg);
24*c2e0c6b5SAndroid Build Coastguard Worker fprintf(stderr, "%s: ", program_name);
25*c2e0c6b5SAndroid Build Coastguard Worker vfprintf(stderr, msg, args);
26*c2e0c6b5SAndroid Build Coastguard Worker fputc('\n', stderr);
27*c2e0c6b5SAndroid Build Coastguard Worker exit(1);
28*c2e0c6b5SAndroid Build Coastguard Worker }
29*c2e0c6b5SAndroid Build Coastguard Worker
30*c2e0c6b5SAndroid Build Coastguard Worker void *
xmalloc(size_t howmuch)31*c2e0c6b5SAndroid Build Coastguard Worker xmalloc(size_t howmuch)
32*c2e0c6b5SAndroid Build Coastguard Worker {
33*c2e0c6b5SAndroid Build Coastguard Worker void *p = malloc(howmuch);
34*c2e0c6b5SAndroid Build Coastguard Worker if (!p)
35*c2e0c6b5SAndroid Build Coastguard Worker die("Unable to allocate %d bytes of memory", (int) howmuch);
36*c2e0c6b5SAndroid Build Coastguard Worker return p;
37*c2e0c6b5SAndroid Build Coastguard Worker }
38*c2e0c6b5SAndroid Build Coastguard Worker
39*c2e0c6b5SAndroid Build Coastguard Worker void *
xrealloc(void * ptr,size_t howmuch)40*c2e0c6b5SAndroid Build Coastguard Worker xrealloc(void *ptr, size_t howmuch)
41*c2e0c6b5SAndroid Build Coastguard Worker {
42*c2e0c6b5SAndroid Build Coastguard Worker void *p = realloc(ptr, howmuch);
43*c2e0c6b5SAndroid Build Coastguard Worker if (!p)
44*c2e0c6b5SAndroid Build Coastguard Worker die("Unable to allocate %d bytes of memory", (int) howmuch);
45*c2e0c6b5SAndroid Build Coastguard Worker return p;
46*c2e0c6b5SAndroid Build Coastguard Worker }
47*c2e0c6b5SAndroid Build Coastguard Worker
48*c2e0c6b5SAndroid Build Coastguard Worker char *
xstrdup(const char * str)49*c2e0c6b5SAndroid Build Coastguard Worker xstrdup(const char *str)
50*c2e0c6b5SAndroid Build Coastguard Worker {
51*c2e0c6b5SAndroid Build Coastguard Worker int len = strlen(str) + 1;
52*c2e0c6b5SAndroid Build Coastguard Worker char *copy = xmalloc(len);
53*c2e0c6b5SAndroid Build Coastguard Worker memcpy(copy, str, len);
54*c2e0c6b5SAndroid Build Coastguard Worker return copy;
55*c2e0c6b5SAndroid Build Coastguard Worker }
56*c2e0c6b5SAndroid Build Coastguard Worker
57*c2e0c6b5SAndroid Build Coastguard Worker static void
set_pci_method(struct pci_access * pacc,char * arg)58*c2e0c6b5SAndroid Build Coastguard Worker set_pci_method(struct pci_access *pacc, char *arg)
59*c2e0c6b5SAndroid Build Coastguard Worker {
60*c2e0c6b5SAndroid Build Coastguard Worker char *name;
61*c2e0c6b5SAndroid Build Coastguard Worker int i;
62*c2e0c6b5SAndroid Build Coastguard Worker
63*c2e0c6b5SAndroid Build Coastguard Worker if (!strcmp(arg, "help"))
64*c2e0c6b5SAndroid Build Coastguard Worker {
65*c2e0c6b5SAndroid Build Coastguard Worker printf("Known PCI access methods:\n\n");
66*c2e0c6b5SAndroid Build Coastguard Worker for (i=0; name = pci_get_method_name(i); i++)
67*c2e0c6b5SAndroid Build Coastguard Worker if (name[0])
68*c2e0c6b5SAndroid Build Coastguard Worker printf("%s\n", name);
69*c2e0c6b5SAndroid Build Coastguard Worker exit(0);
70*c2e0c6b5SAndroid Build Coastguard Worker }
71*c2e0c6b5SAndroid Build Coastguard Worker else
72*c2e0c6b5SAndroid Build Coastguard Worker {
73*c2e0c6b5SAndroid Build Coastguard Worker i = pci_lookup_method(arg);
74*c2e0c6b5SAndroid Build Coastguard Worker if (i < 0)
75*c2e0c6b5SAndroid Build Coastguard Worker die("No such PCI access method: %s (see `-A help' for a list)", arg);
76*c2e0c6b5SAndroid Build Coastguard Worker pacc->method = i;
77*c2e0c6b5SAndroid Build Coastguard Worker }
78*c2e0c6b5SAndroid Build Coastguard Worker }
79*c2e0c6b5SAndroid Build Coastguard Worker
80*c2e0c6b5SAndroid Build Coastguard Worker static void
set_pci_option(struct pci_access * pacc,char * arg)81*c2e0c6b5SAndroid Build Coastguard Worker set_pci_option(struct pci_access *pacc, char *arg)
82*c2e0c6b5SAndroid Build Coastguard Worker {
83*c2e0c6b5SAndroid Build Coastguard Worker if (!strcmp(arg, "help"))
84*c2e0c6b5SAndroid Build Coastguard Worker {
85*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *p;
86*c2e0c6b5SAndroid Build Coastguard Worker printf("Known PCI access parameters:\n\n");
87*c2e0c6b5SAndroid Build Coastguard Worker for (p=NULL; p=pci_walk_params(pacc, p);)
88*c2e0c6b5SAndroid Build Coastguard Worker printf("%-20s %s (%s)\n", p->param, p->help, p->value);
89*c2e0c6b5SAndroid Build Coastguard Worker exit(0);
90*c2e0c6b5SAndroid Build Coastguard Worker }
91*c2e0c6b5SAndroid Build Coastguard Worker else
92*c2e0c6b5SAndroid Build Coastguard Worker {
93*c2e0c6b5SAndroid Build Coastguard Worker char *sep = strchr(arg, '=');
94*c2e0c6b5SAndroid Build Coastguard Worker if (!sep)
95*c2e0c6b5SAndroid Build Coastguard Worker die("Invalid PCI access parameter syntax: %s", arg);
96*c2e0c6b5SAndroid Build Coastguard Worker *sep++ = 0;
97*c2e0c6b5SAndroid Build Coastguard Worker if (pci_set_param(pacc, arg, sep) < 0)
98*c2e0c6b5SAndroid Build Coastguard Worker die("Unrecognized PCI access parameter: %s (see `-O help' for a list)", arg);
99*c2e0c6b5SAndroid Build Coastguard Worker }
100*c2e0c6b5SAndroid Build Coastguard Worker }
101*c2e0c6b5SAndroid Build Coastguard Worker
102*c2e0c6b5SAndroid Build Coastguard Worker int
parse_generic_option(int i,struct pci_access * pacc,char * arg)103*c2e0c6b5SAndroid Build Coastguard Worker parse_generic_option(int i, struct pci_access *pacc, char *arg)
104*c2e0c6b5SAndroid Build Coastguard Worker {
105*c2e0c6b5SAndroid Build Coastguard Worker switch (i)
106*c2e0c6b5SAndroid Build Coastguard Worker {
107*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_HAVE_PM_INTEL_CONF
108*c2e0c6b5SAndroid Build Coastguard Worker case 'H':
109*c2e0c6b5SAndroid Build Coastguard Worker if (!strcmp(arg, "1"))
110*c2e0c6b5SAndroid Build Coastguard Worker pacc->method = PCI_ACCESS_I386_TYPE1;
111*c2e0c6b5SAndroid Build Coastguard Worker else if (!strcmp(arg, "2"))
112*c2e0c6b5SAndroid Build Coastguard Worker pacc->method = PCI_ACCESS_I386_TYPE2;
113*c2e0c6b5SAndroid Build Coastguard Worker else
114*c2e0c6b5SAndroid Build Coastguard Worker die("Unknown hardware configuration type %s", arg);
115*c2e0c6b5SAndroid Build Coastguard Worker break;
116*c2e0c6b5SAndroid Build Coastguard Worker #endif
117*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_HAVE_PM_DUMP
118*c2e0c6b5SAndroid Build Coastguard Worker case 'F':
119*c2e0c6b5SAndroid Build Coastguard Worker pci_set_param(pacc, "dump.name", arg);
120*c2e0c6b5SAndroid Build Coastguard Worker pacc->method = PCI_ACCESS_DUMP;
121*c2e0c6b5SAndroid Build Coastguard Worker break;
122*c2e0c6b5SAndroid Build Coastguard Worker #endif
123*c2e0c6b5SAndroid Build Coastguard Worker case 'A':
124*c2e0c6b5SAndroid Build Coastguard Worker set_pci_method(pacc, arg);
125*c2e0c6b5SAndroid Build Coastguard Worker break;
126*c2e0c6b5SAndroid Build Coastguard Worker case 'G':
127*c2e0c6b5SAndroid Build Coastguard Worker pacc->debugging++;
128*c2e0c6b5SAndroid Build Coastguard Worker break;
129*c2e0c6b5SAndroid Build Coastguard Worker case 'O':
130*c2e0c6b5SAndroid Build Coastguard Worker set_pci_option(pacc, arg);
131*c2e0c6b5SAndroid Build Coastguard Worker break;
132*c2e0c6b5SAndroid Build Coastguard Worker default:
133*c2e0c6b5SAndroid Build Coastguard Worker return 0;
134*c2e0c6b5SAndroid Build Coastguard Worker }
135*c2e0c6b5SAndroid Build Coastguard Worker return 1;
136*c2e0c6b5SAndroid Build Coastguard Worker }
137