]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/char/drm/drm_scatter.c
sonypi: BKL pushdown
[linux-2.6-omap-h63xx.git] / drivers / char / drm / drm_scatter.c
index eb7fa437355e4068a52d48d2f7e7afbdad9e2f00..b2b0f3d4171492de22ebb6949b9bb0ce5f9d65c6 100644 (file)
 
 #define DEBUG_SCATTER 0
 
+static inline void *drm_vmalloc_dma(unsigned long size)
+{
+#if defined(__powerpc__) && defined(CONFIG_NOT_COHERENT_CACHE)
+       return __vmalloc(size, GFP_KERNEL, PAGE_KERNEL | _PAGE_NO_CACHE);
+#else
+       return vmalloc_32(size);
+#endif
+}
+
 void drm_sg_cleanup(struct drm_sg_mem * entry)
 {
        struct page *page;
@@ -67,7 +76,7 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
        struct drm_sg_mem *entry;
        unsigned long pages, i, j;
 
-       DRM_DEBUG("%s\n", __FUNCTION__);
+       DRM_DEBUG("\n");
 
        if (!drm_core_check_feature(dev, DRIVER_SG))
                return -EINVAL;
@@ -81,7 +90,7 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
 
        memset(entry, 0, sizeof(*entry));
        pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
-       DRM_DEBUG("sg size=%ld pages=%ld\n", request->size, pages);
+       DRM_DEBUG("size=%ld pages=%ld\n", request->size, pages);
 
        entry->pages = pages;
        entry->pagelist = drm_alloc(pages * sizeof(*entry->pagelist),
@@ -104,7 +113,7 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
        }
        memset((void *)entry->busaddr, 0, pages * sizeof(*entry->busaddr));
 
-       entry->virtual = vmalloc_32(pages << PAGE_SHIFT);
+       entry->virtual = drm_vmalloc_dma(pages << PAGE_SHIFT);
        if (!entry->virtual) {
                drm_free(entry->busaddr,
                         entry->pages * sizeof(*entry->busaddr), DRM_MEM_PAGES);
@@ -122,8 +131,8 @@ int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
 
        entry->handle = ScatterHandle((unsigned long)entry->virtual);
 
-       DRM_DEBUG("sg alloc handle  = %08lx\n", entry->handle);
-       DRM_DEBUG("sg alloc virtual = %p\n", entry->virtual);
+       DRM_DEBUG("handle  = %08lx\n", entry->handle);
+       DRM_DEBUG("virtual = %p\n", entry->virtual);
 
        for (i = (unsigned long)entry->virtual, j = 0; j < pages;
             i += PAGE_SIZE, j++) {
@@ -210,7 +219,7 @@ int drm_sg_free(struct drm_device *dev, void *data,
        if (!entry || entry->handle != request->handle)
                return -EINVAL;
 
-       DRM_DEBUG("sg free virtual  = %p\n", entry->virtual);
+       DRM_DEBUG("virtual  = %p\n", entry->virtual);
 
        drm_sg_cleanup(entry);