]> err.no Git - linux-2.6/commitdiff
Merge branch 'drm-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
authorLinus Torvalds <torvalds@woody.osdl.org>
Sat, 9 Dec 2006 20:26:37 +0000 (12:26 -0800)
committerLinus Torvalds <torvalds@woody.osdl.org>
Sat, 9 Dec 2006 20:26:37 +0000 (12:26 -0800)
* 'drm-patches' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (21 commits)
  Fix http://bugzilla.kernel.org/show_bug.cgi?id=7606
  drm: add flag for mapping PCI DMA buffers read-only.
  drm: fix up irqflags in drm_lock.c
  drm: i915 updates
  drm: i915: fix up irqflags arg
  drm: i915: Only return EBUSY after we've established we need to schedule a new swap.
  drm: i915: Fix 'sequence has passed' condition in i915_vblank_swap().
  drm: i915: Add SAREA fileds for determining which pipe to sync window buffer swaps to.
  drm: Make handling of dev_priv->vblank_pipe more robust.
  drm: DRM_I915_VBLANK_SWAP ioctl: Take drm_vblank_seq_type_t instead
  drm: i915: Add ioctl for scheduling buffer swaps at vertical blanks.
  drm: Core vsync: Don't clobber target sequence number when scheduling signal.
  drm: Core vsync: Add flag DRM_VBLANK_NEXTONMISS.
  drm: Make locked tasklet handling more robust.
  drm: drm_rmdraw: Declare id and idx as signed so testing for < 0 works as intended.
  drm: Change first valid DRM drawable ID to be 1 instead of 0.
  drm: drawable locking + memory management fixes + copyright
  drm: Add support for interrupt triggered driver callback with lock held to DRM core.
  drm: Add support for tracking drawable information to core
  drm: add support for secondary vertical blank interrupt to i915
  ...

1  2 
drivers/char/drm/drm_vm.c

index ae2691942ddb16b2ffdd3a5f4703a7ddb95b694f,74686e9a2d342d84cc5110ef08a5f1c245606bf5..b9cfc077f6bc845633328aef6965b292fe83871f
@@@ -147,14 -147,14 +147,14 @@@ static __inline__ struct page *drm_do_v
        if (address > vma->vm_end)
                return NOPAGE_SIGBUS;   /* Disallow mremap */
        if (!map)
 -              return NOPAGE_OOM;      /* Nothing allocated */
 +              return NOPAGE_SIGBUS;   /* Nothing allocated */
  
        offset = address - vma->vm_start;
        i = (unsigned long)map->handle + offset;
        page = (map->type == _DRM_CONSISTENT) ?
                virt_to_page((void *)i) : vmalloc_to_page((void *)i);
        if (!page)
 -              return NOPAGE_OOM;
 +              return NOPAGE_SIGBUS;
        get_page(page);
  
        DRM_DEBUG("shm_nopage 0x%lx\n", address);
@@@ -272,7 -272,7 +272,7 @@@ static __inline__ struct page *drm_do_v
        if (address > vma->vm_end)
                return NOPAGE_SIGBUS;   /* Disallow mremap */
        if (!dma->pagelist)
 -              return NOPAGE_OOM;      /* Nothing allocated */
 +              return NOPAGE_SIGBUS;   /* Nothing allocated */
  
        offset = address - vma->vm_start;       /* vm_[pg]off[set] should be 0 */
        page_nr = offset >> PAGE_SHIFT;
@@@ -310,7 -310,7 +310,7 @@@ static __inline__ struct page *drm_do_v
        if (address > vma->vm_end)
                return NOPAGE_SIGBUS;   /* Disallow mremap */
        if (!entry->pagelist)
 -              return NOPAGE_OOM;      /* Nothing allocated */
 +              return NOPAGE_SIGBUS;   /* Nothing allocated */
  
        offset = address - vma->vm_start;
        map_offset = map->offset - (unsigned long)dev->sg->virtual;
@@@ -473,6 -473,22 +473,22 @@@ static int drm_mmap_dma(struct file *fi
        }
        unlock_kernel();
  
+       if (!capable(CAP_SYS_ADMIN) &&
+           (dma->flags & _DRM_DMA_USE_PCI_RO)) {
+               vma->vm_flags &= ~(VM_WRITE | VM_MAYWRITE);
+ #if defined(__i386__) || defined(__x86_64__)
+               pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW;
+ #else
+               /* Ye gads this is ugly.  With more thought
+                  we could move this up higher and use
+                  `protection_map' instead.  */
+               vma->vm_page_prot =
+                   __pgprot(pte_val
+                            (pte_wrprotect
+                             (__pte(pgprot_val(vma->vm_page_prot)))));
+ #endif
+       }
        vma->vm_ops = &drm_vm_dma_ops;
  
        vma->vm_flags |= VM_RESERVED;   /* Don't swap */