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