diff options
author | Christian König <christian.koenig@amd.com> | 2018-10-19 10:55:26 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-11-05 14:21:21 -0500 |
commit | a64f784bb14a56bfdfad2dc397dd67e4564e3a29 (patch) | |
tree | f2e55af233d82fc8365c4a39d59a897998c3081a /drivers/gpu/drm | |
parent | 62b53b37e4b1500d4eb4624a44ad861cf8d3cd18 (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')
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, | |||
61 | static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); | 61 | static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); |
62 | static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev); | 62 | static 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 | */ | ||
76 | static 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 | |||
101 | error_bo: | ||
102 | return r; | ||
103 | } | ||
104 | |||
105 | static 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 | |||
114 | static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) | 64 | static 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 | ||
41 | struct amdgpu_mman { | 41 | struct 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 | ||
39 | static 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 | |||
57 | static void | ||
58 | ast_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 | |||
68 | static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo) | 39 | static 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 | ||
19 | static 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 | |||
38 | static 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 | |||
48 | static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo) | 19 | static 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 | ||
39 | static 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 | |||
57 | static void | ||
58 | cirrus_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 | |||
68 | static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo) | 39 | static 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 | ||
32 | static 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 | |||
48 | static void | ||
49 | hibmc_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 | |||
58 | static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo) | 32 | static 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 | ||
39 | static 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 | |||
57 | static void | ||
58 | mgag200_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 | |||
68 | static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo) | 39 | static 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 | ||
177 | int | ||
178 | nouveau_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 | |||
199 | void | ||
200 | nouveau_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 | |||
209 | static int | 177 | static int |
210 | nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind) | 178 | nouveau_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 | ||
129 | struct qxl_mman { | 129 | struct 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 | ||
49 | static 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 | |||
69 | static 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 | |||
77 | static struct vm_operations_struct qxl_ttm_vm_ops; | 49 | static struct vm_operations_struct qxl_ttm_vm_ops; |
78 | static const struct vm_operations_struct *ttm_vm_ops; | 50 | static 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 | */ |
450 | struct radeon_mman { | 450 | struct 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 | */ | ||
67 | static 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 | |||
88 | static 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 | |||
96 | static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) | 63 | static 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 | ||
1533 | void ttm_bo_global_release(void) | 1533 | static 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) | |||
1544 | out: | 1544 | out: |
1545 | mutex_unlock(&ttm_global_mutex); | 1545 | mutex_unlock(&ttm_global_mutex); |
1546 | } | 1546 | } |
1547 | EXPORT_SYMBOL(ttm_bo_global_release); | ||
1548 | 1547 | ||
1549 | int ttm_bo_global_init(void) | 1548 | static 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 | } |
1586 | EXPORT_SYMBOL(ttm_bo_global_init); | ||
1587 | |||
1588 | 1585 | ||
1589 | int ttm_bo_device_release(struct ttm_bo_device *bdev) | 1586 | int 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 | } |
1628 | EXPORT_SYMBOL(ttm_bo_device_release); | 1628 | EXPORT_SYMBOL(ttm_bo_device_release); |
1629 | 1629 | ||
1630 | int ttm_bo_device_init(struct ttm_bo_device *bdev, | 1630 | int 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; |
1663 | out_no_sys: | 1667 | out_no_sys: |
1668 | ttm_bo_global_release(); | ||
1664 | return ret; | 1669 | return ret; |
1665 | } | 1670 | } |
1666 | EXPORT_SYMBOL(ttm_bo_device_init); | 1671 | EXPORT_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 | ||
144 | struct virtio_gpu_mman { | 144 | struct 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 | ||
53 | static 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 | |||
74 | static 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 | |||
82 | int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma) | 53 | int 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) | |||
380 | err_mm_init: | 347 | err_mm_init: |
381 | ttm_bo_device_release(&vgdev->mman.bdev); | 348 | ttm_bo_device_release(&vgdev->mman.bdev); |
382 | err_dev_init: | 349 | err_dev_init: |
383 | virtio_gpu_ttm_global_fini(vgdev); | ||
384 | return r; | 350 | return r; |
385 | } | 351 | } |
386 | 352 | ||
387 | void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev) | 353 | void 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); |
993 | out_err4: | 987 | out_err4: |
994 | memunmap(dev_priv->mmio_virt); | 988 | memunmap(dev_priv->mmio_virt); |
995 | out_err3: | ||
996 | vmw_ttm_global_release(dev_priv); | ||
997 | out_err0: | 989 | out_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 | ||
418 | struct vmw_private { | 418 | struct 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 | ||
844 | extern int vmw_ttm_global_init(struct vmw_private *dev_priv); | ||
845 | extern void vmw_ttm_global_release(struct vmw_private *dev_priv); | ||
846 | extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); | 843 | extern 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 | |||
46 | int 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; | ||
64 | out_no_bo: | ||
65 | return ret; | ||
66 | } | ||
67 | |||
68 | void vmw_ttm_global_release(struct vmw_private *dev_priv) | ||
69 | { | ||
70 | drm_global_item_unref(&dev_priv->bo_global_ref.ref); | ||
71 | } | ||