Rev 4293 | Rev 4389 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4293 | Rev 4371 | ||
---|---|---|---|
Line 106... | Line 106... | ||
106 | struct drm_crtc *crtc; |
106 | struct drm_crtc *crtc; |
107 | struct drm_encoder *encoder; |
107 | struct drm_encoder *encoder; |
108 | struct drm_i915_gem_object *fb_obj; |
108 | struct drm_i915_gem_object *fb_obj; |
109 | struct drm_mode_set set; |
109 | struct drm_mode_set set; |
110 | char *con_name; |
110 | const char *con_name; |
111 | char *enc_name; |
111 | const char *enc_name; |
112 | unsigned hdisplay, vdisplay; |
112 | unsigned hdisplay, vdisplay; |
113 | int ret; |
113 | int ret; |
114 | 114 | ||
Line 115... | Line 115... | ||
115 | mutex_lock(&dev->mode_config.mutex); |
115 | mutex_lock(&dev->mode_config.mutex); |
Line 261... | Line 261... | ||
261 | 261 | ||
Line 262... | Line 262... | ||
262 | return def_connector; |
262 | return def_connector; |
263 | }; |
263 | }; |
Line 264... | Line -... | ||
264 | - | ||
265 | 264 | ||
266 | int init_display_kms(struct drm_device *dev, videomode_t *usermode) |
265 | struct drm_connector *get_active_connector(struct drm_device *dev) |
267 | { |
266 | { |
268 | struct drm_connector *connector; |
267 | struct drm_connector *tmp = NULL; |
269 | struct drm_connector_helper_funcs *connector_funcs; |
268 | struct drm_connector_helper_funcs *connector_funcs; |
270 | struct drm_encoder *encoder; |
- | |
271 | struct drm_crtc *crtc = NULL; |
- | |
272 | struct drm_framebuffer *fb; |
- | |
273 | - | ||
274 | cursor_t *cursor; |
- | |
275 | u32_t ifl; |
- | |
Line 276... | Line -... | ||
276 | int err; |
- | |
277 | - | ||
278 | ENTER(); |
- | |
279 | - | ||
280 | mutex_lock(&dev->mode_config.mutex); |
269 | struct drm_encoder *encoder; |
281 | 270 | ||
282 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
271 | list_for_each_entry(tmp, &dev->mode_config.connector_list, head) |
283 | { |
272 | { |
Line 284... | Line 273... | ||
284 | if( connector->status != connector_status_connected) |
273 | if( tmp->status != connector_status_connected) |
285 | continue; |
274 | continue; |
286 | 275 | ||
287 | connector_funcs = connector->helper_private; |
276 | connector_funcs = tmp->helper_private; |
288 | encoder = connector_funcs->best_encoder(connector); |
277 | encoder = connector_funcs->best_encoder(tmp); |
289 | if( encoder == NULL) |
278 | if( encoder == NULL) |
290 | { |
279 | { |
291 | DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n", |
280 | DRM_DEBUG_KMS("CONNECTOR %x ID: %d no active encoders\n", |
- | 281 | tmp, tmp->base.id); |
|
292 | connector, connector->base.id); |
282 | continue; |
293 | continue; |
- | |
Line 294... | Line 283... | ||
294 | } |
283 | }; |
295 | connector->encoder = encoder; |
- | |
296 | crtc = encoder->crtc; |
284 | |
297 | 285 | tmp->encoder = encoder; |
|
298 | DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %x CRTC %p ID:%d\n", |
- | |
299 | connector, connector->base.id, |
- | |
Line 300... | Line -... | ||
300 | connector->status, connector->encoder, |
- | |
301 | crtc, crtc->base.id ); |
- | |
302 | break; |
- | |
303 | }; |
- | |
304 | 286 | ||
305 | if(connector == NULL) |
287 | DRM_DEBUG_KMS("CONNECTOR %p ID:%d status:%d ENCODER %x CRTC %p ID:%d\n", |
Line 306... | Line 288... | ||
306 | { |
288 | tmp, tmp->base.id, tmp->status, tmp->encoder, |
- | 289 | tmp->encoder->crtc, tmp->encoder->crtc->base.id ); |
|
Line 307... | Line 290... | ||
307 | DRM_DEBUG_KMS("No active connectors!\n"); |
290 | |
308 | mutex_unlock(&dev->mode_config.mutex); |
291 | return tmp; |
309 | return -1; |
292 | }; |
310 | }; |
293 | |
Line 311... | Line 294... | ||
311 | 294 | return NULL; |
|
312 | dbgprintf("CRTC %p\n", crtc); |
295 | } |
313 | - | ||
314 | if(crtc == NULL) |
296 | |
315 | { |
297 | struct drm_crtc *get_possible_crtc(struct drm_device *dev, struct drm_encoder *encoder) |
316 | struct drm_crtc *tmp_crtc; |
- | |
317 | int crtc_mask = 1; |
298 | { |
318 | 299 | struct drm_crtc *tmp_crtc; |
|
319 | list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) |
300 | int crtc_mask = 1; |
320 | { |
301 | |
321 | dbgprintf("tmp_crtc %p\n", tmp_crtc); |
302 | list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) |
322 | if (encoder->possible_crtcs & crtc_mask) |
303 | { |
- | 304 | if (encoder->possible_crtcs & crtc_mask) |
|
323 | { |
305 | { |
Line -... | Line 306... | ||
- | 306 | encoder->crtc = tmp_crtc; |
|
- | 307 | dbgprintf("CRTC %p\n", tmp_crtc); |
|
- | 308 | return tmp_crtc; |
|
- | 309 | }; |
|
- | 310 | crtc_mask <<= 1; |
|
- | 311 | }; |
|
- | 312 | return NULL; |
|
- | 313 | }; |
|
- | 314 | ||
- | 315 | int get_boot_mode(struct drm_connector *connector, videomode_t *usermode) |
|
- | 316 | { |
|
- | 317 | struct drm_display_mode *mode; |
|
- | 318 | ||
- | 319 | list_for_each_entry(mode, &connector->modes, head) |
|
- | 320 | { |
|
- | 321 | dbgprintf("check mode w:%d h:%d %dHz\n", |
|
- | 322 | drm_mode_width(mode), drm_mode_height(mode), |
|
- | 323 | drm_mode_vrefresh(mode)); |
|
- | 324 | ||
- | 325 | if( os_display->width == drm_mode_width(mode) && |
|
- | 326 | os_display->height == drm_mode_height(mode) && |
|
- | 327 | drm_mode_vrefresh(mode) == 60) |
|
- | 328 | { |
|
- | 329 | usermode->width = os_display->width; |
|
- | 330 | usermode->height = os_display->height; |
|
- | 331 | usermode->freq = 60; |
|
- | 332 | return 1; |
|
- | 333 | } |
|
- | 334 | } |
|
- | 335 | return 0; |
|
- | 336 | } |
|
- | 337 | ||
- | 338 | int init_display_kms(struct drm_device *dev, videomode_t *usermode) |
|
- | 339 | { |
|
- | 340 | struct drm_connector *connector; |
|
- | 341 | struct drm_connector_helper_funcs *connector_funcs; |
|
- | 342 | struct drm_encoder *encoder; |
|
- | 343 | struct drm_crtc *crtc; |
|
- | 344 | struct drm_framebuffer *fb; |
|
- | 345 | ||
- | 346 | cursor_t *cursor; |
|
- | 347 | u32_t ifl; |
|
- | 348 | int err; |
|
- | 349 | ||
- | 350 | ENTER(); |
|
- | 351 | ||
- | 352 | mutex_lock(&dev->mode_config.mutex); |
|
- | 353 | ||
- | 354 | connector = get_active_connector(dev) ; |
|
- | 355 | if(connector == NULL) |
|
- | 356 | { |
|
- | 357 | DRM_DEBUG_KMS("No active connectors!\n"); |
|
- | 358 | mutex_unlock(&dev->mode_config.mutex); |
|
324 | crtc = tmp_crtc; |
359 | return -1; |
Line 325... | Line 360... | ||
325 | encoder->crtc = crtc; |
360 | }; |
326 | dbgprintf("CRTC %p\n", crtc); |
361 | |
327 | break; |
362 | encoder = connector->encoder; |
Line 375... | Line 410... | ||
375 | 410 | ||
Line 376... | Line 411... | ||
376 | if( (usermode->width == 0) || |
411 | if( (usermode->width == 0) || |
377 | (usermode->height == 0)) |
412 | (usermode->height == 0)) |
378 | { |
413 | { |
379 | struct drm_display_mode *mode; |
- | |
380 | - | ||
381 | list_for_each_entry(mode, &connector->modes, head) |
414 | if( !get_boot_mode(connector, usermode)) |
382 | { |
415 | { |
383 | dbgprintf("check mode w:%d h:%d %dHz\n", |
- | |
384 | drm_mode_width(mode), drm_mode_height(mode), |
- | |
385 | drm_mode_vrefresh(mode)); |
- | |
386 | - | ||
387 | if( os_display->width == drm_mode_width(mode) && |
- | |
388 | os_display->height == drm_mode_height(mode) && |
- | |
389 | drm_mode_vrefresh(mode) == 60) |
416 | struct drm_display_mode *mode; |
390 | { |
- | |
391 | usermode->width = os_display->width; |
- | |
392 | usermode->height = os_display->height; |
- | |
393 | usermode->freq = 60; |
- | |
394 | break; |
- | |
395 | - | ||
396 | } |
- | |
397 | } |
- | |
Line 398... | Line -... | ||
398 | - | ||
399 | if( usermode->width == 0 || |
- | |
400 | usermode->height == 0) |
- | |
401 | { |
417 | |
402 | mode = list_entry(connector->modes.next, typeof(*mode), head); |
- | |
403 | 418 | mode = list_entry(connector->modes.next, typeof(*mode), head); |
|
404 | usermode->width = drm_mode_width(mode); |
419 | usermode->width = drm_mode_width(mode); |
405 | usermode->height = drm_mode_height(mode); |
420 | usermode->height = drm_mode_height(mode); |
406 | usermode->freq = drm_mode_vrefresh(mode); |
421 | usermode->freq = drm_mode_vrefresh(mode); |
407 | }; |
422 | }; |
Line 481... | Line 496... | ||
481 | }; |
496 | }; |
482 | 497 | ||
Line 483... | Line 498... | ||
483 | void i915_dpms(struct drm_device *dev, int mode) |
498 | void i915_dpms(struct drm_device *dev, int mode) |
484 | { |
499 | { |
485 | struct drm_connector_funcs *f = os_display->connector->funcs; |
500 | const struct drm_connector_funcs *f = os_display->connector->funcs; |
Line 486... | Line 501... | ||
486 | 501 | ||
487 | f->dpms(os_display->connector, mode); |
502 | f->dpms(os_display->connector, mode); |
Line 488... | Line 503... | ||
488 | }; |
503 | }; |
Line 682... | Line 697... | ||
682 | move_cursor_kms(cursor, intel_crtc->cursor_x, intel_crtc->cursor_y); |
697 | move_cursor_kms(cursor, intel_crtc->cursor_x, intel_crtc->cursor_y); |
683 | return old; |
698 | return old; |
684 | }; |
699 | }; |
Line 685... | Line 700... | ||
685 | 700 | ||
686 | struct sna_fb |
701 | int i915_fbinfo(struct drm_i915_fb_info *fb) |
687 | { |
- | |
688 | uint32_t width; |
- | |
689 | uint32_t height; |
- | |
690 | uint32_t pitch; |
702 | { |
691 | uint32_t tiling; |
- | |
Line 692... | Line 703... | ||
692 | }; |
703 | struct drm_i915_gem_object *obj = get_fb_obj(); |
693 | - | ||
694 | int i915_fbinfo(struct sna_fb *fb) |
704 | |
695 | { |
705 | fb->name = obj->base.name; |
696 | fb->width = os_display->width; |
706 | fb->width = os_display->width; |
697 | fb->height = os_display->height; |
707 | fb->height = os_display->height; |
Line 698... | Line 708... | ||
698 | fb->pitch = os_display->pitch; |
708 | fb->pitch = obj->stride; |
699 | fb->tiling = 0; |
709 | fb->tiling = obj->tiling_mode; |
- | 710 | ||
Line 700... | Line 711... | ||
700 | 711 | return 0; |
|
701 | return 0; |
712 | } |
702 | }; |
713 | |
703 | 714 | ||
704 | typedef struct |
715 | typedef struct |
705 | { |
716 | { |
706 | int left; |
717 | int left; |
Line 707... | Line -... | ||
707 | int top; |
- | |
708 | int right; |
- | |
709 | int bottom; |
- | |
710 | }rect_t; |
- | |
711 | - | ||
712 | struct drm_i915_mask { |
- | |
713 | __u32 handle; |
- | |
714 | __u32 width; |
- | |
Line 715... | Line 718... | ||
715 | __u32 height; |
718 | int top; |
Line 716... | Line 719... | ||
716 | __u32 bo_size; |
719 | int right; |
717 | __u32 bo_pitch; |
720 | int bottom; |
Line 738... | Line 741... | ||
738 | struct drm_gem_object *obj; |
741 | struct drm_gem_object *obj; |
739 | static unsigned int mask_seqno[256]; |
742 | static unsigned int mask_seqno[256]; |
740 | rect_t winrc; |
743 | rect_t winrc; |
741 | u32 slot; |
744 | u32 slot; |
742 | int ret; |
745 | int ret=0; |
743 | 746 | ||
Line 744... | Line 747... | ||
744 | if(mask->handle == -2) |
747 | if(mask->handle == -2) |
745 | { |
748 | { |
746 | printf("%s handle %d\n", __FUNCTION__, mask->handle); |
749 | printf("%s handle %d\n", __FUNCTION__, mask->handle); |
747 | return 0; |
750 | return 0; |
Line 786... | Line 789... | ||
786 | u32 ifl; |
789 | u32 ifl; |
787 | 790 | ||
Line 788... | Line 791... | ||
788 | ret = i915_mutex_lock_interruptible(dev); |
791 | ret = i915_mutex_lock_interruptible(dev); |
789 | if (ret) |
792 | if (ret) |
790 | return ret; |
793 | goto err1; |
Line 791... | Line 794... | ||
791 | 794 | ||
792 | ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true); |
795 | ret = i915_gem_object_set_to_cpu_domain(to_intel_bo(obj), true); |
793 | if(ret !=0 ) |
796 | if(ret !=0 ) |
794 | { |
797 | { |
795 | dbgprintf("%s fail\n", __FUNCTION__); |
798 | dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__); |
796 | return ret; |
799 | goto err2; |
Line 797... | Line 800... | ||
797 | }; |
800 | }; |
Line 798... | Line 801... | ||
798 | 801 | ||
Line 884... | Line 887... | ||
884 | } |
887 | } |
885 | }; |
888 | }; |
886 | }; |
889 | }; |
887 | safe_sti(ifl); |
890 | safe_sti(ifl); |
888 | } |
891 | |
889 | - | ||
Line 890... | Line 892... | ||
890 | drm_gem_object_unreference(obj); |
892 | ret = i915_gem_object_set_to_gtt_domain(to_intel_bo(obj), false); |
- | 893 | if(ret != 0 ) |
|
- | 894 | { |
|
- | 895 | dbgprintf("%s: i915_gem_object_set_to_gtt_domain failed\n", __FUNCTION__); |
|
- | 896 | }; |
|
- | 897 | } |
|
Line -... | Line 898... | ||
- | 898 | ||
891 | 899 | err2: |
|
- | 900 | mutex_unlock(&dev->struct_mutex); |
|
- | 901 | err1: |
|
Line 892... | Line 902... | ||
892 | mutex_unlock(&dev->struct_mutex); |
902 | drm_gem_object_unreference(obj); |
893 | 903 |