Simplify pci map vs no pci map choice.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 6 Feb 2007 15:59:45 +0000 (16:59 +0100)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Tue, 6 Feb 2007 15:59:45 +0000 (16:59 +0100)
linux-core/drmP.h
linux-core/drm_agpsupport.c
linux-core/drm_bo.c
linux-core/drm_compat.c
linux-core/drm_ttm.h
linux-core/drm_vm.c
linux-core/i915_buffer.c

index a8f5e3e..62efddd 100644 (file)
@@ -655,6 +655,7 @@ typedef struct drm_ref_object {
 #define _DRM_FLAG_MEMTYPE_CACHED    0x00000004   /* Supports cached binding */
 #define _DRM_FLAG_NEEDS_IOREMAP     0x00000008   /* Fixed memory needs ioremap
                                                    before kernel access. */
+#define _DRM_FLAG_MEMTYPE_CMA       0x00000010   /* Can't map aperture */
 
 typedef struct drm_mem_type_manager {
        int has_type;
@@ -1037,9 +1038,9 @@ typedef struct drm_buffer_object{
 
        /* For vm */
 
+        drm_ttm_t *ttm;
         drm_map_list_t map_list;
        uint32_t memory_type;
-       drm_ttm_t *ttm;
        unsigned long bus_offset;
        uint32_t vm_flags;
         void *iomap;
@@ -1491,10 +1492,14 @@ extern int drm_bo_ioctl(DRM_IOCTL_ARGS);
 extern int drm_mm_init_ioctl(DRM_IOCTL_ARGS);
 extern int drm_bo_driver_finish(drm_device_t *dev);
 extern int drm_bo_driver_init(drm_device_t *dev);
-extern int drm_bo_pci_offset(const drm_buffer_object_t *bo,
+extern int drm_bo_pci_offset(drm_device_t *dev,
+                            drm_bo_mem_reg_t *mem,
                             unsigned long *bus_base,
                             unsigned long *bus_offset,
                             unsigned long *bus_size);
+extern int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem);
+
+
 extern void drm_bo_usage_deref_locked(drm_buffer_object_t * bo);
 extern int drm_fence_buffer_objects(drm_file_t * priv,
                                    struct list_head *list, 
index 177180f..e28ff0c 100644 (file)
@@ -710,7 +710,6 @@ drm_ttm_backend_t *drm_agp_init_ttm(struct drm_device *dev,
        agp_priv->uncached_type = AGP_USER_MEMORY;
        agp_priv->bridge = dev->agp->bridge;
        agp_priv->populated = FALSE;
-       agp_be->aperture_base = dev->agp->agp_info.aper_base;
        agp_be->private = (void *) agp_priv;
        agp_be->needs_ub_cache_adjust = drm_agp_needs_unbind_cache_adjust;
        agp_be->populate = drm_agp_populate;
@@ -720,8 +719,6 @@ drm_ttm_backend_t *drm_agp_init_ttm(struct drm_device *dev,
        agp_be->destroy = drm_agp_destroy_ttm;
        DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_NEEDS_FREE,
                     (backend == NULL) ? DRM_BE_FLAG_NEEDS_FREE : 0);
-       DRM_MASK_VAL(agp_be->flags, DRM_BE_FLAG_CMA,
-                    (dev->agp->cant_use_aperture) ? DRM_BE_FLAG_CMA : 0);
        agp_be->drm_map_type = _DRM_AGP;
        return agp_be;
 }
index 8a6b49d..16c89f6 100644 (file)
@@ -718,7 +718,7 @@ static int drm_move_local_to_tt(drm_buffer_object_t * bo,
        }
        
        if (!(bo->mem.flags & DRM_BO_FLAG_BIND_CACHED))
-               bo->mem.flags &= DRM_BO_FLAG_CACHED;
+               bo->mem.flags &= ~DRM_BO_FLAG_CACHED;
        bo->mem.flags &= ~DRM_BO_MASK_MEM;
        bo->mem.flags |= DRM_BO_FLAG_MEM_TT;
        bo->mem.mem_type = DRM_BO_MEM_TT;
@@ -2163,6 +2163,26 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)
  * buffer object vm functions.
  */
 
+int drm_mem_reg_is_pci(drm_device_t *dev, drm_bo_mem_reg_t *mem)
+{
+       drm_buffer_manager_t *bm = &dev->bm;
+       drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; 
+
+       if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
+               if (mem->mem_type == DRM_BO_MEM_LOCAL)
+                       return 0;
+               
+               if (man->flags & _DRM_FLAG_MEMTYPE_CMA)
+                       return 0;
+
+               if ((mem->mask & DRM_BO_FLAG_BIND_CACHED) &&
+                   (man->flags & _DRM_FLAG_MEMTYPE_CACHED)) 
+                       return 0;
+       }
+       return 1;
+}
+EXPORT_SYMBOL(drm_mem_reg_is_pci);
+
 /**
  * \c Get the PCI offset for the buffer object memory.
  *
@@ -2174,48 +2194,32 @@ int drm_mm_init_ioctl(DRM_IOCTL_ARGS)
  * \return Failure indication.
  * 
  * Returns -EINVAL if the buffer object is currently not mappable.
- * Otherwise returns zero. Call bo->mutex locked.
+ * Otherwise returns zero.
  */
 
-int drm_bo_pci_offset(const drm_buffer_object_t *bo,
+int drm_bo_pci_offset(drm_device_t *dev,
+                     drm_bo_mem_reg_t *mem,
                      unsigned long *bus_base,
                      unsigned long *bus_offset,
                      unsigned long *bus_size)
 {
-       drm_device_t *dev = bo->dev;
        drm_buffer_manager_t *bm = &dev->bm;
-       drm_mem_type_manager_t *man = &bm->man[bo->mem.mem_type]; 
+       drm_mem_type_manager_t *man = &bm->man[mem->mem_type]; 
 
        *bus_size = 0;
-       if (bo->type != drm_bo_type_dc)
-               return -EINVAL;
-       
        if (!(man->flags & _DRM_FLAG_MEMTYPE_MAPPABLE)) 
                return -EINVAL;
-               
-       if (!(man->flags & _DRM_FLAG_MEMTYPE_FIXED)) {
-               drm_ttm_t *ttm = bo->ttm;
 
-               if (!bo->ttm) {
-                       return -EINVAL;
-               }
-                 
-               drm_ttm_fixup_caching(ttm);
-
-               if (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED)) 
-                       return 0;
-               if (ttm->be->flags & DRM_BE_FLAG_CMA)
-                       return 0;
-               *bus_base = ttm->be->aperture_base;
-       } else {
+       if (drm_mem_reg_is_pci(dev, mem)) {
+               *bus_offset = mem->mm_node->start << PAGE_SHIFT;
+               *bus_size = mem->num_pages << PAGE_SHIFT;
                *bus_base = man->io_offset;
        }
 
-       *bus_offset = bo->mem.mm_node->start << PAGE_SHIFT;
-       *bus_size = bo->mem.num_pages << PAGE_SHIFT;
        return 0;
 }
 
+
 /**
  * \c Return a kernel virtual address to the buffer object PCI memory.
  *
@@ -2231,7 +2235,8 @@ int drm_bo_pci_offset(const drm_buffer_object_t *bo,
  * Call bo->mutex locked.
  */
 
-int drm_bo_ioremap(drm_buffer_object_t *bo)
+#if 0
+int drm_mem_reg_ioremap(drm_bo_mem_reg_t *mem)
 {
        drm_device_t *dev = bo->dev;
        drm_buffer_manager_t *bm = &dev->bm;
@@ -2281,6 +2286,7 @@ void drm_bo_iounmap(drm_buffer_object_t *bo)
        
        bo->iomap = NULL;
 }
+#endif
 
 /**
  * \c Kill all user-space virtual mappings of this buffer object.
index 48d598e..044cf4a 100644 (file)
@@ -222,10 +222,6 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
        drm_ttm_t *ttm; 
        drm_buffer_manager_t *bm;
        drm_device_t *dev;
-       unsigned long bus_base;
-       unsigned long bus_offset;
-       unsigned long bus_size;
-       int err;
 
        mutex_lock(&bo->mutex);
 
@@ -238,14 +234,8 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
        }
        
        dev = bo->dev;
-       err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
-       
-       if (err) {
-               page = NOPAGE_SIGBUS;
-               goto out_unlock;
-       }
 
-       if (bus_size != 0) {
+       if (drm_mem_reg_is_pci(dev, &bo->mem)) {
                DRM_ERROR("Invalid compat nopage.\n");
                page = NOPAGE_SIGBUS;
                goto out_unlock;
@@ -253,6 +243,7 @@ struct page *drm_bo_vm_nopage(struct vm_area_struct *vma,
 
        bm = &dev->bm;
        ttm = bo->ttm;
+       drm_ttm_fixup_caching(ttm);
        page_offset = (address - vma->vm_start) >> PAGE_SHIFT;
        page = ttm->pages[page_offset];
 
@@ -284,7 +275,8 @@ int drm_bo_map_bound(struct vm_area_struct *vma)
        unsigned long bus_offset;
        unsigned long bus_size;
        
-       ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
+       ret = drm_bo_pci_offset(bo->dev, &bo->mem, &bus_base, 
+                               &bus_offset, &bus_size);
        BUG_ON(ret);
 
        if (bus_size) {
@@ -415,14 +407,8 @@ int drm_bo_remap_bound(drm_buffer_object_t *bo)
 {
        vma_entry_t *v_entry;
        int ret = 0;
-       unsigned long bus_base;
-       unsigned long bus_offset;
-       unsigned long bus_size;
-       
-       ret = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
-       BUG_ON(ret);
 
-       if (bus_size) {
+       if (drm_mem_reg_is_pci(bo->dev, &bo->mem)) {
                list_for_each_entry(v_entry, &bo->vma_list, head) {
                        ret = drm_bo_map_bound(v_entry->vma);
                        if (ret)
index 6aa1c5a..3f64928 100644 (file)
 
 #define DRM_BE_FLAG_NEEDS_FREE     0x00000001
 #define DRM_BE_FLAG_BOUND_CACHED   0x00000002
-#define DRM_BE_FLAG_CMA            0x00000004 /* Don't map through aperture */
 
 typedef struct drm_ttm_backend {
-       unsigned long aperture_base;
        void *private;
        uint32_t flags;
        uint32_t drm_map_type;
index a4a9b09..843fc36 100644 (file)
@@ -754,7 +754,8 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,
        }
 
        dev = bo->dev;
-       err = drm_bo_pci_offset(bo, &bus_base, &bus_offset, &bus_size);
+       err = drm_bo_pci_offset(dev, &bo->mem, &bus_base, &bus_offset, 
+                               &bus_size);
 
        if (err) {
                data->type = VM_FAULT_SIGBUS;
@@ -770,6 +771,7 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma,
                bm = &dev->bm;
                ttm = bo->ttm;
 
+               drm_ttm_fixup_caching(ttm);
                page = ttm->pages[page_offset];
                if (!page) {
                        page = drm_ttm_alloc_page();
index 13a3e9b..c1cdd11 100644 (file)
@@ -71,8 +71,17 @@ int i915_init_mem_type(drm_device_t *dev, uint32_t type,
        switch(type) {
        case DRM_BO_MEM_LOCAL:
        case DRM_BO_MEM_TT:
+               if (!(drm_core_has_AGP(dev) && dev->agp)) {
+                       DRM_ERROR("AGP is not enabled for memory type %u\n", 
+                                 (unsigned) type);
+                       return -EINVAL;
+               }
+               man->io_offset = dev->agp->agp_info.aper_base;
+               man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024;
+               man->io_addr = NULL;
                man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
-                       _DRM_FLAG_MEMTYPE_CACHED;
+                       _DRM_FLAG_MEMTYPE_CACHED |
+                       _DRM_FLAG_NEEDS_IOREMAP;
                break;
        case DRM_BO_MEM_PRIV0:
                if (!(drm_core_has_AGP(dev) && dev->agp)) {
@@ -82,13 +91,11 @@ int i915_init_mem_type(drm_device_t *dev, uint32_t type,
                }
                man->io_offset = dev->agp->agp_info.aper_base;
                man->io_size = dev->agp->agp_info.aper_size * 1024 * 1024;
-
+               man->io_addr = NULL;
                man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE |
-                       _DRM_FLAG_MEMTYPE_CACHED |
                        _DRM_FLAG_MEMTYPE_FIXED |
                        _DRM_FLAG_NEEDS_IOREMAP;
 
-               man->io_addr = NULL;
                break;
        default:
                DRM_ERROR("Unsupported memory type %u\n", (unsigned) type);