Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Christian König and committed by
Alex Deucher
a64f784b 62b53b37

+17 -521
+2 -57
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 61 61 static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); 62 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 64 static int amdgpu_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 115 65 { 116 66 return 0; ··· 1664 1714 int r; 1665 1715 u64 vis_vram_limit; 1666 1716 1667 - /* initialize global references for vram/gtt */ 1668 - r = amdgpu_ttm_global_init(adev); 1669 - if (r) { 1670 - return r; 1671 - } 1717 + mutex_init(&adev->mman.gtt_window_lock); 1718 + 1672 1719 /* No others user of address space so set it to 0 */ 1673 1720 r = ttm_bo_device_init(&adev->mman.bdev, 1674 - adev->mman.bo_global_ref.ref.object, 1675 1721 &amdgpu_bo_driver, 1676 1722 adev->ddev->anon_inode->i_mapping, 1677 1723 DRM_FILE_PAGE_OFFSET, ··· 1824 1878 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_GWS); 1825 1879 ttm_bo_clean_mm(&adev->mman.bdev, AMDGPU_PL_OA); 1826 1880 ttm_bo_device_release(&adev->mman.bdev); 1827 - amdgpu_ttm_global_fini(adev); 1828 1881 adev->mman.initialized = false; 1829 1882 DRM_INFO("amdgpu: ttm finalized\n"); 1830 1883 }
-1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 39 39 #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2 40 40 41 41 struct amdgpu_mman { 42 - struct ttm_bo_global_ref bo_global_ref; 43 42 struct ttm_bo_device bdev; 44 43 bool mem_global_referenced; 45 44 bool initialized;
-1
drivers/gpu/drm/ast/ast_drv.h
··· 104 104 int fb_mtrr; 105 105 106 106 struct { 107 - struct ttm_bo_global_ref bo_global_ref; 108 107 struct ttm_bo_device bdev; 109 108 } ttm; 110 109
-36
drivers/gpu/drm/ast/ast_ttm.c
··· 36 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 39 static void ast_bo_ttm_destroy(struct ttm_buffer_object *tbo) 69 40 { 70 41 struct ast_bo *bo; ··· 175 204 struct drm_device *dev = ast->dev; 176 205 struct ttm_bo_device *bdev = &ast->ttm.bdev; 177 206 178 - ret = ast_ttm_global_init(ast); 179 - if (ret) 180 - return ret; 181 - 182 207 ret = ttm_bo_device_init(&ast->ttm.bdev, 183 - ast->ttm.bo_global_ref.ref.object, 184 208 &ast_bo_driver, 185 209 dev->anon_inode->i_mapping, 186 210 DRM_FILE_PAGE_OFFSET, ··· 205 239 struct drm_device *dev = ast->dev; 206 240 207 241 ttm_bo_device_release(&ast->ttm.bdev); 208 - 209 - ast_ttm_global_release(ast); 210 242 211 243 arch_phys_wc_del(ast->fb_mtrr); 212 244 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0),
-1
drivers/gpu/drm/bochs/bochs.h
··· 76 76 77 77 /* ttm */ 78 78 struct { 79 - struct ttm_bo_global_ref bo_global_ref; 80 79 struct ttm_bo_device bdev; 81 80 bool initialized; 82 81 } ttm;
-35
drivers/gpu/drm/bochs/bochs_mm.c
··· 16 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 19 static void bochs_bo_ttm_destroy(struct ttm_buffer_object *tbo) 49 20 { 50 21 struct bochs_bo *bo; ··· 153 182 struct ttm_bo_device *bdev = &bochs->ttm.bdev; 154 183 int ret; 155 184 156 - ret = bochs_ttm_global_init(bochs); 157 - if (ret) 158 - return ret; 159 - 160 185 ret = ttm_bo_device_init(&bochs->ttm.bdev, 161 - bochs->ttm.bo_global_ref.ref.object, 162 186 &bochs_bo_driver, 163 187 bochs->dev->anon_inode->i_mapping, 164 188 DRM_FILE_PAGE_OFFSET, ··· 180 214 return; 181 215 182 216 ttm_bo_device_release(&bochs->ttm.bdev); 183 - bochs_ttm_global_release(bochs); 184 217 bochs->ttm.initialized = false; 185 218 } 186 219
-1
drivers/gpu/drm/cirrus/cirrus_drv.h
··· 136 136 int fb_mtrr; 137 137 138 138 struct { 139 - struct ttm_bo_global_ref bo_global_ref; 140 139 struct ttm_bo_device bdev; 141 140 } ttm; 142 141 bool mm_inited;
-36
drivers/gpu/drm/cirrus/cirrus_ttm.c
··· 36 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 39 static void cirrus_bo_ttm_destroy(struct ttm_buffer_object *tbo) 69 40 { 70 41 struct cirrus_bo *bo; ··· 175 204 struct drm_device *dev = cirrus->dev; 176 205 struct ttm_bo_device *bdev = &cirrus->ttm.bdev; 177 206 178 - ret = cirrus_ttm_global_init(cirrus); 179 - if (ret) 180 - return ret; 181 - 182 207 ret = ttm_bo_device_init(&cirrus->ttm.bdev, 183 - cirrus->ttm.bo_global_ref.ref.object, 184 208 &cirrus_bo_driver, 185 209 dev->anon_inode->i_mapping, 186 210 DRM_FILE_PAGE_OFFSET, ··· 210 244 return; 211 245 212 246 ttm_bo_device_release(&cirrus->ttm.bdev); 213 - 214 - cirrus_ttm_global_release(cirrus); 215 247 216 248 arch_phys_wc_del(cirrus->fb_mtrr); 217 249 cirrus->fb_mtrr = 0;
-1
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h
··· 49 49 bool mode_config_initialized; 50 50 51 51 /* ttm */ 52 - struct ttm_bo_global_ref bo_global_ref; 53 52 struct ttm_bo_device bdev; 54 53 bool initialized; 55 54
-34
drivers/gpu/drm/hisilicon/hibmc/hibmc_ttm.c
··· 29 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 32 static void hibmc_bo_ttm_destroy(struct ttm_buffer_object *tbo) 59 33 { 60 34 struct hibmc_bo *bo = container_of(tbo, struct hibmc_bo, bo); ··· 188 214 struct drm_device *dev = hibmc->dev; 189 215 struct ttm_bo_device *bdev = &hibmc->bdev; 190 216 191 - ret = hibmc_ttm_global_init(hibmc); 192 - if (ret) 193 - return ret; 194 - 195 217 ret = ttm_bo_device_init(&hibmc->bdev, 196 - hibmc->bo_global_ref.ref.object, 197 218 &hibmc_bo_driver, 198 219 dev->anon_inode->i_mapping, 199 220 DRM_FILE_PAGE_OFFSET, 200 221 true); 201 222 if (ret) { 202 - hibmc_ttm_global_release(hibmc); 203 223 DRM_ERROR("error initializing bo driver: %d\n", ret); 204 224 return ret; 205 225 } ··· 201 233 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, 202 234 hibmc->fb_size >> PAGE_SHIFT); 203 235 if (ret) { 204 - hibmc_ttm_global_release(hibmc); 205 236 DRM_ERROR("failed ttm VRAM init: %d\n", ret); 206 237 return ret; 207 238 } ··· 215 248 return; 216 249 217 250 ttm_bo_device_release(&hibmc->bdev); 218 - hibmc_ttm_global_release(hibmc); 219 251 hibmc->mm_inited = false; 220 252 } 221 253
-1
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 212 212 int fb_mtrr; 213 213 214 214 struct { 215 - struct ttm_bo_global_ref bo_global_ref; 216 215 struct ttm_bo_device bdev; 217 216 } ttm; 218 217
-36
drivers/gpu/drm/mgag200/mgag200_ttm.c
··· 36 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 39 static void mgag200_bo_ttm_destroy(struct ttm_buffer_object *tbo) 69 40 { 70 41 struct mgag200_bo *bo; ··· 175 204 struct drm_device *dev = mdev->dev; 176 205 struct ttm_bo_device *bdev = &mdev->ttm.bdev; 177 206 178 - ret = mgag200_ttm_global_init(mdev); 179 - if (ret) 180 - return ret; 181 - 182 207 ret = ttm_bo_device_init(&mdev->ttm.bdev, 183 - mdev->ttm.bo_global_ref.ref.object, 184 208 &mgag200_bo_driver, 185 209 dev->anon_inode->i_mapping, 186 210 DRM_FILE_PAGE_OFFSET, ··· 205 239 struct drm_device *dev = mdev->dev; 206 240 207 241 ttm_bo_device_release(&mdev->ttm.bdev); 208 - 209 - mgag200_ttm_global_release(mdev); 210 242 211 243 arch_io_free_memtype_wc(pci_resource_start(dev->pdev, 0), 212 244 pci_resource_len(dev->pdev, 0));
-1
drivers/gpu/drm/nouveau/nouveau_drv.h
··· 146 146 147 147 /* TTM interface support */ 148 148 struct { 149 - struct ttm_bo_global_ref bo_global_ref; 150 149 struct ttm_bo_device bdev; 151 150 atomic_t validate_sequence; 152 151 int (*move)(struct nouveau_channel *,
-39
drivers/gpu/drm/nouveau/nouveau_ttm.c
··· 174 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 177 static int 210 178 nouveau_ttm_init_host(struct nouveau_drm *drm, u8 kind) 211 179 { ··· 236 268 drm->agp.cma = pci->agp.cma; 237 269 } 238 270 239 - ret = nouveau_ttm_global_init(drm); 240 - if (ret) 241 - return ret; 242 - 243 271 ret = ttm_bo_device_init(&drm->ttm.bdev, 244 - drm->ttm.bo_global_ref.ref.object, 245 272 &nouveau_bo_driver, 246 273 dev->anon_inode->i_mapping, 247 274 DRM_FILE_PAGE_OFFSET, ··· 290 327 ttm_bo_clean_mm(&drm->ttm.bdev, TTM_PL_TT); 291 328 292 329 ttm_bo_device_release(&drm->ttm.bdev); 293 - 294 - nouveau_ttm_global_release(drm); 295 330 296 331 arch_phys_wc_del(drm->ttm.mtrr); 297 332 drm->ttm.mtrr = 0;
-2
drivers/gpu/drm/qxl/qxl_drv.h
··· 127 127 #define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc) 128 128 129 129 struct qxl_mman { 130 - struct ttm_bo_global_ref bo_global_ref; 131 - bool mem_global_referenced; 132 130 struct ttm_bo_device bdev; 133 131 }; 134 132
-33
drivers/gpu/drm/qxl/qxl_ttm.c
··· 46 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 49 static struct vm_operations_struct qxl_ttm_vm_ops; 78 50 static const struct vm_operations_struct *ttm_vm_ops; 79 51 ··· 317 345 int r; 318 346 int num_io_pages; /* != rom->num_io_pages, we include surface0 */ 319 347 320 - r = qxl_ttm_global_init(qdev); 321 - if (r) 322 - return r; 323 348 /* No others user of address space so set it to 0 */ 324 349 r = ttm_bo_device_init(&qdev->mman.bdev, 325 - qdev->mman.bo_global_ref.ref.object, 326 350 &qxl_bo_driver, 327 351 qdev->ddev.anon_inode->i_mapping, 328 352 DRM_FILE_PAGE_OFFSET, 0); ··· 354 386 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_VRAM); 355 387 ttm_bo_clean_mm(&qdev->mman.bdev, TTM_PL_PRIV); 356 388 ttm_bo_device_release(&qdev->mman.bdev); 357 - qxl_ttm_global_fini(qdev); 358 389 DRM_INFO("qxl: ttm finalized\n"); 359 390 } 360 391
-2
drivers/gpu/drm/radeon/radeon.h
··· 448 448 * TTM. 449 449 */ 450 450 struct radeon_mman { 451 - struct ttm_bo_global_ref bo_global_ref; 452 451 struct ttm_bo_device bdev; 453 - bool mem_global_referenced; 454 452 bool initialized; 455 453 456 454 #if defined(CONFIG_DEBUG_FS)
-39
drivers/gpu/drm/radeon/radeon_ttm.c
··· 60 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 63 static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 97 64 { 98 65 return 0; ··· 788 821 { 789 822 int r; 790 823 791 - r = radeon_ttm_global_init(rdev); 792 - if (r) { 793 - return r; 794 - } 795 824 /* No others user of address space so set it to 0 */ 796 825 r = ttm_bo_device_init(&rdev->mman.bdev, 797 - rdev->mman.bo_global_ref.ref.object, 798 826 &radeon_bo_driver, 799 827 rdev->ddev->anon_inode->i_mapping, 800 828 DRM_FILE_PAGE_OFFSET, ··· 861 899 ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT); 862 900 ttm_bo_device_release(&rdev->mman.bdev); 863 901 radeon_gart_fini(rdev); 864 - radeon_ttm_global_fini(rdev); 865 902 rdev->mman.initialized = false; 866 903 DRM_INFO("radeon: ttm finalized\n"); 867 904 }
+12 -7
drivers/gpu/drm/ttm/ttm_bo.c
··· 1530 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 1535 struct ttm_bo_global *glob = &ttm_bo_glob; 1536 1536 ··· 1544 1544 out: 1545 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 1550 struct ttm_bo_global *glob = &ttm_bo_glob; 1552 1551 int ret = 0; ··· 1582 1583 mutex_unlock(&ttm_global_mutex); 1583 1584 return ret; 1584 1585 } 1585 - EXPORT_SYMBOL(ttm_bo_global_init); 1586 - 1587 1586 1588 1587 int ttm_bo_device_release(struct ttm_bo_device *bdev) 1589 1588 { ··· 1620 1623 1621 1624 drm_vma_offset_manager_destroy(&bdev->vma_manager); 1622 1625 1626 + if (!ret) 1627 + ttm_bo_global_release(); 1628 + 1623 1629 return ret; 1624 1630 } 1625 1631 EXPORT_SYMBOL(ttm_bo_device_release); 1626 1632 1627 1633 int ttm_bo_device_init(struct ttm_bo_device *bdev, 1628 - struct ttm_bo_global *glob, 1629 1634 struct ttm_bo_driver *driver, 1630 1635 struct address_space *mapping, 1631 1636 uint64_t file_page_offset, 1632 1637 bool need_dma32) 1633 1638 { 1634 - int ret = -EINVAL; 1639 + struct ttm_bo_global *glob = &ttm_bo_glob; 1640 + int ret; 1641 + 1642 + ret = ttm_bo_global_init(); 1643 + if (ret) 1644 + return ret; 1635 1645 1636 1646 bdev->driver = driver; 1637 1647 ··· 1665 1661 1666 1662 return 0; 1667 1663 out_no_sys: 1664 + ttm_bo_global_release(); 1668 1665 return ret; 1669 1666 } 1670 1667 EXPORT_SYMBOL(ttm_bo_device_init);
-2
drivers/gpu/drm/virtio/virtgpu_drv.h
··· 142 142 }; 143 143 144 144 struct virtio_gpu_mman { 145 - struct ttm_bo_global_ref bo_global_ref; 146 - bool mem_global_referenced; 147 145 struct ttm_bo_device bdev; 148 146 }; 149 147
-35
drivers/gpu/drm/virtio/virtgpu_ttm.c
··· 50 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 53 int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma) 83 54 { 84 55 struct drm_file *file_priv; ··· 327 356 { 328 357 int r; 329 358 330 - r = virtio_gpu_ttm_global_init(vgdev); 331 - if (r) 332 - return r; 333 359 /* No others user of address space so set it to 0 */ 334 360 r = ttm_bo_device_init(&vgdev->mman.bdev, 335 - vgdev->mman.bo_global_ref.ref.object, 336 361 &virtio_gpu_bo_driver, 337 362 vgdev->ddev->anon_inode->i_mapping, 338 363 DRM_FILE_PAGE_OFFSET, 0); ··· 347 380 err_mm_init: 348 381 ttm_bo_device_release(&vgdev->mman.bdev); 349 382 err_dev_init: 350 - virtio_gpu_ttm_global_fini(vgdev); 351 383 return r; 352 384 } 353 385 354 386 void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev) 355 387 { 356 388 ttm_bo_device_release(&vgdev->mman.bdev); 357 - virtio_gpu_ttm_global_fini(vgdev); 358 389 DRM_INFO("virtio_gpu: ttm finalized\n"); 359 390 }
+1 -10
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
··· 801 801 DRM_INFO("MMIO at 0x%08x size is %u kiB\n", 802 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 804 vmw_master_init(&dev_priv->fbdev_master); 810 805 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); 811 806 dev_priv->active_master = &dev_priv->fbdev_master; ··· 811 816 if (unlikely(dev_priv->mmio_virt == NULL)) { 812 817 ret = -ENOMEM; 813 818 DRM_ERROR("Failed mapping MMIO.\n"); 814 - goto out_err3; 819 + goto out_err0; 815 820 } 816 821 817 822 /* Need mmio memory to check for fifo pitchlock cap. */ ··· 865 870 } 866 871 867 872 ret = ttm_bo_device_init(&dev_priv->bdev, 868 - dev_priv->bo_global_ref.ref.object, 869 873 &vmw_bo_driver, 870 874 dev->anon_inode->i_mapping, 871 875 VMWGFX_FILE_PAGE_OFFSET, ··· 986 992 ttm_object_device_release(&dev_priv->tdev); 987 993 out_err4: 988 994 memunmap(dev_priv->mmio_virt); 989 - out_err3: 990 - vmw_ttm_global_release(dev_priv); 991 995 out_err0: 992 996 for (i = vmw_res_context; i < vmw_res_max; ++i) 993 997 idr_destroy(&dev_priv->res_idr[i]); ··· 1037 1045 memunmap(dev_priv->mmio_virt); 1038 1046 if (dev_priv->ctx.staged_bindings) 1039 1047 vmw_binding_state_free(dev_priv->ctx.staged_bindings); 1040 - vmw_ttm_global_release(dev_priv); 1041 1048 1042 1049 for (i = vmw_res_context; i < vmw_res_max; ++i) 1043 1050 idr_destroy(&dev_priv->res_idr[i]);
-3
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
··· 417 417 418 418 struct vmw_private { 419 419 struct ttm_bo_device bdev; 420 - struct ttm_bo_global_ref bo_global_ref; 421 420 422 421 struct vmw_fifo_state fifo; 423 422 ··· 840 841 * TTM glue - vmwgfx_ttm_glue.c 841 842 */ 842 843 843 - extern int vmw_ttm_global_init(struct vmw_private *dev_priv); 844 - extern void vmw_ttm_global_release(struct vmw_private *dev_priv); 845 844 extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 846 845 847 846 /**
-27
drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
··· 42 42 dev_priv = vmw_priv(file_priv->minor->dev); 43 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 - }
-1
drivers/staging/vboxvideo/vbox_drv.h
··· 99 99 int fb_mtrr; 100 100 101 101 struct { 102 - struct ttm_bo_global_ref bo_global_ref; 103 102 struct ttm_bo_device bdev; 104 103 } ttm; 105 104
+1 -40
drivers/staging/vboxvideo/vbox_ttm.c
··· 35 35 return container_of(bd, struct vbox_private, ttm.bdev); 36 36 } 37 37 38 - /** 39 - * Adds the vbox memory manager object/structures to the global memory manager. 40 - */ 41 - static int vbox_ttm_global_init(struct vbox_private *vbox) 42 - { 43 - struct drm_global_reference *global_ref; 44 - int ret; 45 - 46 - global_ref = &vbox->ttm.bo_global_ref.ref; 47 - global_ref->global_type = DRM_GLOBAL_TTM_BO; 48 - global_ref->size = sizeof(struct ttm_bo_global); 49 - global_ref->init = &ttm_bo_global_ref_init; 50 - global_ref->release = &ttm_bo_global_ref_release; 51 - 52 - ret = drm_global_item_ref(global_ref); 53 - if (ret) { 54 - DRM_ERROR("Failed setting up TTM BO subsystem.\n"); 55 - return ret; 56 - } 57 - 58 - return 0; 59 - } 60 - 61 - /** 62 - * Removes the vbox memory manager object from the global memory manager. 63 - */ 64 - static void vbox_ttm_global_release(struct vbox_private *vbox) 65 - { 66 - drm_global_item_unref(&vbox->ttm.bo_global_ref.ref); 67 - } 68 - 69 38 static void vbox_bo_ttm_destroy(struct ttm_buffer_object *tbo) 70 39 { 71 40 struct vbox_bo *bo; ··· 172 203 struct drm_device *dev = &vbox->ddev; 173 204 struct ttm_bo_device *bdev = &vbox->ttm.bdev; 174 205 175 - ret = vbox_ttm_global_init(vbox); 176 - if (ret) 177 - return ret; 178 - 179 206 ret = ttm_bo_device_init(&vbox->ttm.bdev, 180 - vbox->ttm.bo_global_ref.ref.object, 181 207 &vbox_bo_driver, 182 208 dev->anon_inode->i_mapping, 183 209 DRM_FILE_PAGE_OFFSET, true); 184 210 if (ret) { 185 211 DRM_ERROR("Error initialising bo driver; %d\n", ret); 186 - goto err_ttm_global_release; 212 + return ret; 187 213 } 188 214 189 215 ret = ttm_bo_init_mm(bdev, TTM_PL_VRAM, ··· 200 236 201 237 err_device_release: 202 238 ttm_bo_device_release(&vbox->ttm.bdev); 203 - err_ttm_global_release: 204 - vbox_ttm_global_release(vbox); 205 239 return ret; 206 240 } 207 241 ··· 213 251 arch_phys_wc_del(vbox->fb_mtrr); 214 252 #endif 215 253 ttm_bo_device_release(&vbox->ttm.bdev); 216 - vbox_ttm_global_release(vbox); 217 254 } 218 255 219 256 void vbox_ttm_placement(struct vbox_bo *bo, int domain)
+1 -40
include/drm/ttm/ttm_bo_driver.h
··· 569 569 void ttm_bo_mem_put_locked(struct ttm_buffer_object *bo, 570 570 struct ttm_mem_reg *mem); 571 571 572 - void ttm_bo_global_release(void); 573 - int ttm_bo_global_init(void); 574 - 575 572 int ttm_bo_device_release(struct ttm_bo_device *bdev); 576 573 577 574 /** ··· 586 589 * Returns: 587 590 * !0: Failure. 588 591 */ 589 - int ttm_bo_device_init(struct ttm_bo_device *bdev, struct ttm_bo_global *glob, 592 + int ttm_bo_device_init(struct ttm_bo_device *bdev, 590 593 struct ttm_bo_driver *driver, 591 594 struct address_space *mapping, 592 595 uint64_t file_page_offset, bool need_dma32); ··· 884 887 pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp); 885 888 886 889 extern const struct ttm_mem_type_manager_func ttm_bo_manager_func; 887 - 888 - /** 889 - * struct ttm_bo_global_ref - Argument to initialize a struct ttm_bo_global. 890 - */ 891 - 892 - struct ttm_bo_global_ref { 893 - struct drm_global_reference ref; 894 - }; 895 - 896 - /** 897 - * ttm_bo_global_ref_init 898 - * 899 - * @ref: DRM global reference 900 - * 901 - * Helper function that initializes a struct ttm_bo_global. This function 902 - * is used as init call-back function for DRM global references of type 903 - * DRM_GLOBAL_TTM_BO_REF. 904 - */ 905 - static inline int ttm_bo_global_ref_init(struct drm_global_reference *ref) 906 - { 907 - return ttm_bo_global_init(); 908 - } 909 - 910 - /** 911 - * ttm_bo_global_ref_release 912 - * 913 - * @ref: DRM global reference 914 - * 915 - * Helper function that releases a struct ttm_bo_global. This function 916 - * is used as release call-back function for DRM global references of type 917 - * DRM_GLOBAL_TTM_BO_REF. 918 - */ 919 - static inline void ttm_bo_global_ref_release(struct drm_global_reference *ref) 920 - { 921 - ttm_bo_global_release(); 922 - } 923 890 924 891 #endif