162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR MIT */
262306a36Sopenharmony_ci/**************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright 2011-2012 VMware, Inc., Palo Alto, CA., USA
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
762306a36Sopenharmony_ci * copy of this software and associated documentation files (the
862306a36Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
962306a36Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
1062306a36Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
1162306a36Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
1262306a36Sopenharmony_ci * the following conditions:
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * The above copyright notice and this permission notice (including the
1562306a36Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
1662306a36Sopenharmony_ci * of the Software.
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1962306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2062306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
2162306a36Sopenharmony_ci * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
2262306a36Sopenharmony_ci * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
2362306a36Sopenharmony_ci * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
2462306a36Sopenharmony_ci * USE OR OTHER DEALINGS IN THE SOFTWARE.
2562306a36Sopenharmony_ci *
2662306a36Sopenharmony_ci **************************************************************************/
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#ifndef _VMWGFX_FENCE_H_
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include <linux/dma-fence.h>
3162306a36Sopenharmony_ci#include <linux/dma-fence-array.h>
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define VMW_FENCE_WAIT_TIMEOUT (5*HZ)
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct drm_device;
3662306a36Sopenharmony_cistruct drm_file;
3762306a36Sopenharmony_cistruct drm_pending_event;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct vmw_private;
4062306a36Sopenharmony_cistruct vmw_fence_manager;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/**
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci *
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_cienum vmw_action_type {
4762306a36Sopenharmony_ci	VMW_ACTION_EVENT = 0,
4862306a36Sopenharmony_ci	VMW_ACTION_MAX
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistruct vmw_fence_action {
5262306a36Sopenharmony_ci	struct list_head head;
5362306a36Sopenharmony_ci	enum vmw_action_type type;
5462306a36Sopenharmony_ci	void (*seq_passed) (struct vmw_fence_action *action);
5562306a36Sopenharmony_ci	void (*cleanup) (struct vmw_fence_action *action);
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistruct vmw_fence_obj {
5962306a36Sopenharmony_ci	struct dma_fence base;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	struct list_head head;
6262306a36Sopenharmony_ci	struct list_head seq_passed_actions;
6362306a36Sopenharmony_ci	void (*destroy)(struct vmw_fence_obj *fence);
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciextern struct vmw_fence_manager *
6762306a36Sopenharmony_civmw_fence_manager_init(struct vmw_private *dev_priv);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciextern void vmw_fence_manager_takedown(struct vmw_fence_manager *fman);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistatic inline void
7262306a36Sopenharmony_civmw_fence_obj_unreference(struct vmw_fence_obj **fence_p)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	struct vmw_fence_obj *fence = *fence_p;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	*fence_p = NULL;
7762306a36Sopenharmony_ci	if (fence)
7862306a36Sopenharmony_ci		dma_fence_put(&fence->base);
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline struct vmw_fence_obj *
8262306a36Sopenharmony_civmw_fence_obj_reference(struct vmw_fence_obj *fence)
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	if (fence)
8562306a36Sopenharmony_ci		dma_fence_get(&fence->base);
8662306a36Sopenharmony_ci	return fence;
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciextern void vmw_fences_update(struct vmw_fence_manager *fman);
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ciextern bool vmw_fence_obj_signaled(struct vmw_fence_obj *fence);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ciextern int vmw_fence_obj_wait(struct vmw_fence_obj *fence,
9462306a36Sopenharmony_ci			      bool lazy,
9562306a36Sopenharmony_ci			      bool interruptible, unsigned long timeout);
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ciextern int vmw_fence_create(struct vmw_fence_manager *fman,
9862306a36Sopenharmony_ci			    uint32_t seqno,
9962306a36Sopenharmony_ci			    struct vmw_fence_obj **p_fence);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ciextern int vmw_user_fence_create(struct drm_file *file_priv,
10262306a36Sopenharmony_ci				 struct vmw_fence_manager *fman,
10362306a36Sopenharmony_ci				 uint32_t sequence,
10462306a36Sopenharmony_ci				 struct vmw_fence_obj **p_fence,
10562306a36Sopenharmony_ci				 uint32_t *p_handle);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ciextern void vmw_fence_fifo_up(struct vmw_fence_manager *fman);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ciextern void vmw_fence_fifo_down(struct vmw_fence_manager *fman);
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ciextern int vmw_fence_obj_wait_ioctl(struct drm_device *dev, void *data,
11262306a36Sopenharmony_ci				    struct drm_file *file_priv);
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciextern int vmw_fence_obj_signaled_ioctl(struct drm_device *dev, void *data,
11562306a36Sopenharmony_ci					struct drm_file *file_priv);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ciextern int vmw_fence_obj_unref_ioctl(struct drm_device *dev, void *data,
11862306a36Sopenharmony_ci				     struct drm_file *file_priv);
11962306a36Sopenharmony_ciextern int vmw_fence_event_ioctl(struct drm_device *dev, void *data,
12062306a36Sopenharmony_ci				 struct drm_file *file_priv);
12162306a36Sopenharmony_ciextern int vmw_event_fence_action_queue(struct drm_file *filee_priv,
12262306a36Sopenharmony_ci					struct vmw_fence_obj *fence,
12362306a36Sopenharmony_ci					struct drm_pending_event *event,
12462306a36Sopenharmony_ci					uint32_t *tv_sec,
12562306a36Sopenharmony_ci					uint32_t *tv_usec,
12662306a36Sopenharmony_ci					bool interruptible);
12762306a36Sopenharmony_ci#endif /* _VMWGFX_FENCE_H_ */
128