提交 5eefbc40 编写于 作者: Y Yue Hin Lau 提交者: Alex Deucher

drm/amd/display: moving backlight registers to hwsequencer

Signed-off-by: NYue Hin Lau <Yuehin.Lau@amd.com>
Reviewed-by: NDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: NHarry Wentland <Harry.Wentland@amd.com>
Signed-off-by: NAlex Deucher <alexander.deucher@amd.com>
上级 62bf6e9b
...@@ -1807,7 +1807,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal) ...@@ -1807,7 +1807,7 @@ static void disable_link(struct dc_link *link, enum signal_type signal)
else else
dp_disable_link_phy_mst(link, signal); dp_disable_link_phy_mst(link, signal);
} else } else
link->link_enc->funcs->disable_output(link->link_enc, signal); link->link_enc->funcs->disable_output(link->link_enc, signal, link);
} }
enum dc_status dc_link_validate_mode_timing( enum dc_status dc_link_validate_mode_timing(
......
...@@ -94,7 +94,7 @@ void dp_enable_link_phy( ...@@ -94,7 +94,7 @@ void dp_enable_link_phy(
link_enc, link_enc,
link_settings, link_settings,
clock_source); clock_source);
link_enc->funcs->backlight_control(link_enc, true); link->dc->hwss.backlight_control(link, true);
} else } else
link_enc->funcs->enable_dp_output( link_enc->funcs->enable_dp_output(
link_enc, link_enc,
...@@ -138,12 +138,12 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal) ...@@ -138,12 +138,12 @@ void dp_disable_link_phy(struct dc_link *link, enum signal_type signal)
dp_receiver_power_ctrl(link, false); dp_receiver_power_ctrl(link, false);
if (signal == SIGNAL_TYPE_EDP) { if (signal == SIGNAL_TYPE_EDP) {
link->link_enc->funcs->backlight_control(link->link_enc, false); link->dc->hwss.backlight_control(link, false);
edp_receiver_ready_T9(link); edp_receiver_ready_T9(link);
link->link_enc->funcs->disable_output(link->link_enc, signal); link->link_enc->funcs->disable_output(link->link_enc, signal, link);
link->link_enc->funcs->power_control(link->link_enc, false); link->link_enc->funcs->power_control(link->link_enc, false);
} else } else
link->link_enc->funcs->disable_output(link->link_enc, signal); link->link_enc->funcs->disable_output(link->link_enc, signal, link);
/* Clear current link setting.*/ /* Clear current link setting.*/
memset(&link->cur_link_settings, 0, memset(&link->cur_link_settings, 0,
...@@ -286,7 +286,8 @@ void dp_retrain_link_dp_test(struct dc_link *link, ...@@ -286,7 +286,8 @@ void dp_retrain_link_dp_test(struct dc_link *link,
link->link_enc->funcs->disable_output( link->link_enc->funcs->disable_output(
link->link_enc, link->link_enc,
SIGNAL_TYPE_DISPLAY_PORT); SIGNAL_TYPE_DISPLAY_PORT,
link);
/* Clear current link setting. */ /* Clear current link setting. */
memset(&link->cur_link_settings, 0, memset(&link->cur_link_settings, 0,
......
...@@ -27,6 +27,10 @@ ...@@ -27,6 +27,10 @@
#include "hw_sequencer.h" #include "hw_sequencer.h"
#define BL_REG_LIST()\
SR(LVTMA_PWRSEQ_CNTL), \
SR(LVTMA_PWRSEQ_STATE)
#define HWSEQ_DCEF_REG_LIST_DCE8() \ #define HWSEQ_DCEF_REG_LIST_DCE8() \
.DCFE_CLOCK_CONTROL[0] = mmCRTC0_CRTC_DCFE_CLOCK_CONTROL, \ .DCFE_CLOCK_CONTROL[0] = mmCRTC0_CRTC_DCFE_CLOCK_CONTROL, \
.DCFE_CLOCK_CONTROL[1] = mmCRTC1_CRTC_DCFE_CLOCK_CONTROL, \ .DCFE_CLOCK_CONTROL[1] = mmCRTC1_CRTC_DCFE_CLOCK_CONTROL, \
...@@ -86,24 +90,27 @@ ...@@ -86,24 +90,27 @@
SRII(BLND_CONTROL, BLND, 0),\ SRII(BLND_CONTROL, BLND, 0),\
SRII(BLND_CONTROL, BLND, 1),\ SRII(BLND_CONTROL, BLND, 1),\
SR(BLNDV_CONTROL),\ SR(BLNDV_CONTROL),\
HWSEQ_PIXEL_RATE_REG_LIST(CRTC) HWSEQ_PIXEL_RATE_REG_LIST(CRTC),\
BL_REG_LIST()
#define HWSEQ_DCE8_REG_LIST() \ #define HWSEQ_DCE8_REG_LIST() \
HWSEQ_DCEF_REG_LIST_DCE8(), \ HWSEQ_DCEF_REG_LIST_DCE8(), \
HWSEQ_BLND_REG_LIST(), \ HWSEQ_BLND_REG_LIST(), \
HWSEQ_PIXEL_RATE_REG_LIST(CRTC) HWSEQ_PIXEL_RATE_REG_LIST(CRTC),\
BL_REG_LIST()
#define HWSEQ_DCE10_REG_LIST() \ #define HWSEQ_DCE10_REG_LIST() \
HWSEQ_DCEF_REG_LIST(), \ HWSEQ_DCEF_REG_LIST(), \
HWSEQ_BLND_REG_LIST(), \ HWSEQ_BLND_REG_LIST(), \
HWSEQ_PIXEL_RATE_REG_LIST(CRTC) HWSEQ_PIXEL_RATE_REG_LIST(CRTC), \
BL_REG_LIST()
#define HWSEQ_ST_REG_LIST() \ #define HWSEQ_ST_REG_LIST() \
HWSEQ_DCE11_REG_LIST_BASE(), \ HWSEQ_DCE11_REG_LIST_BASE(), \
.DCFE_CLOCK_CONTROL[2] = mmDCFEV_CLOCK_CONTROL, \ .DCFE_CLOCK_CONTROL[2] = mmDCFEV_CLOCK_CONTROL, \
.CRTC_H_BLANK_START_END[2] = mmCRTCV_H_BLANK_START_END, \ .CRTC_H_BLANK_START_END[2] = mmCRTCV_H_BLANK_START_END, \
.BLND_V_UPDATE_LOCK[2] = mmBLNDV_V_UPDATE_LOCK, \ .BLND_V_UPDATE_LOCK[2] = mmBLNDV_V_UPDATE_LOCK, \
.BLND_CONTROL[2] = mmBLNDV_CONTROL, .BLND_CONTROL[2] = mmBLNDV_CONTROL
#define HWSEQ_CZ_REG_LIST() \ #define HWSEQ_CZ_REG_LIST() \
HWSEQ_DCE11_REG_LIST_BASE(), \ HWSEQ_DCE11_REG_LIST_BASE(), \
...@@ -123,12 +130,14 @@ ...@@ -123,12 +130,14 @@
SR(DCHUB_FB_LOCATION),\ SR(DCHUB_FB_LOCATION),\
SR(DCHUB_AGP_BASE),\ SR(DCHUB_AGP_BASE),\
SR(DCHUB_AGP_BOT),\ SR(DCHUB_AGP_BOT),\
SR(DCHUB_AGP_TOP) SR(DCHUB_AGP_TOP), \
BL_REG_LIST()
#define HWSEQ_DCE112_REG_LIST() \ #define HWSEQ_DCE112_REG_LIST() \
HWSEQ_DCE10_REG_LIST(), \ HWSEQ_DCE10_REG_LIST(), \
HWSEQ_PIXEL_RATE_REG_LIST(CRTC), \ HWSEQ_PIXEL_RATE_REG_LIST(CRTC), \
HWSEQ_PHYPLL_REG_LIST(CRTC) HWSEQ_PHYPLL_REG_LIST(CRTC), \
BL_REG_LIST()
#define HWSEQ_DCN_REG_LIST()\ #define HWSEQ_DCN_REG_LIST()\
SRII(OTG_GLOBAL_SYNC_STATUS, OTG, 0), \ SRII(OTG_GLOBAL_SYNC_STATUS, OTG, 0), \
...@@ -228,9 +237,15 @@ ...@@ -228,9 +237,15 @@
SR(D2VGA_CONTROL), \ SR(D2VGA_CONTROL), \
SR(D3VGA_CONTROL), \ SR(D3VGA_CONTROL), \
SR(D4VGA_CONTROL), \ SR(D4VGA_CONTROL), \
SR(DC_IP_REQUEST_CNTL) SR(DC_IP_REQUEST_CNTL), \
BL_REG_LIST()
struct dce_hwseq_registers { struct dce_hwseq_registers {
/* Backlight registers */
uint32_t LVTMA_PWRSEQ_CNTL;
uint32_t LVTMA_PWRSEQ_STATE;
uint32_t DCFE_CLOCK_CONTROL[6]; uint32_t DCFE_CLOCK_CONTROL[6];
uint32_t DCFEV_CLOCK_CONTROL; uint32_t DCFEV_CLOCK_CONTROL;
uint32_t DC_MEM_GLOBAL_PWR_REQ_CNTL; uint32_t DC_MEM_GLOBAL_PWR_REQ_CNTL;
...@@ -375,20 +390,24 @@ struct dce_hwseq_registers { ...@@ -375,20 +390,24 @@ struct dce_hwseq_registers {
HWS_SF(BLND_, V_UPDATE_LOCK, BLND_SCL_V_UPDATE_LOCK, mask_sh),\ HWS_SF(BLND_, V_UPDATE_LOCK, BLND_SCL_V_UPDATE_LOCK, mask_sh),\
HWS_SF(BLND_, V_UPDATE_LOCK, BLND_DCP_GRPH_SURF_V_UPDATE_LOCK, mask_sh),\ HWS_SF(BLND_, V_UPDATE_LOCK, BLND_DCP_GRPH_SURF_V_UPDATE_LOCK, mask_sh),\
HWS_SF(BLND_, CONTROL, BLND_MODE, mask_sh),\ HWS_SF(BLND_, CONTROL, BLND_MODE, mask_sh),\
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh),\
HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_) HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_)
#define HWSEQ_DCE10_MASK_SH_LIST(mask_sh)\ #define HWSEQ_DCE10_MASK_SH_LIST(mask_sh)\
HWSEQ_DCEF_MASK_SH_LIST(mask_sh, DCFE_),\ HWSEQ_DCEF_MASK_SH_LIST(mask_sh, DCFE_),\
HWSEQ_BLND_MASK_SH_LIST(mask_sh, BLND_),\ HWSEQ_BLND_MASK_SH_LIST(mask_sh, BLND_),\
HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_) HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_), \
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh)
#define HWSEQ_DCE11_MASK_SH_LIST(mask_sh)\ #define HWSEQ_DCE11_MASK_SH_LIST(mask_sh)\
HWSEQ_DCE10_MASK_SH_LIST(mask_sh),\ HWSEQ_DCE10_MASK_SH_LIST(mask_sh),\
SF(DCFEV_CLOCK_CONTROL, DCFEV_CLOCK_ENABLE, mask_sh),\ SF(DCFEV_CLOCK_CONTROL, DCFEV_CLOCK_ENABLE, mask_sh),\
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh),\
HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_) HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_)
#define HWSEQ_DCE112_MASK_SH_LIST(mask_sh)\ #define HWSEQ_DCE112_MASK_SH_LIST(mask_sh)\
HWSEQ_DCE10_MASK_SH_LIST(mask_sh),\ HWSEQ_DCE10_MASK_SH_LIST(mask_sh),\
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh),\
HWSEQ_PHYPLL_MASK_SH_LIST(mask_sh, CRTC0_) HWSEQ_PHYPLL_MASK_SH_LIST(mask_sh, CRTC0_)
#define HWSEQ_GFX9_DCHUB_MASK_SH_LIST(mask_sh)\ #define HWSEQ_GFX9_DCHUB_MASK_SH_LIST(mask_sh)\
...@@ -396,14 +415,16 @@ struct dce_hwseq_registers { ...@@ -396,14 +415,16 @@ struct dce_hwseq_registers {
SF(DCHUB_FB_LOCATION, FB_BASE, mask_sh),\ SF(DCHUB_FB_LOCATION, FB_BASE, mask_sh),\
SF(DCHUB_AGP_BASE, AGP_BASE, mask_sh),\ SF(DCHUB_AGP_BASE, AGP_BASE, mask_sh),\
SF(DCHUB_AGP_BOT, AGP_BOT, mask_sh),\ SF(DCHUB_AGP_BOT, AGP_BOT, mask_sh),\
SF(DCHUB_AGP_TOP, AGP_TOP, mask_sh) SF(DCHUB_AGP_TOP, AGP_TOP, mask_sh), \
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh)
#define HWSEQ_DCE12_MASK_SH_LIST(mask_sh)\ #define HWSEQ_DCE12_MASK_SH_LIST(mask_sh)\
HWSEQ_DCEF_MASK_SH_LIST(mask_sh, DCFE0_DCFE_),\ HWSEQ_DCEF_MASK_SH_LIST(mask_sh, DCFE0_DCFE_),\
HWSEQ_BLND_MASK_SH_LIST(mask_sh, BLND0_BLND_),\ HWSEQ_BLND_MASK_SH_LIST(mask_sh, BLND0_BLND_),\
HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_),\ HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, CRTC0_),\
HWSEQ_PHYPLL_MASK_SH_LIST(mask_sh, CRTC0_),\ HWSEQ_PHYPLL_MASK_SH_LIST(mask_sh, CRTC0_),\
HWSEQ_GFX9_DCHUB_MASK_SH_LIST(mask_sh) HWSEQ_GFX9_DCHUB_MASK_SH_LIST(mask_sh), \
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh)
#define HWSEQ_DCN_MASK_SH_LIST(mask_sh)\ #define HWSEQ_DCN_MASK_SH_LIST(mask_sh)\
HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, OTG0_),\ HWSEQ_PIXEL_RATE_MASK_SH_LIST(mask_sh, OTG0_),\
...@@ -467,7 +488,8 @@ struct dce_hwseq_registers { ...@@ -467,7 +488,8 @@ struct dce_hwseq_registers {
HWS_SF(, DOMAIN5_PG_STATUS, DOMAIN5_PGFSM_PWR_STATUS, mask_sh), \ HWS_SF(, DOMAIN5_PG_STATUS, DOMAIN5_PGFSM_PWR_STATUS, mask_sh), \
HWS_SF(, DOMAIN6_PG_STATUS, DOMAIN6_PGFSM_PWR_STATUS, mask_sh), \ HWS_SF(, DOMAIN6_PG_STATUS, DOMAIN6_PGFSM_PWR_STATUS, mask_sh), \
HWS_SF(, DOMAIN7_PG_STATUS, DOMAIN7_PGFSM_PWR_STATUS, mask_sh), \ HWS_SF(, DOMAIN7_PG_STATUS, DOMAIN7_PGFSM_PWR_STATUS, mask_sh), \
HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh) HWS_SF(, DC_IP_REQUEST_CNTL, IP_REQUEST_EN, mask_sh), \
HWS_SF(, LVTMA_PWRSEQ_CNTL, LVTMA_BLON, mask_sh)
#define HWSEQ_REG_FIELD_LIST(type) \ #define HWSEQ_REG_FIELD_LIST(type) \
type DCFE_CLOCK_ENABLE; \ type DCFE_CLOCK_ENABLE; \
...@@ -497,7 +519,8 @@ struct dce_hwseq_registers { ...@@ -497,7 +519,8 @@ struct dce_hwseq_registers {
type PHYSICAL_PAGE_NUMBER_LSB;\ type PHYSICAL_PAGE_NUMBER_LSB;\
type LOGICAL_ADDR; \ type LOGICAL_ADDR; \
type ENABLE_L1_TLB;\ type ENABLE_L1_TLB;\
type SYSTEM_ACCESS_MODE; type SYSTEM_ACCESS_MODE;\
type LVTMA_BLON;
#define HWSEQ_DCN_REG_FIELD_LIST(type) \ #define HWSEQ_DCN_REG_FIELD_LIST(type) \
type VUPDATE_NO_LOCK_EVENT_CLEAR; \ type VUPDATE_NO_LOCK_EVENT_CLEAR; \
......
...@@ -122,7 +122,6 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = { ...@@ -122,7 +122,6 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
.psr_program_dp_dphy_fast_training = .psr_program_dp_dphy_fast_training =
dce110_psr_program_dp_dphy_fast_training, dce110_psr_program_dp_dphy_fast_training,
.psr_program_secondary_packet = dce110_psr_program_secondary_packet, .psr_program_secondary_packet = dce110_psr_program_secondary_packet,
.backlight_control = dce110_link_encoder_edp_backlight_control,
.power_control = dce110_link_encoder_edp_power_control, .power_control = dce110_link_encoder_edp_power_control,
.connect_dig_be_to_fe = dce110_link_encoder_connect_dig_be_to_fe, .connect_dig_be_to_fe = dce110_link_encoder_connect_dig_be_to_fe,
.enable_hpd = dce110_link_encoder_enable_hpd, .enable_hpd = dce110_link_encoder_enable_hpd,
...@@ -674,16 +673,6 @@ static void aux_initialize( ...@@ -674,16 +673,6 @@ static void aux_initialize(
} }
/*todo: cloned in stream enc, fix*/
static bool is_panel_backlight_on(struct dce110_link_encoder *enc110)
{
uint32_t value;
REG_GET(LVTMA_PWRSEQ_CNTL, LVTMA_BLON, &value);
return value;
}
void dce110_psr_program_dp_dphy_fast_training(struct link_encoder *enc, void dce110_psr_program_dp_dphy_fast_training(struct link_encoder *enc,
bool exit_link_training_required) bool exit_link_training_required)
{ {
...@@ -718,69 +707,6 @@ void dce110_psr_program_secondary_packet(struct link_encoder *enc, ...@@ -718,69 +707,6 @@ void dce110_psr_program_secondary_packet(struct link_encoder *enc,
DP_SEC_GSP0_PRIORITY, 1); DP_SEC_GSP0_PRIORITY, 1);
} }
/*todo: cloned in stream enc, fix*/
/*
* @brief
* eDP only. Control the backlight of the eDP panel
*/
void dce110_link_encoder_edp_backlight_control(
struct link_encoder *enc,
bool enable)
{
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
struct dc_context *ctx = enc110->base.ctx;
struct bp_transmitter_control cntl = { 0 };
if (dal_graphics_object_id_get_connector_id(enc110->base.connector)
!= CONNECTOR_ID_EDP) {
BREAK_TO_DEBUGGER();
return;
}
if (enable && is_panel_backlight_on(enc110)) {
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: panel already powered up. Do nothing.\n",
__func__);
return;
}
if (!enable && !is_panel_backlight_on(enc110)) {
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: panel already powered down. Do nothing.\n",
__func__);
return;
}
/* Send VBIOS command to control eDP panel backlight */
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: backlight action: %s\n",
__func__, (enable ? "On":"Off"));
cntl.action = enable ?
TRANSMITTER_CONTROL_BACKLIGHT_ON :
TRANSMITTER_CONTROL_BACKLIGHT_OFF;
/*cntl.engine_id = ctx->engine;*/
cntl.transmitter = enc110->base.transmitter;
cntl.connector_obj_id = enc110->base.connector;
/*todo: unhardcode*/
cntl.lanes_number = LANE_COUNT_FOUR;
cntl.hpd_sel = enc110->base.hpd_source;
/* For eDP, the following delays might need to be considered
* after link training completed:
* idle period - min. accounts for required BS-Idle pattern,
* max. allows for source frame synchronization);
* 50 msec max. delay from valid video data from source
* to video on dislpay or backlight enable.
*
* Disable the delay for now.
* Enable it in the future if necessary.
*/
/* dc_service_sleep_in_milliseconds(50); */
link_transmitter_control(enc110, &cntl);
}
static bool is_dig_enabled(const struct dce110_link_encoder *enc110) static bool is_dig_enabled(const struct dce110_link_encoder *enc110)
{ {
uint32_t value; uint32_t value;
...@@ -1279,7 +1205,8 @@ void dce110_link_encoder_enable_dp_mst_output( ...@@ -1279,7 +1205,8 @@ void dce110_link_encoder_enable_dp_mst_output(
*/ */
void dce110_link_encoder_disable_output( void dce110_link_encoder_disable_output(
struct link_encoder *enc, struct link_encoder *enc,
enum signal_type signal) enum signal_type signal,
struct dc_link *link)
{ {
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc); struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
struct dc_context *ctx = enc110->base.ctx; struct dc_context *ctx = enc110->base.ctx;
...@@ -1291,7 +1218,7 @@ void dce110_link_encoder_disable_output( ...@@ -1291,7 +1218,7 @@ void dce110_link_encoder_disable_output(
return; return;
} }
if (enc110->base.connector.id == CONNECTOR_ID_EDP) if (enc110->base.connector.id == CONNECTOR_ID_EDP)
dce110_link_encoder_edp_backlight_control(enc, false); ctx->dc->hwss.backlight_control(link, false);
/* Power-down RX and disable GPU PHY should be paired. /* Power-down RX and disable GPU PHY should be paired.
* Disabling PHY without powering down RX may cause * Disabling PHY without powering down RX may cause
* symbol lock loss, on which we will get DP Sink interrupt. */ * symbol lock loss, on which we will get DP Sink interrupt. */
......
...@@ -69,10 +69,6 @@ ...@@ -69,10 +69,6 @@
SRI(DP_DPHY_FAST_TRAINING, DP, id), \ SRI(DP_DPHY_FAST_TRAINING, DP, id), \
SRI(DP_SEC_CNTL1, DP, id) SRI(DP_SEC_CNTL1, DP, id)
#define LE_EDP_REG_LIST(id)\
SR(LVTMA_PWRSEQ_CNTL), \
SR(LVTMA_PWRSEQ_STATE)
#define LE_COMMON_REG_LIST(id)\ #define LE_COMMON_REG_LIST(id)\
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id), \
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \ SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
...@@ -81,38 +77,32 @@ ...@@ -81,38 +77,32 @@
#define LE_DCE80_REG_LIST(id)\ #define LE_DCE80_REG_LIST(id)\
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \ SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id)
LE_EDP_REG_LIST(id)
#define LE_DCE100_REG_LIST(id)\ #define LE_DCE100_REG_LIST(id)\
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id), \
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \ SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \ SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
SR(DCI_MEM_PWR_STATUS), \ SR(DCI_MEM_PWR_STATUS)
LE_EDP_REG_LIST(id)
#define LE_DCE110_REG_LIST(id)\ #define LE_DCE110_REG_LIST(id)\
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id), \
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \ SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \ SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \ SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \
SR(DCI_MEM_PWR_STATUS), \ SR(DCI_MEM_PWR_STATUS)
LE_EDP_REG_LIST(id)
#define LE_DCE120_REG_LIST(id)\ #define LE_DCE120_REG_LIST(id)\
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id), \
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \ SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \ SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \
SR(DCI_MEM_PWR_STATUS), \ SR(DCI_MEM_PWR_STATUS)
LE_EDP_REG_LIST(id)
#define LE_DCN10_REG_LIST(id)\ #define LE_DCN10_REG_LIST(id)\
LE_COMMON_REG_LIST_BASE(id), \ LE_COMMON_REG_LIST_BASE(id), \
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \ SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \ SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id), \ SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
SR(DMU_MEM_PWR_CNTL), \
LE_EDP_REG_LIST(id)
struct dce110_link_enc_aux_registers { struct dce110_link_enc_aux_registers {
uint32_t AUX_CONTROL; uint32_t AUX_CONTROL;
...@@ -243,7 +233,8 @@ void dce110_link_encoder_enable_dp_mst_output( ...@@ -243,7 +233,8 @@ void dce110_link_encoder_enable_dp_mst_output(
/* disable PHY output */ /* disable PHY output */
void dce110_link_encoder_disable_output( void dce110_link_encoder_disable_output(
struct link_encoder *link_enc, struct link_encoder *link_enc,
enum signal_type signal); enum signal_type signal,
struct dc_link *link);
/* set DP lane settings */ /* set DP lane settings */
void dce110_link_encoder_dp_set_lane_settings( void dce110_link_encoder_dp_set_lane_settings(
...@@ -259,10 +250,6 @@ void dce110_link_encoder_update_mst_stream_allocation_table( ...@@ -259,10 +250,6 @@ void dce110_link_encoder_update_mst_stream_allocation_table(
struct link_encoder *enc, struct link_encoder *enc,
const struct link_mst_stream_allocation_table *table); const struct link_mst_stream_allocation_table *table);
void dce110_link_encoder_edp_backlight_control(
struct link_encoder *enc,
bool enable);
void dce110_link_encoder_edp_power_control( void dce110_link_encoder_edp_power_control(
struct link_encoder *enc, struct link_encoder *enc,
bool power_up); bool power_up);
......
...@@ -56,6 +56,15 @@ ...@@ -56,6 +56,15 @@
#include "dce/dce_11_0_sh_mask.h" #include "dce/dce_11_0_sh_mask.h"
#include "custom_float.h" #include "custom_float.h"
#define CTX \
hws->ctx
#define REG(reg)\
hws->regs->reg
#undef FN
#define FN(reg_name, field_name) \
hws->shifts->field_name, hws->masks->field_name
struct dce110_hw_seq_reg_offsets { struct dce110_hw_seq_reg_offsets {
uint32_t crtc; uint32_t crtc;
}; };
...@@ -761,6 +770,92 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx) ...@@ -761,6 +770,92 @@ void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
} }
/*todo: cloned in stream enc, fix*/
static bool is_panel_backlight_on(struct dce_hwseq *hws)
{
uint32_t value;
REG_GET(LVTMA_PWRSEQ_CNTL, LVTMA_BLON, &value);
return value;
}
static enum bp_result link_transmitter_control(
struct dc_link *link,
struct bp_transmitter_control *cntl)
{
enum bp_result result;
struct dc_bios *bp = link->dc->ctx->dc_bios;
result = bp->funcs->transmitter_control(bp, cntl);
return result;
}
/*todo: cloned in stream enc, fix*/
/*
* @brief
* eDP only. Control the backlight of the eDP panel
*/
void hwss_blacklight_control(
struct dc_link *link,
bool enable)
{
struct dce_hwseq *hws = link->dc->hwseq;
struct dc_context *ctx = link->dc->ctx;
struct bp_transmitter_control cntl = { 0 };
if (dal_graphics_object_id_get_connector_id(link->link_id)
!= CONNECTOR_ID_EDP) {
BREAK_TO_DEBUGGER();
return;
}
if (enable && is_panel_backlight_on(hws)) {
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: panel already powered up. Do nothing.\n",
__func__);
return;
}
if (!enable && !is_panel_backlight_on(hws)) {
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: panel already powered down. Do nothing.\n",
__func__);
return;
}
/* Send VBIOS command to control eDP panel backlight */
dm_logger_write(ctx->logger, LOG_HW_RESUME_S3,
"%s: backlight action: %s\n",
__func__, (enable ? "On":"Off"));
cntl.action = enable ?
TRANSMITTER_CONTROL_BACKLIGHT_ON :
TRANSMITTER_CONTROL_BACKLIGHT_OFF;
/*cntl.engine_id = ctx->engine;*/
cntl.transmitter = link->link_enc->transmitter;
cntl.connector_obj_id = link->link_enc->connector;
/*todo: unhardcode*/
cntl.lanes_number = LANE_COUNT_FOUR;
cntl.hpd_sel = link->link_enc->hpd_source;
/* For eDP, the following delays might need to be considered
* after link training completed:
* idle period - min. accounts for required BS-Idle pattern,
* max. allows for source frame synchronization);
* 50 msec max. delay from valid video data from source
* to video on dislpay or backlight enable.
*
* Disable the delay for now.
* Enable it in the future if necessary.
*/
/* dc_service_sleep_in_milliseconds(50); */
link_transmitter_control(link, &cntl);
}
void dce110_disable_stream(struct pipe_ctx *pipe_ctx) void dce110_disable_stream(struct pipe_ctx *pipe_ctx)
{ {
struct dc_stream_state *stream = pipe_ctx->stream; struct dc_stream_state *stream = pipe_ctx->stream;
...@@ -798,7 +893,7 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx) ...@@ -798,7 +893,7 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx)
/* blank at encoder level */ /* blank at encoder level */
if (dc_is_dp_signal(pipe_ctx->stream->signal)) { if (dc_is_dp_signal(pipe_ctx->stream->signal)) {
if (pipe_ctx->stream->sink->link->connector_signal == SIGNAL_TYPE_EDP) if (pipe_ctx->stream->sink->link->connector_signal == SIGNAL_TYPE_EDP)
link->link_enc->funcs->backlight_control(link->link_enc, false); hwss_blacklight_control(link, false);
pipe_ctx->stream_res.stream_enc->funcs->dp_blank(pipe_ctx->stream_res.stream_enc); pipe_ctx->stream_res.stream_enc->funcs->dp_blank(pipe_ctx->stream_res.stream_enc);
} }
link->link_enc->funcs->connect_dig_be_to_fe( link->link_enc->funcs->connect_dig_be_to_fe(
...@@ -820,7 +915,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, ...@@ -820,7 +915,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
params.link_settings.link_rate = link_settings->link_rate; params.link_settings.link_rate = link_settings->link_rate;
pipe_ctx->stream_res.stream_enc->funcs->dp_unblank(pipe_ctx->stream_res.stream_enc, &params); pipe_ctx->stream_res.stream_enc->funcs->dp_unblank(pipe_ctx->stream_res.stream_enc, &params);
if (link->connector_signal == SIGNAL_TYPE_EDP) if (link->connector_signal == SIGNAL_TYPE_EDP)
link->link_enc->funcs->backlight_control(link->link_enc, true); hwss_blacklight_control(link, true);
} }
...@@ -1184,7 +1279,7 @@ static void power_down_encoders(struct dc *dc) ...@@ -1184,7 +1279,7 @@ static void power_down_encoders(struct dc *dc)
} }
dc->links[i]->link_enc->funcs->disable_output( dc->links[i]->link_enc->funcs->disable_output(
dc->links[i]->link_enc, signal); dc->links[i]->link_enc, signal, dc->links[i]);
} }
} }
...@@ -2733,7 +2828,7 @@ static const struct hw_sequencer_funcs dce110_funcs = { ...@@ -2733,7 +2828,7 @@ static const struct hw_sequencer_funcs dce110_funcs = {
.wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect, .wait_for_mpcc_disconnect = dce110_wait_for_mpcc_disconnect,
.ready_shared_resources = ready_shared_resources, .ready_shared_resources = ready_shared_resources,
.optimize_shared_resources = optimize_shared_resources, .optimize_shared_resources = optimize_shared_resources,
.backlight_control = hwss_blacklight_control
}; };
void dce110_hw_sequencer_construct(struct dc *dc) void dce110_hw_sequencer_construct(struct dc *dc)
......
...@@ -111,7 +111,7 @@ struct link_encoder_funcs { ...@@ -111,7 +111,7 @@ struct link_encoder_funcs {
const struct dc_link_settings *link_settings, const struct dc_link_settings *link_settings,
enum clock_source_id clock_source); enum clock_source_id clock_source);
void (*disable_output)(struct link_encoder *link_enc, void (*disable_output)(struct link_encoder *link_enc,
enum signal_type signal); enum signal_type signal, struct dc_link *link);
void (*dp_set_lane_settings)(struct link_encoder *enc, void (*dp_set_lane_settings)(struct link_encoder *enc,
const struct link_training_settings *link_settings); const struct link_training_settings *link_settings);
void (*dp_set_phy_pattern)(struct link_encoder *enc, void (*dp_set_phy_pattern)(struct link_encoder *enc,
...@@ -123,8 +123,6 @@ struct link_encoder_funcs { ...@@ -123,8 +123,6 @@ struct link_encoder_funcs {
bool exit_link_training_required); bool exit_link_training_required);
void (*psr_program_secondary_packet)(struct link_encoder *enc, void (*psr_program_secondary_packet)(struct link_encoder *enc,
unsigned int sdp_transmit_line_num_deadline); unsigned int sdp_transmit_line_num_deadline);
void (*backlight_control) (struct link_encoder *enc,
bool enable);
void (*power_control) (struct link_encoder *enc, void (*power_control) (struct link_encoder *enc,
bool power_up); bool power_up);
void (*connect_dig_be_to_fe)(struct link_encoder *enc, void (*connect_dig_be_to_fe)(struct link_encoder *enc,
......
...@@ -176,6 +176,10 @@ struct hw_sequencer_funcs { ...@@ -176,6 +176,10 @@ struct hw_sequencer_funcs {
void (*ready_shared_resources)(struct dc *dc, struct dc_state *context); void (*ready_shared_resources)(struct dc *dc, struct dc_state *context);
void (*optimize_shared_resources)(struct dc *dc); void (*optimize_shared_resources)(struct dc *dc);
void (*backlight_control)(
struct dc_link *link,
bool enable);
}; };
void color_space_to_black_color( void color_space_to_black_color(
......
...@@ -58,7 +58,8 @@ static void virtual_link_encoder_enable_dp_mst_output( ...@@ -58,7 +58,8 @@ static void virtual_link_encoder_enable_dp_mst_output(
static void virtual_link_encoder_disable_output( static void virtual_link_encoder_disable_output(
struct link_encoder *link_enc, struct link_encoder *link_enc,
enum signal_type signal) {} enum signal_type signal,
struct dc_link *link) {}
static void virtual_link_encoder_dp_set_lane_settings( static void virtual_link_encoder_dp_set_lane_settings(
struct link_encoder *enc, struct link_encoder *enc,
...@@ -72,10 +73,6 @@ static void virtual_link_encoder_update_mst_stream_allocation_table( ...@@ -72,10 +73,6 @@ static void virtual_link_encoder_update_mst_stream_allocation_table(
struct link_encoder *enc, struct link_encoder *enc,
const struct link_mst_stream_allocation_table *table) {} const struct link_mst_stream_allocation_table *table) {}
static void virtual_link_encoder_edp_backlight_control(
struct link_encoder *enc,
bool enable) {}
static void virtual_link_encoder_edp_power_control( static void virtual_link_encoder_edp_power_control(
struct link_encoder *enc, struct link_encoder *enc,
bool power_up) {} bool power_up) {}
...@@ -105,7 +102,6 @@ static const struct link_encoder_funcs virtual_lnk_enc_funcs = { ...@@ -105,7 +102,6 @@ static const struct link_encoder_funcs virtual_lnk_enc_funcs = {
.dp_set_phy_pattern = virtual_link_encoder_dp_set_phy_pattern, .dp_set_phy_pattern = virtual_link_encoder_dp_set_phy_pattern,
.update_mst_stream_allocation_table = .update_mst_stream_allocation_table =
virtual_link_encoder_update_mst_stream_allocation_table, virtual_link_encoder_update_mst_stream_allocation_table,
.backlight_control = virtual_link_encoder_edp_backlight_control,
.power_control = virtual_link_encoder_edp_power_control, .power_control = virtual_link_encoder_edp_power_control,
.connect_dig_be_to_fe = virtual_link_encoder_connect_dig_be_to_fe, .connect_dig_be_to_fe = virtual_link_encoder_connect_dig_be_to_fe,
.destroy = virtual_link_encoder_destroy .destroy = virtual_link_encoder_destroy
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册