mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
drm/amd/display: Implement workaround for writing to OTG_PIXEL_RATE_DIV register
commit 74fa4c81aa upstream.
[Why and How]
Current implementation requires FPGA builds to take a different
code path from DCN32 to write to OTG_PIXEL_RATE_DIV. Now that
we have a workaround to write to OTG_PIXEL_RATE_DIV register without
blanking display on hotplug on DCN32, we can allow the code paths for
FPGA to be exactly the same allowing for more consistent
testing.
Reviewed-by: Alvin Lee <Alvin.Lee2@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Saaem Rizvi <SyedSaaem.Rizvi@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: "Limonciello, Mario" <mario.limonciello@amd.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8517d73992
commit
4bdfe20d85
@@ -230,7 +230,8 @@
|
|||||||
type DTBCLK_P2_SRC_SEL;\
|
type DTBCLK_P2_SRC_SEL;\
|
||||||
type DTBCLK_P2_EN;\
|
type DTBCLK_P2_EN;\
|
||||||
type DTBCLK_P3_SRC_SEL;\
|
type DTBCLK_P3_SRC_SEL;\
|
||||||
type DTBCLK_P3_EN;
|
type DTBCLK_P3_EN;\
|
||||||
|
type DENTIST_DISPCLK_CHG_DONE;
|
||||||
|
|
||||||
struct dccg_shift {
|
struct dccg_shift {
|
||||||
DCCG_REG_FIELD_LIST(uint8_t)
|
DCCG_REG_FIELD_LIST(uint8_t)
|
||||||
|
|||||||
@@ -42,6 +42,20 @@
|
|||||||
#define DC_LOGGER \
|
#define DC_LOGGER \
|
||||||
dccg->ctx->logger
|
dccg->ctx->logger
|
||||||
|
|
||||||
|
/* This function is a workaround for writing to OTG_PIXEL_RATE_DIV
|
||||||
|
* without the probability of causing a DIG FIFO error.
|
||||||
|
*/
|
||||||
|
static void dccg32_wait_for_dentist_change_done(
|
||||||
|
struct dccg *dccg)
|
||||||
|
{
|
||||||
|
struct dcn_dccg *dccg_dcn = TO_DCN_DCCG(dccg);
|
||||||
|
|
||||||
|
uint32_t dentist_dispclk_value = REG_READ(DENTIST_DISPCLK_CNTL);
|
||||||
|
|
||||||
|
REG_WRITE(DENTIST_DISPCLK_CNTL, dentist_dispclk_value);
|
||||||
|
REG_WAIT(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, 1, 50, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
static void dccg32_get_pixel_rate_div(
|
static void dccg32_get_pixel_rate_div(
|
||||||
struct dccg *dccg,
|
struct dccg *dccg,
|
||||||
uint32_t otg_inst,
|
uint32_t otg_inst,
|
||||||
@@ -110,21 +124,29 @@ static void dccg32_set_pixel_rate_div(
|
|||||||
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
||||||
OTG0_PIXEL_RATE_DIVK1, k1,
|
OTG0_PIXEL_RATE_DIVK1, k1,
|
||||||
OTG0_PIXEL_RATE_DIVK2, k2);
|
OTG0_PIXEL_RATE_DIVK2, k2);
|
||||||
|
|
||||||
|
dccg32_wait_for_dentist_change_done(dccg);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
||||||
OTG1_PIXEL_RATE_DIVK1, k1,
|
OTG1_PIXEL_RATE_DIVK1, k1,
|
||||||
OTG1_PIXEL_RATE_DIVK2, k2);
|
OTG1_PIXEL_RATE_DIVK2, k2);
|
||||||
|
|
||||||
|
dccg32_wait_for_dentist_change_done(dccg);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
||||||
OTG2_PIXEL_RATE_DIVK1, k1,
|
OTG2_PIXEL_RATE_DIVK1, k1,
|
||||||
OTG2_PIXEL_RATE_DIVK2, k2);
|
OTG2_PIXEL_RATE_DIVK2, k2);
|
||||||
|
|
||||||
|
dccg32_wait_for_dentist_change_done(dccg);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
REG_UPDATE_2(OTG_PIXEL_RATE_DIV,
|
||||||
OTG3_PIXEL_RATE_DIVK1, k1,
|
OTG3_PIXEL_RATE_DIVK1, k1,
|
||||||
OTG3_PIXEL_RATE_DIVK2, k2);
|
OTG3_PIXEL_RATE_DIVK2, k2);
|
||||||
|
|
||||||
|
dccg32_wait_for_dentist_change_done(dccg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
BREAK_TO_DEBUGGER();
|
BREAK_TO_DEBUGGER();
|
||||||
|
|||||||
@@ -147,7 +147,8 @@
|
|||||||
DCCG_SF(DTBCLK_P_CNTL, DTBCLK_P3_SRC_SEL, mask_sh),\
|
DCCG_SF(DTBCLK_P_CNTL, DTBCLK_P3_SRC_SEL, mask_sh),\
|
||||||
DCCG_SF(DTBCLK_P_CNTL, DTBCLK_P3_EN, mask_sh),\
|
DCCG_SF(DTBCLK_P_CNTL, DTBCLK_P3_EN, mask_sh),\
|
||||||
DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO_SEL, mask_sh),\
|
DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO_SEL, mask_sh),\
|
||||||
DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL, mask_sh)
|
DCCG_SF(DCCG_AUDIO_DTO_SOURCE, DCCG_AUDIO_DTO0_SOURCE_SEL, mask_sh),\
|
||||||
|
DCCG_SF(DENTIST_DISPCLK_CNTL, DENTIST_DISPCLK_CHG_DONE, mask_sh)
|
||||||
|
|
||||||
|
|
||||||
struct dccg *dccg32_create(
|
struct dccg *dccg32_create(
|
||||||
|
|||||||
@@ -1177,7 +1177,7 @@ unsigned int dcn32_calculate_dccg_k1_k2_values(struct pipe_ctx *pipe_ctx, unsign
|
|||||||
*k2_div = PIXEL_RATE_DIV_BY_2;
|
*k2_div = PIXEL_RATE_DIV_BY_2;
|
||||||
else
|
else
|
||||||
*k2_div = PIXEL_RATE_DIV_BY_4;
|
*k2_div = PIXEL_RATE_DIV_BY_4;
|
||||||
} else if (dc_is_dp_signal(stream->signal)) {
|
} else if (dc_is_dp_signal(stream->signal) || dc_is_virtual_signal(stream->signal)) {
|
||||||
if (two_pix_per_container) {
|
if (two_pix_per_container) {
|
||||||
*k1_div = PIXEL_RATE_DIV_BY_1;
|
*k1_div = PIXEL_RATE_DIV_BY_1;
|
||||||
*k2_div = PIXEL_RATE_DIV_BY_2;
|
*k2_div = PIXEL_RATE_DIV_BY_2;
|
||||||
|
|||||||
@@ -1272,7 +1272,8 @@ unsigned int dcn32_calc_num_avail_chans_for_mall(struct dc *dc, int num_chans);
|
|||||||
DCCG_SRII(PHASE, DTBCLK_DTO, 0), DCCG_SRII(PHASE, DTBCLK_DTO, 1), \
|
DCCG_SRII(PHASE, DTBCLK_DTO, 0), DCCG_SRII(PHASE, DTBCLK_DTO, 1), \
|
||||||
DCCG_SRII(PHASE, DTBCLK_DTO, 2), DCCG_SRII(PHASE, DTBCLK_DTO, 3), \
|
DCCG_SRII(PHASE, DTBCLK_DTO, 2), DCCG_SRII(PHASE, DTBCLK_DTO, 3), \
|
||||||
SR(DCCG_AUDIO_DTBCLK_DTO_MODULO), SR(DCCG_AUDIO_DTBCLK_DTO_PHASE), \
|
SR(DCCG_AUDIO_DTBCLK_DTO_MODULO), SR(DCCG_AUDIO_DTBCLK_DTO_PHASE), \
|
||||||
SR(OTG_PIXEL_RATE_DIV), SR(DTBCLK_P_CNTL), SR(DCCG_AUDIO_DTO_SOURCE) \
|
SR(OTG_PIXEL_RATE_DIV), SR(DTBCLK_P_CNTL), \
|
||||||
|
SR(DCCG_AUDIO_DTO_SOURCE), SR(DENTIST_DISPCLK_CNTL) \
|
||||||
)
|
)
|
||||||
|
|
||||||
/* VMID */
|
/* VMID */
|
||||||
|
|||||||
Reference in New Issue
Block a user