diff options
Diffstat (limited to 'drivers/char/drm/drmP.h')
-rw-r--r-- | drivers/char/drm/drmP.h | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h index d2a56182bc35..7690a59ace04 100644 --- a/drivers/char/drm/drmP.h +++ b/drivers/char/drm/drmP.h | |||
@@ -79,6 +79,7 @@ | |||
79 | #define __OS_HAS_MTRR (defined(CONFIG_MTRR)) | 79 | #define __OS_HAS_MTRR (defined(CONFIG_MTRR)) |
80 | 80 | ||
81 | #include "drm_os_linux.h" | 81 | #include "drm_os_linux.h" |
82 | #include "drm_hashtab.h" | ||
82 | 83 | ||
83 | /***********************************************************************/ | 84 | /***********************************************************************/ |
84 | /** \name DRM template customization defaults */ | 85 | /** \name DRM template customization defaults */ |
@@ -104,7 +105,7 @@ | |||
104 | #define DRM_DEBUG_CODE 2 /**< Include debugging code if > 1, then | 105 | #define DRM_DEBUG_CODE 2 /**< Include debugging code if > 1, then |
105 | also include looping detection. */ | 106 | also include looping detection. */ |
106 | 107 | ||
107 | #define DRM_HASH_SIZE 16 /**< Size of key hash table. Must be power of 2. */ | 108 | #define DRM_MAGIC_HASH_ORDER 4 /**< Size of key hash table. Must be power of 2. */ |
108 | #define DRM_KERNEL_CONTEXT 0 /**< Change drm_resctx if changed */ | 109 | #define DRM_KERNEL_CONTEXT 0 /**< Change drm_resctx if changed */ |
109 | #define DRM_RESERVED_CONTEXTS 1 /**< Change drm_resctx if changed */ | 110 | #define DRM_RESERVED_CONTEXTS 1 /**< Change drm_resctx if changed */ |
110 | #define DRM_LOOPING_LIMIT 5000000 | 111 | #define DRM_LOOPING_LIMIT 5000000 |
@@ -134,19 +135,12 @@ | |||
134 | #define DRM_MEM_CTXBITMAP 18 | 135 | #define DRM_MEM_CTXBITMAP 18 |
135 | #define DRM_MEM_STUB 19 | 136 | #define DRM_MEM_STUB 19 |
136 | #define DRM_MEM_SGLISTS 20 | 137 | #define DRM_MEM_SGLISTS 20 |
137 | #define DRM_MEM_CTXLIST 21 | 138 | #define DRM_MEM_CTXLIST 21 |
139 | #define DRM_MEM_MM 22 | ||
140 | #define DRM_MEM_HASHTAB 23 | ||
138 | 141 | ||
139 | #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) | 142 | #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8) |
140 | 143 | #define DRM_MAP_HASH_OFFSET 0x10000000 | |
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 | 144 | ||
151 | /*@}*/ | 145 | /*@}*/ |
152 | 146 | ||
@@ -211,8 +205,6 @@ | |||
211 | /*@{*/ | 205 | /*@{*/ |
212 | 206 | ||
213 | #define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x) | 207 | #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 | 208 | ||
217 | #define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1)) | 209 | #define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1)) |
218 | #define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x)) | 210 | #define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x)) |
@@ -286,7 +278,8 @@ typedef struct drm_devstate { | |||
286 | } drm_devstate_t; | 278 | } drm_devstate_t; |
287 | 279 | ||
288 | typedef struct drm_magic_entry { | 280 | typedef struct drm_magic_entry { |
289 | drm_magic_t magic; | 281 | drm_hash_item_t hash_item; |
282 | struct list_head head; | ||
290 | struct drm_file *priv; | 283 | struct drm_file *priv; |
291 | struct drm_magic_entry *next; | 284 | struct drm_magic_entry *next; |
292 | } drm_magic_entry_t; | 285 | } drm_magic_entry_t; |
@@ -493,6 +486,7 @@ typedef struct drm_sigdata { | |||
493 | */ | 486 | */ |
494 | typedef struct drm_map_list { | 487 | typedef struct drm_map_list { |
495 | struct list_head head; /**< list head */ | 488 | struct list_head head; /**< list head */ |
489 | drm_hash_item_t hash; | ||
496 | drm_map_t *map; /**< mapping */ | 490 | drm_map_t *map; /**< mapping */ |
497 | unsigned int user_token; | 491 | unsigned int user_token; |
498 | } drm_map_list_t; | 492 | } drm_map_list_t; |
@@ -527,6 +521,22 @@ typedef struct ati_pcigart_info { | |||
527 | drm_local_map_t mapping; | 521 | drm_local_map_t mapping; |
528 | } drm_ati_pcigart_info; | 522 | } drm_ati_pcigart_info; |
529 | 523 | ||
524 | /* | ||
525 | * Generic memory manager structs | ||
526 | */ | ||
527 | typedef struct drm_mm_node { | ||
528 | struct list_head fl_entry; | ||
529 | struct list_head ml_entry; | ||
530 | int free; | ||
531 | unsigned long start; | ||
532 | unsigned long size; | ||
533 | void *private; | ||
534 | } drm_mm_node_t; | ||
535 | |||
536 | typedef struct drm_mm { | ||
537 | drm_mm_node_t root_node; | ||
538 | } drm_mm_t; | ||
539 | |||
530 | /** | 540 | /** |
531 | * DRM driver structure. This structure represent the common code for | 541 | * DRM driver structure. This structure represent the common code for |
532 | * a family of cards. There will one drm_device for each card present | 542 | * a family of cards. There will one drm_device for each card present |
@@ -646,13 +656,15 @@ typedef struct drm_device { | |||
646 | /*@{ */ | 656 | /*@{ */ |
647 | drm_file_t *file_first; /**< file list head */ | 657 | drm_file_t *file_first; /**< file list head */ |
648 | drm_file_t *file_last; /**< file list tail */ | 658 | drm_file_t *file_last; /**< file list tail */ |
649 | drm_magic_head_t magiclist[DRM_HASH_SIZE]; /**< magic hash table */ | 659 | drm_open_hash_t magiclist; /**< magic hash table */ |
660 | struct list_head magicfree; | ||
650 | /*@} */ | 661 | /*@} */ |
651 | 662 | ||
652 | /** \name Memory management */ | 663 | /** \name Memory management */ |
653 | /*@{ */ | 664 | /*@{ */ |
654 | drm_map_list_t *maplist; /**< Linked list of regions */ | 665 | drm_map_list_t *maplist; /**< Linked list of regions */ |
655 | int map_count; /**< Number of mappable regions */ | 666 | int map_count; /**< Number of mappable regions */ |
667 | drm_open_hash_t map_hash; /**< User token hash table for maps */ | ||
656 | 668 | ||
657 | /** \name Context handle management */ | 669 | /** \name Context handle management */ |
658 | /*@{ */ | 670 | /*@{ */ |
@@ -711,10 +723,8 @@ typedef struct drm_device { | |||
711 | drm_agp_head_t *agp; /**< AGP data */ | 723 | drm_agp_head_t *agp; /**< AGP data */ |
712 | 724 | ||
713 | struct pci_dev *pdev; /**< PCI device structure */ | 725 | struct pci_dev *pdev; /**< PCI device structure */ |
714 | int pci_domain; /**< PCI bus domain number */ | 726 | int pci_vendor; /**< PCI vendor id */ |
715 | int pci_bus; /**< PCI bus number */ | 727 | int pci_device; /**< PCI device id */ |
716 | int pci_slot; /**< PCI slot number */ | ||
717 | int pci_func; /**< PCI function number */ | ||
718 | #ifdef __alpha__ | 728 | #ifdef __alpha__ |
719 | struct pci_controller *hose; | 729 | struct pci_controller *hose; |
720 | #endif | 730 | #endif |
@@ -736,6 +746,12 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev, | |||
736 | return ((dev->driver->driver_features & feature) ? 1 : 0); | 746 | return ((dev->driver->driver_features & feature) ? 1 : 0); |
737 | } | 747 | } |
738 | 748 | ||
749 | #ifdef __alpha__ | ||
750 | #define drm_get_pci_domain(dev) dev->hose->bus->number | ||
751 | #else | ||
752 | #define drm_get_pci_domain(dev) 0 | ||
753 | #endif | ||
754 | |||
739 | #if __OS_HAS_AGP | 755 | #if __OS_HAS_AGP |
740 | static inline int drm_core_has_AGP(struct drm_device *dev) | 756 | static inline int drm_core_has_AGP(struct drm_device *dev) |
741 | { | 757 | { |
@@ -1011,6 +1027,18 @@ extern struct class_device *drm_sysfs_device_add(struct class *cs, | |||
1011 | drm_head_t *head); | 1027 | drm_head_t *head); |
1012 | extern void drm_sysfs_device_remove(struct class_device *class_dev); | 1028 | extern void drm_sysfs_device_remove(struct class_device *class_dev); |
1013 | 1029 | ||
1030 | /* | ||
1031 | * Basic memory manager support (drm_mm.c) | ||
1032 | */ | ||
1033 | extern drm_mm_node_t *drm_mm_get_block(drm_mm_node_t * parent, | ||
1034 | unsigned long size, | ||
1035 | unsigned alignment); | ||
1036 | extern void drm_mm_put_block(drm_mm_t *mm, drm_mm_node_t *cur); | ||
1037 | extern drm_mm_node_t *drm_mm_search_free(const drm_mm_t *mm, unsigned long size, | ||
1038 | unsigned alignment, int best_match); | ||
1039 | extern int drm_mm_init(drm_mm_t *mm, unsigned long start, unsigned long size); | ||
1040 | extern void drm_mm_takedown(drm_mm_t *mm); | ||
1041 | |||
1014 | /* Inline replacements for DRM_IOREMAP macros */ | 1042 | /* Inline replacements for DRM_IOREMAP macros */ |
1015 | static __inline__ void drm_core_ioremap(struct drm_map *map, | 1043 | static __inline__ void drm_core_ioremap(struct drm_map *map, |
1016 | struct drm_device *dev) | 1044 | struct drm_device *dev) |