/*
|
* Copyright (C) 2012-2017 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
|