msm_fence.h (1970B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2013-2016 Red Hat 4 * 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 gpu 14 * 15 * Each ringbuffer has a single fence context, with the GPU writing an 16 * incrementing fence seqno at the end of each submit 17 */ 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 created 31 * on this fence context. If last_fence == completed_fence, 32 * there is no remaining pending work 33 */ 34 uint32_t last_fence; 35 36 /** 37 * completed_fence: 38 * 39 * The last completed fence, updated from the CPU after interrupt 40 * from GPU 41 */ 42 uint32_t completed_fence; 43 44 /** 45 * fenceptr: 46 * 47 * The address that the GPU directly writes with completed fence 48 * seqno. This can be ahead of completed_fence. We can peek at 49 * this to see if a fence has already signaled but the CPU hasn't 50 * gotten around to handling the irq and updating completed_fence 51 */ 52 volatile uint32_t *fenceptr; 53 54 spinlock_t spinlock; 55}; 56 57struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev, 58 volatile uint32_t *fenceptr, const char *name); 59void msm_fence_context_free(struct msm_fence_context *fctx); 60 61bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence); 62void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence); 63 64struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx); 65 66static inline bool 67fence_before(uint32_t a, uint32_t b) 68{ 69 return (int32_t)(a - b) < 0; 70} 71 72static inline bool 73fence_after(uint32_t a, uint32_t b) 74{ 75 return (int32_t)(a - b) > 0; 76} 77 78#endif