diff options
Diffstat (limited to 'amdgpu')
-rw-r--r-- | amdgpu/amdgpu_device.c | 13 | ||||
-rw-r--r-- | amdgpu/amdgpu_internal.h | 8 | ||||
-rw-r--r-- | amdgpu/amdgpu_vamgr.c | 26 |
3 files changed, 12 insertions, 35 deletions
diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c index e16cd24b..75b12e25 100644 --- a/amdgpu/amdgpu_device.c +++ b/amdgpu/amdgpu_device.c | |||
@@ -130,7 +130,8 @@ static int amdgpu_get_auth(int fd, int *auth) | |||
130 | 130 | ||
131 | static void amdgpu_device_free_internal(amdgpu_device_handle dev) | 131 | static void amdgpu_device_free_internal(amdgpu_device_handle dev) |
132 | { | 132 | { |
133 | amdgpu_vamgr_reference(&dev->vamgr, NULL); | 133 | amdgpu_vamgr_deinit(dev->vamgr); |
134 | free(dev->vamgr); | ||
134 | util_hash_table_destroy(dev->bo_flink_names); | 135 | util_hash_table_destroy(dev->bo_flink_names); |
135 | util_hash_table_destroy(dev->bo_handles); | 136 | util_hash_table_destroy(dev->bo_handles); |
136 | pthread_mutex_destroy(&dev->bo_table_mutex); | 137 | pthread_mutex_destroy(&dev->bo_table_mutex); |
@@ -251,7 +252,13 @@ int amdgpu_device_initialize(int fd, | |||
251 | if (r) | 252 | if (r) |
252 | goto cleanup; | 253 | goto cleanup; |
253 | 254 | ||
254 | dev->vamgr = amdgpu_vamgr_get_global(dev); | 255 | dev->vamgr = calloc(1, sizeof(struct amdgpu_bo_va_mgr)); |
256 | if (dev->vamgr == NULL) | ||
257 | goto cleanup; | ||
258 | |||
259 | amdgpu_vamgr_init(dev->vamgr, dev->dev_info.virtual_address_offset, | ||
260 | dev->dev_info.virtual_address_max, | ||
261 | dev->dev_info.virtual_address_alignment); | ||
255 | 262 | ||
256 | max = MIN2(dev->dev_info.virtual_address_max, 0xffffffff); | 263 | max = MIN2(dev->dev_info.virtual_address_max, 0xffffffff); |
257 | start = amdgpu_vamgr_find_va(dev->vamgr, | 264 | start = amdgpu_vamgr_find_va(dev->vamgr, |
@@ -278,6 +285,8 @@ free_va: | |||
278 | r = -ENOMEM; | 285 | r = -ENOMEM; |
279 | amdgpu_vamgr_free_va(dev->vamgr, start, | 286 | amdgpu_vamgr_free_va(dev->vamgr, start, |
280 | max - dev->dev_info.virtual_address_offset); | 287 | max - dev->dev_info.virtual_address_offset); |
288 | amdgpu_vamgr_deinit(dev->vamgr); | ||
289 | free(dev->vamgr); | ||
281 | 290 | ||
282 | cleanup: | 291 | cleanup: |
283 | if (dev->fd >= 0) | 292 | if (dev->fd >= 0) |
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h index 3ce0969e..5d866030 100644 --- a/amdgpu/amdgpu_internal.h +++ b/amdgpu/amdgpu_internal.h | |||
@@ -52,7 +52,6 @@ struct amdgpu_bo_va_hole { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | struct amdgpu_bo_va_mgr { | 54 | struct amdgpu_bo_va_mgr { |
55 | atomic_t refcount; | ||
56 | /* the start virtual address */ | 55 | /* the start virtual address */ |
57 | uint64_t va_offset; | 56 | uint64_t va_offset; |
58 | uint64_t va_max; | 57 | uint64_t va_max; |
@@ -125,13 +124,6 @@ struct amdgpu_context { | |||
125 | 124 | ||
126 | drm_private void amdgpu_bo_free_internal(amdgpu_bo_handle bo); | 125 | drm_private void amdgpu_bo_free_internal(amdgpu_bo_handle bo); |
127 | 126 | ||
128 | drm_private struct amdgpu_bo_va_mgr* | ||
129 | amdgpu_vamgr_get_global(struct amdgpu_device *dev); | ||
130 | |||
131 | drm_private void | ||
132 | amdgpu_vamgr_reference(struct amdgpu_bo_va_mgr **dst, | ||
133 | struct amdgpu_bo_va_mgr *src); | ||
134 | |||
135 | drm_private void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, uint64_t start, | 127 | drm_private void amdgpu_vamgr_init(struct amdgpu_bo_va_mgr *mgr, uint64_t start, |
136 | uint64_t max, uint64_t alignment); | 128 | uint64_t max, uint64_t alignment); |
137 | 129 | ||
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c index 507a73a2..04d28817 100644 --- a/amdgpu/amdgpu_vamgr.c +++ b/amdgpu/amdgpu_vamgr.c | |||
@@ -33,8 +33,6 @@ | |||
33 | #include "amdgpu_internal.h" | 33 | #include "amdgpu_internal.h" |
34 | #include "util_math.h" | 34 | #include "util_math.h" |
35 | 35 | ||
36 | static struct amdgpu_bo_va_mgr vamgr = {{0}}; | ||
37 | |||
38 | int amdgpu_va_range_query(amdgpu_device_handle dev, | 36 | int amdgpu_va_range_query(amdgpu_device_handle dev, |
39 | enum amdgpu_gpu_va_range type, uint64_t *start, uint64_t *end) | 37 | enum amdgpu_gpu_va_range type, uint64_t *start, uint64_t *end) |
40 | { | 38 | { |
@@ -67,28 +65,6 @@ drm_private void amdgpu_vamgr_deinit(struct amdgpu_bo_va_mgr *mgr) | |||
67 | pthread_mutex_destroy(&mgr->bo_va_mutex); | 65 | pthread_mutex_destroy(&mgr->bo_va_mutex); |
68 | } | 66 | } |
69 | 67 | ||
70 | drm_private struct amdgpu_bo_va_mgr * | ||
71 | amdgpu_vamgr_get_global(struct amdgpu_device *dev) | ||
72 | { | ||
73 | int ref; | ||
74 | ref = atomic_inc_return(&vamgr.refcount); | ||
75 | |||
76 | if (ref == 1) | ||
77 | amdgpu_vamgr_init(&vamgr, dev->dev_info.virtual_address_offset, | ||
78 | dev->dev_info.virtual_address_max, | ||
79 | dev->dev_info.virtual_address_alignment); | ||
80 | return &vamgr; | ||
81 | } | ||
82 | |||
83 | drm_private void | ||
84 | amdgpu_vamgr_reference(struct amdgpu_bo_va_mgr **dst, | ||
85 | struct amdgpu_bo_va_mgr *src) | ||
86 | { | ||
87 | if (update_references(&(*dst)->refcount, NULL)) | ||
88 | amdgpu_vamgr_deinit(*dst); | ||
89 | *dst = src; | ||
90 | } | ||
91 | |||
92 | drm_private uint64_t | 68 | drm_private uint64_t |
93 | amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size, | 69 | amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size, |
94 | uint64_t alignment, uint64_t base_required) | 70 | uint64_t alignment, uint64_t base_required) |
@@ -105,7 +81,7 @@ amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size, | |||
105 | pthread_mutex_lock(&mgr->bo_va_mutex); | 81 | pthread_mutex_lock(&mgr->bo_va_mutex); |
106 | /* TODO: using more appropriate way to track the holes */ | 82 | /* TODO: using more appropriate way to track the holes */ |
107 | /* first look for a hole */ | 83 | /* first look for a hole */ |
108 | LIST_FOR_EACH_ENTRY_SAFE(hole, n, &vamgr.va_holes, list) { | 84 | LIST_FOR_EACH_ENTRY_SAFE(hole, n, &mgr->va_holes, list) { |
109 | if (base_required) { | 85 | if (base_required) { |
110 | if(hole->offset > base_required || | 86 | if(hole->offset > base_required || |
111 | (hole->offset + hole->size) < (base_required + size)) | 87 | (hole->offset + hole->size) < (base_required + size)) |