diff options
30 files changed, 469 insertions, 360 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 5556ce979199..ee95e950a19b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | |||
| @@ -752,6 +752,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
| 752 | 752 | ||
| 753 | if (!adev->pm.fw) { | 753 | if (!adev->pm.fw) { |
| 754 | switch (adev->asic_type) { | 754 | switch (adev->asic_type) { |
| 755 | case CHIP_TOPAZ: | ||
| 756 | strcpy(fw_name, "amdgpu/topaz_smc.bin"); | ||
| 757 | break; | ||
| 755 | case CHIP_TONGA: | 758 | case CHIP_TONGA: |
| 756 | strcpy(fw_name, "amdgpu/tonga_smc.bin"); | 759 | strcpy(fw_name, "amdgpu/tonga_smc.bin"); |
| 757 | break; | 760 | break; |
| @@ -800,6 +803,7 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device, | |||
| 800 | 803 | ||
| 801 | info->version = adev->pm.fw_version; | 804 | info->version = adev->pm.fw_version; |
| 802 | info->image_size = ucode_size; | 805 | info->image_size = ucode_size; |
| 806 | info->ucode_start_address = ucode_start_address; | ||
| 803 | info->kptr = (void *)src; | 807 | info->kptr = (void *)src; |
| 804 | } | 808 | } |
| 805 | return 0; | 809 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index d1558768cfb7..0b109aebfec6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | |||
| @@ -204,16 +204,25 @@ void amdgpu_fence_process(struct amdgpu_ring *ring) | |||
| 204 | if (seq != ring->fence_drv.sync_seq) | 204 | if (seq != ring->fence_drv.sync_seq) |
| 205 | amdgpu_fence_schedule_fallback(ring); | 205 | amdgpu_fence_schedule_fallback(ring); |
| 206 | 206 | ||
| 207 | while (last_seq != seq) { | 207 | if (unlikely(seq == last_seq)) |
| 208 | return; | ||
| 209 | |||
| 210 | last_seq &= drv->num_fences_mask; | ||
| 211 | seq &= drv->num_fences_mask; | ||
| 212 | |||
| 213 | do { | ||
| 208 | struct fence *fence, **ptr; | 214 | struct fence *fence, **ptr; |
| 209 | 215 | ||
| 210 | ptr = &drv->fences[++last_seq & drv->num_fences_mask]; | 216 | ++last_seq; |
| 217 | last_seq &= drv->num_fences_mask; | ||
| 218 | ptr = &drv->fences[last_seq]; | ||
| 211 | 219 | ||
| 212 | /* There is always exactly one thread signaling this fence slot */ | 220 | /* There is always exactly one thread signaling this fence slot */ |
| 213 | fence = rcu_dereference_protected(*ptr, 1); | 221 | fence = rcu_dereference_protected(*ptr, 1); |
| 214 | RCU_INIT_POINTER(*ptr, NULL); | 222 | RCU_INIT_POINTER(*ptr, NULL); |
| 215 | 223 | ||
| 216 | BUG_ON(!fence); | 224 | if (!fence) |
| 225 | continue; | ||
| 217 | 226 | ||
| 218 | r = fence_signal(fence); | 227 | r = fence_signal(fence); |
| 219 | if (!r) | 228 | if (!r) |
| @@ -222,7 +231,7 @@ void amdgpu_fence_process(struct amdgpu_ring *ring) | |||
| 222 | BUG(); | 231 | BUG(); |
| 223 | 232 | ||
| 224 | fence_put(fence); | 233 | fence_put(fence); |
| 225 | } | 234 | } while (last_seq != seq); |
| 226 | } | 235 | } |
| 227 | 236 | ||
| 228 | /** | 237 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 46c3097c5224..428ebf3a4387 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
| @@ -122,7 +122,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 122 | bool skip_preamble, need_ctx_switch; | 122 | bool skip_preamble, need_ctx_switch; |
| 123 | unsigned patch_offset = ~0; | 123 | unsigned patch_offset = ~0; |
| 124 | struct amdgpu_vm *vm; | 124 | struct amdgpu_vm *vm; |
| 125 | struct fence *hwf; | ||
| 126 | uint64_t ctx; | 125 | uint64_t ctx; |
| 127 | 126 | ||
| 128 | unsigned i; | 127 | unsigned i; |
| @@ -190,7 +189,7 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 190 | if (ring->funcs->emit_hdp_invalidate) | 189 | if (ring->funcs->emit_hdp_invalidate) |
| 191 | amdgpu_ring_emit_hdp_invalidate(ring); | 190 | amdgpu_ring_emit_hdp_invalidate(ring); |
| 192 | 191 | ||
| 193 | r = amdgpu_fence_emit(ring, &hwf); | 192 | r = amdgpu_fence_emit(ring, f); |
| 194 | if (r) { | 193 | if (r) { |
| 195 | dev_err(adev->dev, "failed to emit fence (%d)\n", r); | 194 | dev_err(adev->dev, "failed to emit fence (%d)\n", r); |
| 196 | if (job && job->vm_id) | 195 | if (job && job->vm_id) |
| @@ -205,9 +204,6 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
| 205 | AMDGPU_FENCE_FLAG_64BIT); | 204 | AMDGPU_FENCE_FLAG_64BIT); |
| 206 | } | 205 | } |
| 207 | 206 | ||
| 208 | if (f) | ||
| 209 | *f = fence_get(hwf); | ||
| 210 | |||
| 211 | if (patch_offset != ~0 && ring->funcs->patch_cond_exec) | 207 | if (patch_offset != ~0 && ring->funcs->patch_cond_exec) |
| 212 | amdgpu_ring_patch_cond_exec(ring, patch_offset); | 208 | amdgpu_ring_patch_cond_exec(ring, patch_offset); |
| 213 | 209 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index aaee0c8f6731..6674d40eb3ab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | |||
| @@ -172,15 +172,13 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job) | |||
| 172 | trace_amdgpu_sched_run_job(job); | 172 | trace_amdgpu_sched_run_job(job); |
| 173 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, | 173 | r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs, |
| 174 | job->sync.last_vm_update, job, &fence); | 174 | job->sync.last_vm_update, job, &fence); |
| 175 | if (r) { | 175 | if (r) |
| 176 | DRM_ERROR("Error scheduling IBs (%d)\n", r); | 176 | DRM_ERROR("Error scheduling IBs (%d)\n", r); |
| 177 | goto err; | ||
| 178 | } | ||
| 179 | 177 | ||
| 180 | err: | ||
| 181 | /* if gpu reset, hw fence will be replaced here */ | 178 | /* if gpu reset, hw fence will be replaced here */ |
| 182 | fence_put(job->fence); | 179 | fence_put(job->fence); |
| 183 | job->fence = fence; | 180 | job->fence = fence_get(fence); |
| 181 | amdgpu_job_free_resources(job); | ||
| 184 | return fence; | 182 | return fence; |
| 185 | } | 183 | } |
| 186 | 184 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index 499803f3ce3a..0d8d65eb46cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | |||
| @@ -149,24 +149,26 @@ TRACE_EVENT(amdgpu_sched_run_job, | |||
| 149 | 149 | ||
| 150 | 150 | ||
| 151 | TRACE_EVENT(amdgpu_vm_grab_id, | 151 | TRACE_EVENT(amdgpu_vm_grab_id, |
| 152 | TP_PROTO(struct amdgpu_vm *vm, int ring, unsigned vmid, | 152 | TP_PROTO(struct amdgpu_vm *vm, int ring, struct amdgpu_job *job), |
| 153 | uint64_t pd_addr), | 153 | TP_ARGS(vm, ring, job), |
| 154 | TP_ARGS(vm, ring, vmid, pd_addr), | ||
| 155 | TP_STRUCT__entry( | 154 | TP_STRUCT__entry( |
| 156 | __field(struct amdgpu_vm *, vm) | 155 | __field(struct amdgpu_vm *, vm) |
| 157 | __field(u32, ring) | 156 | __field(u32, ring) |
| 158 | __field(u32, vmid) | 157 | __field(u32, vmid) |
| 159 | __field(u64, pd_addr) | 158 | __field(u64, pd_addr) |
