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}/frontbuffer: move frontbuffer handling to parent interface

Move the get/put/ref/flush_for_display calls to the display parent
interface.

For i915, move the hooks next to the other i915 core frontbuffer code in
i915_gem_object_frontbuffer.c. For xe, add new file xe_frontbuffer.c for
the same.

Note: The intel_frontbuffer_flush() calls from
i915_gem_object_frontbuffer.c will partially route back to i915 core via
the parent interface. This is less than stellar.

Reviewed-by: Jouni Högander <jouni.hogander@intel.com>
Link: https://patch.msgid.link/f69b967ed82bbcfd60ffa77ba197b26a1399f09f.1772475391.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>

+178 -102
-36
drivers/gpu/drm/i915/display/intel_bo.c
··· 45 45 return i915_gem_object_read_from_page(to_intel_bo(obj), offset, dst, size); 46 46 } 47 47 48 - struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *_obj) 49 - { 50 - struct drm_i915_gem_object *obj = to_intel_bo(_obj); 51 - struct i915_frontbuffer *front; 52 - 53 - front = i915_gem_object_frontbuffer_get(obj); 54 - if (!front) 55 - return NULL; 56 - 57 - return &front->base; 58 - } 59 - 60 - void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front) 61 - { 62 - struct i915_frontbuffer *front = 63 - container_of(_front, typeof(*front), base); 64 - 65 - i915_gem_object_frontbuffer_ref(front); 66 - } 67 - 68 - void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front) 69 - { 70 - struct i915_frontbuffer *front = 71 - container_of(_front, typeof(*front), base); 72 - 73 - return i915_gem_object_frontbuffer_put(front); 74 - } 75 - 76 - void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *_front) 77 - { 78 - struct i915_frontbuffer *front = 79 - container_of(_front, typeof(*front), base); 80 - 81 - i915_gem_object_flush_if_display(front->obj); 82 - } 83 - 84 48 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj) 85 49 { 86 50 i915_debugfs_describe_obj(m, to_intel_bo(obj));
-5
drivers/gpu/drm/i915/display/intel_bo.h
··· 20 20 int intel_bo_fb_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); 21 21 int intel_bo_read_from_page(struct drm_gem_object *obj, u64 offset, void *dst, int size); 22 22 23 - struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj); 24 - void intel_bo_frontbuffer_ref(struct intel_frontbuffer *front); 25 - void intel_bo_frontbuffer_put(struct intel_frontbuffer *front); 26 - void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front); 27 - 28 23 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj); 29 24 30 25 #endif /* __INTEL_BO__ */
+7 -5
drivers/gpu/drm/i915/display/intel_frontbuffer.c
··· 58 58 #include <drm/drm_gem.h> 59 59 #include <drm/drm_print.h> 60 60 61 - #include "intel_bo.h" 62 61 #include "intel_display_trace.h" 63 62 #include "intel_display_types.h" 64 63 #include "intel_dp.h" 65 64 #include "intel_drrs.h" 66 65 #include "intel_fbc.h" 67 66 #include "intel_frontbuffer.h" 67 + #include "intel_parent.h" 68 68 #include "intel_psr.h" 69 69 #include "intel_tdf.h" 70 70 ··· 150 150 struct intel_display *display = front->display; 151 151 152 152 if (origin == ORIGIN_DIRTYFB) 153 - intel_bo_frontbuffer_flush_for_display(front); 153 + intel_parent_frontbuffer_flush_for_display(display, front); 154 154 155 155 if (origin == ORIGIN_CS) { 156 156 spin_lock(&display->fb_tracking.lock); ··· 166 166 167 167 static void intel_frontbuffer_ref(struct intel_frontbuffer *front) 168 168 { 169 - intel_bo_frontbuffer_ref(front); 169 + intel_parent_frontbuffer_ref(front->display, front); 170 170 } 171 171 172 172 static void intel_frontbuffer_flush_work(struct work_struct *work) ··· 209 209 210 210 struct intel_frontbuffer *intel_frontbuffer_get(struct drm_gem_object *obj) 211 211 { 212 - return intel_bo_frontbuffer_get(obj); 212 + struct intel_display *display = to_intel_display(obj->dev); 213 + 214 + return intel_parent_frontbuffer_get(display, obj); 213 215 } 214 216 215 217 void intel_frontbuffer_put(struct intel_frontbuffer *front) 216 218 { 217 - intel_bo_frontbuffer_put(front); 219 + intel_parent_frontbuffer_put(front->display, front); 218 220 } 219 221 220 222 /**
+21
drivers/gpu/drm/i915/display/intel_parent.c
··· 51 51 display->parent->dpt->resume(dpt); 52 52 } 53 53 54 + /* frontbuffer */ 55 + struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj) 56 + { 57 + return display->parent->frontbuffer->get(obj); 58 + } 59 + 60 + void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front) 61 + { 62 + display->parent->frontbuffer->ref(front); 63 + } 64 + 65 + void intel_parent_frontbuffer_put(struct intel_display *display, struct intel_frontbuffer *front) 66 + { 67 + display->parent->frontbuffer->put(front); 68 + } 69 + 70 + void intel_parent_frontbuffer_flush_for_display(struct intel_display *display, struct intel_frontbuffer *front) 71 + { 72 + display->parent->frontbuffer->flush_for_display(front); 73 + } 74 + 54 75 /* hdcp */ 55 76 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display, 56 77 struct intel_hdcp_gsc_context *gsc_context,
+7
drivers/gpu/drm/i915/display/intel_parent.h
··· 13 13 struct i915_vma; 14 14 struct intel_display; 15 15 struct intel_dpt; 16 + struct intel_frontbuffer; 16 17 struct intel_hdcp_gsc_context; 17 18 struct intel_panic; 18 19 struct intel_stolen_node; ··· 24 23 void intel_parent_dpt_destroy(struct intel_display *display, struct intel_dpt *dpt); 25 24 void intel_parent_dpt_suspend(struct intel_display *display, struct intel_dpt *dpt); 26 25 void intel_parent_dpt_resume(struct intel_display *display, struct intel_dpt *dpt); 26 + 27 + /* frontbuffer */ 28 + struct intel_frontbuffer *intel_parent_frontbuffer_get(struct intel_display *display, struct drm_gem_object *obj); 29 + void intel_parent_frontbuffer_ref(struct intel_display *display, struct intel_frontbuffer *front); 30 + void intel_parent_frontbuffer_put(struct intel_display *display, struct intel_frontbuffer *front); 31 + void intel_parent_frontbuffer_flush_for_display(struct intel_display *display, struct intel_frontbuffer *front); 27 32 28 33 /* hdcp */ 29 34 ssize_t intel_parent_hdcp_gsc_msg_send(struct intel_display *display,
+45
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.c
··· 1 1 // SPDX-License-Identifier: MIT 2 2 /* Copyright © 2025 Intel Corporation */ 3 3 4 + #include <drm/intel/display_parent_interface.h> 5 + 4 6 #include "i915_drv.h" 5 7 #include "i915_gem_object_frontbuffer.h" 6 8 ··· 127 125 i915_gem_object_frontbuffer_put(front); 128 126 } 129 127 } 128 + 129 + static struct intel_frontbuffer *i915_frontbuffer_get(struct drm_gem_object *_obj) 130 + { 131 + struct drm_i915_gem_object *obj = to_intel_bo(_obj); 132 + struct i915_frontbuffer *front; 133 + 134 + front = i915_gem_object_frontbuffer_get(obj); 135 + if (!front) 136 + return NULL; 137 + 138 + return &front->base; 139 + } 140 + 141 + static void i915_frontbuffer_ref(struct intel_frontbuffer *_front) 142 + { 143 + struct i915_frontbuffer *front = 144 + container_of(_front, typeof(*front), base); 145 + 146 + i915_gem_object_frontbuffer_ref(front); 147 + } 148 + 149 + static void i915_frontbuffer_put(struct intel_frontbuffer *_front) 150 + { 151 + struct i915_frontbuffer *front = 152 + container_of(_front, typeof(*front), base); 153 + 154 + return i915_gem_object_frontbuffer_put(front); 155 + } 156 + 157 + static void i915_frontbuffer_flush_for_display(struct intel_frontbuffer *_front) 158 + { 159 + struct i915_frontbuffer *front = 160 + container_of(_front, typeof(*front), base); 161 + 162 + i915_gem_object_flush_if_display(front->obj); 163 + } 164 + 165 + const struct intel_display_frontbuffer_interface i915_display_frontbuffer_interface = { 166 + .get = i915_frontbuffer_get, 167 + .ref = i915_frontbuffer_ref, 168 + .put = i915_frontbuffer_put, 169 + .flush_for_display = i915_frontbuffer_flush_for_display, 170 + };
+2
drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h
··· 91 91 return front; 92 92 } 93 93 94 + extern const struct intel_display_frontbuffer_interface i915_display_frontbuffer_interface; 95 + 94 96 #endif
+2
drivers/gpu/drm/i915/i915_driver.c
··· 78 78 #include "gem/i915_gem_dmabuf.h" 79 79 #include "gem/i915_gem_ioctls.h" 80 80 #include "gem/i915_gem_mman.h" 81 + #include "gem/i915_gem_object_frontbuffer.h" 81 82 #include "gem/i915_gem_pm.h" 82 83 #include "gt/intel_gt.h" 83 84 #include "gt/intel_gt_pm.h" ··· 767 766 static const struct intel_display_parent_interface parent = { 768 767 .dpt = &i915_display_dpt_interface, 769 768 .dsb = &i915_display_dsb_interface, 769 + .frontbuffer = &i915_display_frontbuffer_interface, 770 770 .hdcp = &i915_display_hdcp_interface, 771 771 .initial_plane = &i915_display_initial_plane_interface, 772 772 .irq = &i915_display_irq_interface,
+1
drivers/gpu/drm/xe/Makefile
··· 218 218 display/xe_display_wa.o \ 219 219 display/xe_dsb_buffer.o \ 220 220 display/xe_fb_pin.o \ 221 + display/xe_frontbuffer.o \ 221 222 display/xe_hdcp_gsc.o \ 222 223 display/xe_initial_plane.o \ 223 224 display/xe_panic.o \
-56
drivers/gpu/drm/xe/display/intel_bo.c
··· 47 47 return xe_bo_read(bo, offset, dst, size); 48 48 } 49 49 50 - struct xe_frontbuffer { 51 - struct intel_frontbuffer base; 52 - struct drm_gem_object *obj; 53 - struct kref ref; 54 - }; 55 - 56 - struct intel_frontbuffer *intel_bo_frontbuffer_get(struct drm_gem_object *obj) 57 - { 58 - struct xe_frontbuffer *front; 59 - 60 - front = kmalloc_obj(*front); 61 - if (!front) 62 - return NULL; 63 - 64 - intel_frontbuffer_init(&front->base, obj->dev); 65 - 66 - kref_init(&front->ref); 67 - 68 - drm_gem_object_get(obj); 69 - front->obj = obj; 70 - 71 - return &front->base; 72 - } 73 - 74 - void intel_bo_frontbuffer_ref(struct intel_frontbuffer *_front) 75 - { 76 - struct xe_frontbuffer *front = 77 - container_of(_front, typeof(*front), base); 78 - 79 - kref_get(&front->ref); 80 - } 81 - 82 - static void frontbuffer_release(struct kref *ref) 83 - { 84 - struct xe_frontbuffer *front = 85 - container_of(ref, typeof(*front), ref); 86 - 87 - intel_frontbuffer_fini(&front->base); 88 - 89 - drm_gem_object_put(front->obj); 90 - 91 - kfree(front); 92 - } 93 - 94 - void intel_bo_frontbuffer_put(struct intel_frontbuffer *_front) 95 - { 96 - struct xe_frontbuffer *front = 97 - container_of(_front, typeof(*front), base); 98 - 99 - kref_put(&front->ref, frontbuffer_release); 100 - } 101 - 102 - void intel_bo_frontbuffer_flush_for_display(struct intel_frontbuffer *front) 103 - { 104 - } 105 - 106 50 void intel_bo_describe(struct seq_file *m, struct drm_gem_object *obj) 107 51 { 108 52 /* FIXME */
+2
drivers/gpu/drm/xe/display/xe_display.c
··· 38 38 #include "xe_display_pcode.h" 39 39 #include "xe_display_rpm.h" 40 40 #include "xe_dsb_buffer.h" 41 + #include "xe_frontbuffer.h" 41 42 #include "xe_hdcp_gsc.h" 42 43 #include "xe_initial_plane.h" 43 44 #include "xe_module.h" ··· 542 541 543 542 static const struct intel_display_parent_interface parent = { 544 543 .dsb = &xe_display_dsb_interface, 544 + .frontbuffer = &xe_display_frontbuffer_interface, 545 545 .hdcp = &xe_display_hdcp_interface, 546 546 .initial_plane = &xe_display_initial_plane_interface, 547 547 .irq = &xe_display_irq_interface,
+71
drivers/gpu/drm/xe/display/xe_frontbuffer.c
··· 1 + // SPDX-License-Identifier: MIT 2 + /* Copyright © 2026 Intel Corporation */ 3 + 4 + #include <drm/drm_gem.h> 5 + #include <drm/intel/display_parent_interface.h> 6 + 7 + #include "intel_frontbuffer.h" 8 + #include "xe_frontbuffer.h" 9 + 10 + struct xe_frontbuffer { 11 + struct intel_frontbuffer base; 12 + struct drm_gem_object *obj; 13 + struct kref ref; 14 + }; 15 + 16 + static struct intel_frontbuffer *xe_frontbuffer_get(struct drm_gem_object *obj) 17 + { 18 + struct xe_frontbuffer *front; 19 + 20 + front = kmalloc_obj(*front); 21 + if (!front) 22 + return NULL; 23 + 24 + intel_frontbuffer_init(&front->base, obj->dev); 25 + 26 + kref_init(&front->ref); 27 + 28 + drm_gem_object_get(obj); 29 + front->obj = obj; 30 + 31 + return &front->base; 32 + } 33 + 34 + static void xe_frontbuffer_ref(struct intel_frontbuffer *_front) 35 + { 36 + struct xe_frontbuffer *front = 37 + container_of(_front, typeof(*front), base); 38 + 39 + kref_get(&front->ref); 40 + } 41 + 42 + static void frontbuffer_release(struct kref *ref) 43 + { 44 + struct xe_frontbuffer *front = 45 + container_of(ref, typeof(*front), ref); 46 + 47 + intel_frontbuffer_fini(&front->base); 48 + 49 + drm_gem_object_put(front->obj); 50 + 51 + kfree(front); 52 + } 53 + 54 + static void xe_frontbuffer_put(struct intel_frontbuffer *_front) 55 + { 56 + struct xe_frontbuffer *front = 57 + container_of(_front, typeof(*front), base); 58 + 59 + kref_put(&front->ref, frontbuffer_release); 60 + } 61 + 62 + static void xe_frontbuffer_flush_for_display(struct intel_frontbuffer *front) 63 + { 64 + } 65 + 66 + const struct intel_display_frontbuffer_interface xe_display_frontbuffer_interface = { 67 + .get = xe_frontbuffer_get, 68 + .ref = xe_frontbuffer_ref, 69 + .put = xe_frontbuffer_put, 70 + .flush_for_display = xe_frontbuffer_flush_for_display, 71 + };
+9
drivers/gpu/drm/xe/display/xe_frontbuffer.h
··· 1 + /* SPDX-License-Identifier: MIT */ 2 + /* Copyright © 2026 Intel Corporation */ 3 + 4 + #ifndef _XE_FRONTBUFFER_H_ 5 + #define _XE_FRONTBUFFER_H_ 6 + 7 + extern const struct intel_display_frontbuffer_interface xe_display_frontbuffer_interface; 8 + 9 + #endif
+11
include/drm/intel/display_parent_interface.h
··· 17 17 struct i915_vma; 18 18 struct intel_dpt; 19 19 struct intel_dsb_buffer; 20 + struct intel_frontbuffer; 20 21 struct intel_hdcp_gsc_context; 21 22 struct intel_initial_plane_config; 22 23 struct intel_panic; ··· 41 40 struct intel_dsb_buffer *(*create)(struct drm_device *drm, size_t size); 42 41 void (*cleanup)(struct intel_dsb_buffer *dsb_buf); 43 42 void (*flush_map)(struct intel_dsb_buffer *dsb_buf); 43 + }; 44 + 45 + struct intel_display_frontbuffer_interface { 46 + struct intel_frontbuffer *(*get)(struct drm_gem_object *obj); 47 + void (*ref)(struct intel_frontbuffer *front); 48 + void (*put)(struct intel_frontbuffer *front); 49 + void (*flush_for_display)(struct intel_frontbuffer *front); 44 50 }; 45 51 46 52 struct intel_display_hdcp_interface { ··· 179 171 180 172 /** @dsb: DSB buffer interface */ 181 173 const struct intel_display_dsb_interface *dsb; 174 + 175 + /** @frontbuffer: Frontbuffer interface */ 176 + const struct intel_display_frontbuffer_interface *frontbuffer; 182 177 183 178 /** @hdcp: HDCP GSC interface */ 184 179 const struct intel_display_hdcp_interface *hdcp;