xref: /aosp_15_r20/external/pciutils/common.c (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
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