1312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie/* 2312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * Copyright 2012 Red Hat Inc. 3312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * 4312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 5312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * copy of this software and associated documentation files (the 6312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * "Software"), to deal in the Software without restriction, including 7312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * without limitation the rights to use, copy, modify, merge, publish, 8312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * distribute, sub license, and/or sell copies of the Software, and to 9312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * permit persons to whom the Software is furnished to do so, subject to 10312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * the following conditions: 11312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * 12312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 13312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 14312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 15312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 16312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 18312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE. 19312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * 20312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * The above copyright notice and this permission notice (including the 21312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * next paragraph) shall be included in all copies or substantial portions 22312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * of the Software. 23312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * 24312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie */ 25312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie/* 26312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie * Authors: Dave Airlie <airlied@redhat.com> 27312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie */ 28760285e7e7ab282c25b5e90816f7c47000557f4fDavid Howells#include <drm/drmP.h> 29312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie#include "ast_drv.h" 30312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie#include <ttm/ttm_page_alloc.h> 31312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 32312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic inline struct ast_private * 33312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_bdev(struct ttm_bo_device *bd) 34312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 35312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return container_of(bd, struct ast_private, ttm.bdev); 36312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 37312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 38312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int 39312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_ttm_mem_global_init(struct drm_global_reference *ref) 40312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 41312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ttm_mem_global_init(ref->object); 42312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 43312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 44312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void 45312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_ttm_mem_global_release(struct drm_global_reference *ref) 46312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 47312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_mem_global_release(ref->object); 48312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 49312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 50312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int ast_ttm_global_init(struct ast_private *ast) 51312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 52312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct drm_global_reference *global_ref; 53312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int r; 54312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 55312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref = &ast->ttm.mem_global_ref; 56312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->global_type = DRM_GLOBAL_TTM_MEM; 57312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->size = sizeof(struct ttm_mem_global); 58312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->init = &ast_ttm_mem_global_init; 59312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->release = &ast_ttm_mem_global_release; 60312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie r = drm_global_item_ref(global_ref); 61312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (r != 0) { 62312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("Failed setting up TTM memory accounting " 63312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie "subsystem.\n"); 64312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return r; 65312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 66312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 67312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast->ttm.bo_global_ref.mem_glob = 68312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast->ttm.mem_global_ref.object; 69312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref = &ast->ttm.bo_global_ref.ref; 70312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->global_type = DRM_GLOBAL_TTM_BO; 71312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->size = sizeof(struct ttm_bo_global); 72312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->init = &ttm_bo_global_init; 73312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie global_ref->release = &ttm_bo_global_release; 74312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie r = drm_global_item_ref(global_ref); 75312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (r != 0) { 76312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("Failed setting up TTM BO subsystem.\n"); 77312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie drm_global_item_unref(&ast->ttm.mem_global_ref); 78312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return r; 79312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 80312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 81312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 82312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 83a1537f33b1df41afcfb1e5df980f6d2f63b7b26dRashikastatic void 84312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_ttm_global_release(struct ast_private *ast) 85312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 86312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ast->ttm.mem_global_ref.release == NULL) 87312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return; 88312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 89312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie drm_global_item_unref(&ast->ttm.bo_global_ref.ref); 90312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie drm_global_item_unref(&ast->ttm.mem_global_ref); 91312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast->ttm.mem_global_ref.release = NULL; 92312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 93312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 94312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 95312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo) 96312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 97312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_bo *bo; 98312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 99312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo = container_of(tbo, struct ast_bo, bo); 100312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 101312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie drm_gem_object_release(&bo->gem); 102312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie kfree(bo); 103312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 104312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 105a1537f33b1df41afcfb1e5df980f6d2f63b7b26dRashikastatic bool ast_ttm_bo_is_ast_bo(struct ttm_buffer_object *bo) 106312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 107312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (bo->destroy == &ast_bo_ttm_destroy) 108312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return true; 109312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return false; 110312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 111312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 112312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int 113312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, 114312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_mem_type_manager *man) 115312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 116312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie switch (type) { 117312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie case TTM_PL_SYSTEM: 118312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; 119312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->available_caching = TTM_PL_MASK_CACHING; 120312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->default_caching = TTM_PL_FLAG_CACHED; 121312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie break; 122312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie case TTM_PL_VRAM: 123312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->func = &ttm_bo_manager_func; 124312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->flags = TTM_MEMTYPE_FLAG_FIXED | 125312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie TTM_MEMTYPE_FLAG_MAPPABLE; 126312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->available_caching = TTM_PL_FLAG_UNCACHED | 127312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie TTM_PL_FLAG_WC; 128312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie man->default_caching = TTM_PL_FLAG_WC; 129312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie break; 130312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie default: 131312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("Unsupported memory type %u\n", (unsigned)type); 132312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return -EINVAL; 133312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 134312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 135312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 136312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 137312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void 138312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieast_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl) 139312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 140312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_bo *astbo = ast_bo(bo); 141312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 142312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!ast_ttm_bo_is_ast_bo(bo)) 143312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return; 144312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 145312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast_ttm_placement(astbo, TTM_PL_FLAG_SYSTEM); 146312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie *pl = astbo->placement; 147312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 148312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 149312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int ast_bo_verify_access(struct ttm_buffer_object *bo, struct file *filp) 150312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 151acb4652703f0a452405a3ab9319594eddc41391bDavid Herrmann struct ast_bo *astbo = ast_bo(bo); 152acb4652703f0a452405a3ab9319594eddc41391bDavid Herrmann 153acb4652703f0a452405a3ab9319594eddc41391bDavid Herrmann return drm_vma_node_verify_access(&astbo->gem.vma_node, filp); 154312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 155312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 156312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int ast_ttm_io_mem_reserve(struct ttm_bo_device *bdev, 157312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_mem_reg *mem) 158312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 159312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 160312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_private *ast = ast_bdev(bdev); 161312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 162312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.addr = NULL; 163312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.offset = 0; 164312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.size = mem->num_pages << PAGE_SHIFT; 165312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.base = 0; 166312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.is_iomem = false; 167312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE)) 168312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return -EINVAL; 169312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie switch (mem->mem_type) { 170312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie case TTM_PL_SYSTEM: 171312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie /* system memory */ 172312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 173312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie case TTM_PL_VRAM: 174312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.offset = mem->start << PAGE_SHIFT; 175312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.base = pci_resource_start(ast->dev->pdev, 0); 176312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie mem->bus.is_iomem = true; 177312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie break; 178312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie default: 179312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return -EINVAL; 180312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie break; 181312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 182312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 183312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 184312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 185312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void ast_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 186312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 187312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 188312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 189312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int ast_bo_move(struct ttm_buffer_object *bo, 190312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bool evict, bool interruptible, 19197a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst bool no_wait_gpu, 192312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_mem_reg *new_mem) 193312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 194312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int r; 19597a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst r = ttm_bo_move_memcpy(bo, evict, no_wait_gpu, new_mem); 196312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return r; 197312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 198312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 199312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 200312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void ast_ttm_backend_destroy(struct ttm_tt *tt) 201312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 202312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_tt_fini(tt); 203312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie kfree(tt); 204312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 205312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 206312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic struct ttm_backend_func ast_tt_backend_func = { 207312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .destroy = &ast_ttm_backend_destroy, 208312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie}; 209312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 210312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 211a1537f33b1df41afcfb1e5df980f6d2f63b7b26dRashikastatic struct ttm_tt *ast_ttm_tt_create(struct ttm_bo_device *bdev, 212312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie unsigned long size, uint32_t page_flags, 213312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct page *dummy_read_page) 214312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 215312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_tt *tt; 216312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 217312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie tt = kzalloc(sizeof(struct ttm_tt), GFP_KERNEL); 218312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (tt == NULL) 219312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return NULL; 220312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie tt->func = &ast_tt_backend_func; 221312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ttm_tt_init(tt, bdev, size, page_flags, dummy_read_page)) { 222312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie kfree(tt); 223312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return NULL; 224312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 225312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return tt; 226312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 227312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 228312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic int ast_ttm_tt_populate(struct ttm_tt *ttm) 229312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 230312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ttm_pool_populate(ttm); 231312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 232312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 233312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic void ast_ttm_tt_unpopulate(struct ttm_tt *ttm) 234312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 235312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_pool_unpopulate(ttm); 236312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 237312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 238312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestruct ttm_bo_driver ast_bo_driver = { 239312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .ttm_tt_create = ast_ttm_tt_create, 240312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .ttm_tt_populate = ast_ttm_tt_populate, 241312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .ttm_tt_unpopulate = ast_ttm_tt_unpopulate, 242312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .init_mem_type = ast_bo_init_mem_type, 243312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .evict_flags = ast_bo_evict_flags, 244312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .move = ast_bo_move, 245312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .verify_access = ast_bo_verify_access, 246312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .io_mem_reserve = &ast_ttm_io_mem_reserve, 247312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie .io_mem_free = &ast_ttm_io_mem_free, 248312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie}; 249312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 250312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_mm_init(struct ast_private *ast) 251312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 252312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int ret; 253312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct drm_device *dev = ast->dev; 254312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ttm_bo_device *bdev = &ast->ttm.bdev; 255312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 256312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ret = ast_ttm_global_init(ast); 257312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) 258312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 259312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 260312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ret = ttm_bo_device_init(&ast->ttm.bdev, 261312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast->ttm.bo_global_ref.ref.object, 26244d847b7439bdea0b6c5640446427daa3ebcc7faDavid Herrmann &ast_bo_driver, 26344d847b7439bdea0b6c5640446427daa3ebcc7faDavid Herrmann dev->anon_inode->i_mapping, 26444d847b7439bdea0b6c5640446427daa3ebcc7faDavid Herrmann DRM_FILE_PAGE_OFFSET, 265312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie true); 266312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) { 267312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("Error initialising bo driver; %d\n", ret); 268312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 269312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 270312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 271312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 272312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast->vram_size >> PAGE_SHIFT); 273312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) { 274312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("Failed ttm VRAM init: %d\n", ret); 275312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 276312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 277312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 278247d36d75128ba1f63702e0e6185d9a7a23ee5cbAndy Lutomirski ast->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0), 279247d36d75128ba1f63702e0e6185d9a7a23ee5cbAndy Lutomirski pci_resource_len(dev->pdev, 0)); 280312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 281312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 282312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 283312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 284312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlievoid ast_mm_fini(struct ast_private *ast) 285312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 286312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_bo_device_release(&ast->ttm.bdev); 287312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 288312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast_ttm_global_release(ast); 289312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 290247d36d75128ba1f63702e0e6185d9a7a23ee5cbAndy Lutomirski arch_phys_wc_del(ast->fb_mtrr); 291312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 292312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 293312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlievoid ast_ttm_placement(struct ast_bo *bo, int domain) 294312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 295312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie u32 c = 0; 296f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König unsigned i; 297f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König 298312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->placement.placement = bo->placements; 299312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->placement.busy_placement = bo->placements; 300312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (domain & TTM_PL_FLAG_VRAM) 301f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM; 302312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (domain & TTM_PL_FLAG_SYSTEM) 303a9d6dd2554e35c0213382fff19f5dbf151707955Dave Airlie bo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM; 304312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!c) 305a9d6dd2554e35c0213382fff19f5dbf151707955Dave Airlie bo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM; 306312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->placement.num_placement = c; 307312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->placement.num_busy_placement = c; 308f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König for (i = 0; i < c; ++i) { 309f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[i].fpfn = 0; 310f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[i].lpfn = 0; 311f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König } 312312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 313312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 314312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_bo_create(struct drm_device *dev, int size, int align, 315312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie uint32_t flags, struct ast_bo **pastbo) 316312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 317312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_private *ast = dev->dev_private; 318312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_bo *astbo; 319312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie size_t acc_size; 320312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int ret; 321312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 322312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie astbo = kzalloc(sizeof(struct ast_bo), GFP_KERNEL); 323312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!astbo) 324312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return -ENOMEM; 325312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 326312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ret = drm_gem_object_init(dev, &astbo->gem, size); 327312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) { 328312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie kfree(astbo); 329312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 330312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 331312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 332312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie astbo->bo.bdev = &ast->ttm.bdev; 333312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 334312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast_ttm_placement(astbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); 335312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 336312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie acc_size = ttm_bo_dma_acc_size(&ast->ttm.bdev, size, 337312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie sizeof(struct ast_bo)); 338312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 339312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ret = ttm_bo_init(&ast->ttm.bdev, &astbo->bo, size, 340312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_bo_type_device, &astbo->placement, 3410b91c4a1cd7cc368763de2fe25b8ea64ea803c08Marcin Slusarz align >> PAGE_SHIFT, false, NULL, acc_size, 342f4f4e3e3e9f3bde110067b9e4487cb267d90055aMaarten Lankhorst NULL, NULL, ast_bo_ttm_destroy); 343312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) 344312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 345312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 346312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie *pastbo = astbo; 347312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 348312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 349312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 350312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airliestatic inline u64 ast_bo_gpu_offset(struct ast_bo *bo) 351312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 352312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return bo->bo.offset; 353312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 354312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 355312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr) 356312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 357312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int i, ret; 358312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 359312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (bo->pin_count) { 360312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->pin_count++; 361312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (gpu_addr) 362312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie *gpu_addr = ast_bo_gpu_offset(bo); 363312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 364312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 365312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast_ttm_placement(bo, pl_flag); 366312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie for (i = 0; i < bo->placement.num_placement; i++) 367f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 36897a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 369312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) 370312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 371312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 372312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->pin_count = 1; 373312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (gpu_addr) 374312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie *gpu_addr = ast_bo_gpu_offset(bo); 375312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 376312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 377312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 378312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_bo_unpin(struct ast_bo *bo) 379312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 380312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int i, ret; 381312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!bo->pin_count) { 382312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("unpin bad %p\n", bo); 383312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 384312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 385312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->pin_count--; 386312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (bo->pin_count) 387312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 388312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 389312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie for (i = 0; i < bo->placement.num_placement ; i++) 390f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 39197a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 392312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) 393312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 394312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 395312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 396312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 397312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 398312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_bo_push_sysram(struct ast_bo *bo) 399312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 400312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie int i, ret; 401312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (!bo->pin_count) { 402312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("unpin bad %p\n", bo); 403312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 404312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 405312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie bo->pin_count--; 406312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (bo->pin_count) 407312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 408312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 409312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (bo->kmap.virtual) 410312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ttm_bo_kunmap(&bo->kmap); 411312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 412312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast_ttm_placement(bo, TTM_PL_FLAG_SYSTEM); 413312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie for (i = 0; i < bo->placement.num_placement ; i++) 414f1217ed09f827e42a49ffa6a5aab672aa6f57a65Christian König bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 415312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 41697a875cbdf89a4638eea57c2b456c7cc4e3e8b21Maarten Lankhorst ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false); 417312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (ret) { 418312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie DRM_ERROR("pushing to VRAM failed\n"); 419312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ret; 420312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie } 421312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return 0; 422312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 423312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 424312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlieint ast_mmap(struct file *filp, struct vm_area_struct *vma) 425312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie{ 426312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct drm_file *file_priv; 427312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie struct ast_private *ast; 428312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 429312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET)) 430884c6dabb0eafe7227f099c9e78e514191efaf13Daniel Vetter return -EINVAL; 431312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie 432312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie file_priv = filp->private_data; 433312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie ast = file_priv->minor->dev->dev_private; 434312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie return ttm_bo_mmap(filp, vma, &ast->ttm.bdev); 435312fec1405dd546ddb3fa6387d54e78f604dd8f8Dave Airlie} 436