drmP.h revision 247832
1139823Simp/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*- 2157067Srwatson * Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com 3157067Srwatson */ 411819Sjulian/*- 5157067Srwatson * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 6157067Srwatson * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 711819Sjulian * All rights reserved. 811819Sjulian * 911819Sjulian * Permission is hereby granted, free of charge, to any person obtaining a 1011819Sjulian * copy of this software and associated documentation files (the "Software"), 1111819Sjulian * to deal in the Software without restriction, including without limitation 1211819Sjulian * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1311819Sjulian * and/or sell copies of the Software, and to permit persons to whom the 1411819Sjulian * Software is furnished to do so, subject to the following conditions: 1511819Sjulian * 1611819Sjulian * The above copyright notice and this permission notice (including the next 1711819Sjulian * paragraph) shall be included in all copies or substantial portions of the 1811819Sjulian * Software. 1911819Sjulian * 2011819Sjulian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2111819Sjulian * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2211819Sjulian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2311819Sjulian * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 2411819Sjulian * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2511819Sjulian * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2611819Sjulian * OTHER DEALINGS IN THE SOFTWARE. 2711819Sjulian * 2811819Sjulian * Authors: 2911819Sjulian * Rickard E. (Rik) Faith <faith@valinux.com> 3011819Sjulian * Gareth Hughes <gareth@valinux.com> 3111819Sjulian * 3211819Sjulian */ 3311819Sjulian 3411819Sjulian#include <sys/cdefs.h> 3511819Sjulian__FBSDID("$FreeBSD: head/sys/dev/drm2/drmP.h 247832 2013-03-05 09:07:01Z kib $"); 3612057Sjulian 3711819Sjulian#ifndef _DRM_P_H_ 3811819Sjulian#define _DRM_P_H_ 39116189Sobrien 40116189Sobrien#if defined(_KERNEL) || defined(__KERNEL__) 41116189Sobrien 4211819Sjulianstruct drm_device; 4376166Smarkmstruct drm_file; 4429024Sbde 4511819Sjulian#include <sys/param.h> 4676166Smarkm#include <sys/queue.h> 4725345Sjhay#include <sys/malloc.h> 4811819Sjulian#include <sys/kernel.h> 4995759Stanimura#include <sys/ktr.h> 5011819Sjulian#include <sys/module.h> 5111819Sjulian#include <sys/systm.h> 5295759Stanimura#include <sys/conf.h> 5395759Stanimura#include <sys/sglist.h> 5411819Sjulian#include <sys/stat.h> 5511819Sjulian#include <sys/priv.h> 5611819Sjulian#include <sys/proc.h> 5711819Sjulian#include <sys/lock.h> 5811819Sjulian#include <sys/fcntl.h> 5911819Sjulian#include <sys/uio.h> 6011819Sjulian#include <sys/filio.h> 6111819Sjulian#include <sys/selinfo.h> 6295759Stanimura#include <sys/sysctl.h> 6311819Sjulian#include <sys/bus.h> 6411819Sjulian#include <sys/queue.h> 6511819Sjulian#include <sys/signalvar.h> 6611819Sjulian#include <sys/poll.h> 6711819Sjulian#include <sys/sbuf.h> 6811819Sjulian#include <sys/taskqueue.h> 6933181Seivind#include <sys/tree.h> 7033181Seivind#include <vm/vm.h> 7133181Seivind#include <vm/pmap.h> 7233181Seivind#include <vm/vm_extern.h> 7333181Seivind#include <vm/vm_kern.h> 7433181Seivind#include <vm/vm_map.h> 7511819Sjulian#include <vm/vm_object.h> 7625652Sjhay#include <vm/vm_page.h> 77139584Srwatson#include <vm/vm_pager.h> 7825652Sjhay#include <vm/vm_param.h> 79139584Srwatson#include <vm/vm_phys.h> 8011819Sjulian#include <machine/param.h> 81132045Srwatson#include <machine/pmap.h> 8225652Sjhay#include <machine/bus.h> 8311819Sjulian#include <machine/resource.h> 84139931Srwatson#if defined(__i386__) || defined(__amd64__) 85139931Srwatson#include <machine/specialreg.h> 86139931Srwatson#endif 8725652Sjhay#include <machine/sysarch.h> 8825652Sjhay#include <sys/endian.h> 8925652Sjhay#include <sys/mman.h> 9025652Sjhay#include <sys/rman.h> 9125652Sjhay#include <sys/memrange.h> 92139931Srwatson#include <dev/agp/agpvar.h> 9325652Sjhay#include <sys/agpio.h> 9424659Sjhay#include <sys/mutex.h> 9528270Swollman#include <dev/pci/pcivar.h> 9683366Sjulian#include <dev/pci/pcireg.h> 9783366Sjulian#include <sys/selinfo.h> 9828270Swollman#include <sys/bus.h> 9983366Sjulian 10024659Sjhay#include <dev/drm2/drm.h> 10124659Sjhay#include <dev/drm2/drm_atomic.h> 102151888Srwatson#include <dev/drm2/drm_internal.h> 10324659Sjhay#include <dev/drm2/drm_linux_list.h> 10424659Sjhay#include <dev/drm2/drm_gem_names.h> 10524659Sjhay#include <dev/drm2/drm_mm.h> 106139584Srwatson#include <dev/drm2/drm_hashtab.h> 10783366Sjulian 10824659Sjhay#include "opt_compat.h" 10983366Sjulian#include "opt_drm.h" 11024659Sjhay#ifdef DRM_DEBUG 11124659Sjhay#undef DRM_DEBUG 112137386Sphk#define DRM_DEBUG_DEFAULT_ON 1 113137386Sphk#endif /* DRM_DEBUG */ 114137386Sphk 115137386Sphk#define DRM_DEBUGBITS_DEBUG 0x1 116137386Sphk#define DRM_DEBUGBITS_KMS 0x2 117137386Sphk#define DRM_DEBUGBITS_FAILED_IOCTL 0x4 118137386Sphk 119137386Sphk#undef DRM_LINUX 120137386Sphk#define DRM_LINUX 0 121137386Sphk 122137386Sphk/* driver capabilities and requirements mask */ 123137386Sphk#define DRIVER_USE_AGP 0x1 124137386Sphk#define DRIVER_REQUIRE_AGP 0x2 125137386Sphk#define DRIVER_USE_MTRR 0x4 126137386Sphk#define DRIVER_PCI_DMA 0x8 12724659Sjhay#define DRIVER_SG 0x10 12824659Sjhay#define DRIVER_HAVE_DMA 0x20 12924659Sjhay#define DRIVER_HAVE_IRQ 0x40 130137386Sphk#define DRIVER_IRQ_SHARED 0x80 131137386Sphk#define DRIVER_IRQ_VBL 0x100 132137386Sphk#define DRIVER_DMA_QUEUE 0x200 133137386Sphk#define DRIVER_FB_DMA 0x400 134137386Sphk#define DRIVER_IRQ_VBL2 0x800 135137386Sphk#define DRIVER_GEM 0x1000 136137386Sphk#define DRIVER_MODESET 0x2000 137137386Sphk#define DRIVER_USE_PLATFORM_DEVICE 0x4000 138137386Sphk#define DRIVER_LOCKLESS_IRQ 0x8000 139137386Sphk 140137386Sphk 141137386Sphk#define DRM_HASH_SIZE 16 /* Size of key hash table */ 142137386Sphk#define DRM_KERNEL_CONTEXT 0 /* Change drm_resctx if changed */ 143137386Sphk#define DRM_RESERVED_CONTEXTS 1 /* Change drm_resctx if changed */ 144137386Sphk 14524659Sjhay#define DRM_GEM_MAPPING_MASK (3ULL << 62) 14624659Sjhay#define DRM_GEM_MAPPING_KEY (2ULL << 62) /* Non-canonical address form */ 14711819Sjulian#define DRM_GEM_MAX_IDX 0x3fffff 148157067Srwatson#define DRM_GEM_MAPPING_IDX(o) (((o) >> 40) & DRM_GEM_MAX_IDX) 14911819Sjulian#define DRM_GEM_MAPPING_OFF(i) (((uint64_t)(i)) << 40) 15011819Sjulian#define DRM_GEM_MAPPING_MAPOFF(o) \ 15111819Sjulian ((o) & ~(DRM_GEM_MAPPING_OFF(DRM_GEM_MAX_IDX) | DRM_GEM_MAPPING_KEY)) 15211819Sjulian 15311819SjulianMALLOC_DECLARE(DRM_MEM_DMA); 15411819SjulianMALLOC_DECLARE(DRM_MEM_SAREA); 155157067SrwatsonMALLOC_DECLARE(DRM_MEM_DRIVER); 15611819SjulianMALLOC_DECLARE(DRM_MEM_MAGIC); 157157067SrwatsonMALLOC_DECLARE(DRM_MEM_IOCTLS); 158157067SrwatsonMALLOC_DECLARE(DRM_MEM_MAPS); 159157067SrwatsonMALLOC_DECLARE(DRM_MEM_BUFS); 160157051SrwatsonMALLOC_DECLARE(DRM_MEM_SEGS); 16111819SjulianMALLOC_DECLARE(DRM_MEM_PAGES); 16211819SjulianMALLOC_DECLARE(DRM_MEM_FILES); 16311819SjulianMALLOC_DECLARE(DRM_MEM_QUEUES); 16411819SjulianMALLOC_DECLARE(DRM_MEM_CMDS); 165139586SrwatsonMALLOC_DECLARE(DRM_MEM_MAPPINGS); 16611819SjulianMALLOC_DECLARE(DRM_MEM_BUFLISTS); 167139932SrwatsonMALLOC_DECLARE(DRM_MEM_AGPLISTS); 168139932SrwatsonMALLOC_DECLARE(DRM_MEM_CTXBITMAP); 169139932SrwatsonMALLOC_DECLARE(DRM_MEM_SGLISTS); 170139932SrwatsonMALLOC_DECLARE(DRM_MEM_DRAWABLE); 171139932SrwatsonMALLOC_DECLARE(DRM_MEM_MM); 172139932SrwatsonMALLOC_DECLARE(DRM_MEM_HASHTAB); 173139932SrwatsonMALLOC_DECLARE(DRM_MEM_KMS); 174139932Srwatson 175139932SrwatsonSYSCTL_DECL(_hw_drm); 17611819Sjulian 17725652Sjhay#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) 17825652Sjhay 17911819Sjulian /* Internal types and structures */ 18011819Sjulian#define DRM_ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 18125652Sjhay#define DRM_MIN(a,b) ((a)<(b)?(a):(b)) 182139932Srwatson#define DRM_MAX(a,b) ((a)>(b)?(a):(b)) 183139932Srwatson 18411819Sjulian#define DRM_IF_VERSION(maj, min) (maj << 16 | min) 18511819Sjulian 18611819Sjulian#define __OS_HAS_AGP 1 18711819Sjulian 18811819Sjulian#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) 18911819Sjulian#define DRM_DEV_UID 0 19011819Sjulian#define DRM_DEV_GID 0 19111819Sjulian 19211819Sjulian#define wait_queue_head_t atomic_t 19311819Sjulian#define DRM_WAKEUP(w) wakeup((void *)w) 19411819Sjulian#define DRM_WAKEUP_INT(w) wakeup(w) 19511819Sjulian#define DRM_INIT_WAITQUEUE(queue) do {(void)(queue);} while (0) 19611819Sjulian 19711819Sjulian#define DRM_CURPROC curthread 19811819Sjulian#define DRM_STRUCTPROC struct thread 19911819Sjulian#define DRM_SPINTYPE struct mtx 20011819Sjulian#define DRM_SPININIT(l,name) mtx_init(l, name, NULL, MTX_DEF) 20111819Sjulian#define DRM_SPINUNINIT(l) mtx_destroy(l) 20211819Sjulian#define DRM_SPINLOCK(l) mtx_lock(l) 20325652Sjhay#define DRM_SPINUNLOCK(u) mtx_unlock(u) 20411819Sjulian#define DRM_SPINLOCK_IRQSAVE(l, irqflags) do { \ 20511819Sjulian mtx_lock(l); \ 20611819Sjulian (void)irqflags; \ 20711819Sjulian} while (0) 20811819Sjulian#define DRM_SPINUNLOCK_IRQRESTORE(u, irqflags) mtx_unlock(u) 20911819Sjulian#define DRM_SPINLOCK_ASSERT(l) mtx_assert(l, MA_OWNED) 21011819Sjulian#define DRM_CURRENTPID curthread->td_proc->p_pid 21111819Sjulian#define DRM_LOCK(dev) sx_xlock(&(dev)->dev_struct_lock) 21211819Sjulian#define DRM_UNLOCK(dev) sx_xunlock(&(dev)->dev_struct_lock) 21311819Sjulian#define DRM_LOCK_SLEEP(dev, chan, flags, msg, timeout) \ 21411819Sjulian (sx_sleep((chan), &(dev)->dev_struct_lock, (flags), (msg), (timeout))) 21511819Sjulian#if defined(INVARIANTS) 21611819Sjulian#define DRM_LOCK_ASSERT(dev) sx_assert(&(dev)->dev_struct_lock, SA_XLOCKED) 21711819Sjulian#define DRM_UNLOCK_ASSERT(dev) sx_assert(&(dev)->dev_struct_lock, SA_UNLOCKED) 218139932Srwatson#else 21911819Sjulian#define DRM_LOCK_ASSERT(d) 220139932Srwatson#define DRM_UNLOCK_ASSERT(d) 22111819Sjulian#endif 22211819Sjulian 22311819Sjulian#define DRM_SYSCTL_HANDLER_ARGS (SYSCTL_HANDLER_ARGS) 22411819Sjulian 22511819Sjulian#define DRM_IRQ_ARGS void *arg 22611819Sjuliantypedef void irqreturn_t; 22797658Stanimura#define IRQ_HANDLED /* nothing */ 22811819Sjulian#define IRQ_NONE /* nothing */ 22911819Sjulian 23011819Sjulian#define unlikely(x) __builtin_expect(!!(x), 0) 23111819Sjulian#define likely(x) __builtin_expect((x), 0) 23211819Sjulian#define container_of(ptr, type, member) ({ \ 23311819Sjulian __typeof( ((type *)0)->member ) *__mptr = (ptr); \ 23411819Sjulian (type *)( (char *)__mptr - offsetof(type,member) );}) 23511819Sjulian 23611819Sjulianenum { 23711819Sjulian DRM_IS_NOT_AGP, 23811819Sjulian DRM_IS_AGP, 23928270Swollman DRM_MIGHT_BE_AGP 24011819Sjulian}; 24111819Sjulian#define DRM_AGP_MEM struct agp_memory_info 24211819Sjulian 24311819Sjulian#define drm_get_device_from_kdev(_kdev) (_kdev->si_drv1) 24411819Sjulian 24511819Sjulian#define PAGE_ALIGN(addr) round_page(addr) 24611819Sjulian/* DRM_SUSER returns true if the user is superuser */ 24711819Sjulian#define DRM_SUSER(p) (priv_check(p, PRIV_DRIVER) == 0) 24811819Sjulian#define DRM_AGP_FIND_DEVICE() agp_find_device() 24911819Sjulian#define DRM_MTRR_WC MDF_WRITECOMBINE 25011819Sjulian#define jiffies ticks 25128270Swollman#define jiffies_to_msecs(x) (((int64_t)(x)) * 1000 / hz) 25228270Swollman#define msecs_to_jiffies(x) (((int64_t)(x)) * hz / 1000) 25311819Sjulian#define time_after(a,b) ((long)(b) - (long)(a) < 0) 25411819Sjulian#define time_after_eq(a,b) ((long)(b) - (long)(a) <= 0) 25511819Sjulian#define drm_msleep(x, msg) pause((msg), ((int64_t)(x)) * hz / 1000) 25611819Sjulian 25711819Sjuliantypedef vm_paddr_t dma_addr_t; 25811819Sjuliantypedef uint64_t u64; 25990361Sjuliantypedef uint32_t u32; 26011819Sjuliantypedef uint16_t u16; 26111819Sjuliantypedef uint8_t u8; 26211819Sjuliantypedef int64_t s64; 26311819Sjuliantypedef int32_t s32; 26411819Sjuliantypedef int16_t s16; 26511819Sjuliantypedef int8_t s8; 26611819Sjulian 26711819Sjulian/* DRM_READMEMORYBARRIER() prevents reordering of reads. 26811819Sjulian * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. 26911819Sjulian * DRM_MEMORYBARRIER() prevents reordering of reads and writes. 27011819Sjulian */ 27111819Sjulian#define DRM_READMEMORYBARRIER() rmb() 27211819Sjulian#define DRM_WRITEMEMORYBARRIER() wmb() 27311819Sjulian#define DRM_MEMORYBARRIER() mb() 27411819Sjulian 27511819Sjulian#define DRM_READ8(map, offset) \ 27611819Sjulian *(volatile u_int8_t *)(((vm_offset_t)(map)->virtual) + \ 27711819Sjulian (vm_offset_t)(offset)) 27811819Sjulian#define DRM_READ16(map, offset) \ 27911819Sjulian le16toh(*(volatile u_int16_t *)(((vm_offset_t)(map)->virtual) + \ 28011819Sjulian (vm_offset_t)(offset))) 28111819Sjulian#define DRM_READ32(map, offset) \ 28211819Sjulian le32toh(*(volatile u_int32_t *)(((vm_offset_t)(map)->virtual) + \ 28311819Sjulian (vm_offset_t)(offset))) 28425652Sjhay#define DRM_READ64(map, offset) \ 28511819Sjulian le64toh(*(volatile u_int64_t *)(((vm_offset_t)(map)->virtual) + \ 28611819Sjulian (vm_offset_t)(offset))) 28711819Sjulian#define DRM_WRITE8(map, offset, val) \ 28811819Sjulian *(volatile u_int8_t *)(((vm_offset_t)(map)->virtual) + \ 28911819Sjulian (vm_offset_t)(offset)) = val 29011819Sjulian#define DRM_WRITE16(map, offset, val) \ 29111819Sjulian *(volatile u_int16_t *)(((vm_offset_t)(map)->virtual) + \ 29211819Sjulian (vm_offset_t)(offset)) = htole16(val) 29311819Sjulian#define DRM_WRITE32(map, offset, val) \ 29411819Sjulian *(volatile u_int32_t *)(((vm_offset_t)(map)->virtual) + \ 29511819Sjulian (vm_offset_t)(offset)) = htole32(val) 29611819Sjulian#define DRM_WRITE64(map, offset, val) \ 29711819Sjulian *(volatile u_int64_t *)(((vm_offset_t)(map)->virtual) + \ 29811819Sjulian (vm_offset_t)(offset)) = htole64(val) 29911819Sjulian 30011819Sjulian#define DRM_VERIFYAREA_READ( uaddr, size ) \ 30111819Sjulian (!useracc(__DECONST(caddr_t, uaddr), size, VM_PROT_READ)) 30211819Sjulian 30311819Sjulian#define DRM_COPY_TO_USER(user, kern, size) \ 30411819Sjulian copyout(kern, user, size) 30511819Sjulian#define DRM_COPY_FROM_USER(kern, user, size) \ 30611819Sjulian copyin(user, kern, size) 30711819Sjulian#define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3) \ 30825652Sjhay copyin(arg2, arg1, arg3) 30911819Sjulian#define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3) \ 31011819Sjulian copyout(arg2, arg1, arg3) 31111819Sjulian#define DRM_GET_USER_UNCHECKED(val, uaddr) \ 31211819Sjulian ((val) = fuword32(uaddr), 0) 31311819Sjulian 31411819Sjulian#define cpu_to_le32(x) htole32(x) 31511819Sjulian#define le32_to_cpu(x) le32toh(x) 31611819Sjulian 31711819Sjulian#define DRM_HZ hz 31811819Sjulian#define DRM_UDELAY(udelay) DELAY(udelay) 31911819Sjulian#define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ 32011819Sjulian 32111819Sjulian#define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ 32211819Sjulian (_map) = (_dev)->context_sareas[_ctx]; \ 32311819Sjulian} while(0) 32411819Sjulian 32511819Sjulian#define LOCK_TEST_WITH_RETURN(dev, file_priv) \ 32611819Sjuliando { \ 32711819Sjulian if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) || \ 32811819Sjulian dev->lock.file_priv != file_priv) { \ 32911819Sjulian DRM_ERROR("%s called without lock held\n", \ 33011819Sjulian __FUNCTION__); \ 33197658Stanimura return EINVAL; \ 33211819Sjulian } \ 33311819Sjulian} while (0) 33425652Sjhay 33525652Sjhay/* Returns -errno to shared code */ 33625652Sjhay#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ 33711819Sjulianfor ( ret = 0 ; !ret && !(condition) ; ) { \ 33811819Sjulian DRM_UNLOCK(dev); \ 33925652Sjhay mtx_lock(&dev->irq_lock); \ 34011819Sjulian if (!(condition)) \ 34111819Sjulian ret = -mtx_sleep(&(queue), &dev->irq_lock, \ 342139579Srwatson PCATCH, "drmwtq", (timeout)); \ 34311819Sjulian mtx_unlock(&dev->irq_lock); \ 344139932Srwatson DRM_LOCK(dev); \ 345139932Srwatson} 34611819Sjulian 34711819Sjulian#define DRM_ERROR(fmt, ...) \ 34811819Sjulian printf("error: [" DRM_NAME ":pid%d:%s] *ERROR* " fmt, \ 349139932Srwatson DRM_CURRENTPID, __func__ , ##__VA_ARGS__) 350130822Srwatson 351130822Srwatson#define DRM_INFO(fmt, ...) printf("info: [" DRM_NAME "] " fmt , ##__VA_ARGS__) 352130822Srwatson 353130822Srwatson#define DRM_DEBUG(fmt, ...) do { \ 354130822Srwatson if ((drm_debug_flag & DRM_DEBUGBITS_DEBUG) != 0) \ 355130822Srwatson printf("[" DRM_NAME ":pid%d:%s] " fmt, DRM_CURRENTPID, \ 356130822Srwatson __func__ , ##__VA_ARGS__); \ 357130822Srwatson} while (0) 358130822Srwatson 359130822Srwatson#define DRM_DEBUG_KMS(fmt, ...) do { \ 360130822Srwatson if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) \ 36125652Sjhay printf("[" DRM_NAME ":KMS:pid%d:%s] " fmt, DRM_CURRENTPID,\ 362139931Srwatson __func__ , ##__VA_ARGS__); \ 363130822Srwatson} while (0) 364139932Srwatson 36511819Sjulian#define DRM_DEBUG_DRIVER(fmt, ...) do { \ 36611819Sjulian if ((drm_debug_flag & DRM_DEBUGBITS_KMS) != 0) \ 36711819Sjulian printf("[" DRM_NAME ":KMS:pid%d:%s] " fmt, DRM_CURRENTPID,\ 36825652Sjhay __func__ , ##__VA_ARGS__); \ 369139931Srwatson} while (0) 370139931Srwatson 37111819Sjuliantypedef struct drm_pci_id_list 37211819Sjulian{ 37311819Sjulian int vendor; 37411819Sjulian int device; 37511819Sjulian long driver_private; 376139580Srwatson char *name; 37797658Stanimura} drm_pci_id_list_t; 37811819Sjulian 379139932Srwatsonstruct drm_msi_blacklist_entry 380139932Srwatson{ 38111819Sjulian int vendor; 38211819Sjulian int device; 38311819Sjulian}; 38433181Seivind 38511819Sjulian#define DRM_AUTH 0x1 38611819Sjulian#define DRM_MASTER 0x2 38711819Sjulian#define DRM_ROOT_ONLY 0x4 38811819Sjulian#define DRM_CONTROL_ALLOW 0x8 38911819Sjulian#define DRM_UNLOCKED 0x10 39011819Sjulian 39125652Sjhaytypedef struct drm_ioctl_desc { 392157067Srwatson unsigned long cmd; 39311819Sjulian int (*func)(struct drm_device *dev, void *data, 394157067Srwatson struct drm_file *file_priv); 395157067Srwatson int flags; 396157067Srwatson} drm_ioctl_desc_t; 39711819Sjulian/** 39811819Sjulian * Creates a driver or general drm_ioctl_desc array entry for the given 39911819Sjulian * ioctl, for use by drm_ioctl(). 40011819Sjulian */ 401139932Srwatson#define DRM_IOCTL_DEF(ioctl, func, flags) \ 402139932Srwatson [DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags} 40311819Sjulian 40411819Sjuliantypedef struct drm_magic_entry { 40511819Sjulian drm_magic_t magic; 40611819Sjulian struct drm_file *priv; 40711819Sjulian struct drm_magic_entry *next; 40811819Sjulian} drm_magic_entry_t; 40911819Sjulian 41011819Sjuliantypedef struct drm_magic_head { 41111819Sjulian struct drm_magic_entry *head; 41211819Sjulian struct drm_magic_entry *tail; 41311819Sjulian} drm_magic_head_t; 41411819Sjulian 41511819Sjuliantypedef struct drm_buf { 41611819Sjulian int idx; /* Index into master buflist */ 41711819Sjulian int total; /* Buffer size */ 41811819Sjulian int order; /* log-base-2(total) */ 41911819Sjulian int used; /* Amount of buffer in use (for DMA) */ 42011819Sjulian unsigned long offset; /* Byte offset (used internally) */ 42111819Sjulian void *address; /* Address of buffer */ 42211819Sjulian unsigned long bus_address; /* Bus address of buffer */ 42311819Sjulian struct drm_buf *next; /* Kernel-only: used for free list */ 42411819Sjulian __volatile__ int pending; /* On hardware DMA queue */ 42511819Sjulian struct drm_file *file_priv; /* Unique identifier of holding process */ 42611819Sjulian int context; /* Kernel queue for this buffer */ 42711819Sjulian enum { 42811819Sjulian DRM_LIST_NONE = 0, 42911819Sjulian DRM_LIST_FREE = 1, 43011819Sjulian DRM_LIST_WAIT = 2, 431139579Srwatson DRM_LIST_PEND = 3, 43211819Sjulian DRM_LIST_PRIO = 4, 43311819Sjulian DRM_LIST_RECLAIM = 5 43411819Sjulian } list; /* Which list we're on */ 43511819Sjulian 43611819Sjulian int dev_priv_size; /* Size of buffer private stoarge */ 43711819Sjulian void *dev_private; /* Per-buffer private storage */ 43811819Sjulian} drm_buf_t; 43911819Sjulian 44011819Sjuliantypedef struct drm_freelist { 44111819Sjulian int initialized; /* Freelist in use */ 44211819Sjulian atomic_t count; /* Number of free buffers */ 44311819Sjulian drm_buf_t *next; /* End pointer */ 44411819Sjulian 44511819Sjulian int low_mark; /* Low water mark */ 44611819Sjulian int high_mark; /* High water mark */ 44711819Sjulian} drm_freelist_t; 44811819Sjulian 44911819Sjuliantypedef struct drm_dma_handle { 45011819Sjulian void *vaddr; 45111819Sjulian bus_addr_t busaddr; 45211819Sjulian bus_dma_tag_t tag; 45311819Sjulian bus_dmamap_t map; 45411819Sjulian} drm_dma_handle_t; 45511819Sjulian 45611819Sjuliantypedef struct drm_buf_entry { 45711819Sjulian int buf_size; 45811819Sjulian int buf_count; 45911819Sjulian drm_buf_t *buflist; 46011819Sjulian int seg_count; 46111819Sjulian drm_dma_handle_t **seglist; 46211819Sjulian int page_order; 463157067Srwatson 46411819Sjulian drm_freelist_t freelist; 46511819Sjulian} drm_buf_entry_t; 46611819Sjulian 46711819Sjulian/* Event queued up for userspace to read */ 46811819Sjulianstruct drm_pending_event { 46911819Sjulian struct drm_event *event; 47011819Sjulian struct list_head link; 47111819Sjulian struct drm_file *file_priv; 47211819Sjulian pid_t pid; /* pid of requester, no guarantee it's valid by the time 47311819Sjulian we deliver the event, for tracing only */ 47411819Sjulian void (*destroy)(struct drm_pending_event *event); 47511819Sjulian}; 47611819Sjulian 47711819Sjuliantypedef TAILQ_HEAD(drm_file_list, drm_file) drm_file_list_t; 47811819Sjulianstruct drm_file { 47911819Sjulian TAILQ_ENTRY(drm_file) link; 48011819Sjulian struct drm_device *dev; 48111819Sjulian int authenticated; 48211819Sjulian int master; 48311819Sjulian pid_t pid; 48411819Sjulian uid_t uid; 48511819Sjulian drm_magic_t magic; 48611819Sjulian unsigned long ioctl_count; 48711819Sjulian 48811819Sjulian void *driver_priv; 48911819Sjulian struct drm_gem_names object_names; 49011819Sjulian 49111819Sjulian int is_master; 49211819Sjulian struct drm_master *masterp; 49311819Sjulian 49411819Sjulian struct list_head fbs; 49511819Sjulian 49611819Sjulian struct list_head event_list; 49711819Sjulian int event_space; 49811819Sjulian struct selinfo event_poll; 49911819Sjulian}; 50011819Sjulian 50111819Sjuliantypedef struct drm_lock_data { 50211819Sjulian struct drm_hw_lock *hw_lock; /* Hardware lock */ 50311819Sjulian struct drm_file *file_priv; /* Unique identifier of holding process (NULL is kernel)*/ 50411819Sjulian int lock_queue; /* Queue of blocked processes */ 50511819Sjulian unsigned long lock_time; /* Time of last lock in jiffies */ 50611819Sjulian} drm_lock_data_t; 50711819Sjulian 50811819Sjulian/* This structure, in the struct drm_device, is always initialized while the 509139589Srwatson * device 51011819Sjulian * is open. dev->dma_lock protects the incrementing of dev->buf_use, which 51111819Sjulian * when set marks that no further bufs may be allocated until device teardown 512139589Srwatson * occurs (when the last open of the device has closed). The high/low 51311819Sjulian * watermarks of bufs are only touched by the X Server, and thus not 51411819Sjulian * concurrently accessed, so no locking is needed. 51511819Sjulian */ 516139589Srwatsontypedef struct drm_device_dma { 51711819Sjulian drm_buf_entry_t bufs[DRM_MAX_ORDER+1]; 51811819Sjulian int buf_count; 51911819Sjulian drm_buf_t **buflist; /* Vector of pointers info bufs */ 52011819Sjulian int seg_count; 52143311Sdillon int page_count; 52243311Sdillon unsigned long *pagelist; 52343305Sdillon unsigned long byte_count; 52411819Sjulian enum { 52511819Sjulian _DRM_DMA_USE_AGP = 0x01, 52611819Sjulian _DRM_DMA_USE_SG = 0x02 52711819Sjulian } flags; 52811819Sjulian} drm_device_dma_t; 52911819Sjulian 53011819Sjuliantypedef struct drm_agp_mem { 53111819Sjulian void *handle; 53211819Sjulian unsigned long bound; /* address */ 53311819Sjulian int pages; 53411819Sjulian struct drm_agp_mem *prev; 53511819Sjulian struct drm_agp_mem *next; 53611819Sjulian} drm_agp_mem_t; 53711819Sjulian 53811819Sjuliantypedef struct drm_agp_head { 53911819Sjulian device_t agpdev; 54011819Sjulian struct agp_info info; 54111819Sjulian const char *chipset; 54211819Sjulian drm_agp_mem_t *memory; 54311819Sjulian unsigned long mode; 54411819Sjulian int enabled; 54511819Sjulian int acquired; 54611819Sjulian unsigned long base; 54711819Sjulian int mtrr; 54811819Sjulian int cant_use_aperture; 54911819Sjulian unsigned long page_mask; 55025652Sjhay} drm_agp_head_t; 55111819Sjulian 55211819Sjuliantypedef struct drm_sg_mem { 55311819Sjulian vm_offset_t vaddr; 554139579Srwatson vm_paddr_t *busaddr; 555139579Srwatson vm_pindex_t pages; 556139579Srwatson} drm_sg_mem_t; 557139579Srwatson 558139579Srwatson#define DRM_MAP_HANDLE_BITS (sizeof(void *) == 4 ? 4 : 24) 559139579Srwatson#define DRM_MAP_HANDLE_SHIFT (sizeof(void *) * 8 - DRM_MAP_HANDLE_BITS) 560139579Srwatsontypedef TAILQ_HEAD(drm_map_list, drm_local_map) drm_map_list_t; 561157067Srwatson 56211819Sjuliantypedef struct drm_local_map { 56325652Sjhay unsigned long offset; /* Physical address (0 for SAREA) */ 56497658Stanimura unsigned long size; /* Physical size (bytes) */ 56597658Stanimura enum drm_map_type type; /* Type of memory mapped */ 566139579Srwatson enum drm_map_flags flags; /* Flags */ 56711819Sjulian void *handle; /* User-space: "Handle" to pass to mmap */ 56825652Sjhay /* Kernel-space: kernel-virtual address */ 56911819Sjulian int mtrr; /* Boolean: MTRR used */ 57011819Sjulian /* Private data */ 57111819Sjulian int rid; /* PCI resource ID for bus_space */ 57211819Sjulian void *virtual; /* Kernel-space: kernel-virtual address */ 57311819Sjulian struct resource *bsr; 57411819Sjulian bus_space_tag_t bst; 57511819Sjulian bus_space_handle_t bsh; 57611819Sjulian drm_dma_handle_t *dmah; 57711819Sjulian TAILQ_ENTRY(drm_local_map) link; 57811819Sjulian} drm_local_map_t; 57911819Sjulian 58011819Sjulianstruct drm_vblank_info { 58111819Sjulian wait_queue_head_t queue; /* vblank wait queue */ 58211819Sjulian atomic_t count; /* number of VBLANK interrupts */ 58311819Sjulian /* (driver must alloc the right number of counters) */ 58411819Sjulian atomic_t refcount; /* number of users of vblank interrupts */ 58511819Sjulian u32 last; /* protected by dev->vbl_lock, used */ 58611819Sjulian /* for wraparound handling */ 58711819Sjulian int enabled; /* so we don't call enable more than */ 58811819Sjulian /* once per disable */ 58911819Sjulian int inmodeset; /* Display driver is setting mode */ 59011819Sjulian}; 59111819Sjulian 59211819Sjulian/* Size of ringbuffer for vblank timestamps. Just double-buffer 59325652Sjhay * in initial implementation. 59411819Sjulian */ 59511819Sjulian#define DRM_VBLANKTIME_RBSIZE 2 59611819Sjulian 59711819Sjulian/* Flags and return codes for get_vblank_timestamp() driver function. */ 59811819Sjulian#define DRM_CALLED_FROM_VBLIRQ 1 59911819Sjulian#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0) 60011819Sjulian#define DRM_VBLANKTIME_INVBL (1 << 1) 60111819Sjulian 60211819Sjulian/* get_scanout_position() return flags */ 60311819Sjulian#define DRM_SCANOUTPOS_VALID (1 << 0) 60411819Sjulian#define DRM_SCANOUTPOS_INVBL (1 << 1) 60511819Sjulian#define DRM_SCANOUTPOS_ACCURATE (1 << 2) 60611819Sjulian 60711819Sjulian/* location of GART table */ 60811819Sjulian#define DRM_ATI_GART_MAIN 1 60911819Sjulian#define DRM_ATI_GART_FB 2 61011819Sjulian 61111819Sjulian#define DRM_ATI_GART_PCI 1 61211819Sjulian#define DRM_ATI_GART_PCIE 2 61311819Sjulian#define DRM_ATI_GART_IGP 3 614139590Srwatson 61511819Sjulianstruct drm_ati_pcigart_info { 61611819Sjulian int gart_table_location; 61711819Sjulian int gart_reg_if; 61811819Sjulian void *addr; 61911819Sjulian dma_addr_t bus_addr; 62025652Sjhay dma_addr_t table_mask; 62111819Sjulian dma_addr_t member_mask; 62211819Sjulian struct drm_dma_handle *table_handle; 62311819Sjulian drm_local_map_t mapping; 62411819Sjulian int table_size; 62511819Sjulian struct drm_dma_handle *dmah; /* handle for ATI PCIGART table */ 62611819Sjulian}; 62711819Sjulian 628131031Srwatsontypedef vm_paddr_t resource_size_t; 629130480Srwatson 63011819Sjulian/** 63111819Sjulian * GEM specific mm private for tracking GEM objects 63211819Sjulian */ 63311819Sjulianstruct drm_gem_mm { 63411819Sjulian struct drm_open_hash offset_hash; /**< User token hash table for maps */ 63511819Sjulian struct unrhdr *idxunr; 63611819Sjulian}; 63711819Sjulian 63811819Sjulianstruct drm_gem_object { 63911819Sjulian /** Reference count of this object */ 64011819Sjulian u_int refcount; 64111819Sjulian 642111119Simp /** Handle count of this object. Each handle also holds a reference */ 64311819Sjulian u_int handle_count; /* number of handles on this object */ 64411819Sjulian 64511819Sjulian /** Related drm device */ 64611819Sjulian struct drm_device *dev; 64711819Sjulian 64811819Sjulian /** File representing the shmem storage: filp in Linux parlance */ 64911819Sjulian vm_object_t vm_obj; 65011819Sjulian 65111819Sjulian bool on_map; 652139590Srwatson struct drm_hash_item map_list; 65311819Sjulian 65411819Sjulian /** 65511819Sjulian * Size of the object, in bytes. Immutable over the object's 65611819Sjulian * lifetime. 65711819Sjulian */ 65811819Sjulian size_t size; 659130480Srwatson 66011819Sjulian /** 66111819Sjulian * Global name for this object, starts at 1. 0 means unnamed. 66211819Sjulian * Access is covered by the object_name_lock in the related drm_device 66311819Sjulian */ 66411819Sjulian int name; 66511819Sjulian 66611819Sjulian /** 667139590Srwatson * Memory domains. These monitor which caches contain read/write data 66811819Sjulian * related to the object. When transitioning from one set of domains 66911819Sjulian * to another, the driver is called to ensure that caches are suitably 670139590Srwatson * flushed and invalidated 67111819Sjulian */ 67211819Sjulian uint32_t read_domains; 67311819Sjulian uint32_t write_domain; 674139590Srwatson 67511819Sjulian /** 67611819Sjulian * While validating an exec operation, the 67711819Sjulian * new read/write domain values are computed here. 67811819Sjulian * They will be transferred to the above values 67911819Sjulian * at the point that any cache flushing occurs 680139590Srwatson */ 68111819Sjulian uint32_t pending_read_domains; 68211819Sjulian uint32_t pending_write_domain; 68311819Sjulian 68411819Sjulian void *driver_private; 68597658Stanimura}; 686139590Srwatson 687139590Srwatson#include "drm_crtc.h" 688139590Srwatson 68911819Sjulian#ifndef DMA_BIT_MASK 69011819Sjulian#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : (1ULL<<(n)) - 1) 69111819Sjulian#endif 69211819Sjulian 693157067Srwatson#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16)) 69411819Sjulian 69511819Sjulianstruct drm_driver_info { 696157050Srwatson int (*load)(struct drm_device *, unsigned long flags); 69711819Sjulian int (*firstopen)(struct drm_device *); 69811819Sjulian int (*open)(struct drm_device *, struct drm_file *); 69925652Sjhay void (*preclose)(struct drm_device *, struct drm_file *file_priv); 700157067Srwatson void (*postclose)(struct drm_device *, struct drm_file *); 70111819Sjulian void (*lastclose)(struct drm_device *); 70211819Sjulian int (*unload)(struct drm_device *); 703157067Srwatson void (*reclaim_buffers_locked)(struct drm_device *, 704157067Srwatson struct drm_file *file_priv); 705157067Srwatson int (*dma_ioctl)(struct drm_device *dev, void *data, 70611819Sjulian struct drm_file *file_priv); 70711819Sjulian void (*dma_ready)(struct drm_device *); 70811819Sjulian int (*dma_quiescent)(struct drm_device *); 70911819Sjulian int (*dma_flush_block_and_flush)(struct drm_device *, int context, 71011819Sjulian enum drm_lock_flags flags); 71111819Sjulian int (*dma_flush_unblock)(struct drm_device *, int context, 71211819Sjulian enum drm_lock_flags flags); 71311819Sjulian int (*context_ctor)(struct drm_device *dev, int context); 71411819Sjulian int (*context_dtor)(struct drm_device *dev, int context); 715139932Srwatson int (*kernel_context_switch)(struct drm_device *dev, int old, 716139932Srwatson int new); 71725652Sjhay int (*kernel_context_switch_unlock)(struct drm_device *dev); 71811819Sjulian void (*irq_preinstall)(struct drm_device *dev); 71911819Sjulian int (*irq_postinstall)(struct drm_device *dev); 72011819Sjulian void (*irq_uninstall)(struct drm_device *dev); 72111819Sjulian void (*irq_handler)(DRM_IRQ_ARGS); 72211819Sjulian 72325652Sjhay u32 (*get_vblank_counter)(struct drm_device *dev, int crtc); 72411819Sjulian int (*enable_vblank)(struct drm_device *dev, int crtc); 72511819Sjulian void (*disable_vblank)(struct drm_device *dev, int crtc); 72611819Sjulian int (*get_scanout_position)(struct drm_device *dev, int crtc, 72711819Sjulian int *vpos, int *hpos); 72811819Sjulian 72911819Sjulian int (*get_vblank_timestamp)(struct drm_device *dev, int crtc, 73025652Sjhay int *max_error, struct timeval *vblank_time, 73111819Sjulian unsigned flags); 73211819Sjulian 73311819Sjulian int (*gem_init_object)(struct drm_gem_object *obj); 73411819Sjulian void (*gem_free_object)(struct drm_gem_object *obj); 73511819Sjulian 73611819Sjulian struct cdev_pager_ops *gem_pager_ops; 73711819Sjulian 73811819Sjulian int (*dumb_create)(struct drm_file *file_priv, 73911819Sjulian struct drm_device *dev, struct drm_mode_create_dumb *args); 74011819Sjulian int (*dumb_map_offset)(struct drm_file *file_priv, 74111819Sjulian struct drm_device *dev, uint32_t handle, uint64_t *offset); 74211819Sjulian int (*dumb_destroy)(struct drm_file *file_priv, 74311819Sjulian struct drm_device *dev, uint32_t handle); 74411819Sjulian 745111119Simp int (*sysctl_init)(struct drm_device *dev, 74611819Sjulian struct sysctl_ctx_list *ctx, struct sysctl_oid *top); 74711819Sjulian void (*sysctl_cleanup)(struct drm_device *dev); 74811819Sjulian 74925652Sjhay drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ 75011819Sjulian 75111819Sjulian /** 75211819Sjulian * Called by \c drm_device_is_agp. Typically used to determine if a 75311819Sjulian * card is really attached to AGP or not. 75411819Sjulian * 75511819Sjulian * \param dev DRM device handle 75611819Sjulian * 75711819Sjulian * \returns 75825652Sjhay * One of three values is returned depending on whether or not the 75911819Sjulian * card is absolutely \b not AGP (return of 0), absolutely \b is AGP 76011819Sjulian * (return of 1), or may or may not be AGP (return of 2). 76111819Sjulian */ 76211819Sjulian int (*device_is_agp) (struct drm_device * dev); 76311819Sjulian 76411819Sjulian drm_ioctl_desc_t *ioctls; 76511819Sjulian#ifdef COMPAT_FREEBSD32 76611819Sjulian drm_ioctl_desc_t *compat_ioctls; 76711819Sjulian int *compat_ioctls_nr; 76811819Sjulian#endif 76911819Sjulian int max_ioctl; 77011819Sjulian 77111819Sjulian int buf_priv_size; 77211819Sjulian 77311819Sjulian int major; 77411819Sjulian int minor; 775111119Simp int patchlevel; 77611819Sjulian const char *name; /* Simple driver name */ 77725652Sjhay const char *desc; /* Longer driver name */ 77811819Sjulian const char *date; /* Date of last major changes. */ 77911819Sjulian 78011819Sjulian u32 driver_features; 78111819Sjulian}; 78211819Sjulian 78311819Sjulian/** 78411819Sjulian * DRM minor structure. This structure represents a drm minor number. 78511819Sjulian */ 786151967Sandrestruct drm_minor { 78725652Sjhay int index; /**< Minor device number */ 78811819Sjulian int type; /**< Control or render */ 78911819Sjulian device_t kdev; /**< OS device */ 79011819Sjulian struct drm_device *dev; 79111819Sjulian 79211819Sjulian struct drm_master *master; /* currently active master for this node */ 79311819Sjulian struct list_head master_list; 79411819Sjulian struct drm_mode_group mode_group; 79525652Sjhay}; 79625652Sjhay 79711819Sjulian/* mode specified on the command line */ 79811819Sjulianstruct drm_cmdline_mode { 79911819Sjulian bool specified; 80011819Sjulian bool refresh_specified; 80111819Sjulian bool bpp_specified; 802157067Srwatson int xres, yres; 80325652Sjhay int bpp; 80411819Sjulian int refresh; 80525652Sjhay bool rb; 80611819Sjulian bool interlace; 80711819Sjulian bool cvt; 80811819Sjulian bool margins; 80911819Sjulian enum drm_connector_force force; 81011819Sjulian}; 81111819Sjulian 81211819Sjulianstruct drm_pending_vblank_event { 81311819Sjulian struct drm_pending_event base; 81425652Sjhay int pipe; 81525652Sjhay struct drm_event_vblank event; 81625652Sjhay}; 81711819Sjulian 81811819Sjulian/* Length for the array of resource pointers for drm_get_resource_*. */ 81911819Sjulian#define DRM_MAX_PCI_RESOURCE 6 82025652Sjhay 82111819Sjulian/** 82211819Sjulian * DRM device functions structure 82311819Sjulian */ 82411819Sjulianstruct drm_device { 82511819Sjulian struct drm_driver_info *driver; 82611819Sjulian drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ 82711819Sjulian 82811819Sjulian u_int16_t pci_device; /* PCI device id */ 82911819Sjulian u_int16_t pci_vendor; /* PCI vendor id */ 83011819Sjulian 83111819Sjulian char *unique; /* Unique identifier: e.g., busid */ 83211819Sjulian int unique_len; /* Length of unique field */ 83311819Sjulian device_t device; /* Device instance from newbus */ 83411819Sjulian struct cdev *devnode; /* Device number for mknod */ 83511819Sjulian int if_version; /* Highest interface version set */ 83611819Sjulian 83711819Sjulian int flags; /* Flags to open(2) */ 83811819Sjulian 83911819Sjulian /* Locks */ 84011819Sjulian struct mtx dma_lock; /* protects dev->dma */ 84111819Sjulian struct mtx irq_lock; /* protects irq condition checks */ 84211819Sjulian struct mtx dev_lock; /* protects everything else */ 84311819Sjulian struct sx dev_struct_lock; 84411819Sjulian DRM_SPINTYPE drw_lock; 84511819Sjulian 84611819Sjulian /* Usage Counters */ 84711819Sjulian int open_count; /* Outstanding files open */ 84811819Sjulian int buf_use; /* Buffers in use -- cannot alloc */ 84911819Sjulian 85011819Sjulian /* Performance counters */ 85125652Sjhay unsigned long counters; 85211819Sjulian enum drm_stat_type types[15]; 85311819Sjulian atomic_t counts[15]; 85411819Sjulian 85511819Sjulian /* Authentication */ 85611819Sjulian drm_file_list_t files; 85711819Sjulian drm_magic_head_t magiclist[DRM_HASH_SIZE]; 85811819Sjulian 85911819Sjulian /* Linked list of mappable regions. Protected by dev_lock */ 86011819Sjulian drm_map_list_t maplist; 86111819Sjulian struct unrhdr *map_unrhdr; 86211819Sjulian 86311819Sjulian drm_local_map_t **context_sareas; 86411819Sjulian int max_context; 86511819Sjulian 86611819Sjulian drm_lock_data_t lock; /* Information on hardware lock */ 86711819Sjulian 86811819Sjulian /* DMA queues (contexts) */ 86911819Sjulian drm_device_dma_t *dma; /* Optional pointer for DMA support */ 87011819Sjulian 87111819Sjulian /* Context support */ 87211819Sjulian int irq; /* Interrupt used by board */ 87311819Sjulian int irq_enabled; /* True if the irq handler is enabled */ 87411819Sjulian int msi_enabled; /* MSI enabled */ 87511819Sjulian int irqrid; /* Interrupt used by board */ 87611819Sjulian struct resource *irqr; /* Resource for interrupt used by board */ 87711819Sjulian void *irqh; /* Handle from bus_setup_intr */ 87811819Sjulian 87911819Sjulian /* Storage of resource pointers for drm_get_resource_* */ 88011819Sjulian struct resource *pcir[DRM_MAX_PCI_RESOURCE]; 88111819Sjulian int pcirid[DRM_MAX_PCI_RESOURCE]; 88211819Sjulian 88311819Sjulian int pci_domain; 88411819Sjulian int pci_bus; 88511819Sjulian int pci_slot; 88611819Sjulian int pci_func; 88711819Sjulian 88811819Sjulian atomic_t context_flag; /* Context swapping flag */ 88911819Sjulian int last_context; /* Last current context */ 89011819Sjulian 89111819Sjulian int num_crtcs; 89211819Sjulian 89311819Sjulian struct sigio *buf_sigio; /* Processes waiting for SIGIO */ 89411819Sjulian 89511819Sjulian /* Sysctl support */ 89611819Sjulian struct drm_sysctl_info *sysctl; 89711819Sjulian int sysctl_node_idx; 89811819Sjulian 89911819Sjulian drm_agp_head_t *agp; 90011819Sjulian drm_sg_mem_t *sg; /* Scatter gather memory */ 90111819Sjulian atomic_t *ctx_bitmap; 90211819Sjulian void *dev_private; 90311819Sjulian unsigned int agp_buffer_token; 90411819Sjulian drm_local_map_t *agp_buffer_map; 90511819Sjulian 90611819Sjulian struct drm_minor *control; /**< Control node for card */ 90711819Sjulian struct drm_minor *primary; /**< render type primary screen head */ 90811819Sjulian 90911819Sjulian struct unrhdr *drw_unrhdr; 91011819Sjulian /* RB tree of drawable infos */ 91111819Sjulian RB_HEAD(drawable_tree, bsd_drm_drawable_info) drw_head; 91211819Sjulian 91311819Sjulian int vblank_disable_allowed; 91411819Sjulian 91511819Sjulian atomic_t *_vblank_count; /**< number of VBLANK interrupts (driver must alloc the right number of counters) */ 91611819Sjulian struct timeval *_vblank_time; /**< timestamp of current vblank_count (drivers must alloc right number of fields) */ 91711819Sjulian struct mtx vblank_time_lock; /**< Protects vblank count and time updates during vblank enable/disable */ 91811819Sjulian struct mtx vbl_lock; 919139584Srwatson atomic_t *vblank_refcount; /* number of users of vblank interruptsper crtc */ 92011819Sjulian u32 *last_vblank; /* protected by dev->vbl_lock, used */ 92111819Sjulian /* for wraparound handling */ 92211819Sjulian int *vblank_enabled; /* so we don't call enable more than 92311819Sjulian once per disable */ 92411819Sjulian int *vblank_inmodeset; /* Display driver is setting mode */ 92511819Sjulian u32 *last_vblank_wait; /* Last vblank seqno waited per CRTC */ 92611819Sjulian struct callout vblank_disable_callout; 92711819Sjulian 92811819Sjulian u32 max_vblank_count; /**< size of vblank counter register */ 92911819Sjulian 93011819Sjulian struct list_head vblank_event_list; 93111819Sjulian struct mtx event_lock; 93211819Sjulian 93311819Sjulian struct drm_mode_config mode_config; /**< Current mode config */ 93411819Sjulian 93511819Sjulian /* GEM part */ 93611819Sjulian struct sx object_name_lock; 93711819Sjulian struct drm_gem_names object_names; 93811819Sjulian void *mm_private; 93911819Sjulian 94011819Sjulian void *sysctl_private; 94111819Sjulian char busid_str[128]; 94211819Sjulian int modesetting; 94311819Sjulian}; 94411819Sjulian 94511819Sjulianstatic __inline__ int drm_core_check_feature(struct drm_device *dev, 94611819Sjulian int feature) 94711819Sjulian{ 94811819Sjulian return ((dev->driver->driver_features & feature) ? 1 : 0); 94911819Sjulian} 95011819Sjulian 95111819Sjulian#if __OS_HAS_AGP 95211819Sjulianstatic inline int drm_core_has_AGP(struct drm_device *dev) 95311819Sjulian{ 95411819Sjulian return drm_core_check_feature(dev, DRIVER_USE_AGP); 95525652Sjhay} 95611819Sjulian#else 95711819Sjulian#define drm_core_has_AGP(dev) (0) 95811819Sjulian#endif 95911819Sjulian 96011819Sjulianenum dmi_field { 96125652Sjhay DMI_NONE, 96211819Sjulian DMI_BIOS_VENDOR, 96311819Sjulian DMI_BIOS_VERSION, 96411819Sjulian DMI_BIOS_DATE, 96511819Sjulian DMI_SYS_VENDOR, 96611819Sjulian DMI_PRODUCT_NAME, 96711819Sjulian DMI_PRODUCT_VERSION, 96811819Sjulian DMI_PRODUCT_SERIAL, 96911819Sjulian DMI_PRODUCT_UUID, 97011819Sjulian DMI_BOARD_VENDOR, 97111819Sjulian DMI_BOARD_NAME, 97211819Sjulian DMI_BOARD_VERSION, 97311819Sjulian DMI_BOARD_SERIAL, 974139584Srwatson DMI_BOARD_ASSET_TAG, 97511819Sjulian DMI_CHASSIS_VENDOR, 97611819Sjulian DMI_CHASSIS_TYPE, 97725652Sjhay DMI_CHASSIS_VERSION, 97811819Sjulian DMI_CHASSIS_SERIAL, 97911819Sjulian DMI_CHASSIS_ASSET_TAG, 98011819Sjulian DMI_STRING_MAX, 98111819Sjulian}; 98211819Sjulian 98311819Sjulianstruct dmi_strmatch { 98411819Sjulian unsigned char slot; 98511819Sjulian char substr[79]; 98611819Sjulian}; 98711819Sjulian 98811819Sjulianstruct dmi_system_id { 98911819Sjulian int (*callback)(const struct dmi_system_id *); 99011819Sjulian const char *ident; 99111819Sjulian struct dmi_strmatch matches[4]; 99211819Sjulian}; 99311819Sjulian#define DMI_MATCH(a, b) {(a), (b)} 99411819Sjulianbool dmi_check_system(const struct dmi_system_id *); 99511819Sjulian 99611819Sjulianextern int drm_debug_flag; 99711819Sjulianextern int drm_notyet_flag; 99811819Sjulianextern unsigned int drm_vblank_offdelay; 999151967Sandreextern unsigned int drm_timestamp_precision; 100025652Sjhay 100111819Sjulian/* Device setup support (drm_drv.c) */ 100211819Sjulianint drm_probe(device_t kdev, drm_pci_id_list_t *idlist); 100311819Sjulianint drm_attach(device_t kdev, drm_pci_id_list_t *idlist); 100411819Sjulianint drm_create_cdevs(device_t kdev); 100511819Sjulianvoid drm_close(void *data); 100625652Sjhayint drm_detach(device_t kdev); 100725652Sjhayd_ioctl_t drm_ioctl; 100825652Sjhayd_open_t drm_open; 100911819Sjuliand_read_t drm_read; 101011819Sjuliand_poll_t drm_poll; 101111819Sjuliand_mmap_t drm_mmap; 101211819Sjulianextern drm_local_map_t *drm_getsarea(struct drm_device *dev); 101325652Sjhay 101411819Sjulianvoid drm_event_wakeup(struct drm_pending_event *e); 101511819Sjulian 101611819Sjulianint drm_add_busid_modesetting(struct drm_device *dev, 101797658Stanimura struct sysctl_ctx_list *ctx, struct sysctl_oid *top); 101811819Sjulian 101911819Sjulian/* File operations helpers (drm_fops.c) */ 102011819Sjulianextern int drm_open_helper(struct cdev *kdev, int flags, int fmt, 102111819Sjulian DRM_STRUCTPROC *p, 102211819Sjulian struct drm_device *dev); 102311819Sjulian 102411819Sjulian/* Memory management support (drm_memory.c) */ 102511819Sjulianvoid drm_mem_init(void); 102611819Sjulianvoid drm_mem_uninit(void); 102711819Sjulianvoid *drm_ioremap_wc(struct drm_device *dev, drm_local_map_t *map); 1028139584Srwatsonvoid *drm_ioremap(struct drm_device *dev, drm_local_map_t *map); 102911819Sjulianvoid drm_ioremapfree(drm_local_map_t *map); 103011819Sjulianint drm_mtrr_add(unsigned long offset, size_t size, int flags); 103111819Sjulianint drm_mtrr_del(int handle, unsigned long offset, size_t size, int flags); 103211819Sjulian 103311819Sjulianint drm_context_switch(struct drm_device *dev, int old, int new); 103411819Sjulianint drm_context_switch_complete(struct drm_device *dev, int new); 103511819Sjulian 103611819Sjulianint drm_ctxbitmap_init(struct drm_device *dev); 103711819Sjulianvoid drm_ctxbitmap_cleanup(struct drm_device *dev); 103811819Sjulianvoid drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle); 103911819Sjulianint drm_ctxbitmap_next(struct drm_device *dev); 104011819Sjulian 104111819Sjulian/* Locking IOCTL support (drm_lock.c) */ 104211819Sjulianint drm_lock_take(struct drm_lock_data *lock_data, 104311819Sjulian unsigned int context); 104411819Sjulianint drm_lock_transfer(struct drm_lock_data *lock_data, 104511819Sjulian unsigned int context); 104611819Sjulianint drm_lock_free(struct drm_lock_data *lock_data, 104711819Sjulian unsigned int context); 104811819Sjulian 104911819Sjulian/* Buffer management support (drm_bufs.c) */ 105011819Sjulianunsigned long drm_get_resource_start(struct drm_device *dev, 105111819Sjulian unsigned int resource); 105211819Sjulianunsigned long drm_get_resource_len(struct drm_device *dev, 105311819Sjulian unsigned int resource); 105411819Sjulianvoid drm_rmmap(struct drm_device *dev, drm_local_map_t *map); 105511819Sjulianint drm_order(unsigned long size); 105611819Sjulianint drm_addmap(struct drm_device *dev, unsigned long offset, 105711819Sjulian unsigned long size, 105811819Sjulian enum drm_map_type type, enum drm_map_flags flags, 105911819Sjulian drm_local_map_t **map_ptr); 106011819Sjulianint drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request); 106111819Sjulianint drm_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request); 106211819Sjulianint drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request); 106311819Sjulian 106411819Sjulian/* DMA support (drm_dma.c) */ 106511819Sjulianint drm_dma_setup(struct drm_device *dev); 106611819Sjulianvoid drm_dma_takedown(struct drm_device *dev); 106711819Sjulianvoid drm_free_buffer(struct drm_device *dev, drm_buf_t *buf); 106811819Sjulianvoid drm_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv); 106911819Sjulian#define drm_core_reclaim_buffers drm_reclaim_buffers 107011819Sjulian 107111819Sjulian/* IRQ support (drm_irq.c) */ 107211819Sjulianint drm_irq_install(struct drm_device *dev); 107311819Sjulianint drm_irq_uninstall(struct drm_device *dev); 107411819Sjulianirqreturn_t drm_irq_handler(DRM_IRQ_ARGS); 107550519Sjhayvoid drm_driver_irq_preinstall(struct drm_device *dev); 107611819Sjulianvoid drm_driver_irq_postinstall(struct drm_device *dev); 107711819Sjulianvoid drm_driver_irq_uninstall(struct drm_device *dev); 107811819Sjulian 107911819Sjulianvoid drm_vblank_pre_modeset(struct drm_device *dev, int crtc); 108097658Stanimuravoid drm_vblank_post_modeset(struct drm_device *dev, int crtc); 108111819Sjulianint drm_modeset_ctl(struct drm_device *dev, void *data, 108211819Sjulian struct drm_file *file_priv); 108397658Stanimura 1084139579Srwatsonextern int drm_vblank_init(struct drm_device *dev, int num_crtcs); 108597658Stanimuraextern int drm_wait_vblank(struct drm_device *dev, void *data, 108611819Sjulian struct drm_file *filp); 108711819Sjulianextern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); 108811819Sjulianextern u32 drm_vblank_count(struct drm_device *dev, int crtc); 108911819Sjulianextern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc, 109011819Sjulian struct timeval *vblanktime); 109111819Sjulianextern bool drm_handle_vblank(struct drm_device *dev, int crtc); 109211819Sjulianvoid drm_handle_vblank_events(struct drm_device *dev, int crtc); 109311819Sjulianextern int drm_vblank_get(struct drm_device *dev, int crtc); 109411819Sjulianextern void drm_vblank_put(struct drm_device *dev, int crtc); 109511819Sjulianextern void drm_vblank_off(struct drm_device *dev, int crtc); 109611819Sjulianextern void drm_vblank_cleanup(struct drm_device *dev); 109711819Sjulianextern u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc, 109811819Sjulian struct timeval *tvblank, unsigned flags); 109911819Sjulianextern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, 110011819Sjulian int crtc, int *max_error, 110111819Sjulian struct timeval *vblank_time, 110211819Sjulian unsigned flags, 110311819Sjulian struct drm_crtc *refcrtc); 110411819Sjulianextern void drm_calc_timestamping_constants(struct drm_crtc *crtc); 110511819Sjulian 110611819Sjulianstruct timeval ns_to_timeval(const int64_t nsec); 110711819Sjulianint64_t timeval_to_ns(const struct timeval *tv); 110833181Seivind 110911819Sjulian/* AGP/PCI Express/GART support (drm_agpsupport.c) */ 111025652Sjhayint drm_device_is_agp(struct drm_device *dev); 1111157067Srwatsonint drm_device_is_pcie(struct drm_device *dev); 111211819Sjuliandrm_agp_head_t *drm_agp_init(void); 1113157067Srwatsonint drm_agp_acquire(struct drm_device *dev); 111411819Sjulianint drm_agp_release(struct drm_device *dev); 1115139932Srwatsonint drm_agp_info(struct drm_device * dev, struct drm_agp_info *info); 1116139932Srwatsonint drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); 111711819Sjulianvoid *drm_agp_allocate_memory(size_t pages, u32 type); 111811819Sjulianint drm_agp_free_memory(void *handle); 111911819Sjulianint drm_agp_bind_memory(void *handle, off_t start); 112011819Sjulianint drm_agp_unbind_memory(void *handle); 112111819Sjulianint drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); 112211819Sjulianint drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); 112311819Sjulianint drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); 112411819Sjulianint drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); 112511819Sjulian 112611819Sjulian/* Scatter Gather Support (drm_scatter.c) */ 112711819Sjulianvoid drm_sg_cleanup(drm_sg_mem_t *entry); 112825652Sjhayint drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request); 112911819Sjulian 1130157067Srwatson/* sysctl support (drm_sysctl.h) */ 113111819Sjulianextern int drm_sysctl_init(struct drm_device *dev); 113211819Sjulianextern int drm_sysctl_cleanup(struct drm_device *dev); 1133157067Srwatson 113438482Swollman/* ATI PCIGART support (ati_pcigart.c) */ 113538482Swollmanint drm_ati_pcigart_init(struct drm_device *dev, 113638482Swollman struct drm_ati_pcigart_info *gart_info); 113738482Swollmanint drm_ati_pcigart_cleanup(struct drm_device *dev, 113811819Sjulian struct drm_ati_pcigart_info *gart_info); 113938482Swollman 114038482Swollman/* Cache management (drm_memory.c) */ 114138482Swollmanvoid drm_clflush_pages(vm_page_t *pages, unsigned long num_pages); 114211819Sjulian 114311819Sjulian/* Locking IOCTL support (drm_drv.c) */ 114438482Swollmanint drm_lock(struct drm_device *dev, void *data, 114511819Sjulian struct drm_file *file_priv); 114638482Swollmanint drm_unlock(struct drm_device *dev, void *data, 114738482Swollman struct drm_file *file_priv); 114838482Swollmanint drm_version(struct drm_device *dev, void *data, 114911819Sjulian struct drm_file *file_priv); 115011819Sjulianint drm_setversion(struct drm_device *dev, void *data, 115138482Swollman struct drm_file *file_priv); 115238482Swollman 115338482Swollman/* Misc. IOCTL support (drm_ioctl.c) */ 115411819Sjulianint drm_irq_by_busid(struct drm_device *dev, void *data, 115511819Sjulian struct drm_file *file_priv); 115611819Sjulianint drm_getunique(struct drm_device *dev, void *data, 115711819Sjulian struct drm_file *file_priv); 115811819Sjulianint drm_setunique(struct drm_device *dev, void *data, 115911819Sjulian struct drm_file *file_priv); 116011819Sjulianint drm_getmap(struct drm_device *dev, void *data, 1161139932Srwatson struct drm_file *file_priv); 116238482Swollmanint drm_getclient(struct drm_device *dev, void *data, 116338482Swollman struct drm_file *file_priv); 116411819Sjulianint drm_getstats(struct drm_device *dev, void *data, 116511819Sjulian struct drm_file *file_priv); 116611819Sjulianint drm_getcap(struct drm_device *dev, void *data, 1167139932Srwatson struct drm_file *file_priv); 116838482Swollmanint drm_noop(struct drm_device *dev, void *data, 116938482Swollman struct drm_file *file_priv); 117011819Sjulian 117111819Sjulian/* Context IOCTL support (drm_context.c) */ 117211819Sjulianint drm_resctx(struct drm_device *dev, void *data, 1173139932Srwatson struct drm_file *file_priv); 1174139584Srwatsonint drm_addctx(struct drm_device *dev, void *data, 117538482Swollman struct drm_file *file_priv); 117611819Sjulianint drm_modctx(struct drm_device *dev, void *data, 117711819Sjulian struct drm_file *file_priv); 117811819Sjulianint drm_getctx(struct drm_device *dev, void *data, 1179139932Srwatson struct drm_file *file_priv); 1180139584Srwatsonint drm_switchctx(struct drm_device *dev, void *data, 118138482Swollman struct drm_file *file_priv); 118211819Sjulianint drm_newctx(struct drm_device *dev, void *data, 118311819Sjulian struct drm_file *file_priv); 118411819Sjulianint drm_rmctx(struct drm_device *dev, void *data, 118538482Swollman struct drm_file *file_priv); 118611819Sjulianint drm_setsareactx(struct drm_device *dev, void *data, 118711819Sjulian struct drm_file *file_priv); 118811819Sjulianint drm_getsareactx(struct drm_device *dev, void *data, 118938482Swollman struct drm_file *file_priv); 119038482Swollman 119138482Swollman/* Drawable IOCTL support (drm_drawable.c) */ 119238482Swollmanint drm_adddraw(struct drm_device *dev, void *data, 119311819Sjulian struct drm_file *file_priv); 119411819Sjulianint drm_rmdraw(struct drm_device *dev, void *data, 119511819Sjulian struct drm_file *file_priv); 119611819Sjulianint drm_update_draw(struct drm_device *dev, void *data, 119711819Sjulian struct drm_file *file_priv); 119811819Sjulianstruct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, 119911819Sjulian int handle); 120038482Swollman 120138482Swollman/* Drawable support (drm_drawable.c) */ 120238482Swollmanvoid drm_drawable_free_all(struct drm_device *dev); 120338482Swollman 120438482Swollman/* Authentication IOCTL support (drm_auth.c) */ 1205139932Srwatsonint drm_getmagic(struct drm_device *dev, void *data, 120611819Sjulian struct drm_file *file_priv); 120738482Swollmanint drm_authmagic(struct drm_device *dev, void *data, 120811819Sjulian struct drm_file *file_priv); 120911819Sjulian 121011819Sjulian/* Buffer management support (drm_bufs.c) */ 121111819Sjulianint drm_addmap_ioctl(struct drm_device *dev, void *data, 1212139932Srwatson struct drm_file *file_priv); 121311819Sjulianint drm_rmmap_ioctl(struct drm_device *dev, void *data, 121411819Sjulian struct drm_file *file_priv); 121511819Sjulianint drm_addbufs(struct drm_device *dev, void *data, 121638482Swollman struct drm_file *file_priv); 121738482Swollmanint drm_infobufs(struct drm_device *dev, void *data, 121838482Swollman struct drm_file *file_priv); 121938482Swollmanint drm_markbufs(struct drm_device *dev, void *data, 1220139932Srwatson struct drm_file *file_priv); 122138482Swollmanint drm_freebufs(struct drm_device *dev, void *data, 122211819Sjulian struct drm_file *file_priv); 122311819Sjulianint drm_mapbufs(struct drm_device *dev, void *data, 122411819Sjulian struct drm_file *file_priv); 122511819Sjulian 122638482Swollman/* DMA support (drm_dma.c) */ 122738482Swollmanint drm_dma(struct drm_device *dev, void *data, struct drm_file *file_priv); 122838482Swollman 122938482Swollman/* IRQ support (drm_irq.c) */ 1230139932Srwatsonint drm_control(struct drm_device *dev, void *data, 123138482Swollman struct drm_file *file_priv); 123211819Sjulian 123311819Sjulian/* AGP/GART support (drm_agpsupport.c) */ 123411819Sjulianint drm_agp_acquire_ioctl(struct drm_device *dev, void *data, 123511819Sjulian struct drm_file *file_priv); 123611819Sjulianint drm_agp_release_ioctl(struct drm_device *dev, void *data, 123711819Sjulian struct drm_file *file_priv); 1238139932Srwatsonint drm_agp_enable_ioctl(struct drm_device *dev, void *data, 123911819Sjulian struct drm_file *file_priv); 124011819Sjulianint drm_agp_info_ioctl(struct drm_device *dev, void *data, 124111819Sjulian struct drm_file *file_priv); 124211819Sjulianint drm_agp_alloc_ioctl(struct drm_device *dev, void *data, 124311819Sjulian struct drm_file *file_priv); 124438482Swollmanint drm_agp_free_ioctl(struct drm_device *dev, void *data, 124538482Swollman struct drm_file *file_priv); 124638482Swollmanint drm_agp_unbind_ioctl(struct drm_device *dev, void *data, 124738482Swollman struct drm_file *file_priv); 124838482Swollmanint drm_agp_bind_ioctl(struct drm_device *dev, void *data, 124938482Swollman struct drm_file *file_priv); 1250139932Srwatson 125138482Swollman /* Stub support (drm_stub.h) */ 125238482Swollmanextern int drm_setmaster_ioctl(struct drm_device *dev, void *data, 1253139932Srwatson struct drm_file *file_priv); 125411819Sjulianextern int drm_dropmaster_ioctl(struct drm_device *dev, void *data, 125511819Sjulian struct drm_file *file_priv); 125611819Sjulian 125711819Sjulian/* Scatter Gather Support (drm_scatter.c) */ 125838482Swollmanint drm_sg_alloc_ioctl(struct drm_device *dev, void *data, 125911819Sjulian struct drm_file *file_priv); 126011819Sjulianint drm_sg_free(struct drm_device *dev, void *data, 126111819Sjulian struct drm_file *file_priv); 126238482Swollman 126311819Sjulian/* consistent PCI memory functions (drm_pci.c) */ 126411819Sjuliandrm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size, 126524659Sjhay size_t align, dma_addr_t maxaddr); 1266157067Srwatsonvoid drm_pci_free(struct drm_device *dev, drm_dma_handle_t *dmah); 126711819Sjulian 126824659Sjhay/* Graphics Execution Manager library functions (drm_gem.c) */ 126924659Sjhayint drm_gem_init(struct drm_device *dev); 127011819Sjulianvoid drm_gem_destroy(struct drm_device *dev); 127124659Sjhay 127224659Sjhayint drm_gem_close_ioctl(struct drm_device *dev, void *data, 127311819Sjulian struct drm_file *file_priv); 1274139932Srwatsonint drm_gem_flink_ioctl(struct drm_device *dev, void *data, 1275139932Srwatson struct drm_file *file_priv); 127624659Sjhayint drm_gem_open_ioctl(struct drm_device *dev, void *data, 1277139932Srwatson struct drm_file *file_priv); 127824659Sjhayint drm_gem_handle_create(struct drm_file *file_priv, 127924659Sjhay struct drm_gem_object *obj, 128011819Sjulian u32 *handlep); 128124659Sjhayint drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle); 128224659Sjhayvoid drm_gem_object_handle_reference(struct drm_gem_object *obj); 128324659Sjhayvoid drm_gem_object_handle_unreference(struct drm_gem_object *obj); 128424659Sjhayvoid drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj); 128524659Sjhayvoid drm_gem_object_handle_free(struct drm_gem_object *obj); 128624659Sjhayvoid drm_gem_object_reference(struct drm_gem_object *obj); 1287157067Srwatsonvoid drm_gem_object_unreference(struct drm_gem_object *obj); 128824659Sjhayvoid drm_gem_object_unreference_unlocked(struct drm_gem_object *obj); 128924659Sjhayvoid drm_gem_object_release(struct drm_gem_object *obj); 129028270Swollmanvoid drm_gem_object_free(struct drm_gem_object *obj); 129111819Sjulianint drm_gem_object_init(struct drm_device *dev, struct drm_gem_object *obj, 129224659Sjhay size_t size); 129328270Swollmanint drm_gem_private_object_init(struct drm_device *dev, 129428270Swollman struct drm_gem_object *obj, size_t size); 129528270Swollmanstruct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, 129624659Sjhay size_t size); 1297139932Srwatsonstruct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, 129824659Sjhay struct drm_file *file_priv, uint32_t handle); 1299139932Srwatson 1300139932Srwatsonvoid drm_gem_open(struct drm_device *dev, struct drm_file *file_priv); 130124659Sjhayvoid drm_gem_release(struct drm_device *dev, struct drm_file *file_priv); 130224659Sjhay 130324659Sjhayint drm_gem_create_mmap_offset(struct drm_gem_object *obj); 130424659Sjhayvoid drm_gem_free_mmap_offset(struct drm_gem_object *obj); 1305157067Srwatsonint drm_gem_mmap_single(struct cdev *kdev, vm_ooffset_t *offset, vm_size_t size, 130624659Sjhay struct vm_object **obj_res, int nprot); 130724659Sjhayvoid drm_gem_pager_dtr(void *obj); 130824659Sjhay 130924659Sjhayvoid drm_device_lock_mtx(struct drm_device *dev); 131024659Sjhayvoid drm_device_unlock_mtx(struct drm_device *dev); 1311139932Srwatsonint drm_device_sleep_mtx(struct drm_device *dev, void *chan, int flags, 131224659Sjhay const char *msg, int timeout); 131324659Sjhayvoid drm_device_assert_mtx_locked(struct drm_device *dev); 131424659Sjhayvoid drm_device_assert_mtx_unlocked(struct drm_device *dev); 131524659Sjhay 1316139932Srwatsonvoid drm_device_lock_struct(struct drm_device *dev); 1317139444Srwatsonvoid drm_device_unlock_struct(struct drm_device *dev); 131824659Sjhayint drm_device_sleep_struct(struct drm_device *dev, void *chan, int flags, 131924659Sjhay const char *msg, int timeout); 132024659Sjhayvoid drm_device_assert_struct_locked(struct drm_device *dev); 132124659Sjhayvoid drm_device_assert_struct_unlocked(struct drm_device *dev); 132211819Sjulian 132324659Sjhayvoid drm_compat_locking_init(struct drm_device *dev); 132424659Sjhayvoid drm_sleep_locking_init(struct drm_device *dev); 132524659Sjhay 132611819Sjulian/* drm_modes.c */ 132769781Sdwmalonebool drm_mode_parse_command_line_for_connector(const char *mode_option, 132811819Sjulian struct drm_connector *connector, struct drm_cmdline_mode *mode); 132928270Swollmanstruct drm_display_mode *drm_mode_create_from_cmdline_mode( 133024659Sjhay struct drm_device *dev, struct drm_cmdline_mode *cmd); 133124659Sjhay 133224659Sjhay/* drm_edid.c */ 133343711Sjhayu8 *drm_find_cea_extension(struct edid *edid); 133428270Swollman 1335151967Sandre/* Inline replacements for drm_alloc and friends */ 133624659Sjhaystatic __inline__ void * 133728270Swollmandrm_alloc(size_t size, struct malloc_type *area) 133824659Sjhay{ 133924659Sjhay return malloc(size, area, M_NOWAIT); 134024659Sjhay} 134124659Sjhay 134224659Sjhaystatic __inline__ void * 134324659Sjhaydrm_calloc(size_t nmemb, size_t size, struct malloc_type *area) 134424659Sjhay{ 134524659Sjhay return malloc(size * nmemb, area, M_NOWAIT | M_ZERO); 134624659Sjhay} 134725652Sjhay 134824659Sjhaystatic __inline__ void * 134924659Sjhaydrm_realloc(void *oldpt, size_t oldsize, size_t size, 135025652Sjhay struct malloc_type *area) 135124659Sjhay{ 135224659Sjhay return reallocf(oldpt, size, area, M_NOWAIT); 135324659Sjhay} 135424659Sjhay 135524659Sjhaystatic __inline__ void 135624659Sjhaydrm_free(void *pt, size_t size, struct malloc_type *area) 135724659Sjhay{ 1358139584Srwatson free(pt, area); 135924659Sjhay} 1360139932Srwatson 136124659Sjhay/* Inline replacements for DRM_IOREMAP macros */ 136224659Sjhaystatic __inline__ void 136311819Sjuliandrm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev) 136424659Sjhay{ 1365157067Srwatson map->virtual = drm_ioremap_wc(dev, map); 1366139584Srwatson} 136724659Sjhaystatic __inline__ void 1368139932Srwatsondrm_core_ioremap(struct drm_local_map *map, struct drm_device *dev) 136911819Sjulian{ 137024659Sjhay map->virtual = drm_ioremap(dev, map); 137111819Sjulian} 1372139932Srwatsonstatic __inline__ void 1373139932Srwatsondrm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev) 1374139932Srwatson{ 1375139932Srwatson if ( map->virtual && map->size ) 1376139932Srwatson drm_ioremapfree(map); 1377139932Srwatson} 1378139584Srwatson 1379139584Srwatsonstatic __inline__ struct drm_local_map * 138024659Sjhaydrm_core_findmap(struct drm_device *dev, unsigned long offset) 138124659Sjhay{ 138224659Sjhay drm_local_map_t *map; 138324659Sjhay 138424659Sjhay DRM_LOCK_ASSERT(dev); 138524659Sjhay TAILQ_FOREACH(map, &dev->maplist, link) { 138624659Sjhay if (offset == (unsigned long)map->handle) 1387157067Srwatson return map; 138824659Sjhay } 138924659Sjhay return NULL; 139024659Sjhay} 1391139932Srwatson 139211819Sjulianstatic __inline__ void drm_core_dropmap(struct drm_map *map) 139324659Sjhay{ 139424659Sjhay} 139524659Sjhay 1396139932Srwatson#define KIB_NOTYET() \ 1397139932Srwatsondo { \ 139824659Sjhay if (drm_debug_flag && drm_notyet_flag) \ 1399139579Srwatson printf("NOTYET: %s at %s:%d\n", __func__, __FILE__, __LINE__); \ 140024659Sjhay} while (0) 140124659Sjhay 140224659Sjhay#define KTR_DRM KTR_DEV 140383366Sjulian#define KTR_DRM_REG KTR_SPARE3 140424659Sjhay 140524659Sjhay#endif /* __KERNEL__ */ 140624659Sjhay#endif /* _DRM_P_H_ */ 140724659Sjhay