| /* |
| * Copyright (C) 2012-2016 ARM Limited. All rights reserved. |
| * |
| * This program is free software and is provided to you under the terms of the GNU General Public License version 2 |
| * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. |
| * |
| * A copy of the licence is included with the program, and can also be obtained from Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| */ |
| |
| /** |
| * @file mali_dma_fence.h |
| * |
| * Mali interface for Linux dma buf fence objects. |
| */ |
| |
| #ifndef _MALI_DMA_FENCE_H_ |
| #define _MALI_DMA_FENCE_H_ |
| |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) |
| #include <linux/dma-fence.h> |
| #else |
| #include <linux/fence.h> |
| #endif |
| #include <linux/reservation.h> |
| #endif |
| |
| struct mali_dma_fence_context; |
| |
| /* The mali dma fence context callback function */ |
| typedef void (*mali_dma_fence_context_callback_func_t)(void *pp_job_ptr); |
| |
| struct mali_dma_fence_waiter { |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) |
| struct dma_fence *fence; |
| struct dma_fence_cb base; |
| #else |
| struct fence_cb base; |
| struct fence *fence; |
| #endif |
| struct mali_dma_fence_context *parent; |
| }; |
| |
| struct mali_dma_fence_context { |
| struct work_struct work_handle; |
| struct mali_dma_fence_waiter **mali_dma_fence_waiters; |
| u32 num_dma_fence_waiter; |
| atomic_t count; |
| void *pp_job_ptr; /* the mali pp job pointer */; |
| mali_dma_fence_context_callback_func_t cb_func; |
| }; |
| |
| /* Create a dma fence |
| * @param context The execution context this fence is run on |
| * @param seqno A linearly increasing sequence number for this context |
| * @return the new dma fence if success, or NULL on failure. |
| */ |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) |
| struct dma_fence *mali_dma_fence_new(u32 context, u32 seqno); |
| #else |
| struct fence *mali_dma_fence_new(u32 context, u32 seqno); |
| #endif |
| /* Signal and put dma fence |
| * @param fence The dma fence to signal and put |
| */ |
| #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0) |
| void mali_dma_fence_signal_and_put(struct dma_fence **fence); |
| #else |
| void mali_dma_fence_signal_and_put(struct fence **fence); |
| #endif |
| /** |
| * Initialize a mali dma fence context for pp job. |
| * @param dma_fence_context The mali dma fence context to initialize. |
| * @param cb_func The dma fence context callback function to call when all dma fence release. |
| * @param pp_job_ptr The pp_job to call function with. |
| */ |
| void mali_dma_fence_context_init(struct mali_dma_fence_context *dma_fence_context, |
| mali_dma_fence_context_callback_func_t cb_func, |
| void *pp_job_ptr); |
| |
| /** |
| * Add new mali dma fence waiter into mali dma fence context |
| * @param dma_fence_context The mali dma fence context |
| * @param dma_reservation_object the reservation object to create new mali dma fence waiters |
| * @return _MALI_OSK_ERR_OK if success, or not. |
| */ |
| _mali_osk_errcode_t mali_dma_fence_context_add_waiters(struct mali_dma_fence_context *dma_fence_context, |
| struct reservation_object *dma_reservation_object); |
| |
| /** |
| * Release the dma fence context |
| * @param dma_fence_text The mali dma fence context. |
| */ |
| void mali_dma_fence_context_term(struct mali_dma_fence_context *dma_fence_context); |
| |
| /** |
| * Decrease the dma fence context atomic count |
| * @param dma_fence_text The mali dma fence context. |
| */ |
| void mali_dma_fence_context_dec_count(struct mali_dma_fence_context *dma_fence_context); |
| |
| /** |
| * Get all reservation object |
| * @param dma_reservation_object The reservation object to add into the reservation object list |
| * @param dma_reservation_object_list The reservation object list to store all reservation object |
| * @param num_dma_reservation_object The number of all reservation object |
| */ |
| void mali_dma_fence_add_reservation_object_list(struct reservation_object *dma_reservation_object, |
| struct reservation_object **dma_reservation_object_list, |
| u32 *num_dma_reservation_object); |
| |
| /** |
| * Wait/wound mutex lock to lock all reservation object. |
| */ |
| int mali_dma_fence_lock_reservation_object_list(struct reservation_object **dma_reservation_object_list, |
| u32 num_dma_reservation_object, struct ww_acquire_ctx *ww_actx); |
| |
| /** |
| * Wait/wound mutex lock to unlock all reservation object. |
| */ |
| void mali_dma_fence_unlock_reservation_object_list(struct reservation_object **dma_reservation_object_list, |
| u32 num_dma_reservation_object, struct ww_acquire_ctx *ww_actx); |
| #endif |