1*c58da9fbSDavid van Moolenbroek
2*c58da9fbSDavid van Moolenbroek #include <stdarg.h>
3*c58da9fbSDavid van Moolenbroek #include <assert.h>
4*c58da9fbSDavid van Moolenbroek #include <stdlib.h>
5*c58da9fbSDavid van Moolenbroek #include <stdio.h>
6*c58da9fbSDavid van Moolenbroek #include <string.h>
7*c58da9fbSDavid van Moolenbroek #include <errno.h>
8*c58da9fbSDavid van Moolenbroek #include <pwd.h>
9*c58da9fbSDavid van Moolenbroek #include <unistd.h>
10*c58da9fbSDavid van Moolenbroek #include <limits.h>
11*c58da9fbSDavid van Moolenbroek #include <lib.h>
12*c58da9fbSDavid van Moolenbroek #include <minix/config.h>
13*c58da9fbSDavid van Moolenbroek #include <minix/com.h>
14*c58da9fbSDavid van Moolenbroek #include <minix/const.h>
15*c58da9fbSDavid van Moolenbroek #include <minix/type.h>
16*c58da9fbSDavid van Moolenbroek #include <minix/ipc.h>
17*c58da9fbSDavid van Moolenbroek #include <minix/rs.h>
18*c58da9fbSDavid van Moolenbroek #include <minix/syslib.h>
19*c58da9fbSDavid van Moolenbroek #include <minix/bitmap.h>
20*c58da9fbSDavid van Moolenbroek #include <paths.h>
21*c58da9fbSDavid van Moolenbroek #include <minix/sef.h>
22*c58da9fbSDavid van Moolenbroek #include <minix/dmap.h>
23*c58da9fbSDavid van Moolenbroek #include <sys/types.h>
24*c58da9fbSDavid van Moolenbroek #include <sys/stat.h>
25*c58da9fbSDavid van Moolenbroek #include <configfile.h>
26*c58da9fbSDavid van Moolenbroek
27*c58da9fbSDavid van Moolenbroek #include <machine/archtypes.h>
28*c58da9fbSDavid van Moolenbroek #include <minix/timers.h>
29*c58da9fbSDavid van Moolenbroek #include <err.h>
30*c58da9fbSDavid van Moolenbroek
31*c58da9fbSDavid van Moolenbroek #include "config.h"
32*c58da9fbSDavid van Moolenbroek #include "proto.h"
33*c58da9fbSDavid van Moolenbroek #include "parse.h"
34*c58da9fbSDavid van Moolenbroek
35*c58da9fbSDavid van Moolenbroek #define MAXDEPTH 10
36*c58da9fbSDavid van Moolenbroek
37*c58da9fbSDavid van Moolenbroek static struct {
38*c58da9fbSDavid van Moolenbroek const char *field, *str;
39*c58da9fbSDavid van Moolenbroek } configstack[MAXDEPTH];
40*c58da9fbSDavid van Moolenbroek
41*c58da9fbSDavid van Moolenbroek int depth = 0;
42*c58da9fbSDavid van Moolenbroek
printstack(void)43*c58da9fbSDavid van Moolenbroek void printstack(void)
44*c58da9fbSDavid van Moolenbroek {
45*c58da9fbSDavid van Moolenbroek int i;
46*c58da9fbSDavid van Moolenbroek for(i = 0; i < depth; i++)
47*c58da9fbSDavid van Moolenbroek printf("%s %s,", configstack[i].field,
48*c58da9fbSDavid van Moolenbroek configstack[i].str);
49*c58da9fbSDavid van Moolenbroek }
50*c58da9fbSDavid van Moolenbroek
print(const char * field,const char * str)51*c58da9fbSDavid van Moolenbroek void print(const char *field, const char *str)
52*c58da9fbSDavid van Moolenbroek {
53*c58da9fbSDavid van Moolenbroek printstack();
54*c58da9fbSDavid van Moolenbroek printf("%s %s\n", field, str);
55*c58da9fbSDavid van Moolenbroek }
56*c58da9fbSDavid van Moolenbroek
push(const char * field,const char * str)57*c58da9fbSDavid van Moolenbroek void push(const char *field, const char *str)
58*c58da9fbSDavid van Moolenbroek {
59*c58da9fbSDavid van Moolenbroek assert(depth < MAXDEPTH);
60*c58da9fbSDavid van Moolenbroek configstack[depth].field = field;
61*c58da9fbSDavid van Moolenbroek configstack[depth].str = str;
62*c58da9fbSDavid van Moolenbroek depth++;
63*c58da9fbSDavid van Moolenbroek printstack();
64*c58da9fbSDavid van Moolenbroek printf("\n");
65*c58da9fbSDavid van Moolenbroek }
66*c58da9fbSDavid van Moolenbroek
main(int argc,char ** argv)67*c58da9fbSDavid van Moolenbroek int main(int argc, char **argv)
68*c58da9fbSDavid van Moolenbroek {
69*c58da9fbSDavid van Moolenbroek struct rs_config config;
70*c58da9fbSDavid van Moolenbroek const char *label;
71*c58da9fbSDavid van Moolenbroek uint16_t sub_vid, sub_did;
72*c58da9fbSDavid van Moolenbroek int id;
73*c58da9fbSDavid van Moolenbroek
74*c58da9fbSDavid van Moolenbroek if(argc != 2) {
75*c58da9fbSDavid van Moolenbroek fprintf(stderr, "usage: %s <config>\n", argv[0]);
76*c58da9fbSDavid van Moolenbroek return 1;
77*c58da9fbSDavid van Moolenbroek }
78*c58da9fbSDavid van Moolenbroek
79*c58da9fbSDavid van Moolenbroek memset(&config, 0, sizeof(config));
80*c58da9fbSDavid van Moolenbroek if(!(label = parse_config(NULL, 1, argv[1], &config)))
81*c58da9fbSDavid van Moolenbroek errx(1, "parse_config failed");
82*c58da9fbSDavid van Moolenbroek
83*c58da9fbSDavid van Moolenbroek push(KW_SERVICE, label);
84*c58da9fbSDavid van Moolenbroek if(config.type) push(KW_TYPE, config.type);
85*c58da9fbSDavid van Moolenbroek
86*c58da9fbSDavid van Moolenbroek if(config.descr) push(KW_DESCR, config.descr);
87*c58da9fbSDavid van Moolenbroek if(config.rs_start.rss_nr_pci_id > 0) {
88*c58da9fbSDavid van Moolenbroek printstack();
89*c58da9fbSDavid van Moolenbroek printf("%s %s ", KW_PCI, KW_DEVICE);
90*c58da9fbSDavid van Moolenbroek for(id = 0; id < config.rs_start.rss_nr_pci_id; id++) {
91*c58da9fbSDavid van Moolenbroek sub_vid = config.rs_start.rss_pci_id[id].sub_vid;
92*c58da9fbSDavid van Moolenbroek sub_did = config.rs_start.rss_pci_id[id].sub_did;
93*c58da9fbSDavid van Moolenbroek /*
94*c58da9fbSDavid van Moolenbroek * The PCI driver interprets each of these two fields
95*c58da9fbSDavid van Moolenbroek * individually, so we must print them even if just one
96*c58da9fbSDavid van Moolenbroek * of them is set. Correct matching of just one of
97*c58da9fbSDavid van Moolenbroek * the fields may be hard to do from a script though,
98*c58da9fbSDavid van Moolenbroek * so driver writers are advised to specify either both
99*c58da9fbSDavid van Moolenbroek * or neither of these two fields.
100*c58da9fbSDavid van Moolenbroek */
101*c58da9fbSDavid van Moolenbroek if (sub_vid != NO_SUB_VID || sub_did != NO_SUB_DID)
102*c58da9fbSDavid van Moolenbroek printf("%04X:%04X/%04X:%04X ",
103*c58da9fbSDavid van Moolenbroek config.rs_start.rss_pci_id[id].vid,
104*c58da9fbSDavid van Moolenbroek config.rs_start.rss_pci_id[id].did,
105*c58da9fbSDavid van Moolenbroek sub_vid, sub_did);
106*c58da9fbSDavid van Moolenbroek else
107*c58da9fbSDavid van Moolenbroek printf("%04X:%04X ",
108*c58da9fbSDavid van Moolenbroek config.rs_start.rss_pci_id[id].vid,
109*c58da9fbSDavid van Moolenbroek config.rs_start.rss_pci_id[id].did);
110*c58da9fbSDavid van Moolenbroek }
111*c58da9fbSDavid van Moolenbroek printf("\n");
112*c58da9fbSDavid van Moolenbroek }
113*c58da9fbSDavid van Moolenbroek }
114*c58da9fbSDavid van Moolenbroek
115