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

1 // SPDX-License-Identifier: GPL-2.0-or-later
27 * framebuffer devices with dedicated memory.
30 * manager for simple framebuffer devices with dedicated video memory. GEM
35 * graphics buffers, such as an on-screen framebuffer. GEM does not provide
50 * .. code-block:: c
86 * clean-up handler to run during the DRM device's release.
106 * Buffer-objects helpers
116 WARN_ON(gbo->kmap_use_count); in drm_gem_vram_cleanup()
117 WARN_ON(gbo->kmap.virtual); in drm_gem_vram_cleanup()
119 drm_gem_object_release(&gbo->bo.base); in drm_gem_vram_cleanup()
145 gbo->placement.placement = gbo->placements; in drm_gem_vram_placement()
146 gbo->placement.busy_placement = gbo->placements; in drm_gem_vram_placement()
149 gbo->placements[c].mem_type = TTM_PL_VRAM; in drm_gem_vram_placement()
150 gbo->placements[c++].flags = TTM_PL_FLAG_WC | in drm_gem_vram_placement()
156 gbo->placements[c].mem_type = TTM_PL_SYSTEM; in drm_gem_vram_placement()
157 gbo->placements[c++].flags = TTM_PL_MASK_CACHING | 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()
178 struct drm_vram_mm *vmm = dev->vram_mm; in drm_gem_vram_init()
185 return -EINVAL; in drm_gem_vram_init()
187 bdev = &vmm->bdev; in drm_gem_vram_init()
189 gbo->bo.base.funcs = &drm_gem_vram_object_funcs; in drm_gem_vram_init()
191 ret = drm_gem_object_init(dev, &gbo->bo.base, size); in drm_gem_vram_init()
199 gbo->bo.bdev = bdev; in drm_gem_vram_init()
203 ret = ttm_bo_init(bdev, &gbo->bo, size, ttm_bo_type_device, in drm_gem_vram_init()
204 &gbo->placement, pg_align, false, acc_size, in drm_gem_vram_init()
209 * to release gbo->bo.base and kfree gbo. in drm_gem_vram_init()
217 * drm_gem_vram_create() - Creates a VRAM-backed GEM object
224 * an ERR_PTR()-encoded error code otherwise.
233 if (dev->driver->gem_create_object) { in drm_gem_vram_create()
235 dev->driver->gem_create_object(dev, size); in drm_gem_vram_create()
237 return ERR_PTR(-ENOMEM); in drm_gem_vram_create()
242 return ERR_PTR(-ENOMEM); in drm_gem_vram_create()
254 * drm_gem_vram_put() - Releases a reference to a VRAM-backed GEM object
261 ttm_bo_put(&gbo->bo); in drm_gem_vram_put()
266 * drm_gem_vram_mmap_offset() - Returns a GEM VRAM object's mmap offset
277 return drm_vma_node_offset_addr(&gbo->bo.base.vma_node); in drm_gem_vram_mmap_offset()
284 if (WARN_ON_ONCE(!gbo->bo.mem.mm_node)) in drm_gem_vram_pg_offset()
287 return gbo->bo.mem.start; in drm_gem_vram_pg_offset()
291 * drm_gem_vram_offset() - \
304 if (WARN_ON_ONCE(!gbo->pin_count)) in drm_gem_vram_offset()
305 return (s64)-ENODEV; in drm_gem_vram_offset()
316 if (gbo->pin_count) in drm_gem_vram_pin_locked()
322 for (i = 0; i < gbo->placement.num_placement; ++i) in drm_gem_vram_pin_locked()
323 gbo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; in drm_gem_vram_pin_locked()
325 ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx); in drm_gem_vram_pin_locked()
330 ++gbo->pin_count; in drm_gem_vram_pin_locked()
336 * drm_gem_vram_pin() - Pins a GEM VRAM object in a region.
349 * video RAM. Fragmentation can prevent the primary framebuffer from
362 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_pin()
366 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_pin()
377 if (WARN_ON_ONCE(!gbo->pin_count)) in drm_gem_vram_unpin_locked()
380 --gbo->pin_count; in drm_gem_vram_unpin_locked()
381 if (gbo->pin_count) in drm_gem_vram_unpin_locked()
384 for (i = 0; i < gbo->placement.num_placement ; ++i) in drm_gem_vram_unpin_locked()
385 gbo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; in drm_gem_vram_unpin_locked()
387 ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx); in drm_gem_vram_unpin_locked()
395 * drm_gem_vram_unpin() - Unpins a GEM VRAM object
406 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_unpin()
410 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_unpin()
420 struct ttm_bo_kmap_obj *kmap = &gbo->kmap; in drm_gem_vram_kmap_locked()
422 if (gbo->kmap_use_count > 0) in drm_gem_vram_kmap_locked()
425 if (kmap->virtual || !map) in drm_gem_vram_kmap_locked()
428 ret = ttm_bo_kmap(&gbo->bo, 0, gbo->bo.num_pages, kmap); in drm_gem_vram_kmap_locked()
433 if (!kmap->virtual) { in drm_gem_vram_kmap_locked()
438 ++gbo->kmap_use_count; in drm_gem_vram_kmap_locked()
441 return kmap->virtual; in drm_gem_vram_kmap_locked()
446 if (WARN_ON_ONCE(!gbo->kmap_use_count)) in drm_gem_vram_kunmap_locked()
448 if (--gbo->kmap_use_count > 0) in drm_gem_vram_kunmap_locked()
460 * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address
472 * an ERR_PTR()-encoded error code otherwise.
479 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); in drm_gem_vram_vmap()
492 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vmap()
499 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vmap()
505 * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object
516 ret = ttm_bo_reserve(&gbo->bo, false, false, NULL); in drm_gem_vram_vunmap()
523 ttm_bo_unreserve(&gbo->bo); in drm_gem_vram_vunmap()
528 * drm_gem_vram_fill_create_dumb() - \
539 * should forwards their arguments to this helper, plus the driver-specific
557 pitch = args->width * DIV_ROUND_UP(args->bpp, 8); in drm_gem_vram_fill_create_dumb()
560 return -EINVAL; in drm_gem_vram_fill_create_dumb()
563 size = pitch * args->height; in drm_gem_vram_fill_create_dumb()
567 return -EINVAL; in drm_gem_vram_fill_create_dumb()
573 ret = drm_gem_handle_create(file, &gbo->bo.base, &handle); in drm_gem_vram_fill_create_dumb()
577 drm_gem_object_put(&gbo->bo.base); in drm_gem_vram_fill_create_dumb()
579 args->pitch = pitch; in drm_gem_vram_fill_create_dumb()
580 args->size = size; in drm_gem_vram_fill_create_dumb()
581 args->handle = handle; in drm_gem_vram_fill_create_dumb()
586 drm_gem_object_put(&gbo->bo.base); in drm_gem_vram_fill_create_dumb()
597 return (bo->destroy == ttm_buffer_object_destroy); in drm_is_gem_vram()
604 *pl = gbo->placement; in drm_gem_vram_bo_driver_evict_flags()
611 struct ttm_bo_kmap_obj *kmap = &gbo->kmap; in drm_gem_vram_bo_driver_move_notify()
613 if (WARN_ON_ONCE(gbo->kmap_use_count)) in drm_gem_vram_bo_driver_move_notify()
616 if (!kmap->virtual) in drm_gem_vram_bo_driver_move_notify()
619 kmap->virtual = NULL; in drm_gem_vram_bo_driver_move_notify()
627 * drm_gem_vram_object_free() - \
643 * drm_gem_vram_driver_create_dumb() - \
661 if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized")) in drm_gem_vram_driver_dumb_create()
662 return -EINVAL; in drm_gem_vram_driver_dumb_create()
669 * drm_gem_vram_driver_dumb_mmap_offset() - \
689 return -ENOENT; in drm_gem_vram_driver_dumb_mmap_offset()
705 * drm_gem_vram_plane_helper_prepare_fb() - \
711 * pins the GEM VRAM objects of the plane's new framebuffer to VRAM.
726 if (!new_state->fb) in drm_gem_vram_plane_helper_prepare_fb()
729 for (i = 0; i < ARRAY_SIZE(new_state->fb->obj); ++i) { in drm_gem_vram_plane_helper_prepare_fb()
730 if (!new_state->fb->obj[i]) in drm_gem_vram_plane_helper_prepare_fb()
732 gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]); in drm_gem_vram_plane_helper_prepare_fb()
746 --i; in drm_gem_vram_plane_helper_prepare_fb()
747 gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]); in drm_gem_vram_plane_helper_prepare_fb()
755 * drm_gem_vram_plane_helper_cleanup_fb() - \
761 * objects of the plane's old framebuffer from VRAM. Complements
771 if (!old_state->fb) in drm_gem_vram_plane_helper_cleanup_fb()
774 for (i = 0; i < ARRAY_SIZE(old_state->fb->obj); ++i) { in drm_gem_vram_plane_helper_cleanup_fb()
775 if (!old_state->fb->obj[i]) in drm_gem_vram_plane_helper_cleanup_fb()
777 gbo = drm_gem_vram_of_gem(old_state->fb->obj[i]); in drm_gem_vram_plane_helper_cleanup_fb()
788 * drm_gem_vram_simple_display_pipe_prepare_fb() - \
790 * @pipe: a simple display pipe
794 * objects of the plane's new framebuffer to VRAM. Call
805 return drm_gem_vram_plane_helper_prepare_fb(&pipe->plane, new_state); in drm_gem_vram_simple_display_pipe_prepare_fb()
810 * drm_gem_vram_simple_display_pipe_cleanup_fb() - \
812 * @pipe: a simple display pipe
816 * objects of the plane's old framebuffer from VRAM. Complements
823 drm_gem_vram_plane_helper_cleanup_fb(&pipe->plane, old_state); in drm_gem_vram_simple_display_pipe_cleanup_fb()
832 * drm_gem_vram_object_pin() - \
856 * drm_gem_vram_object_unpin() - \
868 * drm_gem_vram_object_vmap() - \
888 * drm_gem_vram_object_vunmap() - \
989 switch (mem->mem_type) { in bo_driver_io_mem_reserve()
993 mem->bus.offset = (mem->start << PAGE_SHIFT) + vmm->vram_base; in bo_driver_io_mem_reserve()
994 mem->bus.is_iomem = true; in bo_driver_io_mem_reserve()
997 return -EINVAL; in bo_driver_io_mem_reserve()
1018 struct drm_info_node *node = (struct drm_info_node *) m->private; in drm_vram_mm_debugfs()
1019 struct drm_vram_mm *vmm = node->minor->dev->vram_mm; in drm_vram_mm_debugfs()
1020 struct ttm_resource_manager *man = ttm_manager_type(&vmm->bdev, TTM_PL_VRAM); in drm_vram_mm_debugfs()
1028 { "vram-mm", drm_vram_mm_debugfs, 0, NULL },
1032 * drm_vram_mm_debugfs_init() - Register VRAM MM debugfs file.
1041 minor->debugfs_root, minor); in drm_vram_mm_debugfs_init()
1050 vmm->vram_base = vram_base; in drm_vram_mm_init()
1051 vmm->vram_size = vram_size; in drm_vram_mm_init()
1053 ret = ttm_bo_device_init(&vmm->bdev, &bo_driver, in drm_vram_mm_init()
1054 dev->anon_inode->i_mapping, in drm_vram_mm_init()
1055 dev->vma_offset_manager, in drm_vram_mm_init()
1060 ret = ttm_range_man_init(&vmm->bdev, TTM_PL_VRAM, in drm_vram_mm_init()
1070 ttm_range_man_fini(&vmm->bdev, TTM_PL_VRAM); in drm_vram_mm_cleanup()
1071 ttm_bo_device_release(&vmm->bdev); in drm_vram_mm_cleanup()
1084 if (WARN_ON(dev->vram_mm)) in drm_vram_helper_alloc_mm()
1085 return dev->vram_mm; in drm_vram_helper_alloc_mm()
1087 dev->vram_mm = kzalloc(sizeof(*dev->vram_mm), GFP_KERNEL); in drm_vram_helper_alloc_mm()
1088 if (!dev->vram_mm) in drm_vram_helper_alloc_mm()
1089 return ERR_PTR(-ENOMEM); in drm_vram_helper_alloc_mm()
1091 ret = drm_vram_mm_init(dev->vram_mm, dev, vram_base, vram_size); in drm_vram_helper_alloc_mm()
1095 return dev->vram_mm; in drm_vram_helper_alloc_mm()
1098 kfree(dev->vram_mm); in drm_vram_helper_alloc_mm()
1099 dev->vram_mm = NULL; in drm_vram_helper_alloc_mm()
1106 if (!dev->vram_mm) in drm_vram_helper_release_mm()
1109 drm_vram_mm_cleanup(dev->vram_mm); in drm_vram_helper_release_mm()
1110 kfree(dev->vram_mm); in drm_vram_helper_release_mm()
1111 dev->vram_mm = NULL; in drm_vram_helper_release_mm()
1121 * drmm_vram_helper_init - Initializes a device's instance of
1128 * struct &drm_device.vram_mm. The instance is auto-managed and cleaned
1140 if (drm_WARN_ON_ONCE(dev, dev->vram_mm)) in drmm_vram_helper_init()
1151 * Mode-config helpers
1159 struct drm_vram_mm *vmm = dev->vram_mm; in drm_vram_helper_mode_valid_internal()
1162 if (WARN_ON(!dev->vram_mm)) in drm_vram_helper_mode_valid_internal()
1165 max_fbpages = (vmm->vram_size / 2) >> PAGE_SHIFT; in drm_vram_helper_mode_valid_internal()
1167 fbsize = mode->hdisplay * mode->vdisplay * max_bpp; in drm_vram_helper_mode_valid_internal()
1177 * drm_vram_helper_mode_valid - Tests if a display mode's
1178 * framebuffer fits into the available video memory.
1184 * designated framebuffer into video memory before evicting the active
1185 * one. Hence, any framebuffer may consume at most half of the available
1186 * VRAM. Display modes that require a larger framebuffer can not be used,
1187 * even if the CRTC does support them. Each framebuffer is assumed to
1188 * have 32-bit color depth.
1194 * 32-bit fits all current use case. A more flexible test can be added
1211 MODULE_DESCRIPTION("DRM VRAM memory-management helpers");