diff options
author | Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> | 2007-02-08 00:14:05 -0500 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2007-02-08 00:14:05 -0500 |
commit | 1545085a28f226b59c243f88b82ea25393b0d63f (patch) | |
tree | cb6c1f8827281b8ad41f2f22e8365769aafe25cb /drivers | |
parent | 756db73df7b7d6b9f6421c1fb2e1cabeaede5846 (diff) |
drm: Allow for 44 bit user-tokens (or drm_file offsets)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/drm/drm_bufs.c | 9 | ||||
-rw-r--r-- | drivers/char/drm/drm_proc.c | 4 | ||||
-rw-r--r-- | drivers/char/drm/drm_vm.c | 14 |
3 files changed, 14 insertions, 13 deletions
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c index d917c8cb8a36..a6828cc14e58 100644 --- a/drivers/char/drm/drm_bufs.c +++ b/drivers/char/drm/drm_bufs.c | |||
@@ -79,14 +79,14 @@ static int drm_map_handle(drm_device_t *dev, drm_hash_item_t *hash, | |||
79 | 79 | ||
80 | if (!use_hashed_handle) { | 80 | if (!use_hashed_handle) { |
81 | int ret; | 81 | int ret; |
82 | hash->key = user_token; | 82 | hash->key = user_token >> PAGE_SHIFT; |
83 | ret = drm_ht_insert_item(&dev->map_hash, hash); | 83 | ret = drm_ht_insert_item(&dev->map_hash, hash); |
84 | if (ret != -EINVAL) | 84 | if (ret != -EINVAL) |
85 | return ret; | 85 | return ret; |
86 | } | 86 | } |
87 | return drm_ht_just_insert_please(&dev->map_hash, hash, | 87 | return drm_ht_just_insert_please(&dev->map_hash, hash, |
88 | user_token, 32 - PAGE_SHIFT - 3, | 88 | user_token, 32 - PAGE_SHIFT - 3, |
89 | PAGE_SHIFT, DRM_MAP_HASH_OFFSET); | 89 | 0, DRM_MAP_HASH_OFFSET >> PAGE_SHIFT); |
90 | } | 90 | } |
91 | 91 | ||
92 | /** | 92 | /** |
@@ -262,7 +262,7 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset, | |||
262 | return ret; | 262 | return ret; |
263 | } | 263 | } |
264 | 264 | ||
265 | list->user_token = list->hash.key; | 265 | list->user_token = list->hash.key << PAGE_SHIFT; |
266 | mutex_unlock(&dev->struct_mutex); | 266 | mutex_unlock(&dev->struct_mutex); |
267 | 267 | ||
268 | *maplist = list; | 268 | *maplist = list; |
@@ -347,7 +347,8 @@ int drm_rmmap_locked(drm_device_t *dev, drm_local_map_t *map) | |||
347 | 347 | ||
348 | if (r_list->map == map) { | 348 | if (r_list->map == map) { |
349 | list_del(list); | 349 | list_del(list); |
350 | drm_ht_remove_key(&dev->map_hash, r_list->user_token); | 350 | drm_ht_remove_key(&dev->map_hash, |
351 | r_list->user_token >> PAGE_SHIFT); | ||
351 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); | 352 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); |
352 | break; | 353 | break; |
353 | } | 354 | } |
diff --git a/drivers/char/drm/drm_proc.c b/drivers/char/drm/drm_proc.c index 62d5fe15f046..7fd0da712142 100644 --- a/drivers/char/drm/drm_proc.c +++ b/drivers/char/drm/drm_proc.c | |||
@@ -500,7 +500,7 @@ static int drm__vma_info(char *buf, char **start, off_t offset, int request, | |||
500 | for (pt = dev->vmalist; pt; pt = pt->next) { | 500 | for (pt = dev->vmalist; pt; pt = pt->next) { |
501 | if (!(vma = pt->vma)) | 501 | if (!(vma = pt->vma)) |
502 | continue; | 502 | continue; |
503 | DRM_PROC_PRINT("\n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx", | 503 | DRM_PROC_PRINT("\n%5d 0x%08lx-0x%08lx %c%c%c%c%c%c 0x%08lx000", |
504 | pt->pid, | 504 | pt->pid, |
505 | vma->vm_start, | 505 | vma->vm_start, |
506 | vma->vm_end, | 506 | vma->vm_end, |
@@ -510,7 +510,7 @@ static int drm__vma_info(char *buf, char **start, off_t offset, int request, | |||
510 | vma->vm_flags & VM_MAYSHARE ? 's' : 'p', | 510 | vma->vm_flags & VM_MAYSHARE ? 's' : 'p', |
511 | vma->vm_flags & VM_LOCKED ? 'l' : '-', | 511 | vma->vm_flags & VM_LOCKED ? 'l' : '-', |
512 | vma->vm_flags & VM_IO ? 'i' : '-', | 512 | vma->vm_flags & VM_IO ? 'i' : '-', |
513 | vma->vm_pgoff << PAGE_SHIFT); | 513 | vma->vm_pgoff); |
514 | 514 | ||
515 | #if defined(__i386__) | 515 | #if defined(__i386__) |
516 | pgprot = pgprot_val(vma->vm_page_prot); | 516 | pgprot = pgprot_val(vma->vm_page_prot); |
diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c index 4e480583a27f..54a632848955 100644 --- a/drivers/char/drm/drm_vm.c +++ b/drivers/char/drm/drm_vm.c | |||
@@ -70,7 +70,7 @@ static __inline__ struct page *drm_do_vm_nopage(struct vm_area_struct *vma, | |||
70 | if (!dev->agp || !dev->agp->cant_use_aperture) | 70 | if (!dev->agp || !dev->agp->cant_use_aperture) |
71 | goto vm_nopage_error; | 71 | goto vm_nopage_error; |
72 | 72 | ||
73 | if (drm_ht_find_item(&dev->map_hash, vma->vm_pgoff << PAGE_SHIFT, &hash)) | 73 | if (drm_ht_find_item(&dev->map_hash, vma->vm_pgoff, &hash)) |
74 | goto vm_nopage_error; | 74 | goto vm_nopage_error; |
75 | 75 | ||
76 | r_list = drm_hash_entry(hash, drm_map_list_t, hash); | 76 | r_list = drm_hash_entry(hash, drm_map_list_t, hash); |
@@ -463,8 +463,8 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma) | |||
463 | lock_kernel(); | 463 | lock_kernel(); |
464 | dev = priv->head->dev; | 464 | dev = priv->head->dev; |
465 | dma = dev->dma; | 465 | dma = dev->dma; |
466 | DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n", | 466 | DRM_DEBUG("start = 0x%lx, end = 0x%lx, page offset = 0x%lx\n", |
467 | vma->vm_start, vma->vm_end, vma->vm_pgoff << PAGE_SHIFT); | 467 | vma->vm_start, vma->vm_end, vma->vm_pgoff); |
468 | 468 | ||
469 | /* Length must match exact page count */ | 469 | /* Length must match exact page count */ |
470 | if (!dma || (length >> PAGE_SHIFT) != dma->page_count) { | 470 | if (!dma || (length >> PAGE_SHIFT) != dma->page_count) { |
@@ -537,8 +537,8 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
537 | unsigned long offset = 0; | 537 | unsigned long offset = 0; |
538 | drm_hash_item_t *hash; | 538 | drm_hash_item_t *hash; |
539 | 539 | ||
540 | DRM_DEBUG("start = 0x%lx, end = 0x%lx, offset = 0x%lx\n", | 540 | DRM_DEBUG("start = 0x%lx, end = 0x%lx, page offset = 0x%lx\n", |
541 | vma->vm_start, vma->vm_end, vma->vm_pgoff << PAGE_SHIFT); | 541 | vma->vm_start, vma->vm_end, vma->vm_pgoff); |
542 | 542 | ||
543 | if (!priv->authenticated) | 543 | if (!priv->authenticated) |
544 | return -EACCES; | 544 | return -EACCES; |
@@ -547,7 +547,7 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
547 | * the AGP mapped at physical address 0 | 547 | * the AGP mapped at physical address 0 |
548 | * --BenH. | 548 | * --BenH. |
549 | */ | 549 | */ |
550 | if (!(vma->vm_pgoff << PAGE_SHIFT) | 550 | if (!vma->vm_pgoff |
551 | #if __OS_HAS_AGP | 551 | #if __OS_HAS_AGP |
552 | && (!dev->agp | 552 | && (!dev->agp |
553 | || dev->agp->agp_info.device->vendor != PCI_VENDOR_ID_APPLE) | 553 | || dev->agp->agp_info.device->vendor != PCI_VENDOR_ID_APPLE) |
@@ -555,7 +555,7 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma) | |||
555 | ) | 555 | ) |
556 | return drm_mmap_dma(filp, vma); | 556 | return drm_mmap_dma(filp, vma); |
557 | 557 | ||
558 | if (drm_ht_find_item(&dev->map_hash, vma->vm_pgoff << PAGE_SHIFT, &hash)) { | 558 | if (drm_ht_find_item(&dev->map_hash, vma->vm_pgoff, &hash)) { |
559 | DRM_ERROR("Could not find map\n"); | 559 | DRM_ERROR("Could not find map\n"); |
560 | return -EINVAL; | 560 | return -EINVAL; |
561 | } | 561 | } |