|
@@ -369,3 +369,48 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
|
|
|
spin_unlock_irqrestore(&dev->event_lock, flags);
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+int
|
|
|
+nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
|
|
+ struct drm_mode_create_dumb *args)
|
|
|
+{
|
|
|
+ struct nouveau_bo *bo;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ args->pitch = roundup(args->width * (args->bpp / 8), 256);
|
|
|
+ args->size = args->pitch * args->height;
|
|
|
+ args->size = roundup(args->size, PAGE_SIZE);
|
|
|
+
|
|
|
+ ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ ret = drm_gem_handle_create(file_priv, bo->gem, &args->handle);
|
|
|
+ drm_gem_object_unreference_unlocked(bo->gem);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int
|
|
|
+nouveau_display_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev,
|
|
|
+ uint32_t handle)
|
|
|
+{
|
|
|
+ return drm_gem_handle_delete(file_priv, handle);
|
|
|
+}
|
|
|
+
|
|
|
+int
|
|
|
+nouveau_display_dumb_map_offset(struct drm_file *file_priv,
|
|
|
+ struct drm_device *dev,
|
|
|
+ uint32_t handle, uint64_t *poffset)
|
|
|
+{
|
|
|
+ struct drm_gem_object *gem;
|
|
|
+
|
|
|
+ gem = drm_gem_object_lookup(dev, file_priv, handle);
|
|
|
+ if (gem) {
|
|
|
+ struct nouveau_bo *bo = gem->driver_private;
|
|
|
+ *poffset = bo->bo.addr_space_offset;
|
|
|
+ drm_gem_object_unreference_unlocked(gem);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return -ENOENT;
|
|
|
+}
|