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()
1747 fb_helper->dev->driver->name); in drm_fb_helper_fill_info()
1759 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper) in drm_setup_crtcs_fb() argument
1761 struct drm_client_dev *client = &fb_helper->client; in drm_setup_crtcs_fb()
1763 struct fb_info *info = fb_helper->fbdev; in drm_setup_crtcs_fb()
1773 modeset->fb = fb_helper->fb; in drm_setup_crtcs_fb()
1783 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_setup_crtcs_fb()
1820 __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper, in __drm_fb_helper_initial_config_and_unlock() argument
1823 struct drm_device *dev = fb_helper->dev; in __drm_fb_helper_initial_config_and_unlock()
1831 drm_client_modeset_probe(&fb_helper->client, width, height); in __drm_fb_helper_initial_config_and_unlock()
1832 ret = drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in __drm_fb_helper_initial_config_and_unlock()
1835 fb_helper->preferred_bpp = bpp_sel; in __drm_fb_helper_initial_config_and_unlock()
1836 fb_helper->deferred_setup = true; in __drm_fb_helper_initial_config_and_unlock()
1839 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1843 drm_setup_crtcs_fb(fb_helper); in __drm_fb_helper_initial_config_and_unlock()
1845 fb_helper->deferred_setup = false; in __drm_fb_helper_initial_config_and_unlock()
1847 info = fb_helper->fbdev; in __drm_fb_helper_initial_config_and_unlock()
1859 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1872 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in __drm_fb_helper_initial_config_and_unlock()
1919 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
1926 mutex_lock(&fb_helper->lock); in drm_fb_helper_initial_config()
1927 ret = __drm_fb_helper_initial_config_and_unlock(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
1954 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
1958 if (!drm_fbdev_emulation || !fb_helper) in drm_fb_helper_hotplug_event()
1961 mutex_lock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1962 if (fb_helper->deferred_setup) { in drm_fb_helper_hotplug_event()
1963 err = __drm_fb_helper_initial_config_and_unlock(fb_helper, in drm_fb_helper_hotplug_event()
1964 fb_helper->preferred_bpp); in drm_fb_helper_hotplug_event()
1968 if (!fb_helper->fb || !drm_master_internal_acquire(fb_helper->dev)) { in drm_fb_helper_hotplug_event()
1969 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
1970 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1974 drm_master_internal_release(fb_helper->dev); in drm_fb_helper_hotplug_event()
1976 drm_dbg_kms(fb_helper->dev, "\n"); in drm_fb_helper_hotplug_event()
1978 drm_client_modeset_probe(&fb_helper->client, fb_helper->fb->width, fb_helper->fb->height); in drm_fb_helper_hotplug_event()
1979 drm_setup_crtcs_fb(fb_helper); in drm_fb_helper_hotplug_event()
1980 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
1982 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()
1997 drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper); in drm_fb_helper_lastclose()
2012 drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fb_helper_output_poll_changed()
2019 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_open() local
2022 if (user && !try_module_get(fb_helper->dev->driver->fops->owner)) in drm_fbdev_fb_open()
2030 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_release() local
2033 module_put(fb_helper->dev->driver->fops->owner); in drm_fbdev_fb_release()
2038 static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper) in drm_fbdev_cleanup() argument
2040 struct fb_info *fbi = fb_helper->fbdev; in drm_fbdev_cleanup()
2043 if (!fb_helper->dev) in drm_fbdev_cleanup()
2049 if (drm_fbdev_use_shadow_fb(fb_helper)) in drm_fbdev_cleanup()
2053 drm_fb_helper_fini(fb_helper); in drm_fbdev_cleanup()
2057 else if (fb_helper->buffer) in drm_fbdev_cleanup()
2058 drm_client_buffer_vunmap(fb_helper->buffer); in drm_fbdev_cleanup()
2060 drm_client_framebuffer_delete(fb_helper->buffer); in drm_fbdev_cleanup()
2063 static void drm_fbdev_release(struct drm_fb_helper *fb_helper) in drm_fbdev_release() argument
2065 drm_fbdev_cleanup(fb_helper); in drm_fbdev_release()
2066 drm_client_release(&fb_helper->client); in drm_fbdev_release()
2067 kfree(fb_helper); in drm_fbdev_release()
2081 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_mmap() local
2083 if (fb_helper->dev->driver->gem_prime_mmap) in drm_fbdev_fb_mmap()
2084 return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma); in drm_fbdev_fb_mmap()
2091 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_use_iomem() local
2092 struct drm_client_buffer *buffer = fb_helper->buffer; in drm_fbdev_use_iomem()
2094 return !drm_fbdev_use_shadow_fb(fb_helper) && buffer->map.is_iomem; in drm_fbdev_use_iomem()
2310 static int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_generic_probe() argument
2313 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_generic_probe()
2314 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_generic_probe()
2332 fb_helper->buffer = buffer; in drm_fb_helper_generic_probe()
2333 fb_helper->fb = buffer->fb; in drm_fb_helper_generic_probe()
2336 fbi = drm_fb_helper_alloc_fbi(fb_helper); in drm_fb_helper_generic_probe()
2344 drm_fb_helper_fill_info(fbi, fb_helper, sizes); in drm_fb_helper_generic_probe()
2346 if (drm_fbdev_use_shadow_fb(fb_helper)) { in drm_fb_helper_generic_probe()
2356 ret = drm_client_buffer_vmap(fb_helper->buffer, &map); in drm_fb_helper_generic_probe()
2386 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_unregister() local
2388 if (fb_helper->fbdev) in drm_fbdev_client_unregister()
2390 drm_fb_helper_unregister_fbi(fb_helper); in drm_fbdev_client_unregister()
2392 drm_fbdev_release(fb_helper); in drm_fbdev_client_unregister()
2404 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_hotplug() local
2409 if (!fb_helper->dev && fb_helper->funcs) in drm_fbdev_client_hotplug()
2412 if (dev->fb_helper) in drm_fbdev_client_hotplug()
2413 return drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fbdev_client_hotplug()
2420 drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs); in drm_fbdev_client_hotplug()
2422 ret = drm_fb_helper_init(dev, fb_helper); in drm_fbdev_client_hotplug()
2429 ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp); in drm_fbdev_client_hotplug()
2436 drm_fbdev_cleanup(fb_helper); in drm_fbdev_client_hotplug()
2438 fb_helper->dev = NULL; in drm_fbdev_client_hotplug()
2439 fb_helper->fbdev = NULL; in drm_fbdev_client_hotplug()
2483 struct drm_fb_helper *fb_helper; in drm_fbdev_generic_setup() local
2487 drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); in drm_fbdev_generic_setup()
2492 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); in drm_fbdev_generic_setup()
2493 if (!fb_helper) { in drm_fbdev_generic_setup()
2498 ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs); in drm_fbdev_generic_setup()
2500 kfree(fb_helper); in drm_fbdev_generic_setup()
2514 fb_helper->preferred_bpp = preferred_bpp; in drm_fbdev_generic_setup()
2516 ret = drm_fbdev_client_hotplug(&fb_helper->client); in drm_fbdev_generic_setup()
2520 drm_client_register(&fb_helper->client); in drm_fbdev_generic_setup()