Lines Matching refs:fb_helper

238 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)  in drm_fb_helper_restore_fbdev_mode_unlocked()  argument
243 if (!drm_fbdev_emulation || !fb_helper) in drm_fb_helper_restore_fbdev_mode_unlocked()
246 if (READ_ONCE(fb_helper->deferred_setup)) in drm_fb_helper_restore_fbdev_mode_unlocked()
249 mutex_lock(&fb_helper->lock); in drm_fb_helper_restore_fbdev_mode_unlocked()
260 ret = drm_client_modeset_commit_force(&fb_helper->client); in drm_fb_helper_restore_fbdev_mode_unlocked()
262 do_delayed = fb_helper->delayed_hotplug; in drm_fb_helper_restore_fbdev_mode_unlocked()
264 fb_helper->delayed_hotplug = false; in drm_fb_helper_restore_fbdev_mode_unlocked()
265 mutex_unlock(&fb_helper->lock); in drm_fb_helper_restore_fbdev_mode_unlocked()
268 drm_fb_helper_hotplug_event(fb_helper); in drm_fb_helper_restore_fbdev_mode_unlocked()
328 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_dpms() local
330 mutex_lock(&fb_helper->lock); in drm_fb_helper_dpms()
331 drm_client_modeset_dpms(&fb_helper->client, dpms_mode); in drm_fb_helper_dpms()
332 mutex_unlock(&fb_helper->lock); in drm_fb_helper_dpms()
381 static void drm_fb_helper_dirty_blit_real(struct drm_fb_helper *fb_helper, in drm_fb_helper_dirty_blit_real() argument
384 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_dirty_blit_real()
387 void *src = fb_helper->fbdev->screen_buffer + offset; in drm_fb_helper_dirty_blit_real()
388 void *dst = fb_helper->buffer->vaddr + offset; in drm_fb_helper_dirty_blit_real()
473 struct drm_fb_helper *fb_helper, in drm_fb_helper_init() argument
479 dev->fb_helper = fb_helper; in drm_fb_helper_init()
487 if (!fb_helper->client.funcs) { in drm_fb_helper_init()
488 ret = drm_client_init(dev, &fb_helper->client, "drm_fb_helper", NULL); in drm_fb_helper_init()
493 dev->fb_helper = fb_helper; in drm_fb_helper_init()
512 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_alloc_fbi() argument
514 struct device *dev = fb_helper->dev->dev; in drm_fb_helper_alloc_fbi()
532 fb_helper->fbdev = info; in drm_fb_helper_alloc_fbi()
553 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unregister_fbi() argument
555 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unregister_fbi()
556 unregister_framebuffer(fb_helper->fbdev); in drm_fb_helper_unregister_fbi()
567 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) in drm_fb_helper_fini() argument
571 if (!fb_helper) in drm_fb_helper_fini()
574 fb_helper->dev->fb_helper = NULL; in drm_fb_helper_fini()
579 cancel_work_sync(&fb_helper->resume_work); in drm_fb_helper_fini()
580 cancel_work_sync(&fb_helper->dirty_work); in drm_fb_helper_fini()
582 info = fb_helper->fbdev; in drm_fb_helper_fini()
588 fb_helper->fbdev = NULL; in drm_fb_helper_fini()
591 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
592 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
598 mutex_destroy(&fb_helper->lock); in drm_fb_helper_fini()
600 if (!fb_helper->client.funcs) in drm_fb_helper_fini()
601 drm_client_release(&fb_helper->client); in drm_fb_helper_fini()
611 void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unlink_fbi() argument
613 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unlink_fbi()
614 unlink_framebuffer(fb_helper->fbdev); in drm_fb_helper_unlink_fbi()
618 static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper) in drm_fbdev_use_shadow_fb() argument
620 struct drm_device *dev = fb_helper->dev; in drm_fbdev_use_shadow_fb()
621 struct drm_framebuffer *fb = fb_helper->fb; in drm_fbdev_use_shadow_fb()
697 int drm_fb_helper_defio_init(struct drm_fb_helper *fb_helper) in drm_fb_helper_defio_init() argument
699 struct fb_info *info = fb_helper->fbdev; in drm_fb_helper_defio_init()
868 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend) in drm_fb_helper_set_suspend() argument
870 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_set_suspend()
871 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend()
891 void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, in drm_fb_helper_set_suspend_unlocked() argument
894 if (!fb_helper || !fb_helper->fbdev) in drm_fb_helper_set_suspend_unlocked()
898 flush_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
901 if (fb_helper->fbdev->state != FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
907 if (fb_helper->fbdev->state == FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
911 schedule_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
916 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend_unlocked()
955 struct drm_fb_helper *fb_helper = info->par; in setcmap_legacy() local
961 drm_modeset_lock_all(fb_helper->dev); in setcmap_legacy()
962 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_legacy()
983 drm_modeset_unlock_all(fb_helper->dev); in setcmap_legacy()
1033 struct drm_fb_helper *fb_helper = info->par; in setcmap_atomic() local
1034 struct drm_device *dev = fb_helper->dev; in setcmap_atomic()
1055 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1084 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1121 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap() local
1122 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_setcmap()
1128 mutex_lock(&fb_helper->lock); in drm_fb_helper_setcmap()
1135 mutex_lock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1138 else if (drm_drv_uses_atomic_modeset(fb_helper->dev)) in drm_fb_helper_setcmap()
1142 mutex_unlock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1146 mutex_unlock(&fb_helper->lock); in drm_fb_helper_setcmap()
1164 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_ioctl() local
1165 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_ioctl()
1169 mutex_lock(&fb_helper->lock); in drm_fb_helper_ioctl()
1193 crtc = fb_helper->client.modesets[0].crtc; in drm_fb_helper_ioctl()
1214 mutex_unlock(&fb_helper->lock); in drm_fb_helper_ioctl()
1304 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var() local
1305 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
1371 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par() local
1382 drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper); in drm_fb_helper_set_par()
1388 static void pan_set(struct drm_fb_helper *fb_helper, int x, int y) in pan_set() argument
1392 mutex_lock(&fb_helper->client.modeset_mutex); in pan_set()
1393 drm_client_for_each_modeset(mode_set, &fb_helper->client) { in pan_set()
1397 mutex_unlock(&fb_helper->client.modeset_mutex); in pan_set()
1403 struct drm_fb_helper *fb_helper = info->par; in pan_display_atomic() local
1406 pan_set(fb_helper, var->xoffset, var->yoffset); in pan_display_atomic()
1408 ret = drm_client_modeset_commit_force(&fb_helper->client); in pan_display_atomic()
1413 pan_set(fb_helper, info->var.xoffset, info->var.yoffset); in pan_display_atomic()
1421 struct drm_fb_helper *fb_helper = info->par; in pan_display_legacy() local
1422 struct drm_client_dev *client = &fb_helper->client; in pan_display_legacy()
1427 drm_modeset_lock_all(fb_helper->dev); in pan_display_legacy()
1440 drm_modeset_unlock_all(fb_helper->dev); in pan_display_legacy()
1454 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display() local
1455 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
1461 mutex_lock(&fb_helper->lock); in drm_fb_helper_pan_display()
1474 mutex_unlock(&fb_helper->lock); in drm_fb_helper_pan_display()
1484 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_single_fb_probe() argument
1487 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_single_fb_probe()
1509 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_fb_helper_single_fb_probe()
1635 if (!fb_helper->deferred_setup) in drm_fb_helper_single_fb_probe()
1645 ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
1649 strcpy(fb_helper->fb->comm, "[fbcon]"); in drm_fb_helper_single_fb_probe()
1671 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_var() argument
1674 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
1678 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
1707 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_info() argument
1710 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_info()
1713 drm_fb_helper_fill_var(info, fb_helper, in drm_fb_helper_fill_info()
1716 info->par = fb_helper; in drm_fb_helper_fill_info()
1718 fb_helper->dev->driver->name); in drm_fb_helper_fill_info()
1730 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper) in drm_setup_crtcs_fb() argument
1732 struct drm_client_dev *client = &fb_helper->client; in drm_setup_crtcs_fb()
1734 struct fb_info *info = fb_helper->fbdev; in drm_setup_crtcs_fb()
1744 modeset->fb = fb_helper->fb; in drm_setup_crtcs_fb()
1754 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_setup_crtcs_fb()
1791 __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper, in __drm_fb_helper_initial_config_and_unlock() argument
1794 struct drm_device *dev = fb_helper->dev; in __drm_fb_helper_initial_config_and_unlock()
1802 drm_client_modeset_probe(&fb_helper->client, width, height); in __drm_fb_helper_initial_config_and_unlock()
1803 ret = drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in __drm_fb_helper_initial_config_and_unlock()
1806 fb_helper->preferred_bpp = bpp_sel; in __drm_fb_helper_initial_config_and_unlock()
1807 fb_helper->deferred_setup = true; in __drm_fb_helper_initial_config_and_unlock()
1810 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1814 drm_setup_crtcs_fb(fb_helper); in __drm_fb_helper_initial_config_and_unlock()
1816 fb_helper->deferred_setup = false; in __drm_fb_helper_initial_config_and_unlock()
1818 info = fb_helper->fbdev; in __drm_fb_helper_initial_config_and_unlock()
1830 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1843 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in __drm_fb_helper_initial_config_and_unlock()
1890 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
1897 mutex_lock(&fb_helper->lock); in drm_fb_helper_initial_config()
1898 ret = __drm_fb_helper_initial_config_and_unlock(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
1925 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
1929 if (!drm_fbdev_emulation || !fb_helper) in drm_fb_helper_hotplug_event()
1932 mutex_lock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1933 if (fb_helper->deferred_setup) { in drm_fb_helper_hotplug_event()
1934 err = __drm_fb_helper_initial_config_and_unlock(fb_helper, in drm_fb_helper_hotplug_event()
1935 fb_helper->preferred_bpp); in drm_fb_helper_hotplug_event()
1939 if (!fb_helper->fb || !drm_master_internal_acquire(fb_helper->dev)) { in drm_fb_helper_hotplug_event()
1940 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
1941 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1945 drm_master_internal_release(fb_helper->dev); in drm_fb_helper_hotplug_event()
1949 drm_client_modeset_probe(&fb_helper->client, fb_helper->fb->width, fb_helper->fb->height); in drm_fb_helper_hotplug_event()
1950 drm_setup_crtcs_fb(fb_helper); in drm_fb_helper_hotplug_event()
1951 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1953 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()
1982 struct drm_fb_helper *fb_helper, in drm_fb_helper_fbdev_setup() argument
1994 drm_fb_helper_prepare(dev, fb_helper, funcs); in drm_fb_helper_fbdev_setup()
1996 ret = drm_fb_helper_init(dev, fb_helper, 0); in drm_fb_helper_fbdev_setup()
2005 ret = drm_fb_helper_initial_config(fb_helper, preferred_bpp); in drm_fb_helper_fbdev_setup()
2037 struct drm_fb_helper *fb_helper = dev->fb_helper; in drm_fb_helper_fbdev_teardown() local
2040 if (!fb_helper) in drm_fb_helper_fbdev_teardown()
2044 if (fb_helper->fbdev && fb_helper->fbdev->dev) in drm_fb_helper_fbdev_teardown()
2045 drm_fb_helper_unregister_fbi(fb_helper); in drm_fb_helper_fbdev_teardown()
2047 if (fb_helper->fbdev && fb_helper->fbdev->fbdefio) { in drm_fb_helper_fbdev_teardown()
2048 fb_deferred_io_cleanup(fb_helper->fbdev); in drm_fb_helper_fbdev_teardown()
2049 kfree(fb_helper->fbdev->fbdefio); in drm_fb_helper_fbdev_teardown()
2050 fbops = fb_helper->fbdev->fbops; in drm_fb_helper_fbdev_teardown()
2053 drm_fb_helper_fini(fb_helper); in drm_fb_helper_fbdev_teardown()
2056 if (fb_helper->fb) in drm_fb_helper_fbdev_teardown()
2057 drm_framebuffer_remove(fb_helper->fb); in drm_fb_helper_fbdev_teardown()
2070 drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper); in drm_fb_helper_lastclose()
2085 drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fb_helper_output_poll_changed()
2092 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_open() local
2095 if (user && !try_module_get(fb_helper->dev->driver->fops->owner)) in drm_fbdev_fb_open()
2103 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_release() local
2106 module_put(fb_helper->dev->driver->fops->owner); in drm_fbdev_fb_release()
2111 static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper) in drm_fbdev_cleanup() argument
2113 struct fb_info *fbi = fb_helper->fbdev; in drm_fbdev_cleanup()
2117 if (!fb_helper->dev) in drm_fbdev_cleanup()
2126 drm_fb_helper_fini(fb_helper); in drm_fbdev_cleanup()
2133 drm_client_framebuffer_delete(fb_helper->buffer); in drm_fbdev_cleanup()
2136 static void drm_fbdev_release(struct drm_fb_helper *fb_helper) in drm_fbdev_release() argument
2138 drm_fbdev_cleanup(fb_helper); in drm_fbdev_release()
2139 drm_client_release(&fb_helper->client); in drm_fbdev_release()
2140 kfree(fb_helper); in drm_fbdev_release()
2154 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_mmap() local
2156 if (fb_helper->dev->driver->gem_prime_mmap) in drm_fbdev_fb_mmap()
2157 return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma); in drm_fbdev_fb_mmap()
2194 int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_generic_probe() argument
2197 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_generic_probe()
2214 fb_helper->buffer = buffer; in drm_fb_helper_generic_probe()
2215 fb_helper->fb = buffer->fb; in drm_fb_helper_generic_probe()
2218 fbi = drm_fb_helper_alloc_fbi(fb_helper); in drm_fb_helper_generic_probe()
2226 drm_fb_helper_fill_info(fbi, fb_helper, sizes); in drm_fb_helper_generic_probe()
2228 if (drm_fbdev_use_shadow_fb(fb_helper)) { in drm_fb_helper_generic_probe()
2252 vaddr = drm_client_buffer_vmap(fb_helper->buffer); in drm_fb_helper_generic_probe()
2275 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_unregister() local
2277 if (fb_helper->fbdev) in drm_fbdev_client_unregister()
2279 drm_fb_helper_unregister_fbi(fb_helper); in drm_fbdev_client_unregister()
2281 drm_fbdev_release(fb_helper); in drm_fbdev_client_unregister()
2293 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_hotplug() local
2298 if (!fb_helper->dev && fb_helper->funcs) in drm_fbdev_client_hotplug()
2301 if (dev->fb_helper) in drm_fbdev_client_hotplug()
2302 return drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fbdev_client_hotplug()
2309 drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs); in drm_fbdev_client_hotplug()
2311 ret = drm_fb_helper_init(dev, fb_helper, 0); in drm_fbdev_client_hotplug()
2318 ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp); in drm_fbdev_client_hotplug()
2325 drm_fbdev_cleanup(fb_helper); in drm_fbdev_client_hotplug()
2327 fb_helper->dev = NULL; in drm_fbdev_client_hotplug()
2328 fb_helper->fbdev = NULL; in drm_fbdev_client_hotplug()
2370 struct drm_fb_helper *fb_helper; in drm_fbdev_generic_setup() local
2373 WARN(dev->fb_helper, "fb_helper is already set!\n"); in drm_fbdev_generic_setup()
2378 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); in drm_fbdev_generic_setup()
2379 if (!fb_helper) in drm_fbdev_generic_setup()
2382 ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs); in drm_fbdev_generic_setup()
2384 kfree(fb_helper); in drm_fbdev_generic_setup()
2393 fb_helper->preferred_bpp = preferred_bpp; in drm_fbdev_generic_setup()
2395 ret = drm_fbdev_client_hotplug(&fb_helper->client); in drm_fbdev_generic_setup()
2399 drm_client_register(&fb_helper->client); in drm_fbdev_generic_setup()