[go: nahoru, domu]

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