3 * Copyright (c) 1997 Metro Link Incorporated
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
20 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * Except as contained in this notice, the name of the Metro Link shall not be
24 * used in advertising or otherwise to promote the sale, use or other dealings
25 * in this Software without prior written authorization from Metro Link.
29 * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
31 * Permission is hereby granted, free of charge, to any person obtaining a
32 * copy of this software and associated documentation files (the "Software"),
33 * to deal in the Software without restriction, including without limitation
34 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
35 * and/or sell copies of the Software, and to permit persons to whom the
36 * Software is furnished to do so, subject to the following conditions:
38 * The above copyright notice and this permission notice shall be included in
39 * all copies or substantial portions of the Software.
41 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
42 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
43 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
44 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
45 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
46 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
47 * OTHER DEALINGS IN THE SOFTWARE.
49 * Except as contained in this notice, the name of the copyright holder(s)
50 * and author(s) shall not be used in advertising or otherwise to promote
51 * the sale, use or other dealings in this Software without prior written
52 * authorization from the copyright holder(s) and author(s).
55 #ifdef HAVE_XORG_CONFIG_H
56 #include <xorg-config.h>
59 #include "xf86Parser.h"
60 #include "xf86tokens.h"
61 #include "Configint.h"
66 xf86ConfigSymTabRec DeviceTab
[] = {
67 {ENDSECTION
, "endsection"},
68 {IDENTIFIER
, "identifier"},
69 {VENDOR
, "vendorname"},
73 {DACSPEED
, "dacspeed"},
76 {VIDEORAM
, "videoram"},
77 {BIOSBASE
, "biosbase"},
80 {CLOCKCHIP
, "clockchip"},
86 {TEXTCLOCKFRQ
, "textclockfreq"},
92 #define CLEANUP xf86freeDeviceList
95 xf86parseDeviceSection(void)
98 int has_ident
= FALSE
;
101 parsePrologue(XF86ConfDevicePtr
, XF86ConfDeviceRec
)
103 /* Zero is a valid value for these */
104 ptr
->dev_chipid
= -1;
105 ptr
->dev_chiprev
= -1;
107 while ((token
= xf86getToken(DeviceTab
)) != ENDSECTION
) {
110 ptr
->dev_comment
= xf86addComment(ptr
->dev_comment
, val
.str
);
113 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
114 Error(QUOTE_MSG
, "Identifier");
115 if (has_ident
== TRUE
)
116 Error(MULTIPLE_MSG
, "Identifier");
117 ptr
->dev_identifier
= val
.str
;
121 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
122 Error(QUOTE_MSG
, "Vendor");
123 ptr
->dev_vendor
= val
.str
;
126 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
127 Error(QUOTE_MSG
, "Board");
128 ptr
->dev_board
= val
.str
;
131 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
132 Error(QUOTE_MSG
, "Chipset");
133 ptr
->dev_chipset
= val
.str
;
136 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
137 Error(QUOTE_MSG
, "Card");
138 ptr
->dev_card
= val
.str
;
141 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
142 Error(QUOTE_MSG
, "Driver");
143 ptr
->dev_driver
= val
.str
;
146 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
147 Error(QUOTE_MSG
, "Ramdac");
148 ptr
->dev_ramdac
= val
.str
;
151 for (i
= 0; i
< CONF_MAXDACSPEEDS
; i
++)
152 ptr
->dev_dacSpeeds
[i
] = 0;
153 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
) {
154 Error(DACSPEED_MSG
, CONF_MAXDACSPEEDS
);
157 ptr
->dev_dacSpeeds
[0] = (int) (val
.realnum
* 1000.0 + 0.5);
158 for (i
= 1; i
< CONF_MAXDACSPEEDS
; i
++) {
159 if (xf86getSubToken(&(ptr
->dev_comment
)) == NUMBER
)
160 ptr
->dev_dacSpeeds
[i
] = (int)
161 (val
.realnum
* 1000.0 + 0.5);
163 xf86unGetToken(token
);
170 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
171 Error(NUMBER_MSG
, "VideoRam");
172 ptr
->dev_videoram
= val
.num
;
175 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
176 Error(NUMBER_MSG
, "BIOSBase");
177 ptr
->dev_bios_base
= val
.num
;
180 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
181 Error(NUMBER_MSG
, "MemBase");
182 ptr
->dev_mem_base
= val
.num
;
185 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
186 Error(NUMBER_MSG
, "IOBase");
187 ptr
->dev_io_base
= val
.num
;
190 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
191 Error(QUOTE_MSG
, "ClockChip");
192 ptr
->dev_clockchip
= val
.str
;
195 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
196 Error(NUMBER_MSG
, "ChipID");
197 ptr
->dev_chipid
= val
.num
;
200 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
201 Error(NUMBER_MSG
, "ChipRev");
202 ptr
->dev_chiprev
= val
.num
;
206 token
= xf86getSubToken(&(ptr
->dev_comment
));
207 for (i
= ptr
->dev_clocks
;
208 token
== NUMBER
&& i
< CONF_MAXCLOCKS
; i
++) {
209 ptr
->dev_clock
[i
] = (int) (val
.realnum
* 1000.0 + 0.5);
210 token
= xf86getSubToken(&(ptr
->dev_comment
));
213 xf86unGetToken(token
);
216 if ((token
= xf86getSubToken(&(ptr
->dev_comment
))) != NUMBER
)
217 Error(NUMBER_MSG
, "TextClockFreq");
218 ptr
->dev_textclockfreq
= (int) (val
.realnum
* 1000.0 + 0.5);
221 ptr
->dev_option_lst
= xf86parseOption(ptr
->dev_option_lst
);
224 if (xf86getSubToken(&(ptr
->dev_comment
)) != STRING
)
225 Error(QUOTE_MSG
, "BusID");
226 ptr
->dev_busid
= val
.str
;
229 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
230 Error(QUOTE_MSG
, "IRQ");
231 ptr
->dev_irq
= val
.num
;
234 if (xf86getSubToken(&(ptr
->dev_comment
)) != NUMBER
)
235 Error(NUMBER_MSG
, "Screen");
236 ptr
->dev_screen
= val
.num
;
239 Error(UNEXPECTED_EOF_MSG
);
242 Error(INVALID_KEYWORD_MSG
, xf86tokenString());
251 printf("Device section parsed\n");
260 xf86printDeviceSection(FILE * cf
, XF86ConfDevicePtr ptr
)
265 fprintf(cf
, "Section \"Device\"\n");
266 if (ptr
->dev_comment
)
267 fprintf(cf
, "%s", ptr
->dev_comment
);
268 if (ptr
->dev_identifier
)
269 fprintf(cf
, "\tIdentifier \"%s\"\n", ptr
->dev_identifier
);
271 fprintf(cf
, "\tDriver \"%s\"\n", ptr
->dev_driver
);
273 fprintf(cf
, "\tVendorName \"%s\"\n", ptr
->dev_vendor
);
275 fprintf(cf
, "\tBoardName \"%s\"\n", ptr
->dev_board
);
276 if (ptr
->dev_chipset
)
277 fprintf(cf
, "\tChipSet \"%s\"\n", ptr
->dev_chipset
);
279 fprintf(cf
, "\tCard \"%s\"\n", ptr
->dev_card
);
281 fprintf(cf
, "\tRamDac \"%s\"\n", ptr
->dev_ramdac
);
282 if (ptr
->dev_dacSpeeds
[0] > 0) {
283 fprintf(cf
, "\tDacSpeed ");
284 for (i
= 0; i
< CONF_MAXDACSPEEDS
&& ptr
->dev_dacSpeeds
[i
] > 0; i
++)
285 fprintf(cf
, "%g ", (double) (ptr
->dev_dacSpeeds
[i
]) / 1000.0);
288 if (ptr
->dev_videoram
)
289 fprintf(cf
, "\tVideoRam %d\n", ptr
->dev_videoram
);
290 if (ptr
->dev_bios_base
)
291 fprintf(cf
, "\tBiosBase 0x%lx\n", ptr
->dev_bios_base
);
292 if (ptr
->dev_mem_base
)
293 fprintf(cf
, "\tMemBase 0x%lx\n", ptr
->dev_mem_base
);
294 if (ptr
->dev_io_base
)
295 fprintf(cf
, "\tIOBase 0x%lx\n", ptr
->dev_io_base
);
296 if (ptr
->dev_clockchip
)
297 fprintf(cf
, "\tClockChip \"%s\"\n", ptr
->dev_clockchip
);
298 if (ptr
->dev_chipid
!= -1)
299 fprintf(cf
, "\tChipId 0x%x\n", ptr
->dev_chipid
);
300 if (ptr
->dev_chiprev
!= -1)
301 fprintf(cf
, "\tChipRev 0x%x\n", ptr
->dev_chiprev
);
303 xf86printOptionList(cf
, ptr
->dev_option_lst
, 1);
304 if (ptr
->dev_clocks
> 0) {
305 fprintf(cf
, "\tClocks ");
306 for (i
= 0; i
< ptr
->dev_clocks
; i
++)
307 fprintf(cf
, "%.1f ", (double) ptr
->dev_clock
[i
] / 1000.0);
310 if (ptr
->dev_textclockfreq
) {
311 fprintf(cf
, "\tTextClockFreq %.1f\n",
312 (double) ptr
->dev_textclockfreq
/ 1000.0);
315 fprintf(cf
, "\tBusID \"%s\"\n", ptr
->dev_busid
);
316 if (ptr
->dev_screen
> 0)
317 fprintf(cf
, "\tScreen %d\n", ptr
->dev_screen
);
318 if (ptr
->dev_irq
>= 0)
319 fprintf(cf
, "\tIRQ %d\n", ptr
->dev_irq
);
320 fprintf(cf
, "EndSection\n\n");
321 ptr
= ptr
->list
.next
;
326 xf86freeDeviceList(XF86ConfDevicePtr ptr
)
328 XF86ConfDevicePtr prev
;
331 TestFree(ptr
->dev_identifier
);
332 TestFree(ptr
->dev_vendor
);
333 TestFree(ptr
->dev_board
);
334 TestFree(ptr
->dev_chipset
);
335 TestFree(ptr
->dev_card
);
336 TestFree(ptr
->dev_driver
);
337 TestFree(ptr
->dev_ramdac
);
338 TestFree(ptr
->dev_clockchip
);
339 TestFree(ptr
->dev_comment
);
340 xf86optionListFree(ptr
->dev_option_lst
);
343 ptr
= ptr
->list
.next
;
349 xf86findDevice(const char *ident
, XF86ConfDevicePtr p
)
352 if (xf86nameCompare(ident
, p
->dev_identifier
) == 0)