Lines Matching +full:simple +full:- +full:framebuffer
2 * Copyright (c) 2006-2009 Red Hat Inc.
3 * Copyright (c) 2006-2008 Intel Corporation
6 * DRM framebuffer helper functions
46 /* simple single crtc case helper function */
49 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_single_add_all_connectors()
53 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { in drm_fb_helper_single_add_all_connectors()
60 fb_helper_connector->connector = connector; in drm_fb_helper_single_add_all_connectors()
61 fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector; in drm_fb_helper_single_add_all_connectors()
65 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_add_all_connectors()
66 kfree(fb_helper->connector_info[i]); in drm_fb_helper_single_add_all_connectors()
67 fb_helper->connector_info[i] = NULL; in drm_fb_helper_single_add_all_connectors()
69 fb_helper->connector_count = 0; in drm_fb_helper_single_add_all_connectors()
70 return -ENOMEM; in drm_fb_helper_single_add_all_connectors()
79 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_parse_command_line()
84 fb_helper_conn = fb_helper->connector_info[i]; in drm_fb_helper_parse_command_line()
85 connector = fb_helper_conn->connector; in drm_fb_helper_parse_command_line()
86 mode = &fb_helper_conn->cmdline_mode; in drm_fb_helper_parse_command_line()
88 /* do something on return - turn off connector maybe */ in drm_fb_helper_parse_command_line()
95 if (mode->force) { in drm_fb_helper_parse_command_line()
97 switch (mode->force) { in drm_fb_helper_parse_command_line()
99 case DRM_FORCE_ON_DIGITAL: s = "ON - dig"; break; in drm_fb_helper_parse_command_line()
106 connector->force = mode->force; in drm_fb_helper_parse_command_line()
111 mode->xres, mode->yres, in drm_fb_helper_parse_command_line()
112 mode->refresh_specified ? mode->refresh : 60, in drm_fb_helper_parse_command_line()
113 mode->rb ? " reduced blanking" : "", in drm_fb_helper_parse_command_line()
114 mode->margins ? " with margins" : "", in drm_fb_helper_parse_command_line()
115 mode->interlace ? " interlaced" : ""); in drm_fb_helper_parse_command_line()
127 r_base = crtc->gamma_store; in drm_fb_helper_save_lut_atomic()
128 g_base = r_base + crtc->gamma_size; in drm_fb_helper_save_lut_atomic()
129 b_base = g_base + crtc->gamma_size; in drm_fb_helper_save_lut_atomic()
131 for (i = 0; i < crtc->gamma_size; i++) in drm_fb_helper_save_lut_atomic()
132 helper->funcs->gamma_get(crtc, &r_base[i], &g_base[i], &b_base[i], i); in drm_fb_helper_save_lut_atomic()
139 r_base = crtc->gamma_store; in drm_fb_helper_restore_lut_atomic()
140 g_base = r_base + crtc->gamma_size; in drm_fb_helper_restore_lut_atomic()
141 b_base = g_base + crtc->gamma_size; in drm_fb_helper_restore_lut_atomic()
143 crtc->funcs->gamma_set(crtc, r_base, g_base, b_base, 0, crtc->gamma_size); in drm_fb_helper_restore_lut_atomic()
148 struct drm_fb_helper *helper = info->par; in drm_fb_helper_debug_enter()
156 for (i = 0; i < helper->crtc_count; i++) { in drm_fb_helper_debug_enter()
158 &helper->crtc_info[i].mode_set; in drm_fb_helper_debug_enter()
160 if (!mode_set->crtc->enabled) in drm_fb_helper_debug_enter()
163 funcs = mode_set->crtc->helper_private; in drm_fb_helper_debug_enter()
164 drm_fb_helper_save_lut_atomic(mode_set->crtc, helper); in drm_fb_helper_debug_enter()
165 funcs->mode_set_base_atomic(mode_set->crtc, in drm_fb_helper_debug_enter()
166 mode_set->fb, in drm_fb_helper_debug_enter()
167 mode_set->x, in drm_fb_helper_debug_enter()
168 mode_set->y, in drm_fb_helper_debug_enter()
180 struct drm_device *dev = crtc->dev; in drm_mode_config_fb()
183 list_for_each_entry(c, &dev->mode_config.crtc_list, head) { in drm_mode_config_fb()
184 if (crtc->base.id == c->base.id) in drm_mode_config_fb()
185 return c->fb; in drm_mode_config_fb()
193 struct drm_fb_helper *helper = info->par; in drm_fb_helper_debug_leave()
199 for (i = 0; i < helper->crtc_count; i++) { in drm_fb_helper_debug_leave()
200 struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; in drm_fb_helper_debug_leave()
201 crtc = mode_set->crtc; in drm_fb_helper_debug_leave()
202 funcs = crtc->helper_private; in drm_fb_helper_debug_leave()
205 if (!crtc->enabled) in drm_fb_helper_debug_leave()
213 drm_fb_helper_restore_lut_atomic(mode_set->crtc); in drm_fb_helper_debug_leave()
214 funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x, in drm_fb_helper_debug_leave()
215 crtc->y, LEAVE_ATOMIC_MODE_SET); in drm_fb_helper_debug_leave()
226 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_restore_fbdev_mode()
227 struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_restore_fbdev_mode()
245 if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF) in drm_fb_helper_force_kernel_mode()
275 * drm_fb_helper_restore - restore the framebuffer console (kernel) config
302 .help_msg = "force-fb(V)",
303 .action_msg = "Restore framebuffer console",
311 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_on()
312 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_on()
323 mutex_lock(&dev->mode_config.mutex); in drm_fb_helper_on()
324 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_on()
325 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_on()
326 crtc_funcs = crtc->helper_private; in drm_fb_helper_on()
328 if (!crtc->enabled) in drm_fb_helper_on()
331 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); in drm_fb_helper_on()
334 for (j = 0; j < fb_helper->connector_count; j++) { in drm_fb_helper_on()
335 connector = fb_helper->connector_info[j]->connector; in drm_fb_helper_on()
336 connector->dpms = DRM_MODE_DPMS_ON; in drm_fb_helper_on()
338 dev->mode_config.dpms_property, in drm_fb_helper_on()
342 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in drm_fb_helper_on()
343 if (encoder->crtc == crtc) { in drm_fb_helper_on()
346 encoder_funcs = encoder->helper_private; in drm_fb_helper_on()
347 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON); in drm_fb_helper_on()
351 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_on()
356 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_off()
357 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_off()
368 mutex_lock(&dev->mode_config.mutex); in drm_fb_helper_off()
369 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_off()
370 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_off()
371 crtc_funcs = crtc->helper_private; in drm_fb_helper_off()
373 if (!crtc->enabled) in drm_fb_helper_off()
377 for (j = 0; j < fb_helper->connector_count; j++) { in drm_fb_helper_off()
378 connector = fb_helper->connector_info[j]->connector; in drm_fb_helper_off()
379 connector->dpms = dpms_mode; in drm_fb_helper_off()
381 dev->mode_config.dpms_property, in drm_fb_helper_off()
385 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in drm_fb_helper_off()
386 if (encoder->crtc == crtc) { in drm_fb_helper_off()
389 encoder_funcs = encoder->helper_private; in drm_fb_helper_off()
390 encoder_funcs->dpms(encoder, dpms_mode); in drm_fb_helper_off()
393 crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); in drm_fb_helper_off()
395 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_off()
430 for (i = 0; i < helper->connector_count; i++) in drm_fb_helper_crtc_free()
431 kfree(helper->connector_info[i]); in drm_fb_helper_crtc_free()
432 kfree(helper->connector_info); in drm_fb_helper_crtc_free()
433 for (i = 0; i < helper->crtc_count; i++) in drm_fb_helper_crtc_free()
434 kfree(helper->crtc_info[i].mode_set.connectors); in drm_fb_helper_crtc_free()
435 kfree(helper->crtc_info); in drm_fb_helper_crtc_free()
446 fb_helper->dev = dev; in drm_fb_helper_init()
448 INIT_LIST_HEAD(&fb_helper->kernel_fb_list); in drm_fb_helper_init()
450 fb_helper->crtc_info = kcalloc(crtc_count, sizeof(struct drm_fb_helper_crtc), GFP_KERNEL); in drm_fb_helper_init()
451 if (!fb_helper->crtc_info) in drm_fb_helper_init()
452 return -ENOMEM; in drm_fb_helper_init()
454 fb_helper->crtc_count = crtc_count; in drm_fb_helper_init()
455 …fb_helper->connector_info = kcalloc(dev->mode_config.num_connector, sizeof(struct drm_fb_helper_co… in drm_fb_helper_init()
456 if (!fb_helper->connector_info) { in drm_fb_helper_init()
457 kfree(fb_helper->crtc_info); in drm_fb_helper_init()
458 return -ENOMEM; in drm_fb_helper_init()
460 fb_helper->connector_count = 0; in drm_fb_helper_init()
463 fb_helper->crtc_info[i].mode_set.connectors = in drm_fb_helper_init()
468 if (!fb_helper->crtc_info[i].mode_set.connectors) { in drm_fb_helper_init()
469 ret = -ENOMEM; in drm_fb_helper_init()
472 fb_helper->crtc_info[i].mode_set.num_connectors = 0; in drm_fb_helper_init()
476 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { in drm_fb_helper_init()
477 fb_helper->crtc_info[i].crtc_id = crtc->base.id; in drm_fb_helper_init()
478 fb_helper->crtc_info[i].mode_set.crtc = crtc; in drm_fb_helper_init()
481 fb_helper->conn_limit = max_conn_count; in drm_fb_helper_init()
485 return -ENOMEM; in drm_fb_helper_init()
491 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
492 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
509 struct drm_fb_helper *fb_helper = info->par; in setcolreg()
510 struct drm_framebuffer *fb = fb_helper->fb; in setcolreg()
513 if (info->fix.visual == FB_VISUAL_TRUECOLOR) { in setcolreg()
518 return -EINVAL; in setcolreg()
519 palette = (u32 *)info->pseudo_palette; in setcolreg()
520 red >>= (16 - info->var.red.length); in setcolreg()
521 green >>= (16 - info->var.green.length); in setcolreg()
522 blue >>= (16 - info->var.blue.length); in setcolreg()
523 value = (red << info->var.red.offset) | in setcolreg()
524 (green << info->var.green.offset) | in setcolreg()
525 (blue << info->var.blue.offset); in setcolreg()
526 if (info->var.transp.length > 0) { in setcolreg()
527 u32 mask = (1 << info->var.transp.length) - 1; in setcolreg()
528 mask <<= info->var.transp.offset; in setcolreg()
537 if (fb->bits_per_pixel == 16) { in setcolreg()
540 if (fb->depth == 16 && regno > 63) in setcolreg()
541 return -EINVAL; in setcolreg()
542 if (fb->depth == 15 && regno > 31) in setcolreg()
543 return -EINVAL; in setcolreg()
545 if (fb->depth == 16) { in setcolreg()
550 fb_helper->funcs->gamma_set(crtc, red, in setcolreg()
554 fb_helper->funcs->gamma_get(crtc, &r, in setcolreg()
559 fb_helper->funcs->gamma_set(crtc, r, in setcolreg()
565 if (fb->depth != 16) in setcolreg()
566 fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); in setcolreg()
572 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap()
579 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_setcmap()
580 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_setcmap()
581 crtc_funcs = crtc->helper_private; in drm_fb_helper_setcmap()
583 red = cmap->red; in drm_fb_helper_setcmap()
584 green = cmap->green; in drm_fb_helper_setcmap()
585 blue = cmap->blue; in drm_fb_helper_setcmap()
586 transp = cmap->transp; in drm_fb_helper_setcmap()
587 start = cmap->start; in drm_fb_helper_setcmap()
589 for (j = 0; j < cmap->len; j++) { in drm_fb_helper_setcmap()
603 crtc_funcs->load_lut(crtc); in drm_fb_helper_setcmap()
612 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var()
613 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
616 if (var->pixclock != 0 || in_dbg_master()) in drm_fb_helper_check_var()
617 return -EINVAL; in drm_fb_helper_check_var()
620 if (var->bits_per_pixel > fb->bits_per_pixel || var->xres > fb->width || var->yres > fb->height) { in drm_fb_helper_check_var()
622 "object %dx%d-%d > %dx%d-%d\n", var->xres, var->yres, var->bits_per_pixel, in drm_fb_helper_check_var()
623 fb->width, fb->height, fb->bits_per_pixel); in drm_fb_helper_check_var()
624 return -EINVAL; in drm_fb_helper_check_var()
627 switch (var->bits_per_pixel) { in drm_fb_helper_check_var()
629 depth = (var->green.length == 6) ? 16 : 15; in drm_fb_helper_check_var()
632 depth = (var->transp.length > 0) ? 32 : 24; in drm_fb_helper_check_var()
635 depth = var->bits_per_pixel; in drm_fb_helper_check_var()
641 var->red.offset = 0; in drm_fb_helper_check_var()
642 var->green.offset = 0; in drm_fb_helper_check_var()
643 var->blue.offset = 0; in drm_fb_helper_check_var()
644 var->red.length = 8; in drm_fb_helper_check_var()
645 var->green.length = 8; in drm_fb_helper_check_var()
646 var->blue.length = 8; in drm_fb_helper_check_var()
647 var->transp.length = 0; in drm_fb_helper_check_var()
648 var->transp.offset = 0; in drm_fb_helper_check_var()
651 var->red.offset = 10; in drm_fb_helper_check_var()
652 var->green.offset = 5; in drm_fb_helper_check_var()
653 var->blue.offset = 0; in drm_fb_helper_check_var()
654 var->red.length = 5; in drm_fb_helper_check_var()
655 var->green.length = 5; in drm_fb_helper_check_var()
656 var->blue.length = 5; in drm_fb_helper_check_var()
657 var->transp.length = 1; in drm_fb_helper_check_var()
658 var->transp.offset = 15; in drm_fb_helper_check_var()
661 var->red.offset = 11; in drm_fb_helper_check_var()
662 var->green.offset = 5; in drm_fb_helper_check_var()
663 var->blue.offset = 0; in drm_fb_helper_check_var()
664 var->red.length = 5; in drm_fb_helper_check_var()
665 var->green.length = 6; in drm_fb_helper_check_var()
666 var->blue.length = 5; in drm_fb_helper_check_var()
667 var->transp.length = 0; in drm_fb_helper_check_var()
668 var->transp.offset = 0; in drm_fb_helper_check_var()
671 var->red.offset = 16; in drm_fb_helper_check_var()
672 var->green.offset = 8; in drm_fb_helper_check_var()
673 var->blue.offset = 0; in drm_fb_helper_check_var()
674 var->red.length = 8; in drm_fb_helper_check_var()
675 var->green.length = 8; in drm_fb_helper_check_var()
676 var->blue.length = 8; in drm_fb_helper_check_var()
677 var->transp.length = 0; in drm_fb_helper_check_var()
678 var->transp.offset = 0; in drm_fb_helper_check_var()
681 var->red.offset = 16; in drm_fb_helper_check_var()
682 var->green.offset = 8; in drm_fb_helper_check_var()
683 var->blue.offset = 0; in drm_fb_helper_check_var()
684 var->red.length = 8; in drm_fb_helper_check_var()
685 var->green.length = 8; in drm_fb_helper_check_var()
686 var->blue.length = 8; in drm_fb_helper_check_var()
687 var->transp.length = 8; in drm_fb_helper_check_var()
688 var->transp.offset = 24; in drm_fb_helper_check_var()
691 return -EINVAL; in drm_fb_helper_check_var()
700 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par()
701 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_set_par()
702 struct fb_var_screeninfo *var = &info->var; in drm_fb_helper_set_par()
707 if (var->pixclock != 0) { in drm_fb_helper_set_par()
709 return -EINVAL; in drm_fb_helper_set_par()
712 mutex_lock(&dev->mode_config.mutex); in drm_fb_helper_set_par()
713 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_set_par()
714 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_set_par()
715 ret = crtc->funcs->set_config(&fb_helper->crtc_info[i].mode_set); in drm_fb_helper_set_par()
717 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_set_par()
721 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_set_par()
723 if (fb_helper->delayed_hotplug) { in drm_fb_helper_set_par()
724 fb_helper->delayed_hotplug = false; in drm_fb_helper_set_par()
734 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display()
735 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
741 mutex_lock(&dev->mode_config.mutex); in drm_fb_helper_pan_display()
742 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_pan_display()
743 crtc = fb_helper->crtc_info[i].mode_set.crtc; in drm_fb_helper_pan_display()
745 modeset = &fb_helper->crtc_info[i].mode_set; in drm_fb_helper_pan_display()
747 modeset->x = var->xoffset; in drm_fb_helper_pan_display()
748 modeset->y = var->yoffset; in drm_fb_helper_pan_display()
750 if (modeset->num_connectors) { in drm_fb_helper_pan_display()
751 ret = crtc->funcs->set_config(modeset); in drm_fb_helper_pan_display()
753 info->var.xoffset = var->xoffset; in drm_fb_helper_pan_display()
754 info->var.yoffset = var->yoffset; in drm_fb_helper_pan_display()
758 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_pan_display()
776 sizes.fb_width = (unsigned)-1; in drm_fb_helper_single_fb_probe()
777 sizes.fb_height = (unsigned)-1; in drm_fb_helper_single_fb_probe()
785 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_single_fb_probe()
786 struct drm_fb_helper_connector *fb_helper_conn = fb_helper->connector_info[i]; in drm_fb_helper_single_fb_probe()
789 cmdline_mode = &fb_helper_conn->cmdline_mode; in drm_fb_helper_single_fb_probe()
791 if (cmdline_mode->bpp_specified) { in drm_fb_helper_single_fb_probe()
792 switch (cmdline_mode->bpp) { in drm_fb_helper_single_fb_probe()
816 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_single_fb_probe()
818 desired_mode = fb_helper->crtc_info[i].desired_mode; in drm_fb_helper_single_fb_probe()
822 gamma_size = fb_helper->crtc_info[i].mode_set.crtc->gamma_size; in drm_fb_helper_single_fb_probe()
823 if (desired_mode->hdisplay < sizes.fb_width) in drm_fb_helper_single_fb_probe()
824 sizes.fb_width = desired_mode->hdisplay; in drm_fb_helper_single_fb_probe()
825 if (desired_mode->vdisplay < sizes.fb_height) in drm_fb_helper_single_fb_probe()
826 sizes.fb_height = desired_mode->vdisplay; in drm_fb_helper_single_fb_probe()
827 if (desired_mode->hdisplay > sizes.surface_width) in drm_fb_helper_single_fb_probe()
828 sizes.surface_width = desired_mode->hdisplay; in drm_fb_helper_single_fb_probe()
829 if (desired_mode->vdisplay > sizes.surface_height) in drm_fb_helper_single_fb_probe()
830 sizes.surface_height = desired_mode->vdisplay; in drm_fb_helper_single_fb_probe()
835 if (crtc_count == 0 || sizes.fb_width == -1 || sizes.fb_height == -1) { in drm_fb_helper_single_fb_probe()
836 /* hmm everyone went away - assume VGA cable just fell out in drm_fb_helper_single_fb_probe()
838 DRM_INFO("Cannot find any crtc or sizes - going 1024x768\n"); in drm_fb_helper_single_fb_probe()
844 new_fb = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
848 info = fb_helper->fbdev; in drm_fb_helper_single_fb_probe()
851 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_fb_helper_single_fb_probe()
852 fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; in drm_fb_helper_single_fb_probe()
856 info->var.pixclock = 0; in drm_fb_helper_single_fb_probe()
858 return -EINVAL; in drm_fb_helper_single_fb_probe()
861 printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node, in drm_fb_helper_single_fb_probe()
862 info->fix.id); in drm_fb_helper_single_fb_probe()
877 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in drm_fb_helper_single_fb_probe()
886 info->fix.type = FB_TYPE_PACKED_PIXELS; in drm_fb_helper_fill_fix()
887 info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : in drm_fb_helper_fill_fix()
889 info->fix.mmio_start = 0; in drm_fb_helper_fill_fix()
890 info->fix.mmio_len = 0; in drm_fb_helper_fill_fix()
891 info->fix.type_aux = 0; in drm_fb_helper_fill_fix()
892 info->fix.xpanstep = 1; /* doing it in hw */ in drm_fb_helper_fill_fix()
893 info->fix.ypanstep = 1; /* doing it in hw */ in drm_fb_helper_fill_fix()
894 info->fix.ywrapstep = 0; in drm_fb_helper_fill_fix()
895 info->fix.accel = FB_ACCEL_NONE; in drm_fb_helper_fill_fix()
896 info->fix.type_aux = 0; in drm_fb_helper_fill_fix()
898 info->fix.line_length = pitch; in drm_fb_helper_fill_fix()
906 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
907 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
908 info->var.xres_virtual = fb->width; in drm_fb_helper_fill_var()
909 info->var.yres_virtual = fb->height; in drm_fb_helper_fill_var()
910 info->var.bits_per_pixel = fb->bits_per_pixel; in drm_fb_helper_fill_var()
911 info->var.accel_flags = FB_ACCELF_TEXT; in drm_fb_helper_fill_var()
912 info->var.xoffset = 0; in drm_fb_helper_fill_var()
913 info->var.yoffset = 0; in drm_fb_helper_fill_var()
914 info->var.activate = FB_ACTIVATE_NOW; in drm_fb_helper_fill_var()
915 info->var.height = -1; in drm_fb_helper_fill_var()
916 info->var.width = -1; in drm_fb_helper_fill_var()
918 switch (fb->depth) { in drm_fb_helper_fill_var()
920 info->var.red.offset = 0; in drm_fb_helper_fill_var()
921 info->var.green.offset = 0; in drm_fb_helper_fill_var()
922 info->var.blue.offset = 0; in drm_fb_helper_fill_var()
923 info->var.red.length = 8; /* 8bit DAC */ in drm_fb_helper_fill_var()
924 info->var.green.length = 8; in drm_fb_helper_fill_var()
925 info->var.blue.length = 8; in drm_fb_helper_fill_var()
926 info->var.transp.offset = 0; in drm_fb_helper_fill_var()
927 info->var.transp.length = 0; in drm_fb_helper_fill_var()
930 info->var.red.offset = 10; in drm_fb_helper_fill_var()
931 info->var.green.offset = 5; in drm_fb_helper_fill_var()
932 info->var.blue.offset = 0; in drm_fb_helper_fill_var()
933 info->var.red.length = 5; in drm_fb_helper_fill_var()
934 info->var.green.length = 5; in drm_fb_helper_fill_var()
935 info->var.blue.length = 5; in drm_fb_helper_fill_var()
936 info->var.transp.offset = 15; in drm_fb_helper_fill_var()
937 info->var.transp.length = 1; in drm_fb_helper_fill_var()
940 info->var.red.offset = 11; in drm_fb_helper_fill_var()
941 info->var.green.offset = 5; in drm_fb_helper_fill_var()
942 info->var.blue.offset = 0; in drm_fb_helper_fill_var()
943 info->var.red.length = 5; in drm_fb_helper_fill_var()
944 info->var.green.length = 6; in drm_fb_helper_fill_var()
945 info->var.blue.length = 5; in drm_fb_helper_fill_var()
946 info->var.transp.offset = 0; in drm_fb_helper_fill_var()
949 info->var.red.offset = 16; in drm_fb_helper_fill_var()
950 info->var.green.offset = 8; in drm_fb_helper_fill_var()
951 info->var.blue.offset = 0; in drm_fb_helper_fill_var()
952 info->var.red.length = 8; in drm_fb_helper_fill_var()
953 info->var.green.length = 8; in drm_fb_helper_fill_var()
954 info->var.blue.length = 8; in drm_fb_helper_fill_var()
955 info->var.transp.offset = 0; in drm_fb_helper_fill_var()
956 info->var.transp.length = 0; in drm_fb_helper_fill_var()
959 info->var.red.offset = 16; in drm_fb_helper_fill_var()
960 info->var.green.offset = 8; in drm_fb_helper_fill_var()
961 info->var.blue.offset = 0; in drm_fb_helper_fill_var()
962 info->var.red.length = 8; in drm_fb_helper_fill_var()
963 info->var.green.length = 8; in drm_fb_helper_fill_var()
964 info->var.blue.length = 8; in drm_fb_helper_fill_var()
965 info->var.transp.offset = 24; in drm_fb_helper_fill_var()
966 info->var.transp.length = 8; in drm_fb_helper_fill_var()
972 info->var.xres = fb_width; in drm_fb_helper_fill_var()
973 info->var.yres = fb_height; in drm_fb_helper_fill_var()
985 for (i = 0; i < fb_helper->connector_count; i++) { in drm_fb_helper_probe_connector_modes()
986 connector = fb_helper->connector_info[i]->connector; in drm_fb_helper_probe_connector_modes()
987 count += connector->funcs->fill_modes(connector, maxX, maxY); in drm_fb_helper_probe_connector_modes()
997 list_for_each_entry(mode, &fb_connector->connector->modes, head) { in drm_has_preferred_mode()
1001 if (mode->type & DRM_MODE_TYPE_PREFERRED) in drm_has_preferred_mode()
1010 cmdline_mode = &fb_connector->cmdline_mode; in drm_has_cmdline_mode()
1011 return cmdline_mode->specified; in drm_has_cmdline_mode()
1020 cmdline_mode = &fb_helper_conn->cmdline_mode; in drm_pick_cmdline_mode()
1021 if (cmdline_mode->specified == false) in drm_pick_cmdline_mode()
1027 if (cmdline_mode->rb || cmdline_mode->margins) in drm_pick_cmdline_mode()
1030 list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { in drm_pick_cmdline_mode()
1032 if (mode->hdisplay != cmdline_mode->xres || in drm_pick_cmdline_mode()
1033 mode->vdisplay != cmdline_mode->yres) in drm_pick_cmdline_mode()
1036 if (cmdline_mode->refresh_specified) { in drm_pick_cmdline_mode()
1037 if (mode->vrefresh != cmdline_mode->refresh) in drm_pick_cmdline_mode()
1041 if (cmdline_mode->interlace) { in drm_pick_cmdline_mode()
1042 if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) in drm_pick_cmdline_mode()
1049 mode = drm_mode_create_from_cmdline_mode(fb_helper_conn->connector->dev, in drm_pick_cmdline_mode()
1051 list_add(&mode->head, &fb_helper_conn->connector->modes); in drm_pick_cmdline_mode()
1060 enable = connector->status == connector_status_connected; in drm_connector_enabled()
1062 enable = connector->status != connector_status_disconnected; in drm_connector_enabled()
1074 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1075 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1077 DRM_DEBUG_KMS("connector %d enabled? %s\n", connector->base.id, in drm_enable_connectors()
1085 for (i = 0; i < fb_helper->connector_count; i++) { in drm_enable_connectors()
1086 connector = fb_helper->connector_info[i]->connector; in drm_enable_connectors()
1101 if (fb_helper->crtc_count > 1) in drm_target_cloned()
1105 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1116 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1119 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1140 dmt_mode = drm_mode_find_dmt(fb_helper->dev, 1024, 768, 60); in drm_target_cloned()
1142 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_cloned()
1147 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_cloned()
1148 list_for_each_entry(mode, &fb_helper_conn->connector->modes, head) { in drm_target_cloned()
1171 for (i = 0; i < fb_helper->connector_count; i++) { in drm_target_preferred()
1172 fb_helper_conn = fb_helper->connector_info[i]; in drm_target_preferred()
1178 fb_helper_conn->connector->base.id); in drm_target_preferred()
1184 fb_helper_conn->connector->base.id); in drm_target_preferred()
1188 if (!modes[i] && !list_empty(&fb_helper_conn->connector->modes)) { in drm_target_preferred()
1189 list_for_each_entry(modes[i], &fb_helper_conn->connector->modes, head) in drm_target_preferred()
1192 DRM_DEBUG_KMS("found mode %s\n", modes[i] ? modes[i]->name : in drm_target_preferred()
1204 struct drm_device *dev = fb_helper->dev; in drm_pick_crtcs()
1213 if (n == fb_helper->connector_count) in drm_pick_crtcs()
1216 fb_helper_conn = fb_helper->connector_info[n]; in drm_pick_crtcs()
1217 connector = fb_helper_conn->connector; in drm_pick_crtcs()
1225 crtcs = kzalloc(dev->mode_config.num_connector * in drm_pick_crtcs()
1231 if (connector->status == connector_status_connected) in drm_pick_crtcs()
1238 connector_funcs = connector->helper_private; in drm_pick_crtcs()
1239 encoder = connector_funcs->best_encoder(connector); in drm_pick_crtcs()
1245 for (c = 0; c < fb_helper->crtc_count; c++) { in drm_pick_crtcs()
1246 crtc = &fb_helper->crtc_info[c]; in drm_pick_crtcs()
1248 if ((encoder->possible_crtcs & (1 << c)) == 0) { in drm_pick_crtcs()
1258 if (fb_helper->crtc_count > 1) in drm_pick_crtcs()
1273 dev->mode_config.num_connector * in drm_pick_crtcs()
1284 struct drm_device *dev = fb_helper->dev; in drm_setup_crtcs()
1295 width = dev->mode_config.max_width; in drm_setup_crtcs()
1296 height = dev->mode_config.max_height; in drm_setup_crtcs()
1299 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { in drm_setup_crtcs()
1300 encoder->crtc = NULL; in drm_setup_crtcs()
1303 crtcs = kcalloc(dev->mode_config.num_connector, in drm_setup_crtcs()
1305 modes = kcalloc(dev->mode_config.num_connector, in drm_setup_crtcs()
1307 enabled = kcalloc(dev->mode_config.num_connector, in drm_setup_crtcs()
1324 /* fill out the connector<->crtc mappings into the modesets */ in drm_setup_crtcs()
1325 for (i = 0; i < fb_helper->crtc_count; i++) { in drm_setup_crtcs()
1326 modeset = &fb_helper->crtc_info[i].mode_set; in drm_setup_crtcs()
1327 modeset->num_connectors = 0; in drm_setup_crtcs()
1330 for (i = 0; i < fb_helper->connector_count; i++) { in drm_setup_crtcs()
1333 modeset = &fb_crtc->mode_set; in drm_setup_crtcs()
1337 mode->name, fb_crtc->mode_set.crtc->base.id); in drm_setup_crtcs()
1338 fb_crtc->desired_mode = mode; in drm_setup_crtcs()
1339 if (modeset->mode) in drm_setup_crtcs()
1340 drm_mode_destroy(dev, modeset->mode); in drm_setup_crtcs()
1341 modeset->mode = drm_mode_duplicate(dev, in drm_setup_crtcs()
1342 fb_crtc->desired_mode); in drm_setup_crtcs()
1343 modeset->connectors[modeset->num_connectors++] = fb_helper->connector_info[i]->connector; in drm_setup_crtcs()
1353 * drm_helper_initial_config - setup a sane initial connector configuration
1361 * a new framebuffer object as the backing store.
1368 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_initial_config()
1372 drm_helper_disable_unused_functions(fb_helper->dev); in drm_fb_helper_initial_config()
1377 dev->mode_config.max_width, in drm_fb_helper_initial_config()
1378 dev->mode_config.max_height); in drm_fb_helper_initial_config()
1392 * drm_fb_helper_hotplug_event - respond to a hotplug notification by
1403 * 0 on success and a non-zero error code otherwise.
1407 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_hotplug_event()
1413 if (!fb_helper->fb) in drm_fb_helper_hotplug_event()
1416 mutex_lock(&dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
1417 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { in drm_fb_helper_hotplug_event()
1418 if (crtc->fb) in drm_fb_helper_hotplug_event()
1420 if (crtc->fb == fb_helper->fb) in drm_fb_helper_hotplug_event()
1425 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
1426 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_hotplug_event()
1431 max_width = fb_helper->fb->width; in drm_fb_helper_hotplug_event()
1432 max_height = fb_helper->fb->height; in drm_fb_helper_hotplug_event()
1433 bpp_sel = fb_helper->fb->bits_per_pixel; in drm_fb_helper_hotplug_event()
1438 mutex_unlock(&dev->mode_config.mutex); in drm_fb_helper_hotplug_event()