diff options
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | 73 |
3 files changed, 88 insertions, 0 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 33bfc2033009..ba2c35dbf10e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
| @@ -1155,6 +1155,11 @@ static struct drm_driver driver = { | |||
| 1155 | .open = vmw_driver_open, | 1155 | .open = vmw_driver_open, |
| 1156 | .preclose = vmw_preclose, | 1156 | .preclose = vmw_preclose, |
| 1157 | .postclose = vmw_postclose, | 1157 | .postclose = vmw_postclose, |
| 1158 | |||
| 1159 | .dumb_create = vmw_dumb_create, | ||
| 1160 | .dumb_map_offset = vmw_dumb_map_offset, | ||
| 1161 | .dumb_destroy = vmw_dumb_destroy, | ||
| 1162 | |||
| 1158 | .fops = &vmwgfx_driver_fops, | 1163 | .fops = &vmwgfx_driver_fops, |
| 1159 | .name = VMWGFX_DRIVER_NAME, | 1164 | .name = VMWGFX_DRIVER_NAME, |
| 1160 | .desc = VMWGFX_DRIVER_DESC, | 1165 | .desc = VMWGFX_DRIVER_DESC, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index d0f2c079ee27..29c984ff7f23 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -645,6 +645,16 @@ int vmw_kms_readback(struct vmw_private *dev_priv, | |||
| 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, |
| 646 | struct drm_file *file_priv); | 646 | struct drm_file *file_priv); |
| 647 | 647 | ||
| 648 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 649 | struct drm_device *dev, | ||
| 650 | struct drm_mode_create_dumb *args); | ||
| 651 | |||
| 652 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 653 | struct drm_device *dev, uint32_t handle, | ||
| 654 | uint64_t *offset); | ||
| 655 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 656 | struct drm_device *dev, | ||
| 657 | uint32_t handle); | ||
| 648 | /** | 658 | /** |
| 649 | * Overlay control - vmwgfx_overlay.c | 659 | * Overlay control - vmwgfx_overlay.c |
| 650 | */ | 660 | */ |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 22bf9a21ec71..2c6ffe0e2c07 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -1917,3 +1917,76 @@ err_ref: | |||
| 1917 | vmw_resource_unreference(&res); | 1917 | vmw_resource_unreference(&res); |
| 1918 | return ret; | 1918 | return ret; |
| 1919 | } | 1919 | } |
| 1920 | |||
| 1921 | |||
| 1922 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 1923 | struct drm_device *dev, | ||
| 1924 | struct drm_mode_create_dumb *args) | ||
| 1925 | { | ||
| 1926 | struct vmw_private *dev_priv = vmw_priv(dev); | ||
| 1927 | struct vmw_master *vmaster = vmw_master(file_priv->master); | ||
| 1928 | struct vmw_user_dma_buffer *vmw_user_bo; | ||
| 1929 | struct ttm_buffer_object *tmp; | ||
| 1930 | int ret; | ||
| 1931 | |||
| 1932 | args->pitch = args->width * ((args->bpp + 7) / 8); | ||
| 1933 | args->size = args->pitch * args->height; | ||
| 1934 | |||
| 1935 | vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL); | ||
| 1936 | if (vmw_user_bo == NULL) | ||
| 1937 | return -ENOMEM; | ||
| 1938 | |||
| 1939 | ret = ttm_read_lock(&vmaster->lock, true); | ||
| 1940 | if (ret != 0) { | ||
| 1941 | kfree(vmw_user_bo); | ||
| 1942 | return ret; | ||
| 1943 | } | ||
| 1944 | |||
| 1945 | ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size, | ||
| 1946 | &vmw_vram_sys_placement, true, | ||
| 1947 | &vmw_user_dmabuf_destroy); | ||
| 1948 | if (ret != 0) | ||
| 1949 | goto out_no_dmabuf; | ||
| 1950 | |||
| 1951 | tmp = ttm_bo_reference(&vmw_user_bo->dma.base); | ||
| 1952 | ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, | ||
| 1953 | &vmw_user_bo->base, | ||
| 1954 | false, | ||
| 1955 | ttm_buffer_type, | ||
| 1956 | &vmw_user_dmabuf_release, NULL); | ||
| 1957 | if (unlikely(ret != 0)) | ||
| 1958 | goto out_no_base_object; | ||
| 1959 | |||
| 1960 | args->handle = vmw_user_bo->base.hash.key; | ||
| 1961 | |||
| 1962 | out_no_base_object: | ||
| 1963 | ttm_bo_unref(&tmp); | ||
| 1964 | out_no_dmabuf: | ||
| 1965 | ttm_read_unlock(&vmaster->lock); | ||
| 1966 | return ret; | ||
| 1967 | } | ||
| 1968 | |||
| 1969 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 1970 | struct drm_device *dev, uint32_t handle, | ||
| 1971 | uint64_t *offset) | ||
| 1972 | { | ||
| 1973 | struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; | ||
| 1974 | struct vmw_dma_buffer *out_buf; | ||
| 1975 | int ret; | ||
| 1976 | |||
| 1977 | ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf); | ||
| 1978 | if (ret != 0) | ||
| 1979 | return -EINVAL; | ||
| 1980 | |||
| 1981 | *offset = out_buf->base.addr_space_offset; | ||
| 1982 | vmw_dmabuf_unreference(&out_buf); | ||
| 1983 | return 0; | ||
| 1984 | } | ||
| 1985 | |||
| 1986 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 1987 | struct drm_device *dev, | ||
| 1988 | uint32_t handle) | ||
| 1989 | { | ||
| 1990 | return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, | ||
| 1991 | handle, TTM_REF_USAGE); | ||
| 1992 | } | ||
