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 */ 18 struct 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 57 struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev, 58 volatile uint32_t *fenceptr, const char *name); 59 void msm_fence_context_free(struct msm_fence_context *fctx); 60 61 bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence); 62 void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence); 63 64 struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx); 65 66 static inline bool 67 fence_before(uint32_t a, uint32_t b) 68 { 69 return (int32_t)(a - b) < 0; 70 } 71 72 static inline bool 73 fence_after(uint32_t a, uint32_t b) 74 { 75 return (int32_t)(a - b) > 0; 76 } 77 78 #endif 79