Skip to content

Commit dc7d19d

Browse files
committed
Merge tag 'amd-drm-fixes-5.18-2022-04-06' of https://gitlab.freedesktop.org/agd5f/linux into drm-fixes
amd-drm-fixes-5.18-2022-04-06: amdgpu: - VCN 3.0 fixes - DCN 3.1.5 fix - Misc display fixes - GC 10.3 golden register fix - Suspend fix - SMU 10 fix amdkfd: - Event fix Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20220406170441.5779-1-alexander.deucher@amd.com
2 parents c6b035e + 2f25d8c commit dc7d19d

22 files changed

Lines changed: 235 additions & 92 deletions

File tree

drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,8 @@ void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
300300
void amdgpu_ring_commit(struct amdgpu_ring *ring);
301301
void amdgpu_ring_undo(struct amdgpu_ring *ring);
302302
int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
303-
unsigned int ring_size, struct amdgpu_irq_src *irq_src,
304-
unsigned int irq_type, unsigned int prio,
303+
unsigned int max_dw, struct amdgpu_irq_src *irq_src,
304+
unsigned int irq_type, unsigned int hw_prio,
305305
atomic_t *sched_score);
306306
void amdgpu_ring_fini(struct amdgpu_ring *ring);
307307
void amdgpu_ring_emit_reg_write_reg_wait_helper(struct amdgpu_ring *ring,

drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@
159159
#define AMDGPU_VCN_MULTI_QUEUE_FLAG (1 << 8)
160160
#define AMDGPU_VCN_SW_RING_FLAG (1 << 9)
161161
#define AMDGPU_VCN_FW_LOGGING_FLAG (1 << 10)
162+
#define AMDGPU_VCN_SMU_VERSION_INFO_FLAG (1 << 11)
162163

163164
#define AMDGPU_VCN_IB_FLAG_DECODE_BUFFER 0x00000001
164165
#define AMDGPU_VCN_CMD_FLAG_MSG_BUFFER 0x00000001
@@ -279,6 +280,11 @@ struct amdgpu_fw_shared_fw_logging {
279280
uint32_t size;
280281
};
281282

283+
struct amdgpu_fw_shared_smu_interface_info {
284+
uint8_t smu_interface_type;
285+
uint8_t padding[3];
286+
};
287+
282288
struct amdgpu_fw_shared {
283289
uint32_t present_flag_0;
284290
uint8_t pad[44];
@@ -287,6 +293,7 @@ struct amdgpu_fw_shared {
287293
struct amdgpu_fw_shared_multi_queue multi_queue;
288294
struct amdgpu_fw_shared_sw_ring sw_ring;
289295
struct amdgpu_fw_shared_fw_logging fw_log;
296+
struct amdgpu_fw_shared_smu_interface_info smu_interface_info;
290297
};
291298

292299
struct amdgpu_vcn_fwlog {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3293,7 +3293,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3_3[] =
32933293
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280),
32943294
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000),
32953295
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1807ff, 0x00000242),
3296-
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff1ffff, 0x00000500),
3296+
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL_Vangogh, 0x1ff1ffff, 0x00000500),
32973297
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0x000000ff, 0x000000e4),
32983298
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_0, 0x77777777, 0x32103210),
32993299
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_1, 0x77777777, 0x32103210),
@@ -3429,7 +3429,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3_6[] =
34293429
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280),
34303430
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000),
34313431
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1807ff, 0x00000042),
3432-
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff1ffff, 0x00000500),
3432+
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL_Vangogh, 0x1ff1ffff, 0x00000500),
34333433
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0x000000ff, 0x00000044),
34343434
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_0, 0x77777777, 0x32103210),
34353435
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_1, 0x77777777, 0x32103210),
@@ -3454,7 +3454,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3_7[] = {
34543454
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG3, 0xffffffff, 0x00000280),
34553455
SOC15_REG_GOLDEN_VALUE(GC, 0, mmDB_DEBUG4, 0xffffffff, 0x00800000),
34563456
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGB_ADDR_CONFIG, 0x0c1807ff, 0x00000041),
3457-
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL, 0x1ff1ffff, 0x00000500),
3457+
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGCR_GENERAL_CNTL_Vangogh, 0x1ff1ffff, 0x00000500),
34583458
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL1_PIPE_STEER, 0x000000ff, 0x000000e4),
34593459
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_0, 0x77777777, 0x32103210),
34603460
SOC15_REG_GOLDEN_VALUE(GC, 0, mmGL2_PIPE_STEER_1, 0x77777777, 0x32103210),

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ static int vcn_v3_0_sw_init(void *handle)
219219
cpu_to_le32(AMDGPU_VCN_MULTI_QUEUE_FLAG) |
220220
cpu_to_le32(AMDGPU_VCN_FW_SHARED_FLAG_0_RB);
221221
fw_shared->sw_ring.is_enabled = cpu_to_le32(DEC_SW_RING_ENABLED);
222+
fw_shared->present_flag_0 |= AMDGPU_VCN_SMU_VERSION_INFO_FLAG;
223+
if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(3, 1, 2))
224+
fw_shared->smu_interface_info.smu_interface_type = 2;
225+
else if (adev->ip_versions[UVD_HWIP][0] == IP_VERSION(3, 1, 1))
226+
fw_shared->smu_interface_info.smu_interface_type = 1;
222227

223228
if (amdgpu_vcnfw_log)
224229
amdgpu_vcn_fwlog_init(&adev->vcn.inst[i]);
@@ -1483,7 +1488,7 @@ static int vcn_v3_0_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)
14831488
struct dpg_pause_state state = {.fw_based = VCN_DPG_STATE__UNPAUSE};
14841489
uint32_t tmp;
14851490

1486-
vcn_v3_0_pause_dpg_mode(adev, 0, &state);
1491+
vcn_v3_0_pause_dpg_mode(adev, inst_idx, &state);
14871492

14881493
/* Wait for power status to be 1 */
14891494
SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,

drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,6 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
247247
return ret;
248248
}
249249

250-
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
251-
O_RDWR);
252-
if (ret < 0) {
253-
kfifo_free(&client->fifo);
254-
kfree(client);
255-
return ret;
256-
}
257-
*fd = ret;
258-
259250
init_waitqueue_head(&client->wait_queue);
260251
spin_lock_init(&client->lock);
261252
client->events = 0;
@@ -265,5 +256,20 @@ int kfd_smi_event_open(struct kfd_dev *dev, uint32_t *fd)
265256
list_add_rcu(&client->list, &dev->smi_clients);
266257
spin_unlock(&dev->smi_lock);
267258

259+
ret = anon_inode_getfd(kfd_smi_name, &kfd_smi_ev_fops, (void *)client,
260+
O_RDWR);
261+
if (ret < 0) {
262+
spin_lock(&dev->smi_lock);
263+
list_del_rcu(&client->list);
264+
spin_unlock(&dev->smi_lock);
265+
266+
synchronize_rcu();
267+
268+
kfifo_free(&client->fifo);
269+
kfree(client);
270+
return ret;
271+
}
272+
*fd = ret;
273+
268274
return 0;
269275
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2714,7 +2714,8 @@ static int dm_resume(void *handle)
27142714
* this is the case when traversing through already created
27152715
* MST connectors, should be skipped
27162716
*/
2717-
if (aconnector->mst_port)
2717+
if (aconnector->dc_link &&
2718+
aconnector->dc_link->type == dc_connection_mst_branch)
27182719
continue;
27192720

27202721
mutex_lock(&aconnector->hpd_lock);
@@ -3972,7 +3973,7 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap
39723973
max - min);
39733974
}
39743975

3975-
static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
3976+
static void amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
39763977
int bl_idx,
39773978
u32 user_brightness)
39783979
{
@@ -4003,7 +4004,8 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
40034004
DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx);
40044005
}
40054006

4006-
return rc ? 0 : 1;
4007+
if (rc)
4008+
dm->actual_brightness[bl_idx] = user_brightness;
40074009
}
40084010

40094011
static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
@@ -9947,7 +9949,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
99479949
/* restore the backlight level */
99489950
for (i = 0; i < dm->num_of_edps; i++) {
99499951
if (dm->backlight_dev[i] &&
9950-
(amdgpu_dm_backlight_get_level(dm, i) != dm->brightness[i]))
9952+
(dm->actual_brightness[i] != dm->brightness[i]))
99519953
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
99529954
}
99539955
#endif

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,12 @@ struct amdgpu_display_manager {
540540
* cached backlight values.
541541
*/
542542
u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
543+
/**
544+
* @actual_brightness:
545+
*
546+
* last successfully applied backlight values.
547+
*/
548+
u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
543549
};
544550

545551
enum dsc_clock_force_state {

drivers/gpu/drm/amd/display/dc/clk_mgr/dcn315/dcn315_clk_mgr.c

Lines changed: 67 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -436,57 +436,84 @@ static void dcn315_clk_mgr_helper_populate_bw_params(
436436
struct integrated_info *bios_info,
437437
const DpmClocks_315_t *clock_table)
438438
{
439-
int i, j;
439+
int i;
440440
struct clk_bw_params *bw_params = clk_mgr->base.bw_params;
441-
uint32_t max_dispclk = 0, max_dppclk = 0;
442-
443-
j = -1;
444-
445-
ASSERT(NUM_DF_PSTATE_LEVELS <= MAX_NUM_DPM_LVL);
446-
447-
/* Find lowest DPM, FCLK is filled in reverse order*/
448-
449-
for (i = NUM_DF_PSTATE_LEVELS - 1; i >= 0; i--) {
450-
if (clock_table->DfPstateTable[i].FClk != 0) {
451-
j = i;
452-
break;
441+
uint32_t max_dispclk, max_dppclk, max_pstate, max_socclk, max_fclk = 0, min_pstate = 0;
442+
struct clk_limit_table_entry def_max = bw_params->clk_table.entries[bw_params->clk_table.num_entries - 1];
443+
444+
max_dispclk = find_max_clk_value(clock_table->DispClocks, clock_table->NumDispClkLevelsEnabled);
445+
max_dppclk = find_max_clk_value(clock_table->DppClocks, clock_table->NumDispClkLevelsEnabled);
446+
max_socclk = find_max_clk_value(clock_table->SocClocks, clock_table->NumSocClkLevelsEnabled);
447+
448+
/* Find highest fclk pstate */
449+
for (i = 0; i < clock_table->NumDfPstatesEnabled; i++) {
450+
if (clock_table->DfPstateTable[i].FClk > max_fclk) {
451+
max_fclk = clock_table->DfPstateTable[i].FClk;
452+
max_pstate = i;
453453
}
454454
}
455455

456-
if (j == -1) {
457-
/* clock table is all 0s, just use our own hardcode */
458-
ASSERT(0);
459-
return;
460-
}
461-
462-
bw_params->clk_table.num_entries = j + 1;
463-
464-
/* dispclk and dppclk can be max at any voltage, same number of levels for both */
465-
if (clock_table->NumDispClkLevelsEnabled <= NUM_DISPCLK_DPM_LEVELS &&
466-
clock_table->NumDispClkLevelsEnabled <= NUM_DPPCLK_DPM_LEVELS) {
467-
max_dispclk = find_max_clk_value(clock_table->DispClocks, clock_table->NumDispClkLevelsEnabled);
468-
max_dppclk = find_max_clk_value(clock_table->DppClocks, clock_table->NumDispClkLevelsEnabled);
469-
} else {
470-
ASSERT(0);
471-
}
456+
/* For 315 we want to base clock table on dcfclk, need at least one entry regardless of pmfw table */
457+
for (i = 0; i < clock_table->NumDcfClkLevelsEnabled; i++) {
458+
int j;
459+
uint32_t min_fclk = clock_table->DfPstateTable[0].FClk;
472460

473-
for (i = 0; i < bw_params->clk_table.num_entries; i++, j--) {
474-
int temp;
461+
for (j = 1; j < clock_table->NumDfPstatesEnabled; j++) {
462+
if (clock_table->DfPstateTable[j].Voltage <= clock_table->SocVoltage[i]
463+
&& clock_table->DfPstateTable[j].FClk < min_fclk) {
464+
min_fclk = clock_table->DfPstateTable[j].FClk;
465+
min_pstate = j;
466+
}
467+
}
475468

476-
bw_params->clk_table.entries[i].fclk_mhz = clock_table->DfPstateTable[j].FClk;
477-
bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[j].MemClk;
478-
bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[j].Voltage;
469+
bw_params->clk_table.entries[i].fclk_mhz = min_fclk;
470+
bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[min_pstate].MemClk;
471+
bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[min_pstate].Voltage;
472+
bw_params->clk_table.entries[i].dcfclk_mhz = clock_table->DcfClocks[i];
473+
bw_params->clk_table.entries[i].socclk_mhz = clock_table->SocClocks[i];
474+
bw_params->clk_table.entries[i].dispclk_mhz = max_dispclk;
475+
bw_params->clk_table.entries[i].dppclk_mhz = max_dppclk;
479476
bw_params->clk_table.entries[i].wck_ratio = 1;
480-
temp = find_clk_for_voltage(clock_table, clock_table->DcfClocks, clock_table->DfPstateTable[j].Voltage);
481-
if (temp)
482-
bw_params->clk_table.entries[i].dcfclk_mhz = temp;
483-
temp = find_clk_for_voltage(clock_table, clock_table->SocClocks, clock_table->DfPstateTable[j].Voltage);
484-
if (temp)
485-
bw_params->clk_table.entries[i].socclk_mhz = temp;
477+
};
478+
479+
/* Make sure to include at least one entry and highest pstate */
480+
if (max_pstate != min_pstate) {
481+
bw_params->clk_table.entries[i].fclk_mhz = max_fclk;
482+
bw_params->clk_table.entries[i].memclk_mhz = clock_table->DfPstateTable[max_pstate].MemClk;
483+
bw_params->clk_table.entries[i].voltage = clock_table->DfPstateTable[max_pstate].Voltage;
484+
bw_params->clk_table.entries[i].dcfclk_mhz = find_clk_for_voltage(
485+
clock_table, clock_table->DcfClocks, clock_table->DfPstateTable[max_pstate].Voltage);
486+
bw_params->clk_table.entries[i].socclk_mhz = find_clk_for_voltage(
487+
clock_table, clock_table->SocClocks, clock_table->DfPstateTable[max_pstate].Voltage);
486488
bw_params->clk_table.entries[i].dispclk_mhz = max_dispclk;
487489
bw_params->clk_table.entries[i].dppclk_mhz = max_dppclk;
490+
bw_params->clk_table.entries[i].wck_ratio = 1;
491+
i++;
488492
}
493+
bw_params->clk_table.num_entries = i;
494+
495+
/* Include highest socclk */
496+
if (bw_params->clk_table.entries[i-1].socclk_mhz < max_socclk)
497+
bw_params->clk_table.entries[i-1].socclk_mhz = max_socclk;
489498

499+
/* Set any 0 clocks to max default setting. Not an issue for
500+
* power since we aren't doing switching in such case anyway
501+
*/
502+
for (i = 0; i < bw_params->clk_table.num_entries; i++) {
503+
if (!bw_params->clk_table.entries[i].fclk_mhz) {
504+
bw_params->clk_table.entries[i].fclk_mhz = def_max.fclk_mhz;
505+
bw_params->clk_table.entries[i].memclk_mhz = def_max.memclk_mhz;
506+
bw_params->clk_table.entries[i].voltage = def_max.voltage;
507+
}
508+
if (!bw_params->clk_table.entries[i].dcfclk_mhz)
509+
bw_params->clk_table.entries[i].dcfclk_mhz = def_max.dcfclk_mhz;
510+
if (!bw_params->clk_table.entries[i].socclk_mhz)
511+
bw_params->clk_table.entries[i].socclk_mhz = def_max.socclk_mhz;
512+
if (!bw_params->clk_table.entries[i].dispclk_mhz)
513+
bw_params->clk_table.entries[i].dispclk_mhz = def_max.dispclk_mhz;
514+
if (!bw_params->clk_table.entries[i].dppclk_mhz)
515+
bw_params->clk_table.entries[i].dppclk_mhz = def_max.dppclk_mhz;
516+
}
490517
bw_params->vram_type = bios_info->memory_type;
491518
bw_params->num_channels = bios_info->ma_channel_number;
492519

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1496,10 +1496,6 @@ bool dc_validate_boot_timing(const struct dc *dc,
14961496
if (!link->link_enc->funcs->is_dig_enabled(link->link_enc))
14971497
return false;
14981498

1499-
/* Check for FEC status*/
1500-
if (link->link_enc->funcs->fec_is_active(link->link_enc))
1501-
return false;
1502-
15031499
enc_inst = link->link_enc->funcs->get_dig_frontend(link->link_enc);
15041500

15051501
if (enc_inst == ENGINE_ID_UNKNOWN)

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

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5216,6 +5216,62 @@ static void retrieve_cable_id(struct dc_link *link)
52165216
&link->dpcd_caps.cable_id, &usbc_cable_id);
52175217
}
52185218

5219+
/* DPRX may take some time to respond to AUX messages after HPD asserted.
5220+
* If AUX read unsuccessful, try to wake unresponsive DPRX by toggling DPCD SET_POWER (0x600).
5221+
*/
5222+
static enum dc_status wa_try_to_wake_dprx(struct dc_link *link, uint64_t timeout_ms)
5223+
{
5224+
enum dc_status status = DC_ERROR_UNEXPECTED;
5225+
uint8_t dpcd_data = 0;
5226+
uint64_t start_ts = 0;
5227+
uint64_t current_ts = 0;
5228+
uint64_t time_taken_ms = 0;
5229+
enum dc_connection_type type = dc_connection_none;
5230+
5231+
status = core_link_read_dpcd(
5232+
link,
5233+
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV,
5234+
&dpcd_data,
5235+
sizeof(dpcd_data));
5236+
5237+
if (status != DC_OK) {
5238+
DC_LOG_WARNING("%s: Read DPCD LTTPR_CAP failed - try to toggle DPCD SET_POWER for %lld ms.",
5239+
__func__,
5240+
timeout_ms);
5241+
start_ts = dm_get_timestamp(link->ctx);
5242+
5243+
do {
5244+
if (!dc_link_detect_sink(link, &type) || type == dc_connection_none)
5245+
break;
5246+
5247+
dpcd_data = DP_SET_POWER_D3;
5248+
status = core_link_write_dpcd(
5249+
link,
5250+
DP_SET_POWER,
5251+
&dpcd_data,
5252+
sizeof(dpcd_data));
5253+
5254+
dpcd_data = DP_SET_POWER_D0;
5255+
status = core_link_write_dpcd(
5256+
link,
5257+
DP_SET_POWER,
5258+
&dpcd_data,
5259+
sizeof(dpcd_data));
5260+
5261+
current_ts = dm_get_timestamp(link->ctx);
5262+
time_taken_ms = div_u64(dm_get_elapse_time_in_ns(link->ctx, current_ts, start_ts), 1000000);
5263+
} while (status != DC_OK && time_taken_ms < timeout_ms);
5264+
5265+
DC_LOG_WARNING("%s: DPCD SET_POWER %s after %lld ms%s",
5266+
__func__,
5267+
(status == DC_OK) ? "succeeded" : "failed",
5268+
time_taken_ms,
5269+
(type == dc_connection_none) ? ". Unplugged." : ".");
5270+
}
5271+
5272+
return status;
5273+
}
5274+
52195275
static bool retrieve_link_cap(struct dc_link *link)
52205276
{
52215277
/* DP_ADAPTER_CAP - DP_DPCD_REV + 1 == 16 and also DP_DSC_BITS_PER_PIXEL_INC - DP_DSC_SUPPORT + 1 == 16,
@@ -5251,6 +5307,15 @@ static bool retrieve_link_cap(struct dc_link *link)
52515307
dc_link_aux_try_to_configure_timeout(link->ddc,
52525308
LINK_AUX_DEFAULT_LTTPR_TIMEOUT_PERIOD);
52535309

5310+
/* Try to ensure AUX channel active before proceeding. */
5311+
if (link->dc->debug.aux_wake_wa.bits.enable_wa) {
5312+
uint64_t timeout_ms = link->dc->debug.aux_wake_wa.bits.timeout_ms;
5313+
5314+
if (link->dc->debug.aux_wake_wa.bits.use_default_timeout)
5315+
timeout_ms = LINK_AUX_WAKE_TIMEOUT_MS;
5316+
status = wa_try_to_wake_dprx(link, timeout_ms);
5317+
}
5318+
52545319
is_lttpr_present = dp_retrieve_lttpr_cap(link);
52555320
/* Read DP tunneling information. */
52565321
status = dpcd_get_tunneling_device_data(link);

0 commit comments

Comments
 (0)