Rev 6084 | Rev 6103 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6084 | Rev 6088 | ||
---|---|---|---|
Line 32... | Line 32... | ||
32 | 32 | ||
Line 33... | Line 33... | ||
33 | void disable_mouse(void) |
33 | void disable_mouse(void) |
34 | {}; |
34 | {}; |
Line -... | Line 35... | ||
- | 35 | ||
Line 35... | Line 36... | ||
35 | 36 | struct mutex cursor_lock; |
|
36 | 37 | ||
37 | static char *manufacturer_name(unsigned char *x) |
38 | static char *manufacturer_name(unsigned char *x) |
Line 45... | Line 46... | ||
45 | 46 | ||
Line 46... | Line 47... | ||
46 | return name; |
47 | return name; |
47 | } |
48 | } |
Line -... | Line 49... | ||
- | 49 | ||
- | 50 | static int count_connector_modes(struct drm_connector* connector) |
|
- | 51 | { |
|
- | 52 | struct drm_display_mode *mode; |
|
- | 53 | int count = 0; |
|
- | 54 | ||
- | 55 | list_for_each_entry(mode, &connector->modes, head) |
|
- | 56 | count++; |
|
- | 57 | ||
- | 58 | return count; |
|
- | 59 | }; |
|
48 | 60 | ||
49 | static int set_mode(struct drm_device *dev, struct drm_connector *connector, |
61 | static int set_mode(struct drm_device *dev, struct drm_connector *connector, |
50 | struct drm_crtc *crtc, videomode_t *reqmode, bool strict) |
62 | struct drm_crtc *crtc, videomode_t *reqmode, bool strict) |
51 | { |
63 | { |
Line 52... | Line 64... | ||
52 | struct drm_i915_private *dev_priv = dev->dev_private; |
64 | struct drm_i915_private *dev_priv = dev->dev_private; |
53 | 65 | ||
- | 66 | struct drm_mode_config *config = &dev->mode_config; |
|
54 | struct drm_mode_config *config = &dev->mode_config; |
67 | struct drm_display_mode *mode = NULL, *tmpmode; |
55 | struct drm_display_mode *mode = NULL, *tmpmode; |
68 | struct drm_connector *tmpc; |
56 | struct drm_framebuffer *fb = NULL; |
69 | struct drm_framebuffer *fb = NULL; |
57 | struct drm_mode_set set; |
70 | struct drm_mode_set set; |
58 | const char *con_name; |
71 | const char *con_name; |
Line 63... | Line 76... | ||
63 | ENTER(); |
76 | ENTER(); |
Line 64... | Line 77... | ||
64 | 77 | ||
Line -... | Line 78... | ||
- | 78 | drm_modeset_lock_all(dev); |
|
- | 79 | ||
- | 80 | list_for_each_entry(tmpc, &dev->mode_config.connector_list, head) |
|
- | 81 | { |
|
- | 82 | const struct drm_connector_funcs *f = tmpc->funcs; |
|
- | 83 | if(tmpc == connector) |
|
- | 84 | continue; |
|
- | 85 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
|
65 | drm_modeset_lock_all(dev); |
86 | }; |
66 | 87 | ||
67 | list_for_each_entry(tmpmode, &connector->modes, head) |
88 | list_for_each_entry(tmpmode, &connector->modes, head) |
68 | { |
89 | { |
69 | if( (tmpmode->hdisplay == reqmode->width) && |
90 | if( (tmpmode->hdisplay == reqmode->width) && |
Line 93... | Line 114... | ||
93 | return -1; |
114 | return -1; |
Line 94... | Line 115... | ||
94 | 115 | ||
Line -... | Line 116... | ||
- | 116 | do_set: |
|
95 | do_set: |
117 | |
Line -... | Line 118... | ||
- | 118 | ||
- | 119 | con_name = connector->name; |
|
- | 120 | ||
- | 121 | char con_edid[128]; |
|
- | 122 | ||
- | 123 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
|
- | 124 | DRM_DEBUG_KMS("Manufacturer: %s Model %x Serial Number %u\n", |
|
- | 125 | manufacturer_name(con_edid + 0x08), |
|
- | 126 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
|
96 | 127 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
|
97 | con_name = connector->name; |
128 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
98 | 129 | ||
Line 99... | Line 130... | ||
99 | DRM_DEBUG_KMS("set mode %d %d: crtc %d connector %s\n", |
130 | DRM_DEBUG_KMS("set mode %d %d: crtc %d connector %s\n", |
Line 178... | Line 209... | ||
178 | 209 | ||
Line 179... | Line 210... | ||
179 | return ret; |
210 | return ret; |
180 | } |
211 | } |
Line 181... | Line 212... | ||
181 | 212 | ||
- | 213 | static int set_mode_ex(struct drm_device *dev, |
|
182 | static int count_connector_modes(struct drm_connector* connector) |
214 | struct drm_connector *connector, struct drm_display_mode *mode) |
- | 215 | { |
|
183 | { |
216 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | 217 | struct drm_connector *tmpc; |
|
- | 218 | struct drm_mode_config *config = &dev->mode_config; |
|
- | 219 | struct drm_framebuffer *fb = NULL; |
|
- | 220 | struct drm_mode_set set; |
|
184 | struct drm_display_mode *mode; |
221 | char con_edid[128]; |
- | 222 | int stride; |
|
Line -... | Line 223... | ||
- | 223 | int ret; |
|
- | 224 | ||
- | 225 | ENTER(); |
|
- | 226 | ||
185 | int count = 0; |
227 | drm_modeset_lock_all(dev); |
186 | 228 | ||
- | 229 | list_for_each_entry(tmpc, &dev->mode_config.connector_list, head) |
|
- | 230 | { |
|
187 | list_for_each_entry(mode, &connector->modes, head) |
231 | const struct drm_connector_funcs *f = tmpc->funcs; |
- | 232 | if(tmpc == connector) |
|
188 | { |
233 | continue; |
- | 234 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
|
- | 235 | }; |
|
- | 236 | ||
- | 237 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
|
- | 238 | ||
- | 239 | fb = connector->encoder->crtc->primary->fb; |
|
- | 240 | if(fb == NULL) |
|
- | 241 | fb = main_framebuffer; |
|
- | 242 | ||
- | 243 | fb->width = mode->hdisplay; |
|
- | 244 | fb->height = mode->vdisplay;; |
|
- | 245 | ||
- | 246 | main_fb_obj->tiling_mode = I915_TILING_X; |
|
- | 247 | ||
- | 248 | if( main_fb_obj->tiling_mode == I915_TILING_X) |
|
- | 249 | { |
|
- | 250 | if(IS_GEN3(dev)) |
|
- | 251 | for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1); |
|
- | 252 | else |
|
- | 253 | stride = ALIGN(mode->hdisplay * 4, 512); |
|
- | 254 | } |
|
- | 255 | else |
|
- | 256 | { |
|
- | 257 | stride = ALIGN(mode->hdisplay * 4, 64); |
|
- | 258 | } |
|
- | 259 | ||
- | 260 | fb->pitches[0] = |
|
- | 261 | fb->pitches[1] = |
|
- | 262 | fb->pitches[2] = |
|
- | 263 | fb->pitches[3] = stride; |
|
- | 264 | ||
- | 265 | main_fb_obj->stride = stride; |
|
- | 266 | ||
- | 267 | fb->bits_per_pixel = 32; |
|
- | 268 | fb->depth = 24; |
|
- | 269 | ||
- | 270 | connector->encoder->crtc->enabled = true; |
|
- | 271 | ||
- | 272 | i915_gem_object_put_fence(main_fb_obj); |
|
- | 273 | ||
- | 274 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
|
- | 275 | DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n" |
|
- | 276 | "monitor: %s model %x serial number %u\n", |
|
- | 277 | fb->width, fb->height, |
|
- | 278 | connector->encoder->crtc->base.id, connector->name, |
|
- | 279 | manufacturer_name(con_edid + 0x08), |
|
- | 280 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
|
- | 281 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
|
- | 282 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
|
- | 283 | ||
- | 284 | DRM_DEBUG_KMS("use framebuffer %p %dx%d pitch %d format %x\n", |
|
- | 285 | fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format); |
|
- | 286 | ||
- | 287 | set.crtc = connector->encoder->crtc; |
|
- | 288 | set.x = 0; |
|
- | 289 | set.y = 0; |
|
- | 290 | set.mode = mode; |
|
- | 291 | set.connectors = &connector; |
|
- | 292 | set.num_connectors = 1; |
|
- | 293 | set.fb = fb; |
|
- | 294 | ||
- | 295 | ret = drm_mode_set_config_internal(&set); |
|
- | 296 | if ( !ret ) |
|
- | 297 | { |
|
- | 298 | struct drm_crtc *crtc = os_display->crtc; |
|
- | 299 | ||
- | 300 | os_display->width = fb->width; |
|
- | 301 | os_display->height = fb->height; |
|
- | 302 | os_display->vrefresh = drm_mode_vrefresh(mode); |
|
- | 303 | ||
- | 304 | sysSetScreen(fb->width, fb->height, fb->pitches[0]); |
|
- | 305 | ||
- | 306 | os_display->connector = connector; |
|
- | 307 | os_display->crtc = connector->encoder->crtc; |
|
- | 308 | os_display->supported_modes = count_connector_modes(connector); |
|
- | 309 | ||
- | 310 | crtc->cursor_x = os_display->width/2; |
|
- | 311 | crtc->cursor_y = os_display->height/2; |
|
- | 312 | ||
- | 313 | select_cursor_kms(os_display->cursor); |
|
- | 314 | ||
- | 315 | DRM_DEBUG_KMS("new mode %d x %d pitch %d\n", |
|
- | 316 | fb->width, fb->height, fb->pitches[0]); |
|
- | 317 | } |
|
- | 318 | else |
|
- | 319 | DRM_ERROR(" failed to set mode %d_%d on crtc %p\n", |
|
- | 320 | fb->width, fb->height, connector->encoder->crtc); |
|
- | 321 | ||
- | 322 | drm_modeset_unlock_all(dev); |
|
- | 323 | ||
189 | count++; |
324 | LEAVE(); |
- | 325 | ||
- | 326 | return ret; |
|
- | 327 | } |
|
- | 328 | ||
- | 329 | static int set_cmdline_mode(struct drm_device *dev, struct drm_connector *connector) |
|
- | 330 | { |
|
- | 331 | struct drm_display_mode *mode; |
|
- | 332 | int retval; |
|
- | 333 | ||
- | 334 | mode = drm_mode_create_from_cmdline_mode(dev, &connector->cmdline_mode); |
|
- | 335 | if(mode == NULL) |
|
- | 336 | return EINVAL; |
|
- | 337 | ||
- | 338 | retval = set_mode_ex(dev, connector, mode); |
|
- | 339 | ||
190 | }; |
340 | drm_mode_destroy(dev, mode); |
Line 191... | Line 341... | ||
191 | return count; |
341 | return retval; |
192 | }; |
342 | }; |
193 | 343 | ||
Line 208... | Line 358... | ||
208 | }; |
358 | }; |
209 | return NULL; |
359 | return NULL; |
210 | }; |
360 | }; |
211 | 361 | ||
Line 212... | Line 362... | ||
212 | static int choose_config(struct drm_device *dev, struct drm_connector **boot_connector, |
362 | static int check_connector(struct drm_device *dev, struct drm_connector *connector) |
213 | struct drm_crtc **boot_crtc) |
- | |
214 | { |
363 | { |
215 | struct drm_connector_helper_funcs *connector_funcs; |
364 | const struct drm_connector_helper_funcs *connector_funcs; |
216 | struct drm_connector *connector; |
- | |
217 | struct drm_encoder *encoder; |
365 | struct drm_encoder *encoder; |
218 | struct drm_crtc *crtc; |
366 | struct drm_crtc *crtc; |
Line 219... | Line -... | ||
219 | - | ||
220 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
- | |
221 | { |
367 | |
222 | if( connector->status != connector_status_connected) |
368 | if( connector->status != connector_status_connected) |
Line 223... | Line 369... | ||
223 | continue; |
369 | return -EINVAL; |
Line 224... | Line 370... | ||
224 | 370 | ||
225 | encoder = connector->encoder; |
371 | encoder = connector->encoder; |
Line 232... | Line 378... | ||
232 | if( encoder == NULL) |
378 | if( encoder == NULL) |
233 | { |
379 | { |
234 | DRM_DEBUG_KMS("CONNECTOR %s ID: %d no active encoders\n", |
380 | DRM_DEBUG_KMS("CONNECTOR %s ID: %d no active encoders\n", |
235 | connector->name, connector->base.id); |
381 | connector->name, connector->base.id); |
236 | continue; |
382 | return -EINVAL; |
237 | }; |
383 | }; |
238 | } |
384 | } |
Line 239... | Line 385... | ||
239 | 385 | ||
240 | crtc = encoder->crtc; |
386 | crtc = encoder->crtc; |
241 | if(crtc == NULL) |
387 | if(crtc == NULL) |
Line 242... | Line 388... | ||
242 | crtc = get_possible_crtc(dev, encoder); |
388 | crtc = get_possible_crtc(dev, encoder); |
243 | 389 | ||
244 | if(crtc != NULL) |
390 | if(crtc != NULL) |
245 | { |
391 | { |
- | 392 | encoder->crtc = crtc; |
|
- | 393 | return 0; |
|
- | 394 | } |
|
- | 395 | else |
|
- | 396 | DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id); |
|
Line 246... | Line -... | ||
246 | *boot_connector = connector; |
- | |
247 | *boot_crtc = crtc; |
397 | return -EINVAL; |
248 | - | ||
- | 398 | } |
|
249 | DRM_DEBUG_KMS("CONNECTOR %s ID:%d status:%d ENCODER %p ID: %d CRTC %p ID:%d\n", |
399 | |
Line -... | Line 400... | ||
- | 400 | static struct drm_connector* get_cmdline_connector(struct drm_device *dev, const char *cmdline) |
|
- | 401 | { |
|
250 | connector->name, connector->base.id, connector->status, |
402 | struct drm_connector *connector; |
- | 403 | ||
- | 404 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
|
- | 405 | { |
|
- | 406 | int name_len = __builtin_strlen(connector->name); |
|
251 | encoder, encoder->base.id, crtc, crtc->base.id ); |
407 | |
- | 408 | if (name_len == 0) |
|
- | 409 | continue; |
|
252 | char con_edid[128]; |
410 | |
- | 411 | if (__builtin_strncmp(connector->name, cmdline, name_len)) |
|
- | 412 | continue; |
|
- | 413 | ||
- | 414 | if(check_connector(dev, connector) == 0) |
|
- | 415 | return connector; |
|
- | 416 | } |
|
253 | 417 | return NULL; |
|
254 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
418 | } |
- | 419 | ||
255 | printf("Manufacturer: %s Model %x Serial Number %u\n", |
420 | |
- | 421 | static int choose_config(struct drm_device *dev, struct drm_connector **boot_connector, |
|
- | 422 | struct drm_crtc **boot_crtc) |
|
- | 423 | { |
|
Line -... | Line 424... | ||
- | 424 | const struct drm_connector_helper_funcs *connector_funcs; |
|
- | 425 | struct drm_connector *connector = NULL; |
|
- | 426 | struct drm_encoder *encoder = NULL; |
|
- | 427 | struct drm_crtc *crtc = NULL; |
|
- | 428 | ||
- | 429 | if((i915.cmdline_mode != NULL) && (*i915.cmdline_mode != 0)) |
|
- | 430 | { |
|
256 | manufacturer_name(con_edid + 0x08), |
431 | connector = get_cmdline_connector(dev, i915.cmdline_mode); |
257 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
432 | if(connector != NULL) |
258 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
433 | { |
259 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
- | |
Line -... | Line 434... | ||
- | 434 | *boot_connector = connector; |
|
- | 435 | *boot_crtc = connector->encoder->crtc; |
|
- | 436 | return 0; |
|
- | 437 | } |
|
- | 438 | } |
|
- | 439 | ||
- | 440 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
|
- | 441 | { |
|
260 | 442 | if(check_connector(dev, connector) == 0) |
|
Line 261... | Line 443... | ||
261 | return 0; |
443 | { |
262 | } |
444 | *boot_connector = connector; |
Line 273... | Line 455... | ||
273 | struct drm_display_mode *mode; |
455 | struct drm_display_mode *mode; |
274 | 456 | ||
Line 275... | Line 457... | ||
275 | list_for_each_entry(mode, &connector->modes, head) |
457 | list_for_each_entry(mode, &connector->modes, head) |
276 | { |
458 | { |
277 | DRM_DEBUG_KMS("check mode w:%d h:%d %dHz\n", |
- | |
278 | mode->hdisplay, mode->vdisplay, |
- | |
279 | drm_mode_vrefresh(mode)); |
- | |
280 | - | ||
281 | if( os_display->width == mode->hdisplay && |
459 | if( os_display->width == mode->hdisplay && |
282 | os_display->height == mode->vdisplay && |
460 | os_display->height == mode->vdisplay && |
283 | drm_mode_vrefresh(mode) == 60) |
461 | drm_mode_vrefresh(mode) == 60) |
284 | { |
462 | { |
285 | usermode->width = os_display->width; |
463 | usermode->width = os_display->width; |
Line 303... | Line 481... | ||
303 | int ret; |
481 | int ret; |
304 | 482 | ||
Line 305... | Line 483... | ||
305 | ENTER(); |
483 | ENTER(); |
Line 306... | Line -... | ||
306 | - | ||
307 | mutex_lock(&dev->struct_mutex); |
484 | |
308 | mutex_lock(&dev->mode_config.mutex); |
- | |
309 | 485 | mutex_lock(&dev->mode_config.mutex); |
|
310 | ret = choose_config(dev, &connector, &crtc); |
486 | ret = choose_config(dev, &connector, &crtc); |
311 | if(ret) |
487 | if(ret) |
312 | { |
- | |
313 | DRM_DEBUG_KMS("No active connectors!\n"); |
488 | { |
- | 489 | mutex_unlock(&dev->mode_config.mutex); |
|
314 | mutex_unlock(&dev->mode_config.mutex); |
490 | DRM_DEBUG_KMS("No active connectors!\n"); |
315 | return -1; |
491 | return -1; |
Line 316... | Line 492... | ||
316 | }; |
492 | }; |
317 | 493 | ||
Line 332... | Line 508... | ||
332 | os_display = GetDisplay(); |
508 | os_display = GetDisplay(); |
333 | os_display->ddev = dev; |
509 | os_display->ddev = dev; |
334 | os_display->connector = connector; |
510 | os_display->connector = connector; |
335 | os_display->crtc = crtc; |
511 | os_display->crtc = crtc; |
336 | - | ||
337 | os_display->supported_modes = count_connector_modes(connector); |
512 | os_display->supported_modes = count_connector_modes(connector); |
- | 513 | mutex_unlock(&dev->mode_config.mutex); |
|
- | 514 | ||
- | 515 | mutex_init(&cursor_lock); |
|
- | 516 | mutex_lock(&dev->struct_mutex); |
|
Line 338... | Line 517... | ||
338 | 517 | ||
339 | ifl = safe_cli(); |
518 | ifl = safe_cli(); |
340 | { |
519 | { |
341 | list_for_each_entry(cursor, &os_display->cursors, list) |
520 | list_for_each_entry(cursor, &os_display->cursors, list) |
Line 357... | Line 536... | ||
357 | select_cursor_kms(os_display->cursor); |
536 | select_cursor_kms(os_display->cursor); |
358 | }; |
537 | }; |
359 | safe_sti(ifl); |
538 | safe_sti(ifl); |
Line -... | Line 539... | ||
- | 539 | ||
- | 540 | mutex_unlock(&dev->struct_mutex); |
|
- | 541 | ||
- | 542 | ret = -1; |
|
- | 543 | ||
- | 544 | if(connector->cmdline_mode.specified == true) |
|
- | 545 | ret = set_cmdline_mode(dev, connector); |
|
- | 546 | ||
- | 547 | if(ret !=0) |
|
- | 548 | { |
|
- | 549 | mutex_lock(&dev->mode_config.mutex); |
|
360 | 550 | ||
361 | if( (usermode->width == 0) || |
551 | if( (usermode->width == 0) || |
362 | (usermode->height == 0)) |
552 | (usermode->height == 0)) |
363 | { |
553 | { |
364 | if( !get_boot_mode(connector, usermode)) |
554 | if( !get_boot_mode(connector, usermode)) |
Line 370... | Line 560... | ||
370 | usermode->height = mode->vdisplay; |
560 | usermode->height = mode->vdisplay; |
371 | usermode->freq = drm_mode_vrefresh(mode); |
561 | usermode->freq = drm_mode_vrefresh(mode); |
372 | }; |
562 | }; |
373 | }; |
563 | }; |
374 | 564 | mutex_unlock(&dev->mode_config.mutex); |
|
375 | mutex_unlock(&dev->mode_config.mutex); |
- | |
376 | mutex_unlock(&dev->struct_mutex); |
565 | |
377 | - | ||
Line 378... | Line 566... | ||
378 | set_mode(dev, os_display->connector, os_display->crtc, usermode, false); |
566 | set_mode(dev, os_display->connector, os_display->crtc, usermode, false); |
- | 567 | }; |
|
Line 379... | Line 568... | ||
379 | 568 | ||
380 | #ifdef __HWA__ |
569 | #ifdef __HWA__ |
381 | err = init_bitmaps(); |
570 | err = init_bitmaps(); |
Line 382... | Line 571... | ||
382 | #endif |
571 | #endif |
Line 383... | Line 572... | ||
383 | 572 | ||
384 | LEAVE(); |
573 | LEAVE(); |
Line -... | Line 574... | ||
- | 574 | ||
- | 575 | return ret; |
|
- | 576 | }; |
|
- | 577 | ||
- | 578 | ||
- | 579 | int set_cmdline_mode_ext(struct drm_device *dev, const char *cmdline) |
|
- | 580 | { |
|
- | 581 | struct drm_connector_helper_funcs *connector_funcs; |
|
- | 582 | struct drm_connector *connector; |
|
- | 583 | struct drm_cmdline_mode cmd_mode; |
|
- | 584 | struct drm_display_mode *mode; |
|
- | 585 | char *mode_option; |
|
- | 586 | int retval = 0; |
|
- | 587 | char con_edid[128]; |
|
- | 588 | ||
- | 589 | ENTER(); |
|
- | 590 | if((cmdline == NULL) || (*cmdline == 0)) |
|
- | 591 | return EINVAL; |
|
- | 592 | ||
- | 593 | mutex_lock(&dev->mode_config.mutex); |
|
- | 594 | connector = get_cmdline_connector(dev, cmdline); |
|
- | 595 | mutex_unlock(&dev->mode_config.mutex); |
|
- | 596 | ||
- | 597 | if(connector == NULL) |
|
- | 598 | return EINVAL; |
|
- | 599 | ||
- | 600 | mode_option = __builtin_strchr(cmdline,':'); |
|
- | 601 | if(mode_option == NULL) |
|
- | 602 | return EINVAL; |
|
- | 603 | ||
- | 604 | mode_option++; |
|
- | 605 | ||
- | 606 | __builtin_memset(&cmd_mode, 0, sizeof(cmd_mode)); |
|
- | 607 | ||
- | 608 | if( !drm_mode_parse_command_line_for_connector(mode_option, connector, &cmd_mode)) |
|
- | 609 | return EINVAL; |
|
- | 610 | ||
- | 611 | DRM_DEBUG_KMS("cmdline mode for connector %s %dx%d@%dHz%s%s%s\n", |
|
- | 612 | connector->name, |
|
- | 613 | cmd_mode.xres, cmd_mode.yres, |
|
- | 614 | cmd_mode.refresh_specified ? cmd_mode.refresh : 60, |
|
- | 615 | cmd_mode.rb ? " reduced blanking" : "", |
|
- | 616 | cmd_mode.margins ? " with margins" : "", |
|
- | 617 | cmd_mode.interlace ? " interlaced" : ""); |
|
- | 618 | ||
- | 619 | mode = drm_mode_create_from_cmdline_mode(dev, &cmd_mode); |
|
- | 620 | if(mode == NULL) |
|
- | 621 | return EINVAL; |
|
- | 622 | ||
- | 623 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
|
- | 624 | DRM_DEBUG_KMS("connector: %s monitor: %s model %x serial number %u\n", |
|
- | 625 | connector->name, |
|
- | 626 | manufacturer_name(con_edid + 0x08), |
|
- | 627 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
|
- | 628 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
|
- | 629 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
|
- | 630 | ||
- | 631 | retval = set_mode_ex(dev, connector, mode); |
|
- | 632 | ||
- | 633 | drm_mode_destroy(dev, mode); |
|
385 | 634 | ||
386 | return 0; |
635 | LEAVE(); |
387 | }; |
636 | return retval; |
Line 388... | Line 637... | ||
388 | 637 | } |
|
Line 569... | Line 818... | ||
569 | 818 | ||
Line 570... | Line 819... | ||
570 | cursor_t *old; |
819 | cursor_t *old; |
Line 571... | Line 820... | ||
571 | 820 | ||
572 | old = os_display->cursor; |
- | |
Line -... | Line 821... | ||
- | 821 | old = os_display->cursor; |
|
- | 822 | ||
573 | os_display->cursor = cursor; |
823 | mutex_lock(&cursor_lock); |
Line 574... | Line 824... | ||
574 | 824 | ||
575 | // intel_crtc->cursor_bo = cursor->cobj; |
825 | os_display->cursor = cursor; |
576 | 826 | ||
577 | if (!dev_priv->info.cursor_needs_physical) |
827 | if (!dev_priv->info.cursor_needs_physical) |
Line 578... | Line 828... | ||
578 | intel_crtc->cursor_addr = i915_gem_obj_ggtt_offset(cursor->cobj); |
828 | intel_crtc->cursor_addr = i915_gem_obj_ggtt_offset(cursor->cobj); |
579 | else |
829 | else |
580 | intel_crtc->cursor_addr = (addr_t)cursor->cobj; |
830 | intel_crtc->cursor_addr = (addr_t)cursor->cobj; |
- | 831 | ||
Line 581... | Line 832... | ||
581 | 832 | intel_crtc->base.cursor->state->crtc_w = 64; |
|
582 | intel_crtc->base.cursor->state->crtc_w = 64; |
833 | intel_crtc->base.cursor->state->crtc_h = 64; |
583 | intel_crtc->base.cursor->state->crtc_h = 64; |
834 | intel_crtc->base.cursor->state->rotation = 0; |