From: <ai...@fr...> - 2007-08-28 01:46:15
|
linux-core/drm_bo_move.c | 15 ++++++++++----- linux-core/drm_objects.h | 3 ++- linux-core/drm_ttm.c | 12 ++++++++---- shared-core/i915_dma.c | 8 +++++++- 4 files changed, 27 insertions(+), 11 deletions(-) New commits: commit f37deaceaf55017bc97a97e7afb18f1518b1ffe8 Author: Dave Airlie <airlied@optimus.(none)> Date: Tue Aug 28 11:43:34 2007 +1000 ttm: avoid using ioremap nocache when we know the area is already cached diff --git a/linux-core/drm_bo_move.c b/linux-core/drm_bo_move.c index 21ab4bb..7dee31f 100644 --- a/linux-core/drm_bo_move.c +++ b/linux-core/drm_bo_move.c @@ -90,7 +90,8 @@ EXPORT_SYMBOL(drm_bo_move_ttm); /** * \c Return a kernel virtual address to the buffer object PCI memory. * - * \param bo The buffer object. + * \param mem the BO mem region + * \param cached whether the region is current in cached or uncached memory. * \return Failure indication. * * Returns -EINVAL if the buffer object is currently not mappable. @@ -103,7 +104,7 @@ EXPORT_SYMBOL(drm_bo_move_ttm); */ int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, - void **virtual) + void **virtual, int cached) { struct drm_buffer_manager *bm = &dev->bm; struct drm_mem_type_manager *man = &bm->man[mem->mem_type]; @@ -121,7 +122,11 @@ int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, if (!(man->flags & _DRM_FLAG_NEEDS_IOREMAP)) addr = (void *)(((u8 *) man->io_addr) + bus_offset); else { - addr = ioremap_nocache(bus_base + bus_offset, bus_size); + /* if the area is already uncached no need to make ioremap do the uncaching again */ + if (cached) + addr = ioremap_nocache(bus_base + bus_offset, bus_size); + else + addr = ioremap(bus_base + bus_offset, bus_size); if (!addr) return -ENOMEM; } @@ -220,10 +225,10 @@ int drm_bo_move_memcpy(struct drm_buffer_object * bo, unsigned long add = 0; int dir; - ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap); + ret = drm_mem_reg_ioremap(dev, old_mem, &old_iomap, 1); if (ret) return ret; - ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap); + ret = drm_mem_reg_ioremap(dev, new_mem, &new_iomap, 1); if (ret) goto out; diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 8dc2933..480d261 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -299,6 +299,7 @@ extern void drm_ttm_unbind(struct drm_ttm * ttm); extern void drm_ttm_evict(struct drm_ttm * ttm); extern void drm_ttm_fixup_caching(struct drm_ttm * ttm); extern struct page *drm_ttm_get_page(struct drm_ttm * ttm, int index); +extern int drm_ttm_get_caching(struct drm_ttm *ttm); /* * Destroy a ttm. The user normally calls drmRmMap or a similar IOCTL to do this, @@ -513,7 +514,7 @@ extern int drm_bo_move_accel_cleanup(struct drm_buffer_object * bo, extern int drm_mem_reg_ioremap(struct drm_device * dev, struct drm_bo_mem_reg * mem, - void **virtual); + void **virtual, int cached); extern void drm_mem_reg_iounmap(struct drm_device * dev, struct drm_bo_mem_reg * mem, diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index 445cbd8..930a916 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -117,10 +117,7 @@ static int drm_set_caching(struct drm_ttm * ttm, int noncached) if ((ttm->page_flags & DRM_TTM_PAGE_UNCACHED) == noncached) return 0; -#if 0 - if (noncached) - drm_ttm_cache_flush(); -#endif + for (i = 0; i < ttm->num_pages; ++i) { cur_page = ttm->pages + i; if (*cur_page) { @@ -348,3 +345,10 @@ int drm_bind_ttm(struct drm_ttm * ttm, int cached, unsigned long aper_offset) } EXPORT_SYMBOL(drm_bind_ttm); + +/* returns 1 for cached ttm, 0 for uncached ttm */ +int drm_ttm_get_caching(struct drm_ttm *ttm) +{ + return (!(ttm->page_flags & DRM_TTM_PAGE_UNCACHED)); +} +EXPORT_SYMBOL(drm_ttm_get_caching); diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 8755f8a..2e1cd11 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -734,6 +734,7 @@ int i915_process_relocs(struct drm_device *dev, struct drm_file *file_priv, unsi int ret; struct drm_buffer_object *bo; void *bb_virt; + int caching = 1; ret = get_user(bo_handle, &reloc_hdr[0]); if (ret) @@ -751,10 +752,15 @@ int i915_process_relocs(struct drm_device *dev, struct drm_file *file_priv, unsi if (!bo) return -EINVAL; + /* need to relocate in side a TTM */ + if (bo->ttm) + if (!drm_ttm_get_caching(bo->ttm)) + caching = 0; + /* TODO **** NEED TO CHECK FOR BO BUSY HERE */ /* map the batchbuffer object into kernel space */ - ret = drm_mem_reg_ioremap(dev, &bo->mem, &bb_virt); + ret = drm_mem_reg_ioremap(dev, &bo->mem, &bb_virt, caching); if (ret) { DRM_ERROR("Couldn't ioremap buffer \n"); return -EINVAL; |