xref: /linux/drivers/gpu/drm/xe/display/xe_frontbuffer.c (revision 4a57e0913e8c7fff407e97909f4ae48caa84d612)
1*2cca2516SJani Nikula // SPDX-License-Identifier: MIT
2*2cca2516SJani Nikula /* Copyright © 2026 Intel Corporation */
3*2cca2516SJani Nikula 
4*2cca2516SJani Nikula #include <drm/drm_gem.h>
5*2cca2516SJani Nikula #include <drm/intel/display_parent_interface.h>
6*2cca2516SJani Nikula 
7*2cca2516SJani Nikula #include "intel_frontbuffer.h"
8*2cca2516SJani Nikula #include "xe_frontbuffer.h"
9*2cca2516SJani Nikula 
10*2cca2516SJani Nikula struct xe_frontbuffer {
11*2cca2516SJani Nikula 	struct intel_frontbuffer base;
12*2cca2516SJani Nikula 	struct drm_gem_object *obj;
13*2cca2516SJani Nikula 	struct kref ref;
14*2cca2516SJani Nikula };
15*2cca2516SJani Nikula 
16*2cca2516SJani Nikula static struct intel_frontbuffer *xe_frontbuffer_get(struct drm_gem_object *obj)
17*2cca2516SJani Nikula {
18*2cca2516SJani Nikula 	struct xe_frontbuffer *front;
19*2cca2516SJani Nikula 
20*2cca2516SJani Nikula 	front = kmalloc_obj(*front);
21*2cca2516SJani Nikula 	if (!front)
22*2cca2516SJani Nikula 		return NULL;
23*2cca2516SJani Nikula 
24*2cca2516SJani Nikula 	intel_frontbuffer_init(&front->base, obj->dev);
25*2cca2516SJani Nikula 
26*2cca2516SJani Nikula 	kref_init(&front->ref);
27*2cca2516SJani Nikula 
28*2cca2516SJani Nikula 	drm_gem_object_get(obj);
29*2cca2516SJani Nikula 	front->obj = obj;
30*2cca2516SJani Nikula 
31*2cca2516SJani Nikula 	return &front->base;
32*2cca2516SJani Nikula }
33*2cca2516SJani Nikula 
34*2cca2516SJani Nikula static void xe_frontbuffer_ref(struct intel_frontbuffer *_front)
35*2cca2516SJani Nikula {
36*2cca2516SJani Nikula 	struct xe_frontbuffer *front =
37*2cca2516SJani Nikula 		container_of(_front, typeof(*front), base);
38*2cca2516SJani Nikula 
39*2cca2516SJani Nikula 	kref_get(&front->ref);
40*2cca2516SJani Nikula }
41*2cca2516SJani Nikula 
42*2cca2516SJani Nikula static void frontbuffer_release(struct kref *ref)
43*2cca2516SJani Nikula {
44*2cca2516SJani Nikula 	struct xe_frontbuffer *front =
45*2cca2516SJani Nikula 		container_of(ref, typeof(*front), ref);
46*2cca2516SJani Nikula 
47*2cca2516SJani Nikula 	intel_frontbuffer_fini(&front->base);
48*2cca2516SJani Nikula 
49*2cca2516SJani Nikula 	drm_gem_object_put(front->obj);
50*2cca2516SJani Nikula 
51*2cca2516SJani Nikula 	kfree(front);
52*2cca2516SJani Nikula }
53*2cca2516SJani Nikula 
54*2cca2516SJani Nikula static void xe_frontbuffer_put(struct intel_frontbuffer *_front)
55*2cca2516SJani Nikula {
56*2cca2516SJani Nikula 	struct xe_frontbuffer *front =
57*2cca2516SJani Nikula 		container_of(_front, typeof(*front), base);
58*2cca2516SJani Nikula 
59*2cca2516SJani Nikula 	kref_put(&front->ref, frontbuffer_release);
60*2cca2516SJani Nikula }
61*2cca2516SJani Nikula 
62*2cca2516SJani Nikula static void xe_frontbuffer_flush_for_display(struct intel_frontbuffer *front)
63*2cca2516SJani Nikula {
64*2cca2516SJani Nikula }
65*2cca2516SJani Nikula 
66*2cca2516SJani Nikula const struct intel_display_frontbuffer_interface xe_display_frontbuffer_interface = {
67*2cca2516SJani Nikula 	.get = xe_frontbuffer_get,
68*2cca2516SJani Nikula 	.ref = xe_frontbuffer_ref,
69*2cca2516SJani Nikula 	.put = xe_frontbuffer_put,
70*2cca2516SJani Nikula 	.flush_for_display = xe_frontbuffer_flush_for_display,
71*2cca2516SJani Nikula };
72