diff options
Diffstat (limited to 'amdgpu')
-rw-r--r-- | amdgpu/amdgpu_bo.c | 4 | ||||
-rw-r--r-- | amdgpu/amdgpu_device.c | 4 | ||||
-rw-r--r-- | amdgpu/amdgpu_internal.h | 13 | ||||
-rw-r--r-- | amdgpu/amdgpu_vamgr.c | 48 |
4 files changed, 50 insertions, 19 deletions
diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c index e1717194..f8d9c87e 100644 --- a/amdgpu/amdgpu_bo.c +++ b/amdgpu/amdgpu_bo.c | |||
@@ -71,7 +71,7 @@ void amdgpu_bo_free_internal(amdgpu_bo_handle bo) | |||
71 | 71 | ||
72 | amdgpu_close_kms_handle(bo->dev, bo->handle); | 72 | amdgpu_close_kms_handle(bo->dev, bo->handle); |
73 | pthread_mutex_destroy(&bo->cpu_access_mutex); | 73 | pthread_mutex_destroy(&bo->cpu_access_mutex); |
74 | amdgpu_vamgr_free_va(&bo->dev->vamgr, bo->virtual_mc_base_address, bo->alloc_size); | 74 | amdgpu_vamgr_free_va(bo->dev->vamgr, bo->virtual_mc_base_address, bo->alloc_size); |
75 | free(bo); | 75 | free(bo); |
76 | } | 76 | } |
77 | 77 | ||
@@ -84,7 +84,7 @@ static int amdgpu_bo_map(amdgpu_bo_handle bo, uint32_t alignment) | |||
84 | 84 | ||
85 | memset(&va, 0, sizeof(va)); | 85 | memset(&va, 0, sizeof(va)); |
86 | 86 | ||
87 | bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, | 87 | bo->virtual_mc_base_address = amdgpu_vamgr_find_va(dev->vamgr, |
88 | bo->alloc_size, alignment); | 88 | bo->alloc_size, alignment); |
89 | 89 | ||
90 | if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) | 90 | if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) |
diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c index 7a997cb5..212e7075 100644 --- a/amdgpu/amdgpu_device.c +++ b/amdgpu/amdgpu_device.c | |||
@@ -207,7 +207,7 @@ int amdgpu_device_initialize(int fd, | |||
207 | if (r) | 207 | if (r) |
208 | goto cleanup; | 208 | goto cleanup; |
209 | 209 | ||
210 | amdgpu_vamgr_init(dev); | 210 | dev->vamgr = amdgpu_vamgr_get_global(dev); |
211 | 211 | ||
212 | *major_version = dev->major_version; | 212 | *major_version = dev->major_version; |
213 | *minor_version = dev->minor_version; | 213 | *minor_version = dev->minor_version; |
@@ -225,10 +225,10 @@ cleanup: | |||
225 | 225 | ||
226 | void amdgpu_device_free_internal(amdgpu_device_handle dev) | 226 | void amdgpu_device_free_internal(amdgpu_device_handle dev) |
227 | { | 227 | { |
228 | amdgpu_vamgr_reference(&dev->vamgr, NULL); | ||
228 | util_hash_table_destroy(dev->bo_flink_names); | 229 | util_hash_table_destroy(dev->bo_flink_names); |
229 | util_hash_table_destroy(dev->bo_handles); | 230 | util_hash_table_destroy(dev->bo_handles); |
230 | pthread_mutex_destroy(&dev->bo_table_mutex); | 231 | pthread_mutex_destroy(&dev->bo_table_mutex); |
231 | pthread_mutex_destroy(&(dev->vamgr.bo_va_mutex)); | ||
232 | util_hash_table_remove(fd_tab, UINT_TO_PTR(dev->fd)); | 232 | util_hash_table_remove(fd_tab, UINT_TO_PTR(dev->fd)); |
233 | free(dev); | 233 | free(dev); |
234 | } | 234 | } |
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h index 77b12443..c1cd4da7 100644 --- a/amdgpu/amdgpu_internal.h +++ b/amdgpu/amdgpu_internal.h | |||
@@ -49,6 +49,7 @@ struct amdgpu_bo_va_hole { | |||
49 | }; | 49 | }; |
50 | 50 | ||
51 | struct amdgpu_bo_va_mgr { | 51 | struct amdgpu_bo_va_mgr { |
52 | atomic_t refcount; | ||
52 | /* the start virtual address */ | 53 | /* the start virtual address */ |
53 | uint64_t va_offset; | 54 | uint64_t va_offset; |
54 | uint64_t va_max; | 55 | uint64_t va_max; |
@@ -70,9 +71,9 @@ struct amdgpu_device { | |||
70 | struct util_hash_table *bo_flink_names; | 71 | struct util_hash_table *bo_flink_names; |
71 | /** This protects all hash tables. */ | 72 | /** This protects all hash tables. */ |
72 | pthread_mutex_t bo_table_mutex; | 73 | pthread_mutex_t bo_table_mutex; |
73 | struct amdgpu_bo_va_mgr vamgr; | ||
74 | struct drm_amdgpu_info_device dev_info; | 74 | struct drm_amdgpu_info_device dev_info; |
75 | struct amdgpu_gpu_info info; | 75 | struct amdgpu_gpu_info info; |
76 | struct amdgpu_bo_va_mgr *vamgr; | ||
76 | }; | 77 | }; |
77 | 78 | ||
78 | struct amdgpu_bo { | 79 | struct amdgpu_bo { |
@@ -142,13 +143,15 @@ void amdgpu_device_free_internal(amdgpu_device_handle dev); | |||
142 | 143 | ||
143 | void amdgpu_bo_free_internal(amdgpu_bo_handle bo); | 144 | void amdgpu_bo_free_internal(amdgpu_bo_handle bo); |
144 | 145 | ||
145 | void amdgpu_vamgr_init(struct amdgpu_device *dev); | 146 | struct amdgpu_bo_va_mgr* amdgpu_vamgr_get_global(struct amdgpu_device *dev); |
147 | |||
148 | void amdgpu_vamgr_reference(struct amdgpu_bo_va_mgr **dst, struct amdgpu_bo_va_mgr *src); | ||
146 | 149 | ||
147 | uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, | 150 | uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, |
148 | uint64_t size, uint64_t alignment); | 151 | uint64_t size, uint64_t alignment); |
149 | 152 | ||
150 | void amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, | 153 | void amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, |
151 | uint64_t size); | 154 | uint64_t size); |
152 | 155 | ||
153 | int amdgpu_query_gpu_info_init(amdgpu_device_handle dev); | 156 | int amdgpu_query_gpu_info_init(amdgpu_device_handle dev); |
154 | 157 | ||
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c index 34c28878..b15729fa 100644 --- a/amdgpu/amdgpu_vamgr.c +++ b/amdgpu/amdgpu_vamgr.c | |||
@@ -28,20 +28,48 @@ | |||
28 | #include "amdgpu_internal.h" | 28 | #include "amdgpu_internal.h" |
29 | #include "util_math.h" | 29 | #include "util_math.h" |
30 | 30 | ||
31 | void amdgpu_vamgr_init(struct amdgpu_device *dev) | 31 | static struct amdgpu_bo_va_mgr vamgr = {{0}}; |
32 | |||
33 | static void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, struct amdgpu_device *dev) | ||
34 | { | ||
35 | mgr->va_offset = dev->dev_info.virtual_address_offset; | ||
36 | mgr->va_max = dev->dev_info.virtual_address_max; | ||
37 | mgr->va_alignment = dev->dev_info.virtual_address_alignment; | ||
38 | |||
39 | list_inithead(&mgr->va_holes); | ||
40 | pthread_mutex_init(&mgr->bo_va_mutex, NULL); | ||
41 | } | ||
42 | |||
43 | static void amdgpu_vamgr_deinit(struct amdgpu_bo_va_mgr *mgr) | ||
44 | { | ||
45 | struct amdgpu_bo_va_hole *hole; | ||
46 | LIST_FOR_EACH_ENTRY(hole, &mgr->va_holes, list) { | ||
47 | list_del(&hole->list); | ||
48 | free(hole); | ||
49 | } | ||
50 | pthread_mutex_destroy(&mgr->bo_va_mutex); | ||
51 | } | ||
52 | |||
53 | struct amdgpu_bo_va_mgr * amdgpu_vamgr_get_global(struct amdgpu_device *dev) | ||
32 | { | 54 | { |
33 | struct amdgpu_bo_va_mgr *vamgr = &dev->vamgr; | 55 | int ref; |
56 | ref = atomic_inc_return(&vamgr.refcount); | ||
34 | 57 | ||
35 | vamgr->va_offset = dev->dev_info.virtual_address_offset; | 58 | if (ref == 1) |
36 | vamgr->va_max = dev->dev_info.virtual_address_max; | 59 | amdgpu_vamgr_init(&vamgr, dev); |
37 | vamgr->va_alignment = dev->dev_info.virtual_address_alignment; | 60 | return &vamgr; |
61 | } | ||
38 | 62 | ||
39 | list_inithead(&vamgr->va_holes); | 63 | void amdgpu_vamgr_reference(struct amdgpu_bo_va_mgr **dst, |
40 | pthread_mutex_init(&vamgr->bo_va_mutex, NULL); | 64 | struct amdgpu_bo_va_mgr *src) |
65 | { | ||
66 | if (update_references(&(*dst)->refcount, NULL)) | ||
67 | amdgpu_vamgr_deinit(*dst); | ||
68 | *dst = src; | ||
41 | } | 69 | } |
42 | 70 | ||
43 | uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, | 71 | uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, |
44 | uint64_t size, uint64_t alignment) | 72 | uint64_t size, uint64_t alignment) |
45 | { | 73 | { |
46 | struct amdgpu_bo_va_hole *hole, *n; | 74 | struct amdgpu_bo_va_hole *hole, *n; |
47 | uint64_t offset = 0, waste = 0; | 75 | uint64_t offset = 0, waste = 0; |
@@ -108,8 +136,8 @@ uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, | |||
108 | return offset; | 136 | return offset; |
109 | } | 137 | } |
110 | 138 | ||
111 | void amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, | 139 | void amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, |
112 | uint64_t size) | 140 | uint64_t va, uint64_t size) |
113 | { | 141 | { |
114 | struct amdgpu_bo_va_hole *hole; | 142 | struct amdgpu_bo_va_hole *hole; |
115 | 143 | ||