1/* 2 * Copyright (C) 2012-2018 Rob Clark <robclark@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robclark@freedesktop.org> 25 */ 26 27#ifndef FREEDRENO_DRMIF_H_ 28#define FREEDRENO_DRMIF_H_ 29 30#include <stdint.h> 31 32#include "util/u_debug.h" 33 34struct fd_bo; 35struct fd_pipe; 36struct fd_device; 37 38enum fd_pipe_id { 39 FD_PIPE_3D = 1, 40 FD_PIPE_2D = 2, 41 /* some devices have two 2d blocks.. not really sure how to 42 * use that yet, so just ignoring the 2nd 2d pipe for now 43 */ 44 FD_PIPE_MAX 45}; 46 47enum fd_param_id { 48 FD_DEVICE_ID, 49 FD_GMEM_SIZE, 50 FD_GMEM_BASE, 51 FD_GPU_ID, 52 FD_CHIP_ID, 53 FD_MAX_FREQ, 54 FD_TIMESTAMP, 55 FD_NR_RINGS, /* # of rings == # of distinct priority levels */ 56 FD_PP_PGTABLE, /* are per-process pagetables used for the pipe/ctx */ 57 FD_CTX_FAULTS, /* # of per context faults */ 58 FD_GLOBAL_FAULTS, /* # of global (all context) faults */ 59}; 60 61/* bo flags: */ 62#define DRM_FREEDRENO_GEM_TYPE_SMI 0x00000001 63#define DRM_FREEDRENO_GEM_TYPE_KMEM 0x00000002 64#define DRM_FREEDRENO_GEM_TYPE_MEM_MASK 0x0000000f 65#define DRM_FREEDRENO_GEM_CACHE_NONE 0x00000000 66#define DRM_FREEDRENO_GEM_CACHE_WCOMBINE 0x00100000 67#define DRM_FREEDRENO_GEM_CACHE_WTHROUGH 0x00200000 68#define DRM_FREEDRENO_GEM_CACHE_WBACK 0x00400000 69#define DRM_FREEDRENO_GEM_CACHE_WBACKWA 0x00800000 70#define DRM_FREEDRENO_GEM_CACHE_MASK 0x00f00000 71#define DRM_FREEDRENO_GEM_GPUREADONLY 0x01000000 72#define DRM_FREEDRENO_GEM_SCANOUT 0x02000000 73 74/* bo access flags: (keep aligned to MSM_PREP_x) */ 75#define DRM_FREEDRENO_PREP_READ 0x01 76#define DRM_FREEDRENO_PREP_WRITE 0x02 77#define DRM_FREEDRENO_PREP_NOSYNC 0x04 78 79/* device functions: 80 */ 81 82struct fd_device * fd_device_new(int fd); 83struct fd_device * fd_device_new_dup(int fd); 84struct fd_device * fd_device_ref(struct fd_device *dev); 85void fd_device_del(struct fd_device *dev); 86int fd_device_fd(struct fd_device *dev); 87 88enum fd_version { 89 FD_VERSION_MADVISE = 1, /* kernel supports madvise */ 90 FD_VERSION_UNLIMITED_CMDS = 1, /* submits w/ >4 cmd buffers (growable ringbuffer) */ 91 FD_VERSION_FENCE_FD = 2, /* submit command supports in/out fences */ 92 FD_VERSION_GMEM_BASE = 3, /* supports querying GMEM base address */ 93 FD_VERSION_SUBMIT_QUEUES = 3, /* submit queues and multiple priority levels */ 94 FD_VERSION_BO_IOVA = 3, /* supports fd_bo_get/put_iova() */ 95 FD_VERSION_SOFTPIN = 4, /* adds softpin, bo name, and dump flag */ 96 FD_VERSION_ROBUSTNESS = 5, /* adds FD_NR_FAULTS and FD_PP_PGTABLE */ 97}; 98enum fd_version fd_device_version(struct fd_device *dev); 99 100/* pipe functions: 101 */ 102 103struct fd_pipe * fd_pipe_new(struct fd_device *dev, enum fd_pipe_id id); 104struct fd_pipe * fd_pipe_new2(struct fd_device *dev, enum fd_pipe_id id, uint32_t prio); 105struct fd_pipe * fd_pipe_ref(struct fd_pipe *pipe); 106void fd_pipe_del(struct fd_pipe *pipe); 107int fd_pipe_get_param(struct fd_pipe *pipe, enum fd_param_id param, 108 uint64_t *value); 109int fd_pipe_wait(struct fd_pipe *pipe, uint32_t timestamp); 110/* timeout in nanosec */ 111int fd_pipe_wait_timeout(struct fd_pipe *pipe, uint32_t timestamp, 112 uint64_t timeout); 113 114 115/* buffer-object functions: 116 */ 117 118struct fd_bo * _fd_bo_new(struct fd_device *dev, 119 uint32_t size, uint32_t flags); 120void _fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap); 121 122static inline void 123fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...) _util_printf_format(2, 3); 124 125static inline void 126fd_bo_set_name(struct fd_bo *bo, const char *fmt, ...) 127{ 128#ifndef NDEBUG 129 va_list ap; 130 va_start(ap, fmt); 131 _fd_bo_set_name(bo, fmt, ap); 132 va_end(ap); 133#endif 134} 135 136static inline struct fd_bo * 137fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, 138 const char *fmt, ...) _util_printf_format(4, 5); 139 140static inline struct fd_bo * 141fd_bo_new(struct fd_device *dev, uint32_t size, uint32_t flags, 142 const char *fmt, ...) 143{ 144 struct fd_bo *bo = _fd_bo_new(dev, size, flags); 145#ifndef NDEBUG 146 if (fmt) { 147 va_list ap; 148 va_start(ap, fmt); 149 _fd_bo_set_name(bo, fmt, ap); 150 va_end(ap); 151 } 152#endif 153 return bo; 154} 155 156struct fd_bo *fd_bo_from_handle(struct fd_device *dev, 157 uint32_t handle, uint32_t size); 158struct fd_bo * fd_bo_from_name(struct fd_device *dev, uint32_t name); 159struct fd_bo * fd_bo_from_dmabuf(struct fd_device *dev, int fd); 160uint64_t fd_bo_get_iova(struct fd_bo *bo); 161void fd_bo_put_iova(struct fd_bo *bo); 162struct fd_bo * fd_bo_ref(struct fd_bo *bo); 163void fd_bo_del(struct fd_bo *bo); 164int fd_bo_get_name(struct fd_bo *bo, uint32_t *name); 165uint32_t fd_bo_handle(struct fd_bo *bo); 166int fd_bo_dmabuf(struct fd_bo *bo); 167uint32_t fd_bo_size(struct fd_bo *bo); 168void * fd_bo_map(struct fd_bo *bo); 169int fd_bo_cpu_prep(struct fd_bo *bo, struct fd_pipe *pipe, uint32_t op); 170void fd_bo_cpu_fini(struct fd_bo *bo); 171 172#endif /* FREEDRENO_DRMIF_H_ */ 173