1 /* Public domain. */
2 
3 #include <linux/kernel.h>
4 
5 #include <drm/drm_plane.h>
6 #include <drm/drm_framebuffer.h>
7 #include <drm/drm_atomic_uapi.h>
8 #include <drm/drm_gem.h>
9 #include <linux/dma-resv.h>
10 
11 int
12 drm_gem_plane_helper_prepare_fb(struct drm_plane *dp,
13     struct drm_plane_state *dps)
14 {
15 	struct drm_gem_object *obj;
16 	struct dma_fence *f;
17 	int r;
18 
19 	if (dps->fb != NULL) {
20 		obj = dps->fb->obj[0];
21 		if (obj == NULL)
22 			return -EINVAL;
23 		if (dps->fence) {
24 			printf("%s: explicit fence not handled\n", __func__);
25 			return -EINVAL;
26 		}
27 		r = dma_resv_get_singleton(obj->resv, DMA_RESV_USAGE_WRITE, &f);
28 		if (r)
29 			return r;
30 		dps->fence = f;
31 	}
32 
33 	return 0;
34 }
35