Skip to content

Commit adbe8a3

Browse files
committed
Merge tag 'amd-drm-fixes-5.8-2020-07-15' of git://people.freedesktop.org/~agd5f/linux into drm-fixes
amd-drm-fixes-5.8-2020-07-15: amdgpu: - Fix a race condition with KIQ - Preemption fix - Fix handling of fake MST encoders - OLED panel fix - Handle allocation failure in stream construction - Renoir SMC fix - SDMA 5.x fix Signed-off-by: Dave Airlie <[email protected]> From: Alex Deucher <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents 524d4f7 + 0505149 commit adbe8a3

File tree

9 files changed

+101
-56
lines changed

9 files changed

+101
-56
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1295,27 +1295,37 @@ static void amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler *sched)
12951295
static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring)
12961296
{
12971297
struct amdgpu_job *job;
1298-
struct drm_sched_job *s_job;
1298+
struct drm_sched_job *s_job, *tmp;
12991299
uint32_t preempt_seq;
13001300
struct dma_fence *fence, **ptr;
13011301
struct amdgpu_fence_driver *drv = &ring->fence_drv;
13021302
struct drm_gpu_scheduler *sched = &ring->sched;
1303+
bool preempted = true;
13031304

13041305
if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
13051306
return;
13061307

13071308
preempt_seq = le32_to_cpu(*(drv->cpu_addr + 2));
1308-
if (preempt_seq <= atomic_read(&drv->last_seq))
1309-
return;
1309+
if (preempt_seq <= atomic_read(&drv->last_seq)) {
1310+
preempted = false;
1311+
goto no_preempt;
1312+
}
13101313

13111314
preempt_seq &= drv->num_fences_mask;
13121315
ptr = &drv->fences[preempt_seq];
13131316
fence = rcu_dereference_protected(*ptr, 1);
13141317

1318+
no_preempt:
13151319
spin_lock(&sched->job_list_lock);
1316-
list_for_each_entry(s_job, &sched->ring_mirror_list, node) {
1320+
list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
1321+
if (dma_fence_is_signaled(&s_job->s_fence->finished)) {
1322+
/* remove job from ring_mirror_list */
1323+
list_del_init(&s_job->node);
1324+
sched->ops->free_job(s_job);
1325+
continue;
1326+
}
13171327
job = to_amdgpu_job(s_job);
1318-
if (job->fence == fence)
1328+
if (preempted && job->fence == fence)
13191329
/* mark the job as preempted */
13201330
job->preemption_status |= AMDGPU_IB_PREEMPTED;
13211331
}

drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7513,12 +7513,17 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
75137513
struct amdgpu_device *adev = ring->adev;
75147514
struct amdgpu_kiq *kiq = &adev->gfx.kiq;
75157515
struct amdgpu_ring *kiq_ring = &kiq->ring;
7516+
unsigned long flags;
75167517

75177518
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
75187519
return -EINVAL;
75197520

7520-
if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size))
7521+
spin_lock_irqsave(&kiq->ring_lock, flags);
7522+
7523+
if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
7524+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
75217525
return -ENOMEM;
7526+
}
75227527

75237528
/* assert preemption condition */
75247529
amdgpu_ring_set_preempt_cond_exec(ring, false);
@@ -7529,6 +7534,8 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
75297534
++ring->trail_seq);
75307535
amdgpu_ring_commit(kiq_ring);
75317536

7537+
spin_unlock_irqrestore(&kiq->ring_lock, flags);
7538+
75327539
/* poll the trailing fence */
75337540
for (i = 0; i < adev->usec_timeout; i++) {
75347541
if (ring->trail_seq ==

drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -314,30 +314,20 @@ static uint64_t sdma_v5_0_ring_get_rptr(struct amdgpu_ring *ring)
314314
static uint64_t sdma_v5_0_ring_get_wptr(struct amdgpu_ring *ring)
315315
{
316316
struct amdgpu_device *adev = ring->adev;
317-
u64 *wptr = NULL;
318-
uint64_t local_wptr = 0;
317+
u64 wptr;
319318

320319
if (ring->use_doorbell) {
321320
/* XXX check if swapping is necessary on BE */
322-
wptr = ((u64 *)&adev->wb.wb[ring->wptr_offs]);
323-
DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", *wptr);
324-
*wptr = (*wptr) >> 2;
325-
DRM_DEBUG("wptr/doorbell after shift == 0x%016llx\n", *wptr);
321+
wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs]));
322+
DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr);
326323
} else {
327-
u32 lowbit, highbit;
328-
329-
wptr = &local_wptr;
330-
lowbit = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)) >> 2;
331-
highbit = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)) >> 2;
332-
333-
DRM_DEBUG("wptr [%i]high== 0x%08x low==0x%08x\n",
334-
ring->me, highbit, lowbit);
335-
*wptr = highbit;
336-
*wptr = (*wptr) << 32;
337-
*wptr |= lowbit;
324+
wptr = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI));
325+
wptr = wptr << 32;
326+
wptr |= RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR));
327+
DRM_DEBUG("wptr before shift [%i] wptr == 0x%016llx\n", ring->me, wptr);
338328
}
339329

340-
return *wptr;
330+
return wptr >> 2;
341331
}
342332

343333
/**

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
974974
/* Update the actual used number of crtc */
975975
adev->mode_info.num_crtc = adev->dm.display_indexes_num;
976976

977+
/* create fake encoders for MST */
978+
dm_dp_create_fake_mst_encoders(adev);
979+
977980
/* TODO: Add_display_info? */
978981

979982
/* TODO use dynamic cursor width */
@@ -997,6 +1000,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
9971000

9981001
static void amdgpu_dm_fini(struct amdgpu_device *adev)
9991002
{
1003+
int i;
1004+
1005+
for (i = 0; i < adev->dm.display_indexes_num; i++) {
1006+
drm_encoder_cleanup(&adev->dm.mst_encoders[i].base);
1007+
}
1008+
10001009
amdgpu_dm_audio_fini(adev);
10011010

10021011
amdgpu_dm_destroy_drm_device(&adev->dm);
@@ -2010,13 +2019,18 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
20102019
struct amdgpu_display_manager *dm;
20112020
struct drm_connector *conn_base;
20122021
struct amdgpu_device *adev;
2022+
struct dc_link *link = NULL;
20132023
static const u8 pre_computed_values[] = {
20142024
50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
20152025
71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98};
20162026

20172027
if (!aconnector || !aconnector->dc_link)
20182028
return;
20192029

2030+
link = aconnector->dc_link;
2031+
if (link->connector_signal != SIGNAL_TYPE_EDP)
2032+
return;
2033+
20202034
conn_base = &aconnector->base;
20212035
adev = conn_base->dev->dev_private;
20222036
dm = &adev->dm;

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
*/
4444

4545
#define AMDGPU_DM_MAX_DISPLAY_INDEX 31
46+
47+
#define AMDGPU_DM_MAX_CRTC 6
48+
4649
/*
4750
#include "include/amdgpu_dal_power_if.h"
4851
#include "amdgpu_dm_irq.h"
@@ -328,6 +331,13 @@ struct amdgpu_display_manager {
328331
* available in FW
329332
*/
330333
const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
334+
335+
/**
336+
* @mst_encoders:
337+
*
338+
* fake encoders used for DP MST.
339+
*/
340+
struct amdgpu_encoder mst_encoders[AMDGPU_DM_MAX_CRTC];
331341
};
332342

333343
struct amdgpu_dm_connector {
@@ -356,7 +366,6 @@ struct amdgpu_dm_connector {
356366
struct amdgpu_dm_dp_aux dm_dp_aux;
357367
struct drm_dp_mst_port *port;
358368
struct amdgpu_dm_connector *mst_port;
359-
struct amdgpu_encoder *mst_encoder;
360369
struct drm_dp_aux *dsc_aux;
361370

362371
/* TODO see if we can merge with ddc_bus or make a dm_connector */

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector)
9595
{
9696
struct amdgpu_dm_connector *aconnector =
9797
to_amdgpu_dm_connector(connector);
98-
struct amdgpu_encoder *amdgpu_encoder = aconnector->mst_encoder;
9998

10099
if (aconnector->dc_sink) {
101100
dc_link_remove_remote_sink(aconnector->dc_link,
@@ -105,8 +104,6 @@ dm_dp_mst_connector_destroy(struct drm_connector *connector)
105104

106105
kfree(aconnector->edid);
107106

108-
drm_encoder_cleanup(&amdgpu_encoder->base);
109-
kfree(amdgpu_encoder);
110107
drm_connector_cleanup(connector);
111108
drm_dp_mst_put_port_malloc(aconnector->port);
112109
kfree(aconnector);
@@ -243,7 +240,11 @@ static struct drm_encoder *
243240
dm_mst_atomic_best_encoder(struct drm_connector *connector,
244241
struct drm_connector_state *connector_state)
245242
{
246-
return &to_amdgpu_dm_connector(connector)->mst_encoder->base;
243+
struct drm_device *dev = connector->dev;
244+
struct amdgpu_device *adev = dev->dev_private;
245+
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(connector_state->crtc);
246+
247+
return &adev->dm.mst_encoders[acrtc->crtc_id].base;
247248
}
248249

249250
static int
@@ -306,31 +307,27 @@ static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = {
306307
.destroy = amdgpu_dm_encoder_destroy,
307308
};
308309

309-
static struct amdgpu_encoder *
310-
dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector)
310+
void
311+
dm_dp_create_fake_mst_encoders(struct amdgpu_device *adev)
311312
{
312-
struct drm_device *dev = connector->base.dev;
313-
struct amdgpu_device *adev = dev->dev_private;
314-
struct amdgpu_encoder *amdgpu_encoder;
315-
struct drm_encoder *encoder;
316-
317-
amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
318-
if (!amdgpu_encoder)
319-
return NULL;
313+
struct drm_device *dev = adev->ddev;
314+
int i;
320315

321-
encoder = &amdgpu_encoder->base;
322-
encoder->possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(adev);
316+
for (i = 0; i < adev->dm.display_indexes_num; i++) {
317+
struct amdgpu_encoder *amdgpu_encoder = &adev->dm.mst_encoders[i];
318+
struct drm_encoder *encoder = &amdgpu_encoder->base;
323319

324-
drm_encoder_init(
325-
dev,
326-
&amdgpu_encoder->base,
327-
&amdgpu_dm_encoder_funcs,
328-
DRM_MODE_ENCODER_DPMST,
329-
NULL);
320+
encoder->possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(adev);
330321

331-
drm_encoder_helper_add(encoder, &amdgpu_dm_encoder_helper_funcs);
322+
drm_encoder_init(
323+
dev,
324+
&amdgpu_encoder->base,
325+
&amdgpu_dm_encoder_funcs,
326+
DRM_MODE_ENCODER_DPMST,
327+
NULL);
332328

333-
return amdgpu_encoder;
329+
drm_encoder_helper_add(encoder, &amdgpu_dm_encoder_helper_funcs);
330+
}
334331
}
335332

336333
static struct drm_connector *
@@ -343,6 +340,7 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
343340
struct amdgpu_device *adev = dev->dev_private;
344341
struct amdgpu_dm_connector *aconnector;
345342
struct drm_connector *connector;
343+
int i;
346344

347345
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
348346
if (!aconnector)
@@ -369,9 +367,10 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
369367
master->dc_link,
370368
master->connector_id);
371369

372-
aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master);
373-
drm_connector_attach_encoder(&aconnector->base,
374-
&aconnector->mst_encoder->base);
370+
for (i = 0; i < adev->dm.display_indexes_num; i++) {
371+
drm_connector_attach_encoder(&aconnector->base,
372+
&adev->dm.mst_encoders[i].base);
373+
}
375374

376375
connector->max_bpc_property = master->base.max_bpc_property;
377376
if (connector->max_bpc_property)

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
3535
struct amdgpu_dm_connector *aconnector,
3636
int link_index);
3737

38+
void
39+
dm_dp_create_fake_mst_encoders(struct amdgpu_device *adev);
40+
3841
#if defined(CONFIG_DRM_AMD_DC_DCN)
3942
bool compute_mst_dsc_configs_for_state(struct drm_atomic_state *state,
4043
struct dc_state *dc_state);

drivers/gpu/drm/amd/display/dc/core/dc_stream.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink)
5656
}
5757
}
5858

59-
static void dc_stream_construct(struct dc_stream_state *stream,
59+
static bool dc_stream_construct(struct dc_stream_state *stream,
6060
struct dc_sink *dc_sink_data)
6161
{
6262
uint32_t i = 0;
@@ -118,11 +118,17 @@ static void dc_stream_construct(struct dc_stream_state *stream,
118118
update_stream_signal(stream, dc_sink_data);
119119

120120
stream->out_transfer_func = dc_create_transfer_func();
121+
if (stream->out_transfer_func == NULL) {
122+
dc_sink_release(dc_sink_data);
123+
return false;
124+
}
121125
stream->out_transfer_func->type = TF_TYPE_BYPASS;
122126
stream->out_transfer_func->ctx = stream->ctx;
123127

124128
stream->stream_id = stream->ctx->dc_stream_id_count;
125129
stream->ctx->dc_stream_id_count++;
130+
131+
return true;
126132
}
127133

128134
static void dc_stream_destruct(struct dc_stream_state *stream)
@@ -164,13 +170,20 @@ struct dc_stream_state *dc_create_stream_for_sink(
164170

165171
stream = kzalloc(sizeof(struct dc_stream_state), GFP_KERNEL);
166172
if (stream == NULL)
167-
return NULL;
173+
goto alloc_fail;
168174

169-
dc_stream_construct(stream, sink);
175+
if (dc_stream_construct(stream, sink) == false)
176+
goto construct_fail;
170177

171178
kref_init(&stream->refcount);
172179

173180
return stream;
181+
182+
construct_fail:
183+
kfree(stream);
184+
185+
alloc_fail:
186+
return NULL;
174187
}
175188

176189
struct dc_stream_state *dc_copy_stream(const struct dc_stream_state *stream)

drivers/gpu/drm/amd/powerplay/renoir_ppt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ static int renoir_set_power_profile_mode(struct smu_context *smu, long *input, u
689689
return -EINVAL;
690690
}
691691

692-
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_SetWorkloadMask,
692+
ret = smu_send_smc_msg_with_param(smu, SMU_MSG_ActiveProcessNotify,
693693
1 << workload_type,
694694
NULL);
695695
if (ret) {

0 commit comments

Comments
 (0)