Skip to content

Commit 1d40ef9

Browse files
Nicholas Kazlauskasalexdeucher
authored andcommitted
drm/amd/display: Extend DMUB diagnostic logging to DCN3.1
[Why & How] Extend existing support for DCN2.1 DMUB diagnostic logging to DCN3.1 so we can collect useful information if the DMUB hangs. Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent aa61581 commit 1d40ef9

3 files changed

Lines changed: 76 additions & 5 deletions

File tree

drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.c

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,63 @@ uint32_t dmub_dcn31_get_current_time(struct dmub_srv *dmub)
352352
{
353353
return REG_READ(DMCUB_TIMER_CURRENT);
354354
}
355+
356+
void dmub_dcn31_get_diagnostic_data(struct dmub_srv *dmub, struct dmub_diagnostic_data *diag_data)
357+
{
358+
uint32_t is_dmub_enabled, is_soft_reset, is_sec_reset;
359+
uint32_t is_traceport_enabled, is_cw0_enabled, is_cw6_enabled;
360+
361+
if (!dmub || !diag_data)
362+
return;
363+
364+
memset(diag_data, 0, sizeof(*diag_data));
365+
366+
diag_data->dmcub_version = dmub->fw_version;
367+
368+
diag_data->scratch[0] = REG_READ(DMCUB_SCRATCH0);
369+
diag_data->scratch[1] = REG_READ(DMCUB_SCRATCH1);
370+
diag_data->scratch[2] = REG_READ(DMCUB_SCRATCH2);
371+
diag_data->scratch[3] = REG_READ(DMCUB_SCRATCH3);
372+
diag_data->scratch[4] = REG_READ(DMCUB_SCRATCH4);
373+
diag_data->scratch[5] = REG_READ(DMCUB_SCRATCH5);
374+
diag_data->scratch[6] = REG_READ(DMCUB_SCRATCH6);
375+
diag_data->scratch[7] = REG_READ(DMCUB_SCRATCH7);
376+
diag_data->scratch[8] = REG_READ(DMCUB_SCRATCH8);
377+
diag_data->scratch[9] = REG_READ(DMCUB_SCRATCH9);
378+
diag_data->scratch[10] = REG_READ(DMCUB_SCRATCH10);
379+
diag_data->scratch[11] = REG_READ(DMCUB_SCRATCH11);
380+
diag_data->scratch[12] = REG_READ(DMCUB_SCRATCH12);
381+
diag_data->scratch[13] = REG_READ(DMCUB_SCRATCH13);
382+
diag_data->scratch[14] = REG_READ(DMCUB_SCRATCH14);
383+
diag_data->scratch[15] = REG_READ(DMCUB_SCRATCH15);
384+
385+
diag_data->undefined_address_fault_addr = REG_READ(DMCUB_UNDEFINED_ADDRESS_FAULT_ADDR);
386+
diag_data->inst_fetch_fault_addr = REG_READ(DMCUB_INST_FETCH_FAULT_ADDR);
387+
diag_data->data_write_fault_addr = REG_READ(DMCUB_DATA_WRITE_FAULT_ADDR);
388+
389+
diag_data->inbox1_rptr = REG_READ(DMCUB_INBOX1_RPTR);
390+
diag_data->inbox1_wptr = REG_READ(DMCUB_INBOX1_WPTR);
391+
diag_data->inbox1_size = REG_READ(DMCUB_INBOX1_SIZE);
392+
393+
diag_data->inbox0_rptr = REG_READ(DMCUB_INBOX0_RPTR);
394+
diag_data->inbox0_wptr = REG_READ(DMCUB_INBOX0_WPTR);
395+
diag_data->inbox0_size = REG_READ(DMCUB_INBOX0_SIZE);
396+
397+
REG_GET(DMCUB_CNTL, DMCUB_ENABLE, &is_dmub_enabled);
398+
diag_data->is_dmcub_enabled = is_dmub_enabled;
399+
400+
REG_GET(DMCUB_CNTL2, DMCUB_SOFT_RESET, &is_soft_reset);
401+
diag_data->is_dmcub_soft_reset = is_soft_reset;
402+
403+
REG_GET(DMCUB_SEC_CNTL, DMCUB_SEC_RESET_STATUS, &is_sec_reset);
404+
diag_data->is_dmcub_secure_reset = is_sec_reset;
405+
406+
REG_GET(DMCUB_CNTL, DMCUB_TRACEPORT_EN, &is_traceport_enabled);
407+
diag_data->is_traceport_en = is_traceport_enabled;
408+
409+
REG_GET(DMCUB_REGION3_CW0_TOP_ADDRESS, DMCUB_REGION3_CW0_ENABLE, &is_cw0_enabled);
410+
diag_data->is_cw0_enabled = is_cw0_enabled;
411+
412+
REG_GET(DMCUB_REGION3_CW6_TOP_ADDRESS, DMCUB_REGION3_CW6_ENABLE, &is_cw6_enabled);
413+
diag_data->is_cw6_enabled = is_cw6_enabled;
414+
}

drivers/gpu/drm/amd/display/dmub/src/dmub_dcn31.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ struct dmub_srv;
3636
DMUB_SR(DMCUB_CNTL) \
3737
DMUB_SR(DMCUB_CNTL2) \
3838
DMUB_SR(DMCUB_SEC_CNTL) \
39+
DMUB_SR(DMCUB_INBOX0_SIZE) \
40+
DMUB_SR(DMCUB_INBOX0_RPTR) \
41+
DMUB_SR(DMCUB_INBOX0_WPTR) \
3942
DMUB_SR(DMCUB_INBOX1_BASE_ADDRESS) \
4043
DMUB_SR(DMCUB_INBOX1_SIZE) \
4144
DMUB_SR(DMCUB_INBOX1_RPTR) \
@@ -103,18 +106,23 @@ struct dmub_srv;
103106
DMUB_SR(DMCUB_SCRATCH14) \
104107
DMUB_SR(DMCUB_SCRATCH15) \
105108
DMUB_SR(DMCUB_GPINT_DATAIN1) \
109+
DMUB_SR(DMCUB_GPINT_DATAOUT) \
106110
DMUB_SR(CC_DC_PIPE_DIS) \
107111
DMUB_SR(MMHUBBUB_SOFT_RESET) \
108112
DMUB_SR(DCN_VM_FB_LOCATION_BASE) \
109113
DMUB_SR(DCN_VM_FB_OFFSET) \
110-
DMUB_SR(DMCUB_TIMER_CURRENT)
114+
DMUB_SR(DMCUB_TIMER_CURRENT) \
115+
DMUB_SR(DMCUB_INST_FETCH_FAULT_ADDR) \
116+
DMUB_SR(DMCUB_UNDEFINED_ADDRESS_FAULT_ADDR) \
117+
DMUB_SR(DMCUB_DATA_WRITE_FAULT_ADDR)
111118

112119
#define DMUB_DCN31_FIELDS() \
113120
DMUB_SF(DMCUB_CNTL, DMCUB_ENABLE) \
114121
DMUB_SF(DMCUB_CNTL, DMCUB_TRACEPORT_EN) \
115122
DMUB_SF(DMCUB_CNTL2, DMCUB_SOFT_RESET) \
116123
DMUB_SF(DMCUB_SEC_CNTL, DMCUB_SEC_RESET) \
117124
DMUB_SF(DMCUB_SEC_CNTL, DMCUB_MEM_UNIT_ID) \
125+
DMUB_SF(DMCUB_SEC_CNTL, DMCUB_SEC_RESET_STATUS) \
118126
DMUB_SF(DMCUB_REGION3_CW0_TOP_ADDRESS, DMCUB_REGION3_CW0_TOP_ADDRESS) \
119127
DMUB_SF(DMCUB_REGION3_CW0_TOP_ADDRESS, DMCUB_REGION3_CW0_ENABLE) \
120128
DMUB_SF(DMCUB_REGION3_CW1_TOP_ADDRESS, DMCUB_REGION3_CW1_TOP_ADDRESS) \
@@ -138,11 +146,13 @@ struct dmub_srv;
138146
DMUB_SF(CC_DC_PIPE_DIS, DC_DMCUB_ENABLE) \
139147
DMUB_SF(MMHUBBUB_SOFT_RESET, DMUIF_SOFT_RESET) \
140148
DMUB_SF(DCN_VM_FB_LOCATION_BASE, FB_BASE) \
141-
DMUB_SF(DCN_VM_FB_OFFSET, FB_OFFSET)
149+
DMUB_SF(DCN_VM_FB_OFFSET, FB_OFFSET) \
150+
DMUB_SF(DMCUB_INBOX0_WPTR, DMCUB_INBOX0_WPTR)
142151

143152
struct dmub_srv_dcn31_reg_offset {
144153
#define DMUB_SR(reg) uint32_t reg;
145154
DMUB_DCN31_REGS()
155+
DMCUB_INTERNAL_REGS()
146156
#undef DMUB_SR
147157
};
148158

@@ -227,4 +237,6 @@ void dmub_dcn31_set_outbox0_rptr(struct dmub_srv *dmub, uint32_t rptr_offset);
227237

228238
uint32_t dmub_dcn31_get_current_time(struct dmub_srv *dmub);
229239

240+
void dmub_dcn31_get_diagnostic_data(struct dmub_srv *dmub, struct dmub_diagnostic_data *diag_data);
241+
230242
#endif /* _DMUB_DCN31_H_ */

drivers/gpu/drm/amd/display/dmub/src/dmub_srv.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
208208
break;
209209

210210
case DMUB_ASIC_DCN31:
211+
dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
211212
funcs->reset = dmub_dcn31_reset;
212213
funcs->reset_release = dmub_dcn31_reset_release;
213214
funcs->backdoor_load = dmub_dcn31_backdoor_load;
@@ -231,9 +232,7 @@ static bool dmub_srv_hw_setup(struct dmub_srv *dmub, enum dmub_asic asic)
231232
funcs->get_outbox0_wptr = dmub_dcn31_get_outbox0_wptr;
232233
funcs->set_outbox0_rptr = dmub_dcn31_set_outbox0_rptr;
233234

234-
if (asic == DMUB_ASIC_DCN31) {
235-
dmub->regs_dcn31 = &dmub_srv_dcn31_regs;
236-
}
235+
funcs->get_diagnostic_data = dmub_dcn31_get_diagnostic_data;
237236

238237
funcs->get_current_time = dmub_dcn31_get_current_time;
239238

0 commit comments

Comments
 (0)