1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 
5 #include <xorg-server.h>
6 #include <xorgVersion.h>
7 #include <xf86Parser.h>
8 
9 #include "intel_options.h"
10 
11 const OptionInfoRec intel_options[] = {
12 	{OPTION_ACCEL_ENABLE,	"Accel",	OPTV_BOOLEAN,	{0},	0},
13 	{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},
14 	{OPTION_BACKLIGHT,	"Backlight",	OPTV_STRING,	{0},	0},
15 	{OPTION_EDID,		"CustomEDID",	OPTV_STRING,	{0},	0},
16 	{OPTION_DRI,		"DRI",		OPTV_STRING,	{0},	0},
17 	{OPTION_PRESENT,	"Present",	OPTV_BOOLEAN,	{0},	1},
18 	{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	0},
19 	{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	0},
20 	{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},
21 	{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	0},
22 	{OPTION_ROTATION,	"HWRotation",	OPTV_BOOLEAN,	{0},	1},
23 	{OPTION_VSYNC,		"VSync",	OPTV_BOOLEAN,	{0},	1},
24 	{OPTION_PAGEFLIP,	"PageFlip",	OPTV_BOOLEAN,	{0},	1},
25 	{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	1},
26 	{OPTION_TRIPLE_BUFFER,	"TripleBuffer", OPTV_BOOLEAN,	{0},	1},
27 	{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},
28 	{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	1},
29 	{OPTION_REPROBE,	"ReprobeOutputs", OPTV_BOOLEAN,	{0},	0},
30 #ifdef INTEL_XVMC
31 	{OPTION_XVMC,		"XvMC",		OPTV_BOOLEAN,	{0},	1},
32 #endif
33 #ifdef USE_SNA
34 	{OPTION_ZAPHOD,		"ZaphodHeads",	OPTV_STRING,	{0},	0},
35 	{OPTION_VIRTUAL,	"VirtualHeads",	OPTV_INTEGER,	{0},	0},
36 	{OPTION_TEAR_FREE,	"TearFree",	OPTV_BOOLEAN,	{0},	0},
37 	{OPTION_CRTC_PIXMAPS,	"PerCrtcPixmaps", OPTV_BOOLEAN,	{0},	0},
38 #endif
39 #ifdef USE_UXA
40 	{OPTION_FALLBACKDEBUG,	"FallbackDebug",OPTV_BOOLEAN,	{0},	0},
41 	{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, 0},
42 	{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, 0},
43 	{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, 0},
44 	{OPTION_BUFFER_CACHE,	"BufferCache",	OPTV_BOOLEAN,   {0},    1},
45 #endif
46 	{-1,			NULL,		OPTV_NONE,	{0},	0}
47 };
48 
intel_options_get(ScrnInfoPtr scrn)49 OptionInfoPtr intel_options_get(ScrnInfoPtr scrn)
50 {
51 	OptionInfoPtr options;
52 
53 	xf86CollectOptions(scrn, NULL);
54 	if (!(options = malloc(sizeof(intel_options))))
55 		return NULL;
56 
57 	memcpy(options, intel_options, sizeof(intel_options));
58 	xf86ProcessOptions(scrn->scrnIndex, scrn->options, options);
59 
60 	return options;
61 }
62 
intel_option_cast_to_bool(OptionInfoPtr options,int id,Bool val)63 Bool intel_option_cast_to_bool(OptionInfoPtr options, int id, Bool val)
64 {
65 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,901,0)
66 	xf86getBoolValue(&val, xf86GetOptValString(options, id));
67 #endif
68 	return val;
69 }
70 
71 static int
namecmp(const char * s1,const char * s2)72 namecmp(const char *s1, const char *s2)
73 {
74 	char c1, c2;
75 
76 	if (!s1 || *s1 == 0) {
77 		if (!s2 || *s2 == 0)
78 			return 0;
79 		else
80 			return 1;
81 	}
82 
83 	while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')
84 		s1++;
85 
86 	while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')
87 		s2++;
88 
89 	c1 = isupper(*s1) ? tolower(*s1) : *s1;
90 	c2 = isupper(*s2) ? tolower(*s2) : *s2;
91 	while (c1 == c2) {
92 		if (c1 == '\0')
93 			return 0;
94 
95 		s1++;
96 		while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')
97 			s1++;
98 
99 		s2++;
100 		while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')
101 			s2++;
102 
103 		c1 = isupper(*s1) ? tolower(*s1) : *s1;
104 		c2 = isupper(*s2) ? tolower(*s2) : *s2;
105 	}
106 
107 	return c1 - c2;
108 }
109 
intel_option_cast_to_unsigned(OptionInfoPtr options,int id,unsigned val)110 unsigned intel_option_cast_to_unsigned(OptionInfoPtr options, int id, unsigned val)
111 {
112 #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,901,0)
113 	const char *str = xf86GetOptValString(options, id);
114 #else
115 	const char *str = NULL;
116 #endif
117 	unsigned v;
118 
119 	if (str == NULL || *str == '\0')
120 		return val;
121 
122 	if (namecmp(str, "on") == 0)
123 		return val;
124 	if (namecmp(str, "true") == 0)
125 		return val;
126 	if (namecmp(str, "yes") == 0)
127 		return val;
128 
129 	if (namecmp(str, "0") == 0)
130 		return 0;
131 	if (namecmp(str, "off") == 0)
132 		return 0;
133 	if (namecmp(str, "false") == 0)
134 		return 0;
135 	if (namecmp(str, "no") == 0)
136 		return 0;
137 
138 	v = atoi(str);
139 	if (v)
140 		return v;
141 
142 	return val;
143 }
144