1 /* $NetBSD: nouveau_drm.h,v 1.2 2021/12/18 23:45:46 riastradh Exp $ */ 2 3 /* 4 * Copyright 2005 Stephane Marchesin. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the next 15 * paragraph) shall be included in all copies or substantial portions of the 16 * Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 * OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 #ifndef __NOUVEAU_DRM_H__ 28 #define __NOUVEAU_DRM_H__ 29 30 #define DRM_NOUVEAU_EVENT_NVIF 0x80000000 31 32 #include "drm.h" 33 34 #if defined(__cplusplus) 35 extern "C" { 36 #endif 37 38 #define NOUVEAU_GEM_DOMAIN_CPU (1 << 0) 39 #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) 40 #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) 41 #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) 42 #define NOUVEAU_GEM_DOMAIN_COHERENT (1 << 4) 43 44 #define NOUVEAU_GEM_TILE_COMP 0x00030000 /* nv50-only */ 45 #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 46 #define NOUVEAU_GEM_TILE_16BPP 0x00000001 47 #define NOUVEAU_GEM_TILE_32BPP 0x00000002 48 #define NOUVEAU_GEM_TILE_ZETA 0x00000004 49 #define NOUVEAU_GEM_TILE_NONCONTIG 0x00000008 50 51 struct drm_nouveau_gem_info { 52 __u32 handle; 53 __u32 domain; 54 __u64 size; 55 __u64 offset; 56 __u64 map_handle; 57 __u32 tile_mode; 58 __u32 tile_flags; 59 }; 60 61 struct drm_nouveau_gem_new { 62 struct drm_nouveau_gem_info info; 63 __u32 channel_hint; 64 __u32 align; 65 }; 66 67 #define NOUVEAU_GEM_MAX_BUFFERS 1024 68 struct drm_nouveau_gem_pushbuf_bo_presumed { 69 __u32 valid; 70 __u32 domain; 71 __u64 offset; 72 }; 73 74 struct drm_nouveau_gem_pushbuf_bo { 75 __u64 user_priv; 76 __u32 handle; 77 __u32 read_domains; 78 __u32 write_domains; 79 __u32 valid_domains; 80 struct drm_nouveau_gem_pushbuf_bo_presumed presumed; 81 }; 82 83 #define NOUVEAU_GEM_RELOC_LOW (1 << 0) 84 #define NOUVEAU_GEM_RELOC_HIGH (1 << 1) 85 #define NOUVEAU_GEM_RELOC_OR (1 << 2) 86 #define NOUVEAU_GEM_MAX_RELOCS 1024 87 struct drm_nouveau_gem_pushbuf_reloc { 88 __u32 reloc_bo_index; 89 __u32 reloc_bo_offset; 90 __u32 bo_index; 91 __u32 flags; 92 __u32 data; 93 __u32 vor; 94 __u32 tor; 95 }; 96 97 #define NOUVEAU_GEM_MAX_PUSH 512 98 struct drm_nouveau_gem_pushbuf_push { 99 __u32 bo_index; 100 __u32 pad; 101 __u64 offset; 102 __u64 length; 103 }; 104 105 struct drm_nouveau_gem_pushbuf { 106 __u32 channel; 107 __u32 nr_buffers; 108 __u64 buffers; 109 __u32 nr_relocs; 110 __u32 nr_push; 111 __u64 relocs; 112 __u64 push; 113 __u32 suffix0; 114 __u32 suffix1; 115 #define NOUVEAU_GEM_PUSHBUF_SYNC (1ULL << 0) 116 __u64 vram_available; 117 __u64 gart_available; 118 }; 119 120 #define NOUVEAU_GEM_CPU_PREP_NOWAIT 0x00000001 121 #define NOUVEAU_GEM_CPU_PREP_WRITE 0x00000004 122 struct drm_nouveau_gem_cpu_prep { 123 __u32 handle; 124 __u32 flags; 125 }; 126 127 struct drm_nouveau_gem_cpu_fini { 128 __u32 handle; 129 }; 130 131 #define DRM_NOUVEAU_GETPARAM 0x00 /* deprecated */ 132 #define DRM_NOUVEAU_SETPARAM 0x01 /* deprecated */ 133 #define DRM_NOUVEAU_CHANNEL_ALLOC 0x02 /* deprecated */ 134 #define DRM_NOUVEAU_CHANNEL_FREE 0x03 /* deprecated */ 135 #define DRM_NOUVEAU_GROBJ_ALLOC 0x04 /* deprecated */ 136 #define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC 0x05 /* deprecated */ 137 #define DRM_NOUVEAU_GPUOBJ_FREE 0x06 /* deprecated */ 138 #define DRM_NOUVEAU_NVIF 0x07 139 #define DRM_NOUVEAU_SVM_INIT 0x08 140 #define DRM_NOUVEAU_SVM_BIND 0x09 141 #define DRM_NOUVEAU_GEM_NEW 0x40 142 #define DRM_NOUVEAU_GEM_PUSHBUF 0x41 143 #define DRM_NOUVEAU_GEM_CPU_PREP 0x42 144 #define DRM_NOUVEAU_GEM_CPU_FINI 0x43 145 #define DRM_NOUVEAU_GEM_INFO 0x44 146 147 struct drm_nouveau_svm_init { 148 __u64 unmanaged_addr; 149 __u64 unmanaged_size; 150 }; 151 152 struct drm_nouveau_svm_bind { 153 __u64 header; 154 __u64 va_start; 155 __u64 va_end; 156 __u64 npages; 157 __u64 stride; 158 __u64 result; 159 __u64 reserved0; 160 __u64 reserved1; 161 }; 162 163 #define NOUVEAU_SVM_BIND_COMMAND_SHIFT 0 164 #define NOUVEAU_SVM_BIND_COMMAND_BITS 8 165 #define NOUVEAU_SVM_BIND_COMMAND_MASK ((1 << 8) - 1) 166 #define NOUVEAU_SVM_BIND_PRIORITY_SHIFT 8 167 #define NOUVEAU_SVM_BIND_PRIORITY_BITS 8 168 #define NOUVEAU_SVM_BIND_PRIORITY_MASK ((1 << 8) - 1) 169 #define NOUVEAU_SVM_BIND_TARGET_SHIFT 16 170 #define NOUVEAU_SVM_BIND_TARGET_BITS 32 171 #define NOUVEAU_SVM_BIND_TARGET_MASK 0xffffffff 172 173 /* 174 * Below is use to validate ioctl argument, userspace can also use it to make 175 * sure that no bit are set beyond known fields for a given kernel version. 176 */ 177 #define NOUVEAU_SVM_BIND_VALID_BITS 48 178 #define NOUVEAU_SVM_BIND_VALID_MASK ((1ULL << NOUVEAU_SVM_BIND_VALID_BITS) - 1) 179 180 181 /* 182 * NOUVEAU_BIND_COMMAND__MIGRATE: synchronous migrate to target memory. 183 * result: number of page successfuly migrate to the target memory. 184 */ 185 #define NOUVEAU_SVM_BIND_COMMAND__MIGRATE 0 186 187 /* 188 * NOUVEAU_SVM_BIND_HEADER_TARGET__GPU_VRAM: target the GPU VRAM memory. 189 */ 190 #define NOUVEAU_SVM_BIND_TARGET__GPU_VRAM (1UL << 31) 191 192 193 #define DRM_IOCTL_NOUVEAU_SVM_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SVM_INIT, struct drm_nouveau_svm_init) 194 #define DRM_IOCTL_NOUVEAU_SVM_BIND DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SVM_BIND, struct drm_nouveau_svm_bind) 195 196 #define DRM_IOCTL_NOUVEAU_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new) 197 #define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf) 198 #define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep) 199 #define DRM_IOCTL_NOUVEAU_GEM_CPU_FINI DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_FINI, struct drm_nouveau_gem_cpu_fini) 200 #define DRM_IOCTL_NOUVEAU_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_INFO, struct drm_nouveau_gem_info) 201 202 #if defined(__cplusplus) 203 } 204 #endif 205 206 #endif /* __NOUVEAU_DRM_H__ */ 207