Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.18 1102 lines 36 kB view raw
1/** 2 * \file drmP.h 3 * Private header for Direct Rendering Manager 4 * 5 * \author Rickard E. (Rik) Faith <faith@valinux.com> 6 * \author Gareth Hughes <gareth@valinux.com> 7 */ 8 9/* 10 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 11 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 12 * All rights reserved. 13 * 14 * Permission is hereby granted, free of charge, to any person obtaining a 15 * copy of this software and associated documentation files (the "Software"), 16 * to deal in the Software without restriction, including without limitation 17 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18 * and/or sell copies of the Software, and to permit persons to whom the 19 * Software is furnished to do so, subject to the following conditions: 20 * 21 * The above copyright notice and this permission notice (including the next 22 * paragraph) shall be included in all copies or substantial portions of the 23 * Software. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 26 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 27 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 28 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 29 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 30 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 31 * OTHER DEALINGS IN THE SOFTWARE. 32 */ 33 34#ifndef _DRM_P_H_ 35#define _DRM_P_H_ 36 37/* If you want the memory alloc debug functionality, change define below */ 38/* #define DEBUG_MEMORY */ 39 40#ifdef __KERNEL__ 41#ifdef __alpha__ 42/* add include of current.h so that "current" is defined 43 * before static inline funcs in wait.h. Doing this so we 44 * can build the DRM (part of PI DRI). 4/21/2000 S + B */ 45#include <asm/current.h> 46#endif /* __alpha__ */ 47#include <linux/module.h> 48#include <linux/kernel.h> 49#include <linux/miscdevice.h> 50#include <linux/fs.h> 51#include <linux/proc_fs.h> 52#include <linux/init.h> 53#include <linux/file.h> 54#include <linux/pci.h> 55#include <linux/jiffies.h> 56#include <linux/smp_lock.h> /* For (un)lock_kernel */ 57#include <linux/mm.h> 58#include <linux/cdev.h> 59#include <linux/mutex.h> 60#if defined(__alpha__) || defined(__powerpc__) 61#include <asm/pgtable.h> /* For pte_wrprotect */ 62#endif 63#include <asm/io.h> 64#include <asm/mman.h> 65#include <asm/uaccess.h> 66#ifdef CONFIG_MTRR 67#include <asm/mtrr.h> 68#endif 69#if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE) 70#include <linux/types.h> 71#include <linux/agp_backend.h> 72#endif 73#include <linux/workqueue.h> 74#include <linux/poll.h> 75#include <asm/pgalloc.h> 76#include "drm.h" 77 78#define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE))) 79#define __OS_HAS_MTRR (defined(CONFIG_MTRR)) 80 81#include "drm_os_linux.h" 82 83/***********************************************************************/ 84/** \name DRM template customization defaults */ 85/*@{*/ 86 87/* driver capabilities and requirements mask */ 88#define DRIVER_USE_AGP 0x1 89#define DRIVER_REQUIRE_AGP 0x2 90#define DRIVER_USE_MTRR 0x4 91#define DRIVER_PCI_DMA 0x8 92#define DRIVER_SG 0x10 93#define DRIVER_HAVE_DMA 0x20 94#define DRIVER_HAVE_IRQ 0x40 95#define DRIVER_IRQ_SHARED 0x80 96#define DRIVER_IRQ_VBL 0x100 97#define DRIVER_DMA_QUEUE 0x200 98#define DRIVER_FB_DMA 0x400 99 100/***********************************************************************/ 101/** \name Begin the DRM... */ 102/*@{*/ 103 104#define DRM_DEBUG_CODE 2 /**< Include debugging code if > 1, then 105 also include looping detection. */ 106 107#define DRM_HASH_SIZE 16 /**< Size of key hash table. Must be power of 2. */ 108#define DRM_KERNEL_CONTEXT 0 /**< Change drm_resctx if changed */ 109#define DRM_RESERVED_CONTEXTS 1 /**< Change drm_resctx if changed */ 110#define DRM_LOOPING_LIMIT 5000000 111#define DRM_TIME_SLICE (HZ/20) /**< Time slice for GLXContexts */ 112#define DRM_LOCK_SLICE 1 /**< Time slice for lock, in jiffies */ 113 114#define DRM_FLAG_DEBUG 0x01 115 116#define DRM_MEM_DMA 0 117#define DRM_MEM_SAREA 1 118#define DRM_MEM_DRIVER 2 119#define DRM_MEM_MAGIC 3 120#define DRM_MEM_IOCTLS 4 121#define DRM_MEM_MAPS 5 122#define DRM_MEM_VMAS 6 123#define DRM_MEM_BUFS 7 124#define DRM_MEM_SEGS 8 125#define DRM_MEM_PAGES 9 126#define DRM_MEM_FILES 10 127#define DRM_MEM_QUEUES 11 128#define DRM_MEM_CMDS 12 129#define DRM_MEM_MAPPINGS 13 130#define DRM_MEM_BUFLISTS 14 131#define DRM_MEM_AGPLISTS 15 132#define DRM_MEM_TOTALAGP 16 133#define DRM_MEM_BOUNDAGP 17 134#define DRM_MEM_CTXBITMAP 18 135#define DRM_MEM_STUB 19 136#define DRM_MEM_SGLISTS 20 137#define DRM_MEM_CTXLIST 21 138 139#define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) 140 141/*@}*/ 142 143/***********************************************************************/ 144/** \name Backward compatibility section */ 145/*@{*/ 146 147#define DRM_RPR_ARG(vma) vma, 148 149#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT) 150 151/*@}*/ 152 153/***********************************************************************/ 154/** \name Macros to make printk easier */ 155/*@{*/ 156 157/** 158 * Error output. 159 * 160 * \param fmt printf() like format string. 161 * \param arg arguments 162 */ 163#define DRM_ERROR(fmt, arg...) \ 164 printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __FUNCTION__ , ##arg) 165 166/** 167 * Memory error output. 168 * 169 * \param area memory area where the error occurred. 170 * \param fmt printf() like format string. 171 * \param arg arguments 172 */ 173#define DRM_MEM_ERROR(area, fmt, arg...) \ 174 printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __FUNCTION__, \ 175 drm_mem_stats[area].name , ##arg) 176 177#define DRM_INFO(fmt, arg...) printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg) 178 179/** 180 * Debug output. 181 * 182 * \param fmt printf() like format string. 183 * \param arg arguments 184 */ 185#if DRM_DEBUG_CODE 186#define DRM_DEBUG(fmt, arg...) \ 187 do { \ 188 if ( drm_debug ) \ 189 printk(KERN_DEBUG \ 190 "[" DRM_NAME ":%s] " fmt , \ 191 __FUNCTION__ , ##arg); \ 192 } while (0) 193#else 194#define DRM_DEBUG(fmt, arg...) do { } while (0) 195#endif 196 197#define DRM_PROC_LIMIT (PAGE_SIZE-80) 198 199#define DRM_PROC_PRINT(fmt, arg...) \ 200 len += sprintf(&buf[len], fmt , ##arg); \ 201 if (len > DRM_PROC_LIMIT) { *eof = 1; return len - offset; } 202 203#define DRM_PROC_PRINT_RET(ret, fmt, arg...) \ 204 len += sprintf(&buf[len], fmt , ##arg); \ 205 if (len > DRM_PROC_LIMIT) { ret; *eof = 1; return len - offset; } 206 207/*@}*/ 208 209/***********************************************************************/ 210/** \name Internal types and structures */ 211/*@{*/ 212 213#define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x) 214#define DRM_MIN(a,b) min(a,b) 215#define DRM_MAX(a,b) max(a,b) 216 217#define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1)) 218#define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x)) 219#define DRM_WAITCOUNT(dev,idx) DRM_BUFCOUNT(&dev->queuelist[idx]->waitlist) 220 221#define DRM_IF_VERSION(maj, min) (maj << 16 | min) 222/** 223 * Get the private SAREA mapping. 224 * 225 * \param _dev DRM device. 226 * \param _ctx context number. 227 * \param _map output mapping. 228 */ 229#define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ 230 (_map) = (_dev)->context_sareas[_ctx]; \ 231} while(0) 232 233/** 234 * Test that the hardware lock is held by the caller, returning otherwise. 235 * 236 * \param dev DRM device. 237 * \param filp file pointer of the caller. 238 */ 239#define LOCK_TEST_WITH_RETURN( dev, filp ) \ 240do { \ 241 if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ 242 dev->lock.filp != filp ) { \ 243 DRM_ERROR( "%s called without lock held\n", \ 244 __FUNCTION__ ); \ 245 return -EINVAL; \ 246 } \ 247} while (0) 248 249/** 250 * Copy and IOCTL return string to user space 251 */ 252#define DRM_COPY( name, value ) \ 253 len = strlen( value ); \ 254 if ( len > name##_len ) len = name##_len; \ 255 name##_len = strlen( value ); \ 256 if ( len && name ) { \ 257 if ( copy_to_user( name, value, len ) ) \ 258 return -EFAULT; \ 259 } 260 261/** 262 * Ioctl function type. 263 * 264 * \param inode device inode. 265 * \param filp file pointer. 266 * \param cmd command. 267 * \param arg argument. 268 */ 269typedef int drm_ioctl_t(struct inode *inode, struct file *filp, 270 unsigned int cmd, unsigned long arg); 271 272typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, 273 unsigned long arg); 274 275#define DRM_AUTH 0x1 276#define DRM_MASTER 0x2 277#define DRM_ROOT_ONLY 0x4 278 279typedef struct drm_ioctl_desc { 280 drm_ioctl_t *func; 281 int flags; 282} drm_ioctl_desc_t; 283 284typedef struct drm_devstate { 285 pid_t owner; /**< X server pid holding x_lock */ 286} drm_devstate_t; 287 288typedef struct drm_magic_entry { 289 drm_magic_t magic; 290 struct drm_file *priv; 291 struct drm_magic_entry *next; 292} drm_magic_entry_t; 293 294typedef struct drm_magic_head { 295 struct drm_magic_entry *head; 296 struct drm_magic_entry *tail; 297} drm_magic_head_t; 298 299typedef struct drm_vma_entry { 300 struct vm_area_struct *vma; 301 struct drm_vma_entry *next; 302 pid_t pid; 303} drm_vma_entry_t; 304 305/** 306 * DMA buffer. 307 */ 308typedef struct drm_buf { 309 int idx; /**< Index into master buflist */ 310 int total; /**< Buffer size */ 311 int order; /**< log-base-2(total) */ 312 int used; /**< Amount of buffer in use (for DMA) */ 313 unsigned long offset; /**< Byte offset (used internally) */ 314 void *address; /**< Address of buffer */ 315 unsigned long bus_address; /**< Bus address of buffer */ 316 struct drm_buf *next; /**< Kernel-only: used for free list */ 317 __volatile__ int waiting; /**< On kernel DMA queue */ 318 __volatile__ int pending; /**< On hardware DMA queue */ 319 wait_queue_head_t dma_wait; /**< Processes waiting */ 320 struct file *filp; /**< Pointer to holding file descr */ 321 int context; /**< Kernel queue for this buffer */ 322 int while_locked; /**< Dispatch this buffer while locked */ 323 enum { 324 DRM_LIST_NONE = 0, 325 DRM_LIST_FREE = 1, 326 DRM_LIST_WAIT = 2, 327 DRM_LIST_PEND = 3, 328 DRM_LIST_PRIO = 4, 329 DRM_LIST_RECLAIM = 5 330 } list; /**< Which list we're on */ 331 332 int dev_priv_size; /**< Size of buffer private storage */ 333 void *dev_private; /**< Per-buffer private storage */ 334} drm_buf_t; 335 336/** bufs is one longer than it has to be */ 337typedef struct drm_waitlist { 338 int count; /**< Number of possible buffers */ 339 drm_buf_t **bufs; /**< List of pointers to buffers */ 340 drm_buf_t **rp; /**< Read pointer */ 341 drm_buf_t **wp; /**< Write pointer */ 342 drm_buf_t **end; /**< End pointer */ 343 spinlock_t read_lock; 344 spinlock_t write_lock; 345} drm_waitlist_t; 346 347typedef struct drm_freelist { 348 int initialized; /**< Freelist in use */ 349 atomic_t count; /**< Number of free buffers */ 350 drm_buf_t *next; /**< End pointer */ 351 352 wait_queue_head_t waiting; /**< Processes waiting on free bufs */ 353 int low_mark; /**< Low water mark */ 354 int high_mark; /**< High water mark */ 355 atomic_t wfh; /**< If waiting for high mark */ 356 spinlock_t lock; 357} drm_freelist_t; 358 359typedef struct drm_dma_handle { 360 dma_addr_t busaddr; 361 void *vaddr; 362 size_t size; 363} drm_dma_handle_t; 364 365/** 366 * Buffer entry. There is one of this for each buffer size order. 367 */ 368typedef struct drm_buf_entry { 369 int buf_size; /**< size */ 370 int buf_count; /**< number of buffers */ 371 drm_buf_t *buflist; /**< buffer list */ 372 int seg_count; 373 int page_order; 374 drm_dma_handle_t **seglist; 375 376 drm_freelist_t freelist; 377} drm_buf_entry_t; 378 379/** File private data */ 380typedef struct drm_file { 381 int authenticated; 382 int master; 383 int minor; 384 pid_t pid; 385 uid_t uid; 386 drm_magic_t magic; 387 unsigned long ioctl_count; 388 struct drm_file *next; 389 struct drm_file *prev; 390 struct drm_head *head; 391 int remove_auth_on_close; 392 unsigned long lock_count; 393 void *driver_priv; 394} drm_file_t; 395 396/** Wait queue */ 397typedef struct drm_queue { 398 atomic_t use_count; /**< Outstanding uses (+1) */ 399 atomic_t finalization; /**< Finalization in progress */ 400 atomic_t block_count; /**< Count of processes waiting */ 401 atomic_t block_read; /**< Queue blocked for reads */ 402 wait_queue_head_t read_queue; /**< Processes waiting on block_read */ 403 atomic_t block_write; /**< Queue blocked for writes */ 404 wait_queue_head_t write_queue; /**< Processes waiting on block_write */ 405#if 1 406 atomic_t total_queued; /**< Total queued statistic */ 407 atomic_t total_flushed; /**< Total flushes statistic */ 408 atomic_t total_locks; /**< Total locks statistics */ 409#endif 410 drm_ctx_flags_t flags; /**< Context preserving and 2D-only */ 411 drm_waitlist_t waitlist; /**< Pending buffers */ 412 wait_queue_head_t flush_queue; /**< Processes waiting until flush */ 413} drm_queue_t; 414 415/** 416 * Lock data. 417 */ 418typedef struct drm_lock_data { 419 drm_hw_lock_t *hw_lock; /**< Hardware lock */ 420 struct file *filp; /**< File descr of lock holder (0=kernel) */ 421 wait_queue_head_t lock_queue; /**< Queue of blocked processes */ 422 unsigned long lock_time; /**< Time of last lock in jiffies */ 423} drm_lock_data_t; 424 425/** 426 * DMA data. 427 */ 428typedef struct drm_device_dma { 429 430 drm_buf_entry_t bufs[DRM_MAX_ORDER + 1]; /**< buffers, grouped by their size order */ 431 int buf_count; /**< total number of buffers */ 432 drm_buf_t **buflist; /**< Vector of pointers into drm_device_dma::bufs */ 433 int seg_count; 434 int page_count; /**< number of pages */ 435 unsigned long *pagelist; /**< page list */ 436 unsigned long byte_count; 437 enum { 438 _DRM_DMA_USE_AGP = 0x01, 439 _DRM_DMA_USE_SG = 0x02, 440 _DRM_DMA_USE_FB = 0x04 441 } flags; 442 443} drm_device_dma_t; 444 445/** 446 * AGP memory entry. Stored as a doubly linked list. 447 */ 448typedef struct drm_agp_mem { 449 unsigned long handle; /**< handle */ 450 DRM_AGP_MEM *memory; 451 unsigned long bound; /**< address */ 452 int pages; 453 struct drm_agp_mem *prev; /**< previous entry */ 454 struct drm_agp_mem *next; /**< next entry */ 455} drm_agp_mem_t; 456 457/** 458 * AGP data. 459 * 460 * \sa drm_agp_init() and drm_device::agp. 461 */ 462typedef struct drm_agp_head { 463 DRM_AGP_KERN agp_info; /**< AGP device information */ 464 drm_agp_mem_t *memory; /**< memory entries */ 465 unsigned long mode; /**< AGP mode */ 466 struct agp_bridge_data *bridge; 467 int enabled; /**< whether the AGP bus as been enabled */ 468 int acquired; /**< whether the AGP device has been acquired */ 469 unsigned long base; 470 int agp_mtrr; 471 int cant_use_aperture; 472 unsigned long page_mask; 473} drm_agp_head_t; 474 475/** 476 * Scatter-gather memory. 477 */ 478typedef struct drm_sg_mem { 479 unsigned long handle; 480 void *virtual; 481 int pages; 482 struct page **pagelist; 483 dma_addr_t *busaddr; 484} drm_sg_mem_t; 485 486typedef struct drm_sigdata { 487 int context; 488 drm_hw_lock_t *lock; 489} drm_sigdata_t; 490 491/** 492 * Mappings list 493 */ 494typedef struct drm_map_list { 495 struct list_head head; /**< list head */ 496 drm_map_t *map; /**< mapping */ 497 unsigned int user_token; 498} drm_map_list_t; 499 500typedef drm_map_t drm_local_map_t; 501 502/** 503 * Context handle list 504 */ 505typedef struct drm_ctx_list { 506 struct list_head head; /**< list head */ 507 drm_context_t handle; /**< context handle */ 508 drm_file_t *tag; /**< associated fd private data */ 509} drm_ctx_list_t; 510 511typedef struct drm_vbl_sig { 512 struct list_head head; 513 unsigned int sequence; 514 struct siginfo info; 515 struct task_struct *task; 516} drm_vbl_sig_t; 517 518/* location of GART table */ 519#define DRM_ATI_GART_MAIN 1 520#define DRM_ATI_GART_FB 2 521 522typedef struct ati_pcigart_info { 523 int gart_table_location; 524 int is_pcie; 525 void *addr; 526 dma_addr_t bus_addr; 527 drm_local_map_t mapping; 528} drm_ati_pcigart_info; 529 530/** 531 * DRM driver structure. This structure represent the common code for 532 * a family of cards. There will one drm_device for each card present 533 * in this family 534 */ 535struct drm_device; 536 537struct drm_driver { 538 int (*load) (struct drm_device *, unsigned long flags); 539 int (*firstopen) (struct drm_device *); 540 int (*open) (struct drm_device *, drm_file_t *); 541 void (*preclose) (struct drm_device *, struct file * filp); 542 void (*postclose) (struct drm_device *, drm_file_t *); 543 void (*lastclose) (struct drm_device *); 544 int (*unload) (struct drm_device *); 545 int (*dma_ioctl) (DRM_IOCTL_ARGS); 546 void (*dma_ready) (struct drm_device *); 547 int (*dma_quiescent) (struct drm_device *); 548 int (*context_ctor) (struct drm_device * dev, int context); 549 int (*context_dtor) (struct drm_device * dev, int context); 550 int (*kernel_context_switch) (struct drm_device * dev, int old, 551 int new); 552 void (*kernel_context_switch_unlock) (struct drm_device * dev, 553 drm_lock_t *lock); 554 int (*vblank_wait) (struct drm_device * dev, unsigned int *sequence); 555 int (*dri_library_name) (struct drm_device *dev, char *buf); 556 557 /** 558 * Called by \c drm_device_is_agp. Typically used to determine if a 559 * card is really attached to AGP or not. 560 * 561 * \param dev DRM device handle 562 * 563 * \returns 564 * One of three values is returned depending on whether or not the 565 * card is absolutely \b not AGP (return of 0), absolutely \b is AGP 566 * (return of 1), or may or may not be AGP (return of 2). 567 */ 568 int (*device_is_agp) (struct drm_device * dev); 569 570 /* these have to be filled in */ 571 572 irqreturn_t(*irq_handler) (DRM_IRQ_ARGS); 573 void (*irq_preinstall) (struct drm_device * dev); 574 void (*irq_postinstall) (struct drm_device * dev); 575 void (*irq_uninstall) (struct drm_device * dev); 576 void (*reclaim_buffers) (struct drm_device * dev, struct file * filp); 577 void (*reclaim_buffers_locked) (struct drm_device *dev, 578 struct file *filp); 579 unsigned long (*get_map_ofs) (drm_map_t * map); 580 unsigned long (*get_reg_ofs) (struct drm_device * dev); 581 void (*set_version) (struct drm_device * dev, drm_set_version_t * sv); 582 583 int major; 584 int minor; 585 int patchlevel; 586 char *name; 587 char *desc; 588 char *date; 589 590 u32 driver_features; 591 int dev_priv_size; 592 drm_ioctl_desc_t *ioctls; 593 int num_ioctls; 594 struct file_operations fops; 595 struct pci_driver pci_driver; 596}; 597 598/** 599 * DRM head structure. This structure represent a video head on a card 600 * that may contain multiple heads. Embed one per head of these in the 601 * private drm_device structure. 602 */ 603typedef struct drm_head { 604 int minor; /**< Minor device number */ 605 struct drm_device *dev; 606 struct proc_dir_entry *dev_root; /**< proc directory entry */ 607 dev_t device; /**< Device number for mknod */ 608 struct class_device *dev_class; 609} drm_head_t; 610 611/** 612 * DRM device structure. This structure represent a complete card that 613 * may contain multiple heads. 614 */ 615typedef struct drm_device { 616 char *unique; /**< Unique identifier: e.g., busid */ 617 int unique_len; /**< Length of unique field */ 618 char *devname; /**< For /proc/interrupts */ 619 int if_version; /**< Highest interface version set */ 620 621 int blocked; /**< Blocked due to VC switch? */ 622 623 /** \name Locks */ 624 /*@{ */ 625 spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ 626 struct mutex struct_mutex; /**< For others */ 627 /*@} */ 628 629 /** \name Usage Counters */ 630 /*@{ */ 631 int open_count; /**< Outstanding files open */ 632 atomic_t ioctl_count; /**< Outstanding IOCTLs pending */ 633 atomic_t vma_count; /**< Outstanding vma areas open */ 634 int buf_use; /**< Buffers in use -- cannot alloc */ 635 atomic_t buf_alloc; /**< Buffer allocation in progress */ 636 /*@} */ 637 638 /** \name Performance counters */ 639 /*@{ */ 640 unsigned long counters; 641 drm_stat_type_t types[15]; 642 atomic_t counts[15]; 643 /*@} */ 644 645 /** \name Authentication */ 646 /*@{ */ 647 drm_file_t *file_first; /**< file list head */ 648 drm_file_t *file_last; /**< file list tail */ 649 drm_magic_head_t magiclist[DRM_HASH_SIZE]; /**< magic hash table */ 650 /*@} */ 651 652 /** \name Memory management */ 653 /*@{ */ 654 drm_map_list_t *maplist; /**< Linked list of regions */ 655 int map_count; /**< Number of mappable regions */ 656 657 /** \name Context handle management */ 658 /*@{ */ 659 drm_ctx_list_t *ctxlist; /**< Linked list of context handles */ 660 int ctx_count; /**< Number of context handles */ 661 struct mutex ctxlist_mutex; /**< For ctxlist */ 662 663 drm_map_t **context_sareas; /**< per-context SAREA's */ 664 int max_context; 665 666 drm_vma_entry_t *vmalist; /**< List of vmas (for debugging) */ 667 drm_lock_data_t lock; /**< Information on hardware lock */ 668 /*@} */ 669 670 /** \name DMA queues (contexts) */ 671 /*@{ */ 672 int queue_count; /**< Number of active DMA queues */ 673 int queue_reserved; /**< Number of reserved DMA queues */ 674 int queue_slots; /**< Actual length of queuelist */ 675 drm_queue_t **queuelist; /**< Vector of pointers to DMA queues */ 676 drm_device_dma_t *dma; /**< Optional pointer for DMA support */ 677 /*@} */ 678 679 /** \name Context support */ 680 /*@{ */ 681 int irq; /**< Interrupt used by board */ 682 int irq_enabled; /**< True if irq handler is enabled */ 683 __volatile__ long context_flag; /**< Context swapping flag */ 684 __volatile__ long interrupt_flag; /**< Interruption handler flag */ 685 __volatile__ long dma_flag; /**< DMA dispatch flag */ 686 struct timer_list timer; /**< Timer for delaying ctx switch */ 687 wait_queue_head_t context_wait; /**< Processes waiting on ctx switch */ 688 int last_checked; /**< Last context checked for DMA */ 689 int last_context; /**< Last current context */ 690 unsigned long last_switch; /**< jiffies at last context switch */ 691 /*@} */ 692 693 struct work_struct work; 694 /** \name VBLANK IRQ support */ 695 /*@{ */ 696 697 wait_queue_head_t vbl_queue; /**< VBLANK wait queue */ 698 atomic_t vbl_received; 699 spinlock_t vbl_lock; 700 drm_vbl_sig_t vbl_sigs; /**< signal list to send on VBLANK */ 701 unsigned int vbl_pending; 702 703 /*@} */ 704 cycles_t ctx_start; 705 cycles_t lck_start; 706 707 struct fasync_struct *buf_async;/**< Processes waiting for SIGIO */ 708 wait_queue_head_t buf_readers; /**< Processes waiting to read */ 709 wait_queue_head_t buf_writers; /**< Processes waiting to ctx switch */ 710 711 drm_agp_head_t *agp; /**< AGP data */ 712 713 struct pci_dev *pdev; /**< PCI device structure */ 714 int pci_domain; /**< PCI bus domain number */ 715 int pci_bus; /**< PCI bus number */ 716 int pci_slot; /**< PCI slot number */ 717 int pci_func; /**< PCI function number */ 718#ifdef __alpha__ 719 struct pci_controller *hose; 720#endif 721 drm_sg_mem_t *sg; /**< Scatter gather memory */ 722 unsigned long *ctx_bitmap; /**< context bitmap */ 723 void *dev_private; /**< device private data */ 724 drm_sigdata_t sigdata; /**< For block_all_signals */ 725 sigset_t sigmask; 726 727 struct drm_driver *driver; 728 drm_local_map_t *agp_buffer_map; 729 unsigned int agp_buffer_token; 730 drm_head_t primary; /**< primary screen head */ 731} drm_device_t; 732 733static __inline__ int drm_core_check_feature(struct drm_device *dev, 734 int feature) 735{ 736 return ((dev->driver->driver_features & feature) ? 1 : 0); 737} 738 739#if __OS_HAS_AGP 740static inline int drm_core_has_AGP(struct drm_device *dev) 741{ 742 return drm_core_check_feature(dev, DRIVER_USE_AGP); 743} 744#else 745#define drm_core_has_AGP(dev) (0) 746#endif 747 748#if __OS_HAS_MTRR 749static inline int drm_core_has_MTRR(struct drm_device *dev) 750{ 751 return drm_core_check_feature(dev, DRIVER_USE_MTRR); 752} 753 754#define DRM_MTRR_WC MTRR_TYPE_WRCOMB 755 756static inline int drm_mtrr_add(unsigned long offset, unsigned long size, 757 unsigned int flags) 758{ 759 return mtrr_add(offset, size, flags, 1); 760} 761 762static inline int drm_mtrr_del(int handle, unsigned long offset, 763 unsigned long size, unsigned int flags) 764{ 765 return mtrr_del(handle, offset, size); 766} 767 768#else 769#define drm_core_has_MTRR(dev) (0) 770 771#define DRM_MTRR_WC 0 772 773static inline int drm_mtrr_add(unsigned long offset, unsigned long size, 774 unsigned int flags) 775{ 776 return 0; 777} 778 779static inline int drm_mtrr_del(int handle, unsigned long offset, 780 unsigned long size, unsigned int flags) 781{ 782 return 0; 783} 784#endif 785 786/******************************************************************/ 787/** \name Internal function definitions */ 788/*@{*/ 789 790 /* Driver support (drm_drv.h) */ 791extern int drm_init(struct drm_driver *driver); 792extern void drm_exit(struct drm_driver *driver); 793extern int drm_ioctl(struct inode *inode, struct file *filp, 794 unsigned int cmd, unsigned long arg); 795extern long drm_compat_ioctl(struct file *filp, 796 unsigned int cmd, unsigned long arg); 797extern int drm_lastclose(drm_device_t *dev); 798 799 /* Device support (drm_fops.h) */ 800extern int drm_open(struct inode *inode, struct file *filp); 801extern int drm_stub_open(struct inode *inode, struct file *filp); 802extern int drm_fasync(int fd, struct file *filp, int on); 803extern int drm_release(struct inode *inode, struct file *filp); 804 805 /* Mapping support (drm_vm.h) */ 806extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); 807extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); 808 809 /* Memory management support (drm_memory.h) */ 810#include "drm_memory.h" 811extern void drm_mem_init(void); 812extern int drm_mem_info(char *buf, char **start, off_t offset, 813 int request, int *eof, void *data); 814extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area); 815extern void *drm_ioremap(unsigned long offset, unsigned long size, 816 drm_device_t * dev); 817extern void drm_ioremapfree(void *pt, unsigned long size, drm_device_t * dev); 818 819extern DRM_AGP_MEM *drm_alloc_agp(drm_device_t * dev, int pages, u32 type); 820extern int drm_free_agp(DRM_AGP_MEM * handle, int pages); 821extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); 822extern int drm_unbind_agp(DRM_AGP_MEM * handle); 823 824 /* Misc. IOCTL support (drm_ioctl.h) */ 825extern int drm_irq_by_busid(struct inode *inode, struct file *filp, 826 unsigned int cmd, unsigned long arg); 827extern int drm_getunique(struct inode *inode, struct file *filp, 828 unsigned int cmd, unsigned long arg); 829extern int drm_setunique(struct inode *inode, struct file *filp, 830 unsigned int cmd, unsigned long arg); 831extern int drm_getmap(struct inode *inode, struct file *filp, 832 unsigned int cmd, unsigned long arg); 833extern int drm_getclient(struct inode *inode, struct file *filp, 834 unsigned int cmd, unsigned long arg); 835extern int drm_getstats(struct inode *inode, struct file *filp, 836 unsigned int cmd, unsigned long arg); 837extern int drm_setversion(struct inode *inode, struct file *filp, 838 unsigned int cmd, unsigned long arg); 839extern int drm_noop(struct inode *inode, struct file *filp, 840 unsigned int cmd, unsigned long arg); 841 842 /* Context IOCTL support (drm_context.h) */ 843extern int drm_resctx(struct inode *inode, struct file *filp, 844 unsigned int cmd, unsigned long arg); 845extern int drm_addctx(struct inode *inode, struct file *filp, 846 unsigned int cmd, unsigned long arg); 847extern int drm_modctx(struct inode *inode, struct file *filp, 848 unsigned int cmd, unsigned long arg); 849extern int drm_getctx(struct inode *inode, struct file *filp, 850 unsigned int cmd, unsigned long arg); 851extern int drm_switchctx(struct inode *inode, struct file *filp, 852 unsigned int cmd, unsigned long arg); 853extern int drm_newctx(struct inode *inode, struct file *filp, 854 unsigned int cmd, unsigned long arg); 855extern int drm_rmctx(struct inode *inode, struct file *filp, 856 unsigned int cmd, unsigned long arg); 857 858extern int drm_ctxbitmap_init(drm_device_t * dev); 859extern void drm_ctxbitmap_cleanup(drm_device_t * dev); 860extern void drm_ctxbitmap_free(drm_device_t * dev, int ctx_handle); 861 862extern int drm_setsareactx(struct inode *inode, struct file *filp, 863 unsigned int cmd, unsigned long arg); 864extern int drm_getsareactx(struct inode *inode, struct file *filp, 865 unsigned int cmd, unsigned long arg); 866 867 /* Drawable IOCTL support (drm_drawable.h) */ 868extern int drm_adddraw(struct inode *inode, struct file *filp, 869 unsigned int cmd, unsigned long arg); 870extern int drm_rmdraw(struct inode *inode, struct file *filp, 871 unsigned int cmd, unsigned long arg); 872 873 /* Authentication IOCTL support (drm_auth.h) */ 874extern int drm_getmagic(struct inode *inode, struct file *filp, 875 unsigned int cmd, unsigned long arg); 876extern int drm_authmagic(struct inode *inode, struct file *filp, 877 unsigned int cmd, unsigned long arg); 878 879 /* Locking IOCTL support (drm_lock.h) */ 880extern int drm_lock(struct inode *inode, struct file *filp, 881 unsigned int cmd, unsigned long arg); 882extern int drm_unlock(struct inode *inode, struct file *filp, 883 unsigned int cmd, unsigned long arg); 884extern int drm_lock_take(__volatile__ unsigned int *lock, unsigned int context); 885extern int drm_lock_free(drm_device_t * dev, 886 __volatile__ unsigned int *lock, unsigned int context); 887 888 /* Buffer management support (drm_bufs.h) */ 889extern int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request); 890extern int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request); 891extern int drm_addmap(drm_device_t * dev, unsigned int offset, 892 unsigned int size, drm_map_type_t type, 893 drm_map_flags_t flags, drm_local_map_t ** map_ptr); 894extern int drm_addmap_ioctl(struct inode *inode, struct file *filp, 895 unsigned int cmd, unsigned long arg); 896extern int drm_rmmap(drm_device_t * dev, drm_local_map_t * map); 897extern int drm_rmmap_locked(drm_device_t * dev, drm_local_map_t * map); 898extern int drm_rmmap_ioctl(struct inode *inode, struct file *filp, 899 unsigned int cmd, unsigned long arg); 900 901extern int drm_order(unsigned long size); 902extern int drm_addbufs(struct inode *inode, struct file *filp, 903 unsigned int cmd, unsigned long arg); 904extern int drm_infobufs(struct inode *inode, struct file *filp, 905 unsigned int cmd, unsigned long arg); 906extern int drm_markbufs(struct inode *inode, struct file *filp, 907 unsigned int cmd, unsigned long arg); 908extern int drm_freebufs(struct inode *inode, struct file *filp, 909 unsigned int cmd, unsigned long arg); 910extern int drm_mapbufs(struct inode *inode, struct file *filp, 911 unsigned int cmd, unsigned long arg); 912extern unsigned long drm_get_resource_start(drm_device_t * dev, 913 unsigned int resource); 914extern unsigned long drm_get_resource_len(drm_device_t * dev, 915 unsigned int resource); 916 917 /* DMA support (drm_dma.h) */ 918extern int drm_dma_setup(drm_device_t * dev); 919extern void drm_dma_takedown(drm_device_t * dev); 920extern void drm_free_buffer(drm_device_t * dev, drm_buf_t * buf); 921extern void drm_core_reclaim_buffers(drm_device_t * dev, struct file *filp); 922 923 /* IRQ support (drm_irq.h) */ 924extern int drm_control(struct inode *inode, struct file *filp, 925 unsigned int cmd, unsigned long arg); 926extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS); 927extern int drm_irq_uninstall(drm_device_t * dev); 928extern void drm_driver_irq_preinstall(drm_device_t * dev); 929extern void drm_driver_irq_postinstall(drm_device_t * dev); 930extern void drm_driver_irq_uninstall(drm_device_t * dev); 931 932extern int drm_wait_vblank(struct inode *inode, struct file *filp, 933 unsigned int cmd, unsigned long arg); 934extern int drm_vblank_wait(drm_device_t * dev, unsigned int *vbl_seq); 935extern void drm_vbl_send_signals(drm_device_t * dev); 936 937 /* AGP/GART support (drm_agpsupport.h) */ 938extern drm_agp_head_t *drm_agp_init(drm_device_t * dev); 939extern int drm_agp_acquire(drm_device_t * dev); 940extern int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, 941 unsigned int cmd, unsigned long arg); 942extern int drm_agp_release(drm_device_t * dev); 943extern int drm_agp_release_ioctl(struct inode *inode, struct file *filp, 944 unsigned int cmd, unsigned long arg); 945extern int drm_agp_enable(drm_device_t * dev, drm_agp_mode_t mode); 946extern int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, 947 unsigned int cmd, unsigned long arg); 948extern int drm_agp_info(drm_device_t * dev, drm_agp_info_t * info); 949extern int drm_agp_info_ioctl(struct inode *inode, struct file *filp, 950 unsigned int cmd, unsigned long arg); 951extern int drm_agp_alloc(drm_device_t *dev, drm_agp_buffer_t *request); 952extern int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp, 953 unsigned int cmd, unsigned long arg); 954extern int drm_agp_free(drm_device_t *dev, drm_agp_buffer_t *request); 955extern int drm_agp_free_ioctl(struct inode *inode, struct file *filp, 956 unsigned int cmd, unsigned long arg); 957extern int drm_agp_unbind(drm_device_t *dev, drm_agp_binding_t *request); 958extern int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp, 959 unsigned int cmd, unsigned long arg); 960extern int drm_agp_bind(drm_device_t *dev, drm_agp_binding_t *request); 961extern int drm_agp_bind_ioctl(struct inode *inode, struct file *filp, 962 unsigned int cmd, unsigned long arg); 963extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, 964 size_t pages, u32 type); 965extern int drm_agp_free_memory(DRM_AGP_MEM * handle); 966extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start); 967extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); 968 969 /* Stub support (drm_stub.h) */ 970extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent, 971 struct drm_driver *driver); 972extern int drm_put_dev(drm_device_t * dev); 973extern int drm_put_head(drm_head_t * head); 974extern unsigned int drm_debug; 975extern unsigned int drm_cards_limit; 976extern drm_head_t **drm_heads; 977extern struct class *drm_class; 978extern struct proc_dir_entry *drm_proc_root; 979 980 /* Proc support (drm_proc.h) */ 981extern int drm_proc_init(drm_device_t * dev, 982 int minor, 983 struct proc_dir_entry *root, 984 struct proc_dir_entry **dev_root); 985extern int drm_proc_cleanup(int minor, 986 struct proc_dir_entry *root, 987 struct proc_dir_entry *dev_root); 988 989 /* Scatter Gather Support (drm_scatter.h) */ 990extern void drm_sg_cleanup(drm_sg_mem_t * entry); 991extern int drm_sg_alloc(struct inode *inode, struct file *filp, 992 unsigned int cmd, unsigned long arg); 993extern int drm_sg_free(struct inode *inode, struct file *filp, 994 unsigned int cmd, unsigned long arg); 995 996 /* ATI PCIGART support (ati_pcigart.h) */ 997extern int drm_ati_pcigart_init(drm_device_t * dev, 998 drm_ati_pcigart_info * gart_info); 999extern int drm_ati_pcigart_cleanup(drm_device_t * dev, 1000 drm_ati_pcigart_info * gart_info); 1001 1002extern drm_dma_handle_t *drm_pci_alloc(drm_device_t * dev, size_t size, 1003 size_t align, dma_addr_t maxaddr); 1004extern void __drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah); 1005extern void drm_pci_free(drm_device_t * dev, drm_dma_handle_t * dmah); 1006 1007 /* sysfs support (drm_sysfs.c) */ 1008extern struct class *drm_sysfs_create(struct module *owner, char *name); 1009extern void drm_sysfs_destroy(struct class *cs); 1010extern struct class_device *drm_sysfs_device_add(struct class *cs, 1011 drm_head_t *head); 1012extern void drm_sysfs_device_remove(struct class_device *class_dev); 1013 1014/* Inline replacements for DRM_IOREMAP macros */ 1015static __inline__ void drm_core_ioremap(struct drm_map *map, 1016 struct drm_device *dev) 1017{ 1018 map->handle = drm_ioremap(map->offset, map->size, dev); 1019} 1020 1021#if 0 1022static __inline__ void drm_core_ioremap_nocache(struct drm_map *map, 1023 struct drm_device *dev) 1024{ 1025 map->handle = drm_ioremap_nocache(map->offset, map->size, dev); 1026} 1027#endif /* 0 */ 1028 1029static __inline__ void drm_core_ioremapfree(struct drm_map *map, 1030 struct drm_device *dev) 1031{ 1032 if (map->handle && map->size) 1033 drm_ioremapfree(map->handle, map->size, dev); 1034} 1035 1036static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev, 1037 unsigned int token) 1038{ 1039 drm_map_list_t *_entry; 1040 list_for_each_entry(_entry, &dev->maplist->head, head) 1041 if (_entry->user_token == token) 1042 return _entry->map; 1043 return NULL; 1044} 1045 1046static __inline__ int drm_device_is_agp(drm_device_t * dev) 1047{ 1048 if (dev->driver->device_is_agp != NULL) { 1049 int err = (*dev->driver->device_is_agp) (dev); 1050 1051 if (err != 2) { 1052 return err; 1053 } 1054 } 1055 1056 return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP); 1057} 1058 1059static __inline__ int drm_device_is_pcie(drm_device_t * dev) 1060{ 1061 return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP); 1062} 1063 1064static __inline__ void drm_core_dropmap(struct drm_map *map) 1065{ 1066} 1067 1068#ifndef DEBUG_MEMORY 1069/** Wrapper around kmalloc() */ 1070static __inline__ void *drm_alloc(size_t size, int area) 1071{ 1072 return kmalloc(size, GFP_KERNEL); 1073} 1074 1075/** Wrapper around kfree() */ 1076static __inline__ void drm_free(void *pt, size_t size, int area) 1077{ 1078 kfree(pt); 1079} 1080 1081/** Wrapper around kcalloc() */ 1082static __inline__ void *drm_calloc(size_t nmemb, size_t size, int area) 1083{ 1084 return kcalloc(nmemb, size, GFP_KERNEL); 1085} 1086#else 1087extern void *drm_alloc(size_t size, int area); 1088extern void drm_free(void *pt, size_t size, int area); 1089extern void *drm_calloc(size_t nmemb, size_t size, int area); 1090#endif 1091 1092/*@}*/ 1093 1094extern unsigned long drm_core_get_map_ofs(drm_map_t * map); 1095extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); 1096 1097#ifndef pci_pretty_name 1098#define pci_pretty_name(dev) "" 1099#endif 1100 1101#endif /* __KERNEL__ */ 1102#endif