drm/nouveau: add dumb ioctl support
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
parent
caca6a03d3
commit
33dbc27f1a
|
@ -369,3 +369,48 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
|
||||||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -433,6 +433,10 @@ static struct drm_driver driver = {
|
||||||
.gem_open_object = nouveau_gem_object_open,
|
.gem_open_object = nouveau_gem_object_open,
|
||||||
.gem_close_object = nouveau_gem_object_close,
|
.gem_close_object = nouveau_gem_object_close,
|
||||||
|
|
||||||
|
.dumb_create = nouveau_display_dumb_create,
|
||||||
|
.dumb_map_offset = nouveau_display_dumb_map_offset,
|
||||||
|
.dumb_destroy = nouveau_display_dumb_destroy,
|
||||||
|
|
||||||
.name = DRIVER_NAME,
|
.name = DRIVER_NAME,
|
||||||
.desc = DRIVER_DESC,
|
.desc = DRIVER_DESC,
|
||||||
#ifdef GIT_REVISION
|
#ifdef GIT_REVISION
|
||||||
|
|
|
@ -1418,6 +1418,12 @@ int nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
||||||
struct drm_pending_vblank_event *event);
|
struct drm_pending_vblank_event *event);
|
||||||
int nouveau_finish_page_flip(struct nouveau_channel *,
|
int nouveau_finish_page_flip(struct nouveau_channel *,
|
||||||
struct nouveau_page_flip_state *);
|
struct nouveau_page_flip_state *);
|
||||||
|
int nouveau_display_dumb_create(struct drm_file *, struct drm_device *,
|
||||||
|
struct drm_mode_create_dumb *args);
|
||||||
|
int nouveau_display_dumb_map_offset(struct drm_file *, struct drm_device *,
|
||||||
|
uint32_t handle, uint64_t *offset);
|
||||||
|
int nouveau_display_dumb_destroy(struct drm_file *, struct drm_device *,
|
||||||
|
uint32_t handle);
|
||||||
|
|
||||||
/* nv10_gpio.c */
|
/* nv10_gpio.c */
|
||||||
int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
|
int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
|
||||||
|
|
Loading…
Reference in a new issue