aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2018-10-19 10:55:26 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-11-05 14:21:21 -0500
commita64f784bb14a56bfdfad2dc397dd67e4564e3a29 (patch)
treef2e55af233d82fc8365c4a39d59a897998c3081a /drivers/gpu/drm
parent62b53b37e4b1500d4eb4624a44ad861cf8d3cd18 (diff)
drm/ttm: initialize globals during device init (v2)
Make sure that the global BO state is always correctly initialized. This allows removing all the device code to initialize it. v2: fix up vbox (Alex) Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c59
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h1
-rw-r--r--drivers/gpu/drm/ast/ast_drv.h1
-rw-r--r--drivers/gpu/drm/ast/ast_ttm.c36
-rw-r--r--drivers/gpu/drm/bochs/bochs.h1
-rw-r--r--drivers/gpu/drm/bochs/bochs_mm.c35
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_drv.h1
-rw-r--r--drivers/gpu/drm/cirrus/cirrus_ttm.c36
-rw-r--r--drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h1
-rw-r--r--drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c34
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_drv.h1
-rw-r--r--drivers/gpu/drm/mgag200/mgag200_ttm.c36
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drv.h1
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_ttm.c39
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.h2
-rw-r--r--drivers/gpu/drm/qxl/qxl_ttm.c33
-rw-r--r--drivers/gpu/drm/radeon/radeon.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c39
-rw-r--r--drivers/gpu/drm/ttm/ttm_bo.c19
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_drv.h2
-rw-r--r--drivers/gpu/drm/virtio/virtgpu_ttm.c35
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c11
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h3
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c27
24 files changed, 15 insertions, 440 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index fda252022b15..31fe85dd0b50 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -61,56 +61,6 @@ static int amdgpu_map_buffer(struct ttm_buffer_object *bo,
61static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); 61static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev);
62static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev); 62static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev);
63 63
64/*
65 * Global memory.
66 */
67
68/**
69 * amdgpu_ttm_global_init - Initialize global TTM memory reference structures.
70 *
71 * @adev: AMDGPU device for which the global structures need to be registered.
72 *
73 * This is called as part of the AMDGPU ttm init from amdgpu_ttm_init()
74 * during bring up.
75 */
76static int amdgpu_ttm_global_init(struct amdgpu_device *adev)
77{
78 struct drm_global_reference *global_ref;
79 int r;
80
81 /* ensure reference is false in case init fails */
82 adev->mman.mem_global_referenced = false;
83
84 global_ref = &adev->mman.bo_global_ref.ref;
85 global_ref->global_type = DRM_GLOBAL_TTM_BO;
86 global_ref->size = sizeof(struct ttm_bo_global);
87 global_ref->init = &ttm_bo_global_ref_init;
88 global_ref->release = &ttm_bo_global_ref_release;
89 r = drm_global_item_ref(global_ref);
90 if (r) {
91 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
92 goto error_bo;
93 }
94
95 mutex_init(&adev->mman.gtt_window_lock);
96
97 adev->mman.mem_global_referenced = true;
98
99 return 0;
100
101error_bo:
102 return r;
103}
104
105static void amdgpu_ttm_global_fini(struct amdgpu_device *adev)
106{
107 if (adev->mman.mem_global_referenced) {
108 mutex_destroy(&adev->mman.gtt_window_lock);
109 drm_global_item_unref(&adev->mman.bo_global_ref.ref);
110 adev->mman.mem_global_referenced = false;
111 }
112}
113
114static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 64static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
115{ 65{
116 return 0; 66 return 0;
@@ -1714,14 +1664,10 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
1714 int r; 1664 int r;
1715 u64 vis_vram_limit; 1665 u64 vis_vram_limit;
1716 1666
1717 /* initialize global references for vram/gtt */ 1667 mutex_init(&adev->mman.gtt_window_lock);
1718 r = amdgpu_ttm_global_init(adev); 1668
1719 if (r) {
1720 return r;
1721 }
1722 /* No others user of address space so set it to 0 */ 1669 /* No others user of address space so set it to 0 */
1723 r = ttm_bo_device_init(&adev->mman.bdev, 1670 r = ttm_bo_device_init(&adev->mman.bdev,
1724 adev->mman.bo_global_ref.ref.object,
1725 &amdgpu_bo_driver, 1671 &amdgpu_bo_driver,
1726 adev->ddev->anon_inode->i_mapping, 1672 adev->ddev->anon_inode->i_mapping,
1727 DRM_FILE_PAGE_OFFSET, 1673 DRM_FILE_PAGE_OFFSET,
@@ -1878,7 +1824,6 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
1878 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS); 1824 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS);
1879 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); 1825 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA);
1880 ttm_bo_device_release(&adev->mman.bdev); 1826 ttm_bo_device_release(&adev->mman.bdev);
1881 amdgpu_ttm_global_fini(adev);
1882 adev->mman.initialized = false; 1827 adev->mman.initialized = false;
1883 DRM_INFO("amdgpu: ttm finalized\n"); 1828 DRM_INFO("amdgpu: ttm finalized\n");
1884} 1829}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
index e114f209b701..b5b2d101f7db 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
@@ -39,7 +39,6 @@
39#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2 39#define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2
40 40
41struct amdgpu_mman { 41struct amdgpu_mman {
42 struct ttm_bo_global_ref bo_global_ref;
43 struct ttm_bo_device bdev; 42 struct ttm_bo_device bdev;
44 bool mem_global_referenced; 43 bool mem_global_referenced;
45 bool initialized; 44 bool initialized;
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 6ae11a477643..bfc65040dfcb 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -104,7 +104,6 @@ struct ast_private {
104 int fb_mtrr; 104 int fb_mtrr;
105 105
106 struct { 106 struct {
107 struct ttm_bo_global_ref bo_global_ref;
108 struct ttm_bo_device bdev; 107 struct ttm_bo_device bdev;
109 } ttm; 108 } ttm;
110 109
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index 8a59d6fc1160..c168d62fe8f9 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -36,35 +36,6 @@ ast_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct ast_private, ttm.bdev); 36 return container_of(bd, struct ast_private, ttm.bdev);
37} 37}
38 38
39static int ast_ttm_global_init(struct ast_private *ast)
40{
41 struct drm_global_reference *global_ref;
42 int r;
43
44 global_ref = &ast->ttm.bo_global_ref.ref;
45 global_ref->global_type = DRM_GLOBAL_TTM_BO;
46 global_ref->size = sizeof(struct ttm_bo_global);
47 global_ref->init = &ttm_bo_global_ref_init;
48 global_ref->release = &ttm_bo_global_ref_release;
49 r = drm_global_item_ref(global_ref);
50 if (r != 0) {
51 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
52 return r;
53 }
54 return 0;
55}
56
57static void
58ast_ttm_global_release(struct ast_private *ast)
59{
60 if (ast->ttm.bo_global_ref.ref.release == NULL)
61 return;
62
63 drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
64 ast->ttm.bo_global_ref.ref.release = NULL;
65}
66
67
68static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo)
69{ 40{
70 struct ast_bo *bo; 41 struct ast_bo *bo;
@@ -204,12 +175,7 @@ int ast_mm_init(struct ast_private *ast)
204 struct drm_device *dev = ast->dev; 175 struct drm_device *dev = ast->dev;
205 struct ttm_bo_device *bdev = &ast->ttm.bdev; 176 struct ttm_bo_device *bdev = &ast->ttm.bdev;
206 177
207 ret = ast_ttm_global_init(ast);
208 if (ret)
209 return ret;
210
211 ret = ttm_bo_device_init(&ast->ttm.bdev, 178 ret = ttm_bo_device_init(&ast->ttm.bdev,
212 ast->ttm.bo_global_ref.ref.object,
213 &ast_bo_driver, 179 &ast_bo_driver,
214 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
215 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -240,8 +206,6 @@ void ast_mm_fini(struct ast_private *ast)
240 206
241 ttm_bo_device_release(&ast->ttm.bdev); 207 ttm_bo_device_release(&ast->ttm.bdev);
242 208
243 ast_ttm_global_release(ast);
244
245 arch_phys_wc_del(ast->fb_mtrr); 209 arch_phys_wc_del(ast->fb_mtrr);
246 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 210 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
247 pci_resource_len(dev->pdev, 0)); 211 pci_resource_len(dev->pdev, 0));
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index a035257d1b56..75e4cf6cda5d 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -76,7 +76,6 @@ struct bochs_device {
76 76
77 /* ttm */ 77 /* ttm */
78 struct { 78 struct {
79 struct ttm_bo_global_ref bo_global_ref;
80 struct ttm_bo_device bdev; 79 struct ttm_bo_device bdev;
81 bool initialized; 80 bool initialized;
82 } ttm; 81 } ttm;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index c697d456656f..3bd773ef78dd 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -16,35 +16,6 @@ static inline struct bochs_device *bochs_bdev(struct ttm_bo_device *bd)
16 return container_of(bd, struct bochs_device, ttm.bdev); 16 return container_of(bd, struct bochs_device, ttm.bdev);
17} 17}
18 18
19static int bochs_ttm_global_init(struct bochs_device *bochs)
20{
21 struct drm_global_reference *global_ref;
22 int r;
23
24 global_ref = &bochs->ttm.bo_global_ref.ref;
25 global_ref->global_type = DRM_GLOBAL_TTM_BO;
26 global_ref->size = sizeof(struct ttm_bo_global);
27 global_ref->init = &ttm_bo_global_ref_init;
28 global_ref->release = &ttm_bo_global_ref_release;
29 r = drm_global_item_ref(global_ref);
30 if (r != 0) {
31 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
32 return r;
33 }
34
35 return 0;
36}
37
38static void bochs_ttm_global_release(struct bochs_device *bochs)
39{
40 if (bochs->ttm.bo_global_ref.ref.release == NULL)
41 return;
42
43 drm_global_item_unref(&bochs->ttm.bo_global_ref.ref);
44 bochs->ttm.bo_global_ref.ref.release = NULL;
45}
46
47
48static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo) 19static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo)
49{ 20{
50 struct bochs_bo *bo; 21 struct bochs_bo *bo;
@@ -182,12 +153,7 @@ int bochs_mm_init(struct bochs_device *bochs)
182 struct ttm_bo_device *bdev = &bochs->ttm.bdev; 153 struct ttm_bo_device *bdev = &bochs->ttm.bdev;
183 int ret; 154 int ret;
184 155
185 ret = bochs_ttm_global_init(bochs);
186 if (ret)
187 return ret;
188
189 ret = ttm_bo_device_init(&bochs->ttm.bdev, 156 ret = ttm_bo_device_init(&bochs->ttm.bdev,
190 bochs->ttm.bo_global_ref.ref.object,
191 &bochs_bo_driver, 157 &bochs_bo_driver,
192 bochs->dev->anon_inode->i_mapping, 158 bochs->dev->anon_inode->i_mapping,
193 DRM_FILE_PAGE_OFFSET, 159 DRM_FILE_PAGE_OFFSET,
@@ -214,7 +180,6 @@ void bochs_mm_fini(struct bochs_device *bochs)
214 return; 180 return;
215 181
216 ttm_bo_device_release(&bochs->ttm.bdev); 182 ttm_bo_device_release(&bochs->ttm.bdev);
217 bochs_ttm_global_release(bochs);
218 bochs->ttm.initialized = false; 183 bochs->ttm.initialized = false;
219} 184}
220 185
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 01852fbda9da..f2b2e0d169fa 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -136,7 +136,6 @@ struct cirrus_device {
136 int fb_mtrr; 136 int fb_mtrr;
137 137
138 struct { 138 struct {
139 struct ttm_bo_global_ref bo_global_ref;
140 struct ttm_bo_device bdev; 139 struct ttm_bo_device bdev;
141 } ttm; 140 } ttm;
142 bool mm_inited; 141 bool mm_inited;
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 7801c56c3c9b..e075810b4bd4 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -36,35 +36,6 @@ cirrus_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct cirrus_device, ttm.bdev); 36 return container_of(bd, struct cirrus_device, ttm.bdev);
37} 37}
38 38
39static int cirrus_ttm_global_init(struct cirrus_device *cirrus)
40{
41 struct drm_global_reference *global_ref;
42 int r;
43
44 global_ref = &cirrus->ttm.bo_global_ref.ref;
45 global_ref->global_type = DRM_GLOBAL_TTM_BO;
46 global_ref->size = sizeof(struct ttm_bo_global);
47 global_ref->init = &ttm_bo_global_ref_init;
48 global_ref->release = &ttm_bo_global_ref_release;
49 r = drm_global_item_ref(global_ref);
50 if (r != 0) {
51 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
52 return r;
53 }
54 return 0;
55}
56
57static void
58cirrus_ttm_global_release(struct cirrus_device *cirrus)
59{
60 if (cirrus->ttm.bo_global_ref.ref.release == NULL)
61 return;
62
63 drm_global_item_unref(&cirrus->ttm.bo_global_ref.ref);
64 cirrus->ttm.bo_global_ref.ref.release = NULL;
65}
66
67
68static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo)
69{ 40{
70 struct cirrus_bo *bo; 41 struct cirrus_bo *bo;
@@ -204,12 +175,7 @@ int cirrus_mm_init(struct cirrus_device *cirrus)
204 struct drm_device *dev = cirrus->dev; 175 struct drm_device *dev = cirrus->dev;
205 struct ttm_bo_device *bdev = &cirrus->ttm.bdev; 176 struct ttm_bo_device *bdev = &cirrus->ttm.bdev;
206 177
207 ret = cirrus_ttm_global_init(cirrus);
208 if (ret)
209 return ret;
210
211 ret = ttm_bo_device_init(&cirrus->ttm.bdev, 178 ret = ttm_bo_device_init(&cirrus->ttm.bdev,
212 cirrus->ttm.bo_global_ref.ref.object,
213 &cirrus_bo_driver, 179 &cirrus_bo_driver,
214 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
215 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -245,8 +211,6 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
245 211
246 ttm_bo_device_release(&cirrus->ttm.bdev); 212 ttm_bo_device_release(&cirrus->ttm.bdev);
247 213
248 cirrus_ttm_global_release(cirrus);
249
250 arch_phys_wc_del(cirrus->fb_mtrr); 214 arch_phys_wc_del(cirrus->fb_mtrr);
251 cirrus->fb_mtrr = 0; 215 cirrus->fb_mtrr = 0;
252 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 216 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
index 60479502e277..3c168ae77b0c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
@@ -49,7 +49,6 @@ struct hibmc_drm_private {
49 bool mode_config_initialized; 49 bool mode_config_initialized;
50 50
51 /* ttm */ 51 /* ttm */
52 struct ttm_bo_global_ref bo_global_ref;
53 struct ttm_bo_device bdev; 52 struct ttm_bo_device bdev;
54 bool initialized; 53 bool initialized;
55 54
diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
index 14071c849121..dd383267884c 100644
--- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
+++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
@@ -29,32 +29,6 @@ hibmc_bdev(struct ttm_bo_device *bd)
29 return container_of(bd, struct hibmc_drm_private, bdev); 29 return container_of(bd, struct hibmc_drm_private, bdev);
30} 30}
31 31
32static int hibmc_ttm_global_init(struct hibmc_drm_private *hibmc)
33{
34 int ret;
35
36 hibmc->bo_global_ref.ref.global_type = DRM_GLOBAL_TTM_BO;
37 hibmc->bo_global_ref.ref.size = sizeof(struct ttm_bo_global);
38 hibmc->bo_global_ref.ref.init = &ttm_bo_global_ref_init;
39 hibmc->bo_global_ref.ref.release = &ttm_bo_global_ref_release;
40 ret = drm_global_item_ref(&hibmc->bo_global_ref.ref);
41 if (ret) {
42 DRM_ERROR("failed setting up TTM BO subsystem: %d\n", ret);
43 return ret;
44 }
45 return 0;
46}
47
48static void
49hibmc_ttm_global_release(struct hibmc_drm_private *hibmc)
50{
51 if (hibmc->bo_global_ref.ref.release == NULL)
52 return;
53
54 drm_global_item_unref(&hibmc->bo_global_ref.ref);
55 hibmc->bo_global_ref.ref.release = NULL;
56}
57
58static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo) 32static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo)
59{ 33{
60 struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo); 34 struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo);
@@ -214,18 +188,12 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
214 struct drm_device *dev = hibmc->dev; 188 struct drm_device *dev = hibmc->dev;
215 struct ttm_bo_device *bdev = &hibmc->bdev; 189 struct ttm_bo_device *bdev = &hibmc->bdev;
216 190
217 ret = hibmc_ttm_global_init(hibmc);
218 if (ret)
219 return ret;
220
221 ret = ttm_bo_device_init(&hibmc->bdev, 191 ret = ttm_bo_device_init(&hibmc->bdev,
222 hibmc->bo_global_ref.ref.object,
223 &hibmc_bo_driver, 192 &hibmc_bo_driver,
224 dev->anon_inode->i_mapping, 193 dev->anon_inode->i_mapping,
225 DRM_FILE_PAGE_OFFSET, 194 DRM_FILE_PAGE_OFFSET,
226 true); 195 true);
227 if (ret) { 196 if (ret) {
228 hibmc_ttm_global_release(hibmc);
229 DRM_ERROR("error initializing bo driver: %d\n", ret); 197 DRM_ERROR("error initializing bo driver: %d\n", ret);
230 return ret; 198 return ret;
231 } 199 }
@@ -233,7 +201,6 @@ int hibmc_mm_init(struct hibmc_drm_private *hibmc)
233 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 201 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM,
234 hibmc->fb_size >> PAGE_SHIFT); 202 hibmc->fb_size >> PAGE_SHIFT);
235 if (ret) { 203 if (ret) {
236 hibmc_ttm_global_release(hibmc);
237 DRM_ERROR("failed ttm VRAM init: %d\n", ret); 204 DRM_ERROR("failed ttm VRAM init: %d\n", ret);
238 return ret; 205 return ret;
239 } 206 }
@@ -248,7 +215,6 @@ void hibmc_mm_fini(struct hibmc_drm_private *hibmc)
248 return; 215 return;
249 216
250 ttm_bo_device_release(&hibmc->bdev); 217 ttm_bo_device_release(&hibmc->bdev);
251 hibmc_ttm_global_release(hibmc);
252 hibmc->mm_inited = false; 218 hibmc->mm_inited = false;
253} 219}
254 220
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index e5348955a3cc..0aaedc554879 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -212,7 +212,6 @@ struct mga_device {
212 int fb_mtrr; 212 int fb_mtrr;
213 213
214 struct { 214 struct {
215 struct ttm_bo_global_ref bo_global_ref;
216 struct ttm_bo_device bdev; 215 struct ttm_bo_device bdev;
217 } ttm; 216 } ttm;
218 217
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 11bdc8121a7d..d96a9b32455e 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -36,35 +36,6 @@ mgag200_bdev(struct ttm_bo_device *bd)
36 return container_of(bd, struct mga_device, ttm.bdev); 36 return container_of(bd, struct mga_device, ttm.bdev);
37} 37}
38 38
39static int mgag200_ttm_global_init(struct mga_device *ast)
40{
41 struct drm_global_reference *global_ref;
42 int r;
43
44 global_ref = &ast->ttm.bo_global_ref.ref;
45 global_ref->global_type = DRM_GLOBAL_TTM_BO;
46 global_ref->size = sizeof(struct ttm_bo_global);
47 global_ref->init = &ttm_bo_global_ref_init;
48 global_ref->release = &ttm_bo_global_ref_release;
49 r = drm_global_item_ref(global_ref);
50 if (r != 0) {
51 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
52 return r;
53 }
54 return 0;
55}
56
57static void
58mgag200_ttm_global_release(struct mga_device *ast)
59{
60 if (ast->ttm.bo_global_ref.ref.release == NULL)
61 return;
62
63 drm_global_item_unref(&ast->ttm.bo_global_ref.ref);
64 ast->ttm.bo_global_ref.ref.release = NULL;
65}
66
67
68static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo) 39static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo)
69{ 40{
70 struct mgag200_bo *bo; 41 struct mgag200_bo *bo;
@@ -204,12 +175,7 @@ int mgag200_mm_init(struct mga_device *mdev)
204 struct drm_device *dev = mdev->dev; 175 struct drm_device *dev = mdev->dev;
205 struct ttm_bo_device *bdev = &mdev->ttm.bdev; 176 struct ttm_bo_device *bdev = &mdev->ttm.bdev;
206 177
207 ret = mgag200_ttm_global_init(mdev);
208 if (ret)
209 return ret;
210
211 ret = ttm_bo_device_init(&mdev->ttm.bdev, 178 ret = ttm_bo_device_init(&mdev->ttm.bdev,
212 mdev->ttm.bo_global_ref.ref.object,
213 &mgag200_bo_driver, 179 &mgag200_bo_driver,
214 dev->anon_inode->i_mapping, 180 dev->anon_inode->i_mapping,
215 DRM_FILE_PAGE_OFFSET, 181 DRM_FILE_PAGE_OFFSET,
@@ -240,8 +206,6 @@ void mgag200_mm_fini(struct mga_device *mdev)
240 206
241 ttm_bo_device_release(&mdev->ttm.bdev); 207 ttm_bo_device_release(&mdev->ttm.bdev);
242 208
243 mgag200_ttm_global_release(mdev);
244
245 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 209 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
246 pci_resource_len(dev->pdev, 0)); 210 pci_resource_len(dev->pdev, 0));
247 arch_phys_wc_del(mdev->fb_mtrr); 211 arch_phys_wc_del(mdev->fb_mtrr);
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 0f3bb1a11fc9..d20b9ba4b1c1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -146,7 +146,6 @@ struct nouveau_drm {
146 146
147 /* TTM interface support */ 147 /* TTM interface support */
148 struct { 148 struct {
149 struct ttm_bo_global_ref bo_global_ref;
150 struct ttm_bo_device bdev; 149 struct ttm_bo_device bdev;
151 atomic_t validate_sequence; 150 atomic_t validate_sequence;
152 int (*move)(struct nouveau_channel *, 151 int (*move)(struct nouveau_channel *,
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index 69448b02649e..1543c2f8d3d3 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -174,38 +174,6 @@ nouveau_ttm_mmap(struct file *filp, struct vm_area_struct *vma)
174 return ttm_bo_mmap(filp, vma, &drm->ttm.bdev); 174 return ttm_bo_mmap(filp, vma, &drm->ttm.bdev);
175} 175}
176 176
177int
178nouveau_ttm_global_init(struct nouveau_drm *drm)
179{
180 struct drm_global_reference *global_ref;
181 int ret;
182
183 global_ref = &drm->ttm.bo_global_ref.ref;
184 global_ref->global_type = DRM_GLOBAL_TTM_BO;
185 global_ref->size = sizeof(struct ttm_bo_global);
186 global_ref->init = &ttm_bo_global_ref_init;
187 global_ref->release = &ttm_bo_global_ref_release;
188
189 ret = drm_global_item_ref(global_ref);
190 if (unlikely(ret != 0)) {
191 DRM_ERROR("Failed setting up TTM BO subsystem\n");
192 drm->ttm.bo_global_ref.ref.release = NULL;
193 return ret;
194 }
195
196 return 0;
197}
198
199void
200nouveau_ttm_global_release(struct nouveau_drm *drm)
201{
202 if (drm->ttm.bo_global_ref.ref.release == NULL)
203 return;
204
205 drm_global_item_unref(&drm->ttm.bo_global_ref.ref);
206 drm->ttm.bo_global_ref.ref.release = NULL;
207}
208
209static int 177static int
210nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind) 178nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind)
211{ 179{
@@ -268,12 +236,7 @@ nouveau_ttm_init(struct nouveau_drm *drm)
268 drm->agp.cma = pci->agp.cma; 236 drm->agp.cma = pci->agp.cma;
269 } 237 }
270 238
271 ret = nouveau_ttm_global_init(drm);
272 if (ret)
273 return ret;
274
275 ret = ttm_bo_device_init(&drm->ttm.bdev, 239 ret = ttm_bo_device_init(&drm->ttm.bdev,
276 drm->ttm.bo_global_ref.ref.object,
277 &nouveau_bo_driver, 240 &nouveau_bo_driver,
278 dev->anon_inode->i_mapping, 241 dev->anon_inode->i_mapping,
279 DRM_FILE_PAGE_OFFSET, 242 DRM_FILE_PAGE_OFFSET,
@@ -328,8 +291,6 @@ nouveau_ttm_fini(struct nouveau_drm *drm)
328 291
329 ttm_bo_device_release(&drm->ttm.bdev); 292 ttm_bo_device_release(&drm->ttm.bdev);
330 293
331 nouveau_ttm_global_release(drm);
332
333 arch_phys_wc_del(drm->ttm.mtrr); 294 arch_phys_wc_del(drm->ttm.mtrr);
334 drm->ttm.mtrr = 0; 295 drm->ttm.mtrr = 0;
335 arch_io_free_memtype_wc(device->func->resource_addr(device, 1), 296 arch_io_free_memtype_wc(device->func->resource_addr(device, 1),
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 52912e54e990..2310d6e9ff1f 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -127,8 +127,6 @@ struct qxl_output {
127#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc) 127#define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
128 128
129struct qxl_mman { 129struct qxl_mman {
130 struct ttm_bo_global_ref bo_global_ref;
131 bool mem_global_referenced;
132 struct ttm_bo_device bdev; 130 struct ttm_bo_device bdev;
133}; 131};
134 132
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index bb8cc9b16780..1468fddc19d0 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -46,34 +46,6 @@ static struct qxl_device *qxl_get_qdev(struct ttm_bo_device *bdev)
46 return qdev; 46 return qdev;
47} 47}
48 48
49static int qxl_ttm_global_init(struct qxl_device *qdev)
50{
51 struct drm_global_reference *global_ref;
52 int r;
53
54 global_ref = &qdev->mman.bo_global_ref.ref;
55 global_ref->global_type = DRM_GLOBAL_TTM_BO;
56 global_ref->size = sizeof(struct ttm_bo_global);
57 global_ref->init = &ttm_bo_global_ref_init;
58 global_ref->release = &ttm_bo_global_ref_release;
59 r = drm_global_item_ref(global_ref);
60 if (r != 0) {
61 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
62 return r;
63 }
64
65 qdev->mman.mem_global_referenced = true;
66 return 0;
67}
68
69static void qxl_ttm_global_fini(struct qxl_device *qdev)
70{
71 if (qdev->mman.mem_global_referenced) {
72 drm_global_item_unref(&qdev->mman.bo_global_ref.ref);
73 qdev->mman.mem_global_referenced = false;
74 }
75}
76
77static struct vm_operations_struct qxl_ttm_vm_ops; 49static struct vm_operations_struct qxl_ttm_vm_ops;
78static const struct vm_operations_struct *ttm_vm_ops; 50static const struct vm_operations_struct *ttm_vm_ops;
79 51
@@ -345,12 +317,8 @@ int qxl_ttm_init(struct qxl_device *qdev)
345 int r; 317 int r;
346 int num_io_pages; /* != rom->num_io_pages, we include surface0 */ 318 int num_io_pages; /* != rom->num_io_pages, we include surface0 */
347 319
348 r = qxl_ttm_global_init(qdev);
349 if (r)
350 return r;
351 /* No others user of address space so set it to 0 */ 320 /* No others user of address space so set it to 0 */
352 r = ttm_bo_device_init(&qdev->mman.bdev, 321 r = ttm_bo_device_init(&qdev->mman.bdev,
353 qdev->mman.bo_global_ref.ref.object,
354 &qxl_bo_driver, 322 &qxl_bo_driver,
355 qdev->ddev.anon_inode->i_mapping, 323 qdev->ddev.anon_inode->i_mapping,
356 DRM_FILE_PAGE_OFFSET, 0); 324 DRM_FILE_PAGE_OFFSET, 0);
@@ -386,7 +354,6 @@ void qxl_ttm_fini(struct qxl_device *qdev)
386 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM); 354 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM);
387 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV); 355 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV);
388 ttm_bo_device_release(&qdev->mman.bdev); 356 ttm_bo_device_release(&qdev->mman.bdev);
389 qxl_ttm_global_fini(qdev);
390 DRM_INFO("qxl: ttm finalized\n"); 357 DRM_INFO("qxl: ttm finalized\n");
391} 358}
392 359
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 06fb952b6290..32808e50be12 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -448,9 +448,7 @@ struct radeon_surface_reg {
448 * TTM. 448 * TTM.
449 */ 449 */
450struct radeon_mman { 450struct radeon_mman {
451 struct ttm_bo_global_ref bo_global_ref;
452 struct ttm_bo_device bdev; 451 struct ttm_bo_device bdev;
453 bool mem_global_referenced;
454 bool initialized; 452 bool initialized;
455 453
456#if defined(CONFIG_DEBUG_FS) 454#if defined(CONFIG_DEBUG_FS)
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 2104429ddbac..9920a6fc11bf 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -60,39 +60,6 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)
60 return rdev; 60 return rdev;
61} 61}
62 62
63
64/*
65 * Global memory.
66 */
67static int radeon_ttm_global_init(struct radeon_device *rdev)
68{
69 struct drm_global_reference *global_ref;
70 int r;
71
72 rdev->mman.mem_global_referenced = false;
73 global_ref = &rdev->mman.bo_global_ref.ref;
74 global_ref->global_type = DRM_GLOBAL_TTM_BO;
75 global_ref->size = sizeof(struct ttm_bo_global);
76 global_ref->init = &ttm_bo_global_ref_init;
77 global_ref->release = &ttm_bo_global_ref_release;
78 r = drm_global_item_ref(global_ref);
79 if (r != 0) {
80 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
81 return r;
82 }
83
84 rdev->mman.mem_global_referenced = true;
85 return 0;
86}
87
88static void radeon_ttm_global_fini(struct radeon_device *rdev)
89{
90 if (rdev->mman.mem_global_referenced) {
91 drm_global_item_unref(&rdev->mman.bo_global_ref.ref);
92 rdev->mman.mem_global_referenced = false;
93 }
94}
95
96static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 63static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
97{ 64{
98 return 0; 65 return 0;
@@ -821,13 +788,8 @@ int radeon_ttm_init(struct radeon_device *rdev)
821{ 788{
822 int r; 789 int r;
823 790
824 r = radeon_ttm_global_init(rdev);
825 if (r) {
826 return r;
827 }
828 /* No others user of address space so set it to 0 */ 791 /* No others user of address space so set it to 0 */
829 r = ttm_bo_device_init(&rdev->mman.bdev, 792 r = ttm_bo_device_init(&rdev->mman.bdev,
830 rdev->mman.bo_global_ref.ref.object,
831 &radeon_bo_driver, 793 &radeon_bo_driver,
832 rdev->ddev->anon_inode->i_mapping, 794 rdev->ddev->anon_inode->i_mapping,
833 DRM_FILE_PAGE_OFFSET, 795 DRM_FILE_PAGE_OFFSET,
@@ -899,7 +861,6 @@ void radeon_ttm_fini(struct radeon_device *rdev)
899 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT); 861 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
900 ttm_bo_device_release(&rdev->mman.bdev); 862 ttm_bo_device_release(&rdev->mman.bdev);
901 radeon_gart_fini(rdev); 863 radeon_gart_fini(rdev);
902 radeon_ttm_global_fini(rdev);
903 rdev->mman.initialized = false; 864 rdev->mman.initialized = false;
904 DRM_INFO("radeon: ttm finalized\n"); 865 DRM_INFO("radeon: ttm finalized\n");
905} 866}
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index d89183f95570..df028805b7e2 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -1530,7 +1530,7 @@ static void ttm_bo_global_kobj_release(struct kobject *kobj)
1530 kfree(glob); 1530 kfree(glob);
1531} 1531}
1532 1532
1533void ttm_bo_global_release(void) 1533static void ttm_bo_global_release(void)
1534{ 1534{
1535 struct ttm_bo_global *glob = &ttm_bo_glob; 1535 struct ttm_bo_global *glob = &ttm_bo_glob;
1536 1536
@@ -1544,9 +1544,8 @@ void ttm_bo_global_release(void)
1544out: 1544out:
1545 mutex_unlock(&ttm_global_mutex); 1545 mutex_unlock(&ttm_global_mutex);
1546} 1546}
1547EXPORT_SYMBOL(ttm_bo_global_release);
1548 1547
1549int ttm_bo_global_init(void) 1548static int ttm_bo_global_init(void)
1550{ 1549{
1551 struct ttm_bo_global *glob = &ttm_bo_glob; 1550 struct ttm_bo_global *glob = &ttm_bo_glob;
1552 int ret = 0; 1551 int ret = 0;
@@ -1583,8 +1582,6 @@ out:
1583 mutex_unlock(&ttm_global_mutex); 1582 mutex_unlock(&ttm_global_mutex);
1584 return ret; 1583 return ret;
1585} 1584}
1586EXPORT_SYMBOL(ttm_bo_global_init);
1587
1588 1585
1589int ttm_bo_device_release(struct ttm_bo_device *bdev) 1586int ttm_bo_device_release(struct ttm_bo_device *bdev)
1590{ 1587{
@@ -1623,18 +1620,25 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
1623 1620
1624 drm_vma_offset_manager_destroy(&bdev->vma_manager); 1621 drm_vma_offset_manager_destroy(&bdev->vma_manager);
1625 1622
1623 if (!ret)
1624 ttm_bo_global_release();
1625
1626 return ret; 1626 return ret;
1627} 1627}
1628EXPORT_SYMBOL(ttm_bo_device_release); 1628EXPORT_SYMBOL(ttm_bo_device_release);
1629 1629
1630int ttm_bo_device_init(struct ttm_bo_device *bdev, 1630int ttm_bo_device_init(struct ttm_bo_device *bdev,
1631 struct ttm_bo_global *glob,
1632 struct ttm_bo_driver *driver, 1631 struct ttm_bo_driver *driver,
1633 struct address_space *mapping, 1632 struct address_space *mapping,
1634 uint64_t file_page_offset, 1633 uint64_t file_page_offset,
1635 bool need_dma32) 1634 bool need_dma32)
1636{ 1635{
1637 int ret = -EINVAL; 1636 struct ttm_bo_global *glob = &ttm_bo_glob;
1637 int ret;
1638
1639 ret = ttm_bo_global_init();
1640 if (ret)
1641 return ret;
1638 1642
1639 bdev->driver = driver; 1643 bdev->driver = driver;
1640 1644
@@ -1661,6 +1665,7 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
1661 1665
1662 return 0; 1666 return 0;
1663out_no_sys: 1667out_no_sys:
1668 ttm_bo_global_release();
1664 return ret; 1669 return ret;
1665} 1670}
1666EXPORT_SYMBOL(ttm_bo_device_init); 1671EXPORT_SYMBOL(ttm_bo_device_init);
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index d9756b59e329..1acbf182536f 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -142,8 +142,6 @@ struct virtio_gpu_fbdev {
142}; 142};
143 143
144struct virtio_gpu_mman { 144struct virtio_gpu_mman {
145 struct ttm_bo_global_ref bo_global_ref;
146 bool mem_global_referenced;
147 struct ttm_bo_device bdev; 145 struct ttm_bo_device bdev;
148}; 146};
149 147
diff --git a/drivers/gpu/drm/virtio/virtgpu_ttm.c b/drivers/gpu/drm/virtio/virtgpu_ttm.c
index 8510109e09da..8fc088d5ef0d 100644
--- a/drivers/gpu/drm/virtio/virtgpu_ttm.c
+++ b/drivers/gpu/drm/virtio/virtgpu_ttm.c
@@ -50,35 +50,6 @@ virtio_gpu_device *virtio_gpu_get_vgdev(struct ttm_bo_device *bdev)
50 return vgdev; 50 return vgdev;
51} 51}
52 52
53static int virtio_gpu_ttm_global_init(struct virtio_gpu_device *vgdev)
54{
55 struct drm_global_reference *global_ref;
56 int r;
57
58 vgdev->mman.mem_global_referenced = false;
59 global_ref = &vgdev->mman.bo_global_ref.ref;
60 global_ref->global_type = DRM_GLOBAL_TTM_BO;
61 global_ref->size = sizeof(struct ttm_bo_global);
62 global_ref->init = &ttm_bo_global_ref_init;
63 global_ref->release = &ttm_bo_global_ref_release;
64 r = drm_global_item_ref(global_ref);
65 if (r != 0) {
66 DRM_ERROR("Failed setting up TTM BO subsystem.\n");
67 return r;
68 }
69
70 vgdev->mman.mem_global_referenced = true;
71 return 0;
72}
73
74static void virtio_gpu_ttm_global_fini(struct virtio_gpu_device *vgdev)
75{
76 if (vgdev->mman.mem_global_referenced) {
77 drm_global_item_unref(&vgdev->mman.bo_global_ref.ref);
78 vgdev->mman.mem_global_referenced = false;
79 }
80}
81
82int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma) 53int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma)
83{ 54{
84 struct drm_file *file_priv; 55 struct drm_file *file_priv;
@@ -356,12 +327,8 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
356{ 327{
357 int r; 328 int r;
358 329
359 r = virtio_gpu_ttm_global_init(vgdev);
360 if (r)
361 return r;
362 /* No others user of address space so set it to 0 */ 330 /* No others user of address space so set it to 0 */
363 r = ttm_bo_device_init(&vgdev->mman.bdev, 331 r = ttm_bo_device_init(&vgdev->mman.bdev,
364 vgdev->mman.bo_global_ref.ref.object,
365 &virtio_gpu_bo_driver, 332 &virtio_gpu_bo_driver,
366 vgdev->ddev->anon_inode->i_mapping, 333 vgdev->ddev->anon_inode->i_mapping,
367 DRM_FILE_PAGE_OFFSET, 0); 334 DRM_FILE_PAGE_OFFSET, 0);
@@ -380,13 +347,11 @@ int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
380err_mm_init: 347err_mm_init:
381 ttm_bo_device_release(&vgdev->mman.bdev); 348 ttm_bo_device_release(&vgdev->mman.bdev);
382err_dev_init: 349err_dev_init:
383 virtio_gpu_ttm_global_fini(vgdev);
384 return r; 350 return r;
385} 351}
386 352
387void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev) 353void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev)
388{ 354{
389 ttm_bo_device_release(&vgdev->mman.bdev); 355 ttm_bo_device_release(&vgdev->mman.bdev);
390 virtio_gpu_ttm_global_fini(vgdev);
391 DRM_INFO("virtio_gpu: ttm finalized\n"); 356 DRM_INFO("virtio_gpu: ttm finalized\n");
392} 357}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 67494148accd..b9c078860a7c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -801,11 +801,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
801 DRM_INFO("MMIO at 0x%08x size is %u kiB\n", 801 DRM_INFO("MMIO at 0x%08x size is %u kiB\n",
802 dev_priv->mmio_start, dev_priv->mmio_size / 1024); 802 dev_priv->mmio_start, dev_priv->mmio_size / 1024);
803 803
804 ret = vmw_ttm_global_init(dev_priv);
805 if (unlikely(ret != 0))
806 goto out_err0;
807
808
809 vmw_master_init(&dev_priv->fbdev_master); 804 vmw_master_init(&dev_priv->fbdev_master);
810 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); 805 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
811 dev_priv->active_master = &dev_priv->fbdev_master; 806 dev_priv->active_master = &dev_priv->fbdev_master;
@@ -816,7 +811,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
816 if (unlikely(dev_priv->mmio_virt == NULL)) { 811 if (unlikely(dev_priv->mmio_virt == NULL)) {
817 ret = -ENOMEM; 812 ret = -ENOMEM;
818 DRM_ERROR("Failed mapping MMIO.\n"); 813 DRM_ERROR("Failed mapping MMIO.\n");
819 goto out_err3; 814 goto out_err0;
820 } 815 }
821 816
822 /* Need mmio memory to check for fifo pitchlock cap. */ 817 /* Need mmio memory to check for fifo pitchlock cap. */
@@ -870,7 +865,6 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
870 } 865 }
871 866
872 ret = ttm_bo_device_init(&dev_priv->bdev, 867 ret = ttm_bo_device_init(&dev_priv->bdev,
873 dev_priv->bo_global_ref.ref.object,
874 &vmw_bo_driver, 868 &vmw_bo_driver,
875 dev->anon_inode->i_mapping, 869 dev->anon_inode->i_mapping,
876 VMWGFX_FILE_PAGE_OFFSET, 870 VMWGFX_FILE_PAGE_OFFSET,
@@ -992,8 +986,6 @@ out_no_device:
992 ttm_object_device_release(&dev_priv->tdev); 986 ttm_object_device_release(&dev_priv->tdev);
993out_err4: 987out_err4:
994 memunmap(dev_priv->mmio_virt); 988 memunmap(dev_priv->mmio_virt);
995out_err3:
996 vmw_ttm_global_release(dev_priv);
997out_err0: 989out_err0:
998 for (i = vmw_res_context; i < vmw_res_max; ++i) 990 for (i = vmw_res_context; i < vmw_res_max; ++i)
999 idr_destroy(&dev_priv->res_idr[i]); 991 idr_destroy(&dev_priv->res_idr[i]);
@@ -1045,7 +1037,6 @@ static void vmw_driver_unload(struct drm_device *dev)
1045 memunmap(dev_priv->mmio_virt); 1037 memunmap(dev_priv->mmio_virt);
1046 if (dev_priv->ctx.staged_bindings) 1038 if (dev_priv->ctx.staged_bindings)
1047 vmw_binding_state_free(dev_priv->ctx.staged_bindings); 1039 vmw_binding_state_free(dev_priv->ctx.staged_bindings);
1048 vmw_ttm_global_release(dev_priv);
1049 1040
1050 for (i = vmw_res_context; i < vmw_res_max; ++i) 1041 for (i = vmw_res_context; i < vmw_res_max; ++i)
1051 idr_destroy(&dev_priv->res_idr[i]); 1042 idr_destroy(&dev_priv->res_idr[i]);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 252f202ae897..28df788da44e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -417,7 +417,6 @@ enum {
417 417
418struct vmw_private { 418struct vmw_private {
419 struct ttm_bo_device bdev; 419 struct ttm_bo_device bdev;
420 struct ttm_bo_global_ref bo_global_ref;
421 420
422 struct vmw_fifo_state fifo; 421 struct vmw_fifo_state fifo;
423 422
@@ -841,8 +840,6 @@ extern int vmw_fifo_flush(struct vmw_private *dev_priv,
841 * TTM glue - vmwgfx_ttm_glue.c 840 * TTM glue - vmwgfx_ttm_glue.c
842 */ 841 */
843 842
844extern int vmw_ttm_global_init(struct vmw_private *dev_priv);
845extern void vmw_ttm_global_release(struct vmw_private *dev_priv);
846extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 843extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma);
847 844
848/** 845/**
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
index 0ac473cd5136..154eb09aa91e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
@@ -42,30 +42,3 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
42 dev_priv = vmw_priv(file_priv->minor->dev); 42 dev_priv = vmw_priv(file_priv->minor->dev);
43 return ttm_bo_mmap(filp, vma, &dev_priv->bdev); 43 return ttm_bo_mmap(filp, vma, &dev_priv->bdev);
44} 44}
45
46int vmw_ttm_global_init(struct vmw_private *dev_priv)
47{
48 struct drm_global_reference *global_ref;
49 int ret;
50
51 global_ref = &dev_priv->bo_global_ref.ref;
52 global_ref->global_type = DRM_GLOBAL_TTM_BO;
53 global_ref->size = sizeof(struct ttm_bo_global);
54 global_ref->init = &ttm_bo_global_ref_init;
55 global_ref->release = &ttm_bo_global_ref_release;
56 ret = drm_global_item_ref(global_ref);
57
58 if (unlikely(ret != 0)) {
59 DRM_ERROR("Failed setting up TTM buffer objects.\n");
60 goto out_no_bo;
61 }
62
63 return 0;
64out_no_bo:
65 return ret;
66}
67
68void vmw_ttm_global_release(struct vmw_private *dev_priv)
69{
70 drm_global_item_unref(&dev_priv->bo_global_ref.ref);
71}