diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_display.c')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_display.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index ddbabefb427..b12fd2c8081 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c @@ -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; +}  |