1 /* 2 * Copyright 2005 Stephane Marchesin. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 #ifndef __NOUVEAU_DRM_H__ 26 #define __NOUVEAU_DRM_H__ 27 28 #define NOUVEAU_DRM_HEADER_PATCHLEVEL 16 29 30 /* reserved object handles when using deprecated object APIs - these 31 * are here so that libdrm can allow interoperability with the new 32 * object APIs 33 */ 34 #define NOUVEAU_ABI16_CLIENT 0xffffffff 35 #define NOUVEAU_ABI16_DEVICE 0xdddddddd 36 #define NOUVEAU_ABI16_CHAN(n) (0xcccc0000 | (n)) 37 38 struct drm_nouveau_channel_alloc { 39 uint32_t fb_ctxdma_handle; 40 uint32_t tt_ctxdma_handle; 41 42 int channel; 43 uint32_t pushbuf_domains; 44 45 /* Notifier memory */ 46 uint32_t notifier_handle; 47 48 /* DRM-enforced subchannel assignments */ 49 struct { 50 uint32_t handle; 51 uint32_t grclass; 52 } subchan[8]; 53 uint32_t nr_subchan; 54 }; 55 56 struct drm_nouveau_channel_free { 57 int channel; 58 }; 59 60 struct drm_nouveau_grobj_alloc { 61 int channel; 62 uint32_t handle; 63 int class; 64 }; 65 66 struct drm_nouveau_notifierobj_alloc { 67 uint32_t channel; 68 uint32_t handle; 69 uint32_t size; 70 uint32_t offset; 71 }; 72 73 struct drm_nouveau_gpuobj_free { 74 int channel; 75 uint32_t handle; 76 }; 77 78 /* FIXME : maybe unify {GET,SET}PARAMs */ 79 #define NOUVEAU_GETPARAM_PCI_VENDOR 3 80 #define NOUVEAU_GETPARAM_PCI_DEVICE 4 81 #define NOUVEAU_GETPARAM_BUS_TYPE 5 82 #define NOUVEAU_GETPARAM_FB_PHYSICAL 6 83 #define NOUVEAU_GETPARAM_AGP_PHYSICAL 7 84 #define NOUVEAU_GETPARAM_FB_SIZE 8 85 #define NOUVEAU_GETPARAM_AGP_SIZE 9 86 #define NOUVEAU_GETPARAM_PCI_PHYSICAL 10 87 #define NOUVEAU_GETPARAM_CHIPSET_ID 11 88 #define NOUVEAU_GETPARAM_VM_VRAM_BASE 12 89 #define NOUVEAU_GETPARAM_GRAPH_UNITS 13 90 #define NOUVEAU_GETPARAM_PTIMER_TIME 14 91 #define NOUVEAU_GETPARAM_HAS_BO_USAGE 15 92 #define NOUVEAU_GETPARAM_HAS_PAGEFLIP 16 93 struct drm_nouveau_getparam { 94 uint64_t param; 95 uint64_t value; 96 }; 97 98 struct drm_nouveau_setparam { 99 uint64_t param; 100 uint64_t value; 101 }; 102 103 #define NOUVEAU_GEM_DOMAIN_CPU (1 << 0) 104 #define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1) 105 #define NOUVEAU_GEM_DOMAIN_GART (1 << 2) 106 #define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3) 107 #define NOUVEAU_GEM_DOMAIN_COHERENT (1 << 4) 108 109 #define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00 110 #define NOUVEAU_GEM_TILE_16BPP 0x00000001 111 #define NOUVEAU_GEM_TILE_32BPP 0x00000002 112 #define NOUVEAU_GEM_TILE_ZETA 0x00000004 113 #define NOUVEAU_GEM_TILE_NONCONTIG 0x00000008 114 115 struct drm_nouveau_gem_info { 116 uint32_t handle; 117 uint32_t domain; 118 uint64_t size; 119 uint64_t offset; 120 uint64_t map_handle; 121 uint32_t tile_mode; 122 uint32_t tile_flags; 123 }; 124 125 struct drm_nouveau_gem_set_tiling { 126 uint32_t handle; 127 uint32_t tile_mode; 128 uint32_t tile_flags; 129 }; 130 131 struct drm_nouveau_gem_new { 132 struct drm_nouveau_gem_info info; 133 uint32_t channel_hint; 134 uint32_t align; 135 }; 136 137 #define NOUVEAU_GEM_MAX_BUFFERS 1024 138 struct drm_nouveau_gem_pushbuf_bo_presumed { 139 uint32_t valid; 140 uint32_t domain; 141 uint64_t offset; 142 }; 143 144 struct drm_nouveau_gem_pushbuf_bo { 145 uint64_t user_priv; 146 uint32_t handle; 147 uint32_t read_domains; 148 uint32_t write_domains; 149 uint32_t valid_domains; 150 struct drm_nouveau_gem_pushbuf_bo_presumed presumed; 151 }; 152 153 #define NOUVEAU_GEM_RELOC_LOW (1 << 0) 154 #define NOUVEAU_GEM_RELOC_HIGH (1 << 1) 155 #define NOUVEAU_GEM_RELOC_OR (1 << 2) 156 #define NOUVEAU_GEM_MAX_RELOCS 1024 157 struct drm_nouveau_gem_pushbuf_reloc { 158 uint32_t reloc_bo_index; 159 uint32_t reloc_bo_offset; 160 uint32_t bo_index; 161 uint32_t flags; 162 uint32_t data; 163 uint32_t vor; 164 uint32_t tor; 165 }; 166 167 #define NOUVEAU_GEM_MAX_PUSH 512 168 struct drm_nouveau_gem_pushbuf_push { 169 uint32_t bo_index; 170 uint32_t pad; 171 uint64_t offset; 172 uint64_t length; 173 }; 174 175 struct drm_nouveau_gem_pushbuf { 176 uint32_t channel; 177 uint32_t nr_buffers; 178 uint64_t buffers; 179 uint32_t nr_relocs; 180 uint32_t nr_push; 181 uint64_t relocs; 182 uint64_t push; 183 uint32_t suffix0; 184 uint32_t suffix1; 185 uint64_t vram_available; 186 uint64_t gart_available; 187 }; 188 189 #define NOUVEAU_GEM_PUSHBUF_2_FENCE_WAIT 0x00000001 190 #define NOUVEAU_GEM_PUSHBUF_2_FENCE_EMIT 0x00000002 191 struct drm_nouveau_gem_pushbuf_2 { 192 uint32_t channel; 193 uint32_t flags; 194 uint32_t nr_push; 195 uint32_t nr_buffers; 196 int32_t fence; /* in/out, depends on flags */ 197 uint32_t pad; 198 uint64_t push; /* in raw hw format */ 199 uint64_t buffers; /* ptr to drm_nouveau_gem_pushbuf_bo */ 200 uint64_t vram_available; 201 uint64_t gart_available; 202 }; 203 204 #define NOUVEAU_GEM_CPU_PREP_NOWAIT 0x00000001 205 #define NOUVEAU_GEM_CPU_PREP_NOBLOCK 0x00000002 206 #define NOUVEAU_GEM_CPU_PREP_WRITE 0x00000004 207 struct drm_nouveau_gem_cpu_prep { 208 uint32_t handle; 209 uint32_t flags; 210 }; 211 212 struct drm_nouveau_gem_cpu_fini { 213 uint32_t handle; 214 }; 215 216 #define NOUVEAU_GEM_AS_SPARSE 0x00000001 217 struct drm_nouveau_gem_as_alloc { 218 uint64_t pages; /* in, page length */ 219 uint32_t page_size; /* in, byte page size */ 220 uint32_t flags; /* in, flags of address space */ 221 uint64_t align; /* in, requested alignment in bytes */ 222 uint64_t address; /* in/out, non-zero for fixed address allocation */ 223 }; 224 225 struct drm_nouveau_gem_as_free { 226 uint64_t address; /* in, byte address */ 227 }; 228 229 enum nouveau_bus_type { 230 NV_AGP = 0, 231 NV_PCI = 1, 232 NV_PCIE = 2, 233 }; 234 235 struct drm_nouveau_sarea { 236 }; 237 238 #define NOUVEAU_GEM_CHANNEL_FIFO_ERROR_IDLE_TIMEOUT 8 239 #define NOUVEAU_GEM_CHANNEL_GR_ERROR_SW_NOTIFY 13 240 #define NOUVEAU_GEM_CHANNEL_FIFO_ERROR_MMU_ERR_FLT 31 241 #define NOUVEAU_GEM_CHANNEL_PBDMA_ERROR 32 242 struct drm_nouveau_gem_set_error_notifier { 243 uint32_t channel; 244 uint32_t buffer; 245 uint32_t offset; /* in bytes, u32-aligned */ 246 }; 247 248 struct drm_nouveau_gem_map { 249 uint32_t handle; 250 uint32_t domain; 251 uint64_t offset; 252 uint64_t delta; 253 uint64_t length; 254 uint32_t tile_mode; 255 uint32_t tile_flags; 256 }; 257 258 struct drm_nouveau_gem_unmap { 259 uint32_t handle; 260 uint32_t pad; 261 uint64_t offset; 262 uint64_t delta; 263 uint64_t length; 264 }; 265 266 #define DRM_NOUVEAU_GETPARAM 0x00 267 #define DRM_NOUVEAU_SETPARAM 0x01 268 #define DRM_NOUVEAU_CHANNEL_ALLOC 0x02 269 #define DRM_NOUVEAU_CHANNEL_FREE 0x03 270 #define DRM_NOUVEAU_GROBJ_ALLOC 0x04 271 #define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC 0x05 272 #define DRM_NOUVEAU_GPUOBJ_FREE 0x06 273 #define DRM_NOUVEAU_NVIF 0x07 274 #define DRM_NOUVEAU_GEM_NEW 0x40 275 #define DRM_NOUVEAU_GEM_PUSHBUF 0x41 276 #define DRM_NOUVEAU_GEM_CPU_PREP 0x42 277 #define DRM_NOUVEAU_GEM_CPU_FINI 0x43 278 #define DRM_NOUVEAU_GEM_INFO 0x44 279 280 /* The ioctls below are marked as staging */ 281 #define DRM_NOUVEAU_GEM_SET_TILING 0x50 282 #define DRM_NOUVEAU_GEM_PUSHBUF_2 0x51 283 #define DRM_NOUVEAU_GEM_SET_INFO 0x52 284 #define DRM_NOUVEAU_GEM_AS_ALLOC 0x53 285 #define DRM_NOUVEAU_GEM_AS_FREE 0x54 286 #define DRM_NOUVEAU_GEM_SET_ERROR_NOTIFIER 0x55 287 #define DRM_NOUVEAU_GEM_MAP 0x56 288 #define DRM_NOUVEAU_GEM_UNMAP 0x57 289 290 #endif /* __NOUVEAU_DRM_H__ */ 291