Lines Matching refs:fb_helper
232 __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper, in __drm_fb_helper_restore_fbdev_mode_unlocked() argument
238 if (!drm_fbdev_emulation || !fb_helper) in __drm_fb_helper_restore_fbdev_mode_unlocked()
241 if (READ_ONCE(fb_helper->deferred_setup)) in __drm_fb_helper_restore_fbdev_mode_unlocked()
244 mutex_lock(&fb_helper->lock); in __drm_fb_helper_restore_fbdev_mode_unlocked()
251 ret = drm_client_modeset_commit_locked(&fb_helper->client); in __drm_fb_helper_restore_fbdev_mode_unlocked()
253 ret = drm_client_modeset_commit(&fb_helper->client); in __drm_fb_helper_restore_fbdev_mode_unlocked()
256 do_delayed = fb_helper->delayed_hotplug; in __drm_fb_helper_restore_fbdev_mode_unlocked()
258 fb_helper->delayed_hotplug = false; in __drm_fb_helper_restore_fbdev_mode_unlocked()
259 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_restore_fbdev_mode_unlocked()
262 drm_fb_helper_hotplug_event(fb_helper); in __drm_fb_helper_restore_fbdev_mode_unlocked()
278 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper) in drm_fb_helper_restore_fbdev_mode_unlocked() argument
280 return __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, false); in drm_fb_helper_restore_fbdev_mode_unlocked()
322 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_dpms() local
324 mutex_lock(&fb_helper->lock); in drm_fb_helper_dpms()
325 drm_client_modeset_dpms(&fb_helper->client, dpms_mode); in drm_fb_helper_dpms()
326 mutex_unlock(&fb_helper->lock); in drm_fb_helper_dpms()
375 static void drm_fb_helper_damage_blit_real(struct drm_fb_helper *fb_helper, in drm_fb_helper_damage_blit_real() argument
379 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_damage_blit_real()
404 src = fb_helper->fbdev->screen_buffer + offset; in drm_fb_helper_damage_blit_real()
414 static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper, in drm_fb_helper_damage_blit() argument
417 struct drm_client_buffer *buffer = fb_helper->buffer; in drm_fb_helper_damage_blit()
432 mutex_lock(&fb_helper->lock); in drm_fb_helper_damage_blit()
439 drm_fb_helper_damage_blit_real(fb_helper, clip, &dst); in drm_fb_helper_damage_blit()
444 mutex_unlock(&fb_helper->lock); in drm_fb_helper_damage_blit()
535 struct drm_fb_helper *fb_helper) in drm_fb_helper_init() argument
540 dev->fb_helper = fb_helper; in drm_fb_helper_init()
548 if (!fb_helper->client.funcs) { in drm_fb_helper_init()
549 ret = drm_client_init(dev, &fb_helper->client, "drm_fb_helper", NULL); in drm_fb_helper_init()
554 dev->fb_helper = fb_helper; in drm_fb_helper_init()
573 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_alloc_fbi() argument
575 struct device *dev = fb_helper->dev->dev; in drm_fb_helper_alloc_fbi()
601 fb_helper->fbdev = info; in drm_fb_helper_alloc_fbi()
622 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) in drm_fb_helper_unregister_fbi() argument
624 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_unregister_fbi()
625 unregister_framebuffer(fb_helper->fbdev); in drm_fb_helper_unregister_fbi()
635 void drm_fb_helper_fini(struct drm_fb_helper *fb_helper) in drm_fb_helper_fini() argument
639 if (!fb_helper) in drm_fb_helper_fini()
642 fb_helper->dev->fb_helper = NULL; in drm_fb_helper_fini()
647 cancel_work_sync(&fb_helper->resume_work); in drm_fb_helper_fini()
648 cancel_work_sync(&fb_helper->damage_work); in drm_fb_helper_fini()
650 info = fb_helper->fbdev; in drm_fb_helper_fini()
656 fb_helper->fbdev = NULL; in drm_fb_helper_fini()
659 if (!list_empty(&fb_helper->kernel_fb_list)) { in drm_fb_helper_fini()
660 list_del(&fb_helper->kernel_fb_list); in drm_fb_helper_fini()
666 mutex_destroy(&fb_helper->lock); in drm_fb_helper_fini()
668 if (!fb_helper->client.funcs) in drm_fb_helper_fini()
669 drm_client_release(&fb_helper->client); in drm_fb_helper_fini()
673 static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper) in drm_fbdev_use_shadow_fb() argument
675 struct drm_device *dev = fb_helper->dev; in drm_fbdev_use_shadow_fb()
676 struct drm_framebuffer *fb = fb_helper->fb; in drm_fbdev_use_shadow_fb()
915 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend) in drm_fb_helper_set_suspend() argument
917 if (fb_helper && fb_helper->fbdev) in drm_fb_helper_set_suspend()
918 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend()
938 void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, in drm_fb_helper_set_suspend_unlocked() argument
941 if (!fb_helper || !fb_helper->fbdev) in drm_fb_helper_set_suspend_unlocked()
945 flush_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
948 if (fb_helper->fbdev->state != FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
954 if (fb_helper->fbdev->state == FBINFO_STATE_RUNNING) in drm_fb_helper_set_suspend_unlocked()
958 schedule_work(&fb_helper->resume_work); in drm_fb_helper_set_suspend_unlocked()
963 fb_set_suspend(fb_helper->fbdev, suspend); in drm_fb_helper_set_suspend_unlocked()
1002 struct drm_fb_helper *fb_helper = info->par; in setcmap_legacy() local
1008 drm_modeset_lock_all(fb_helper->dev); in setcmap_legacy()
1009 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_legacy()
1035 drm_modeset_unlock_all(fb_helper->dev); in setcmap_legacy()
1085 struct drm_fb_helper *fb_helper = info->par; in setcmap_atomic() local
1086 struct drm_device *dev = fb_helper->dev; in setcmap_atomic()
1107 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1141 drm_client_for_each_modeset(modeset, &fb_helper->client) { in setcmap_atomic()
1178 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_setcmap() local
1179 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_setcmap()
1185 mutex_lock(&fb_helper->lock); in drm_fb_helper_setcmap()
1192 mutex_lock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1195 else if (drm_drv_uses_atomic_modeset(fb_helper->dev)) in drm_fb_helper_setcmap()
1199 mutex_unlock(&fb_helper->client.modeset_mutex); in drm_fb_helper_setcmap()
1203 mutex_unlock(&fb_helper->lock); in drm_fb_helper_setcmap()
1221 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_ioctl() local
1222 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_ioctl()
1226 mutex_lock(&fb_helper->lock); in drm_fb_helper_ioctl()
1250 crtc = fb_helper->client.modesets[0].crtc; in drm_fb_helper_ioctl()
1271 mutex_unlock(&fb_helper->lock); in drm_fb_helper_ioctl()
1365 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_check_var() local
1366 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_check_var()
1368 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_check_var()
1451 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_set_par() local
1459 drm_err(fb_helper->dev, "PIXEL CLOCK SET\n"); in drm_fb_helper_set_par()
1481 __drm_fb_helper_restore_fbdev_mode_unlocked(fb_helper, force); in drm_fb_helper_set_par()
1487 static void pan_set(struct drm_fb_helper *fb_helper, int x, int y) in pan_set() argument
1491 mutex_lock(&fb_helper->client.modeset_mutex); in pan_set()
1492 drm_client_for_each_modeset(mode_set, &fb_helper->client) { in pan_set()
1496 mutex_unlock(&fb_helper->client.modeset_mutex); in pan_set()
1502 struct drm_fb_helper *fb_helper = info->par; in pan_display_atomic() local
1505 pan_set(fb_helper, var->xoffset, var->yoffset); in pan_display_atomic()
1507 ret = drm_client_modeset_commit_locked(&fb_helper->client); in pan_display_atomic()
1512 pan_set(fb_helper, info->var.xoffset, info->var.yoffset); in pan_display_atomic()
1520 struct drm_fb_helper *fb_helper = info->par; in pan_display_legacy() local
1521 struct drm_client_dev *client = &fb_helper->client; in pan_display_legacy()
1526 drm_modeset_lock_all(fb_helper->dev); in pan_display_legacy()
1539 drm_modeset_unlock_all(fb_helper->dev); in pan_display_legacy()
1553 struct drm_fb_helper *fb_helper = info->par; in drm_fb_helper_pan_display() local
1554 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_pan_display()
1560 mutex_lock(&fb_helper->lock); in drm_fb_helper_pan_display()
1573 mutex_unlock(&fb_helper->lock); in drm_fb_helper_pan_display()
1583 static int drm_fb_helper_single_fb_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_single_fb_probe() argument
1586 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_single_fb_probe()
1587 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_single_fb_probe()
1610 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_fb_helper_single_fb_probe()
1738 if (!fb_helper->deferred_setup) in drm_fb_helper_single_fb_probe()
1753 ret = (*fb_helper->funcs->fb_probe)(fb_helper, &sizes); in drm_fb_helper_single_fb_probe()
1757 strcpy(fb_helper->fb->comm, "[fbcon]"); in drm_fb_helper_single_fb_probe()
1779 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_var() argument
1782 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_var()
1798 info->pseudo_palette = fb_helper->pseudo_palette; in drm_fb_helper_fill_var()
1827 struct drm_fb_helper *fb_helper, in drm_fb_helper_fill_info() argument
1830 struct drm_framebuffer *fb = fb_helper->fb; in drm_fb_helper_fill_info()
1834 drm_fb_helper_fill_var(info, fb_helper, in drm_fb_helper_fill_info()
1837 info->par = fb_helper; in drm_fb_helper_fill_info()
1845 fb_helper->dev->driver->name); in drm_fb_helper_fill_info()
1857 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper) in drm_setup_crtcs_fb() argument
1859 struct drm_client_dev *client = &fb_helper->client; in drm_setup_crtcs_fb()
1861 struct fb_info *info = fb_helper->fbdev; in drm_setup_crtcs_fb()
1871 modeset->fb = fb_helper->fb; in drm_setup_crtcs_fb()
1881 drm_connector_list_iter_begin(fb_helper->dev, &conn_iter); in drm_setup_crtcs_fb()
1918 __drm_fb_helper_initial_config_and_unlock(struct drm_fb_helper *fb_helper, in __drm_fb_helper_initial_config_and_unlock() argument
1921 struct drm_device *dev = fb_helper->dev; in __drm_fb_helper_initial_config_and_unlock()
1929 drm_client_modeset_probe(&fb_helper->client, width, height); in __drm_fb_helper_initial_config_and_unlock()
1930 ret = drm_fb_helper_single_fb_probe(fb_helper, bpp_sel); in __drm_fb_helper_initial_config_and_unlock()
1933 fb_helper->preferred_bpp = bpp_sel; in __drm_fb_helper_initial_config_and_unlock()
1934 fb_helper->deferred_setup = true; in __drm_fb_helper_initial_config_and_unlock()
1937 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1941 drm_setup_crtcs_fb(fb_helper); in __drm_fb_helper_initial_config_and_unlock()
1943 fb_helper->deferred_setup = false; in __drm_fb_helper_initial_config_and_unlock()
1945 info = fb_helper->fbdev; in __drm_fb_helper_initial_config_and_unlock()
1957 mutex_unlock(&fb_helper->lock); in __drm_fb_helper_initial_config_and_unlock()
1970 list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); in __drm_fb_helper_initial_config_and_unlock()
2017 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) in drm_fb_helper_initial_config() argument
2024 mutex_lock(&fb_helper->lock); in drm_fb_helper_initial_config()
2025 ret = __drm_fb_helper_initial_config_and_unlock(fb_helper, bpp_sel); in drm_fb_helper_initial_config()
2052 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) in drm_fb_helper_hotplug_event() argument
2056 if (!drm_fbdev_emulation || !fb_helper) in drm_fb_helper_hotplug_event()
2059 mutex_lock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
2060 if (fb_helper->deferred_setup) { in drm_fb_helper_hotplug_event()
2061 err = __drm_fb_helper_initial_config_and_unlock(fb_helper, in drm_fb_helper_hotplug_event()
2062 fb_helper->preferred_bpp); in drm_fb_helper_hotplug_event()
2066 if (!fb_helper->fb || !drm_master_internal_acquire(fb_helper->dev)) { in drm_fb_helper_hotplug_event()
2067 fb_helper->delayed_hotplug = true; in drm_fb_helper_hotplug_event()
2068 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
2072 drm_master_internal_release(fb_helper->dev); in drm_fb_helper_hotplug_event()
2074 drm_dbg_kms(fb_helper->dev, "\n"); in drm_fb_helper_hotplug_event()
2076 drm_client_modeset_probe(&fb_helper->client, fb_helper->fb->width, fb_helper->fb->height); in drm_fb_helper_hotplug_event()
2077 drm_setup_crtcs_fb(fb_helper); in drm_fb_helper_hotplug_event()
2078 mutex_unlock(&fb_helper->lock); in drm_fb_helper_hotplug_event()
2080 drm_fb_helper_set_par(fb_helper->fbdev); in drm_fb_helper_hotplug_event()
2095 drm_fb_helper_restore_fbdev_mode_unlocked(dev->fb_helper); in drm_fb_helper_lastclose()
2110 drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fb_helper_output_poll_changed()
2117 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_open() local
2120 if (user && !try_module_get(fb_helper->dev->driver->fops->owner)) in drm_fbdev_fb_open()
2128 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_release() local
2131 module_put(fb_helper->dev->driver->fops->owner); in drm_fbdev_fb_release()
2136 static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper) in drm_fbdev_cleanup() argument
2138 struct fb_info *fbi = fb_helper->fbdev; in drm_fbdev_cleanup()
2141 if (!fb_helper->dev) in drm_fbdev_cleanup()
2147 if (drm_fbdev_use_shadow_fb(fb_helper)) in drm_fbdev_cleanup()
2151 drm_fb_helper_fini(fb_helper); in drm_fbdev_cleanup()
2155 else if (fb_helper->buffer) in drm_fbdev_cleanup()
2156 drm_client_buffer_vunmap(fb_helper->buffer); in drm_fbdev_cleanup()
2158 drm_client_framebuffer_delete(fb_helper->buffer); in drm_fbdev_cleanup()
2161 static void drm_fbdev_release(struct drm_fb_helper *fb_helper) in drm_fbdev_release() argument
2163 drm_fbdev_cleanup(fb_helper); in drm_fbdev_release()
2164 drm_client_release(&fb_helper->client); in drm_fbdev_release()
2165 kfree(fb_helper); in drm_fbdev_release()
2179 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_fb_mmap() local
2181 if (drm_fbdev_use_shadow_fb(fb_helper)) in drm_fbdev_fb_mmap()
2183 else if (fb_helper->dev->driver->gem_prime_mmap) in drm_fbdev_fb_mmap()
2184 return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma); in drm_fbdev_fb_mmap()
2191 struct drm_fb_helper *fb_helper = info->par; in drm_fbdev_use_iomem() local
2192 struct drm_client_buffer *buffer = fb_helper->buffer; in drm_fbdev_use_iomem()
2194 return !drm_fbdev_use_shadow_fb(fb_helper) && buffer->map.is_iomem; in drm_fbdev_use_iomem()
2417 static int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper, in drm_fb_helper_generic_probe() argument
2420 struct drm_client_dev *client = &fb_helper->client; in drm_fb_helper_generic_probe()
2421 struct drm_device *dev = fb_helper->dev; in drm_fb_helper_generic_probe()
2439 fb_helper->buffer = buffer; in drm_fb_helper_generic_probe()
2440 fb_helper->fb = buffer->fb; in drm_fb_helper_generic_probe()
2443 fbi = drm_fb_helper_alloc_fbi(fb_helper); in drm_fb_helper_generic_probe()
2452 drm_fb_helper_fill_info(fbi, fb_helper, sizes); in drm_fb_helper_generic_probe()
2454 if (drm_fbdev_use_shadow_fb(fb_helper)) { in drm_fb_helper_generic_probe()
2464 ret = drm_client_buffer_vmap(fb_helper->buffer, &map); in drm_fb_helper_generic_probe()
2496 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_unregister() local
2498 if (fb_helper->fbdev) in drm_fbdev_client_unregister()
2500 drm_fb_helper_unregister_fbi(fb_helper); in drm_fbdev_client_unregister()
2502 drm_fbdev_release(fb_helper); in drm_fbdev_client_unregister()
2514 struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); in drm_fbdev_client_hotplug() local
2519 if (!fb_helper->dev && fb_helper->funcs) in drm_fbdev_client_hotplug()
2522 if (dev->fb_helper) in drm_fbdev_client_hotplug()
2523 return drm_fb_helper_hotplug_event(dev->fb_helper); in drm_fbdev_client_hotplug()
2530 drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs); in drm_fbdev_client_hotplug()
2532 ret = drm_fb_helper_init(dev, fb_helper); in drm_fbdev_client_hotplug()
2539 ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp); in drm_fbdev_client_hotplug()
2546 drm_fbdev_cleanup(fb_helper); in drm_fbdev_client_hotplug()
2548 fb_helper->dev = NULL; in drm_fbdev_client_hotplug()
2549 fb_helper->fbdev = NULL; in drm_fbdev_client_hotplug()
2593 struct drm_fb_helper *fb_helper; in drm_fbdev_generic_setup() local
2597 drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); in drm_fbdev_generic_setup()
2602 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); in drm_fbdev_generic_setup()
2603 if (!fb_helper) { in drm_fbdev_generic_setup()
2608 ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs); in drm_fbdev_generic_setup()
2610 kfree(fb_helper); in drm_fbdev_generic_setup()
2624 fb_helper->preferred_bpp = preferred_bpp; in drm_fbdev_generic_setup()
2626 ret = drm_fbdev_client_hotplug(&fb_helper->client); in drm_fbdev_generic_setup()
2630 drm_client_register(&fb_helper->client); in drm_fbdev_generic_setup()