100 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (C) 2013-2016 Red Hat4 * Author: Rob Clark <robdclark@gmail.com>5 */6 7#ifndef __MSM_FENCE_H__8#define __MSM_FENCE_H__9 10#include "msm_drv.h"11 12/**13 * struct msm_fence_context - fence context for gpu14 *15 * Each ringbuffer has a single fence context, with the GPU writing an16 * incrementing fence seqno at the end of each submit17 */18struct msm_fence_context {19 struct drm_device *dev;20 /** name: human readable name for fence timeline */21 char name[32];22 /** context: see dma_fence_context_alloc() */23 unsigned context;24 /** index: similar to context, but local to msm_fence_context's */25 unsigned index;26 27 /**28 * last_fence:29 *30 * Last assigned fence, incremented each time a fence is created31 * on this fence context. If last_fence == completed_fence,32 * there is no remaining pending work33 */34 uint32_t last_fence;35 36 /**37 * completed_fence:38 *39 * The last completed fence, updated from the CPU after interrupt40 * from GPU41 */42 uint32_t completed_fence;43 44 /**45 * fenceptr:46 *47 * The address that the GPU directly writes with completed fence48 * seqno. This can be ahead of completed_fence. We can peek at49 * this to see if a fence has already signaled but the CPU hasn't50 * gotten around to handling the irq and updating completed_fence51 */52 volatile uint32_t *fenceptr;53 54 spinlock_t spinlock;55 56 /*57 * TODO this doesn't really deal with multiple deadlines, like58 * if userspace got multiple frames ahead.. OTOH atomic updates59 * don't queue, so maybe that is ok60 */61 62 /** next_deadline: Time of next deadline */63 ktime_t next_deadline;64 65 /**66 * next_deadline_fence:67 *68 * Fence value for next pending deadline. The deadline timer is69 * canceled when this fence is signaled.70 */71 uint32_t next_deadline_fence;72 73 struct hrtimer deadline_timer;74 struct kthread_work deadline_work;75};76 77struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev,78 volatile uint32_t *fenceptr, const char *name);79void msm_fence_context_free(struct msm_fence_context *fctx);80 81bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence);82void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence);83 84struct dma_fence * msm_fence_alloc(void);85void msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx);86 87static inline bool88fence_before(uint32_t a, uint32_t b)89{90 return (int32_t)(a - b) < 0;91}92 93static inline bool94fence_after(uint32_t a, uint32_t b)95{96 return (int32_t)(a - b) > 0;97}98 99#endif100