1 /* $NetBSD: vmwgfx_ttm_glue.c,v 1.2 2018/08/27 04:58:37 riastradh Exp $ */ 2 3 /************************************************************************** 4 * 5 * Copyright © 2009-2011 VMware, Inc., Palo Alto, CA., USA 6 * All Rights Reserved. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the 10 * "Software"), to deal in the Software without restriction, including 11 * without limitation the rights to use, copy, modify, merge, publish, 12 * distribute, sub license, and/or sell copies of the Software, and to 13 * permit persons to whom the Software is furnished to do so, subject to 14 * the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the 17 * next paragraph) shall be included in all copies or substantial portions 18 * of the Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 23 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 24 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 25 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 26 * USE OR OTHER DEALINGS IN THE SOFTWARE. 27 * 28 **************************************************************************/ 29 30 #include <sys/cdefs.h> 31 __KERNEL_RCSID(0, "$NetBSD: vmwgfx_ttm_glue.c,v 1.2 2018/08/27 04:58:37 riastradh Exp $"); 32 33 #include <drm/drmP.h> 34 #include "vmwgfx_drv.h" 35 36 int vmw_mmap(struct file *filp, struct vm_area_struct *vma) 37 { 38 struct drm_file *file_priv; 39 struct vmw_private *dev_priv; 40 41 if (unlikely(vma->vm_pgoff < VMWGFX_FILE_PAGE_OFFSET)) { 42 DRM_ERROR("Illegal attempt to mmap old fifo space.\n"); 43 return -EINVAL; 44 } 45 46 file_priv = filp->private_data; 47 dev_priv = vmw_priv(file_priv->minor->dev); 48 return ttm_bo_mmap(filp, vma, &dev_priv->bdev); 49 } 50 51 static int vmw_ttm_mem_global_init(struct drm_global_reference *ref) 52 { 53 DRM_INFO("global init.\n"); 54 return ttm_mem_global_init(ref->object); 55 } 56 57 static void vmw_ttm_mem_global_release(struct drm_global_reference *ref) 58 { 59 ttm_mem_global_release(ref->object); 60 } 61 62 int vmw_ttm_global_init(struct vmw_private *dev_priv) 63 { 64 struct drm_global_reference *global_ref; 65 int ret; 66 67 global_ref = &dev_priv->mem_global_ref; 68 global_ref->global_type = DRM_GLOBAL_TTM_MEM; 69 global_ref->size = sizeof(struct ttm_mem_global); 70 global_ref->init = &vmw_ttm_mem_global_init; 71 global_ref->release = &vmw_ttm_mem_global_release; 72 73 ret = drm_global_item_ref(global_ref); 74 if (unlikely(ret != 0)) { 75 DRM_ERROR("Failed setting up TTM memory accounting.\n"); 76 return ret; 77 } 78 79 dev_priv->bo_global_ref.mem_glob = 80 dev_priv->mem_global_ref.object; 81 global_ref = &dev_priv->bo_global_ref.ref; 82 global_ref->global_type = DRM_GLOBAL_TTM_BO; 83 global_ref->size = sizeof(struct ttm_bo_global); 84 global_ref->init = &ttm_bo_global_init; 85 global_ref->release = &ttm_bo_global_release; 86 ret = drm_global_item_ref(global_ref); 87 88 if (unlikely(ret != 0)) { 89 DRM_ERROR("Failed setting up TTM buffer objects.\n"); 90 goto out_no_bo; 91 } 92 93 return 0; 94 out_no_bo: 95 drm_global_item_unref(&dev_priv->mem_global_ref); 96 return ret; 97 } 98 99 void vmw_ttm_global_release(struct vmw_private *dev_priv) 100 { 101 drm_global_item_unref(&dev_priv->bo_global_ref.ref); 102 drm_global_item_unref(&dev_priv->mem_global_ref); 103 } 104