From: Thomas Hellstrom Date: Wed, 14 Feb 2007 11:39:02 +0000 (+0100) Subject: Set the drm bus map type for each buffer object memory type. X-Git-Tag: libdrm-2.3.1~299^2~14^2~7^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=04760563b88c8e94f3ae448710d1ab8b350c2e5f;p=platform%2Fupstream%2Flibdrm.git Set the drm bus map type for each buffer object memory type. --- diff --git a/linux-core/drmP.h b/linux-core/drmP.h index c472689..e070c07 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -664,6 +664,7 @@ typedef struct drm_mem_type_manager { struct list_head lru; struct list_head pinned; uint32_t flags; + uint32_t drm_bus_maptype; unsigned long io_offset; unsigned long io_size; void *io_addr; diff --git a/linux-core/drm_compat.c b/linux-core/drm_compat.c index eeda4e4..3bb3599 100644 --- a/linux-core/drm_compat.c +++ b/linux-core/drm_compat.c @@ -306,8 +306,9 @@ int drm_bo_map_bound(struct vm_area_struct *vma) BUG_ON(ret); if (bus_size) { + drm_mem_type_manager_t *man = &dev->bm.man[bo->mem.mem_type]; unsigned long pfn = (bus_base + bus_offset) >> PAGE_SHIFT; - pgprot_t pgprot = drm_io_prot(_DRM_AGP, vma); + pgprot_t pgprot = drm_io_prot(man->drm_bus_maptype, vma); ret = io_remap_pfn_range(vma, vma->vm_start, pfn, vma->vm_end - vma->vm_start, pgprot); diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index 4a340b5..f3b1088 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -816,8 +816,10 @@ struct page *drm_bo_vm_fault(struct vm_area_struct *vma, page_offset = (address - vma->vm_start) >> PAGE_SHIFT; if (bus_size) { + drm_mem_type_manager_t *man = &dev->bm.man[bo->mem.mem_type]; + pfn = ((bus_base + bus_offset) >> PAGE_SHIFT) + page_offset; - vma->vm_page_prot = drm_io_prot(_DRM_AGP, vma); + vma->vm_page_prot = drm_io_prot(man->drm_bus_maptype, vma); } else { ttm = bo->ttm; diff --git a/linux-core/i915_buffer.c b/linux-core/i915_buffer.c index 3ccfab3..374b28d 100644 --- a/linux-core/i915_buffer.c +++ b/linux-core/i915_buffer.c @@ -71,6 +71,7 @@ int i915_init_mem_type(drm_device_t * dev, uint32_t type, case DRM_BO_MEM_LOCAL: man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CACHED; + man->drm_bus_maptype = 0; break; case DRM_BO_MEM_TT: if (!(drm_core_has_AGP(dev) && dev->agp)) { @@ -83,6 +84,7 @@ int i915_init_mem_type(drm_device_t * dev, uint32_t type, man->io_addr = NULL; man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_CSELECT | _DRM_FLAG_NEEDS_IOREMAP; + man->drm_bus_maptype = _DRM_AGP; break; case DRM_BO_MEM_PRIV0: if (!(drm_core_has_AGP(dev) && dev->agp)) { @@ -95,7 +97,7 @@ int i915_init_mem_type(drm_device_t * dev, uint32_t type, man->io_addr = NULL; man->flags = _DRM_FLAG_MEMTYPE_MAPPABLE | _DRM_FLAG_MEMTYPE_FIXED | _DRM_FLAG_NEEDS_IOREMAP; - + man->drm_bus_maptype = _DRM_AGP; break; default: DRM_ERROR("Unsupported memory type %u\n", (unsigned)type);