1 | /*␊ |
2 | * resolution.h␊ |
3 | * ␊ |
4 | *␉NOTE: I don't beleive this code is production ready / should be in trunk␊ |
5 | * Atleast, not in it's current state. ␊ |
6 | *␊ |
7 | * Created by Evan Lojewski on 3/4/10.␊ |
8 | * Copyright 2009. All rights reserved.␊ |
9 | *␊ |
10 | */␊ |
11 | #ifndef _RESOLUTION_H_␊ |
12 | #define _RESOLUTION_H_␊ |
13 | ␊ |
14 | //#include "libsaio.h"␊ |
15 | //#include "edid.h" //included␊ |
16 | #include "915resolution.h"␊ |
17 | ␊ |
18 | ␊ |
19 | void patchVideoBios()␊ |
20 | {␉␉␊ |
21 | ␉UInt32 x = 0, y = 0, bp = 0;␊ |
22 | ␉␊ |
23 | ␉getResolution(&x, &y, &bp);␊ |
24 | ␉verbose("getResolution: %dx%dx%d\n", (int)x, (int)y, (int)bp);␊ |
25 | ␉␊ |
26 | ␉if (x != 0 &&␊ |
27 | ␉␉y != 0 && ␊ |
28 | ␉␉bp != 0)␊ |
29 | ␉{␊ |
30 | ␉␉vbios_map * map;␊ |
31 | ␉␉␊ |
32 | ␉␉map = open_vbios(CT_UNKNOWN);␊ |
33 | ␉␉if(map)␊ |
34 | ␉␉{␊ |
35 | ␉␉␉unlock_vbios(map);␊ |
36 | ␉␉␉␊ |
37 | ␉␉␉set_mode(map, x, y, bp, 0, 0);␊ |
38 | ␉␉␉␊ |
39 | ␉␉␉relock_vbios(map);␊ |
40 | ␉␉␉␊ |
41 | ␉␉␉close_vbios(map);␊ |
42 | ␉␉}␊ |
43 | ␉}␊ |
44 | }␊ |
45 | ␊ |
46 | ␊ |
47 | /* Copied from 915 resolution created by steve tomljenovic␊ |
48 | *␊ |
49 | * This code is based on the techniques used in :␊ |
50 | *␊ |
51 | * - 855patch. Many thanks to Christian Zietz (czietz gmx net)␊ |
52 | * for demonstrating how to shadow the VBIOS into system RAM␊ |
53 | * and then modify it.␊ |
54 | *␊ |
55 | * - 1280patch by Andrew Tipton (andrewtipton null li).␊ |
56 | *␊ |
57 | * - 855resolution by Alain Poirier␊ |
58 | *␊ |
59 | * This source code is into the public domain.␊ |
60 | */␊ |
61 | ␊ |
62 | /**␊ |
63 | **␊ |
64 | **/␊ |
65 | ␊ |
66 | #define CONFIG_MECH_ONE_ADDR␉0xCF8␊ |
67 | #define CONFIG_MECH_ONE_DATA␉0xCFC␊ |
68 | ␊ |
69 | int freqs[] = { 60, 75, 85 };␊ |
70 | ␊ |
71 | UInt32 get_chipset_id(void)␊ |
72 | {␊ |
73 | ␉outl(CONFIG_MECH_ONE_ADDR, 0x80000000);␊ |
74 | ␉return inl(CONFIG_MECH_ONE_DATA);␊ |
75 | }␊ |
76 | ␊ |
77 | chipset_type get_chipset(UInt32 id)␊ |
78 | {␊ |
79 | ␉chipset_type type;␊ |
80 | ␉␉␊ |
81 | ␉switch (id) {␊ |
82 | ␉␉case 0x35758086:␊ |
83 | ␉␉␉type = CT_830;␊ |
84 | ␉␉␉break;␊ |
85 | ␉␉␉␊ |
86 | ␉␉case 0x25608086:␊ |
87 | ␉␉␉type = CT_845G;␊ |
88 | ␉␉␉break;␊ |
89 | ␉␉␉␊ |
90 | ␉␉case 0x35808086:␊ |
91 | ␉␉␉type = CT_855GM;␊ |
92 | ␉␉␉break;␊ |
93 | ␉␉␉␊ |
94 | ␉␉case 0x25708086:␊ |
95 | ␉␉␉type = CT_865G;␊ |
96 | ␉␉␉break;␊ |
97 | ␉␉␉␊ |
98 | ␉␉case 0x25808086:␊ |
99 | ␉␉␉type = CT_915G;␊ |
100 | ␉␉␉break;␊ |
101 | ␉␉␉␊ |
102 | ␉␉case 0x25908086:␊ |
103 | ␉␉␉type = CT_915GM;␊ |
104 | ␉␉␉break;␊ |
105 | ␉␉␉␊ |
106 | ␉␉case 0x27708086:␊ |
107 | ␉␉␉type = CT_945G;␊ |
108 | ␉␉␉break;␊ |
109 | ␉␉␉␊ |
110 | ␉␉case 0x27a08086:␊ |
111 | ␉␉␉type = CT_945GM;␊ |
112 | ␉␉␉break;␊ |
113 | ␉␉␉␊ |
114 | ␉␉case 0x27ac8086:␊ |
115 | ␉␉␉type = CT_945GME;␊ |
116 | ␉␉␉break;␊ |
117 | ␉␉␉␊ |
118 | ␉␉case 0x29708086:␊ |
119 | ␉␉␉type = CT_946GZ;␊ |
120 | ␉␉␉break;␊ |
121 | ␉␉␉␊ |
122 | ␉␉case 0x27748086:␊ |
123 | ␉␉␉type = CT_955X;␊ |
124 | ␉␉␉break;␊ |
125 | ␉␉␉␊ |
126 | ␉␉case 0x277c8086:␊ |
127 | ␉␉␉type = CT_975X;␊ |
128 | ␉␉␉break;␊ |
129 | ␊ |
130 | ␉␉case 0x29a08086:␊ |
131 | ␉␉␉type = CT_G965;␊ |
132 | ␉␉␉break;␊ |
133 | ␉␉␉␊ |
134 | ␉␉case 0x29908086:␊ |
135 | ␉␉␉type = CT_Q965;␊ |
136 | ␉␉␉break;␊ |
137 | ␉␉␉␊ |
138 | ␉␉case 0x81008086:␊ |
139 | ␉␉␉type = CT_500;␊ |
140 | ␉␉␉break;␊ |
141 | ␉␉␉␊ |
142 | ␉␉case 0x2e108086:␊ |
143 | ␉␉case 0X2e908086:␊ |
144 | ␉␉␉type = CT_B43;␊ |
145 | ␉␉␉break;␊ |
146 | ␊ |
147 | ␉␉case 0x2e208086:␊ |
148 | ␉␉␉type = CT_P45;␊ |
149 | ␉␉␉break;␊ |
150 | ␊ |
151 | ␉␉case 0x2e308086:␊ |
152 | ␉␉␉type = CT_G41;␊ |
153 | ␉␉␉break;␊ |
154 | ␉␉␉␉␉␊ |
155 | ␉␉case 0x29c08086:␊ |
156 | ␉␉␉type = CT_G31;␊ |
157 | ␉␉␉break;␊ |
158 | ␉␉␉␊ |
159 | ␉␉case 0x29208086:␊ |
160 | ␉␉␉type = CT_G45;␊ |
161 | ␉␉␉break;␊ |
162 | ␉␉␉␊ |
163 | ␉␉case 0xA0108086:␉// mobile␊ |
164 | ␉␉case 0xA0008086:␉// desktop␊ |
165 | ␉␉␉type = CT_3150;␊ |
166 | ␉␉␉break;␊ |
167 | ␉␉␉␊ |
168 | ␉␉case 0x2a008086:␊ |
169 | ␉␉␉type = CT_965GM;␊ |
170 | ␉␉␉break;␊ |
171 | ␉␉␉␊ |
172 | ␉␉case 0x29e08086:␊ |
173 | ␉␉␉type = CT_X48;␊ |
174 | ␉␉␉break;␉␉␉␊ |
175 | ␉␉␉␉␊ |
176 | ␉␉case 0x2a408086:␊ |
177 | ␉␉␉type = CT_GM45;␊ |
178 | ␉␉␉break;␊ |
179 | ␉␉␉␊ |
180 | ␉␉␉␊ |
181 | ␉␉default:␊ |
182 | ␉␉␉if((id & 0x0000FFFF) == 0x00008086) // Intel chipset␊ |
183 | ␉␉␉{␊ |
184 | ␉␉␉␉//printf("Unknown chipset 0x%llX, please email id to meklort@gmail.com", id);␊ |
185 | ␉␉␉␉//getc();␊ |
186 | ␉␉␉␉type = CT_UNKNOWN_INTEL;␊ |
187 | ␉␉␉␉//type = CT_UNKNOWN;␊ |
188 | ␊ |
189 | ␉␉␉}␊ |
190 | ␉␉␉else␊ |
191 | ␉␉␉{␊ |
192 | ␉␉␉␉type = CT_UNKNOWN;␊ |
193 | ␉␉␉}␊ |
194 | ␉␉␉break;␊ |
195 | ␉}␊ |
196 | ␉return type;␊ |
197 | }␊ |
198 | ␊ |
199 | vbios_resolution_type1 * map_type1_resolution(vbios_map * map, UInt16 res)␊ |
200 | {␊ |
201 | ␉vbios_resolution_type1 * ptr = ((vbios_resolution_type1*)(map->bios_ptr + res)); ␊ |
202 | ␉return ptr;␊ |
203 | }␊ |
204 | ␊ |
205 | vbios_resolution_type2 * map_type2_resolution(vbios_map * map, UInt16 res)␊ |
206 | {␊ |
207 | ␉vbios_resolution_type2 * ptr = ((vbios_resolution_type2*)(map->bios_ptr + res)); ␊ |
208 | ␉return ptr;␊ |
209 | }␊ |
210 | ␊ |
211 | vbios_resolution_type3 * map_type3_resolution(vbios_map * map, UInt16 res)␊ |
212 | {␊ |
213 | ␉vbios_resolution_type3 * ptr = ((vbios_resolution_type3*)(map->bios_ptr + res)); ␊ |
214 | ␉return ptr;␊ |
215 | }␊ |
216 | ␊ |
217 | char detect_bios_type(vbios_map * map, char modeline, int entry_size)␊ |
218 | {␊ |
219 | ␉UInt32 i;␊ |
220 | ␉UInt16 r1, r2;␊ |
221 | ␉␊ |
222 | ␉r1 = r2 = 32000;␊ |
223 | ␉␊ |
224 | ␉for (i=0; i < map->mode_table_size; i++)␊ |
225 | ␉{␊ |
226 | ␉␉if (map->mode_table[i].resolution <= r1)␊ |
227 | ␉␉{␊ |
228 | ␉␉␉r1 = map->mode_table[i].resolution;␊ |
229 | ␉␉}␊ |
230 | ␉␉else␊ |
231 | ␉␉{␊ |
232 | ␉␉␉if (map->mode_table[i].resolution <= r2)␊ |
233 | ␉␉␉{␊ |
234 | ␉␉␉␉r2 = map->mode_table[i].resolution;␊ |
235 | ␉␉␉}␊ |
236 | ␉␉}␊ |
237 | ␉␉␊ |
238 | ␉␉/*printf("r1 = %d r2 = %d\n", r1, r2);*/␊ |
239 | ␉}␊ |
240 | ␉␊ |
241 | ␉return (r2-r1-6) % entry_size == 0;␊ |
242 | }␊ |
243 | ␊ |
244 | void close_vbios(vbios_map * map);␊ |
245 | ␊ |
246 | char detect_ati_bios_type(vbios_map * map)␊ |
247 | {␉␊ |
248 | ␉return map->mode_table_size % sizeof(ATOM_MODE_TIMING) == 0;␊ |
249 | }␊ |
250 | ␊ |
251 | ␊ |
252 | vbios_map * open_vbios(chipset_type forced_chipset)␊ |
253 | {␊ |
254 | ␉UInt32 z;␊ |
255 | ␉vbios_map * map = malloc(sizeof(vbios_map));␊ |
256 | ␉if (!map)␊ |
257 | ␉{␊ |
258 | ␉␉return 0;␊ |
259 | ␉}␊ |
260 | ␉for(z=0; z<sizeof(vbios_map); z++) ((char*)map)[z]=0;␊ |
261 | ␉/*␊ |
262 | ␉ * Determine chipset␊ |
263 | ␉ */␊ |
264 | ␉␊ |
265 | ␉if (forced_chipset == CT_UNKNOWN)␊ |
266 | ␉{␊ |
267 | ␉␉map->chipset_id = get_chipset_id();␊ |
268 | ␉␉map->chipset = get_chipset(map->chipset_id);␊ |
269 | ␉}␊ |
270 | ␉else if (forced_chipset != CT_UNKNOWN)␊ |
271 | ␉{␊ |
272 | ␉␉map->chipset = forced_chipset;␊ |
273 | ␉}␊ |
274 | ␉␊ |
275 | ␉␊ |
276 | ␉if (map->chipset == CT_UNKNOWN)␊ |
277 | ␉{␊ |
278 | ␉␉//verbose("Unknown chipset type.\n");␊ |
279 | ␉␉//verbose("915resolution only works with Intel 800/900 series graphic chipsets.\n");␊ |
280 | ␉␉//verbose("Chipset Id: %x\n", map->chipset_id);␊ |
281 | ␉␉close_vbios(map);␊ |
282 | ␉␉return 0;␊ |
283 | ␉}␊ |
284 | ␉␊ |
285 | ␉␊ |
286 | ␉/*␊ |
287 | ␉ * Map the video bios to memory␊ |
288 | ␉ */␊ |
289 | ␉map->bios_ptr=(char*)VBIOS_START;␊ |
290 | ␉␊ |
291 | ␉/*␊ |
292 | ␉ * check if we have ATI Radeon␊ |
293 | ␉ */␊ |
294 | ␉map->ati_tables.base = map->bios_ptr;␊ |
295 | ␉map->ati_tables.AtomRomHeader = (ATOM_ROM_HEADER *) (map->bios_ptr + *(unsigned short *) (map->bios_ptr + OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER)); ␊ |
296 | ␉if (strcmp ((char *) map->ati_tables.AtomRomHeader->uaFirmWareSignature, "ATOM") == 0)␊ |
297 | ␉{␊ |
298 | ␉␉// ATI Radeon Card␊ |
299 | ␉␉map->bios = BT_ATI_1;␊ |
300 | ␉␉␊ |
301 | ␉␉map->ati_tables.MasterDataTables = (unsigned short *) &((ATOM_MASTER_DATA_TABLE *) (map->bios_ptr + map->ati_tables.AtomRomHeader->usMasterDataTableOffset))->ListOfDataTables;␊ |
302 | ␉␉unsigned short std_vesa_offset = (unsigned short) ((ATOM_MASTER_LIST_OF_DATA_TABLES *)map->ati_tables.MasterDataTables)->StandardVESA_Timing;␊ |
303 | ␉␉ATOM_STANDARD_VESA_TIMING * std_vesa = (ATOM_STANDARD_VESA_TIMING *) (map->bios_ptr + std_vesa_offset);␊ |
304 | ␉␉␊ |
305 | ␉␉map->ati_mode_table = (char *) &std_vesa->aModeTimings;␊ |
306 | ␉␉if (map->ati_mode_table == 0)␊ |
307 | ␉␉{␊ |
308 | ␉␉␉printf("Unable to locate the mode table.\n");␊ |
309 | ␉␉␉printf("Please run the program 'dump_bios' as root and\n");␊ |
310 | ␉␉␉printf("email the file 'vbios.dmp' to stomljen@yahoo.com.\n");␊ |
311 | ␉␉␉printf("Chipset: %d\n", map->chipset);␊ |
312 | ␉␉␉close_vbios(map);␊ |
313 | ␉␉␉return 0;␊ |
314 | ␉␉}␊ |
315 | ␉␉map->mode_table_size = std_vesa->sHeader.usStructureSize - sizeof(ATOM_COMMON_TABLE_HEADER);␊ |
316 | ␉␉␊ |
317 | ␉␉if (!detect_ati_bios_type(map)) map->bios = BT_ATI_2;␊ |
318 | ␉␉␊ |
319 | ␉}␊ |
320 | ␉else {␊ |
321 | ␉␉␊ |
322 | ␉␉/*␊ |
323 | ␉␉ * check if we have NVIDIA␊ |
324 | ␉␉ */␊ |
325 | ␊ |
326 | ␉␉int i = 0;␊ |
327 | ␉␉while (i < 512)␊ |
328 | ␉␉{ // we don't need to look through the whole bios, just the first 512 bytes␊ |
329 | ␉␉␉if ((␉map->bios_ptr[i] == 'N') ␊ |
330 | ␉␉␉␉&& (map->bios_ptr[i+1] == 'V') ␊ |
331 | ␉␉␉␉&& (map->bios_ptr[i+2] == 'I') ␊ |
332 | ␉␉␉␉&& (map->bios_ptr[i+3] == 'D')) ␊ |
333 | ␉␉␉{␊ |
334 | ␉␉␉␉map->bios = BT_NVDA;␊ |
335 | ␉␉␉␉unsigned short nv_data_table_offset = 0;␊ |
336 | ␉␉␉␉unsigned short * nv_data_table;␊ |
337 | ␉␉␉␉NV_VESA_TABLE * std_vesa;␊ |
338 | ␉␉␉␉␊ |
339 | ␉␉␉␉int i = 0;␊ |
340 | ␉␉␉␉␊ |
341 | ␉␉␉␉while (i < 0x300)␊ |
342 | ␉␉␉␉{ //We don't need to look for the table in the whole bios, the 768 first bytes only␊ |
343 | ␉␉␉␉␉if ((␉map->bios_ptr[i] == 0x44) ␊ |
344 | ␉␉␉␉␉␉&& (map->bios_ptr[i+1] == 0x01) ␊ |
345 | ␉␉␉␉␉␉&& (map->bios_ptr[i+2] == 0x04) ␊ |
346 | ␉␉␉␉␉␉&& (map->bios_ptr[i+3] == 0x00))␊ |
347 | ␉␉␉␉␉{␊ |
348 | ␉␉␉␉␉␉nv_data_table_offset = (unsigned short) (map->bios_ptr[i+4] | (map->bios_ptr[i+5] << 8));␊ |
349 | ␉␉␉␉␉␉break;␊ |
350 | ␉␉␉␉␉}␊ |
351 | ␉␉␉␉␉i++;␊ |
352 | ␉␉␉␉}␊ |
353 | ␉␉␉␉␊ |
354 | ␉␉␉␉nv_data_table = (unsigned short *) (map->bios_ptr + (nv_data_table_offset + OFFSET_TO_VESA_TABLE_INDEX));␊ |
355 | ␉␉␉␉std_vesa = (NV_VESA_TABLE *) (map->bios_ptr + *nv_data_table);␊ |
356 | ␉␉␉␉␊ |
357 | ␉␉␉␉map->nv_mode_table = (char *) std_vesa->sModelines;␊ |
358 | ␉␉␉␉if (map->nv_mode_table == 0)␊ |
359 | ␉␉␉␉{␊ |
360 | ␉␉␉␉␉printf("Unable to locate the mode table.\n");␊ |
361 | ␉␉␉␉␉printf("Please run the program 'dump_bios' as root and\n");␊ |
362 | ␉␉␉␉␉printf("email the file 'vbios.dmp' to stomljen@yahoo.com.\n");␊ |
363 | ␉␉␉␉␉printf("Chipset: %s\n", map->chipset);␊ |
364 | ␉␉␉␉␉close_vbios(map);␊ |
365 | ␉␉␉␉␉return 0;␊ |
366 | ␉␉␉␉}␊ |
367 | ␉␉␉␉map->mode_table_size = std_vesa->sHeader.usTable_Size;␊ |
368 | ␉␉␉␉␊ |
369 | ␉␉␉␉break;␊ |
370 | ␉␉␉}␊ |
371 | ␉␉␉i++;␊ |
372 | ␉␉}␊ |
373 | ␉}␊ |
374 | ␉␊ |
375 | ␉␊ |
376 | ␉/*␊ |
377 | ␉ * check if we have Intel␊ |
378 | ␉ */␊ |
379 | ␉␊ |
380 | ␉/*if (map->chipset == CT_UNKNOWN && memmem(map->bios_ptr, VBIOS_SIZE, INTEL_SIGNATURE, strlen(INTEL_SIGNATURE))) {␊ |
381 | ␉ printf( "Intel chipset detected. However, 915resolution was unable to determine the chipset type.\n");␊ |
382 | ␉ ␊ |
383 | ␉ printf("Chipset Id: %x\n", map->chipset_id);␊ |
384 | ␉ ␊ |
385 | ␉ printf("Please report this problem to stomljen@yahoo.com\n");␊ |
386 | ␉ ␊ |
387 | ␉ close_vbios(map);␊ |
388 | ␉ return 0;␊ |
389 | ␉ }*/␊ |
390 | ␉␊ |
391 | ␉/*␊ |
392 | ␉ * check for others␊ |
393 | ␉ */␊ |
394 | ␉␊ |
395 | ␊ |
396 | ␉␊ |
397 | ␉/*␊ |
398 | ␉ * Figure out where the mode table is ␊ |
399 | ␉ */␊ |
400 | ␉if ((map->bios != BT_ATI_1) && (map->bios != BT_NVDA)) ␊ |
401 | ␉{␊ |
402 | ␉␉char* p = map->bios_ptr + 16;␊ |
403 | ␉␉char* limit = map->bios_ptr + VBIOS_SIZE - (3 * sizeof(vbios_mode));␊ |
404 | ␉␉␊ |
405 | ␉␉while (p < limit && map->mode_table == 0)␊ |
406 | ␉␉{␊ |
407 | ␉␉␉vbios_mode * mode_ptr = (vbios_mode *) p;␊ |
408 | ␉␉␉␊ |
409 | ␉␉␉if (((mode_ptr[0].mode & 0xf0) == 0x30) && ((mode_ptr[1].mode & 0xf0) == 0x30) &&␊ |
410 | ␉␉␉␉((mode_ptr[2].mode & 0xf0) == 0x30) && ((mode_ptr[3].mode & 0xf0) == 0x30))␊ |
411 | ␉␉␉{␊ |
412 | ␉␉␉␉map->mode_table = mode_ptr;␊ |
413 | ␉␉␉}␊ |
414 | ␉␉␉␊ |
415 | ␉␉␉p++;␊ |
416 | ␉␉}␊ |
417 | ␉␉␊ |
418 | ␉␉if (map->mode_table == 0) ␊ |
419 | ␉␉{␊ |
420 | ␉␉␉close_vbios(map);␊ |
421 | ␉␉␉return 0;␊ |
422 | ␉␉}␊ |
423 | ␉}␊ |
424 | ␉␊ |
425 | ␉␊ |
426 | ␉/*␊ |
427 | ␉ * Determine size of mode table␊ |
428 | ␉ */␊ |
429 | ␉if ((map->bios != BT_ATI_1) && (map->bios != BT_ATI_2) && (map->bios != BT_NVDA))␊ |
430 | ␉{␊ |
431 | ␉␉vbios_mode * mode_ptr = map->mode_table;␊ |
432 | ␉␉␊ |
433 | ␉␉while (mode_ptr->mode != 0xff)␊ |
434 | ␉␉{␊ |
435 | ␉␉␉map->mode_table_size++;␊ |
436 | ␉␉␉mode_ptr++;␊ |
437 | ␉␉}␊ |
438 | ␉}␊ |
439 | ␉␊ |
440 | ␉/*␊ |
441 | ␉ * Figure out what type of bios we have␊ |
442 | ␉ * order of detection is important␊ |
443 | ␉ */␊ |
444 | ␉if ((map->bios != BT_ATI_1) && (map->bios != BT_ATI_2) && (map->bios != BT_NVDA))␊ |
445 | ␉{␊ |
446 | ␉␉if (detect_bios_type(map, TRUE, sizeof(vbios_modeline_type3)))␊ |
447 | ␉␉{␊ |
448 | ␉␉␉map->bios = BT_3;␊ |
449 | ␉␉}␊ |
450 | ␉␉else if (detect_bios_type(map, TRUE, sizeof(vbios_modeline_type2)))␊ |
451 | ␉␉{␊ |
452 | ␉␉␉map->bios = BT_2;␊ |
453 | ␉␉}␊ |
454 | ␉␉else if (detect_bios_type(map, FALSE, sizeof(vbios_resolution_type1)))␊ |
455 | ␉␉{␊ |
456 | ␉␉␉map->bios = BT_1;␊ |
457 | ␉␉}␊ |
458 | ␉␉else {␊ |
459 | ␉␉␉return 0;␊ |
460 | ␉␉}␊ |
461 | ␉}␊ |
462 | ␉␊ |
463 | ␉return map;␊ |
464 | }␊ |
465 | ␊ |
466 | void close_vbios(vbios_map * map)␊ |
467 | {␊ |
468 | ␉free(map);␊ |
469 | }␊ |
470 | ␊ |
471 | void unlock_vbios(vbios_map * map)␊ |
472 | {␊ |
473 | ␉␊ |
474 | ␉map->unlocked = TRUE;␊ |
475 | ␊ |
476 | ␉switch (map->chipset) {␊ |
477 | ␉␉case CT_UNKNOWN:␊ |
478 | ␉␉␉break;␊ |
479 | ␉␉case CT_830:␊ |
480 | ␉␉case CT_855GM:␊ |
481 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x8000005a);␊ |
482 | ␉␉␉map->b1 = inb(CONFIG_MECH_ONE_DATA + 2);␊ |
483 | ␉␉␉␊ |
484 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x8000005a);␊ |
485 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 2, 0x33);␊ |
486 | ␉␉␉break;␊ |
487 | ␉␉case CT_845G:␊ |
488 | ␉␉case CT_865G:␊ |
489 | ␉␉case CT_915G:␊ |
490 | ␉␉case CT_915GM:␊ |
491 | ␉␉case CT_945G:␊ |
492 | ␉␉case CT_945GM:␊ |
493 | ␉␉case CT_945GME:␊ |
494 | ␉␉case CT_946GZ:␊ |
495 | ␉␉case CT_G965:␊ |
496 | ␉␉case CT_Q965:␊ |
497 | ␉␉case CT_965GM:␊ |
498 | ␉␉case CT_975X:␊ |
499 | ␉␉case CT_P35:␊ |
500 | ␉␉case CT_955X:␊ |
501 | ␉␉case CT_X48:␊ |
502 | ␉␉case CT_B43:␊ |
503 | ␉␉case CT_Q45:␊ |
504 | ␉␉case CT_P45:␊ |
505 | ␉␉case CT_GM45:␊ |
506 | ␉␉case CT_G45:␊ |
507 | ␉␉case CT_G41:␊ |
508 | ␉␉case CT_G31:␊ |
509 | ␉␉case CT_500:␊ |
510 | ␉␉case CT_3150:␊ |
511 | ␉␉case CT_UNKNOWN_INTEL:␉// Assume newer intel chipset is the same as before␊ |
512 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x80000090);␊ |
513 | ␉␉␉map->b1 = inb(CONFIG_MECH_ONE_DATA + 1);␊ |
514 | ␉␉␉map->b2 = inb(CONFIG_MECH_ONE_DATA + 2);␊ |
515 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x80000090);␊ |
516 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 1, 0x33);␊ |
517 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 2, 0x33);␊ |
518 | ␉␉␉break;␊ |
519 | ␉␉default:␊ |
520 | ␉␉␉break;␊ |
521 | ␉}␊ |
522 | ␉␊ |
523 | #if DEBUG␊ |
524 | ␉{␊ |
525 | ␉␉UInt32 t = inl(CONFIG_MECH_ONE_DATA);␊ |
526 | ␉␉verbose("unlock PAM: (0x%08x)\n", t);␊ |
527 | ␉}␊ |
528 | #endif␊ |
529 | }␊ |
530 | ␊ |
531 | void relock_vbios(vbios_map * map)␊ |
532 | {␊ |
533 | ␉␊ |
534 | ␉map->unlocked = FALSE;␊ |
535 | ␉␊ |
536 | ␉switch (map->chipset)␊ |
537 | ␉{␊ |
538 | ␉␉case CT_UNKNOWN:␊ |
539 | ␉␉␉break;␊ |
540 | ␉␉case CT_830:␊ |
541 | ␉␉case CT_855GM:␊ |
542 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x8000005a);␊ |
543 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 2, map->b1);␊ |
544 | ␉␉␉break;␊ |
545 | ␉␉case CT_845G:␊ |
546 | ␉␉case CT_865G:␊ |
547 | ␉␉case CT_915G:␊ |
548 | ␉␉case CT_915GM:␊ |
549 | ␉␉case CT_945G:␊ |
550 | ␉␉case CT_945GM:␊ |
551 | ␉␉case CT_945GME:␊ |
552 | ␉␉case CT_946GZ:␊ |
553 | ␉␉case CT_G965:␊ |
554 | ␉␉case CT_955X:␊ |
555 | ␉␉case CT_G45:␊ |
556 | ␉␉case CT_Q965:␊ |
557 | ␉␉case CT_965GM:␊ |
558 | ␉␉case CT_975X:␊ |
559 | ␉␉case CT_P35:␊ |
560 | ␉␉case CT_X48:␊ |
561 | ␉␉case CT_B43:␊ |
562 | ␉␉case CT_Q45:␊ |
563 | ␉␉case CT_P45:␊ |
564 | ␉␉case CT_GM45:␊ |
565 | ␉␉case CT_G41:␊ |
566 | ␉␉case CT_G31:␊ |
567 | ␉␉case CT_500:␊ |
568 | ␉␉case CT_3150:␊ |
569 | ␉␉case CT_UNKNOWN_INTEL:␊ |
570 | ␉␉␉outl(CONFIG_MECH_ONE_ADDR, 0x80000090);␊ |
571 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 1, map->b1);␊ |
572 | ␉␉␉outb(CONFIG_MECH_ONE_DATA + 2, map->b2);␊ |
573 | ␉␉␉break;␊ |
574 | ␉␉default:␊ |
575 | ␉␉␉break;␊ |
576 | ␉}␊ |
577 | ␉␊ |
578 | #if DEBUG␊ |
579 | ␉{␊ |
580 | UInt32 t = inl(CONFIG_MECH_ONE_DATA);␊ |
581 | ␉␉verbose("relock PAM: (0x%08x)\n", t);␊ |
582 | ␉}␊ |
583 | #endif␊ |
584 | }␊ |
585 | ␊ |
586 | ␊ |
587 | int getMode(edid_mode *mode)␊ |
588 | {␊ |
589 | ␉char* edidInfo = readEDID();␊ |
590 | ␉␉␉␊ |
591 | ␉if(!edidInfo) return 1;␊ |
592 | //Slice␊ |
593 | ␉if(!fb_parse_edid((struct EDID *)edidInfo, mode)) ␊ |
594 | ␉{␊ |
595 | ␉␉free( edidInfo );␊ |
596 | ␉␉return 1;␊ |
597 | ␉}␊ |
598 | /*␉mode->pixel_clock = (edidInfo[55] << 8) | edidInfo[54];␊ |
599 | ␉mode->h_active = edidInfo[56] | ((edidInfo[58] & 0xF0) << 4);␊ |
600 | ␉mode->h_blanking = ((edidInfo[58] & 0x0F) << 8) | edidInfo[57];␊ |
601 | ␉mode->v_active = edidInfo[59] | ((edidInfo[61] & 0xF0) << 4);␊ |
602 | ␉mode->v_blanking = ((edidInfo[61] & 0x0F) << 8) | edidInfo[60];␊ |
603 | ␉mode->h_sync_offset = ((edidInfo[65] & 0xC0) >> 2) | edidInfo[62];␊ |
604 | ␉mode->h_sync_width = (edidInfo[65] & 0x30) | edidInfo[63];␊ |
605 | ␉mode->v_sync_offset = (edidInfo[65] & 0x0C) | ((edidInfo[64] & 0x0C) >> 2);␊ |
606 | ␉mode->v_sync_width = ((edidInfo[65] & 0x3) << 2) | (edidInfo[64] & 0x03);␊ |
607 | */␉␉␊ |
608 | ␉␉␊ |
609 | ␉free( edidInfo );␊ |
610 | ␉␉␊ |
611 | ␉if(!mode->h_active) return 1;␊ |
612 | ␉␊ |
613 | ␉return 0;␊ |
614 | ␉␉␊ |
615 | }␊ |
616 | ␊ |
617 | ␊ |
618 | static void gtf_timings(UInt32 x, UInt32 y, UInt32 freq,␊ |
619 | ␉␉␉␉␉␉unsigned long *clock,␊ |
620 | ␉␉␉␉␉␉UInt16 *hsyncstart, UInt16 *hsyncend, UInt16 *hblank,␊ |
621 | ␉␉␉␉␉␉UInt16 *vsyncstart, UInt16 *vsyncend, UInt16 *vblank)␊ |
622 | {␊ |
623 | ␉UInt32 hbl, vbl, vfreq;␊ |
624 | ␉␊ |
625 | ␉vbl = y + (y+1)/(20000.0/(11*freq) - 1) + 1.5;␊ |
626 | ␉vfreq = vbl * freq;␊ |
627 | ␉hbl = 16 * (int)(x * (30.0 - 300000.0 / vfreq) /␊ |
628 | ␉␉␉␉␉ + (70.0 + 300000.0 / vfreq) / 16.0 + 0.5);␊ |
629 | ␉␊ |
630 | ␉*vsyncstart = y;␊ |
631 | ␉*vsyncend = y + 3;␊ |
632 | ␉*vblank = vbl - 1;␊ |
633 | ␉*hsyncstart = x + hbl / 2 - (x + hbl + 50) / 100 * 8 - 1;␊ |
634 | ␉*hsyncend = x + hbl / 2 - 1;␊ |
635 | ␉*hblank = x + hbl - 1;␊ |
636 | ␉*clock = (x + hbl) * vfreq / 1000;␊ |
637 | }␊ |
638 | ␊ |
639 | void set_mode(vbios_map * map, /*UInt32 mode,*/ UInt32 x, UInt32 y, UInt32 bp, UInt32 htotal, UInt32 vtotal) {␊ |
640 | ␉UInt32 xprev, yprev;␊ |
641 | ␉UInt32 i = 0, j;␊ |
642 | ␉// patch first available mode␊ |
643 | ␉␊ |
644 | ␉//␉for (i=0; i < map->mode_table_size; i++) {␊ |
645 | ␉//␉␉if (map->mode_table[0].mode == mode) {␊ |
646 | ␉switch(map->bios) {␊ |
647 | ␉␉case BT_INTEL:␊ |
648 | ␉␉␉return;␊ |
649 | ␊ |
650 | ␉␉case BT_1:␊ |
651 | ␉␉{␊ |
652 | ␉␉␉vbios_resolution_type1 * res = map_type1_resolution(map, map->mode_table[i].resolution);␊ |
653 | ␉␉␉␊ |
654 | ␉␉␉if (bp) {␊ |
655 | ␉␉␉␉map->mode_table[i].bits_per_pixel = bp;␊ |
656 | ␉␉␉}␊ |
657 | ␉␉␉␊ |
658 | ␉␉␉res->x2 = (htotal?(((htotal-x) >> 8) & 0x0f) : (res->x2 & 0x0f)) | ((x >> 4) & 0xf0);␊ |
659 | ␉␉␉res->x1 = (x & 0xff);␊ |
660 | ␉␉␉␊ |
661 | ␉␉␉res->y2 = (vtotal?(((vtotal-y) >> 8) & 0x0f) : (res->y2 & 0x0f)) | ((y >> 4) & 0xf0);␊ |
662 | ␉␉␉res->y1 = (y & 0xff);␊ |
663 | ␉␉␉if (htotal)␊ |
664 | ␉␉␉␉res->x_total = ((htotal-x) & 0xff);␊ |
665 | ␉␉␉␊ |
666 | ␉␉␉if (vtotal)␊ |
667 | ␉␉␉␉res->y_total = ((vtotal-y) & 0xff);␊ |
668 | ␉␉␉␊ |
669 | ␉␉␉break;␊ |
670 | ␉␉}␊ |
671 | ␉␉case BT_2:␊ |
672 | ␉␉{␊ |
673 | ␉␉␉vbios_resolution_type2 * res = map_type2_resolution(map, map->mode_table[i].resolution);␊ |
674 | ␉␉␉␊ |
675 | ␉␉␉res->xchars = x / 8;␊ |
676 | ␉␉␉res->ychars = y / 16 - 1;␊ |
677 | ␉␉␉xprev = res->modelines[0].x1;␊ |
678 | ␉␉␉yprev = res->modelines[0].y1;␊ |
679 | ␉␉␉␊ |
680 | ␉␉␉for(j=0; j < 3; j++) {␊ |
681 | ␉␉␉␉vbios_modeline_type2 * modeline = &res->modelines[j];␊ |
682 | ␉␉␉␉␊ |
683 | ␉␉␉␉if (modeline->x1 == xprev && modeline->y1 == yprev) {␊ |
684 | ␉␉␉␉␉modeline->x1 = modeline->x2 = x-1;␊ |
685 | ␉␉␉␉␉modeline->y1 = modeline->y2 = y-1;␊ |
686 | ␉␉␉␉␉␊ |
687 | ␉␉␉␉␉gtf_timings(x, y, freqs[j], &modeline->clock,␊ |
688 | ␉␉␉␉␉␉␉␉&modeline->hsyncstart, &modeline->hsyncend,␊ |
689 | ␉␉␉␉␉␉␉␉&modeline->hblank, &modeline->vsyncstart,␊ |
690 | ␉␉␉␉␉␉␉␉&modeline->vsyncend, &modeline->vblank);␊ |
691 | ␉␉␉␉␉␊ |
692 | ␉␉␉␉␉if (htotal)␊ |
693 | ␉␉␉␉␉␉modeline->htotal = htotal;␊ |
694 | ␉␉␉␉␉else␊ |
695 | ␉␉␉␉␉␉modeline->htotal = modeline->hblank;␊ |
696 | ␉␉␉␉␉␊ |
697 | ␉␉␉␉␉if (vtotal)␊ |
698 | ␉␉␉␉␉␉modeline->vtotal = vtotal;␊ |
699 | ␉␉␉␉␉else␊ |
700 | ␉␉␉␉␉␉modeline->vtotal = modeline->vblank;␊ |
701 | ␉␉␉␉}␊ |
702 | ␉␉␉}␊ |
703 | ␉␉␉break;␊ |
704 | ␉␉}␊ |
705 | ␉␉case BT_3:␊ |
706 | ␉␉{␊ |
707 | ␉␉␉vbios_resolution_type3 * res = map_type3_resolution(map, map->mode_table[i].resolution);␊ |
708 | ␉␉␉␊ |
709 | ␉␉␉xprev = res->modelines[0].x1;␊ |
710 | ␉␉␉yprev = res->modelines[0].y1;␊ |
711 | ␉␉␉␊ |
712 | ␉␉␉for (j=0; j < 3; j++) {␊ |
713 | ␉␉␉␉vbios_modeline_type3 * modeline = &res->modelines[j];␊ |
714 | ␉␉␉␉␊ |
715 | ␉␉␉␉if (modeline->x1 == xprev && modeline->y1 == yprev) {␊ |
716 | ␉␉␉␉␉modeline->x1 = modeline->x2 = x-1;␊ |
717 | ␉␉␉␉␉modeline->y1 = modeline->y2 = y-1;␊ |
718 | ␉␉␉␉␉␊ |
719 | ␉␉␉␉␉gtf_timings(x, y, freqs[j], &modeline->clock,␊ |
720 | ␉␉␉␉␉␉␉␉&modeline->hsyncstart, &modeline->hsyncend,␊ |
721 | ␉␉␉␉␉␉␉␉&modeline->hblank, &modeline->vsyncstart,␊ |
722 | ␉␉␉␉␉␉␉␉&modeline->vsyncend, &modeline->vblank);␊ |
723 | ␉␉␉␉␉if (htotal)␊ |
724 | ␉␉␉␉␉␉modeline->htotal = htotal;␊ |
725 | ␉␉␉␉␉else␊ |
726 | ␉␉␉␉␉␉modeline->htotal = modeline->hblank;␊ |
727 | ␉␉␉␉␉if (vtotal)␊ |
728 | ␉␉␉␉␉␉modeline->vtotal = vtotal;␊ |
729 | ␉␉␉␉␉else␊ |
730 | ␉␉␉␉␉␉modeline->vtotal = modeline->vblank;␊ |
731 | ␉␉␉␉␉␊ |
732 | ␉␉␉␉␉modeline->timing_h = y-1;␊ |
733 | ␉␉␉␉␉modeline->timing_v = x-1;␊ |
734 | ␉␉␉␉}␊ |
735 | ␉␉␉}␊ |
736 | ␉␉␉break;␊ |
737 | ␉␉}␊ |
738 | ␉␉case BT_ATI_1:␊ |
739 | ␉␉{␊ |
740 | ␉␉␉edid_mode mode;␊ |
741 | ␉␉␉␉␊ |
742 | ␉␉␉ATOM_MODE_TIMING *mode_timing = (ATOM_MODE_TIMING *) map->ati_mode_table;␊ |
743 | ␊ |
744 | ␉␉␉//if (mode.pixel_clock && (mode.h_active == x) && (mode.v_active == y) && !force) {␊ |
745 | ␉␉␉if (!getMode(&mode)) {␊ |
746 | ␉␉␉␉mode_timing->usCRTC_H_Total = mode.h_active + mode.h_blanking;␊ |
747 | ␉␉␉␉mode_timing->usCRTC_H_Disp = mode.h_active;␊ |
748 | ␉␉␉␉mode_timing->usCRTC_H_SyncStart = mode.h_active + mode.h_sync_offset;␊ |
749 | ␉␉␉␉mode_timing->usCRTC_H_SyncWidth = mode.h_sync_width;␊ |
750 | ␉␉␉␉␉␊ |
751 | ␉␉␉␉mode_timing->usCRTC_V_Total = mode.v_active + mode.v_blanking;␊ |
752 | ␉␉␉␉mode_timing->usCRTC_V_Disp = mode.v_active;␊ |
753 | ␉␉␉␉mode_timing->usCRTC_V_SyncStart = mode.v_active + mode.v_sync_offset;␊ |
754 | ␉␉␉␉mode_timing->usCRTC_V_SyncWidth = mode.v_sync_width;␊ |
755 | ␊ |
756 | ␉␉␉␉mode_timing->usPixelClock = mode.pixel_clock;␊ |
757 | ␉␉␉}␊ |
758 | ␉␉␉/*else␊ |
759 | ␉␉␉{␊ |
760 | ␉␉␉␉vbios_modeline_type2 modeline;␊ |
761 | ␊ |
762 | ␉␉␉␉cvt_timings(x, y, freqs[0], &modeline.clock,␊ |
763 | ␉␉␉␉␉␉␉&modeline.hsyncstart, &modeline.hsyncend,␊ |
764 | ␉␉␉␉␉␉␉&modeline.hblank, &modeline.vsyncstart,␊ |
765 | ␉␉␉␉␉␉␉&modeline.vsyncend, &modeline.vblank, 0);␊ |
766 | ␊ |
767 | ␉␉␉␉mode_timing->usCRTC_H_Total = x + modeline.hblank;␊ |
768 | ␉␉␉␉mode_timing->usCRTC_H_Disp = x;␊ |
769 | ␉␉␉␉mode_timing->usCRTC_H_SyncStart = modeline.hsyncstart;␊ |
770 | ␉␉␉␉mode_timing->usCRTC_H_SyncWidth = modeline.hsyncend - modeline.hsyncstart;␊ |
771 | ␊ |
772 | ␉␉␉␉mode_timing->usCRTC_V_Total = y + modeline.vblank;␊ |
773 | ␉␉␉␉mode_timing->usCRTC_V_Disp = y;␊ |
774 | ␉␉␉␉mode_timing->usCRTC_V_SyncStart = modeline.vsyncstart;␊ |
775 | ␉␉␉␉mode_timing->usCRTC_V_SyncWidth = modeline.vsyncend - modeline.vsyncstart;␊ |
776 | ␉␉␉␉␉␉␉␉␉␉␉␉␊ |
777 | ␉␉␉␉mode_timing->usPixelClock = modeline.clock;␊ |
778 | ␉␉␉ }*/␊ |
779 | ␉␊ |
780 | ␉␉␉break;␊ |
781 | ␉␉}␊ |
782 | ␉␉case BT_ATI_2:␊ |
783 | ␉␉{␊ |
784 | ␉␉␉edid_mode mode;␊ |
785 | ␉␉␉␉␉␉␊ |
786 | ␉␉␉ATOM_DTD_FORMAT *mode_timing = (ATOM_DTD_FORMAT *) map->ati_mode_table;␊ |
787 | ␉␉␉␊ |
788 | ␉␉␉/*if (mode.pixel_clock && (mode.h_active == x) && (mode.v_active == y) && !force) {*/␊ |
789 | ␉␉␉if (!getMode(&mode)) {␊ |
790 | ␉␉␉␉mode_timing->usHBlanking_Time = mode.h_blanking;␊ |
791 | ␉␉␉␉mode_timing->usHActive = mode.h_active;␊ |
792 | ␉␉␉␉mode_timing->usHSyncOffset = mode.h_sync_offset;␊ |
793 | ␉␉␉␉mode_timing->usHSyncWidth = mode.h_sync_width;␊ |
794 | ␉␉␉␉␉␉␉␉␉␉␊ |
795 | ␉␉␉␉mode_timing->usVBlanking_Time = mode.v_blanking;␊ |
796 | ␉␉␉␉mode_timing->usVActive = mode.v_active;␊ |
797 | ␉␉␉␉mode_timing->usVSyncOffset = mode.v_sync_offset;␊ |
798 | ␉␉␉␉mode_timing->usVSyncWidth = mode.v_sync_width;␊ |
799 | ␉␉␉␉␉␉␉␉␉␉␊ |
800 | ␉␉␉␉mode_timing->usPixClk = mode.pixel_clock;␊ |
801 | ␉␉␉}␊ |
802 | ␉␉␉/*else␊ |
803 | ␉␉␉{␊ |
804 | ␉␉␉␉vbios_modeline_type2 modeline;␊ |
805 | ␉␉␉␊ |
806 | ␉␉␉␉cvt_timings(x, y, freqs[0], &modeline.clock,␊ |
807 | ␉␉␉␉␉␉␉&modeline.hsyncstart, &modeline.hsyncend,␊ |
808 | ␉␉␉␉␉␉␉&modeline.hblank, &modeline.vsyncstart,␊ |
809 | ␉␉␉␉␉␉␉&modeline.vsyncend, &modeline.vblank, 0);␊ |
810 | ␉␉␉␉␉␉␉␉␉␉␉␊ |
811 | ␉␉␉␉mode_timing->usHBlanking_Time = modeline.hblank;␊ |
812 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usHActive = x;␊ |
813 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usHSyncOffset = modeline.hsyncstart - x;␊ |
814 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usHSyncWidth = modeline.hsyncend - modeline.hsyncstart;␊ |
815 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉␊ |
816 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usVBlanking_Time = modeline.vblank;␊ |
817 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usVActive = y;␊ |
818 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usVSyncOffset = modeline.vsyncstart - y;␊ |
819 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usVSyncWidth = modeline.hsyncend - modeline.hsyncstart;␊ |
820 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉␊ |
821 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉␉mode_timing->usPixClk = modeline.clock;␊ |
822 | ␉␉␉␉␉␉␉␉␉ +␉␉␉␉␉}*/␊ |
823 | ␉␉␉␉␊ |
824 | ␉␉␉␊ |
825 | ␉␉␉break;␊ |
826 | ␉␉}␊ |
827 | ␉␉case BT_NVDA:␊ |
828 | ␉␉{␊ |
829 | ␉␉␉edid_mode mode;␊ |
830 | ␉␉␉␊ |
831 | ␉␉␉NV_MODELINE *mode_timing = (NV_MODELINE *) map->nv_mode_table;␊ |
832 | ␉␉␉␊ |
833 | ␉␉␉/*if (mode.pixel_clock && (mode.h_active == x) && (mode.v_active == y) && !force) {*/␊ |
834 | ␉␉␉if (!getMode(&mode)) {␊ |
835 | ␉␉␉␉mode_timing[i].usH_Total = mode.h_active + mode.h_blanking;␊ |
836 | ␉␉␉␉mode_timing[i].usH_Active = mode.h_active;␊ |
837 | ␉␉␉␉mode_timing[i].usH_SyncStart = mode.h_active + mode.h_sync_offset;␊ |
838 | ␉␉␉␉mode_timing[i].usH_SyncEnd = mode.h_active + mode.h_sync_offset + mode.h_sync_width;␊ |
839 | ␉␉␉␉␊ |
840 | ␉␉␉␉mode_timing[i].usV_Total = mode.v_active + mode.v_blanking;␊ |
841 | ␉␉␉␉mode_timing[i].usV_Active = mode.v_active;␊ |
842 | ␉␉␉␉mode_timing[i].usV_SyncStart = mode.v_active + mode.v_sync_offset;␊ |
843 | ␉␉␉␉mode_timing[i].usV_SyncEnd = mode.v_active + mode.v_sync_offset + mode.v_sync_width;␊ |
844 | ␉␉␉␉␊ |
845 | ␉␉␉␉mode_timing[i].usPixel_Clock = mode.pixel_clock;␊ |
846 | ␉␉␉}␊ |
847 | ␉␉␉/*else␊ |
848 | ␉␉␉ {␊ |
849 | ␉␉␉ vbios_modeline_type2 modeline;␊ |
850 | ␉␉␉ ␊ |
851 | ␉␉␉ cvt_timings(x, y, freqs[0], &modeline.clock,␊ |
852 | ␉␉␉ &modeline.hsyncstart, &modeline.hsyncend,␊ |
853 | ␉␉␉ &modeline.hblank, &modeline.vsyncstart,␊ |
854 | ␉␉␉ &modeline.vsyncend, &modeline.vblank, 0);␊ |
855 | ␉␉␉ ␊ |
856 | ␉␉␉ mode_timing[i].usH_Total = x + modeline.hblank - 1;␊ |
857 | ␉␉␉ mode_timing[i].usH_Active = x;␊ |
858 | ␉␉␉ mode_timing[i].usH_SyncStart = modeline.hsyncstart - 1;␊ |
859 | ␉␉␉ mode_timing[i].usH_SyncEnd = modeline.hsyncend - 1;␊ |
860 | ␉␉␉ ␊ |
861 | ␉␉␉ mode_timing[i].usV_Total = y + modeline.vblank - 1;␊ |
862 | ␉␉␉ mode_timing[i].usV_Active = y;␊ |
863 | ␉␉␉ mode_timing[i].usV_SyncStart = modeline.vsyncstart - 1;␊ |
864 | ␉␉␉ mode_timing[i].usV_SyncEnd = modeline.vsyncend - 1;␊ |
865 | ␉␉␉ ␊ |
866 | ␉␉␉ mode_timing[i].usPixel_Clock = modeline.clock;␊ |
867 | ␉␉␉ }*/␊ |
868 | ␉␉␉break;␊ |
869 | ␉␉}␊ |
870 | ␉␉case BT_UNKNOWN:␊ |
871 | ␉␉{␊ |
872 | ␉␉␉break;␊ |
873 | ␉␉}␊ |
874 | ␉␉default:␊ |
875 | ␉␉␉break;␊ |
876 | ␉}␊ |
877 | ␉//␉␉}␊ |
878 | ␉//␉}␊ |
879 | }␊ |
880 | ␊ |
881 | #endif // _RESOLUTION_H_␊ |
882 | |