1 1.1 mrg /* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*- 2 1.1 mrg * Created: Mon Jan 4 10:05:05 1999 by faith (at) precisioninsight.com 3 1.1 mrg */ 4 1.1 mrg /*- 5 1.1 mrg * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 6 1.1 mrg * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 7 1.1 mrg * All rights reserved. 8 1.1 mrg * 9 1.1 mrg * Permission is hereby granted, free of charge, to any person obtaining a 10 1.1 mrg * copy of this software and associated documentation files (the "Software"), 11 1.1 mrg * to deal in the Software without restriction, including without limitation 12 1.1 mrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 1.1 mrg * and/or sell copies of the Software, and to permit persons to whom the 14 1.1 mrg * Software is furnished to do so, subject to the following conditions: 15 1.1 mrg * 16 1.1 mrg * The above copyright notice and this permission notice (including the next 17 1.1 mrg * paragraph) shall be included in all copies or substantial portions of the 18 1.1 mrg * Software. 19 1.1 mrg * 20 1.1 mrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 1.1 mrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 1.1 mrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 1.1 mrg * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 24 1.1 mrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 25 1.1 mrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 1.1 mrg * OTHER DEALINGS IN THE SOFTWARE. 27 1.1 mrg * 28 1.1 mrg * Authors: 29 1.1 mrg * Rickard E. (Rik) Faith <faith (at) valinux.com> 30 1.1 mrg * Gareth Hughes <gareth (at) valinux.com> 31 1.1 mrg * 32 1.1 mrg */ 33 1.1 mrg 34 1.1 mrg #ifndef _DRM_P_H_ 35 1.1 mrg #define _DRM_P_H_ 36 1.1 mrg 37 1.1 mrg #if defined(_KERNEL) || defined(__KERNEL__) 38 1.1 mrg 39 1.11 mrg struct drm_device; 40 1.11 mrg struct drm_file; 41 1.1 mrg 42 1.2 mrg #if defined(__NetBSD__) && defined(_KERNEL_OPT) 43 1.2 mrg #include "opt_drm.h" 44 1.2 mrg #endif 45 1.2 mrg 46 1.1 mrg #include <sys/param.h> 47 1.1 mrg #include <sys/queue.h> 48 1.1 mrg #include <sys/malloc.h> 49 1.1 mrg #include <sys/kernel.h> 50 1.1 mrg #include <sys/module.h> 51 1.1 mrg #include <sys/systm.h> 52 1.1 mrg #include <sys/conf.h> 53 1.1 mrg #include <sys/stat.h> 54 1.1 mrg #if __FreeBSD_version >= 700000 55 1.1 mrg #include <sys/priv.h> 56 1.1 mrg #endif 57 1.1 mrg #include <sys/proc.h> 58 1.1 mrg #include <sys/lock.h> 59 1.1 mrg #include <sys/fcntl.h> 60 1.1 mrg #include <sys/uio.h> 61 1.1 mrg #include <sys/filio.h> 62 1.1 mrg #include <sys/sysctl.h> 63 1.11 mrg #include <sys/bus.h> 64 1.11 mrg #include <sys/signalvar.h> 65 1.2 mrg #include <sys/poll.h> 66 1.2 mrg #include <sys/tree.h> 67 1.11 mrg #ifdef __FreeBSD__ 68 1.1 mrg #include <vm/vm.h> 69 1.1 mrg #include <vm/pmap.h> 70 1.1 mrg #include <vm/vm_extern.h> 71 1.1 mrg #include <vm/vm_map.h> 72 1.1 mrg #include <vm/vm_param.h> 73 1.2 mrg #include <machine/resource.h> 74 1.1 mrg #include <machine/param.h> 75 1.2 mrg #endif 76 1.1 mrg #include <machine/pmap.h> 77 1.23 dyoung #include <sys/bus.h> 78 1.14 mrg #if defined(__i386__) || defined(__x86_64__) 79 1.11 mrg #include <machine/specialreg.h> 80 1.1 mrg #include <machine/sysarch.h> 81 1.14 mrg #endif 82 1.1 mrg #include <sys/endian.h> 83 1.1 mrg #include <sys/mman.h> 84 1.11 mrg #if defined( __FreeBSD__) 85 1.1 mrg #include <sys/rman.h> 86 1.1 mrg #include <sys/memrange.h> 87 1.1 mrg #if __FreeBSD_version >= 800004 88 1.1 mrg #include <dev/agp/agpvar.h> 89 1.1 mrg #else /* __FreeBSD_version >= 800004 */ 90 1.1 mrg #include <pci/agpvar.h> 91 1.1 mrg #endif /* __FreeBSD_version >= 800004 */ 92 1.1 mrg #include <sys/agpio.h> 93 1.1 mrg #include <sys/mutex.h> 94 1.1 mrg #include <dev/pci/pcivar.h> 95 1.11 mrg #include <dev/pci/pcireg.h> 96 1.1 mrg #include <sys/selinfo.h> 97 1.11 mrg #include <sys/bus.h> 98 1.11 mrg #elif defined(__NetBSD__) 99 1.14 mrg #if defined(__i386__) || defined(__x86_64__) 100 1.1 mrg #include <machine/mtrr.h> 101 1.14 mrg #endif 102 1.1 mrg #include <sys/vnode.h> 103 1.1 mrg #include <sys/select.h> 104 1.1 mrg #include <sys/device.h> 105 1.1 mrg #include <sys/resourcevar.h> 106 1.1 mrg #include <sys/agpio.h> 107 1.1 mrg #include <sys/ttycom.h> 108 1.2 mrg #include <sys/mman.h> 109 1.2 mrg #include <sys/kauth.h> 110 1.2 mrg #include <sys/types.h> 111 1.2 mrg #include <sys/file.h> 112 1.2 mrg #include <sys/atomic.h> 113 1.4 jmcneill #include <sys/workqueue.h> 114 1.1 mrg #include <uvm/uvm.h> 115 1.1 mrg #include <dev/pci/pcireg.h> 116 1.1 mrg #include <dev/pci/pcivar.h> 117 1.1 mrg #include <dev/pci/agpvar.h> 118 1.1 mrg #endif 119 1.1 mrg 120 1.1 mrg #include "drm.h" 121 1.1 mrg #include "drm_linux_list.h" 122 1.1 mrg #include "drm_atomic.h" 123 1.1 mrg #include "drm_internal.h" 124 1.1 mrg 125 1.11 mrg #ifdef __FreeBSD__ 126 1.1 mrg #include <opt_drm.h> 127 1.2 mrg #endif 128 1.2 mrg 129 1.1 mrg #ifdef DRM_DEBUG 130 1.1 mrg #undef DRM_DEBUG 131 1.1 mrg #define DRM_DEBUG_DEFAULT_ON 1 132 1.1 mrg #endif /* DRM_DEBUG */ 133 1.2 mrg 134 1.11 mrg #ifdef __FreeBSD__ 135 1.11 mrg #define DRM_KASSERT(x,y) KASSERT(x,y) 136 1.2 mrg #else 137 1.11 mrg #define DRM_KASSERT(x,y) KASSERT(x) 138 1.2 mrg #define device_get_softc(x) device_private(x) 139 1.2 mrg #define callout_deactivate(x) callout_stop(x) 140 1.2 mrg #define callout_drain(x) callout_stop(x) 141 1.1 mrg #endif 142 1.1 mrg 143 1.1 mrg #if defined(DRM_LINUX) && DRM_LINUX && !defined(__amd64__) 144 1.1 mrg #include <sys/file.h> 145 1.1 mrg #include <sys/proc.h> 146 1.1 mrg #include <machine/../linux/linux.h> 147 1.1 mrg #include <machine/../linux/linux_proto.h> 148 1.1 mrg #else 149 1.1 mrg /* Either it was defined when it shouldn't be (FreeBSD amd64) or it isn't 150 1.1 mrg * supported on this OS yet. 151 1.1 mrg */ 152 1.1 mrg #undef DRM_LINUX 153 1.1 mrg #define DRM_LINUX 0 154 1.1 mrg #endif 155 1.1 mrg 156 1.11 mrg /* driver capabilities and requirements mask */ 157 1.11 mrg #define DRIVER_USE_AGP 0x1 158 1.11 mrg #define DRIVER_REQUIRE_AGP 0x2 159 1.11 mrg #define DRIVER_USE_MTRR 0x4 160 1.11 mrg #define DRIVER_PCI_DMA 0x8 161 1.11 mrg #define DRIVER_SG 0x10 162 1.11 mrg #define DRIVER_HAVE_DMA 0x20 163 1.11 mrg #define DRIVER_HAVE_IRQ 0x40 164 1.11 mrg #define DRIVER_DMA_QUEUE 0x100 165 1.11 mrg 166 1.11 mrg 167 1.1 mrg #define DRM_HASH_SIZE 16 /* Size of key hash table */ 168 1.1 mrg #define DRM_KERNEL_CONTEXT 0 /* Change drm_resctx if changed */ 169 1.1 mrg #define DRM_RESERVED_CONTEXTS 1 /* Change drm_resctx if changed */ 170 1.1 mrg 171 1.11 mrg MALLOC_DECLARE(DRM_MEM_DMA); 172 1.11 mrg MALLOC_DECLARE(DRM_MEM_SAREA); 173 1.11 mrg MALLOC_DECLARE(DRM_MEM_DRIVER); 174 1.11 mrg MALLOC_DECLARE(DRM_MEM_MAGIC); 175 1.11 mrg MALLOC_DECLARE(DRM_MEM_IOCTLS); 176 1.11 mrg MALLOC_DECLARE(DRM_MEM_MAPS); 177 1.11 mrg MALLOC_DECLARE(DRM_MEM_BUFS); 178 1.11 mrg MALLOC_DECLARE(DRM_MEM_SEGS); 179 1.11 mrg MALLOC_DECLARE(DRM_MEM_PAGES); 180 1.11 mrg MALLOC_DECLARE(DRM_MEM_FILES); 181 1.11 mrg MALLOC_DECLARE(DRM_MEM_QUEUES); 182 1.11 mrg MALLOC_DECLARE(DRM_MEM_CMDS); 183 1.11 mrg MALLOC_DECLARE(DRM_MEM_MAPPINGS); 184 1.11 mrg MALLOC_DECLARE(DRM_MEM_BUFLISTS); 185 1.11 mrg MALLOC_DECLARE(DRM_MEM_AGPLISTS); 186 1.11 mrg MALLOC_DECLARE(DRM_MEM_CTXBITMAP); 187 1.11 mrg MALLOC_DECLARE(DRM_MEM_SGLISTS); 188 1.11 mrg MALLOC_DECLARE(DRM_MEM_DRAWABLE); 189 1.20 jmcneill MALLOC_DECLARE(DRM_MEM_MM); 190 1.1 mrg 191 1.1 mrg #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) 192 1.1 mrg 193 1.1 mrg /* Internal types and structures */ 194 1.1 mrg #define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 195 1.1 mrg #define DRM_MIN(a,b) ((a)<(b)?(a):(b)) 196 1.1 mrg #define DRM_MAX(a,b) ((a)>(b)?(a):(b)) 197 1.1 mrg 198 1.1 mrg #define DRM_IF_VERSION(maj, min) (maj << 16 | min) 199 1.1 mrg 200 1.1 mrg #define __OS_HAS_AGP 1 201 1.1 mrg 202 1.1 mrg #define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 203 1.1 mrg #define DRM_DEV_UID 0 204 1.1 mrg #define DRM_DEV_GID 0 205 1.1 mrg 206 1.1 mrg #define wait_queue_head_t atomic_t 207 1.1 mrg #define DRM_WAKEUP(w) wakeup((void *)w) 208 1.1 mrg #define DRM_WAKEUP_INT(w) wakeup(w) 209 1.1 mrg #define DRM_INIT_WAITQUEUE(queue) do {(void)(queue);} while (0) 210 1.1 mrg 211 1.11 mrg #if defined(__FreeBSD__) 212 1.11 mrg #define DRM_CDEV struct cdev * 213 1.1 mrg #define DRM_CURPROC curthread 214 1.1 mrg #define DRM_STRUCTPROC struct thread 215 1.2 mrg #define DRM_STRUCTCDEVPROC struct thread 216 1.2 mrg #define DRM_CDEVPROC_REAL(p) (p) 217 1.11 mrg #define DRM_IOCTL_DATA caddr_t 218 1.1 mrg #define DRM_SPINTYPE struct mtx 219 1.1 mrg #define DRM_SPININIT(l,name) mtx_init(l, name, NULL, MTX_DEF) 220 1.1 mrg #define DRM_SPINUNINIT(l) mtx_destroy(l) 221 1.1 mrg #define DRM_SPINLOCK(l) mtx_lock(l) 222 1.1 mrg #define DRM_SPINUNLOCK(u) mtx_unlock(u) 223 1.1 mrg #define DRM_SPINLOCK_IRQSAVE(l, irqflags) do { \ 224 1.1 mrg mtx_lock(l); \ 225 1.1 mrg (void)irqflags; \ 226 1.1 mrg } while (0) 227 1.1 mrg #define DRM_SPINUNLOCK_IRQRESTORE(u, irqflags) mtx_unlock(u) 228 1.1 mrg #define DRM_SPINLOCK_ASSERT(l) mtx_assert(l, MA_OWNED) 229 1.1 mrg #define DRM_CURRENTPID curthread->td_proc->p_pid 230 1.1 mrg #define DRM_LOCK() mtx_lock(&dev->dev_lock) 231 1.1 mrg #define DRM_UNLOCK() mtx_unlock(&dev->dev_lock) 232 1.1 mrg #define DRM_SYSCTL_HANDLER_ARGS (SYSCTL_HANDLER_ARGS) 233 1.11 mrg #elif defined(__NetBSD__) 234 1.11 mrg #define DRM_CDEV dev_t 235 1.11 mrg #define DRM_CURPROC curproc 236 1.11 mrg #define DRM_STRUCTPROC struct proc 237 1.2 mrg #define DRM_STRUCTCDEVPROC struct lwp 238 1.2 mrg #define DRM_CDEVPROC_REAL(l) (l)->l_proc 239 1.2 mrg #define DRM_IOCTL_DATA void * 240 1.2 mrg #define DRM_SPINTYPE kmutex_t 241 1.10 mrg #define DRM_SPININIT(l,name) mutex_init(l, MUTEX_DEFAULT, /*IPL_NONE*/ IPL_VM) 242 1.2 mrg #define DRM_SPINUNINIT(l) mutex_destroy(l) 243 1.2 mrg #define DRM_SPINLOCK(l) mutex_enter(l) 244 1.2 mrg #define DRM_SPINUNLOCK(u) mutex_exit(u) 245 1.2 mrg #define DRM_SPINLOCK_IRQSAVE(l, irqflags) do { \ 246 1.2 mrg mutex_enter(l); \ 247 1.2 mrg (void)irqflags; \ 248 1.2 mrg } while (0) 249 1.2 mrg #define DRM_SPINUNLOCK_IRQRESTORE(u, irqflags) mutex_exit(u) 250 1.11 mrg #define DRM_SPINLOCK_ASSERT(l) mutex_owned(l) 251 1.1 mrg #define DRM_CURRENTPID curproc->p_pid 252 1.11 mrg #define DRM_LOCK() DRM_SPINLOCK(&dev->dev_lock) 253 1.11 mrg #define DRM_UNLOCK() DRM_SPINUNLOCK(&dev->dev_lock) 254 1.11 mrg #define DRM_SYSCTL_HANDLER_ARGS (SYSCTLFN_ARGS) 255 1.11 mrg #define vslock(addr, len) uvm_vslock(curproc->p_vmspace, addr, len, VM_PROT_READ | VM_PROT_WRITE) 256 1.11 mrg #define vsunlock(addr, len) uvm_vsunlock(curproc->p_vmspace, addr, len) 257 1.2 mrg #endif 258 1.1 mrg 259 1.1 mrg #define DRM_IRQ_ARGS void *arg 260 1.11 mrg #if defined(__FreeBSD__) 261 1.1 mrg typedef void irqreturn_t; 262 1.1 mrg #define IRQ_HANDLED /* nothing */ 263 1.1 mrg #define IRQ_NONE /* nothing */ 264 1.11 mrg #elif defined(__NetBSD__) 265 1.2 mrg typedef int irqreturn_t; 266 1.7 bjs #define IRQ_HANDLED 1 267 1.2 mrg #define IRQ_NONE 0 268 1.2 mrg #endif 269 1.1 mrg 270 1.1 mrg enum { 271 1.1 mrg DRM_IS_NOT_AGP, 272 1.1 mrg DRM_IS_AGP, 273 1.1 mrg DRM_MIGHT_BE_AGP 274 1.1 mrg }; 275 1.1 mrg #define DRM_AGP_MEM struct agp_memory_info 276 1.1 mrg 277 1.1 mrg #if defined(__FreeBSD__) 278 1.1 mrg #define drm_get_device_from_kdev(_kdev) (_kdev->si_drv1) 279 1.11 mrg #elif defined(__NetBSD__) 280 1.11 mrg #define drm_get_device_from_kdev(_kdev) ((minor(_kdev) < DRM_MAXUNITS) ? \ 281 1.11 mrg drm_units[minor(_kdev)] : NULL) 282 1.1 mrg #endif 283 1.1 mrg 284 1.1 mrg #if defined(__FreeBSD__) 285 1.1 mrg #define PAGE_ALIGN(addr) round_page(addr) 286 1.1 mrg /* DRM_SUSER returns true if the user is superuser */ 287 1.1 mrg #if __FreeBSD_version >= 700000 288 1.1 mrg #define DRM_SUSER(p) (priv_check(p, PRIV_DRIVER) == 0) 289 1.1 mrg #else 290 1.1 mrg #define DRM_SUSER(p) (suser(p) == 0) 291 1.1 mrg #endif 292 1.1 mrg #define DRM_AGP_FIND_DEVICE() agp_find_device() 293 1.1 mrg #define DRM_MTRR_WC MDF_WRITECOMBINE 294 1.1 mrg #define jiffies ticks 295 1.1 mrg 296 1.11 mrg #elif defined(__NetBSD__) 297 1.1 mrg 298 1.19 mrg #define PAGE_ALIGN(addr) round_page(addr) 299 1.11 mrg #define DRM_SUSER(p) (kauth_cred_getsvuid((p)->p_cred) == 0) 300 1.11 mrg #define DRM_AGP_FIND_DEVICE() agp_find_device(0) 301 1.14 mrg #ifdef MTRR_TYPE_WC 302 1.2 mrg #define DRM_MTRR_WC MTRR_TYPE_WC 303 1.14 mrg #else 304 1.14 mrg #define DRM_MTRR_WC 0 305 1.14 mrg #endif 306 1.26 riastrad #define jiffies getticks() 307 1.2 mrg 308 1.11 mrg #define DRM_MAXUNITS 128 309 1.11 mrg extern struct drm_device *drm_units[]; 310 1.1 mrg 311 1.2 mrg #endif 312 1.2 mrg 313 1.1 mrg /* Capabilities taken from src/sys/dev/pci/pcireg.h. */ 314 1.1 mrg #ifndef PCIY_AGP 315 1.1 mrg #define PCIY_AGP 0x02 316 1.1 mrg #endif 317 1.1 mrg 318 1.1 mrg #ifndef PCIY_EXPRESS 319 1.1 mrg #define PCIY_EXPRESS 0x10 320 1.1 mrg #endif 321 1.1 mrg 322 1.1 mrg typedef unsigned long dma_addr_t; 323 1.11 mrg #if defined(__FreeBSD__) 324 1.1 mrg typedef u_int64_t u64; 325 1.1 mrg typedef u_int32_t u32; 326 1.1 mrg typedef u_int16_t u16; 327 1.1 mrg typedef u_int8_t u8; 328 1.11 mrg #else 329 1.11 mrg typedef uint64_t u64; 330 1.11 mrg typedef uint32_t u32; 331 1.11 mrg typedef uint16_t u16; 332 1.11 mrg typedef uint8_t u8; 333 1.11 mrg #endif 334 1.1 mrg 335 1.1 mrg /* DRM_READMEMORYBARRIER() prevents reordering of reads. 336 1.1 mrg * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. 337 1.1 mrg * DRM_MEMORYBARRIER() prevents reordering of reads and writes. 338 1.1 mrg */ 339 1.11 mrg #if defined(__NetBSD__) 340 1.2 mrg #define DRM_READMEMORYBARRIER() membar_consumer() 341 1.2 mrg #define DRM_WRITEMEMORYBARRIER() membar_producer() 342 1.2 mrg #define DRM_MEMORYBARRIER() membar_sync() 343 1.2 mrg #elif defined(__i386__) 344 1.1 mrg #define DRM_READMEMORYBARRIER() __asm __volatile( \ 345 1.1 mrg "lock; addl $0,0(%%esp)" : : : "memory"); 346 1.1 mrg #define DRM_WRITEMEMORYBARRIER() __asm __volatile("" : : : "memory"); 347 1.1 mrg #define DRM_MEMORYBARRIER() __asm __volatile( \ 348 1.1 mrg "lock; addl $0,0(%%esp)" : : : "memory"); 349 1.1 mrg #elif defined(__alpha__) 350 1.1 mrg #define DRM_READMEMORYBARRIER() alpha_mb(); 351 1.1 mrg #define DRM_WRITEMEMORYBARRIER() alpha_wmb(); 352 1.1 mrg #define DRM_MEMORYBARRIER() alpha_mb(); 353 1.1 mrg #elif defined(__amd64__) 354 1.1 mrg #define DRM_READMEMORYBARRIER() __asm __volatile( \ 355 1.1 mrg "lock; addl $0,0(%%rsp)" : : : "memory"); 356 1.1 mrg #define DRM_WRITEMEMORYBARRIER() __asm __volatile("" : : : "memory"); 357 1.1 mrg #define DRM_MEMORYBARRIER() __asm __volatile( \ 358 1.1 mrg "lock; addl $0,0(%%rsp)" : : : "memory"); 359 1.1 mrg #endif 360 1.1 mrg 361 1.1 mrg #define DRM_COPY_TO_USER(user, kern, size) \ 362 1.1 mrg copyout(kern, user, size) 363 1.1 mrg #define DRM_COPY_FROM_USER(kern, user, size) \ 364 1.1 mrg copyin(user, kern, size) 365 1.1 mrg #define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3) \ 366 1.1 mrg copyin(arg2, arg1, arg3) 367 1.1 mrg #define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3) \ 368 1.1 mrg copyout(arg2, arg1, arg3) 369 1.25 thorpej #if defined(__NetBSD__) 370 1.25 thorpej #define DRM_GET_USER_UNCHECKED(val, uaddr) \ 371 1.25 thorpej (ufetch_32((uint32_t *)(uaddr), &(val)), 0) 372 1.25 thorpej #elif defined(__FreeBSD__) 373 1.1 mrg #define DRM_GET_USER_UNCHECKED(val, uaddr) \ 374 1.1 mrg ((val) = fuword32(uaddr), 0) 375 1.1 mrg #else 376 1.1 mrg #define DRM_GET_USER_UNCHECKED(val, uaddr) \ 377 1.1 mrg ((val) = fuword(uaddr), 0) 378 1.1 mrg #endif 379 1.1 mrg 380 1.1 mrg #define cpu_to_le32(x) htole32(x) 381 1.1 mrg #define le32_to_cpu(x) le32toh(x) 382 1.1 mrg 383 1.1 mrg #define DRM_HZ hz 384 1.1 mrg #define DRM_UDELAY(udelay) DELAY(udelay) 385 1.1 mrg #define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ 386 1.1 mrg 387 1.1 mrg #define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ 388 1.1 mrg (_map) = (_dev)->context_sareas[_ctx]; \ 389 1.1 mrg } while(0) 390 1.1 mrg 391 1.1 mrg #define LOCK_TEST_WITH_RETURN(dev, file_priv) \ 392 1.1 mrg do { \ 393 1.1 mrg if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) || \ 394 1.1 mrg dev->lock.file_priv != file_priv) { \ 395 1.1 mrg DRM_ERROR("%s called without lock held\n", \ 396 1.1 mrg __FUNCTION__); \ 397 1.1 mrg return EINVAL; \ 398 1.1 mrg } \ 399 1.1 mrg } while (0) 400 1.1 mrg 401 1.1 mrg /* Returns -errno to shared code */ 402 1.11 mrg #if defined(__FreeBSD__) 403 1.1 mrg #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ 404 1.1 mrg for ( ret = 0 ; !ret && !(condition) ; ) { \ 405 1.1 mrg DRM_UNLOCK(); \ 406 1.1 mrg mtx_lock(&dev->irq_lock); \ 407 1.1 mrg if (!(condition)) \ 408 1.11 mrg ret = -mtx_sleep(&(queue), &dev->irq_lock, \ 409 1.11 mrg PCATCH, "drmwtq", (timeout)); \ 410 1.1 mrg mtx_unlock(&dev->irq_lock); \ 411 1.1 mrg DRM_LOCK(); \ 412 1.1 mrg } 413 1.11 mrg #elif defined(__NetBSD__) 414 1.3 bjs /* Returns -errno to shared code */ 415 1.2 mrg #define DRM_WAIT_ON( ret, queue, timeout, condition ) \ 416 1.2 mrg for ( ret = 0 ; !ret && !(condition) ; ) { \ 417 1.2 mrg DRM_UNLOCK(); \ 418 1.2 mrg mutex_enter(&dev->irq_lock); \ 419 1.2 mrg if (!(condition)) \ 420 1.11 mrg ret = -mtsleep(&(queue), PCATCH, \ 421 1.2 mrg "drmwtq", (timeout), &dev->irq_lock); \ 422 1.2 mrg mutex_exit(&dev->irq_lock); \ 423 1.2 mrg DRM_LOCK(); \ 424 1.2 mrg } 425 1.1 mrg #endif 426 1.1 mrg 427 1.11 mrg #define DRM_ERROR(fmt, ...) \ 428 1.1 mrg printf("error: [" DRM_NAME ":pid%d:%s] *ERROR* " fmt, \ 429 1.11 mrg DRM_CURRENTPID, __func__ , ##__VA_ARGS__) 430 1.1 mrg 431 1.11 mrg #define DRM_INFO(fmt, ...) printf("info: [" DRM_NAME "] " fmt , ##__VA_ARGS__) 432 1.1 mrg 433 1.11 mrg #define DRM_DEBUG(fmt, ...) do { \ 434 1.1 mrg if (drm_debug_flag) \ 435 1.1 mrg printf("[" DRM_NAME ":pid%d:%s] " fmt, DRM_CURRENTPID, \ 436 1.11 mrg __func__ , ##__VA_ARGS__); \ 437 1.1 mrg } while (0) 438 1.1 mrg 439 1.1 mrg typedef struct drm_pci_id_list 440 1.1 mrg { 441 1.1 mrg int vendor; 442 1.1 mrg int device; 443 1.1 mrg long driver_private; 444 1.11 mrg #if defined(__NetBSD__) 445 1.2 mrg const char *name; 446 1.11 mrg #else 447 1.11 mrg char *name; 448 1.11 mrg #endif 449 1.1 mrg } drm_pci_id_list_t; 450 1.1 mrg 451 1.11 mrg struct drm_msi_blacklist_entry 452 1.11 mrg { 453 1.11 mrg int vendor; 454 1.11 mrg int device; 455 1.11 mrg }; 456 1.11 mrg 457 1.1 mrg #define DRM_AUTH 0x1 458 1.1 mrg #define DRM_MASTER 0x2 459 1.1 mrg #define DRM_ROOT_ONLY 0x4 460 1.1 mrg typedef struct drm_ioctl_desc { 461 1.1 mrg unsigned long cmd; 462 1.1 mrg int (*func)(struct drm_device *dev, void *data, 463 1.1 mrg struct drm_file *file_priv); 464 1.1 mrg int flags; 465 1.1 mrg } drm_ioctl_desc_t; 466 1.1 mrg /** 467 1.1 mrg * Creates a driver or general drm_ioctl_desc array entry for the given 468 1.1 mrg * ioctl, for use by drm_ioctl(). 469 1.1 mrg */ 470 1.1 mrg #define DRM_IOCTL_DEF(ioctl, func, flags) \ 471 1.1 mrg [DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags} 472 1.1 mrg 473 1.1 mrg typedef struct drm_magic_entry { 474 1.1 mrg drm_magic_t magic; 475 1.1 mrg struct drm_file *priv; 476 1.1 mrg struct drm_magic_entry *next; 477 1.1 mrg } drm_magic_entry_t; 478 1.1 mrg 479 1.1 mrg typedef struct drm_magic_head { 480 1.1 mrg struct drm_magic_entry *head; 481 1.1 mrg struct drm_magic_entry *tail; 482 1.1 mrg } drm_magic_head_t; 483 1.1 mrg 484 1.1 mrg typedef struct drm_buf { 485 1.1 mrg int idx; /* Index into master buflist */ 486 1.1 mrg int total; /* Buffer size */ 487 1.1 mrg int order; /* log-base-2(total) */ 488 1.1 mrg int used; /* Amount of buffer in use (for DMA) */ 489 1.1 mrg unsigned long offset; /* Byte offset (used internally) */ 490 1.1 mrg void *address; /* Address of buffer */ 491 1.1 mrg unsigned long bus_address; /* Bus address of buffer */ 492 1.1 mrg struct drm_buf *next; /* Kernel-only: used for free list */ 493 1.1 mrg __volatile__ int pending; /* On hardware DMA queue */ 494 1.1 mrg struct drm_file *file_priv; /* Unique identifier of holding process */ 495 1.1 mrg int context; /* Kernel queue for this buffer */ 496 1.1 mrg enum { 497 1.1 mrg DRM_LIST_NONE = 0, 498 1.1 mrg DRM_LIST_FREE = 1, 499 1.1 mrg DRM_LIST_WAIT = 2, 500 1.1 mrg DRM_LIST_PEND = 3, 501 1.1 mrg DRM_LIST_PRIO = 4, 502 1.1 mrg DRM_LIST_RECLAIM = 5 503 1.1 mrg } list; /* Which list we're on */ 504 1.1 mrg 505 1.1 mrg int dev_priv_size; /* Size of buffer private stoarge */ 506 1.1 mrg void *dev_private; /* Per-buffer private storage */ 507 1.1 mrg } drm_buf_t; 508 1.1 mrg 509 1.1 mrg typedef struct drm_freelist { 510 1.1 mrg int initialized; /* Freelist in use */ 511 1.1 mrg atomic_t count; /* Number of free buffers */ 512 1.1 mrg drm_buf_t *next; /* End pointer */ 513 1.1 mrg 514 1.1 mrg int low_mark; /* Low water mark */ 515 1.1 mrg int high_mark; /* High water mark */ 516 1.1 mrg } drm_freelist_t; 517 1.1 mrg 518 1.1 mrg typedef struct drm_dma_handle { 519 1.1 mrg void *vaddr; 520 1.1 mrg bus_addr_t busaddr; 521 1.1 mrg bus_dma_tag_t tag; 522 1.1 mrg bus_dmamap_t map; 523 1.9 bjs #if defined(__NetBSD__) 524 1.11 mrg size_t size; 525 1.12 mrg size_t nsegs; 526 1.2 mrg bus_dma_segment_t segs[1]; 527 1.1 mrg #endif 528 1.1 mrg } drm_dma_handle_t; 529 1.1 mrg 530 1.1 mrg typedef struct drm_buf_entry { 531 1.1 mrg int buf_size; 532 1.1 mrg int buf_count; 533 1.1 mrg drm_buf_t *buflist; 534 1.1 mrg int seg_count; 535 1.1 mrg drm_dma_handle_t **seglist; 536 1.1 mrg int page_order; 537 1.1 mrg 538 1.1 mrg drm_freelist_t freelist; 539 1.1 mrg } drm_buf_entry_t; 540 1.1 mrg 541 1.1 mrg typedef TAILQ_HEAD(drm_file_list, drm_file) drm_file_list_t; 542 1.1 mrg struct drm_file { 543 1.1 mrg TAILQ_ENTRY(drm_file) link; 544 1.11 mrg struct drm_device *dev; 545 1.1 mrg int authenticated; 546 1.1 mrg int master; 547 1.1 mrg int minor; 548 1.1 mrg pid_t pid; 549 1.1 mrg uid_t uid; 550 1.1 mrg drm_magic_t magic; 551 1.1 mrg unsigned long ioctl_count; 552 1.1 mrg void *driver_priv; 553 1.1 mrg }; 554 1.1 mrg 555 1.1 mrg typedef struct drm_lock_data { 556 1.11 mrg struct drm_hw_lock *hw_lock; /* Hardware lock */ 557 1.1 mrg struct drm_file *file_priv; /* Unique identifier of holding process (NULL is kernel)*/ 558 1.1 mrg int lock_queue; /* Queue of blocked processes */ 559 1.1 mrg unsigned long lock_time; /* Time of last lock in jiffies */ 560 1.1 mrg } drm_lock_data_t; 561 1.1 mrg 562 1.1 mrg /* This structure, in the struct drm_device, is always initialized while the 563 1.1 mrg * device 564 1.1 mrg * is open. dev->dma_lock protects the incrementing of dev->buf_use, which 565 1.1 mrg * when set marks that no further bufs may be allocated until device teardown 566 1.1 mrg * occurs (when the last open of the device has closed). The high/low 567 1.1 mrg * watermarks of bufs are only touched by the X Server, and thus not 568 1.1 mrg * concurrently accessed, so no locking is needed. 569 1.1 mrg */ 570 1.1 mrg typedef struct drm_device_dma { 571 1.1 mrg drm_buf_entry_t bufs[DRM_MAX_ORDER+1]; 572 1.1 mrg int buf_count; 573 1.1 mrg drm_buf_t **buflist; /* Vector of pointers info bufs */ 574 1.1 mrg int seg_count; 575 1.1 mrg int page_count; 576 1.1 mrg unsigned long *pagelist; 577 1.1 mrg unsigned long byte_count; 578 1.1 mrg enum { 579 1.1 mrg _DRM_DMA_USE_AGP = 0x01, 580 1.1 mrg _DRM_DMA_USE_SG = 0x02 581 1.1 mrg } flags; 582 1.1 mrg } drm_device_dma_t; 583 1.1 mrg 584 1.1 mrg typedef struct drm_agp_mem { 585 1.1 mrg void *handle; 586 1.1 mrg unsigned long bound; /* address */ 587 1.1 mrg int pages; 588 1.1 mrg struct drm_agp_mem *prev; 589 1.1 mrg struct drm_agp_mem *next; 590 1.1 mrg } drm_agp_mem_t; 591 1.1 mrg 592 1.1 mrg typedef struct drm_agp_head { 593 1.1 mrg device_t agpdev; 594 1.1 mrg struct agp_info info; 595 1.1 mrg const char *chipset; 596 1.1 mrg drm_agp_mem_t *memory; 597 1.1 mrg unsigned long mode; 598 1.1 mrg int enabled; 599 1.1 mrg int acquired; 600 1.1 mrg unsigned long base; 601 1.1 mrg int mtrr; 602 1.1 mrg int cant_use_aperture; 603 1.1 mrg unsigned long page_mask; 604 1.1 mrg } drm_agp_head_t; 605 1.1 mrg 606 1.1 mrg typedef struct drm_sg_mem { 607 1.11 mrg unsigned long handle; 608 1.11 mrg void *virtual; 609 1.11 mrg int pages; 610 1.11 mrg dma_addr_t *busaddr; 611 1.11 mrg struct drm_dma_handle *sg_dmah; /* Handle for sg_pages */ 612 1.11 mrg struct drm_dma_handle *dmah; /* Handle to PCI memory */ 613 1.11 mrg /* for ATI PCIGART table */ 614 1.1 mrg } drm_sg_mem_t; 615 1.1 mrg 616 1.1 mrg typedef TAILQ_HEAD(drm_map_list, drm_local_map) drm_map_list_t; 617 1.1 mrg 618 1.16 jmorse #if defined(__NetBSD__) 619 1.16 jmorse typedef struct { 620 1.16 jmorse int mapped; 621 1.16 jmorse int maptype; 622 1.16 jmorse bus_addr_t base; 623 1.16 jmorse bus_size_t size; 624 1.16 jmorse bus_space_handle_t bsh; 625 1.16 jmorse int flags; 626 1.16 jmorse void * vaddr; 627 1.16 jmorse } pci_map_data_t; 628 1.18 mrg 629 1.18 mrg /* XXX */ 630 1.18 mrg #define readl(va) (*(volatile u_int32_t *) (va)) 631 1.16 jmorse #endif 632 1.16 jmorse 633 1.1 mrg typedef struct drm_local_map { 634 1.1 mrg unsigned long offset; /* Physical address (0 for SAREA)*/ 635 1.1 mrg unsigned long size; /* Physical size (bytes) */ 636 1.11 mrg enum drm_map_type type; /* Type of memory mapped */ 637 1.11 mrg enum drm_map_flags flags; /* Flags */ 638 1.1 mrg void *handle; /* User-space: "Handle" to pass to mmap */ 639 1.1 mrg /* Kernel-space: kernel-virtual address */ 640 1.1 mrg int mtrr; /* Boolean: MTRR used */ 641 1.1 mrg /* Private data */ 642 1.1 mrg int rid; /* PCI resource ID for bus_space */ 643 1.11 mrg #if defined(__FreeBSD__) 644 1.1 mrg struct resource *bsr; 645 1.2 mrg #endif 646 1.1 mrg bus_space_tag_t bst; 647 1.1 mrg bus_space_handle_t bsh; 648 1.1 mrg drm_dma_handle_t *dmah; 649 1.11 mrg #if defined(__NetBSD__) 650 1.16 jmorse pci_map_data_t *fullmap; 651 1.12 mrg bus_size_t mapsize; 652 1.2 mrg #endif 653 1.1 mrg TAILQ_ENTRY(drm_local_map) link; 654 1.1 mrg } drm_local_map_t; 655 1.1 mrg 656 1.1 mrg TAILQ_HEAD(drm_vbl_sig_list, drm_vbl_sig); 657 1.1 mrg typedef struct drm_vbl_sig { 658 1.1 mrg TAILQ_ENTRY(drm_vbl_sig) link; 659 1.1 mrg unsigned int sequence; 660 1.1 mrg int signo; 661 1.1 mrg int pid; 662 1.1 mrg } drm_vbl_sig_t; 663 1.1 mrg 664 1.11 mrg struct drm_vblank_info { 665 1.11 mrg wait_queue_head_t queue; /* vblank wait queue */ 666 1.11 mrg atomic_t count; /* number of VBLANK interrupts */ 667 1.11 mrg /* (driver must alloc the right number of counters) */ 668 1.11 mrg struct drm_vbl_sig_list sigs; /* signal list to send on VBLANK */ 669 1.11 mrg atomic_t refcount; /* number of users of vblank interrupts */ 670 1.11 mrg u32 last; /* protected by dev->vbl_lock, used */ 671 1.11 mrg /* for wraparound handling */ 672 1.11 mrg int enabled; /* so we don't call enable more than */ 673 1.11 mrg /* once per disable */ 674 1.11 mrg int inmodeset; /* Display driver is setting mode */ 675 1.11 mrg }; 676 1.11 mrg 677 1.1 mrg /* location of GART table */ 678 1.1 mrg #define DRM_ATI_GART_MAIN 1 679 1.1 mrg #define DRM_ATI_GART_FB 2 680 1.1 mrg 681 1.1 mrg #define DRM_ATI_GART_PCI 1 682 1.1 mrg #define DRM_ATI_GART_PCIE 2 683 1.1 mrg #define DRM_ATI_GART_IGP 3 684 1.1 mrg 685 1.1 mrg struct drm_ati_pcigart_info { 686 1.1 mrg int gart_table_location; 687 1.1 mrg int gart_reg_if; 688 1.1 mrg void *addr; 689 1.1 mrg dma_addr_t bus_addr; 690 1.1 mrg dma_addr_t table_mask; 691 1.1 mrg dma_addr_t member_mask; 692 1.1 mrg struct drm_dma_handle *table_handle; 693 1.1 mrg drm_local_map_t mapping; 694 1.1 mrg int table_size; 695 1.1 mrg }; 696 1.1 mrg 697 1.1 mrg #ifndef DMA_BIT_MASK 698 1.22 joerg #define DMA_BIT_MASK(n) ((dma_addr_t)(((n) == 64) ? ~0ULL : (1ULL<<(n)) - 1)) 699 1.1 mrg #endif 700 1.1 mrg 701 1.8 mrg #define upper_32_bits(n) ((u32)(((n) >> 16) >> 16)) 702 1.1 mrg 703 1.1 mrg struct drm_driver_info { 704 1.1 mrg int (*load)(struct drm_device *, unsigned long flags); 705 1.1 mrg int (*firstopen)(struct drm_device *); 706 1.11 mrg int (*open)(struct drm_device *, struct drm_file *); 707 1.1 mrg void (*preclose)(struct drm_device *, struct drm_file *file_priv); 708 1.11 mrg void (*postclose)(struct drm_device *, struct drm_file *); 709 1.1 mrg void (*lastclose)(struct drm_device *); 710 1.1 mrg int (*unload)(struct drm_device *); 711 1.1 mrg void (*reclaim_buffers_locked)(struct drm_device *, 712 1.1 mrg struct drm_file *file_priv); 713 1.1 mrg int (*dma_ioctl)(struct drm_device *dev, void *data, 714 1.1 mrg struct drm_file *file_priv); 715 1.1 mrg void (*dma_ready)(struct drm_device *); 716 1.1 mrg int (*dma_quiescent)(struct drm_device *); 717 1.1 mrg int (*dma_flush_block_and_flush)(struct drm_device *, int context, 718 1.11 mrg enum drm_lock_flags flags); 719 1.1 mrg int (*dma_flush_unblock)(struct drm_device *, int context, 720 1.11 mrg enum drm_lock_flags flags); 721 1.1 mrg int (*context_ctor)(struct drm_device *dev, int context); 722 1.1 mrg int (*context_dtor)(struct drm_device *dev, int context); 723 1.1 mrg int (*kernel_context_switch)(struct drm_device *dev, int old, 724 1.1 mrg int new); 725 1.1 mrg int (*kernel_context_switch_unlock)(struct drm_device *dev); 726 1.1 mrg void (*irq_preinstall)(struct drm_device *dev); 727 1.1 mrg int (*irq_postinstall)(struct drm_device *dev); 728 1.1 mrg void (*irq_uninstall)(struct drm_device *dev); 729 1.11 mrg irqreturn_t (*irq_handler)(DRM_IRQ_ARGS); 730 1.21 mrg u32 (*get_vblank_counter)(struct drm_device *dev, unsigned int crtc); 731 1.21 mrg int (*enable_vblank)(struct drm_device *dev, unsigned int crtc); 732 1.21 mrg void (*disable_vblank)(struct drm_device *dev, unsigned int crtc); 733 1.1 mrg 734 1.1 mrg drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ 735 1.1 mrg 736 1.1 mrg /** 737 1.1 mrg * Called by \c drm_device_is_agp. Typically used to determine if a 738 1.1 mrg * card is really attached to AGP or not. 739 1.1 mrg * 740 1.1 mrg * \param dev DRM device handle 741 1.1 mrg * 742 1.1 mrg * \returns 743 1.1 mrg * One of three values is returned depending on whether or not the 744 1.1 mrg * card is absolutely \b not AGP (return of 0), absolutely \b is AGP 745 1.1 mrg * (return of 1), or may or may not be AGP (return of 2). 746 1.1 mrg */ 747 1.1 mrg int (*device_is_agp) (struct drm_device * dev); 748 1.1 mrg 749 1.1 mrg drm_ioctl_desc_t *ioctls; 750 1.1 mrg int max_ioctl; 751 1.1 mrg 752 1.1 mrg int buf_priv_size; 753 1.1 mrg 754 1.1 mrg int major; 755 1.1 mrg int minor; 756 1.1 mrg int patchlevel; 757 1.1 mrg const char *name; /* Simple driver name */ 758 1.1 mrg const char *desc; /* Longer driver name */ 759 1.1 mrg const char *date; /* Date of last major changes. */ 760 1.1 mrg 761 1.11 mrg u32 driver_features; 762 1.1 mrg }; 763 1.1 mrg 764 1.1 mrg /* Length for the array of resource pointers for drm_get_resource_*. */ 765 1.11 mrg #define DRM_MAX_PCI_RESOURCE 6 766 1.1 mrg 767 1.1 mrg /** 768 1.1 mrg * DRM device functions structure 769 1.1 mrg */ 770 1.1 mrg struct drm_device { 771 1.11 mrg struct drm_driver_info *driver; 772 1.1 mrg drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ 773 1.1 mrg 774 1.1 mrg u_int16_t pci_device; /* PCI device id */ 775 1.1 mrg u_int16_t pci_vendor; /* PCI vendor id */ 776 1.1 mrg 777 1.1 mrg char *unique; /* Unique identifier: e.g., busid */ 778 1.1 mrg int unique_len; /* Length of unique field */ 779 1.1 mrg device_t device; /* Device instance from newbus */ 780 1.11 mrg #if defined(__FreeBSD__) 781 1.2 mrg struct cdev *devnode; /* Device number for mknod */ 782 1.1 mrg #endif 783 1.1 mrg int if_version; /* Highest interface version set */ 784 1.1 mrg 785 1.1 mrg int flags; /* Flags to open(2) */ 786 1.1 mrg 787 1.1 mrg /* Locks */ 788 1.2 mrg DRM_SPINTYPE vbl_lock; /* protects vblank operations */ 789 1.2 mrg DRM_SPINTYPE dma_lock; /* protects dev->dma */ 790 1.2 mrg DRM_SPINTYPE irq_lock; /* protects irq condition checks */ 791 1.11 mrg DRM_SPINTYPE dev_lock; /* protects everything else */ 792 1.1 mrg DRM_SPINTYPE drw_lock; 793 1.1 mrg 794 1.1 mrg /* Usage Counters */ 795 1.1 mrg int open_count; /* Outstanding files open */ 796 1.1 mrg int buf_use; /* Buffers in use -- cannot alloc */ 797 1.1 mrg 798 1.1 mrg /* Performance counters */ 799 1.1 mrg unsigned long counters; 800 1.11 mrg enum drm_stat_type types[15]; 801 1.1 mrg atomic_t counts[15]; 802 1.1 mrg 803 1.1 mrg /* Authentication */ 804 1.1 mrg drm_file_list_t files; 805 1.1 mrg drm_magic_head_t magiclist[DRM_HASH_SIZE]; 806 1.1 mrg 807 1.1 mrg /* Linked list of mappable regions. Protected by dev_lock */ 808 1.1 mrg drm_map_list_t maplist; 809 1.1 mrg 810 1.1 mrg drm_local_map_t **context_sareas; 811 1.1 mrg int max_context; 812 1.1 mrg 813 1.1 mrg drm_lock_data_t lock; /* Information on hardware lock */ 814 1.1 mrg 815 1.1 mrg /* DMA queues (contexts) */ 816 1.1 mrg drm_device_dma_t *dma; /* Optional pointer for DMA support */ 817 1.1 mrg 818 1.1 mrg /* Context support */ 819 1.1 mrg int irq; /* Interrupt used by board */ 820 1.1 mrg int irq_enabled; /* True if the irq handler is enabled */ 821 1.11 mrg int msi_enabled; /* MSI enabled */ 822 1.11 mrg #if defined(__FreeBSD__) 823 1.1 mrg int irqrid; /* Interrupt used by board */ 824 1.1 mrg struct resource *irqr; /* Resource for interrupt used by board */ 825 1.2 mrg 826 1.2 mrg /* Storage of resource pointers for drm_get_resource_* */ 827 1.2 mrg struct resource *pcir[DRM_MAX_PCI_RESOURCE]; 828 1.2 mrg int pcirid[DRM_MAX_PCI_RESOURCE]; 829 1.11 mrg #elif defined(__NetBSD__) 830 1.1 mrg struct pci_attach_args pa; 831 1.2 mrg pci_map_data_t pci_map_data[DRM_MAX_PCI_RESOURCE]; 832 1.2 mrg pci_map_data_t agp_map_data[DRM_MAX_PCI_RESOURCE]; 833 1.11 mrg dev_t kdev; 834 1.1 mrg #endif 835 1.1 mrg void *irqh; /* Handle from bus_setup_intr */ 836 1.1 mrg 837 1.1 mrg int pci_domain; 838 1.1 mrg int pci_bus; 839 1.1 mrg int pci_slot; 840 1.1 mrg int pci_func; 841 1.1 mrg 842 1.1 mrg atomic_t context_flag; /* Context swapping flag */ 843 1.1 mrg int last_context; /* Last current context */ 844 1.11 mrg 845 1.6 mrg int vblank_disable_allowed; 846 1.11 mrg atomic_t vbl_signal_pending; /* number of signals pending on all crtcs */ 847 1.1 mrg struct callout vblank_disable_timer; 848 1.1 mrg u32 max_vblank_count; /* size of vblank counter register */ 849 1.11 mrg struct drm_vblank_info *vblank; /* per crtc vblank info */ 850 1.1 mrg int num_crtcs; 851 1.1 mrg 852 1.11 mrg #if defined(__FreeBSD__) 853 1.1 mrg struct sigio *buf_sigio; /* Processes waiting for SIGIO */ 854 1.11 mrg #elif defined(__NetBSD__) 855 1.12 mrg pid_t buf_pgid; 856 1.1 mrg #endif 857 1.1 mrg 858 1.1 mrg /* Sysctl support */ 859 1.1 mrg struct drm_sysctl_info *sysctl; 860 1.1 mrg 861 1.1 mrg drm_agp_head_t *agp; 862 1.1 mrg drm_sg_mem_t *sg; /* Scatter gather memory */ 863 1.1 mrg atomic_t *ctx_bitmap; 864 1.1 mrg void *dev_private; 865 1.1 mrg unsigned int agp_buffer_token; 866 1.1 mrg drm_local_map_t *agp_buffer_map; 867 1.1 mrg 868 1.11 mrg #if defined(__FreeBSD__) 869 1.1 mrg struct unrhdr *drw_unrhdr; 870 1.11 mrg #elif defined(__NetBSD__) 871 1.12 mrg int drw_no; 872 1.4 jmcneill #endif 873 1.1 mrg /* RB tree of drawable infos */ 874 1.1 mrg RB_HEAD(drawable_tree, bsd_drm_drawable_info) drw_head; 875 1.11 mrg }; 876 1.11 mrg 877 1.11 mrg static __inline__ int drm_core_check_feature(struct drm_device *dev, 878 1.11 mrg int feature) 879 1.11 mrg { 880 1.11 mrg return ((dev->driver->driver_features & feature) ? 1 : 0); 881 1.11 mrg } 882 1.1 mrg 883 1.11 mrg #if __OS_HAS_AGP 884 1.11 mrg static inline int drm_core_has_AGP(struct drm_device *dev) 885 1.11 mrg { 886 1.11 mrg return drm_core_check_feature(dev, DRIVER_USE_AGP); 887 1.11 mrg } 888 1.11 mrg #else 889 1.11 mrg #define drm_core_has_AGP(dev) (0) 890 1.4 jmcneill #endif 891 1.1 mrg 892 1.17 mrg #if defined(__FreeBSD__) 893 1.17 mrg 894 1.17 mrg #define DRM_READ8(map, offset) \ 895 1.17 mrg *(volatile u_int8_t *)(((vm_offset_t)(map)->handle) + \ 896 1.17 mrg (vm_offset_t)(offset)) 897 1.17 mrg #define DRM_READ16(map, offset) \ 898 1.17 mrg *(volatile u_int16_t *)(((vm_offset_t)(map)->handle) + \ 899 1.17 mrg (vm_offset_t)(offset)) 900 1.17 mrg #define DRM_READ32(map, offset) \ 901 1.17 mrg *(volatile u_int32_t *)(((vm_offset_t)(map)->handle) + \ 902 1.17 mrg (vm_offset_t)(offset)) 903 1.17 mrg #define DRM_WRITE8(map, offset, val) \ 904 1.17 mrg *(volatile u_int8_t *)(((vm_offset_t)(map)->handle) + \ 905 1.17 mrg (vm_offset_t)(offset)) = val 906 1.17 mrg #define DRM_WRITE16(map, offset, val) \ 907 1.17 mrg *(volatile u_int16_t *)(((vm_offset_t)(map)->handle) + \ 908 1.17 mrg (vm_offset_t)(offset)) = val 909 1.17 mrg #define DRM_WRITE32(map, offset, val) \ 910 1.17 mrg *(volatile u_int32_t *)(((vm_offset_t)(map)->handle) + \ 911 1.17 mrg (vm_offset_t)(offset)) = val 912 1.17 mrg 913 1.17 mrg #define DRM_VERIFYAREA_READ( uaddr, size ) \ 914 1.17 mrg (!useracc(__DECONST(caddr_t, uaddr), size, VM_PROT_READ)) 915 1.17 mrg 916 1.17 mrg #elif defined(__NetBSD__) 917 1.17 mrg 918 1.17 mrg typedef vaddr_t vm_offset_t; 919 1.17 mrg 920 1.17 mrg #define DRM_IS_BUS_SPACE(map) ((map)->type == _DRM_REGISTERS || \ 921 1.17 mrg (map)->type == _DRM_CONSISTENT) 922 1.17 mrg 923 1.17 mrg static __inline__ u_int8_t 924 1.17 mrg DRM_READ8(drm_local_map_t *map, bus_size_t offset) 925 1.17 mrg { 926 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 927 1.17 mrg return bus_space_read_1(map->bst, map->bsh, offset); 928 1.17 mrg else 929 1.17 mrg return *(volatile u_int8_t *)((vaddr_t)map->handle + offset); 930 1.17 mrg } 931 1.17 mrg 932 1.17 mrg static __inline__ u_int16_t 933 1.17 mrg DRM_READ16(drm_local_map_t *map, bus_size_t offset) 934 1.17 mrg { 935 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 936 1.17 mrg return bus_space_read_2(map->bst, map->bsh, offset); 937 1.17 mrg else 938 1.17 mrg return *(volatile u_int16_t *)((vaddr_t)map->handle + offset); 939 1.17 mrg } 940 1.17 mrg 941 1.17 mrg static __inline__ u_int32_t 942 1.17 mrg DRM_READ32(drm_local_map_t *map, bus_size_t offset) 943 1.17 mrg { 944 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 945 1.17 mrg return bus_space_read_4(map->bst, map->bsh, offset); 946 1.17 mrg else 947 1.17 mrg return *(volatile u_int32_t *)((vaddr_t)map->handle + offset); 948 1.17 mrg } 949 1.17 mrg 950 1.17 mrg static __inline__ void 951 1.17 mrg DRM_WRITE8(drm_local_map_t *map, bus_size_t offset, u_int8_t val) 952 1.17 mrg { 953 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 954 1.17 mrg bus_space_write_1(map->bst, map->bsh, offset, val); 955 1.17 mrg else 956 1.17 mrg *(volatile u_int8_t *)((vaddr_t)map->handle + offset) = val; 957 1.17 mrg } 958 1.17 mrg 959 1.17 mrg static __inline__ void 960 1.17 mrg DRM_WRITE16(drm_local_map_t *map, bus_size_t offset, u_int16_t val) 961 1.17 mrg { 962 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 963 1.17 mrg bus_space_write_2(map->bst, map->bsh, offset, val); 964 1.17 mrg else 965 1.17 mrg *(volatile u_int16_t *)((vaddr_t)map->handle + offset) = val; 966 1.17 mrg } 967 1.17 mrg 968 1.17 mrg static __inline__ void 969 1.17 mrg DRM_WRITE32(drm_local_map_t *map, bus_size_t offset, u_int32_t val) 970 1.17 mrg { 971 1.17 mrg if (DRM_IS_BUS_SPACE(map)) 972 1.17 mrg bus_space_write_4(map->bst, map->bsh, offset, val); 973 1.17 mrg else 974 1.17 mrg *(volatile u_int32_t *)((vaddr_t)map->handle + offset) = val; 975 1.17 mrg } 976 1.17 mrg 977 1.17 mrg #define DRM_VERIFYAREA_READ( uaddr, size ) \ 978 1.17 mrg (!uvm_map_checkprot(&(curproc->p_vmspace->vm_map), \ 979 1.17 mrg (vaddr_t)uaddr, (vaddr_t)uaddr+size, UVM_PROT_READ)) 980 1.17 mrg 981 1.17 mrg #endif 982 1.17 mrg 983 1.1 mrg extern int drm_debug_flag; 984 1.1 mrg 985 1.1 mrg /* Device setup support (drm_drv.c) */ 986 1.11 mrg #if defined(__FreeBSD__) 987 1.11 mrg int drm_probe(device_t kdev, drm_pci_id_list_t *idlist); 988 1.11 mrg int drm_attach(device_t kdev, drm_pci_id_list_t *idlist); 989 1.11 mrg void drm_close(void *data); 990 1.11 mrg int drm_detach(device_t kdev); 991 1.1 mrg d_ioctl_t drm_ioctl; 992 1.1 mrg d_open_t drm_open; 993 1.1 mrg d_read_t drm_read; 994 1.1 mrg d_poll_t drm_poll; 995 1.1 mrg d_mmap_t drm_mmap; 996 1.11 mrg #elif defined(__NetBSD__) 997 1.1 mrg int drm_probe(struct pci_attach_args *pa, drm_pci_id_list_t *idlist); 998 1.11 mrg void drm_attach(device_t kdev, struct pci_attach_args *pa, drm_pci_id_list_t *idlist); 999 1.11 mrg int drm_detach(device_t self, int flags); 1000 1.1 mrg dev_type_ioctl(drm_ioctl); 1001 1.1 mrg dev_type_open(drm_open); 1002 1.1 mrg dev_type_close(drm_close); 1003 1.1 mrg dev_type_read(drm_read); 1004 1.1 mrg dev_type_poll(drm_poll); 1005 1.1 mrg dev_type_mmap(drm_mmap); 1006 1.1 mrg #endif 1007 1.1 mrg extern drm_local_map_t *drm_getsarea(struct drm_device *dev); 1008 1.1 mrg 1009 1.11 mrg int drm_close_pid(struct drm_device *dev, struct drm_file *priv, pid_t pid); 1010 1.2 mrg 1011 1.1 mrg /* File operations helpers (drm_fops.c) */ 1012 1.11 mrg #if defined(__FreeBSD__) 1013 1.1 mrg extern int drm_open_helper(struct cdev *kdev, int flags, int fmt, 1014 1.1 mrg DRM_STRUCTPROC *p, 1015 1.1 mrg struct drm_device *dev); 1016 1.11 mrg #elif defined(__NetBSD__) 1017 1.11 mrg extern struct drm_file *drm_find_file_by_proc(struct drm_device *dev, 1018 1.11 mrg struct proc *p); 1019 1.11 mrg extern int drm_open_helper(dev_t kdev, int flags, int fmt, 1020 1.11 mrg struct proc *p, struct drm_device *dev); 1021 1.11 mrg #endif 1022 1.1 mrg 1023 1.1 mrg /* Memory management support (drm_memory.c) */ 1024 1.1 mrg void drm_mem_init(void); 1025 1.1 mrg void drm_mem_uninit(void); 1026 1.11 mrg void *drm_ioremap_wc(struct drm_device *dev, drm_local_map_t *map); 1027 1.1 mrg void *drm_ioremap(struct drm_device *dev, drm_local_map_t *map); 1028 1.1 mrg void drm_ioremapfree(drm_local_map_t *map); 1029 1.1 mrg int drm_mtrr_add(unsigned long offset, size_t size, int flags); 1030 1.1 mrg int drm_mtrr_del(int handle, unsigned long offset, size_t size, int flags); 1031 1.1 mrg 1032 1.1 mrg int drm_context_switch(struct drm_device *dev, int old, int new); 1033 1.1 mrg int drm_context_switch_complete(struct drm_device *dev, int new); 1034 1.1 mrg 1035 1.1 mrg int drm_ctxbitmap_init(struct drm_device *dev); 1036 1.1 mrg void drm_ctxbitmap_cleanup(struct drm_device *dev); 1037 1.1 mrg void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle); 1038 1.1 mrg int drm_ctxbitmap_next(struct drm_device *dev); 1039 1.1 mrg 1040 1.1 mrg /* Locking IOCTL support (drm_lock.c) */ 1041 1.11 mrg int drm_lock_take(struct drm_lock_data *lock_data, 1042 1.11 mrg unsigned int context); 1043 1.11 mrg int drm_lock_transfer(struct drm_lock_data *lock_data, 1044 1.1 mrg unsigned int context); 1045 1.11 mrg int drm_lock_free(struct drm_lock_data *lock_data, 1046 1.1 mrg unsigned int context); 1047 1.1 mrg 1048 1.1 mrg /* Buffer management support (drm_bufs.c) */ 1049 1.1 mrg unsigned long drm_get_resource_start(struct drm_device *dev, 1050 1.1 mrg unsigned int resource); 1051 1.1 mrg unsigned long drm_get_resource_len(struct drm_device *dev, 1052 1.1 mrg unsigned int resource); 1053 1.1 mrg void drm_rmmap(struct drm_device *dev, drm_local_map_t *map); 1054 1.1 mrg int drm_order(unsigned long size); 1055 1.1 mrg int drm_addmap(struct drm_device *dev, unsigned long offset, 1056 1.1 mrg unsigned long size, 1057 1.11 mrg enum drm_map_type type, enum drm_map_flags flags, 1058 1.1 mrg drm_local_map_t **map_ptr); 1059 1.11 mrg int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request); 1060 1.11 mrg int drm_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request); 1061 1.11 mrg int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request); 1062 1.1 mrg 1063 1.1 mrg /* DMA support (drm_dma.c) */ 1064 1.1 mrg int drm_dma_setup(struct drm_device *dev); 1065 1.1 mrg void drm_dma_takedown(struct drm_device *dev); 1066 1.1 mrg void drm_free_buffer(struct drm_device *dev, drm_buf_t *buf); 1067 1.1 mrg void drm_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv); 1068 1.1 mrg #define drm_core_reclaim_buffers drm_reclaim_buffers 1069 1.1 mrg 1070 1.1 mrg /* IRQ support (drm_irq.c) */ 1071 1.1 mrg int drm_irq_install(struct drm_device *dev); 1072 1.1 mrg int drm_irq_uninstall(struct drm_device *dev); 1073 1.1 mrg irqreturn_t drm_irq_handler(DRM_IRQ_ARGS); 1074 1.1 mrg void drm_driver_irq_preinstall(struct drm_device *dev); 1075 1.1 mrg void drm_driver_irq_postinstall(struct drm_device *dev); 1076 1.1 mrg void drm_driver_irq_uninstall(struct drm_device *dev); 1077 1.21 mrg void drm_handle_vblank(struct drm_device *dev, unsigned int crtc); 1078 1.21 mrg u32 drm_vblank_count(struct drm_device *dev, unsigned int crtc); 1079 1.21 mrg int drm_vblank_get(struct drm_device *dev, unsigned int crtc); 1080 1.21 mrg void drm_vblank_put(struct drm_device *dev, unsigned int crtc); 1081 1.11 mrg void drm_vblank_cleanup(struct drm_device *dev); 1082 1.1 mrg int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); 1083 1.1 mrg int drm_vblank_init(struct drm_device *dev, int num_crtcs); 1084 1.21 mrg void drm_vbl_send_signals(struct drm_device *dev, unsigned int crtc); 1085 1.1 mrg int drm_modeset_ctl(struct drm_device *dev, void *data, 1086 1.1 mrg struct drm_file *file_priv); 1087 1.1 mrg 1088 1.1 mrg /* AGP/PCI Express/GART support (drm_agpsupport.c) */ 1089 1.1 mrg int drm_device_is_agp(struct drm_device *dev); 1090 1.1 mrg int drm_device_is_pcie(struct drm_device *dev); 1091 1.11 mrg drm_agp_head_t *drm_agp_init(struct drm_device *dev); 1092 1.1 mrg int drm_agp_acquire(struct drm_device *dev); 1093 1.1 mrg int drm_agp_release(struct drm_device *dev); 1094 1.11 mrg int drm_agp_info(struct drm_device * dev, struct drm_agp_info *info); 1095 1.11 mrg int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); 1096 1.1 mrg void *drm_agp_allocate_memory(size_t pages, u32 type); 1097 1.1 mrg int drm_agp_free_memory(void *handle); 1098 1.1 mrg int drm_agp_bind_memory(void *handle, off_t start); 1099 1.1 mrg int drm_agp_unbind_memory(void *handle); 1100 1.11 mrg int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); 1101 1.11 mrg int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); 1102 1.11 mrg int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); 1103 1.11 mrg int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); 1104 1.1 mrg 1105 1.1 mrg /* Scatter Gather Support (drm_scatter.c) */ 1106 1.1 mrg void drm_sg_cleanup(drm_sg_mem_t *entry); 1107 1.11 mrg int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request); 1108 1.1 mrg 1109 1.1 mrg /* sysctl support (drm_sysctl.h) */ 1110 1.1 mrg extern int drm_sysctl_init(struct drm_device *dev); 1111 1.1 mrg extern int drm_sysctl_cleanup(struct drm_device *dev); 1112 1.1 mrg 1113 1.1 mrg /* ATI PCIGART support (ati_pcigart.c) */ 1114 1.1 mrg int drm_ati_pcigart_init(struct drm_device *dev, 1115 1.1 mrg struct drm_ati_pcigart_info *gart_info); 1116 1.1 mrg int drm_ati_pcigart_cleanup(struct drm_device *dev, 1117 1.1 mrg struct drm_ati_pcigart_info *gart_info); 1118 1.1 mrg 1119 1.1 mrg /* Locking IOCTL support (drm_drv.c) */ 1120 1.1 mrg int drm_lock(struct drm_device *dev, void *data, 1121 1.1 mrg struct drm_file *file_priv); 1122 1.1 mrg int drm_unlock(struct drm_device *dev, void *data, 1123 1.1 mrg struct drm_file *file_priv); 1124 1.1 mrg int drm_version(struct drm_device *dev, void *data, 1125 1.1 mrg struct drm_file *file_priv); 1126 1.1 mrg int drm_setversion(struct drm_device *dev, void *data, 1127 1.1 mrg struct drm_file *file_priv); 1128 1.1 mrg 1129 1.1 mrg /* Misc. IOCTL support (drm_ioctl.c) */ 1130 1.1 mrg int drm_irq_by_busid(struct drm_device *dev, void *data, 1131 1.1 mrg struct drm_file *file_priv); 1132 1.1 mrg int drm_getunique(struct drm_device *dev, void *data, 1133 1.1 mrg struct drm_file *file_priv); 1134 1.1 mrg int drm_setunique(struct drm_device *dev, void *data, 1135 1.1 mrg struct drm_file *file_priv); 1136 1.1 mrg int drm_getmap(struct drm_device *dev, void *data, 1137 1.1 mrg struct drm_file *file_priv); 1138 1.1 mrg int drm_getclient(struct drm_device *dev, void *data, 1139 1.1 mrg struct drm_file *file_priv); 1140 1.1 mrg int drm_getstats(struct drm_device *dev, void *data, 1141 1.1 mrg struct drm_file *file_priv); 1142 1.1 mrg int drm_noop(struct drm_device *dev, void *data, 1143 1.1 mrg struct drm_file *file_priv); 1144 1.1 mrg 1145 1.1 mrg /* Context IOCTL support (drm_context.c) */ 1146 1.1 mrg int drm_resctx(struct drm_device *dev, void *data, 1147 1.1 mrg struct drm_file *file_priv); 1148 1.1 mrg int drm_addctx(struct drm_device *dev, void *data, 1149 1.11 mrg struct drm_file *file_priv); 1150 1.1 mrg int drm_modctx(struct drm_device *dev, void *data, 1151 1.1 mrg struct drm_file *file_priv); 1152 1.1 mrg int drm_getctx(struct drm_device *dev, void *data, 1153 1.1 mrg struct drm_file *file_priv); 1154 1.1 mrg int drm_switchctx(struct drm_device *dev, void *data, 1155 1.1 mrg struct drm_file *file_priv); 1156 1.1 mrg int drm_newctx(struct drm_device *dev, void *data, 1157 1.1 mrg struct drm_file *file_priv); 1158 1.1 mrg int drm_rmctx(struct drm_device *dev, void *data, 1159 1.1 mrg struct drm_file *file_priv); 1160 1.1 mrg int drm_setsareactx(struct drm_device *dev, void *data, 1161 1.1 mrg struct drm_file *file_priv); 1162 1.1 mrg int drm_getsareactx(struct drm_device *dev, void *data, 1163 1.1 mrg struct drm_file *file_priv); 1164 1.1 mrg 1165 1.1 mrg /* Drawable IOCTL support (drm_drawable.c) */ 1166 1.1 mrg int drm_adddraw(struct drm_device *dev, void *data, 1167 1.1 mrg struct drm_file *file_priv); 1168 1.1 mrg int drm_rmdraw(struct drm_device *dev, void *data, 1169 1.1 mrg struct drm_file *file_priv); 1170 1.1 mrg int drm_update_draw(struct drm_device *dev, void *data, 1171 1.1 mrg struct drm_file *file_priv); 1172 1.1 mrg struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, 1173 1.1 mrg int handle); 1174 1.1 mrg 1175 1.11 mrg /* Drawable support (drm_drawable.c) */ 1176 1.11 mrg void drm_drawable_free_all(struct drm_device *dev); 1177 1.11 mrg 1178 1.1 mrg /* Authentication IOCTL support (drm_auth.c) */ 1179 1.1 mrg int drm_getmagic(struct drm_device *dev, void *data, 1180 1.1 mrg struct drm_file *file_priv); 1181 1.1 mrg int drm_authmagic(struct drm_device *dev, void *data, 1182 1.1 mrg struct drm_file *file_priv); 1183 1.1 mrg 1184 1.1 mrg /* Buffer management support (drm_bufs.c) */ 1185 1.1 mrg int drm_addmap_ioctl(struct drm_device *dev, void *data, 1186 1.1 mrg struct drm_file *file_priv); 1187 1.1 mrg int drm_rmmap_ioctl(struct drm_device *dev, void *data, 1188 1.1 mrg struct drm_file *file_priv); 1189 1.11 mrg int drm_addbufs(struct drm_device *dev, void *data, 1190 1.11 mrg struct drm_file *file_priv); 1191 1.1 mrg int drm_infobufs(struct drm_device *dev, void *data, 1192 1.1 mrg struct drm_file *file_priv); 1193 1.1 mrg int drm_markbufs(struct drm_device *dev, void *data, 1194 1.1 mrg struct drm_file *file_priv); 1195 1.1 mrg int drm_freebufs(struct drm_device *dev, void *data, 1196 1.1 mrg struct drm_file *file_priv); 1197 1.1 mrg int drm_mapbufs(struct drm_device *dev, void *data, 1198 1.1 mrg struct drm_file *file_priv); 1199 1.1 mrg 1200 1.1 mrg /* DMA support (drm_dma.c) */ 1201 1.1 mrg int drm_dma(struct drm_device *dev, void *data, struct drm_file *file_priv); 1202 1.1 mrg 1203 1.1 mrg /* IRQ support (drm_irq.c) */ 1204 1.11 mrg int drm_control(struct drm_device *dev, void *data, 1205 1.11 mrg struct drm_file *file_priv); 1206 1.1 mrg int drm_wait_vblank(struct drm_device *dev, void *data, 1207 1.1 mrg struct drm_file *file_priv); 1208 1.1 mrg 1209 1.1 mrg /* AGP/GART support (drm_agpsupport.c) */ 1210 1.1 mrg int drm_agp_acquire_ioctl(struct drm_device *dev, void *data, 1211 1.1 mrg struct drm_file *file_priv); 1212 1.1 mrg int drm_agp_release_ioctl(struct drm_device *dev, void *data, 1213 1.1 mrg struct drm_file *file_priv); 1214 1.1 mrg int drm_agp_enable_ioctl(struct drm_device *dev, void *data, 1215 1.1 mrg struct drm_file *file_priv); 1216 1.1 mrg int drm_agp_info_ioctl(struct drm_device *dev, void *data, 1217 1.1 mrg struct drm_file *file_priv); 1218 1.1 mrg int drm_agp_alloc_ioctl(struct drm_device *dev, void *data, 1219 1.1 mrg struct drm_file *file_priv); 1220 1.1 mrg int drm_agp_free_ioctl(struct drm_device *dev, void *data, 1221 1.1 mrg struct drm_file *file_priv); 1222 1.1 mrg int drm_agp_unbind_ioctl(struct drm_device *dev, void *data, 1223 1.1 mrg struct drm_file *file_priv); 1224 1.1 mrg int drm_agp_bind_ioctl(struct drm_device *dev, void *data, 1225 1.1 mrg struct drm_file *file_priv); 1226 1.1 mrg 1227 1.1 mrg /* Scatter Gather Support (drm_scatter.c) */ 1228 1.1 mrg int drm_sg_alloc_ioctl(struct drm_device *dev, void *data, 1229 1.1 mrg struct drm_file *file_priv); 1230 1.1 mrg int drm_sg_free(struct drm_device *dev, void *data, 1231 1.1 mrg struct drm_file *file_priv); 1232 1.1 mrg 1233 1.1 mrg /* consistent PCI memory functions (drm_pci.c) */ 1234 1.1 mrg drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size, 1235 1.1 mrg size_t align, dma_addr_t maxaddr); 1236 1.1 mrg void drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah); 1237 1.1 mrg 1238 1.11 mrg /* Inline replacements for drm_alloc and friends */ 1239 1.11 mrg static __inline__ void * 1240 1.11 mrg drm_alloc(size_t size, struct malloc_type *area) 1241 1.11 mrg { 1242 1.11 mrg return malloc(size, area, M_NOWAIT); 1243 1.11 mrg } 1244 1.11 mrg 1245 1.11 mrg static __inline__ void * 1246 1.11 mrg drm_calloc(size_t nmemb, size_t size, struct malloc_type *area) 1247 1.11 mrg { 1248 1.11 mrg return malloc(size * nmemb, area, M_NOWAIT | M_ZERO); 1249 1.11 mrg } 1250 1.11 mrg 1251 1.11 mrg static __inline__ void * 1252 1.11 mrg drm_realloc(void *oldpt, size_t oldsize, size_t size, 1253 1.11 mrg struct malloc_type *area) 1254 1.11 mrg { 1255 1.11 mrg #if defined(__FreeBSD__) 1256 1.11 mrg return reallocf(oldpt, size, area, M_NOWAIT); 1257 1.11 mrg #elif defined(__NetBSD__) 1258 1.11 mrg void *pt; 1259 1.11 mrg 1260 1.11 mrg pt = malloc(size, area, M_NOWAIT); 1261 1.11 mrg if (pt == NULL) 1262 1.11 mrg return NULL; 1263 1.11 mrg if (oldpt && oldsize) { 1264 1.11 mrg memcpy(pt, oldpt, oldsize); 1265 1.11 mrg free(oldpt, area); 1266 1.11 mrg } 1267 1.11 mrg return pt; 1268 1.11 mrg #endif 1269 1.11 mrg } 1270 1.11 mrg 1271 1.11 mrg static __inline__ void 1272 1.11 mrg drm_free(void *pt, size_t size, struct malloc_type *area) 1273 1.11 mrg { 1274 1.11 mrg free(pt, area); 1275 1.11 mrg } 1276 1.6 mrg 1277 1.1 mrg /* Inline replacements for DRM_IOREMAP macros */ 1278 1.1 mrg static __inline__ void 1279 1.11 mrg drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev) 1280 1.11 mrg { 1281 1.11 mrg map->handle = drm_ioremap_wc(dev, map); 1282 1.11 mrg } 1283 1.11 mrg static __inline__ void 1284 1.1 mrg drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) 1285 1.1 mrg { 1286 1.1 mrg map->handle = drm_ioremap(dev, map); 1287 1.1 mrg } 1288 1.1 mrg static __inline__ void 1289 1.1 mrg drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev) 1290 1.1 mrg { 1291 1.1 mrg if ( map->handle && map->size ) 1292 1.1 mrg drm_ioremapfree(map); 1293 1.1 mrg } 1294 1.1 mrg 1295 1.1 mrg static __inline__ struct drm_local_map * 1296 1.1 mrg drm_core_findmap(struct drm_device *dev, unsigned long offset) 1297 1.1 mrg { 1298 1.1 mrg drm_local_map_t *map; 1299 1.1 mrg 1300 1.1 mrg DRM_SPINLOCK_ASSERT(&dev->dev_lock); 1301 1.1 mrg TAILQ_FOREACH(map, &dev->maplist, link) { 1302 1.1 mrg if (map->offset == offset) 1303 1.1 mrg return map; 1304 1.1 mrg } 1305 1.1 mrg return NULL; 1306 1.1 mrg } 1307 1.1 mrg 1308 1.1 mrg static __inline__ void drm_core_dropmap(struct drm_map *map) 1309 1.1 mrg { 1310 1.1 mrg } 1311 1.1 mrg 1312 1.1 mrg #endif /* __KERNEL__ */ 1313 1.1 mrg #endif /* _DRM_P_H_ */ 1314