aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c17
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_job.c8
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c104
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/atombios_encoders.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ci_dpm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/iceland_dpm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/iceland_smc.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/iceland_smum.h (renamed from drivers/gpu/drm/amd/amdgpu/iceland_smumgr.h)0
-rw-r--r--drivers/gpu/drm/amd/amdgpu/kv_dpm.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/ppsmc.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c43
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c15
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v3_0.c143
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c14
-rw-r--r--drivers/gpu/drm/amd/include/cgs_common.h4
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c9
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c299
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c13
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.h17
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/smumgr.h29
-rw-r--r--drivers/gpu/drm/radeon/atombios_encoders.c1
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
180err:
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
151TRACE_EVENT(amdgpu_vm_grab_id, 151TRACE_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)