diff options
author | Dave Airlie <airlied@redhat.com> | 2016-03-07 19:51:51 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2016-03-07 19:51:51 -0500 |
commit | 550e3b23a53c88adfa46e64f9d442743e65d47da (patch) | |
tree | f6a345184c325130473485457763836b72249cbb /drivers/gpu/drm/amd/amdgpu | |
parent | 984fee64355bf5384319e2ef31f0b03273629799 (diff) | |
parent | 6157bd7a1009c2a6944fb3eee8ed2b3dea091fd8 (diff) |
Merge branch 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux into drm-next
Some more radeon and amdgpu stuff for drm-next. Mostly just bug fixes
for new features and cleanups.
* 'drm-next-4.6' of git://people.freedesktop.org/~agd5f/linux:
drm/amdgpu: fix rb bitmap & cu bitmap calculation
drm/amdgpu: trace the pd_addr in vm_grab_id as well
drm/amdgpu: fix VM faults caused by vm_grab_id() v4
drm/amdgpu: update radeon acpi header
drm/radeon: update radeon acpi header
drm/amd: cleanup get_mfd_cell_dev()
drm/amdgpu: fix error handling in amdgpu_bo_list_set
drm/amd/powerplay: fix code style warning.
drm/amd: Do not make DRM_AMD_ACP default to y
drm/amdgpu/gfx: fix off by one in rb rework (v2)
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 116 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cikd.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 28 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vid.h | 2 |
14 files changed, 125 insertions, 118 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index f5bac97a438b..0c42a85ca5a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -769,8 +769,9 @@ struct amdgpu_ib { | |||
769 | uint32_t *ptr; | 769 | uint32_t *ptr; |
770 | struct amdgpu_fence *fence; | 770 | struct amdgpu_fence *fence; |
771 | struct amdgpu_user_fence *user; | 771 | struct amdgpu_user_fence *user; |
772 | bool grabbed_vmid; | ||
773 | struct amdgpu_vm *vm; | 772 | struct amdgpu_vm *vm; |
773 | unsigned vm_id; | ||
774 | uint64_t vm_pd_addr; | ||
774 | struct amdgpu_ctx *ctx; | 775 | struct amdgpu_ctx *ctx; |
775 | uint32_t gds_base, gds_size; | 776 | uint32_t gds_base, gds_size; |
776 | uint32_t gws_base, gws_size; | 777 | uint32_t gws_base, gws_size; |
@@ -877,10 +878,10 @@ struct amdgpu_vm_pt { | |||
877 | }; | 878 | }; |
878 | 879 | ||
879 | struct amdgpu_vm_id { | 880 | struct amdgpu_vm_id { |
880 | unsigned id; | 881 | struct amdgpu_vm_manager_id *mgr_id; |
881 | uint64_t pd_gpu_addr; | 882 | uint64_t pd_gpu_addr; |
882 | /* last flushed PD/PT update */ | 883 | /* last flushed PD/PT update */ |
883 | struct fence *flushed_updates; | 884 | struct fence *flushed_updates; |
884 | }; | 885 | }; |
885 | 886 | ||
886 | struct amdgpu_vm { | 887 | struct amdgpu_vm { |
@@ -954,10 +955,11 @@ void amdgpu_vm_get_pt_bos(struct amdgpu_vm *vm, struct list_head *duplicates); | |||
954 | void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev, | 955 | void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev, |
955 | struct amdgpu_vm *vm); | 956 | struct amdgpu_vm *vm); |
956 | int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | 957 | int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, |
957 | struct amdgpu_sync *sync, struct fence *fence); | 958 | struct amdgpu_sync *sync, struct fence *fence, |
959 | unsigned *vm_id, uint64_t *vm_pd_addr); | ||
958 | void amdgpu_vm_flush(struct amdgpu_ring *ring, | 960 | void amdgpu_vm_flush(struct amdgpu_ring *ring, |
959 | struct amdgpu_vm *vm, | 961 | unsigned vmid, |
960 | struct fence *updates); | 962 | uint64_t pd_addr); |
961 | uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr); | 963 | uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr); |
962 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, | 964 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, |
963 | struct amdgpu_vm *vm); | 965 | struct amdgpu_vm *vm); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c index 9f8cfaab3004..d6b0bff510aa 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c | |||
@@ -240,12 +240,10 @@ static int acp_poweron(struct generic_pm_domain *genpd) | |||
240 | static struct device *get_mfd_cell_dev(const char *device_name, int r) | 240 | static struct device *get_mfd_cell_dev(const char *device_name, int r) |
241 | { | 241 | { |
242 | char auto_dev_name[25]; | 242 | char auto_dev_name[25]; |
243 | char buf[8]; | ||
244 | struct device *dev; | 243 | struct device *dev; |
245 | 244 | ||
246 | sprintf(buf, ".%d.auto", r); | 245 | snprintf(auto_dev_name, sizeof(auto_dev_name), |
247 | strcpy(auto_dev_name, device_name); | 246 | "%s.%d.auto", device_name, r); |
248 | strcat(auto_dev_name, buf); | ||
249 | dev = bus_find_device_by_name(&platform_bus_type, NULL, auto_dev_name); | 247 | dev = bus_find_device_by_name(&platform_bus_type, NULL, auto_dev_name); |
250 | dev_info(dev, "device %s added to pm domain\n", auto_dev_name); | 248 | dev_info(dev, "device %s added to pm domain\n", auto_dev_name); |
251 | 249 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c index 90d6fc1618aa..4792f9d0b7d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | |||
@@ -118,6 +118,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, | |||
118 | usermm = amdgpu_ttm_tt_get_usermm(entry->robj->tbo.ttm); | 118 | usermm = amdgpu_ttm_tt_get_usermm(entry->robj->tbo.ttm); |
119 | if (usermm) { | 119 | if (usermm) { |
120 | if (usermm != current->mm) { | 120 | if (usermm != current->mm) { |
121 | amdgpu_bo_unref(&entry->robj); | ||
121 | r = -EPERM; | 122 | r = -EPERM; |
122 | goto error_free; | 123 | goto error_free; |
123 | } | 124 | } |
@@ -151,6 +152,8 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, | |||
151 | return 0; | 152 | return 0; |
152 | 153 | ||
153 | error_free: | 154 | error_free: |
155 | while (i--) | ||
156 | amdgpu_bo_unref(&array[i].robj); | ||
154 | drm_free_large(array); | 157 | drm_free_large(array); |
155 | return r; | 158 | return r; |
156 | } | 159 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index b5bdd5d59b58..db14a7bbb8f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -75,6 +75,7 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm, | |||
75 | } | 75 | } |
76 | 76 | ||
77 | ib->vm = vm; | 77 | ib->vm = vm; |
78 | ib->vm_id = 0; | ||
78 | 79 | ||
79 | return 0; | 80 | return 0; |
80 | } | 81 | } |
@@ -139,7 +140,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
139 | return -EINVAL; | 140 | return -EINVAL; |
140 | } | 141 | } |
141 | 142 | ||
142 | if (vm && !ibs->grabbed_vmid) { | 143 | if (vm && !ibs->vm_id) { |
143 | dev_err(adev->dev, "VM IB without ID\n"); | 144 | dev_err(adev->dev, "VM IB without ID\n"); |
144 | return -EINVAL; | 145 | return -EINVAL; |
145 | } | 146 | } |
@@ -152,10 +153,10 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
152 | 153 | ||
153 | if (vm) { | 154 | if (vm) { |
154 | /* do context switch */ | 155 | /* do context switch */ |
155 | amdgpu_vm_flush(ring, vm, last_vm_update); | 156 | amdgpu_vm_flush(ring, ib->vm_id, ib->vm_pd_addr); |
156 | 157 | ||
157 | if (ring->funcs->emit_gds_switch) | 158 | if (ring->funcs->emit_gds_switch) |
158 | amdgpu_ring_emit_gds_switch(ring, ib->vm->ids[ring->idx].id, | 159 | amdgpu_ring_emit_gds_switch(ring, ib->vm_id, |
159 | ib->gds_base, ib->gds_size, | 160 | ib->gds_base, ib->gds_size, |
160 | ib->gws_base, ib->gws_size, | 161 | ib->gws_base, ib->gws_size, |
161 | ib->oa_base, ib->oa_size); | 162 | ib->oa_base, ib->oa_size); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index f29bbb96a881..90e52f7e17a0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
@@ -105,16 +105,23 @@ static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) | |||
105 | 105 | ||
106 | struct fence *fence = amdgpu_sync_get_fence(&job->sync); | 106 | struct fence *fence = amdgpu_sync_get_fence(&job->sync); |
107 | 107 | ||
108 | if (fence == NULL && vm && !job->ibs->grabbed_vmid) { | 108 | if (fence == NULL && vm && !job->ibs->vm_id) { |
109 | struct amdgpu_ring *ring = job->ring; | 109 | struct amdgpu_ring *ring = job->ring; |
110 | unsigned i, vm_id; | ||
111 | uint64_t vm_pd_addr; | ||
110 | int r; | 112 | int r; |
111 | 113 | ||
112 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, | 114 | r = amdgpu_vm_grab_id(vm, ring, &job->sync, |
113 | &job->base.s_fence->base); | 115 | &job->base.s_fence->base, |
116 | &vm_id, &vm_pd_addr); | ||
114 | if (r) | 117 | if (r) |
115 | DRM_ERROR("Error getting VM ID (%d)\n", r); | 118 | DRM_ERROR("Error getting VM ID (%d)\n", r); |
116 | else | 119 | else { |
117 | job->ibs->grabbed_vmid = true; | 120 | for (i = 0; i < job->num_ibs; ++i) { |
121 | job->ibs[i].vm_id = vm_id; | ||
122 | job->ibs[i].vm_pd_addr = vm_pd_addr; | ||
123 | } | ||
124 | } | ||
118 | 125 | ||
119 | fence = amdgpu_sync_get_fence(&job->sync); | 126 | fence = amdgpu_sync_get_fence(&job->sync); |
120 | } | 127 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index 9ca3735c563c..26a5f4acf584 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | |||
@@ -100,21 +100,24 @@ TRACE_EVENT(amdgpu_sched_run_job, | |||
100 | 100 | ||
101 | 101 | ||
102 | TRACE_EVENT(amdgpu_vm_grab_id, | 102 | TRACE_EVENT(amdgpu_vm_grab_id, |
103 | TP_PROTO(struct amdgpu_vm *vm, unsigned vmid, int ring), | 103 | TP_PROTO(struct amdgpu_vm *vm, int ring, unsigned vmid, |
104 | TP_ARGS(vm, vmid, ring), | 104 | uint64_t pd_addr), |
105 | TP_ARGS(vm, ring, vmid, pd_addr), | ||
105 | TP_STRUCT__entry( | 106 | TP_STRUCT__entry( |
106 | __field(struct amdgpu_vm *, vm) | 107 | __field(struct amdgpu_vm *, vm) |
107 | __field(u32, vmid) | ||
108 | __field(u32, ring) | 108 | __field(u32, ring) |
109 | __field(u32, vmid) | ||
110 | __field(u64, pd_addr) | ||
109 | ), | 111 | ), |
110 | 112 | ||
111 | TP_fast_assign( | 113 | TP_fast_assign( |
112 | __entry->vm = vm; | 114 | __entry->vm = vm; |
113 | __entry->vmid = vmid; | ||
114 | __entry->ring = ring; | 115 | __entry->ring = ring; |
116 | __entry->vmid = vmid; | ||
117 | __entry->pd_addr = pd_addr; | ||
115 | ), | 118 | ), |
116 | TP_printk("vm=%p, id=%u, ring=%u", __entry->vm, __entry->vmid, | 119 | TP_printk("vm=%p, ring=%u, id=%u, pd_addr=%010Lx", __entry->vm, |
117 | __entry->ring) | 120 | __entry->ring, __entry->vmid, __entry->pd_addr) |
118 | ); | 121 | ); |
119 | 122 | ||
120 | TRACE_EVENT(amdgpu_vm_bo_map, | 123 | TRACE_EVENT(amdgpu_vm_bo_map, |
@@ -231,8 +234,8 @@ TRACE_EVENT(amdgpu_vm_flush, | |||
231 | __entry->ring = ring; | 234 | __entry->ring = ring; |
232 | __entry->id = id; | 235 | __entry->id = id; |
233 | ), | 236 | ), |
234 | TP_printk("pd_addr=%010Lx, ring=%u, id=%u", | 237 | TP_printk("ring=%u, id=%u, pd_addr=%010Lx", |
235 | __entry->pd_addr, __entry->ring, __entry->id) | 238 | __entry->ring, __entry->id, __entry->pd_addr) |
236 | ); | 239 | ); |
237 | 240 | ||
238 | TRACE_EVENT(amdgpu_bo_list_set, | 241 | TRACE_EVENT(amdgpu_bo_list_set, |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 264c5968a1d3..d9dc8bea5e98 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -50,6 +50,9 @@ | |||
50 | * SI supports 16. | 50 | * SI supports 16. |
51 | */ | 51 | */ |
52 | 52 | ||
53 | /* Special value that no flush is necessary */ | ||
54 | #define AMDGPU_VM_NO_FLUSH (~0ll) | ||
55 | |||
53 | /** | 56 | /** |
54 | * amdgpu_vm_num_pde - return the number of page directory entries | 57 | * amdgpu_vm_num_pde - return the number of page directory entries |
55 | * | 58 | * |
@@ -157,50 +160,70 @@ void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev, | |||
157 | * Allocate an id for the vm, adding fences to the sync obj as necessary. | 160 | * Allocate an id for the vm, adding fences to the sync obj as necessary. |
158 | */ | 161 | */ |
159 | int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | 162 | int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, |
160 | struct amdgpu_sync *sync, struct fence *fence) | 163 | struct amdgpu_sync *sync, struct fence *fence, |
164 | unsigned *vm_id, uint64_t *vm_pd_addr) | ||
161 | { | 165 | { |
162 | struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx]; | 166 | uint64_t pd_addr = amdgpu_bo_gpu_offset(vm->page_directory); |
163 | struct amdgpu_device *adev = ring->adev; | 167 | struct amdgpu_device *adev = ring->adev; |
164 | struct amdgpu_vm_manager_id *id; | 168 | struct amdgpu_vm_id *id = &vm->ids[ring->idx]; |
169 | struct fence *updates = sync->last_vm_update; | ||
165 | int r; | 170 | int r; |
166 | 171 | ||
167 | mutex_lock(&adev->vm_manager.lock); | 172 | mutex_lock(&adev->vm_manager.lock); |
168 | 173 | ||
169 | /* check if the id is still valid */ | 174 | /* check if the id is still valid */ |
170 | if (vm_id->id) { | 175 | if (id->mgr_id) { |
176 | struct fence *flushed = id->flushed_updates; | ||
177 | bool is_later; | ||
171 | long owner; | 178 | long owner; |
172 | 179 | ||
173 | id = &adev->vm_manager.ids[vm_id->id]; | 180 | if (!flushed) |
174 | owner = atomic_long_read(&id->owner); | 181 | is_later = true; |
175 | if (owner == (long)vm) { | 182 | else if (!updates) |
176 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); | 183 | is_later = false; |
177 | trace_amdgpu_vm_grab_id(vm, vm_id->id, ring->idx); | 184 | else |
185 | is_later = fence_is_later(updates, flushed); | ||
186 | |||
187 | owner = atomic_long_read(&id->mgr_id->owner); | ||
188 | if (!is_later && owner == (long)id && | ||
189 | pd_addr == id->pd_gpu_addr) { | ||
190 | |||
191 | fence_put(id->mgr_id->active); | ||
192 | id->mgr_id->active = fence_get(fence); | ||
193 | |||
194 | list_move_tail(&id->mgr_id->list, | ||
195 | &adev->vm_manager.ids_lru); | ||
178 | 196 | ||
179 | fence_put(id->active); | 197 | *vm_id = id->mgr_id - adev->vm_manager.ids; |
180 | id->active = fence_get(fence); | 198 | *vm_pd_addr = AMDGPU_VM_NO_FLUSH; |
199 | trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id, | ||
200 | *vm_pd_addr); | ||
181 | 201 | ||
182 | mutex_unlock(&adev->vm_manager.lock); | 202 | mutex_unlock(&adev->vm_manager.lock); |
183 | return 0; | 203 | return 0; |
184 | } | 204 | } |
185 | } | 205 | } |
186 | 206 | ||
187 | /* we definately need to flush */ | 207 | id->mgr_id = list_first_entry(&adev->vm_manager.ids_lru, |
188 | vm_id->pd_gpu_addr = ~0ll; | 208 | struct amdgpu_vm_manager_id, |
209 | list); | ||
189 | 210 | ||
190 | id = list_first_entry(&adev->vm_manager.ids_lru, | 211 | r = amdgpu_sync_fence(ring->adev, sync, id->mgr_id->active); |
191 | struct amdgpu_vm_manager_id, | 212 | if (!r) { |
192 | list); | 213 | fence_put(id->mgr_id->active); |
193 | list_move_tail(&id->list, &adev->vm_manager.ids_lru); | 214 | id->mgr_id->active = fence_get(fence); |
194 | atomic_long_set(&id->owner, (long)vm); | ||
195 | 215 | ||
196 | vm_id->id = id - adev->vm_manager.ids; | 216 | fence_put(id->flushed_updates); |
197 | trace_amdgpu_vm_grab_id(vm, vm_id->id, ring->idx); | 217 | id->flushed_updates = fence_get(updates); |
198 | 218 | ||
199 | r = amdgpu_sync_fence(ring->adev, sync, id->active); | 219 | id->pd_gpu_addr = pd_addr; |
200 | 220 | ||
201 | if (!r) { | 221 | list_move_tail(&id->mgr_id->list, &adev->vm_manager.ids_lru); |
202 | fence_put(id->active); | 222 | atomic_long_set(&id->mgr_id->owner, (long)id); |
203 | id->active = fence_get(fence); | 223 | |
224 | *vm_id = id->mgr_id - adev->vm_manager.ids; | ||
225 | *vm_pd_addr = pd_addr; | ||
226 | trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id, *vm_pd_addr); | ||
204 | } | 227 | } |
205 | 228 | ||
206 | mutex_unlock(&adev->vm_manager.lock); | 229 | mutex_unlock(&adev->vm_manager.lock); |
@@ -211,35 +234,18 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
211 | * amdgpu_vm_flush - hardware flush the vm | 234 | * amdgpu_vm_flush - hardware flush the vm |
212 | * | 235 | * |
213 | * @ring: ring to use for flush | 236 | * @ring: ring to use for flush |
214 | * @vm: vm we want to flush | 237 | * @vmid: vmid number to use |
215 | * @updates: last vm update that we waited for | 238 | * @pd_addr: address of the page directory |
216 | * | 239 | * |
217 | * Flush the vm. | 240 | * Emit a VM flush when it is necessary. |
218 | */ | 241 | */ |
219 | void amdgpu_vm_flush(struct amdgpu_ring *ring, | 242 | void amdgpu_vm_flush(struct amdgpu_ring *ring, |
220 | struct amdgpu_vm *vm, | 243 | unsigned vmid, |
221 | struct fence *updates) | 244 | uint64_t pd_addr) |
222 | { | 245 | { |
223 | uint64_t pd_addr = amdgpu_bo_gpu_offset(vm->page_directory); | 246 | if (pd_addr != AMDGPU_VM_NO_FLUSH) { |
224 | struct amdgpu_vm_id *vm_id = &vm->ids[ring->idx]; | 247 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vmid); |
225 | struct fence *flushed_updates = vm_id->flushed_updates; | 248 | amdgpu_ring_emit_vm_flush(ring, vmid, pd_addr); |
226 | bool is_later; | ||
227 | |||
228 | if (!flushed_updates) | ||
229 | is_later = true; | ||
230 | else if (!updates) | ||
231 | is_later = false; | ||
232 | else | ||
233 | is_later = fence_is_later(updates, flushed_updates); | ||
234 | |||
235 | if (pd_addr != vm_id->pd_gpu_addr || is_later) { | ||
236 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id->id); | ||
237 | if (is_later) { | ||
238 | vm_id->flushed_updates = fence_get(updates); | ||
239 | fence_put(flushed_updates); | ||
240 | } | ||
241 | vm_id->pd_gpu_addr = pd_addr; | ||
242 | amdgpu_ring_emit_vm_flush(ring, vm_id->id, vm_id->pd_gpu_addr); | ||
243 | } | 249 | } |
244 | } | 250 | } |
245 | 251 | ||
@@ -1284,7 +1290,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
1284 | int i, r; | 1290 | int i, r; |
1285 | 1291 | ||
1286 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { | 1292 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { |
1287 | vm->ids[i].id = 0; | 1293 | vm->ids[i].mgr_id = NULL; |
1288 | vm->ids[i].flushed_updates = NULL; | 1294 | vm->ids[i].flushed_updates = NULL; |
1289 | } | 1295 | } |
1290 | vm->va = RB_ROOT; | 1296 | vm->va = RB_ROOT; |
@@ -1381,13 +1387,13 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
1381 | amdgpu_bo_unref(&vm->page_directory); | 1387 | amdgpu_bo_unref(&vm->page_directory); |
1382 | fence_put(vm->page_directory_fence); | 1388 | fence_put(vm->page_directory_fence); |
1383 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { | 1389 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { |
1384 | unsigned id = vm->ids[i].id; | 1390 | struct amdgpu_vm_id *id = &vm->ids[i]; |
1385 | 1391 | ||
1386 | atomic_long_cmpxchg(&adev->vm_manager.ids[id].owner, | 1392 | if (id->mgr_id) |
1387 | (long)vm, 0); | 1393 | atomic_long_cmpxchg(&id->mgr_id->owner, |
1388 | fence_put(vm->ids[i].flushed_updates); | 1394 | (long)id, 0); |
1395 | fence_put(id->flushed_updates); | ||
1389 | } | 1396 | } |
1390 | |||
1391 | } | 1397 | } |
1392 | 1398 | ||
1393 | /** | 1399 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 675f34916aab..e4e4b2ac77b7 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c | |||
@@ -212,7 +212,7 @@ static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | |||
212 | static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring, | 212 | static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring, |
213 | struct amdgpu_ib *ib) | 213 | struct amdgpu_ib *ib) |
214 | { | 214 | { |
215 | u32 extra_bits = (ib->vm ? ib->vm->ids[ring->idx].id : 0) & 0xf; | 215 | u32 extra_bits = ib->vm_id & 0xf; |
216 | u32 next_rptr = ring->wptr + 5; | 216 | u32 next_rptr = ring->wptr + 5; |
217 | 217 | ||
218 | while ((next_rptr & 7) != 4) | 218 | while ((next_rptr & 7) != 4) |
diff --git a/drivers/gpu/drm/amd/amdgpu/cikd.h b/drivers/gpu/drm/amd/amdgpu/cikd.h index 7f6d457f250a..60d4493206dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/cikd.h +++ b/drivers/gpu/drm/amd/amdgpu/cikd.h | |||
@@ -46,9 +46,6 @@ | |||
46 | #define BONAIRE_GB_ADDR_CONFIG_GOLDEN 0x12010001 | 46 | #define BONAIRE_GB_ADDR_CONFIG_GOLDEN 0x12010001 |
47 | #define HAWAII_GB_ADDR_CONFIG_GOLDEN 0x12011003 | 47 | #define HAWAII_GB_ADDR_CONFIG_GOLDEN 0x12011003 |
48 | 48 | ||
49 | #define CIK_RB_BITMAP_WIDTH_PER_SH 2 | ||
50 | #define HAWAII_RB_BITMAP_WIDTH_PER_SH 4 | ||
51 | |||
52 | #define AMDGPU_NUM_OF_VMIDS 8 | 49 | #define AMDGPU_NUM_OF_VMIDS 8 |
53 | 50 | ||
54 | #define PIPEID(x) ((x) << 0) | 51 | #define PIPEID(x) ((x) << 0) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 250bcbce7fdc..8fb7ebf3be3e 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | |||
@@ -1635,30 +1635,25 @@ static u32 gfx_v7_0_get_rb_active_bitmap(struct amdgpu_device *adev) | |||
1635 | static void gfx_v7_0_setup_rb(struct amdgpu_device *adev) | 1635 | static void gfx_v7_0_setup_rb(struct amdgpu_device *adev) |
1636 | { | 1636 | { |
1637 | int i, j; | 1637 | int i, j; |
1638 | u32 data, tmp, num_rbs = 0; | 1638 | u32 data; |
1639 | u32 active_rbs = 0; | 1639 | u32 active_rbs = 0; |
1640 | u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / | ||
1641 | adev->gfx.config.max_sh_per_se; | ||
1640 | 1642 | ||
1641 | mutex_lock(&adev->grbm_idx_mutex); | 1643 | mutex_lock(&adev->grbm_idx_mutex); |
1642 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | 1644 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
1643 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { | 1645 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
1644 | gfx_v7_0_select_se_sh(adev, i, j); | 1646 | gfx_v7_0_select_se_sh(adev, i, j); |
1645 | data = gfx_v7_0_get_rb_active_bitmap(adev); | 1647 | data = gfx_v7_0_get_rb_active_bitmap(adev); |
1646 | if (adev->asic_type == CHIP_HAWAII) | 1648 | active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * |
1647 | active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * | 1649 | rb_bitmap_width_per_sh); |
1648 | HAWAII_RB_BITMAP_WIDTH_PER_SH); | ||
1649 | else | ||
1650 | active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * | ||
1651 | CIK_RB_BITMAP_WIDTH_PER_SH); | ||
1652 | } | 1650 | } |
1653 | } | 1651 | } |
1654 | gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff); | 1652 | gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff); |
1655 | mutex_unlock(&adev->grbm_idx_mutex); | 1653 | mutex_unlock(&adev->grbm_idx_mutex); |
1656 | 1654 | ||
1657 | adev->gfx.config.backend_enable_mask = active_rbs; | 1655 | adev->gfx.config.backend_enable_mask = active_rbs; |
1658 | tmp = active_rbs; | 1656 | adev->gfx.config.num_rbs = hweight32(active_rbs); |
1659 | while (tmp >>= 1) | ||
1660 | num_rbs++; | ||
1661 | adev->gfx.config.num_rbs = num_rbs; | ||
1662 | } | 1657 | } |
1663 | 1658 | ||
1664 | /** | 1659 | /** |
@@ -2046,8 +2041,7 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, | |||
2046 | else | 2041 | else |
2047 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | 2042 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); |
2048 | 2043 | ||
2049 | control |= ib->length_dw | | 2044 | control |= ib->length_dw | (ib->vm_id << 24); |
2050 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
2051 | 2045 | ||
2052 | amdgpu_ring_write(ring, header); | 2046 | amdgpu_ring_write(ring, header); |
2053 | amdgpu_ring_write(ring, | 2047 | amdgpu_ring_write(ring, |
@@ -2075,8 +2069,7 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | |||
2075 | 2069 | ||
2076 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | 2070 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); |
2077 | 2071 | ||
2078 | control |= ib->length_dw | | 2072 | control |= ib->length_dw | (ib->vm_id << 24); |
2079 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
2080 | 2073 | ||
2081 | amdgpu_ring_write(ring, header); | 2074 | amdgpu_ring_write(ring, header); |
2082 | amdgpu_ring_write(ring, | 2075 | amdgpu_ring_write(ring, |
@@ -3825,8 +3818,7 @@ static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev) | |||
3825 | data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; | 3818 | data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; |
3826 | data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; | 3819 | data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; |
3827 | 3820 | ||
3828 | mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_backends_per_se / | 3821 | mask = gfx_v7_0_create_bitmask(adev->gfx.config.max_cu_per_sh); |
3829 | adev->gfx.config.max_sh_per_se); | ||
3830 | 3822 | ||
3831 | return (~data) & mask; | 3823 | return (~data) & mask; |
3832 | } | 3824 | } |
@@ -5237,6 +5229,8 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev, | |||
5237 | if (!adev || !cu_info) | 5229 | if (!adev || !cu_info) |
5238 | return -EINVAL; | 5230 | return -EINVAL; |
5239 | 5231 | ||
5232 | memset(cu_info, 0, sizeof(*cu_info)); | ||
5233 | |||
5240 | mutex_lock(&adev->grbm_idx_mutex); | 5234 | mutex_lock(&adev->grbm_idx_mutex); |
5241 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | 5235 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
5242 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { | 5236 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 10c865087d0a..e37378fe1edc 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -2613,8 +2613,10 @@ static u32 gfx_v8_0_get_rb_active_bitmap(struct amdgpu_device *adev) | |||
2613 | static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) | 2613 | static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) |
2614 | { | 2614 | { |
2615 | int i, j; | 2615 | int i, j; |
2616 | u32 data, tmp, num_rbs = 0; | 2616 | u32 data; |
2617 | u32 active_rbs = 0; | 2617 | u32 active_rbs = 0; |
2618 | u32 rb_bitmap_width_per_sh = adev->gfx.config.max_backends_per_se / | ||
2619 | adev->gfx.config.max_sh_per_se; | ||
2618 | 2620 | ||
2619 | mutex_lock(&adev->grbm_idx_mutex); | 2621 | mutex_lock(&adev->grbm_idx_mutex); |
2620 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | 2622 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
@@ -2622,17 +2624,14 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) | |||
2622 | gfx_v8_0_select_se_sh(adev, i, j); | 2624 | gfx_v8_0_select_se_sh(adev, i, j); |
2623 | data = gfx_v8_0_get_rb_active_bitmap(adev); | 2625 | data = gfx_v8_0_get_rb_active_bitmap(adev); |
2624 | active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * | 2626 | active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) * |
2625 | RB_BITMAP_WIDTH_PER_SH); | 2627 | rb_bitmap_width_per_sh); |
2626 | } | 2628 | } |
2627 | } | 2629 | } |
2628 | gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff); | 2630 | gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff); |
2629 | mutex_unlock(&adev->grbm_idx_mutex); | 2631 | mutex_unlock(&adev->grbm_idx_mutex); |
2630 | 2632 | ||
2631 | adev->gfx.config.backend_enable_mask = active_rbs; | 2633 | adev->gfx.config.backend_enable_mask = active_rbs; |
2632 | tmp = active_rbs; | 2634 | adev->gfx.config.num_rbs = hweight32(active_rbs); |
2633 | while (tmp >>= 1) | ||
2634 | num_rbs++; | ||
2635 | adev->gfx.config.num_rbs = num_rbs; | ||
2636 | } | 2635 | } |
2637 | 2636 | ||
2638 | /** | 2637 | /** |
@@ -4622,8 +4621,7 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, | |||
4622 | else | 4621 | else |
4623 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | 4622 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); |
4624 | 4623 | ||
4625 | control |= ib->length_dw | | 4624 | control |= ib->length_dw | (ib->vm_id << 24); |
4626 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
4627 | 4625 | ||
4628 | amdgpu_ring_write(ring, header); | 4626 | amdgpu_ring_write(ring, header); |
4629 | amdgpu_ring_write(ring, | 4627 | amdgpu_ring_write(ring, |
@@ -4652,8 +4650,7 @@ static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, | |||
4652 | 4650 | ||
4653 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); | 4651 | header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); |
4654 | 4652 | ||
4655 | control |= ib->length_dw | | 4653 | control |= ib->length_dw | (ib->vm_id << 24); |
4656 | (ib->vm ? (ib->vm->ids[ring->idx].id << 24) : 0); | ||
4657 | 4654 | ||
4658 | amdgpu_ring_write(ring, header); | 4655 | amdgpu_ring_write(ring, header); |
4659 | amdgpu_ring_write(ring, | 4656 | amdgpu_ring_write(ring, |
@@ -5131,8 +5128,7 @@ static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev) | |||
5131 | data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; | 5128 | data &= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS_MASK; |
5132 | data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; | 5129 | data >>= CC_GC_SHADER_ARRAY_CONFIG__INACTIVE_CUS__SHIFT; |
5133 | 5130 | ||
5134 | mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_backends_per_se / | 5131 | mask = gfx_v8_0_create_bitmask(adev->gfx.config.max_cu_per_sh); |
5135 | adev->gfx.config.max_sh_per_se); | ||
5136 | 5132 | ||
5137 | return (~data) & mask; | 5133 | return (~data) & mask; |
5138 | } | 5134 | } |
@@ -5146,6 +5142,8 @@ int gfx_v8_0_get_cu_info(struct amdgpu_device *adev, | |||
5146 | if (!adev || !cu_info) | 5142 | if (!adev || !cu_info) |
5147 | return -EINVAL; | 5143 | return -EINVAL; |
5148 | 5144 | ||
5145 | memset(cu_info, 0, sizeof(*cu_info)); | ||
5146 | |||
5149 | mutex_lock(&adev->grbm_idx_mutex); | 5147 | mutex_lock(&adev->grbm_idx_mutex); |
5150 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { | 5148 | for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { |
5151 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { | 5149 | for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index 29ec986dd6fc..dddb8d6a81f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | |||
@@ -244,7 +244,7 @@ static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | |||
244 | static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring, | 244 | static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring, |
245 | struct amdgpu_ib *ib) | 245 | struct amdgpu_ib *ib) |
246 | { | 246 | { |
247 | u32 vmid = (ib->vm ? ib->vm->ids[ring->idx].id : 0) & 0xf; | 247 | u32 vmid = ib->vm_id & 0xf; |
248 | u32 next_rptr = ring->wptr + 5; | 248 | u32 next_rptr = ring->wptr + 5; |
249 | 249 | ||
250 | while ((next_rptr & 7) != 2) | 250 | while ((next_rptr & 7) != 2) |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 6f064d7076e6..19e02f7a06f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | |||
@@ -355,7 +355,7 @@ static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count) | |||
355 | static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring, | 355 | static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring, |
356 | struct amdgpu_ib *ib) | 356 | struct amdgpu_ib *ib) |
357 | { | 357 | { |
358 | u32 vmid = (ib->vm ? ib->vm->ids[ring->idx].id : 0) & 0xf; | 358 | u32 vmid = ib->vm_id & 0xf; |
359 | u32 next_rptr = ring->wptr + 5; | 359 | u32 next_rptr = ring->wptr + 5; |
360 | 360 | ||
361 | while ((next_rptr & 7) != 2) | 361 | while ((next_rptr & 7) != 2) |
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h index d98aa9d82fa1..ace49976f7be 100644 --- a/drivers/gpu/drm/amd/amdgpu/vid.h +++ b/drivers/gpu/drm/amd/amdgpu/vid.h | |||
@@ -71,8 +71,6 @@ | |||
71 | #define VMID(x) ((x) << 4) | 71 | #define VMID(x) ((x) << 4) |
72 | #define QUEUEID(x) ((x) << 8) | 72 | #define QUEUEID(x) ((x) << 8) |
73 | 73 | ||
74 | #define RB_BITMAP_WIDTH_PER_SH 2 | ||
75 | |||
76 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 | 74 | #define MC_SEQ_MISC0__MT__MASK 0xf0000000 |
77 | #define MC_SEQ_MISC0__MT__GDDR1 0x10000000 | 75 | #define MC_SEQ_MISC0__MT__GDDR1 0x10000000 |
78 | #define MC_SEQ_MISC0__MT__DDR2 0x20000000 | 76 | #define MC_SEQ_MISC0__MT__DDR2 0x20000000 |