1e9083420SDave Airlie /* 2e9083420SDave Airlie * Copyright © 2017 Red Hat 3e9083420SDave Airlie * 4e9083420SDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 5e9083420SDave Airlie * copy of this software and associated documentation files (the "Software"), 6e9083420SDave Airlie * to deal in the Software without restriction, including without limitation 7e9083420SDave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8e9083420SDave Airlie * and/or sell copies of the Software, and to permit persons to whom the 9e9083420SDave Airlie * Software is furnished to do so, subject to the following conditions: 10e9083420SDave Airlie * 11e9083420SDave Airlie * The above copyright notice and this permission notice (including the next 12e9083420SDave Airlie * paragraph) shall be included in all copies or substantial portions of the 13e9083420SDave Airlie * Software. 14e9083420SDave Airlie * 15e9083420SDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16e9083420SDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17e9083420SDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18e9083420SDave Airlie * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19e9083420SDave Airlie * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20e9083420SDave Airlie * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21e9083420SDave Airlie * IN THE SOFTWARE. 22e9083420SDave Airlie * 23e9083420SDave Airlie * Authors: 24e9083420SDave Airlie * 25e9083420SDave Airlie */ 26e9083420SDave Airlie #ifndef __DRM_SYNCOBJ_H__ 27e9083420SDave Airlie #define __DRM_SYNCOBJ_H__ 28e9083420SDave Airlie 29e9083420SDave Airlie #include "linux/dma-fence.h" 30e9083420SDave Airlie 31e9083420SDave Airlie /** 32e9083420SDave Airlie * struct drm_syncobj - sync object. 33e9083420SDave Airlie * 34e9083420SDave Airlie * This structure defines a generic sync object which wraps a dma fence. 35e9083420SDave Airlie */ 36e9083420SDave Airlie struct drm_syncobj { 37e9083420SDave Airlie /** 38e9083420SDave Airlie * @refcount: 39e9083420SDave Airlie * 40e9083420SDave Airlie * Reference count of this object. 41e9083420SDave Airlie */ 42e9083420SDave Airlie struct kref refcount; 43e9083420SDave Airlie /** 44e9083420SDave Airlie * @fence: 45e9083420SDave Airlie * NULL or a pointer to the fence bound to this object. 46e9083420SDave Airlie */ 47e9083420SDave Airlie struct dma_fence *fence; 48e9083420SDave Airlie /** 49e9083420SDave Airlie * @file: 50e9083420SDave Airlie * a file backing for this syncobj. 51e9083420SDave Airlie */ 52e9083420SDave Airlie struct file *file; 53e9083420SDave Airlie }; 54e9083420SDave Airlie 55e9083420SDave Airlie void drm_syncobj_free(struct kref *kref); 56e9083420SDave Airlie 57e9083420SDave Airlie /** 58e9083420SDave Airlie * drm_syncobj_get - acquire a syncobj reference 59e9083420SDave Airlie * @obj: sync object 60e9083420SDave Airlie * 61e9083420SDave Airlie * This acquires additional reference to @obj. It is illegal to call this 62e9083420SDave Airlie * without already holding a reference. No locks required. 63e9083420SDave Airlie */ 64e9083420SDave Airlie static inline void 65e9083420SDave Airlie drm_syncobj_get(struct drm_syncobj *obj) 66e9083420SDave Airlie { 67e9083420SDave Airlie kref_get(&obj->refcount); 68e9083420SDave Airlie } 69e9083420SDave Airlie 70e9083420SDave Airlie /** 71e9083420SDave Airlie * drm_syncobj_put - release a reference to a sync object. 72e9083420SDave Airlie * @obj: sync object. 73e9083420SDave Airlie */ 74e9083420SDave Airlie static inline void 75e9083420SDave Airlie drm_syncobj_put(struct drm_syncobj *obj) 76e9083420SDave Airlie { 77e9083420SDave Airlie kref_put(&obj->refcount, drm_syncobj_free); 78e9083420SDave Airlie } 79e9083420SDave Airlie 80*309a5482SJason Ekstrand static inline struct dma_fence * 81*309a5482SJason Ekstrand drm_syncobj_fence_get(struct drm_syncobj *syncobj) 82*309a5482SJason Ekstrand { 83*309a5482SJason Ekstrand struct dma_fence *fence; 84*309a5482SJason Ekstrand 85*309a5482SJason Ekstrand rcu_read_lock(); 86*309a5482SJason Ekstrand fence = dma_fence_get_rcu_safe(&syncobj->fence); 87*309a5482SJason Ekstrand rcu_read_unlock(); 88*309a5482SJason Ekstrand 89*309a5482SJason Ekstrand return fence; 90*309a5482SJason Ekstrand } 91*309a5482SJason Ekstrand 92e9083420SDave Airlie struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private, 93e9083420SDave Airlie u32 handle); 9400fc2c26SChris Wilson void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, 95e9083420SDave Airlie struct dma_fence *fence); 96afaf5923SJason Ekstrand int drm_syncobj_find_fence(struct drm_file *file_private, 97e9083420SDave Airlie u32 handle, 98e9083420SDave Airlie struct dma_fence **fence); 99e9083420SDave Airlie void drm_syncobj_free(struct kref *kref); 100e9083420SDave Airlie 101e9083420SDave Airlie #endif 102