#include "rockchip_drm_drv.h"
 #include "rockchip_drm_gem.h"
 
-static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj)
+static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj,
+                                 bool alloc_kmap)
 {
        struct drm_gem_object *obj = &rk_obj->base;
        struct drm_device *drm = obj->dev;
        init_dma_attrs(&rk_obj->dma_attrs);
        dma_set_attr(DMA_ATTR_WRITE_COMBINE, &rk_obj->dma_attrs);
 
-       /* TODO(djkurtz): Use DMA_ATTR_NO_KERNEL_MAPPING except for fbdev */
+       if (!alloc_kmap)
+               dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &rk_obj->dma_attrs);
+
        rk_obj->kvaddr = dma_alloc_attrs(drm->dev, obj->size,
                                         &rk_obj->dma_addr, GFP_KERNEL,
                                         &rk_obj->dma_attrs);
 }
 
 struct rockchip_gem_object *
-       rockchip_gem_create_object(struct drm_device *drm, unsigned int size)
+       rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
+                                  bool alloc_kmap)
 {
        struct rockchip_gem_object *rk_obj;
        struct drm_gem_object *obj;
 
        drm_gem_private_object_init(drm, obj, size);
 
-       ret = rockchip_gem_alloc_buf(rk_obj);
+       ret = rockchip_gem_alloc_buf(rk_obj, alloc_kmap);
        if (ret)
                goto err_free_rk_obj;
 
        struct drm_gem_object *obj;
        int ret;
 
-       rk_obj = rockchip_gem_create_object(drm, size);
+       rk_obj = rockchip_gem_create_object(drm, size, false);
        if (IS_ERR(rk_obj))
                return ERR_CAST(rk_obj);
 
 {
        struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
 
+       if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, &rk_obj->dma_attrs))
+               return NULL;
+
        return rk_obj->kvaddr;
 }
 
 
                          struct vm_area_struct *vma);
 
 struct rockchip_gem_object *
-       rockchip_gem_create_object(struct drm_device *drm, unsigned int size);
+       rockchip_gem_create_object(struct drm_device *drm, unsigned int size,
+                                  bool alloc_kmap);
 
 void rockchip_gem_free_object(struct drm_gem_object *obj);