Lines Matching refs:fb_helper

231 __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,  in __drm_fb_helper_restore_fbdev_mode_unlocked()  argument
237 if (!drm_fbdev_emulation || !fb_helper) in __drm_fb_helper_restore_fbdev_mode_unlocked()
240 if (READ_ONCE(fb_helper->deferred_setup)) in __drm_fb_helper_restore_fbdev_mode_unlocked()
243 mutex_lock(&fb_helper->lock); in __drm_fb_helper_restore_fbdev_mode_unlocked()
250 ret = drm_client_modeset_commit_locked(&fb_helper->client); in __drm_fb_helper_restore_fbdev_mode_unlocked()
252 ret = drm_client_modeset_commit(&fb_helper->client); in __drm_fb_helper_restore_fbdev_mode_unlocked()
255 do_delayed = fb_helper->delayed_hotplug; in __drm_fb_helper_restore_fbdev_mode_unlocked()
257 fb_helper->delayed_hotplug = false; in __drm_fb_helper_restore_fbdev_mode_unlocked()
258 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_restore_fbdev_mode_unlocked()
261 drm_fb_helper_hotplug_event(fb_helper); in __drm_fb_helper_restore_fbdev_mode_unlocked()
277 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) in drm_fb_helper_restore_fbdev_mode_unlocked() argument
279 return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, false); in drm_fb_helper_restore_fbdev_mode_unlocked()
321 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_dpms() local
323 mutex_lock(&fb_helper->lock); in drm_fb_helper_dpms()
324 drm_client_modeset_dpms(&fb_helper->client, dpms_mode); in drm_fb_helper_dpms()
325 mutex_unlock(&fb_helper->lock); in drm_fb_helper_dpms()
374 static void drm_fb_helper_damage_blit_real(struct drm_fb_helper *fb_helper, in drm_fb_helper_damage_blit_real() argument
378 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_damage_blit_real()
381 void *src = fb_helper->fbdev->screen_buffer + offset; in drm_fb_helper_damage_blit_real()
394 static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper, in drm_fb_helper_damage_blit() argument
397 struct drm_client_buffer *buffer = fb_helper->buffer; in drm_fb_helper_damage_blit()
412 mutex_lock(&fb_helper->lock); in drm_fb_helper_damage_blit()
419 drm_fb_helper_damage_blit_real(fb_helper, clip, &dst); in drm_fb_helper_damage_blit()
424 mutex_unlock(&fb_helper->lock); in drm_fb_helper_damage_blit()
515 struct drm_fb_helper *fb_helper) in drm_fb_helper_init() argument
520 dev->fb_helper = fb_helper; in drm_fb_helper_init()
528 if (!fb_helper->client.funcs) { in drm_fb_helper_init()
529 ret = drm_client_init(dev, &fb_helper->client, "drm_fb_helper", NULL); in drm_fb_helper_init()
534 dev->fb_helper = fb_helper; in drm_fb_helper_init()
553 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_alloc_fbi() argument
555 struct device *dev = fb_helper->dev->dev; in drm_fb_helper_alloc_fbi()
581 fb_helper->fbdev = info; in drm_fb_helper_alloc_fbi()
602 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unregister_fbi() argument
604 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unregister_fbi()
605 unregister_framebuffer(fb_helper->fbdev); in drm_fb_helper_unregister_fbi()
615 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) in drm_fb_helper_fini() argument
619 if (!fb_helper) in drm_fb_helper_fini()
622 fb_helper->dev->fb_helper = NULL; in drm_fb_helper_fini()
627 cancel_work_sync(&fb_helper->resume_work); in drm_fb_helper_fini()
628 cancel_work_sync(&fb_helper->damage_work); in drm_fb_helper_fini()
630 info = fb_helper->fbdev; in drm_fb_helper_fini()
636 fb_helper->fbdev = NULL; in drm_fb_helper_fini()
639 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
640 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
646 mutex_destroy(&fb_helper->lock); in drm_fb_helper_fini()
648 if (!fb_helper->client.funcs) in drm_fb_helper_fini()
649 drm_client_release(&fb_helper->client); in drm_fb_helper_fini()
653 static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper) in drm_fbdev_use_shadow_fb() argument
655 struct drm_device *dev = fb_helper->dev; in drm_fbdev_use_shadow_fb()
656 struct drm_framebuffer *fb = fb_helper->fb; in drm_fbdev_use_shadow_fb()
853 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend) in drm_fb_helper_set_suspend() argument
855 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_set_suspend()
856 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend()
876 void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, in drm_fb_helper_set_suspend_unlocked() argument
879 if (!fb_helper || !fb_helper->fbdev) in drm_fb_helper_set_suspend_unlocked()
883 flush_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
886 if (fb_helper->fbdev->state != FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
892 if (fb_helper->fbdev->state == FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
896 schedule_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
901 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend_unlocked()
940 struct drm_fb_helper *fb_helper = info->par; in setcmap_legacy() local
946 drm_modeset_lock_all(fb_helper->dev); in setcmap_legacy()
947 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_legacy()
973 drm_modeset_unlock_all(fb_helper->dev); in setcmap_legacy()
1023 struct drm_fb_helper *fb_helper = info->par; in setcmap_atomic() local
1024 struct drm_device *dev = fb_helper->dev; in setcmap_atomic()
1045 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1079 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1116 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap() local
1117 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_setcmap()
1123 mutex_lock(&fb_helper->lock); in drm_fb_helper_setcmap()
1130 mutex_lock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1133 else if (drm_drv_uses_atomic_modeset(fb_helper->dev)) in drm_fb_helper_setcmap()
1137 mutex_unlock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1141 mutex_unlock(&fb_helper->lock); in drm_fb_helper_setcmap()
1159 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_ioctl() local
1160 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_ioctl()
1164 mutex_lock(&fb_helper->lock); in drm_fb_helper_ioctl()
1188 crtc = fb_helper->client.modesets[0].crtc; in drm_fb_helper_ioctl()
1209 mutex_unlock(&fb_helper->lock); in drm_fb_helper_ioctl()
1299 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var() local
1300 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
1301 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_check_var()
1372 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par() local
1380 drm_err(fb_helper->dev, "PIXEL CLOCK SET\n"); in drm_fb_helper_set_par()
1402 __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force); in drm_fb_helper_set_par()
1408 static void pan_set(struct drm_fb_helper *fb_helper, int x, int y) in pan_set() argument
1412 mutex_lock(&fb_helper->client.modeset_mutex); in pan_set()
1413 drm_client_for_each_modeset(mode_set, &fb_helper->client) { in pan_set()
1417 mutex_unlock(&fb_helper->client.modeset_mutex); in pan_set()
1423 struct drm_fb_helper *fb_helper = info->par; in pan_display_atomic() local
1426 pan_set(fb_helper, var->xoffset, var->yoffset); in pan_display_atomic()
1428 ret = drm_client_modeset_commit_locked(&fb_helper->client); in pan_display_atomic()
1433 pan_set(fb_helper, info->var.xoffset, info->var.yoffset); in pan_display_atomic()
1441 struct drm_fb_helper *fb_helper = info->par; in pan_display_legacy() local
1442 struct drm_client_dev *client = &fb_helper->client; in pan_display_legacy()
1447 drm_modeset_lock_all(fb_helper->dev); in pan_display_legacy()
1460 drm_modeset_unlock_all(fb_helper->dev); in pan_display_legacy()
1474 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display() local
1475 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
1481 mutex_lock(&fb_helper->lock); in drm_fb_helper_pan_display()
1494 mutex_unlock(&fb_helper->lock); in drm_fb_helper_pan_display()
1504 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_single_fb_probe() argument
1507 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_single_fb_probe()
1508 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_single_fb_probe()
1531 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_fb_helper_single_fb_probe()
1659 if (!fb_helper->deferred_setup) in drm_fb_helper_single_fb_probe()
1674 ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
1678 strcpy(fb_helper->fb->comm, "[fbcon]"); in drm_fb_helper_single_fb_probe()
1700 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_var() argument
1703 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
1707 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
1736 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_info() argument
1739 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_info()
1742 drm_fb_helper_fill_var(info, fb_helper, in drm_fb_helper_fill_info()
1745 info->par = fb_helper; in drm_fb_helper_fill_info()
1753 fb_helper->dev->driver->name); in drm_fb_helper_fill_info()
1765 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper) in drm_setup_crtcs_fb() argument
1767 struct drm_client_dev *client = &fb_helper->client; in drm_setup_crtcs_fb()
1769 struct fb_info *info = fb_helper->fbdev; in drm_setup_crtcs_fb()
1779 modeset->fb = fb_helper->fb; in drm_setup_crtcs_fb()
1789 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_setup_crtcs_fb()
1826 __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper, in __drm_fb_helper_initial_config_and_unlock() argument
1829 struct drm_device *dev = fb_helper->dev; in __drm_fb_helper_initial_config_and_unlock()
1837 drm_client_modeset_probe(&fb_helper->client, width, height); in __drm_fb_helper_initial_config_and_unlock()
1838 ret = drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in __drm_fb_helper_initial_config_and_unlock()
1841 fb_helper->preferred_bpp = bpp_sel; in __drm_fb_helper_initial_config_and_unlock()
1842 fb_helper->deferred_setup = true; in __drm_fb_helper_initial_config_and_unlock()
1845 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1849 drm_setup_crtcs_fb(fb_helper); in __drm_fb_helper_initial_config_and_unlock()
1851 fb_helper->deferred_setup = false; in __drm_fb_helper_initial_config_and_unlock()
1853 info = fb_helper->fbdev; in __drm_fb_helper_initial_config_and_unlock()
1865 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1878 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in __drm_fb_helper_initial_config_and_unlock()
1925 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
1932 mutex_lock(&fb_helper->lock); in drm_fb_helper_initial_config()
1933 ret = __drm_fb_helper_initial_config_and_unlock(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
1960 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
1964 if (!drm_fbdev_emulation || !fb_helper) in drm_fb_helper_hotplug_event()
1967 mutex_lock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1968 if (fb_helper->deferred_setup) { in drm_fb_helper_hotplug_event()
1969 err = __drm_fb_helper_initial_config_and_unlock(fb_helper, in drm_fb_helper_hotplug_event()
1970 fb_helper->preferred_bpp); in drm_fb_helper_hotplug_event()
1974 if (!fb_helper->fb || !drm_master_internal_acquire(fb_helper->dev)) { in drm_fb_helper_hotplug_event()
1975 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
1976 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1980 drm_master_internal_release(fb_helper->dev); in drm_fb_helper_hotplug_event()
1982 drm_dbg_kms(fb_helper->dev, "\n"); in drm_fb_helper_hotplug_event()
1984 drm_client_modeset_probe(&fb_helper->client, fb_helper->fb->width, fb_helper->fb->height); in drm_fb_helper_hotplug_event()
1985 drm_setup_crtcs_fb(fb_helper); in drm_fb_helper_hotplug_event()
1986 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1988 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()
2003 drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper); in drm_fb_helper_lastclose()
2018 drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fb_helper_output_poll_changed()
2025 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_open() local
2028 if (user && !try_module_get(fb_helper->dev->driver->fops->owner)) in drm_fbdev_fb_open()
2036 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_release() local
2039 module_put(fb_helper->dev->driver->fops->owner); in drm_fbdev_fb_release()
2044 static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper) in drm_fbdev_cleanup() argument
2046 struct fb_info *fbi = fb_helper->fbdev; in drm_fbdev_cleanup()
2049 if (!fb_helper->dev) in drm_fbdev_cleanup()
2055 if (drm_fbdev_use_shadow_fb(fb_helper)) in drm_fbdev_cleanup()
2059 drm_fb_helper_fini(fb_helper); in drm_fbdev_cleanup()
2063 else if (fb_helper->buffer) in drm_fbdev_cleanup()
2064 drm_client_buffer_vunmap(fb_helper->buffer); in drm_fbdev_cleanup()
2066 drm_client_framebuffer_delete(fb_helper->buffer); in drm_fbdev_cleanup()
2069 static void drm_fbdev_release(struct drm_fb_helper *fb_helper) in drm_fbdev_release() argument
2071 drm_fbdev_cleanup(fb_helper); in drm_fbdev_release()
2072 drm_client_release(&fb_helper->client); in drm_fbdev_release()
2073 kfree(fb_helper); in drm_fbdev_release()
2087 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_mmap() local
2089 if (fb_helper->dev->driver->gem_prime_mmap) in drm_fbdev_fb_mmap()
2090 return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma); in drm_fbdev_fb_mmap()
2097 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_use_iomem() local
2098 struct drm_client_buffer *buffer = fb_helper->buffer; in drm_fbdev_use_iomem()
2100 return !drm_fbdev_use_shadow_fb(fb_helper) && buffer->map.is_iomem; in drm_fbdev_use_iomem()
2316 static int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_generic_probe() argument
2319 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_generic_probe()
2320 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_generic_probe()
2338 fb_helper->buffer = buffer; in drm_fb_helper_generic_probe()
2339 fb_helper->fb = buffer->fb; in drm_fb_helper_generic_probe()
2342 fbi = drm_fb_helper_alloc_fbi(fb_helper); in drm_fb_helper_generic_probe()
2350 drm_fb_helper_fill_info(fbi, fb_helper, sizes); in drm_fb_helper_generic_probe()
2352 if (drm_fbdev_use_shadow_fb(fb_helper)) { in drm_fb_helper_generic_probe()
2362 ret = drm_client_buffer_vmap(fb_helper->buffer, &map); in drm_fb_helper_generic_probe()
2392 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_unregister() local
2394 if (fb_helper->fbdev) in drm_fbdev_client_unregister()
2396 drm_fb_helper_unregister_fbi(fb_helper); in drm_fbdev_client_unregister()
2398 drm_fbdev_release(fb_helper); in drm_fbdev_client_unregister()
2410 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_hotplug() local
2415 if (!fb_helper->dev && fb_helper->funcs) in drm_fbdev_client_hotplug()
2418 if (dev->fb_helper) in drm_fbdev_client_hotplug()
2419 return drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fbdev_client_hotplug()
2426 drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs); in drm_fbdev_client_hotplug()
2428 ret = drm_fb_helper_init(dev, fb_helper); in drm_fbdev_client_hotplug()
2435 ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp); in drm_fbdev_client_hotplug()
2442 drm_fbdev_cleanup(fb_helper); in drm_fbdev_client_hotplug()
2444 fb_helper->dev = NULL; in drm_fbdev_client_hotplug()
2445 fb_helper->fbdev = NULL; in drm_fbdev_client_hotplug()
2489 struct drm_fb_helper *fb_helper; in drm_fbdev_generic_setup() local
2493 drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); in drm_fbdev_generic_setup()
2498 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); in drm_fbdev_generic_setup()
2499 if (!fb_helper) { in drm_fbdev_generic_setup()
2504 ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs); in drm_fbdev_generic_setup()
2506 kfree(fb_helper); in drm_fbdev_generic_setup()
2520 fb_helper->preferred_bpp = preferred_bpp; in drm_fbdev_generic_setup()
2522 ret = drm_fbdev_client_hotplug(&fb_helper->client); in drm_fbdev_generic_setup()
2526 drm_client_register(&fb_helper->client); in drm_fbdev_generic_setup()