drm: add _DRM_CONSISTENT map type
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / char / drm / drm_bufs.c
index 4c6191d231b8e06e20d876af0287d03df9335153..89f301ffd97e01706508308b684db09a62cc90c4 100644 (file)
@@ -180,7 +180,22 @@ int drm_addmap( struct inode *inode, struct file *filp,
                }
                map->offset += dev->sg->handle;
                break;
-
+       case _DRM_CONSISTENT: 
+       {
+               /* dma_addr_t is 64bit on i386 with CONFIG_HIGHMEM64G,
+                * As we're limit the address to 2^32-1 (or lses),
+                * casting it down to 32 bits is no problem, but we
+                * need to point to a 64bit variable first. */
+               dma_addr_t bus_addr;
+               map->handle = drm_pci_alloc(dev, map->size, map->size,
+                                           0xffffffffUL, &bus_addr);
+               map->offset = (unsigned long)bus_addr;
+               if (!map->handle) {
+                       drm_free(map, sizeof(*map), DRM_MEM_MAPS);
+                       return -ENOMEM;
+               }
+               break;
+       }
        default:
                drm_free( map, sizeof(*map), DRM_MEM_MAPS );
                return -EINVAL;
@@ -291,6 +306,9 @@ int drm_rmmap(struct inode *inode, struct file *filp,
                case _DRM_AGP:
                case _DRM_SCATTER_GATHER:
                        break;
+               case _DRM_CONSISTENT:
+                       drm_pci_free(dev, map->size, map->handle, map->offset);
+                       break;
                }
                drm_free(map, sizeof(*map), DRM_MEM_MAPS);
        }