Device.c revision 706f2543
1/*
2 *
3 * Copyright (c) 1997  Metro Link Incorporated
4 *
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:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
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
21 * SOFTWARE.
22 *
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.
26 *
27 */
28/*
29 * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
30 *
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:
37 *
38 * The above copyright notice and this permission notice shall be included in
39 * all copies or substantial portions of the Software.
40 *
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.
48 *
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).
53 */
54
55
56/* View/edit this file with tab stops set to 4 */
57
58#ifdef HAVE_XORG_CONFIG_H
59#include <xorg-config.h>
60#endif
61
62#include "xf86Parser.h"
63#include "xf86tokens.h"
64#include "Configint.h"
65
66extern LexRec val;
67
68static
69xf86ConfigSymTabRec DeviceTab[] =
70{
71	{ENDSECTION, "endsection"},
72	{IDENTIFIER, "identifier"},
73	{VENDOR, "vendorname"},
74	{BOARD, "boardname"},
75	{CHIPSET, "chipset"},
76	{RAMDAC, "ramdac"},
77	{DACSPEED, "dacspeed"},
78	{CLOCKS, "clocks"},
79	{OPTION, "option"},
80	{VIDEORAM, "videoram"},
81	{BIOSBASE, "biosbase"},
82	{MEMBASE, "membase"},
83	{IOBASE, "iobase"},
84	{CLOCKCHIP, "clockchip"},
85	{CHIPID, "chipid"},
86	{CHIPREV, "chiprev"},
87	{CARD, "card"},
88	{DRIVER, "driver"},
89	{BUSID, "busid"},
90	{TEXTCLOCKFRQ, "textclockfreq"},
91	{IRQ, "irq"},
92	{SCREEN, "screen"},
93	{-1, ""},
94};
95
96#define CLEANUP xf86freeDeviceList
97
98XF86ConfDevicePtr
99xf86parseDeviceSection (void)
100{
101	int i;
102	int has_ident = FALSE;
103	int token;
104	parsePrologue (XF86ConfDevicePtr, XF86ConfDeviceRec)
105
106	/* Zero is a valid value for these */
107	ptr->dev_chipid = -1;
108	ptr->dev_chiprev = -1;
109	ptr->dev_irq = -1;
110	while ((token = xf86getToken (DeviceTab)) != ENDSECTION)
111	{
112		switch (token)
113		{
114		case COMMENT:
115			ptr->dev_comment = xf86addComment(ptr->dev_comment, val.str);
116			break;
117		case IDENTIFIER:
118			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
119				Error (QUOTE_MSG, "Identifier");
120			if (has_ident == TRUE)
121				Error (MULTIPLE_MSG, "Identifier");
122			ptr->dev_identifier = val.str;
123			has_ident = TRUE;
124			break;
125		case VENDOR:
126			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
127				Error (QUOTE_MSG, "Vendor");
128			ptr->dev_vendor = val.str;
129			break;
130		case BOARD:
131			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
132				Error (QUOTE_MSG, "Board");
133			ptr->dev_board = val.str;
134			break;
135		case CHIPSET:
136			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
137				Error (QUOTE_MSG, "Chipset");
138			ptr->dev_chipset = val.str;
139			break;
140		case CARD:
141			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
142				Error (QUOTE_MSG, "Card");
143			ptr->dev_card = val.str;
144			break;
145		case DRIVER:
146			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
147				Error (QUOTE_MSG, "Driver");
148			ptr->dev_driver = val.str;
149			break;
150		case RAMDAC:
151			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
152				Error (QUOTE_MSG, "Ramdac");
153			ptr->dev_ramdac = val.str;
154			break;
155		case DACSPEED:
156			for (i = 0; i < CONF_MAXDACSPEEDS; i++)
157				ptr->dev_dacSpeeds[i] = 0;
158			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
159			{
160				Error (DACSPEED_MSG, CONF_MAXDACSPEEDS);
161			}
162			else
163			{
164				ptr->dev_dacSpeeds[0] = (int) (val.realnum * 1000.0 + 0.5);
165				for (i = 1; i < CONF_MAXDACSPEEDS; i++)
166				{
167					if (xf86getSubToken (&(ptr->dev_comment)) == NUMBER)
168						ptr->dev_dacSpeeds[i] = (int)
169							(val.realnum * 1000.0 + 0.5);
170					else
171					{
172						xf86unGetToken (token);
173						break;
174					}
175				}
176			}
177			break;
178		case VIDEORAM:
179			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
180				Error (NUMBER_MSG, "VideoRam");
181			ptr->dev_videoram = val.num;
182			break;
183		case BIOSBASE:
184			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
185				Error (NUMBER_MSG, "BIOSBase");
186			ptr->dev_bios_base = val.num;
187			break;
188		case MEMBASE:
189			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
190				Error (NUMBER_MSG, "MemBase");
191			ptr->dev_mem_base = val.num;
192			break;
193		case IOBASE:
194			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
195				Error (NUMBER_MSG, "IOBase");
196			ptr->dev_io_base = val.num;
197			break;
198		case CLOCKCHIP:
199			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
200				Error (QUOTE_MSG, "ClockChip");
201			ptr->dev_clockchip = val.str;
202			break;
203		case CHIPID:
204			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
205				Error (NUMBER_MSG, "ChipID");
206			ptr->dev_chipid = val.num;
207			break;
208		case CHIPREV:
209			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
210				Error (NUMBER_MSG, "ChipRev");
211			ptr->dev_chiprev = val.num;
212			break;
213
214		case CLOCKS:
215			token = xf86getSubToken(&(ptr->dev_comment));
216			for( i = ptr->dev_clocks;
217				token == NUMBER && i < CONF_MAXCLOCKS; i++ ) {
218				ptr->dev_clock[i] = (int)(val.realnum * 1000.0 + 0.5);
219				token = xf86getSubToken(&(ptr->dev_comment));
220			}
221			ptr->dev_clocks = i;
222			xf86unGetToken (token);
223			break;
224		case TEXTCLOCKFRQ:
225			if ((token = xf86getSubToken(&(ptr->dev_comment))) != NUMBER)
226				Error (NUMBER_MSG, "TextClockFreq");
227			ptr->dev_textclockfreq = (int)(val.realnum * 1000.0 + 0.5);
228			break;
229		case OPTION:
230			ptr->dev_option_lst = xf86parseOption(ptr->dev_option_lst);
231			break;
232		case BUSID:
233			if (xf86getSubToken (&(ptr->dev_comment)) != STRING)
234				Error (QUOTE_MSG, "BusID");
235			ptr->dev_busid = val.str;
236			break;
237		case IRQ:
238			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
239				Error (QUOTE_MSG, "IRQ");
240			ptr->dev_irq = val.num;
241			break;
242		case SCREEN:
243			if (xf86getSubToken (&(ptr->dev_comment)) != NUMBER)
244				Error (NUMBER_MSG, "Screen");
245			ptr->dev_screen = val.num;
246			break;
247		case EOF_TOKEN:
248			Error (UNEXPECTED_EOF_MSG, NULL);
249			break;
250		default:
251			Error (INVALID_KEYWORD_MSG, xf86tokenString ());
252			break;
253		}
254	}
255
256	if (!has_ident)
257		Error (NO_IDENT_MSG, NULL);
258
259#ifdef DEBUG
260	printf ("Device section parsed\n");
261#endif
262
263	return ptr;
264}
265
266#undef CLEANUP
267
268void
269xf86printDeviceSection (FILE * cf, XF86ConfDevicePtr ptr)
270{
271	int i;
272
273	while (ptr)
274	{
275		fprintf (cf, "Section \"Device\"\n");
276		if (ptr->dev_comment)
277			fprintf (cf, "%s", ptr->dev_comment);
278		if (ptr->dev_identifier)
279			fprintf (cf, "\tIdentifier  \"%s\"\n", ptr->dev_identifier);
280		if (ptr->dev_driver)
281			fprintf (cf, "\tDriver      \"%s\"\n", ptr->dev_driver);
282		if (ptr->dev_vendor)
283			fprintf (cf, "\tVendorName  \"%s\"\n", ptr->dev_vendor);
284		if (ptr->dev_board)
285			fprintf (cf, "\tBoardName   \"%s\"\n", ptr->dev_board);
286		if (ptr->dev_chipset)
287			fprintf (cf, "\tChipSet     \"%s\"\n", ptr->dev_chipset);
288		if (ptr->dev_card)
289			fprintf (cf, "\tCard        \"%s\"\n", ptr->dev_card);
290		if (ptr->dev_ramdac)
291			fprintf (cf, "\tRamDac      \"%s\"\n", ptr->dev_ramdac);
292		if (ptr->dev_dacSpeeds[0] > 0 ) {
293			fprintf (cf, "\tDacSpeed    ");
294			for (i = 0; i < CONF_MAXDACSPEEDS
295					&& ptr->dev_dacSpeeds[i] > 0; i++ )
296				fprintf (cf, "%g ", (double) (ptr->dev_dacSpeeds[i])/ 1000.0 );
297			fprintf (cf, "\n");
298		}
299		if (ptr->dev_videoram)
300			fprintf (cf, "\tVideoRam    %d\n", ptr->dev_videoram);
301		if (ptr->dev_bios_base)
302			fprintf (cf, "\tBiosBase    0x%lx\n", ptr->dev_bios_base);
303		if (ptr->dev_mem_base)
304			fprintf (cf, "\tMemBase     0x%lx\n", ptr->dev_mem_base);
305		if (ptr->dev_io_base)
306			fprintf (cf, "\tIOBase      0x%lx\n", ptr->dev_io_base);
307		if (ptr->dev_clockchip)
308			fprintf (cf, "\tClockChip   \"%s\"\n", ptr->dev_clockchip);
309		if (ptr->dev_chipid != -1)
310			fprintf (cf, "\tChipId      0x%x\n", ptr->dev_chipid);
311		if (ptr->dev_chiprev != -1)
312			fprintf (cf, "\tChipRev     0x%x\n", ptr->dev_chiprev);
313
314		xf86printOptionList(cf, ptr->dev_option_lst, 1);
315		if (ptr->dev_clocks > 0 ) {
316			fprintf (cf, "\tClocks      ");
317			for (i = 0; i < ptr->dev_clocks; i++ )
318				fprintf (cf, "%.1f ", (double)ptr->dev_clock[i] / 1000.0 );
319			fprintf (cf, "\n");
320		}
321		if (ptr->dev_textclockfreq) {
322			fprintf (cf, "\tTextClockFreq %.1f\n",
323					 (double)ptr->dev_textclockfreq / 1000.0);
324		}
325		if (ptr->dev_busid)
326			fprintf (cf, "\tBusID       \"%s\"\n", ptr->dev_busid);
327		if (ptr->dev_screen > 0)
328			fprintf (cf, "\tScreen      %d\n", ptr->dev_screen);
329		if (ptr->dev_irq >= 0)
330			fprintf (cf, "\tIRQ         %d\n", ptr->dev_irq);
331		fprintf (cf, "EndSection\n\n");
332		ptr = ptr->list.next;
333	}
334}
335
336void
337xf86freeDeviceList (XF86ConfDevicePtr ptr)
338{
339	XF86ConfDevicePtr prev;
340
341	while (ptr)
342	{
343		TestFree (ptr->dev_identifier);
344		TestFree (ptr->dev_vendor);
345		TestFree (ptr->dev_board);
346		TestFree (ptr->dev_chipset);
347		TestFree (ptr->dev_card);
348		TestFree (ptr->dev_driver);
349		TestFree (ptr->dev_ramdac);
350		TestFree (ptr->dev_clockchip);
351		TestFree (ptr->dev_comment);
352		xf86optionListFree (ptr->dev_option_lst);
353
354		prev = ptr;
355		ptr = ptr->list.next;
356		free (prev);
357	}
358}
359
360XF86ConfDevicePtr
361xf86findDevice (const char *ident, XF86ConfDevicePtr p)
362{
363	while (p)
364	{
365		if (xf86nameCompare (ident, p->dev_identifier) == 0)
366			return p;
367
368		p = p->list.next;
369	}
370	return NULL;
371}
372
373XF86ConfDevicePtr
374xf86findDeviceByDriver (const char *driver, XF86ConfDevicePtr p)
375{
376	while (p)
377	{
378		if (xf86nameCompare (driver, p->dev_driver) == 0)
379			return p;
380
381		p = p->list.next;
382	}
383	return NULL;
384}
385