Skip to content

Commit 0982149

Browse files
Igor Kravchenkoalexdeucher
authored andcommitted
drm/amd/display: Read VBIOS Golden Settings Tbl
[Why] For ver.4.4 and higher VBIOS contains default setting table. {How] Read Golden Settings Table from VBIOS, apply Aux tuning parameters. Signed-off-by: Igor Kravchenko <[email protected]> Reviewed-by: Aric Cyr <[email protected]> Acked-by: Aurabindo Pillai <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent c06f670 commit 0982149

File tree

10 files changed

+182
-9
lines changed

10 files changed

+182
-9
lines changed

drivers/gpu/drm/amd/display/dc/bios/bios_parser.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2834,6 +2834,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
28342834
.bios_parser_destroy = bios_parser_destroy,
28352835

28362836
.get_board_layout_info = bios_get_board_layout_info,
2837+
2838+
.get_atom_dc_golden_table = NULL
28372839
};
28382840

28392841
static bool bios_parser_construct(

drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2079,6 +2079,85 @@ static uint16_t bios_parser_pack_data_tables(
20792079
return 0;
20802080
}
20812081

2082+
static struct atom_dc_golden_table_v1 *bios_get_golden_table(
2083+
struct bios_parser *bp,
2084+
uint32_t rev_major,
2085+
uint32_t rev_minor,
2086+
uint16_t *dc_golden_table_ver)
2087+
{
2088+
struct atom_display_controller_info_v4_4 *disp_cntl_tbl_4_4 = NULL;
2089+
uint32_t dc_golden_offset = 0;
2090+
*dc_golden_table_ver = 0;
2091+
2092+
if (!DATA_TABLES(dce_info))
2093+
return NULL;
2094+
2095+
/* ver.4.4 or higher */
2096+
switch (rev_major) {
2097+
case 4:
2098+
switch (rev_minor) {
2099+
case 4:
2100+
disp_cntl_tbl_4_4 = GET_IMAGE(struct atom_display_controller_info_v4_4,
2101+
DATA_TABLES(dce_info));
2102+
if (!disp_cntl_tbl_4_4)
2103+
return NULL;
2104+
dc_golden_offset = disp_cntl_tbl_4_4->dc_golden_table_offset;
2105+
*dc_golden_table_ver = disp_cntl_tbl_4_4->dc_golden_table_ver;
2106+
break;
2107+
}
2108+
break;
2109+
}
2110+
2111+
if (!dc_golden_offset)
2112+
return NULL;
2113+
2114+
if (*dc_golden_table_ver != 1)
2115+
return NULL;
2116+
2117+
return GET_IMAGE(struct atom_dc_golden_table_v1,
2118+
dc_golden_offset);
2119+
}
2120+
2121+
static enum bp_result bios_get_atom_dc_golden_table(
2122+
struct dc_bios *dcb)
2123+
{
2124+
struct bios_parser *bp = BP_FROM_DCB(dcb);
2125+
enum bp_result result = BP_RESULT_OK;
2126+
struct atom_dc_golden_table_v1 *atom_dc_golden_table = NULL;
2127+
struct atom_common_table_header *header;
2128+
struct atom_data_revision tbl_revision;
2129+
uint16_t dc_golden_table_ver = 0;
2130+
2131+
header = GET_IMAGE(struct atom_common_table_header,
2132+
DATA_TABLES(dce_info));
2133+
if (!header)
2134+
return BP_RESULT_UNSUPPORTED;
2135+
2136+
get_atom_data_table_revision(header, &tbl_revision);
2137+
2138+
atom_dc_golden_table = bios_get_golden_table(bp,
2139+
tbl_revision.major,
2140+
tbl_revision.minor,
2141+
&dc_golden_table_ver);
2142+
2143+
if (!atom_dc_golden_table)
2144+
return BP_RESULT_UNSUPPORTED;
2145+
2146+
dcb->golden_table.dc_golden_table_ver = dc_golden_table_ver;
2147+
dcb->golden_table.aux_dphy_rx_control0_val = atom_dc_golden_table->aux_dphy_rx_control0_val;
2148+
dcb->golden_table.aux_dphy_rx_control1_val = atom_dc_golden_table->aux_dphy_rx_control1_val;
2149+
dcb->golden_table.aux_dphy_tx_control_val = atom_dc_golden_table->aux_dphy_tx_control_val;
2150+
dcb->golden_table.dc_gpio_aux_ctrl_0_val = atom_dc_golden_table->dc_gpio_aux_ctrl_0_val;
2151+
dcb->golden_table.dc_gpio_aux_ctrl_1_val = atom_dc_golden_table->dc_gpio_aux_ctrl_1_val;
2152+
dcb->golden_table.dc_gpio_aux_ctrl_2_val = atom_dc_golden_table->dc_gpio_aux_ctrl_2_val;
2153+
dcb->golden_table.dc_gpio_aux_ctrl_3_val = atom_dc_golden_table->dc_gpio_aux_ctrl_3_val;
2154+
dcb->golden_table.dc_gpio_aux_ctrl_4_val = atom_dc_golden_table->dc_gpio_aux_ctrl_4_val;
2155+
dcb->golden_table.dc_gpio_aux_ctrl_5_val = atom_dc_golden_table->dc_gpio_aux_ctrl_5_val;
2156+
2157+
return result;
2158+
}
2159+
2160+
20822161
static const struct dc_vbios_funcs vbios_funcs = {
20832162
.get_connectors_number = bios_parser_get_connectors_number,
20842163

@@ -2128,6 +2207,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
21282207

21292208
.get_board_layout_info = bios_get_board_layout_info,
21302209
.pack_data_tables = bios_parser_pack_data_tables,
2210+
2211+
.get_atom_dc_golden_table = bios_get_atom_dc_golden_table
21312212
};
21322213

21332214
static bool bios_parser2_construct(

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,9 @@ static bool dc_link_construct(struct dc_link *link,
15401540
}
15411541
}
15421542

1543+
if (bios->funcs->get_atom_dc_golden_table)
1544+
bios->funcs->get_atom_dc_golden_table(bios);
1545+
15431546
/*
15441547
* TODO check if GPIO programmed correctly
15451548
*

drivers/gpu/drm/amd/display/dc/dc_bios_types.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ struct dc_vbios_funcs {
133133
uint16_t (*pack_data_tables)(
134134
struct dc_bios *dcb,
135135
void *dst);
136+
137+
enum bp_result (*get_atom_dc_golden_table)(
138+
struct dc_bios *dcb);
136139
};
137140

138141
struct bios_registers {
@@ -154,6 +157,7 @@ struct dc_bios {
154157
struct dc_firmware_info fw_info;
155158
bool fw_info_valid;
156159
struct dc_vram_info vram_info;
160+
struct dc_golden_table golden_table;
157161
};
158162

159163
#endif /* DC_BIOS_TYPES_H */

drivers/gpu/drm/amd/display/dc/dc_types.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,20 @@ struct dsc_dec_dpcd_caps {
890890
uint32_t branch_max_line_width;
891891
};
892892

893+
struct dc_golden_table {
894+
uint16_t dc_golden_table_ver;
895+
uint32_t aux_dphy_rx_control0_val;
896+
uint32_t aux_dphy_tx_control_val;
897+
uint32_t aux_dphy_rx_control1_val;
898+
uint32_t dc_gpio_aux_ctrl_0_val;
899+
uint32_t dc_gpio_aux_ctrl_1_val;
900+
uint32_t dc_gpio_aux_ctrl_2_val;
901+
uint32_t dc_gpio_aux_ctrl_3_val;
902+
uint32_t dc_gpio_aux_ctrl_4_val;
903+
uint32_t dc_gpio_aux_ctrl_5_val;
904+
};
905+
906+
893907
#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
894908
enum dc_gpu_mem_alloc_type {
895909
DC_MEM_ALLOC_TYPE_GART,

drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838

3939
#define AUX_REG_LIST(id)\
4040
SRI(AUX_CONTROL, DP_AUX, id), \
41-
SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id)
41+
SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id), \
42+
SRI(AUX_DPHY_RX_CONTROL1, DP_AUX, id)
4243

4344
#define HPD_REG_LIST(id)\
4445
SRI(DC_HPD_CONTROL, HPD, id)
@@ -107,6 +108,7 @@
107108
struct dce110_link_enc_aux_registers {
108109
uint32_t AUX_CONTROL;
109110
uint32_t AUX_DPHY_RX_CONTROL0;
111+
uint32_t AUX_DPHY_RX_CONTROL1;
110112
};
111113

112114
struct dce110_link_enc_hpd_registers {

drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@
3131
#define TO_DCN10_LINK_ENC(link_encoder)\
3232
container_of(link_encoder, struct dcn10_link_encoder, base)
3333

34-
3534
#define AUX_REG_LIST(id)\
3635
SRI(AUX_CONTROL, DP_AUX, id), \
37-
SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id)
36+
SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id), \
37+
SRI(AUX_DPHY_RX_CONTROL1, DP_AUX, id)
3838

3939
#define HPD_REG_LIST(id)\
4040
SRI(DC_HPD_CONTROL, HPD, id)
@@ -73,6 +73,7 @@ struct dcn10_link_enc_aux_registers {
7373
uint32_t AUX_CONTROL;
7474
uint32_t AUX_DPHY_RX_CONTROL0;
7575
uint32_t AUX_DPHY_TX_CONTROL;
76+
uint32_t AUX_DPHY_RX_CONTROL1;
7677
};
7778

7879
struct dcn10_link_enc_hpd_registers {
@@ -443,7 +444,10 @@ struct dcn10_link_enc_registers {
443444
type AUX_TX_PRECHARGE_LEN; \
444445
type AUX_TX_PRECHARGE_SYMBOLS; \
445446
type AUX_MODE_DET_CHECK_DELAY;\
446-
type DPCS_DBG_CBUS_DIS
447+
type DPCS_DBG_CBUS_DIS;\
448+
type AUX_RX_PRECHARGE_SKIP;\
449+
type AUX_RX_TIMEOUT_LEN;\
450+
type AUX_RX_TIMEOUT_LEN_MUL
447451

448452
struct dcn10_link_enc_shift {
449453
DCN_LINK_ENCODER_REG_FIELD_LIST(uint8_t);

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ bool dcn20_link_encoder_is_in_alt_mode(struct link_encoder *enc)
309309
void enc2_hw_init(struct link_encoder *enc)
310310
{
311311
struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
312-
313312
/*
314313
00 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2 : 1/2
315314
01 - DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4 : 3/4
@@ -333,9 +332,18 @@ void enc2_hw_init(struct link_encoder *enc)
333332
AUX_RX_PHASE_DETECT_LEN, [21,20] = 0x3 default is 3
334333
AUX_RX_DETECTION_THRESHOLD [30:28] = 1
335334
*/
336-
AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
335+
if (enc->ctx->dc_bios->golden_table.dc_golden_table_ver > 0) {
336+
AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, enc->ctx->dc_bios->golden_table.aux_dphy_rx_control0_val);
337+
338+
AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, enc->ctx->dc_bios->golden_table.aux_dphy_tx_control_val);
339+
340+
AUX_REG_WRITE(AUX_DPHY_RX_CONTROL1, enc->ctx->dc_bios->golden_table.aux_dphy_rx_control1_val);
341+
} else {
342+
AUX_REG_WRITE(AUX_DPHY_RX_CONTROL0, 0x103d1110);
343+
344+
AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c4d);
337345

338-
AUX_REG_WRITE(AUX_DPHY_TX_CONTROL, 0x21c7a);
346+
}
339347

340348
//AUX_DPHY_TX_REF_CONTROL'AUX_TX_REF_DIV HW default is 0x32;
341349
// Set AUX_TX_REF_DIV Divider to generate 2 MHz reference from refclk

drivers/gpu/drm/amd/display/dc/dcn20/dcn20_link_encoder.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,10 @@
191191
LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
192192
LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
193193
LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
194-
LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh)
194+
LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh),\
195+
LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_PRECHARGE_SKIP, mask_sh),\
196+
LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN, mask_sh),\
197+
LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL1, AUX_RX_TIMEOUT_LEN_MUL, mask_sh)
195198

196199
#define UNIPHY_DCN2_REG_LIST(id) \
197200
SRI(CLOCK_ENABLE, SYMCLK, id), \

drivers/gpu/drm/amd/include/atomfirmware.h

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,6 @@ struct atom_display_controller_info_v4_1
941941
uint8_t reserved3[8];
942942
};
943943

944-
945944
struct atom_display_controller_info_v4_2
946945
{
947946
struct atom_common_table_header table_header;
@@ -976,6 +975,59 @@ struct atom_display_controller_info_v4_2
976975
uint8_t reserved3[8];
977976
};
978977

978+
struct atom_display_controller_info_v4_4 {
979+
struct atom_common_table_header table_header;
980+
uint32_t display_caps;
981+
uint32_t bootup_dispclk_10khz;
982+
uint16_t dce_refclk_10khz;
983+
uint16_t i2c_engine_refclk_10khz;
984+
uint16_t dvi_ss_percentage; // in unit of 0.001%
985+
uint16_t dvi_ss_rate_10hz;
986+
uint16_t hdmi_ss_percentage; // in unit of 0.001%
987+
uint16_t hdmi_ss_rate_10hz;
988+
uint16_t dp_ss_percentage; // in unit of 0.001%
989+
uint16_t dp_ss_rate_10hz;
990+
uint8_t dvi_ss_mode; // enum of atom_spread_spectrum_mode
991+
uint8_t hdmi_ss_mode; // enum of atom_spread_spectrum_mode
992+
uint8_t dp_ss_mode; // enum of atom_spread_spectrum_mode
993+
uint8_t ss_reserved;
994+
uint8_t dfp_hardcode_mode_num; // DFP hardcode mode number defined in StandardVESA_TimingTable when EDID is not available
995+
uint8_t dfp_hardcode_refreshrate;// DFP hardcode mode refreshrate defined in StandardVESA_TimingTable when EDID is not available
996+
uint8_t vga_hardcode_mode_num; // VGA hardcode mode number defined in StandardVESA_TimingTable when EDID is not avablable
997+
uint8_t vga_hardcode_refreshrate;// VGA hardcode mode number defined in StandardVESA_TimingTable when EDID is not avablable
998+
uint16_t dpphy_refclk_10khz;
999+
uint16_t hw_chip_id;
1000+
uint8_t dcnip_min_ver;
1001+
uint8_t dcnip_max_ver;
1002+
uint8_t max_disp_pipe_num;
1003+
uint8_t max_vbios_active_disp_pipum;
1004+
uint8_t max_ppll_num;
1005+
uint8_t max_disp_phy_num;
1006+
uint8_t max_aux_pairs;
1007+
uint8_t remotedisplayconfig;
1008+
uint32_t dispclk_pll_vco_freq;
1009+
uint32_t dp_ref_clk_freq;
1010+
uint32_t max_mclk_chg_lat; // Worst case blackout duration for a memory clock frequency (p-state) change, units of 100s of ns (0.1 us)
1011+
uint32_t max_sr_exit_lat; // Worst case memory self refresh exit time, units of 100ns of ns (0.1us)
1012+
uint32_t max_sr_enter_exit_lat; // Worst case memory self refresh entry followed by immediate exit time, units of 100ns of ns (0.1us)
1013+
uint16_t dc_golden_table_offset; // point of struct of atom_dc_golden_table_vxx
1014+
uint16_t dc_golden_table_ver;
1015+
uint32_t reserved3[3];
1016+
};
1017+
1018+
struct atom_dc_golden_table_v1
1019+
{
1020+
uint32_t aux_dphy_rx_control0_val;
1021+
uint32_t aux_dphy_tx_control_val;
1022+
uint32_t aux_dphy_rx_control1_val;
1023+
uint32_t dc_gpio_aux_ctrl_0_val;
1024+
uint32_t dc_gpio_aux_ctrl_1_val;
1025+
uint32_t dc_gpio_aux_ctrl_2_val;
1026+
uint32_t dc_gpio_aux_ctrl_3_val;
1027+
uint32_t dc_gpio_aux_ctrl_4_val;
1028+
uint32_t dc_gpio_aux_ctrl_5_val;
1029+
uint32_t reserved[23];
1030+
};
9791031

9801032
enum dce_info_caps_def
9811033
{

0 commit comments

Comments
 (0)