1*c2e0c6b5SAndroid Build Coastguard Worker /*
2*c2e0c6b5SAndroid Build Coastguard Worker * The PCI Library -- Parameters
3*c2e0c6b5SAndroid Build Coastguard Worker *
4*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 2008--2023 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 <stdlib.h>
13*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
14*c2e0c6b5SAndroid Build Coastguard Worker
15*c2e0c6b5SAndroid Build Coastguard Worker #include "internal.h"
16*c2e0c6b5SAndroid Build Coastguard Worker
17*c2e0c6b5SAndroid Build Coastguard Worker char *
pci_get_param(struct pci_access * acc,char * param)18*c2e0c6b5SAndroid Build Coastguard Worker pci_get_param(struct pci_access *acc, char *param)
19*c2e0c6b5SAndroid Build Coastguard Worker {
20*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *p;
21*c2e0c6b5SAndroid Build Coastguard Worker
22*c2e0c6b5SAndroid Build Coastguard Worker for (p=acc->params; p; p=p->next)
23*c2e0c6b5SAndroid Build Coastguard Worker if (!strcmp(p->param, param))
24*c2e0c6b5SAndroid Build Coastguard Worker return p->value;
25*c2e0c6b5SAndroid Build Coastguard Worker return NULL;
26*c2e0c6b5SAndroid Build Coastguard Worker }
27*c2e0c6b5SAndroid Build Coastguard Worker
28*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *
pci_define_param(struct pci_access * acc,char * param,char * value,char * help)29*c2e0c6b5SAndroid Build Coastguard Worker pci_define_param(struct pci_access *acc, char *param, char *value, char *help)
30*c2e0c6b5SAndroid Build Coastguard Worker {
31*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *p, **pp;
32*c2e0c6b5SAndroid Build Coastguard Worker
33*c2e0c6b5SAndroid Build Coastguard Worker for (pp=&acc->params; p = *pp; pp=&p->next)
34*c2e0c6b5SAndroid Build Coastguard Worker {
35*c2e0c6b5SAndroid Build Coastguard Worker int cmp = strcmp(p->param, param);
36*c2e0c6b5SAndroid Build Coastguard Worker if (!cmp)
37*c2e0c6b5SAndroid Build Coastguard Worker {
38*c2e0c6b5SAndroid Build Coastguard Worker if (strcmp(p->value, value) || strcmp(p->help, help))
39*c2e0c6b5SAndroid Build Coastguard Worker acc->error("Parameter %s re-defined differently", param);
40*c2e0c6b5SAndroid Build Coastguard Worker return p;
41*c2e0c6b5SAndroid Build Coastguard Worker }
42*c2e0c6b5SAndroid Build Coastguard Worker if (cmp > 0)
43*c2e0c6b5SAndroid Build Coastguard Worker break;
44*c2e0c6b5SAndroid Build Coastguard Worker }
45*c2e0c6b5SAndroid Build Coastguard Worker
46*c2e0c6b5SAndroid Build Coastguard Worker p = pci_malloc(acc, sizeof(*p));
47*c2e0c6b5SAndroid Build Coastguard Worker p->next = *pp;
48*c2e0c6b5SAndroid Build Coastguard Worker *pp = p;
49*c2e0c6b5SAndroid Build Coastguard Worker p->param = param;
50*c2e0c6b5SAndroid Build Coastguard Worker p->value = value;
51*c2e0c6b5SAndroid Build Coastguard Worker p->value_malloced = 0;
52*c2e0c6b5SAndroid Build Coastguard Worker p->help = help;
53*c2e0c6b5SAndroid Build Coastguard Worker return p;
54*c2e0c6b5SAndroid Build Coastguard Worker }
55*c2e0c6b5SAndroid Build Coastguard Worker
56*c2e0c6b5SAndroid Build Coastguard Worker int
pci_set_param_internal(struct pci_access * acc,char * param,char * value,int copy)57*c2e0c6b5SAndroid Build Coastguard Worker pci_set_param_internal(struct pci_access *acc, char *param, char *value, int copy)
58*c2e0c6b5SAndroid Build Coastguard Worker {
59*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *p;
60*c2e0c6b5SAndroid Build Coastguard Worker
61*c2e0c6b5SAndroid Build Coastguard Worker for (p=acc->params; p; p=p->next)
62*c2e0c6b5SAndroid Build Coastguard Worker if (!strcmp(p->param, param))
63*c2e0c6b5SAndroid Build Coastguard Worker {
64*c2e0c6b5SAndroid Build Coastguard Worker if (p->value_malloced)
65*c2e0c6b5SAndroid Build Coastguard Worker pci_mfree(p->value);
66*c2e0c6b5SAndroid Build Coastguard Worker p->value_malloced = copy;
67*c2e0c6b5SAndroid Build Coastguard Worker if (copy)
68*c2e0c6b5SAndroid Build Coastguard Worker p->value = pci_strdup(acc, value);
69*c2e0c6b5SAndroid Build Coastguard Worker else
70*c2e0c6b5SAndroid Build Coastguard Worker p->value = value;
71*c2e0c6b5SAndroid Build Coastguard Worker return 0;
72*c2e0c6b5SAndroid Build Coastguard Worker }
73*c2e0c6b5SAndroid Build Coastguard Worker return -1;
74*c2e0c6b5SAndroid Build Coastguard Worker }
75*c2e0c6b5SAndroid Build Coastguard Worker
76*c2e0c6b5SAndroid Build Coastguard Worker int
pci_set_param(struct pci_access * acc,char * param,char * value)77*c2e0c6b5SAndroid Build Coastguard Worker pci_set_param(struct pci_access *acc, char *param, char *value)
78*c2e0c6b5SAndroid Build Coastguard Worker {
79*c2e0c6b5SAndroid Build Coastguard Worker return pci_set_param_internal(acc, param, value, 1);
80*c2e0c6b5SAndroid Build Coastguard Worker }
81*c2e0c6b5SAndroid Build Coastguard Worker
82*c2e0c6b5SAndroid Build Coastguard Worker void
pci_free_params(struct pci_access * acc)83*c2e0c6b5SAndroid Build Coastguard Worker pci_free_params(struct pci_access *acc)
84*c2e0c6b5SAndroid Build Coastguard Worker {
85*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *p;
86*c2e0c6b5SAndroid Build Coastguard Worker
87*c2e0c6b5SAndroid Build Coastguard Worker while (p = acc->params)
88*c2e0c6b5SAndroid Build Coastguard Worker {
89*c2e0c6b5SAndroid Build Coastguard Worker acc->params = p->next;
90*c2e0c6b5SAndroid Build Coastguard Worker if (p->value_malloced)
91*c2e0c6b5SAndroid Build Coastguard Worker pci_mfree(p->value);
92*c2e0c6b5SAndroid Build Coastguard Worker pci_mfree(p);
93*c2e0c6b5SAndroid Build Coastguard Worker }
94*c2e0c6b5SAndroid Build Coastguard Worker }
95*c2e0c6b5SAndroid Build Coastguard Worker
96*c2e0c6b5SAndroid Build Coastguard Worker struct pci_param *
pci_walk_params(struct pci_access * acc,struct pci_param * prev)97*c2e0c6b5SAndroid Build Coastguard Worker pci_walk_params(struct pci_access *acc, struct pci_param *prev)
98*c2e0c6b5SAndroid Build Coastguard Worker {
99*c2e0c6b5SAndroid Build Coastguard Worker /* So far, the params form a simple linked list, but this can change in the future */
100*c2e0c6b5SAndroid Build Coastguard Worker if (!prev)
101*c2e0c6b5SAndroid Build Coastguard Worker return acc->params;
102*c2e0c6b5SAndroid Build Coastguard Worker else
103*c2e0c6b5SAndroid Build Coastguard Worker return prev->next;
104*c2e0c6b5SAndroid Build Coastguard Worker }
105