Lines Matching +full:simple +full:- +full:framebuffer

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 #include <linux/iosys-map.h>
30 * framebuffer devices with dedicated memory.
33 * manager for simple framebuffer devices with dedicated video memory. GEM
38 * graphics buffers, such as an on-screen framebuffer. GEM does not provide
53 * .. code-block:: c
89 * clean-up handler to run during the DRM device's release.
109 * Buffer-objects helpers
119 WARN_ON(gbo->vmap_use_count); in drm_gem_vram_cleanup()
120 WARN_ON(iosys_map_is_set(&gbo->map)); in drm_gem_vram_cleanup()
122 drm_gem_object_release(&gbo->bo.base); in drm_gem_vram_cleanup()
148 gbo->placement.placement = gbo->placements; in drm_gem_vram_placement()
149 gbo->placement.busy_placement = gbo->placements; in drm_gem_vram_placement()
152 gbo->placements[c].mem_type = TTM_PL_VRAM; in drm_gem_vram_placement()
153 gbo->placements[c++].flags = invariant_flags; in drm_gem_vram_placement()
157 gbo->placements[c].mem_type = TTM_PL_SYSTEM; in drm_gem_vram_placement()
158 gbo->placements[c++].flags = invariant_flags; in drm_gem_vram_placement()
161 gbo->placement.num_placement = c; in drm_gem_vram_placement()
162 gbo->placement.num_busy_placement = c; in drm_gem_vram_placement()
165 gbo->placements[i].fpfn = 0; in drm_gem_vram_placement()
166 gbo->placements[i].lpfn = 0; in drm_gem_vram_placement()
171 * drm_gem_vram_create() - Creates a VRAM-backed GEM object
184 * an ERR_PTR()-encoded error code otherwise.
192 struct drm_vram_mm *vmm = dev->vram_mm; in drm_gem_vram_create()
197 return ERR_PTR(-EINVAL); in drm_gem_vram_create()
199 if (dev->driver->gem_create_object) { in drm_gem_vram_create()
200 gem = dev->driver->gem_create_object(dev, size); in drm_gem_vram_create()
207 return ERR_PTR(-ENOMEM); in drm_gem_vram_create()
208 gem = &gbo->bo.base; in drm_gem_vram_create()
211 if (!gem->funcs) in drm_gem_vram_create()
212 gem->funcs = &drm_gem_vram_object_funcs; in drm_gem_vram_create()
220 bdev = &vmm->bdev; in drm_gem_vram_create()
222 gbo->bo.bdev = bdev; in drm_gem_vram_create()
227 * to release gbo->bo.base and kfree gbo. in drm_gem_vram_create()
229 ret = ttm_bo_init_validate(bdev, &gbo->bo, ttm_bo_type_device, in drm_gem_vram_create()
230 &gbo->placement, pg_align, false, NULL, NULL, in drm_gem_vram_create()
240 * drm_gem_vram_put() - Releases a reference to a VRAM-backed GEM object
247 ttm_bo_put(&gbo->bo); in drm_gem_vram_put()
254 if (WARN_ON_ONCE(!gbo->bo.resource || in drm_gem_vram_pg_offset()
255 gbo->bo.resource->mem_type == TTM_PL_SYSTEM)) in drm_gem_vram_pg_offset()
258 return gbo->bo.resource->start; in drm_gem_vram_pg_offset()
262 * drm_gem_vram_offset() - \
275 if (WARN_ON_ONCE(!gbo->bo.pin_count)) in drm_gem_vram_offset()
276 return (s64)-ENODEV; in drm_gem_vram_offset()
287 if (gbo->bo.pin_count) in drm_gem_vram_pin_locked()
293 ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx); in drm_gem_vram_pin_locked()
298 ttm_bo_pin(&gbo->bo); in drm_gem_vram_pin_locked()
304 * drm_gem_vram_pin() - Pins a GEM VRAM object in a region.
317 * video RAM. Fragmentation can prevent the primary framebuffer from
330 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_pin()
334 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_pin()
342 ttm_bo_unpin(&gbo->bo); in drm_gem_vram_unpin_locked()
346 * drm_gem_vram_unpin() - Unpins a GEM VRAM object
357 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_unpin()
362 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_unpin()
373 if (gbo->vmap_use_count > 0) in drm_gem_vram_kmap_locked()
381 if (iosys_map_is_null(&gbo->map)) { in drm_gem_vram_kmap_locked()
382 ret = ttm_bo_vmap(&gbo->bo, &gbo->map); in drm_gem_vram_kmap_locked()
388 ++gbo->vmap_use_count; in drm_gem_vram_kmap_locked()
389 *map = gbo->map; in drm_gem_vram_kmap_locked()
397 struct drm_device *dev = gbo->bo.base.dev; in drm_gem_vram_kunmap_locked()
399 if (drm_WARN_ON_ONCE(dev, !gbo->vmap_use_count)) in drm_gem_vram_kunmap_locked()
402 if (drm_WARN_ON_ONCE(dev, !iosys_map_is_equal(&gbo->map, map))) in drm_gem_vram_kunmap_locked()
405 if (--gbo->vmap_use_count > 0) in drm_gem_vram_kunmap_locked()
417 * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
436 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_vmap()
447 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vmap()
454 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vmap()
460 * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object
472 ret = ttm_bo_reserve(&gbo->bo, false, false, NULL); in drm_gem_vram_vunmap()
479 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vunmap()
484 * drm_gem_vram_fill_create_dumb() - \
495 * should forwards their arguments to this helper, plus the driver-specific
513 pitch = args->width * DIV_ROUND_UP(args->bpp, 8); in drm_gem_vram_fill_create_dumb()
516 return -EINVAL; in drm_gem_vram_fill_create_dumb()
519 size = pitch * args->height; in drm_gem_vram_fill_create_dumb()
523 return -EINVAL; in drm_gem_vram_fill_create_dumb()
529 ret = drm_gem_handle_create(file, &gbo->bo.base, &handle); in drm_gem_vram_fill_create_dumb()
533 drm_gem_object_put(&gbo->bo.base); in drm_gem_vram_fill_create_dumb()
535 args->pitch = pitch; in drm_gem_vram_fill_create_dumb()
536 args->size = size; in drm_gem_vram_fill_create_dumb()
537 args->handle = handle; in drm_gem_vram_fill_create_dumb()
542 drm_gem_object_put(&gbo->bo.base); in drm_gem_vram_fill_create_dumb()
553 return (bo->destroy == ttm_buffer_object_destroy); in drm_is_gem_vram()
560 *pl = gbo->placement; in drm_gem_vram_bo_driver_evict_flags()
565 struct ttm_buffer_object *bo = &gbo->bo; in drm_gem_vram_bo_driver_move_notify()
566 struct drm_device *dev = bo->base.dev; in drm_gem_vram_bo_driver_move_notify()
568 if (drm_WARN_ON_ONCE(dev, gbo->vmap_use_count)) in drm_gem_vram_bo_driver_move_notify()
571 ttm_bo_vunmap(bo, &gbo->map); in drm_gem_vram_bo_driver_move_notify()
572 iosys_map_clear(&gbo->map); /* explicitly clear mapping for next vmap call */ in drm_gem_vram_bo_driver_move_notify()
581 return ttm_bo_move_memcpy(&gbo->bo, ctx, new_mem); in drm_gem_vram_bo_driver_move()
589 * drm_gem_vram_object_free() - \
605 * drm_gem_vram_driver_dumb_create() - \
623 if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized")) in drm_gem_vram_driver_dumb_create()
624 return -EINVAL; in drm_gem_vram_driver_dumb_create()
640 struct drm_framebuffer *fb = state->fb; in __drm_gem_vram_plane_helper_cleanup_fb()
643 --num_planes; in __drm_gem_vram_plane_helper_cleanup_fb()
653 * drm_gem_vram_plane_helper_prepare_fb() - \
659 * pins the GEM VRAM objects of the plane's new framebuffer to VRAM.
670 struct drm_framebuffer *fb = new_state->fb; in drm_gem_vram_plane_helper_prepare_fb()
679 for (i = 0; i < fb->format->num_planes; ++i) { in drm_gem_vram_plane_helper_prepare_fb()
682 ret = -EINVAL; in drm_gem_vram_plane_helper_prepare_fb()
704 * drm_gem_vram_plane_helper_cleanup_fb() - \
710 * objects of the plane's old framebuffer from VRAM. Complements
717 struct drm_framebuffer *fb = old_state->fb; in drm_gem_vram_plane_helper_cleanup_fb()
722 __drm_gem_vram_plane_helper_cleanup_fb(plane, old_state, fb->format->num_planes); in drm_gem_vram_plane_helper_cleanup_fb()
731 * drm_gem_vram_simple_display_pipe_prepare_fb() - \
733 * @pipe: a simple display pipe
737 * objects of the plane's new framebuffer to VRAM. Call
748 return drm_gem_vram_plane_helper_prepare_fb(&pipe->plane, new_state); in drm_gem_vram_simple_display_pipe_prepare_fb()
753 * drm_gem_vram_simple_display_pipe_cleanup_fb() - \
755 * @pipe: a simple display pipe
759 * objects of the plane's old framebuffer from VRAM. Complements
766 drm_gem_vram_plane_helper_cleanup_fb(&pipe->plane, old_state); in drm_gem_vram_simple_display_pipe_cleanup_fb()
775 * drm_gem_vram_object_pin() - \
799 * drm_gem_vram_object_unpin() - \
811 * drm_gem_vram_object_vmap() -
829 * drm_gem_vram_object_vunmap() -
940 switch (mem->mem_type) { in bo_driver_io_mem_reserve()
944 mem->bus.offset = (mem->start << PAGE_SHIFT) + vmm->vram_base; in bo_driver_io_mem_reserve()
945 mem->bus.is_iomem = true; in bo_driver_io_mem_reserve()
946 mem->bus.caching = ttm_write_combined; in bo_driver_io_mem_reserve()
949 return -EINVAL; in bo_driver_io_mem_reserve()
971 struct drm_info_node *node = (struct drm_info_node *) m->private; in drm_vram_mm_debugfs()
972 struct drm_vram_mm *vmm = node->minor->dev->vram_mm; in drm_vram_mm_debugfs()
973 struct ttm_resource_manager *man = ttm_manager_type(&vmm->bdev, TTM_PL_VRAM); in drm_vram_mm_debugfs()
981 { "vram-mm", drm_vram_mm_debugfs, 0, NULL },
985 * drm_vram_mm_debugfs_init() - Register VRAM MM debugfs file.
994 minor->debugfs_root, minor); in drm_vram_mm_debugfs_init()
1003 vmm->vram_base = vram_base; in drm_vram_mm_init()
1004 vmm->vram_size = vram_size; in drm_vram_mm_init()
1006 ret = ttm_device_init(&vmm->bdev, &bo_driver, dev->dev, in drm_vram_mm_init()
1007 dev->anon_inode->i_mapping, in drm_vram_mm_init()
1008 dev->vma_offset_manager, in drm_vram_mm_init()
1013 ret = ttm_range_man_init(&vmm->bdev, TTM_PL_VRAM, in drm_vram_mm_init()
1023 ttm_range_man_fini(&vmm->bdev, TTM_PL_VRAM); in drm_vram_mm_cleanup()
1024 ttm_device_fini(&vmm->bdev); in drm_vram_mm_cleanup()
1036 if (WARN_ON(dev->vram_mm)) in drm_vram_helper_alloc_mm()
1037 return dev->vram_mm; in drm_vram_helper_alloc_mm()
1039 dev->vram_mm = kzalloc(sizeof(*dev->vram_mm), GFP_KERNEL); in drm_vram_helper_alloc_mm()
1040 if (!dev->vram_mm) in drm_vram_helper_alloc_mm()
1041 return ERR_PTR(-ENOMEM); in drm_vram_helper_alloc_mm()
1043 ret = drm_vram_mm_init(dev->vram_mm, dev, vram_base, vram_size); in drm_vram_helper_alloc_mm()
1047 return dev->vram_mm; in drm_vram_helper_alloc_mm()
1050 kfree(dev->vram_mm); in drm_vram_helper_alloc_mm()
1051 dev->vram_mm = NULL; in drm_vram_helper_alloc_mm()
1057 if (!dev->vram_mm) in drm_vram_helper_release_mm()
1060 drm_vram_mm_cleanup(dev->vram_mm); in drm_vram_helper_release_mm()
1061 kfree(dev->vram_mm); in drm_vram_helper_release_mm()
1062 dev->vram_mm = NULL; in drm_vram_helper_release_mm()
1071 * drmm_vram_helper_init - Initializes a device's instance of
1078 * struct &drm_device.vram_mm. The instance is auto-managed and cleaned
1090 if (drm_WARN_ON_ONCE(dev, dev->vram_mm)) in drmm_vram_helper_init()
1101 * Mode-config helpers
1109 struct drm_vram_mm *vmm = dev->vram_mm; in drm_vram_helper_mode_valid_internal()
1112 if (WARN_ON(!dev->vram_mm)) in drm_vram_helper_mode_valid_internal()
1115 max_fbpages = (vmm->vram_size / 2) >> PAGE_SHIFT; in drm_vram_helper_mode_valid_internal()
1117 fbsize = mode->hdisplay * mode->vdisplay * max_bpp; in drm_vram_helper_mode_valid_internal()
1127 * drm_vram_helper_mode_valid - Tests if a display mode's
1128 * framebuffer fits into the available video memory.
1134 * designated framebuffer into video memory before evicting the active
1135 * one. Hence, any framebuffer may consume at most half of the available
1136 * VRAM. Display modes that require a larger framebuffer can not be used,
1137 * even if the CRTC does support them. Each framebuffer is assumed to
1138 * have 32-bit color depth.
1144 * 32-bit fits all current use case. A more flexible test can be added
1161 MODULE_DESCRIPTION("DRM VRAM memory-management helpers");