Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/{i915,xe}: move framebuffer bo to parent interface

Add .framebuffer_init, .framebuffer_fini and .framebuffer_lookup to the
bo parent interface. While they're about framebuffers, they're
specifically about framebuffer objects, so the bo interface is a good
enough fit, and there's no need to add another interface struct.

Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>
Link: https://patch.msgid.link/848d32a44bf844cba3d66e44ba9f20bea4a8352d.1773238670.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>

+218 -223
-1
drivers/gpu/drm/i915/Makefile
··· 278 278 display/intel_drrs.o \ 279 279 display/intel_dsb.o \ 280 280 display/intel_fb.o \ 281 - display/intel_fb_bo.o \ 282 281 display/intel_fb_pin.o \ 283 282 display/intel_fbc.o \ 284 283 display/intel_fdi.o \
+21
drivers/gpu/drm/i915/display/intel_bo.c
··· 64 64 if (display->parent->bo->describe) 65 65 display->parent->bo->describe(m, obj); 66 66 } 67 + 68 + int intel_bo_framebuffer_init(struct drm_gem_object *obj, struct drm_mode_fb_cmd2 *mode_cmd) 69 + { 70 + struct intel_display *display = to_intel_display(obj->dev); 71 + 72 + return display->parent->bo->framebuffer_init(obj, mode_cmd); 73 + } 74 + 75 + void intel_bo_framebuffer_fini(struct drm_gem_object *obj) 76 + { 77 + struct intel_display *display = to_intel_display(obj->dev); 78 + 79 + display->parent->bo->framebuffer_fini(obj); 80 + } 81 + 82 + struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display, 83 + struct drm_file *filp, 84 + const struct drm_mode_fb_cmd2 *user_mode_cmd) 85 + { 86 + return display->parent->bo->framebuffer_lookup(display->drm, filp, user_mode_cmd); 87 + }
+9
drivers/gpu/drm/i915/display/intel_bo.h
··· 6 6 7 7 #include <linux/types.h> 8 8 9 + struct drm_file; 9 10 struct drm_gem_object; 11 + struct drm_mode_fb_cmd2; 10 12 struct drm_scanout_buffer; 13 + struct intel_display; 11 14 struct intel_framebuffer; 12 15 struct seq_file; 13 16 struct vm_area_struct; ··· 24 21 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size); 25 22 26 23 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj); 24 + 25 + void intel_bo_framebuffer_fini(struct drm_gem_object *obj); 26 + int intel_bo_framebuffer_init(struct drm_gem_object *obj, struct drm_mode_fb_cmd2 *mode_cmd); 27 + struct drm_gem_object *intel_bo_framebuffer_lookup(struct intel_display *display, 28 + struct drm_file *filp, 29 + const struct drm_mode_fb_cmd2 *user_mode_cmd); 27 30 28 31 #endif /* __INTEL_BO__ */
+6 -6
drivers/gpu/drm/i915/display/intel_fb.c
··· 17 17 #include "intel_display_types.h" 18 18 #include "intel_display_utils.h" 19 19 #include "intel_fb.h" 20 - #include "intel_fb_bo.h" 21 20 #include "intel_frontbuffer.h" 22 21 #include "intel_parent.h" 23 22 #include "intel_plane.h" ··· 2110 2111 if (intel_fb_uses_dpt(fb)) 2111 2112 intel_parent_dpt_destroy(display, intel_fb->dpt); 2112 2113 2113 - intel_fb_bo_framebuffer_fini(intel_fb_bo(fb)); 2114 + intel_bo_framebuffer_fini(intel_fb_bo(fb)); 2114 2115 2115 2116 intel_parent_frontbuffer_put(display, intel_fb->frontbuffer); 2116 2117 ··· 2221 2222 2222 2223 /* 2223 2224 * intel_parent_frontbuffer_get() must be done before 2224 - * intel_fb_bo_framebuffer_init() to avoid set_tiling vs. addfb race. 2225 + * intel_bo_framebuffer_init() to avoid set_tiling vs. addfb race. 2225 2226 */ 2226 2227 intel_fb->frontbuffer = intel_parent_frontbuffer_get(display, obj); 2227 2228 if (!intel_fb->frontbuffer) { ··· 2229 2230 goto err_free_panic; 2230 2231 } 2231 2232 2232 - ret = intel_fb_bo_framebuffer_init(obj, mode_cmd); 2233 + ret = intel_bo_framebuffer_init(obj, mode_cmd); 2233 2234 if (ret) 2234 2235 goto err_frontbuffer_put; 2235 2236 ··· 2332 2333 if (intel_fb_uses_dpt(fb)) 2333 2334 intel_parent_dpt_destroy(display, intel_fb->dpt); 2334 2335 err_bo_framebuffer_fini: 2335 - intel_fb_bo_framebuffer_fini(obj); 2336 + intel_bo_framebuffer_fini(obj); 2336 2337 err_frontbuffer_put: 2337 2338 intel_parent_frontbuffer_put(display, intel_fb->frontbuffer); 2338 2339 err_free_panic: ··· 2347 2348 const struct drm_format_info *info, 2348 2349 const struct drm_mode_fb_cmd2 *user_mode_cmd) 2349 2350 { 2351 + struct intel_display *display = to_intel_display(dev); 2350 2352 struct drm_framebuffer *fb; 2351 2353 struct drm_gem_object *obj; 2352 2354 struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd; 2353 2355 2354 - obj = intel_fb_bo_lookup_valid_bo(dev, filp, &mode_cmd); 2356 + obj = intel_bo_framebuffer_lookup(display, filp, &mode_cmd); 2355 2357 if (IS_ERR(obj)) 2356 2358 return ERR_CAST(obj); 2357 2359
-99
drivers/gpu/drm/i915/display/intel_fb_bo.c
··· 1 - /* SPDX-License-Identifier: MIT */ 2 - /* 3 - * Copyright © 2021 Intel Corporation 4 - */ 5 - 6 - #include <drm/drm_framebuffer.h> 7 - #include <drm/drm_print.h> 8 - 9 - #include "gem/i915_gem_object.h" 10 - 11 - #include "i915_drv.h" 12 - #include "intel_fb.h" 13 - #include "intel_fb_bo.h" 14 - 15 - void intel_fb_bo_framebuffer_fini(struct drm_gem_object *obj) 16 - { 17 - /* Nothing to do for i915 */ 18 - } 19 - 20 - int intel_fb_bo_framebuffer_init(struct drm_gem_object *_obj, 21 - struct drm_mode_fb_cmd2 *mode_cmd) 22 - { 23 - struct drm_i915_gem_object *obj = to_intel_bo(_obj); 24 - struct drm_i915_private *i915 = to_i915(obj->base.dev); 25 - unsigned int tiling, stride; 26 - 27 - i915_gem_object_lock(obj, NULL); 28 - tiling = i915_gem_object_get_tiling(obj); 29 - stride = i915_gem_object_get_stride(obj); 30 - i915_gem_object_unlock(obj); 31 - 32 - if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) { 33 - /* 34 - * If there's a fence, enforce that 35 - * the fb modifier and tiling mode match. 36 - */ 37 - if (tiling != I915_TILING_NONE && 38 - tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) { 39 - drm_dbg_kms(&i915->drm, 40 - "tiling_mode doesn't match fb modifier\n"); 41 - return -EINVAL; 42 - } 43 - } else { 44 - if (tiling == I915_TILING_X) { 45 - mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED; 46 - } else if (tiling == I915_TILING_Y) { 47 - drm_dbg_kms(&i915->drm, 48 - "No Y tiling for legacy addfb\n"); 49 - return -EINVAL; 50 - } 51 - } 52 - 53 - /* 54 - * gen2/3 display engine uses the fence if present, 55 - * so the tiling mode must match the fb modifier exactly. 56 - */ 57 - if (GRAPHICS_VER(i915) < 4 && 58 - tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) { 59 - drm_dbg_kms(&i915->drm, 60 - "tiling_mode must match fb modifier exactly on gen2/3\n"); 61 - return -EINVAL; 62 - } 63 - 64 - /* 65 - * If there's a fence, enforce that 66 - * the fb pitch and fence stride match. 67 - */ 68 - if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) { 69 - drm_dbg_kms(&i915->drm, 70 - "pitch (%d) must match tiling stride (%d)\n", 71 - mode_cmd->pitches[0], stride); 72 - return -EINVAL; 73 - } 74 - 75 - return 0; 76 - } 77 - 78 - struct drm_gem_object * 79 - intel_fb_bo_lookup_valid_bo(struct drm_device *drm, 80 - struct drm_file *filp, 81 - const struct drm_mode_fb_cmd2 *mode_cmd) 82 - { 83 - struct drm_i915_private *i915 = to_i915(drm); 84 - struct drm_i915_gem_object *obj; 85 - 86 - obj = i915_gem_object_lookup(filp, mode_cmd->handles[0]); 87 - if (!obj) 88 - return ERR_PTR(-ENOENT); 89 - 90 - /* object is backed with LMEM for discrete */ 91 - if (HAS_LMEM(i915) && !i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM_0)) { 92 - /* object is "remote", not in local memory */ 93 - i915_gem_object_put(obj); 94 - drm_dbg_kms(&i915->drm, "framebuffer must reside in local memory\n"); 95 - return ERR_PTR(-EREMOTE); 96 - } 97 - 98 - return intel_bo_to_drm_bo(obj); 99 - }
-25
drivers/gpu/drm/i915/display/intel_fb_bo.h
··· 1 - /* SPDX-License-Identifier: MIT */ 2 - /* 3 - * Copyright © 2021 Intel Corporation 4 - */ 5 - 6 - #ifndef __INTEL_FB_BO_H__ 7 - #define __INTEL_FB_BO_H__ 8 - 9 - struct drm_device; 10 - struct drm_file; 11 - struct drm_framebuffer; 12 - struct drm_gem_object; 13 - struct drm_mode_fb_cmd2; 14 - 15 - void intel_fb_bo_framebuffer_fini(struct drm_gem_object *obj); 16 - 17 - int intel_fb_bo_framebuffer_init(struct drm_gem_object *obj, 18 - struct drm_mode_fb_cmd2 *mode_cmd); 19 - 20 - struct drm_gem_object * 21 - intel_fb_bo_lookup_valid_bo(struct drm_device *drm, 22 - struct drm_file *filp, 23 - const struct drm_mode_fb_cmd2 *user_mode_cmd); 24 - 25 - #endif
+92
drivers/gpu/drm/i915/i915_bo.c
··· 2 2 /* Copyright © 2024 Intel Corporation */ 3 3 4 4 #include <drm/drm_panic.h> 5 + #include <drm/drm_print.h> 5 6 #include <drm/intel/display_parent_interface.h> 6 7 8 + #include "display/intel_fb.h" 7 9 #include "gem/i915_gem_mman.h" 8 10 #include "gem/i915_gem_object.h" 9 11 #include "gem/i915_gem_object_frontbuffer.h" ··· 13 11 14 12 #include "i915_bo.h" 15 13 #include "i915_debugfs.h" 14 + #include "i915_drv.h" 16 15 17 16 static bool i915_bo_is_tiled(struct drm_gem_object *obj) 18 17 { ··· 55 52 i915_debugfs_describe_obj(m, to_intel_bo(obj)); 56 53 } 57 54 55 + static int i915_bo_framebuffer_init(struct drm_gem_object *_obj, 56 + struct drm_mode_fb_cmd2 *mode_cmd) 57 + { 58 + struct drm_i915_gem_object *obj = to_intel_bo(_obj); 59 + struct drm_i915_private *i915 = to_i915(obj->base.dev); 60 + unsigned int tiling, stride; 61 + 62 + i915_gem_object_lock(obj, NULL); 63 + tiling = i915_gem_object_get_tiling(obj); 64 + stride = i915_gem_object_get_stride(obj); 65 + i915_gem_object_unlock(obj); 66 + 67 + if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) { 68 + /* 69 + * If there's a fence, enforce that 70 + * the fb modifier and tiling mode match. 71 + */ 72 + if (tiling != I915_TILING_NONE && 73 + tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) { 74 + drm_dbg_kms(&i915->drm, 75 + "tiling_mode doesn't match fb modifier\n"); 76 + return -EINVAL; 77 + } 78 + } else { 79 + if (tiling == I915_TILING_X) { 80 + mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED; 81 + } else if (tiling == I915_TILING_Y) { 82 + drm_dbg_kms(&i915->drm, 83 + "No Y tiling for legacy addfb\n"); 84 + return -EINVAL; 85 + } 86 + } 87 + 88 + /* 89 + * gen2/3 display engine uses the fence if present, 90 + * so the tiling mode must match the fb modifier exactly. 91 + */ 92 + if (GRAPHICS_VER(i915) < 4 && 93 + tiling != intel_fb_modifier_to_tiling(mode_cmd->modifier[0])) { 94 + drm_dbg_kms(&i915->drm, 95 + "tiling_mode must match fb modifier exactly on gen2/3\n"); 96 + return -EINVAL; 97 + } 98 + 99 + /* 100 + * If there's a fence, enforce that 101 + * the fb pitch and fence stride match. 102 + */ 103 + if (tiling != I915_TILING_NONE && mode_cmd->pitches[0] != stride) { 104 + drm_dbg_kms(&i915->drm, 105 + "pitch (%d) must match tiling stride (%d)\n", 106 + mode_cmd->pitches[0], stride); 107 + return -EINVAL; 108 + } 109 + 110 + return 0; 111 + } 112 + 113 + static void i915_bo_framebuffer_fini(struct drm_gem_object *obj) 114 + { 115 + /* Nothing to do for i915 */ 116 + } 117 + 118 + static struct drm_gem_object * 119 + i915_bo_framebuffer_lookup(struct drm_device *drm, 120 + struct drm_file *filp, 121 + const struct drm_mode_fb_cmd2 *mode_cmd) 122 + { 123 + struct drm_i915_private *i915 = to_i915(drm); 124 + struct drm_i915_gem_object *obj; 125 + 126 + obj = i915_gem_object_lookup(filp, mode_cmd->handles[0]); 127 + if (!obj) 128 + return ERR_PTR(-ENOENT); 129 + 130 + /* object is backed with LMEM for discrete */ 131 + if (HAS_LMEM(i915) && !i915_gem_object_can_migrate(obj, INTEL_REGION_LMEM_0)) { 132 + /* object is "remote", not in local memory */ 133 + i915_gem_object_put(obj); 134 + drm_dbg_kms(&i915->drm, "framebuffer must reside in local memory\n"); 135 + return ERR_PTR(-EREMOTE); 136 + } 137 + 138 + return intel_bo_to_drm_bo(obj); 139 + } 140 + 58 141 const struct intel_display_bo_interface i915_display_bo_interface = { 59 142 .is_tiled = i915_bo_is_tiled, 60 143 .is_userptr = i915_bo_is_userptr, ··· 150 61 .fb_mmap = i915_bo_fb_mmap, 151 62 .read_from_page = i915_bo_read_from_page, 152 63 .describe = i915_bo_describe, 64 + .framebuffer_init = i915_bo_framebuffer_init, 65 + .framebuffer_fini = i915_bo_framebuffer_fini, 66 + .framebuffer_lookup = i915_bo_framebuffer_lookup, 153 67 };
-1
drivers/gpu/drm/xe/Makefile
··· 209 209 210 210 # Display code specific to xe 211 211 xe-$(CONFIG_DRM_XE_DISPLAY) += \ 212 - display/intel_fb_bo.o \ 213 212 display/intel_fbdev_fb.o \ 214 213 display/xe_display.o \ 215 214 display/xe_display_bo.o \
-91
drivers/gpu/drm/xe/display/intel_fb_bo.c
··· 1 - /* SPDX-License-Identifier: MIT */ 2 - /* 3 - * Copyright © 2021 Intel Corporation 4 - */ 5 - 6 - #include <drm/drm_modeset_helper.h> 7 - #include <drm/ttm/ttm_bo.h> 8 - 9 - #include "intel_display_types.h" 10 - #include "intel_fb.h" 11 - #include "intel_fb_bo.h" 12 - #include "xe_bo.h" 13 - 14 - void intel_fb_bo_framebuffer_fini(struct drm_gem_object *obj) 15 - { 16 - struct xe_bo *bo = gem_to_xe_bo(obj); 17 - 18 - if (bo->flags & XE_BO_FLAG_PINNED) { 19 - /* Unpin our kernel fb first */ 20 - xe_bo_lock(bo, false); 21 - xe_bo_unpin(bo); 22 - xe_bo_unlock(bo); 23 - } 24 - xe_bo_put(bo); 25 - } 26 - 27 - int intel_fb_bo_framebuffer_init(struct drm_gem_object *obj, 28 - struct drm_mode_fb_cmd2 *mode_cmd) 29 - { 30 - struct xe_bo *bo = gem_to_xe_bo(obj); 31 - struct xe_device *xe = to_xe_device(bo->ttm.base.dev); 32 - int ret; 33 - 34 - /* 35 - * Some modifiers require physical alignment of 64KiB VRAM pages; 36 - * require that the BO in those cases is created correctly. 37 - */ 38 - if (XE_IOCTL_DBG(xe, intel_fb_needs_64k_phys(mode_cmd->modifier[0]) && 39 - !(bo->flags & XE_BO_FLAG_NEEDS_64K))) 40 - return -EINVAL; 41 - 42 - xe_bo_get(bo); 43 - 44 - ret = ttm_bo_reserve(&bo->ttm, true, false, NULL); 45 - if (ret) 46 - goto err; 47 - 48 - if (!(bo->flags & XE_BO_FLAG_SCANOUT)) { 49 - /* 50 - * XE_BO_FLAG_SCANOUT should ideally be set at creation, or is 51 - * automatically set when creating FB. We cannot change caching 52 - * mode when the bo is VM_BINDed, so we can only set 53 - * coherency with display when unbound. 54 - */ 55 - if (XE_IOCTL_DBG(xe, xe_bo_is_vm_bound(bo))) { 56 - ttm_bo_unreserve(&bo->ttm); 57 - ret = -EINVAL; 58 - goto err; 59 - } 60 - bo->flags |= XE_BO_FLAG_SCANOUT; 61 - } 62 - ttm_bo_unreserve(&bo->ttm); 63 - return 0; 64 - 65 - err: 66 - xe_bo_put(bo); 67 - return ret; 68 - } 69 - 70 - struct drm_gem_object *intel_fb_bo_lookup_valid_bo(struct drm_device *drm, 71 - struct drm_file *filp, 72 - const struct drm_mode_fb_cmd2 *mode_cmd) 73 - { 74 - struct xe_device *xe = to_xe_device(drm); 75 - struct xe_bo *bo; 76 - struct drm_gem_object *gem = drm_gem_object_lookup(filp, mode_cmd->handles[0]); 77 - 78 - if (!gem) 79 - return ERR_PTR(-ENOENT); 80 - 81 - bo = gem_to_xe_bo(gem); 82 - /* Require vram placement or dma-buf import */ 83 - if (IS_DGFX(xe) && 84 - !xe_bo_can_migrate(bo, XE_PL_VRAM0) && 85 - bo->ttm.type != ttm_bo_type_sg) { 86 - drm_gem_object_put(gem); 87 - return ERR_PTR(-EREMOTE); 88 - } 89 - 90 - return gem; 91 - }
+84
drivers/gpu/drm/xe/display/xe_display_bo.c
··· 4 4 #include <drm/drm_gem.h> 5 5 #include <drm/intel/display_parent_interface.h> 6 6 7 + #include "intel_fb.h" 7 8 #include "xe_bo.h" 8 9 #include "xe_display_bo.h" 9 10 #include "xe_pxp.h" ··· 21 20 return xe_bo_read(bo, offset, dst, size); 22 21 } 23 22 23 + static int xe_display_bo_framebuffer_init(struct drm_gem_object *obj, 24 + struct drm_mode_fb_cmd2 *mode_cmd) 25 + { 26 + struct xe_bo *bo = gem_to_xe_bo(obj); 27 + struct xe_device *xe = to_xe_device(bo->ttm.base.dev); 28 + int ret; 29 + 30 + /* 31 + * Some modifiers require physical alignment of 64KiB VRAM pages; 32 + * require that the BO in those cases is created correctly. 33 + */ 34 + if (XE_IOCTL_DBG(xe, intel_fb_needs_64k_phys(mode_cmd->modifier[0]) && 35 + !(bo->flags & XE_BO_FLAG_NEEDS_64K))) 36 + return -EINVAL; 37 + 38 + xe_bo_get(bo); 39 + 40 + ret = ttm_bo_reserve(&bo->ttm, true, false, NULL); 41 + if (ret) 42 + goto err; 43 + 44 + if (!(bo->flags & XE_BO_FLAG_SCANOUT)) { 45 + /* 46 + * XE_BO_FLAG_SCANOUT should ideally be set at creation, or is 47 + * automatically set when creating FB. We cannot change caching 48 + * mode when the bo is VM_BINDed, so we can only set 49 + * coherency with display when unbound. 50 + */ 51 + if (XE_IOCTL_DBG(xe, xe_bo_is_vm_bound(bo))) { 52 + ttm_bo_unreserve(&bo->ttm); 53 + ret = -EINVAL; 54 + goto err; 55 + } 56 + bo->flags |= XE_BO_FLAG_SCANOUT; 57 + } 58 + ttm_bo_unreserve(&bo->ttm); 59 + return 0; 60 + 61 + err: 62 + xe_bo_put(bo); 63 + return ret; 64 + } 65 + 66 + static void xe_display_bo_framebuffer_fini(struct drm_gem_object *obj) 67 + { 68 + struct xe_bo *bo = gem_to_xe_bo(obj); 69 + 70 + if (bo->flags & XE_BO_FLAG_PINNED) { 71 + /* Unpin our kernel fb first */ 72 + xe_bo_lock(bo, false); 73 + xe_bo_unpin(bo); 74 + xe_bo_unlock(bo); 75 + } 76 + xe_bo_put(bo); 77 + } 78 + 79 + static struct drm_gem_object * 80 + xe_display_bo_framebuffer_lookup(struct drm_device *drm, 81 + struct drm_file *filp, 82 + const struct drm_mode_fb_cmd2 *mode_cmd) 83 + { 84 + struct xe_device *xe = to_xe_device(drm); 85 + struct xe_bo *bo; 86 + struct drm_gem_object *gem = drm_gem_object_lookup(filp, mode_cmd->handles[0]); 87 + 88 + if (!gem) 89 + return ERR_PTR(-ENOENT); 90 + 91 + bo = gem_to_xe_bo(gem); 92 + /* Require vram placement or dma-buf import */ 93 + if (IS_DGFX(xe) && 94 + !xe_bo_can_migrate(bo, XE_PL_VRAM0) && 95 + bo->ttm.type != ttm_bo_type_sg) { 96 + drm_gem_object_put(gem); 97 + return ERR_PTR(-EREMOTE); 98 + } 99 + 100 + return gem; 101 + } 102 + 24 103 const struct intel_display_bo_interface xe_display_bo_interface = { 25 104 .is_protected = xe_display_bo_is_protected, 26 105 .key_check = xe_pxp_obj_key_check, 27 106 .fb_mmap = drm_gem_prime_mmap, 28 107 .read_from_page = xe_display_bo_read_from_page, 108 + .framebuffer_init = xe_display_bo_framebuffer_init, 109 + .framebuffer_fini = xe_display_bo_framebuffer_fini, 110 + .framebuffer_lookup = xe_display_bo_framebuffer_lookup, 29 111 };
+6
include/drm/intel/display_parent_interface.h
··· 12 12 struct drm_file; 13 13 struct drm_framebuffer; 14 14 struct drm_gem_object; 15 + struct drm_mode_fb_cmd2; 15 16 struct drm_plane_state; 16 17 struct drm_scanout_buffer; 17 18 struct i915_vma; ··· 38 37 int (*fb_mmap)(struct drm_gem_object *obj, struct vm_area_struct *vma); 39 38 int (*read_from_page)(struct drm_gem_object *obj, u64 offset, void *dst, int size); 40 39 void (*describe)(struct seq_file *m, struct drm_gem_object *obj); /* Optional */ 40 + int (*framebuffer_init)(struct drm_gem_object *obj, struct drm_mode_fb_cmd2 *mode_cmd); 41 + void (*framebuffer_fini)(struct drm_gem_object *obj); 42 + struct drm_gem_object *(*framebuffer_lookup)(struct drm_device *drm, 43 + struct drm_file *filp, 44 + const struct drm_mode_fb_cmd2 *user_mode_cmd); 41 45 }; 42 46 43 47 struct intel_display_dpt_interface {