diff options
-rw-r--r-- | linux-core/drmP.h | 1 | ||||
-rw-r--r-- | linux-core/drm_agpsupport.c | 4 | ||||
-rw-r--r-- | linux-core/drm_compat.c | 17 | ||||
-rw-r--r-- | linux-core/drm_ttm.c | 3 | ||||
-rw-r--r-- | linux-core/drm_ttm.h | 2 | ||||
-rw-r--r-- | linux-core/drm_vm.c | 8 |
6 files changed, 21 insertions, 14 deletions
diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 2453c756..090bd124 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -1043,6 +1043,7 @@ typedef struct drm_buffer_object{ unsigned long bus_offset; unsigned long num_pages; uint32_t vm_flags; + void *iomap; } drm_buffer_object_t; diff --git a/linux-core/drm_agpsupport.c b/linux-core/drm_agpsupport.c index 9cdbdaf0..7a692af1 100644 --- a/linux-core/drm_agpsupport.c +++ b/linux-core/drm_agpsupport.c @@ -720,8 +720,8 @@ 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_CBA, - (dev->agp->cant_use_aperture) ? DRM_BE_FLAG_CBA : 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; } diff --git a/linux-core/drm_compat.c b/linux-core/drm_compat.c index 6bb58424..93d9b95d 100644 --- a/linux-core/drm_compat.c +++ b/linux-core/drm_compat.c @@ -277,7 +277,9 @@ int drm_ttm_map_bound(struct vm_area_struct *vma) drm_ttm_t *ttm = (drm_ttm_t *) map->offset; int ret = 0; - if (ttm->page_flags & DRM_TTM_PAGE_UNCACHED) { + if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) && + !(ttm->be->flags & DRM_BE_FLAG_CMA)) { + unsigned long pfn = ttm->aper_offset + (ttm->be->aperture_base >> PAGE_SHIFT); pgprot_t pgprot = drm_io_prot(ttm->be->drm_map_type, vma); @@ -286,6 +288,7 @@ int drm_ttm_map_bound(struct vm_area_struct *vma) vma->vm_end - vma->vm_start, pgprot); } + return ret; } @@ -408,10 +411,14 @@ int drm_ttm_remap_bound(drm_ttm_t *ttm) vma_entry_t *v_entry; int ret = 0; - list_for_each_entry(v_entry, &ttm->vma_list, head) { - ret = drm_ttm_map_bound(v_entry->vma); - if (ret) - break; + if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) && + !(ttm->be->flags & DRM_BE_FLAG_CMA)) { + + list_for_each_entry(v_entry, &ttm->vma_list, head) { + ret = drm_ttm_map_bound(v_entry->vma); + if (ret) + break; + } } drm_ttm_unlock_mm(ttm); diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index c17c41cb..f1e3ea40 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -162,7 +162,7 @@ int drm_destroy_ttm(drm_ttm_t * ttm) DRM_DEBUG("Destroying a ttm\n"); -#ifdef DRM_TTM_ODD_COMPAT +#ifdef DRM_ODD_MM_COMPAT BUG_ON(!list_empty(&ttm->vma_list)); BUG_ON(!list_empty(&ttm->p_mm_list)); #endif @@ -364,6 +364,7 @@ int drm_bind_ttm(drm_ttm_t * ttm, int cached, unsigned long aper_offset) ret = drm_ttm_populate(ttm); if (ret) return ret; + if (ttm->state == ttm_unbound && !cached) { ret = unmap_vma_pages(ttm); if (ret) diff --git a/linux-core/drm_ttm.h b/linux-core/drm_ttm.h index 796f2317..a7858549 100644 --- a/linux-core/drm_ttm.h +++ b/linux-core/drm_ttm.h @@ -46,7 +46,7 @@ #define DRM_BE_FLAG_NEEDS_FREE 0x00000001 #define DRM_BE_FLAG_BOUND_CACHED 0x00000002 -#define DRM_BE_FLAG_CBA 0x00000004 +#define DRM_BE_FLAG_CMA 0x00000004 /* Don't map through aperture */ typedef struct drm_ttm_backend { unsigned long aperture_base; diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index b11e09f8..63cf6f56 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -222,11 +222,8 @@ struct page *drm_vm_ttm_fault(struct vm_area_struct *vma, #endif } - if (ttm->page_flags & DRM_TTM_PAGE_UNCACHED) { - - /* - * FIXME: Check can't map aperture flag. - */ + if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) && + !(ttm->be->flags & DRM_BE_FLAG_CMA)) { pfn = ttm->aper_offset + page_offset + (ttm->be->aperture_base >> PAGE_SHIFT); @@ -845,6 +842,7 @@ static int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma) #ifdef DRM_ODD_MM_COMPAT drm_ttm_map_bound(vma); #endif + drm_vm_ttm_open_locked(vma); return 0; } default: |