Merge tag 'amd-drm-next-5.7-2020-03-19' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.7-2020-03-19: amdgpu: - SR-IOV fixes - RAS fixes - Fallthrough cleanups - Kconfig fix for ACP - Fix load balancing with VCN - DC fixes - GPU reset fixes - Various cleanups scheduler: - Revert job distribution optimization - Add a helper to pick the least loaded scheduler Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200319175418.4237-1-alexander.deucher@amd.com
这个提交包含在:
@@ -132,9 +132,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev);
|
||||
/* removes and deallocates the drm structures, created by the above function */
|
||||
static void amdgpu_dm_destroy_drm_device(struct amdgpu_display_manager *dm);
|
||||
|
||||
static void
|
||||
amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector);
|
||||
|
||||
static int amdgpu_dm_plane_init(struct amdgpu_display_manager *dm,
|
||||
struct drm_plane *plane,
|
||||
unsigned long possible_crtcs,
|
||||
@@ -410,8 +407,9 @@ static void dm_vupdate_high_irq(void *interrupt_params)
|
||||
if (acrtc) {
|
||||
acrtc_state = to_dm_crtc_state(acrtc->base.state);
|
||||
|
||||
DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d\n",
|
||||
acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
|
||||
/* Core vblank handling is done here after end of front-porch in
|
||||
* vrr mode, as vblank timestamping will give valid results
|
||||
@@ -461,8 +459,9 @@ static void dm_crtc_high_irq(void *interrupt_params)
|
||||
if (acrtc) {
|
||||
acrtc_state = to_dm_crtc_state(acrtc->base.state);
|
||||
|
||||
DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d\n",
|
||||
acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
|
||||
/* Core vblank handling at start of front-porch is only possible
|
||||
* in non-vrr mode, as only there vblank timestamping will give
|
||||
@@ -525,8 +524,8 @@ static void dm_dcn_crtc_high_irq(void *interrupt_params)
|
||||
|
||||
acrtc_state = to_dm_crtc_state(acrtc->base.state);
|
||||
|
||||
DRM_DEBUG_DRIVER("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
DRM_DEBUG_VBL("crtc:%d, vupdate-vrr:%d\n", acrtc->crtc_id,
|
||||
amdgpu_dm_vrr_active(acrtc_state));
|
||||
|
||||
amdgpu_dm_crtc_handle_crc_irq(&acrtc->base);
|
||||
drm_crtc_handle_vblank(&acrtc->base);
|
||||
@@ -1895,8 +1894,8 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
|
||||
caps->aux_min_input_signal = min;
|
||||
}
|
||||
|
||||
static void
|
||||
amdgpu_dm_update_connector_after_detect(struct amdgpu_dm_connector *aconnector)
|
||||
void amdgpu_dm_update_connector_after_detect(
|
||||
struct amdgpu_dm_connector *aconnector)
|
||||
{
|
||||
struct drm_connector *connector = &aconnector->base;
|
||||
struct drm_device *dev = connector->dev;
|
||||
@@ -2225,10 +2224,10 @@ static void handle_hpd_rx_irq(void *param)
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_DRM_AMD_DC_HDCP
|
||||
if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
|
||||
if (adev->dm.hdcp_workqueue)
|
||||
hdcp_handle_cpirq(adev->dm.hdcp_workqueue, aconnector->base.index);
|
||||
}
|
||||
if (hpd_irq_data.bytes.device_service_irq.bits.CP_IRQ) {
|
||||
if (adev->dm.hdcp_workqueue)
|
||||
hdcp_handle_cpirq(adev->dm.hdcp_workqueue, aconnector->base.index);
|
||||
}
|
||||
#endif
|
||||
if ((dc_link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) ||
|
||||
(dc_link->type == dc_connection_mst_branch))
|
||||
@@ -3023,6 +3022,9 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
||||
if (adev->asic_type != CHIP_CARRIZO && adev->asic_type != CHIP_STONEY)
|
||||
dm->dc->debug.disable_stutter = amdgpu_pp_feature_mask & PP_STUTTER_MODE ? false : true;
|
||||
|
||||
/* No userspace support. */
|
||||
dm->dc->debug.disable_tri_buf = true;
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
kfree(aencoder);
|
||||
@@ -4314,9 +4316,22 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
struct dmcu *dmcu = core_dc->res_pool->dmcu;
|
||||
|
||||
stream->psr_version = dmcu->dmcu_version.psr_version;
|
||||
mod_build_vsc_infopacket(stream,
|
||||
&stream->vsc_infopacket,
|
||||
&stream->use_vsc_sdp_for_colorimetry);
|
||||
|
||||
//
|
||||
// should decide stream support vsc sdp colorimetry capability
|
||||
// before building vsc info packet
|
||||
//
|
||||
stream->use_vsc_sdp_for_colorimetry = false;
|
||||
if (aconnector->dc_sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
|
||||
stream->use_vsc_sdp_for_colorimetry =
|
||||
aconnector->dc_sink->is_vsc_sdp_colorimetry_supported;
|
||||
} else {
|
||||
if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
|
||||
stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED) {
|
||||
stream->use_vsc_sdp_for_colorimetry = true;
|
||||
}
|
||||
}
|
||||
mod_build_vsc_infopacket(stream, &stream->vsc_infopacket);
|
||||
}
|
||||
}
|
||||
finish:
|
||||
@@ -6538,7 +6553,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
||||
uint32_t target_vblank, last_flip_vblank;
|
||||
bool vrr_active = amdgpu_dm_vrr_active(acrtc_state);
|
||||
bool pflip_present = false;
|
||||
bool swizzle = true;
|
||||
struct {
|
||||
struct dc_surface_update surface_updates[MAX_SURFACES];
|
||||
struct dc_plane_info plane_infos[MAX_SURFACES];
|
||||
@@ -6584,9 +6598,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
||||
|
||||
dc_plane = dm_new_plane_state->dc_state;
|
||||
|
||||
if (dc_plane && !dc_plane->tiling_info.gfx9.swizzle)
|
||||
swizzle = false;
|
||||
|
||||
bundle->surface_updates[planes_count].surface = dc_plane;
|
||||
if (new_pcrtc_state->color_mgmt_changed) {
|
||||
bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction;
|
||||
@@ -6795,8 +6806,7 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
||||
amdgpu_dm_link_setup_psr(acrtc_state->stream);
|
||||
else if ((acrtc_state->update_type == UPDATE_TYPE_FAST) &&
|
||||
acrtc_state->stream->link->psr_feature_enabled &&
|
||||
!acrtc_state->stream->link->psr_allow_active &&
|
||||
swizzle) {
|
||||
!acrtc_state->stream->link->psr_allow_active) {
|
||||
amdgpu_dm_psr_enable(acrtc_state->stream);
|
||||
}
|
||||
|
||||
|
@@ -483,6 +483,9 @@ int amdgpu_dm_update_crtc_color_mgmt(struct dm_crtc_state *crtc);
|
||||
int amdgpu_dm_update_plane_color_mgmt(struct dm_crtc_state *crtc,
|
||||
struct dc_plane_state *dc_plane_state);
|
||||
|
||||
void amdgpu_dm_update_connector_after_detect(
|
||||
struct amdgpu_dm_connector *aconnector);
|
||||
|
||||
extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
|
||||
|
||||
#endif /* __AMDGPU_DM_H__ */
|
||||
|
@@ -580,6 +580,20 @@ enum dc_edid_status dm_helpers_read_local_edid(
|
||||
/* We don't need the original edid anymore */
|
||||
kfree(edid);
|
||||
|
||||
/* connector->display_info will be parsed from EDID and saved
|
||||
* into drm_connector->display_info from edid by call stack
|
||||
* below:
|
||||
* drm_parse_ycbcr420_deep_color_info
|
||||
* drm_parse_hdmi_forum_vsdb
|
||||
* drm_parse_cea_ext
|
||||
* drm_add_display_info
|
||||
* drm_connector_update_edid_property
|
||||
*
|
||||
* drm_connector->display_info will be used by amdgpu_dm funcs,
|
||||
* like fill_stream_properties_from_drm_display_mode
|
||||
*/
|
||||
amdgpu_dm_update_connector_after_detect(aconnector);
|
||||
|
||||
edid_status = dm_helpers_parse_edid_caps(
|
||||
ctx,
|
||||
&sink->dc_edid,
|
||||
|
@@ -267,7 +267,7 @@ static struct atom_display_object_path_v2 *get_bios_object(
|
||||
&& id.enum_id == obj_id.enum_id)
|
||||
return &bp->object_info_tbl.v1_4->display_path[i];
|
||||
}
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case OBJECT_TYPE_CONNECTOR:
|
||||
case OBJECT_TYPE_GENERIC:
|
||||
/* Both Generic and Connector Object ID
|
||||
@@ -280,7 +280,7 @@ static struct atom_display_object_path_v2 *get_bios_object(
|
||||
&& id.enum_id == obj_id.enum_id)
|
||||
return &bp->object_info_tbl.v1_4->display_path[i];
|
||||
}
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -115,12 +115,11 @@ void dcn20_update_clocks_update_dpp_dto(struct clk_mgr_internal *clk_mgr,
|
||||
dpp_inst = i;
|
||||
dppclk_khz = context->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz;
|
||||
|
||||
prev_dppclk_khz = clk_mgr->base.ctx->dc->current_state->res_ctx.pipe_ctx[i].plane_res.bw.dppclk_khz;
|
||||
prev_dppclk_khz = clk_mgr->dccg->pipe_dppclk_khz[i];
|
||||
|
||||
if ((prev_dppclk_khz > dppclk_khz && safe_to_lower) || prev_dppclk_khz < dppclk_khz) {
|
||||
if (safe_to_lower || prev_dppclk_khz < dppclk_khz)
|
||||
clk_mgr->dccg->funcs->update_dpp_dto(
|
||||
clk_mgr->dccg, dpp_inst, dppclk_khz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1365,7 +1365,7 @@ bool dc_post_update_surfaces_to_stream(struct dc *dc)
|
||||
int i;
|
||||
struct dc_state *context = dc->current_state;
|
||||
|
||||
if ((!dc->clk_optimized_required && !dc->wm_optimized_required) || dc->optimize_seamless_boot_streams > 0)
|
||||
if ((!dc->optimized_required) || dc->optimize_seamless_boot_streams > 0)
|
||||
return true;
|
||||
|
||||
post_surface_trace(dc);
|
||||
@@ -1379,7 +1379,7 @@ bool dc_post_update_surfaces_to_stream(struct dc *dc)
|
||||
|
||||
dc->hwss.optimize_bandwidth(dc, context);
|
||||
|
||||
dc->clk_optimized_required = false;
|
||||
dc->optimized_required = false;
|
||||
dc->wm_optimized_required = false;
|
||||
|
||||
return true;
|
||||
@@ -1828,11 +1828,12 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
|
||||
// If there's an available clock comparator, we use that.
|
||||
if (dc->clk_mgr->funcs->are_clock_states_equal) {
|
||||
if (!dc->clk_mgr->funcs->are_clock_states_equal(&dc->clk_mgr->clks, &dc->current_state->bw_ctx.bw.dcn.clk))
|
||||
dc->clk_optimized_required = true;
|
||||
dc->optimized_required = true;
|
||||
// Else we fallback to mem compare.
|
||||
} else if (memcmp(&dc->current_state->bw_ctx.bw.dcn.clk, &dc->clk_mgr->clks, offsetof(struct dc_clocks, prev_p_state_change_support)) != 0) {
|
||||
dc->clk_optimized_required = true;
|
||||
}
|
||||
dc->optimized_required = true;
|
||||
} else if (dc->wm_optimized_required)
|
||||
dc->optimized_required = true;
|
||||
}
|
||||
|
||||
return type;
|
||||
@@ -1871,6 +1872,8 @@ static void copy_surface_update_to_plane(
|
||||
surface->time.index++;
|
||||
if (surface->time.index >= DC_PLANE_UPDATE_TIMES_MAX)
|
||||
surface->time.index = 0;
|
||||
|
||||
surface->triplebuffer_flips = srf_update->flip_addr->triplebuffer_flips;
|
||||
}
|
||||
|
||||
if (srf_update->scaling_info) {
|
||||
@@ -2202,7 +2205,7 @@ static void commit_planes_for_stream(struct dc *dc,
|
||||
dc->optimize_seamless_boot_streams--;
|
||||
|
||||
if (dc->optimize_seamless_boot_streams == 0)
|
||||
dc->clk_optimized_required = true;
|
||||
dc->optimized_required = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -3069,14 +3069,9 @@ void core_link_enable_stream(
|
||||
|
||||
if (pipe_ctx->stream->timing.flags.DSC) {
|
||||
if (dc_is_dp_signal(pipe_ctx->stream->signal) ||
|
||||
dc_is_virtual_signal(pipe_ctx->stream->signal)) {
|
||||
/* Here we only need to enable DSC on RX. DSC HW programming
|
||||
* was done earlier, as part of timing programming.
|
||||
*/
|
||||
dp_set_dsc_on_rx(pipe_ctx, true);
|
||||
}
|
||||
dc_is_virtual_signal(pipe_ctx->stream->signal))
|
||||
dp_set_dsc_enable(pipe_ctx, true);
|
||||
}
|
||||
|
||||
dc->hwss.enable_stream(pipe_ctx);
|
||||
|
||||
/* Set DPS PPS SDP (AKA "info frames") */
|
||||
@@ -3103,7 +3098,7 @@ void core_link_enable_stream(
|
||||
} else { // if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment))
|
||||
if (dc_is_dp_signal(pipe_ctx->stream->signal) ||
|
||||
dc_is_virtual_signal(pipe_ctx->stream->signal))
|
||||
dp_set_dsc_on_rx(pipe_ctx, true);
|
||||
dp_set_dsc_enable(pipe_ctx, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
@@ -2674,9 +2674,12 @@ static void dp_test_send_link_test_pattern(struct dc_link *link)
|
||||
break;
|
||||
}
|
||||
|
||||
test_pattern_color_space = dpcd_test_params.bits.YCBCR_COEFS ?
|
||||
DP_TEST_PATTERN_COLOR_SPACE_YCBCR709 :
|
||||
DP_TEST_PATTERN_COLOR_SPACE_YCBCR601;
|
||||
if (dpcd_test_params.bits.CLR_FORMAT == 0)
|
||||
test_pattern_color_space = DP_TEST_PATTERN_COLOR_SPACE_RGB;
|
||||
else
|
||||
test_pattern_color_space = dpcd_test_params.bits.YCBCR_COEFS ?
|
||||
DP_TEST_PATTERN_COLOR_SPACE_YCBCR709 :
|
||||
DP_TEST_PATTERN_COLOR_SPACE_YCBCR601;
|
||||
|
||||
dc_link_dp_set_test_pattern(
|
||||
link,
|
||||
@@ -3438,6 +3441,17 @@ static bool retrieve_link_cap(struct dc_link *link)
|
||||
sink_id.ieee_device_id,
|
||||
sizeof(sink_id.ieee_device_id));
|
||||
|
||||
/* Quirk Apple MBP 2017 15" Retina panel: Wrong DP_MAX_LINK_RATE */
|
||||
{
|
||||
uint8_t str_mbp_2017[] = { 101, 68, 21, 101, 98, 97 };
|
||||
|
||||
if ((link->dpcd_caps.sink_dev_id == 0x0010fa) &&
|
||||
!memcmp(link->dpcd_caps.sink_dev_id_str, str_mbp_2017,
|
||||
sizeof(str_mbp_2017))) {
|
||||
link->reported_link_cap.link_rate = 0x0c;
|
||||
}
|
||||
}
|
||||
|
||||
core_link_read_dpcd(
|
||||
link,
|
||||
DP_SINK_HW_REVISION_START,
|
||||
|
@@ -394,7 +394,7 @@ static void dsc_optc_config_log(struct display_stream_compressor *dsc,
|
||||
DC_LOG_DSC("\tslice_width %d", config->slice_width);
|
||||
}
|
||||
|
||||
bool dp_set_dsc_on_rx(struct pipe_ctx *pipe_ctx, bool enable)
|
||||
static bool dp_set_dsc_on_rx(struct pipe_ctx *pipe_ctx, bool enable)
|
||||
{
|
||||
struct dc *dc = pipe_ctx->stream->ctx->dc;
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
|
@@ -893,6 +893,7 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx)
|
||||
int vpc_div = (data->format == PIXEL_FORMAT_420BPP8
|
||||
|| data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1;
|
||||
bool orthogonal_rotation, flip_vert_scan_dir, flip_horz_scan_dir;
|
||||
int odm_idx = 0;
|
||||
|
||||
/*
|
||||
* Need to calculate the scan direction for viewport to make adjustments
|
||||
@@ -924,11 +925,13 @@ static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx)
|
||||
* stream->dst.width / stream->src.width -
|
||||
src.x * plane_state->dst_rect.width / src.width
|
||||
* stream->dst.width / stream->src.width);
|
||||
/*modified recout_skip_h calculation due to odm having no recout offset caused by split*/
|
||||
/*modified recout_skip_h calculation due to odm having no recout offset*/
|
||||
while (odm_pipe) {
|
||||
recout_skip_h += odm_pipe->plane_res.scl_data.recout.width + odm_pipe->plane_res.scl_data.recout.x;
|
||||
odm_idx++;
|
||||
odm_pipe = odm_pipe->prev_odm_pipe;
|
||||
}
|
||||
if (odm_idx)
|
||||
recout_skip_h += odm_idx * data->recout.width;
|
||||
|
||||
recout_skip_v = data->recout.y - (stream->dst.y + (plane_state->dst_rect.y - stream->src.y)
|
||||
* stream->dst.height / stream->src.height -
|
||||
|
@@ -521,7 +521,7 @@ struct dc {
|
||||
struct dce_hwseq *hwseq;
|
||||
|
||||
/* Require to optimize clocks and bandwidth for added/removed planes */
|
||||
bool clk_optimized_required;
|
||||
bool optimized_required;
|
||||
bool wm_optimized_required;
|
||||
|
||||
/* Require to maintain clocks and bandwidth for UEFI enabled HW */
|
||||
@@ -872,6 +872,7 @@ struct dc_flip_addrs {
|
||||
unsigned int flip_timestamp_in_us;
|
||||
bool flip_immediate;
|
||||
/* TODO: add flip duration for FreeSync */
|
||||
bool triplebuffer_flips;
|
||||
};
|
||||
|
||||
bool dc_post_update_surfaces_to_stream(
|
||||
@@ -1046,6 +1047,8 @@ struct dc_sink {
|
||||
struct dc_sink_dsc_caps dsc_caps;
|
||||
struct dc_sink_fec_caps fec_caps;
|
||||
|
||||
bool is_vsc_sdp_colorimetry_supported;
|
||||
|
||||
/* private to DC core */
|
||||
struct dc_link *link;
|
||||
struct dc_context *ctx;
|
||||
|
@@ -645,7 +645,7 @@ bool dce_aux_transfer_with_retries(struct ddc_service *ddc,
|
||||
case AUX_TRANSACTION_REPLY_AUX_DEFER:
|
||||
case AUX_TRANSACTION_REPLY_I2C_OVER_AUX_DEFER:
|
||||
retry_on_defer = true;
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case AUX_TRANSACTION_REPLY_I2C_OVER_AUX_NACK:
|
||||
if (++aux_defer_retries >= AUX_MAX_DEFER_RETRIES) {
|
||||
goto fail;
|
||||
|
@@ -267,6 +267,9 @@ static void set_speed(
|
||||
uint32_t xtal_ref_div = 0;
|
||||
uint32_t prescale = 0;
|
||||
|
||||
if (speed == 0)
|
||||
return;
|
||||
|
||||
REG_GET(MICROSECOND_TIME_BASE_DIV, XTAL_REF_DIV, &xtal_ref_div);
|
||||
|
||||
if (xtal_ref_div == 0)
|
||||
@@ -274,17 +277,15 @@ static void set_speed(
|
||||
|
||||
prescale = ((dce_i2c_hw->reference_frequency * 2) / xtal_ref_div) / speed;
|
||||
|
||||
if (speed) {
|
||||
if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL)
|
||||
REG_UPDATE_N(SPEED, 3,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1);
|
||||
else
|
||||
REG_UPDATE_N(SPEED, 2,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2);
|
||||
}
|
||||
if (dce_i2c_hw->masks->DC_I2C_DDC1_START_STOP_TIMING_CNTL)
|
||||
REG_UPDATE_N(SPEED, 3,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_START_STOP_TIMING_CNTL), speed > 50 ? 2:1);
|
||||
else
|
||||
REG_UPDATE_N(SPEED, 2,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_PRESCALE), prescale,
|
||||
FN(DC_I2C_DDC1_SPEED, DC_I2C_DDC1_THRESHOLD), 2);
|
||||
}
|
||||
|
||||
static bool setup_engine(
|
||||
|
@@ -479,7 +479,7 @@ static void program_grph_pixel_format(
|
||||
case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
|
||||
sign = 1;
|
||||
floating = 1;
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: /* shouldn't this get float too? */
|
||||
case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
|
||||
grph_depth = 3;
|
||||
|
@@ -134,11 +134,9 @@ static bool dmub_psr_copy_settings(struct dmub_psr *dmub,
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (res_ctx &&
|
||||
res_ctx->pipe_ctx[i].stream &&
|
||||
res_ctx->pipe_ctx[i].stream->link &&
|
||||
res_ctx->pipe_ctx[i].stream->link == link &&
|
||||
res_ctx->pipe_ctx[i].stream->link->connector_signal == SIGNAL_TYPE_EDP) {
|
||||
if (res_ctx->pipe_ctx[i].stream &&
|
||||
res_ctx->pipe_ctx[i].stream->link == link &&
|
||||
res_ctx->pipe_ctx[i].stream->link->connector_signal == SIGNAL_TYPE_EDP) {
|
||||
pipe_ctx = &res_ctx->pipe_ctx[i];
|
||||
break;
|
||||
}
|
||||
|
@@ -1048,7 +1048,7 @@ void dcn10_plane_atomic_disconnect(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
||||
if (opp != NULL)
|
||||
opp->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = true;
|
||||
|
||||
dc->clk_optimized_required = true;
|
||||
dc->optimized_required = true;
|
||||
|
||||
if (hubp->funcs->hubp_disconnect)
|
||||
hubp->funcs->hubp_disconnect(hubp);
|
||||
@@ -1099,7 +1099,7 @@ void dcn10_plane_atomic_disable(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
||||
false);
|
||||
|
||||
hubp->power_gated = true;
|
||||
dc->clk_optimized_required = false; /* We're powering off, no need to optimize */
|
||||
dc->optimized_required = false; /* We're powering off, no need to optimize */
|
||||
|
||||
hws->funcs.plane_atomic_power_down(dc,
|
||||
pipe_ctx->plane_res.dpp,
|
||||
@@ -1356,6 +1356,9 @@ void dcn10_init_hw(struct dc *dc)
|
||||
*/
|
||||
if (dcb->funcs->is_accelerated_mode(dcb) || dc->config.power_down_display_on_boot) {
|
||||
hws->funcs.init_pipes(dc, dc->current_state);
|
||||
if (dc->res_pool->hubbub->funcs->allow_self_refresh_control)
|
||||
dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
|
||||
!dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
|
||||
}
|
||||
|
||||
for (i = 0; i < res_pool->audio_count; i++) {
|
||||
|
@@ -62,11 +62,11 @@
|
||||
SRI(DP_DPHY_FAST_TRAINING, DP, id), \
|
||||
SRI(DP_SEC_CNTL1, DP, id), \
|
||||
SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
|
||||
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
|
||||
SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
|
||||
|
||||
|
||||
#define LE_DCN10_REG_LIST(id)\
|
||||
SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
|
||||
LE_DCN_COMMON_REG_LIST(id)
|
||||
|
||||
struct dcn10_link_enc_aux_registers {
|
||||
|
@@ -570,7 +570,7 @@ static const struct dc_plane_cap plane_cap = {
|
||||
|
||||
static const struct dc_debug_options debug_defaults_drv = {
|
||||
.sanity_checks = true,
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = false,
|
||||
.clock_trace = true,
|
||||
@@ -598,7 +598,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
};
|
||||
|
||||
static const struct dc_debug_options debug_defaults_diags = {
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = true,
|
||||
.clock_trace = true,
|
||||
|
@@ -70,6 +70,8 @@ void dccg2_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppclk)
|
||||
REG_UPDATE(DPPCLK_DTO_CTRL,
|
||||
DPPCLK_DTO_ENABLE[dpp_inst], 0);
|
||||
}
|
||||
|
||||
dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk;
|
||||
}
|
||||
|
||||
void dccg2_get_dccg_ref_freq(struct dccg *dccg,
|
||||
|
@@ -623,13 +623,6 @@ enum dc_status dcn20_enable_stream_timing(
|
||||
|
||||
/* TODO check if timing_changed, disable stream if timing changed */
|
||||
|
||||
/* Have to setup DSC here to make sure the bandwidth sent to DIG BE won't be bigger than
|
||||
* what the link and/or DIG BE can handle. VBID[6]/CompressedStream_flag will be automatically
|
||||
* set at a later time when the video is enabled (DP_VID_STREAM_EN = 1).
|
||||
*/
|
||||
if (pipe_ctx->stream->timing.flags.DSC)
|
||||
dp_set_dsc_on_stream(pipe_ctx, true);
|
||||
|
||||
for (odm_pipe = pipe_ctx->next_odm_pipe; odm_pipe; odm_pipe = odm_pipe->next_odm_pipe) {
|
||||
opp_inst[opp_cnt] = odm_pipe->stream_res.opp->inst;
|
||||
opp_cnt++;
|
||||
@@ -654,6 +647,9 @@ enum dc_status dcn20_enable_stream_timing(
|
||||
return DC_ERROR_UNEXPECTED;
|
||||
}
|
||||
|
||||
if (dc->hwseq->funcs.PLAT_58856_wa && (!dc_is_dp_signal(stream->signal)))
|
||||
dc->hwseq->funcs.PLAT_58856_wa(context, pipe_ctx);
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->program_timing(
|
||||
pipe_ctx->stream_res.tg,
|
||||
&stream->timing,
|
||||
|
@@ -111,7 +111,6 @@ static const struct hwseq_private_funcs dcn20_private_funcs = {
|
||||
.enable_power_gating_plane = dcn20_enable_power_gating_plane,
|
||||
.dpp_pg_control = dcn20_dpp_pg_control,
|
||||
.hubp_pg_control = dcn20_hubp_pg_control,
|
||||
.dsc_pg_control = NULL,
|
||||
.update_odm = dcn20_update_odm,
|
||||
.dsc_pg_control = dcn20_dsc_pg_control,
|
||||
.get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color,
|
||||
|
@@ -1041,7 +1041,7 @@ static const struct resource_caps res_cap_nv14 = {
|
||||
};
|
||||
|
||||
static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = false,
|
||||
.clock_trace = true,
|
||||
@@ -1060,7 +1060,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
};
|
||||
|
||||
static const struct dc_debug_options debug_defaults_diags = {
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = true,
|
||||
.clock_trace = true,
|
||||
@@ -1671,7 +1671,7 @@ static void acquire_dsc(struct resource_context *res_ctx,
|
||||
}
|
||||
}
|
||||
|
||||
static void release_dsc(struct resource_context *res_ctx,
|
||||
void dcn20_release_dsc(struct resource_context *res_ctx,
|
||||
const struct resource_pool *pool,
|
||||
struct display_stream_compressor **dsc)
|
||||
{
|
||||
@@ -1731,7 +1731,7 @@ static enum dc_status remove_dsc_from_stream_resource(struct dc *dc,
|
||||
pipe_ctx = &new_ctx->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (pipe_ctx->stream_res.dsc)
|
||||
release_dsc(&new_ctx->res_ctx, dc->res_pool, &pipe_ctx->stream_res.dsc);
|
||||
dcn20_release_dsc(&new_ctx->res_ctx, dc->res_pool, &pipe_ctx->stream_res.dsc);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2502,7 +2502,7 @@ struct pipe_ctx *dcn20_find_secondary_pipe(struct dc *dc,
|
||||
return secondary_pipe;
|
||||
}
|
||||
|
||||
void dcn20_merge_pipes_for_validate(
|
||||
static void dcn20_merge_pipes_for_validate(
|
||||
struct dc *dc,
|
||||
struct dc_state *context)
|
||||
{
|
||||
@@ -2527,7 +2527,7 @@ void dcn20_merge_pipes_for_validate(
|
||||
odm_pipe->prev_odm_pipe = NULL;
|
||||
odm_pipe->next_odm_pipe = NULL;
|
||||
if (odm_pipe->stream_res.dsc)
|
||||
release_dsc(&context->res_ctx, dc->res_pool, &odm_pipe->stream_res.dsc);
|
||||
dcn20_release_dsc(&context->res_ctx, dc->res_pool, &odm_pipe->stream_res.dsc);
|
||||
/* Clear plane_res and stream_res */
|
||||
memset(&odm_pipe->plane_res, 0, sizeof(odm_pipe->plane_res));
|
||||
memset(&odm_pipe->stream_res, 0, sizeof(odm_pipe->stream_res));
|
||||
@@ -2565,41 +2565,29 @@ int dcn20_validate_apply_pipe_split_flags(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
int vlevel,
|
||||
bool *split)
|
||||
bool *split,
|
||||
bool *merge)
|
||||
{
|
||||
int i, pipe_idx, vlevel_split;
|
||||
int plane_count = 0;
|
||||
bool force_split = false;
|
||||
bool avoid_split = dc->debug.pipe_split_policy != MPC_SPLIT_DYNAMIC;
|
||||
bool avoid_split = dc->debug.pipe_split_policy == MPC_SPLIT_AVOID;
|
||||
|
||||
/* Single display loop, exits if there is more than one display */
|
||||
if (context->stream_count > 1) {
|
||||
if (dc->debug.pipe_split_policy == MPC_SPLIT_AVOID_MULT_DISP)
|
||||
avoid_split = true;
|
||||
} else if (dc->debug.force_single_disp_pipe_split)
|
||||
force_split = true;
|
||||
|
||||
/* TODO: fix dc bugs and remove this split threshold thing */
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
bool exit_loop = false;
|
||||
|
||||
if (!pipe->stream || pipe->top_pipe)
|
||||
continue;
|
||||
|
||||
if (dc->debug.force_single_disp_pipe_split) {
|
||||
if (!force_split)
|
||||
force_split = true;
|
||||
else {
|
||||
force_split = false;
|
||||
exit_loop = true;
|
||||
}
|
||||
}
|
||||
if (dc->debug.pipe_split_policy == MPC_SPLIT_AVOID_MULT_DISP) {
|
||||
if (avoid_split)
|
||||
avoid_split = false;
|
||||
else {
|
||||
avoid_split = true;
|
||||
exit_loop = true;
|
||||
}
|
||||
}
|
||||
if (exit_loop)
|
||||
break;
|
||||
if (pipe->stream && !pipe->prev_odm_pipe &&
|
||||
(!pipe->top_pipe || pipe->top_pipe->plane_state != pipe->plane_state))
|
||||
++plane_count;
|
||||
}
|
||||
/* TODO: fix dc bugs and remove this split threshold thing */
|
||||
if (context->stream_count > dc->res_pool->pipe_count / 2)
|
||||
if (plane_count > dc->res_pool->pipe_count / 2)
|
||||
avoid_split = true;
|
||||
|
||||
/* Avoid split loop looks for lowest voltage level that allows most unsplit pipes possible */
|
||||
@@ -2622,11 +2610,12 @@ int dcn20_validate_apply_pipe_split_flags(
|
||||
/* Split loop sets which pipe should be split based on dml outputs and dc flags */
|
||||
for (i = 0, pipe_idx = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
|
||||
int pipe_plane = context->bw_ctx.dml.vba.pipe_plane[pipe_idx];
|
||||
|
||||
if (!context->res_ctx.pipe_ctx[i].stream)
|
||||
continue;
|
||||
|
||||
if (force_split || context->bw_ctx.dml.vba.NoOfDPP[vlevel][context->bw_ctx.dml.vba.maxMpcComb][pipe_idx] > 1)
|
||||
if (force_split || context->bw_ctx.dml.vba.NoOfDPP[vlevel][context->bw_ctx.dml.vba.maxMpcComb][pipe_plane] > 1)
|
||||
split[i] = true;
|
||||
if ((pipe->stream->view_format ==
|
||||
VIEW_3D_FORMAT_SIDE_BY_SIDE ||
|
||||
@@ -2639,10 +2628,44 @@ int dcn20_validate_apply_pipe_split_flags(
|
||||
split[i] = true;
|
||||
if (dc->debug.force_odm_combine & (1 << pipe->stream_res.tg->inst)) {
|
||||
split[i] = true;
|
||||
context->bw_ctx.dml.vba.ODMCombineEnablePerState[vlevel][pipe_idx] = dm_odm_combine_mode_2to1;
|
||||
context->bw_ctx.dml.vba.ODMCombineEnablePerState[vlevel][pipe_plane] = dm_odm_combine_mode_2to1;
|
||||
}
|
||||
context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_idx] =
|
||||
context->bw_ctx.dml.vba.ODMCombineEnablePerState[vlevel][pipe_idx];
|
||||
context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_plane] =
|
||||
context->bw_ctx.dml.vba.ODMCombineEnablePerState[vlevel][pipe_plane];
|
||||
|
||||
if (pipe->prev_odm_pipe && context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_plane] != dm_odm_combine_mode_disabled) {
|
||||
/*Already split odm pipe tree, don't try to split again*/
|
||||
split[i] = false;
|
||||
split[pipe->prev_odm_pipe->pipe_idx] = false;
|
||||
} else if (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state
|
||||
&& context->bw_ctx.dml.vba.ODMCombineEnabled[pipe_plane] == dm_odm_combine_mode_disabled) {
|
||||
/*Already split mpc tree, don't try to split again, assumes only 2x mpc combine*/
|
||||
split[i] = false;
|
||||
split[pipe->top_pipe->pipe_idx] = false;
|
||||
} else if (pipe->prev_odm_pipe || (pipe->top_pipe && pipe->plane_state == pipe->top_pipe->plane_state)) {
|
||||
if (split[i] == false) {
|
||||
/*Exiting mpc/odm combine*/
|
||||
merge[i] = true;
|
||||
if (pipe->prev_odm_pipe) {
|
||||
ASSERT(0); /*should not actually happen yet*/
|
||||
merge[pipe->prev_odm_pipe->pipe_idx] = true;
|
||||
} else
|
||||
merge[pipe->top_pipe->pipe_idx] = true;
|
||||
} else {
|
||||
/*Transition from mpc combine to odm combine or vice versa*/
|
||||
ASSERT(0); /*should not actually happen yet*/
|
||||
split[i] = true;
|
||||
merge[i] = true;
|
||||
if (pipe->prev_odm_pipe) {
|
||||
split[pipe->prev_odm_pipe->pipe_idx] = true;
|
||||
merge[pipe->prev_odm_pipe->pipe_idx] = true;
|
||||
} else {
|
||||
split[pipe->top_pipe->pipe_idx] = true;
|
||||
merge[pipe->top_pipe->pipe_idx] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Adjust dppclk when split is forced, do not bother with dispclk */
|
||||
if (split[i] && context->bw_ctx.dml.vba.NoOfDPP[vlevel][context->bw_ctx.dml.vba.maxMpcComb][pipe_idx] == 1)
|
||||
context->bw_ctx.dml.vba.RequiredDPPCLK[vlevel][context->bw_ctx.dml.vba.maxMpcComb][pipe_idx] /= 2;
|
||||
@@ -2684,7 +2707,7 @@ bool dcn20_fast_validate_bw(
|
||||
if (vlevel > context->bw_ctx.dml.soc.num_states)
|
||||
goto validate_fail;
|
||||
|
||||
vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split);
|
||||
vlevel = dcn20_validate_apply_pipe_split_flags(dc, context, vlevel, split, NULL);
|
||||
|
||||
/*initialize pipe_just_split_from to invalid idx*/
|
||||
for (i = 0; i < MAX_PIPES; i++)
|
||||
|
@@ -119,14 +119,15 @@ void dcn20_set_mcif_arb_params(
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int pipe_cnt);
|
||||
bool dcn20_validate_bandwidth(struct dc *dc, struct dc_state *context, bool fast_validate);
|
||||
void dcn20_merge_pipes_for_validate(
|
||||
struct dc *dc,
|
||||
struct dc_state *context);
|
||||
int dcn20_validate_apply_pipe_split_flags(
|
||||
struct dc *dc,
|
||||
struct dc_state *context,
|
||||
int vlevel,
|
||||
bool *split);
|
||||
bool *split,
|
||||
bool *merge);
|
||||
void dcn20_release_dsc(struct resource_context *res_ctx,
|
||||
const struct resource_pool *pool,
|
||||
struct display_stream_compressor **dsc);
|
||||
bool dcn20_validate_dsc(struct dc *dc, struct dc_state *new_ctx);
|
||||
void dcn20_split_stream_for_mpc(
|
||||
struct resource_context *res_ctx,
|
||||
|
@@ -112,3 +112,25 @@ void dcn21_optimize_pwr_state(
|
||||
true);
|
||||
}
|
||||
|
||||
/* If user hotplug a HDMI monitor while in monitor off,
|
||||
* OS will do a mode set (with output timing) but keep output off.
|
||||
* In this case DAL will ask vbios to power up the pll in the PHY.
|
||||
* If user unplug the monitor (while we are on monitor off) or
|
||||
* system attempt to enter modern standby (which we will disable PLL),
|
||||
* PHY will hang on the next mode set attempt.
|
||||
* if enable PLL follow by disable PLL (without executing lane enable/disable),
|
||||
* RDPCS_PHY_DP_MPLLB_STATE remains 1,
|
||||
* which indicate that PLL disable attempt actually didn<64>t go through.
|
||||
* As a workaround, insert PHY lane enable/disable before PLL disable.
|
||||
*/
|
||||
void dcn21_PLAT_58856_wa(struct dc_state *context, struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
if (!pipe_ctx->stream->dpms_off)
|
||||
return;
|
||||
|
||||
pipe_ctx->stream->dpms_off = false;
|
||||
core_link_enable_stream(context, pipe_ctx);
|
||||
core_link_disable_stream(pipe_ctx);
|
||||
pipe_ctx->stream->dpms_off = true;
|
||||
}
|
||||
|
||||
|
@@ -44,4 +44,7 @@ void dcn21_optimize_pwr_state(
|
||||
const struct dc *dc,
|
||||
struct dc_state *context);
|
||||
|
||||
void dcn21_PLAT_58856_wa(struct dc_state *context,
|
||||
struct pipe_ctx *pipe_ctx);
|
||||
|
||||
#endif /* __DC_HWSS_DCN21_H__ */
|
||||
|
@@ -119,7 +119,6 @@ static const struct hwseq_private_funcs dcn21_private_funcs = {
|
||||
.enable_power_gating_plane = dcn20_enable_power_gating_plane,
|
||||
.dpp_pg_control = dcn20_dpp_pg_control,
|
||||
.hubp_pg_control = dcn20_hubp_pg_control,
|
||||
.dsc_pg_control = NULL,
|
||||
.update_odm = dcn20_update_odm,
|
||||
.dsc_pg_control = dcn20_dsc_pg_control,
|
||||
.get_surface_visual_confirm_color = dcn10_get_surface_visual_confirm_color,
|
||||
@@ -131,6 +130,7 @@ static const struct hwseq_private_funcs dcn21_private_funcs = {
|
||||
.dccg_init = dcn20_dccg_init,
|
||||
.set_blend_lut = dcn20_set_blend_lut,
|
||||
.set_shaper_3dlut = dcn20_set_shaper_3dlut,
|
||||
.PLAT_58856_wa = dcn21_PLAT_58856_wa,
|
||||
};
|
||||
|
||||
void dcn21_hw_sequencer_construct(struct dc *dc)
|
||||
|
@@ -855,7 +855,7 @@ static const struct dc_plane_cap plane_cap = {
|
||||
};
|
||||
|
||||
static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = false,
|
||||
.clock_trace = true,
|
||||
@@ -876,7 +876,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
};
|
||||
|
||||
static const struct dc_debug_options debug_defaults_diags = {
|
||||
.disable_dmcu = true,
|
||||
.disable_dmcu = false,
|
||||
.force_abm_enable = false,
|
||||
.timing_trace = true,
|
||||
.clock_trace = true,
|
||||
@@ -1864,7 +1864,7 @@ static bool dcn21_resource_construct(
|
||||
goto create_fail;
|
||||
}
|
||||
|
||||
if (dc->config.psr_on_dmub) {
|
||||
if (dc->debug.disable_dmcu) {
|
||||
pool->base.psr = dmub_psr_create(ctx);
|
||||
|
||||
if (pool->base.psr == NULL) {
|
||||
|
@@ -85,7 +85,6 @@ void dp_set_fec_enable(struct dc_link *link, bool enable);
|
||||
bool dp_set_dsc_enable(struct pipe_ctx *pipe_ctx, bool enable);
|
||||
bool dp_set_dsc_pps_sdp(struct pipe_ctx *pipe_ctx, bool enable);
|
||||
void dp_set_dsc_on_stream(struct pipe_ctx *pipe_ctx, bool enable);
|
||||
bool dp_set_dsc_on_rx(struct pipe_ctx *pipe_ctx, bool enable);
|
||||
bool dp_update_dsc_config(struct pipe_ctx *pipe_ctx);
|
||||
|
||||
#endif /* __DC_LINK_DP_H__ */
|
||||
|
@@ -27,11 +27,12 @@
|
||||
#define __DAL_DCCG_H__
|
||||
|
||||
#include "dc_types.h"
|
||||
#include "hw_shared.h"
|
||||
|
||||
struct dccg {
|
||||
struct dc_context *ctx;
|
||||
const struct dccg_funcs *funcs;
|
||||
|
||||
int pipe_dppclk_khz[MAX_PIPES];
|
||||
int ref_dppclk;
|
||||
};
|
||||
|
||||
|
@@ -145,6 +145,8 @@ struct hwseq_private_funcs {
|
||||
const struct dc_plane_state *plane_state);
|
||||
bool (*set_shaper_3dlut)(struct pipe_ctx *pipe_ctx,
|
||||
const struct dc_plane_state *plane_state);
|
||||
void (*PLAT_58856_wa)(struct dc_state *context,
|
||||
struct pipe_ctx *pipe_ctx);
|
||||
};
|
||||
|
||||
struct dce_hwseq {
|
||||
|
@@ -104,7 +104,7 @@ enum dmub_window_id {
|
||||
DMUB_WINDOW_4_MAILBOX,
|
||||
DMUB_WINDOW_5_TRACEBUFF,
|
||||
DMUB_WINDOW_6_FW_STATE,
|
||||
DMUB_WINDOW_7_RESERVED,
|
||||
DMUB_WINDOW_7_SCRATCH_MEM,
|
||||
DMUB_WINDOW_TOTAL,
|
||||
};
|
||||
|
||||
@@ -316,6 +316,7 @@ struct dmub_srv {
|
||||
enum dmub_asic asic;
|
||||
void *user_ctx;
|
||||
bool is_virtual;
|
||||
struct dmub_fb scratch_mem_fb;
|
||||
volatile const struct dmub_fw_state *fw_state;
|
||||
|
||||
/* private: internal use only */
|
||||
|
@@ -52,8 +52,11 @@
|
||||
/* Default tracebuffer size if meta is absent. */
|
||||
#define DMUB_TRACE_BUFFER_SIZE (1024)
|
||||
|
||||
/* Default scratch mem size. */
|
||||
#define DMUB_SCRATCH_MEM_SIZE (256)
|
||||
|
||||
/* Number of windows in use. */
|
||||
#define DMUB_NUM_WINDOWS (DMUB_WINDOW_6_FW_STATE + 1)
|
||||
#define DMUB_NUM_WINDOWS (DMUB_WINDOW_TOTAL)
|
||||
/* Base addresses. */
|
||||
|
||||
#define DMUB_CW0_BASE (0x60000000)
|
||||
@@ -211,9 +214,11 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
|
||||
struct dmub_region *mail = &out->regions[DMUB_WINDOW_4_MAILBOX];
|
||||
struct dmub_region *trace_buff = &out->regions[DMUB_WINDOW_5_TRACEBUFF];
|
||||
struct dmub_region *fw_state = &out->regions[DMUB_WINDOW_6_FW_STATE];
|
||||
struct dmub_region *scratch_mem = &out->regions[DMUB_WINDOW_7_SCRATCH_MEM];
|
||||
const struct dmub_fw_meta_info *fw_info;
|
||||
uint32_t fw_state_size = DMUB_FW_STATE_SIZE;
|
||||
uint32_t trace_buffer_size = DMUB_TRACE_BUFFER_SIZE;
|
||||
uint32_t scratch_mem_size = DMUB_SCRATCH_MEM_SIZE;
|
||||
|
||||
if (!dmub->sw_init)
|
||||
return DMUB_STATUS_INVALID;
|
||||
@@ -256,7 +261,10 @@ dmub_srv_calc_region_info(struct dmub_srv *dmub,
|
||||
fw_state->base = dmub_align(trace_buff->top, 256);
|
||||
fw_state->top = fw_state->base + dmub_align(fw_state_size, 64);
|
||||
|
||||
out->fb_size = dmub_align(fw_state->top, 4096);
|
||||
scratch_mem->base = dmub_align(fw_state->top, 256);
|
||||
scratch_mem->top = scratch_mem->base + dmub_align(scratch_mem_size, 64);
|
||||
|
||||
out->fb_size = dmub_align(scratch_mem->top, 4096);
|
||||
|
||||
return DMUB_STATUS_OK;
|
||||
}
|
||||
@@ -334,6 +342,7 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
||||
struct dmub_fb *mail_fb = params->fb[DMUB_WINDOW_4_MAILBOX];
|
||||
struct dmub_fb *tracebuff_fb = params->fb[DMUB_WINDOW_5_TRACEBUFF];
|
||||
struct dmub_fb *fw_state_fb = params->fb[DMUB_WINDOW_6_FW_STATE];
|
||||
struct dmub_fb *scratch_mem_fb = params->fb[DMUB_WINDOW_7_SCRATCH_MEM];
|
||||
|
||||
struct dmub_rb_init_params rb_params;
|
||||
struct dmub_window cw0, cw1, cw2, cw3, cw4, cw5, cw6;
|
||||
@@ -370,7 +379,7 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
||||
dmub->hw_funcs.reset(dmub);
|
||||
|
||||
if (inst_fb && data_fb && bios_fb && mail_fb && tracebuff_fb &&
|
||||
fw_state_fb) {
|
||||
fw_state_fb && scratch_mem_fb) {
|
||||
cw2.offset.quad_part = data_fb->gpu_addr;
|
||||
cw2.region.base = DMUB_CW0_BASE + inst_fb->size;
|
||||
cw2.region.top = cw2.region.base + data_fb->size;
|
||||
@@ -396,6 +405,8 @@ enum dmub_status dmub_srv_hw_init(struct dmub_srv *dmub,
|
||||
|
||||
dmub->fw_state = fw_state_fb->cpu_addr;
|
||||
|
||||
dmub->scratch_mem_fb = *scratch_mem_fb;
|
||||
|
||||
if (dmub->hw_funcs.setup_windows)
|
||||
dmub->hw_funcs.setup_windows(dmub, &cw2, &cw3, &cw4,
|
||||
&cw5, &cw6);
|
||||
|
@@ -328,7 +328,8 @@ enum mod_hdcp_status mod_hdcp_add_display(struct mod_hdcp *hdcp,
|
||||
/* add display to connection */
|
||||
hdcp->connection.link = *link;
|
||||
*display_container = *display;
|
||||
status = mod_hdcp_add_display_to_topology(hdcp, display->index);
|
||||
status = mod_hdcp_add_display_to_topology(hdcp, display_container);
|
||||
|
||||
if (status != MOD_HDCP_STATUS_SUCCESS)
|
||||
goto out;
|
||||
|
||||
@@ -374,7 +375,7 @@ enum mod_hdcp_status mod_hdcp_remove_display(struct mod_hdcp *hdcp,
|
||||
status = mod_hdcp_remove_display_from_topology(hdcp, index);
|
||||
if (status != MOD_HDCP_STATUS_SUCCESS)
|
||||
goto out;
|
||||
display->state = MOD_HDCP_DISPLAY_INACTIVE;
|
||||
memset(display, 0, sizeof(struct mod_hdcp_display));
|
||||
|
||||
/* request authentication when connection is not reset */
|
||||
if (current_state(hdcp) != HDCP_UNINITIALIZED)
|
||||
|
@@ -328,7 +328,7 @@ void mod_hdcp_dump_binary_message(uint8_t *msg, uint32_t msg_size,
|
||||
|
||||
/* psp functions */
|
||||
enum mod_hdcp_status mod_hdcp_add_display_to_topology(
|
||||
struct mod_hdcp *hdcp, uint8_t index);
|
||||
struct mod_hdcp *hdcp, struct mod_hdcp_display *display);
|
||||
enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
|
||||
struct mod_hdcp *hdcp, uint8_t index);
|
||||
enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp);
|
||||
@@ -503,11 +503,6 @@ static inline uint8_t is_display_active(struct mod_hdcp_display *display)
|
||||
return display->state >= MOD_HDCP_DISPLAY_ACTIVE;
|
||||
}
|
||||
|
||||
static inline uint8_t is_display_added(struct mod_hdcp_display *display)
|
||||
{
|
||||
return display->state >= MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
|
||||
}
|
||||
|
||||
static inline uint8_t is_display_encryption_enabled(struct mod_hdcp_display *display)
|
||||
{
|
||||
return display->state >= MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED;
|
||||
@@ -515,34 +510,23 @@ static inline uint8_t is_display_encryption_enabled(struct mod_hdcp_display *dis
|
||||
|
||||
static inline uint8_t get_active_display_count(struct mod_hdcp *hdcp)
|
||||
{
|
||||
uint8_t added_count = 0;
|
||||
uint8_t active_count = 0;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
|
||||
if (is_display_active(&hdcp->displays[i]))
|
||||
added_count++;
|
||||
return added_count;
|
||||
active_count++;
|
||||
return active_count;
|
||||
}
|
||||
|
||||
static inline uint8_t get_added_display_count(struct mod_hdcp *hdcp)
|
||||
{
|
||||
uint8_t added_count = 0;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
|
||||
if (is_display_added(&hdcp->displays[i]))
|
||||
added_count++;
|
||||
return added_count;
|
||||
}
|
||||
|
||||
static inline struct mod_hdcp_display *get_first_added_display(
|
||||
static inline struct mod_hdcp_display *get_first_active_display(
|
||||
struct mod_hdcp *hdcp)
|
||||
{
|
||||
uint8_t i;
|
||||
struct mod_hdcp_display *display = NULL;
|
||||
|
||||
for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++)
|
||||
if (is_display_added(&hdcp->displays[i])) {
|
||||
if (is_display_active(&hdcp->displays[i])) {
|
||||
display = &hdcp->displays[i];
|
||||
break;
|
||||
}
|
||||
|
@@ -129,7 +129,7 @@ static inline uint8_t get_device_count(struct mod_hdcp *hdcp)
|
||||
static inline enum mod_hdcp_status check_device_count(struct mod_hdcp *hdcp)
|
||||
{
|
||||
/* device count must be greater than or equal to tracked hdcp displays */
|
||||
return (get_device_count(hdcp) < get_added_display_count(hdcp)) ?
|
||||
return (get_device_count(hdcp) < get_active_display_count(hdcp)) ?
|
||||
MOD_HDCP_STATUS_HDCP1_DEVICE_COUNT_MISMATCH_FAILURE :
|
||||
MOD_HDCP_STATUS_SUCCESS;
|
||||
}
|
||||
|
@@ -208,7 +208,7 @@ static inline uint8_t get_device_count(struct mod_hdcp *hdcp)
|
||||
static enum mod_hdcp_status check_device_count(struct mod_hdcp *hdcp)
|
||||
{
|
||||
/* device count must be greater than or equal to tracked hdcp displays */
|
||||
return (get_device_count(hdcp) < get_added_display_count(hdcp)) ?
|
||||
return (get_device_count(hdcp) < get_active_display_count(hdcp)) ?
|
||||
MOD_HDCP_STATUS_HDCP2_DEVICE_COUNT_MISMATCH_FAILURE :
|
||||
MOD_HDCP_STATUS_SUCCESS;
|
||||
}
|
||||
|
@@ -408,7 +408,7 @@ enum mod_hdcp_status mod_hdcp_read_ake_cert(struct mod_hdcp *hdcp)
|
||||
enum mod_hdcp_status status;
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
hdcp->auth.msg.hdcp2.ake_cert[0] = 3;
|
||||
hdcp->auth.msg.hdcp2.ake_cert[0] = HDCP_2_2_AKE_SEND_CERT;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_AKE_SEND_CERT,
|
||||
hdcp->auth.msg.hdcp2.ake_cert+1,
|
||||
sizeof(hdcp->auth.msg.hdcp2.ake_cert)-1);
|
||||
@@ -426,7 +426,7 @@ enum mod_hdcp_status mod_hdcp_read_h_prime(struct mod_hdcp *hdcp)
|
||||
enum mod_hdcp_status status;
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
hdcp->auth.msg.hdcp2.ake_h_prime[0] = 7;
|
||||
hdcp->auth.msg.hdcp2.ake_h_prime[0] = HDCP_2_2_AKE_SEND_HPRIME;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_AKE_SEND_H_PRIME,
|
||||
hdcp->auth.msg.hdcp2.ake_h_prime+1,
|
||||
sizeof(hdcp->auth.msg.hdcp2.ake_h_prime)-1);
|
||||
@@ -444,7 +444,7 @@ enum mod_hdcp_status mod_hdcp_read_pairing_info(struct mod_hdcp *hdcp)
|
||||
enum mod_hdcp_status status;
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
hdcp->auth.msg.hdcp2.ake_pairing_info[0] = 8;
|
||||
hdcp->auth.msg.hdcp2.ake_pairing_info[0] = HDCP_2_2_AKE_SEND_PAIRING_INFO;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_AKE_SEND_PAIRING_INFO,
|
||||
hdcp->auth.msg.hdcp2.ake_pairing_info+1,
|
||||
sizeof(hdcp->auth.msg.hdcp2.ake_pairing_info)-1);
|
||||
@@ -462,7 +462,7 @@ enum mod_hdcp_status mod_hdcp_read_l_prime(struct mod_hdcp *hdcp)
|
||||
enum mod_hdcp_status status;
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
hdcp->auth.msg.hdcp2.lc_l_prime[0] = 10;
|
||||
hdcp->auth.msg.hdcp2.lc_l_prime[0] = HDCP_2_2_LC_SEND_LPRIME;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_LC_SEND_L_PRIME,
|
||||
hdcp->auth.msg.hdcp2.lc_l_prime+1,
|
||||
sizeof(hdcp->auth.msg.hdcp2.lc_l_prime)-1);
|
||||
@@ -484,7 +484,7 @@ enum mod_hdcp_status mod_hdcp_read_rx_id_list(struct mod_hdcp *hdcp)
|
||||
uint32_t rx_id_list_size = 0;
|
||||
uint32_t bytes_read = 0;
|
||||
|
||||
hdcp->auth.msg.hdcp2.rx_id_list[0] = 12;
|
||||
hdcp->auth.msg.hdcp2.rx_id_list[0] = HDCP_2_2_REP_SEND_RECVID_LIST;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_REPEATER_AUTH_SEND_RECEIVERID_LIST,
|
||||
hdcp->auth.msg.hdcp2.rx_id_list+1,
|
||||
HDCP_MAX_AUX_TRANSACTION_SIZE);
|
||||
@@ -511,7 +511,7 @@ enum mod_hdcp_status mod_hdcp_read_stream_ready(struct mod_hdcp *hdcp)
|
||||
enum mod_hdcp_status status;
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
hdcp->auth.msg.hdcp2.repeater_auth_stream_ready[0] = 17;
|
||||
hdcp->auth.msg.hdcp2.repeater_auth_stream_ready[0] = HDCP_2_2_REP_STREAM_READY;
|
||||
status = read(hdcp, MOD_HDCP_MESSAGE_ID_READ_REPEATER_AUTH_STREAM_READY,
|
||||
hdcp->auth.msg.hdcp2.repeater_auth_stream_ready+1,
|
||||
sizeof(hdcp->auth.msg.hdcp2.repeater_auth_stream_ready)-1);
|
||||
|
@@ -54,7 +54,7 @@ enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
|
||||
|
||||
dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
|
||||
|
||||
if (!display || !is_display_added(display))
|
||||
if (!display || !is_display_active(display))
|
||||
return MOD_HDCP_STATUS_DISPLAY_NOT_FOUND;
|
||||
|
||||
memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
|
||||
@@ -76,22 +76,18 @@ enum mod_hdcp_status mod_hdcp_remove_display_from_topology(
|
||||
}
|
||||
|
||||
enum mod_hdcp_status mod_hdcp_add_display_to_topology(
|
||||
struct mod_hdcp *hdcp, uint8_t index)
|
||||
struct mod_hdcp *hdcp, struct mod_hdcp_display *display)
|
||||
{
|
||||
struct psp_context *psp = hdcp->config.psp.handle;
|
||||
struct ta_dtm_shared_memory *dtm_cmd;
|
||||
struct mod_hdcp_display *display =
|
||||
get_active_display_at_index(hdcp, index);
|
||||
struct mod_hdcp_link *link = &hdcp->connection.link;
|
||||
|
||||
if (!psp->dtm_context.dtm_initialized) {
|
||||
DRM_ERROR("Failed to add display topology, DTM TA is not initialized.");
|
||||
display->state = MOD_HDCP_DISPLAY_INACTIVE;
|
||||
return MOD_HDCP_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if (!display || is_display_added(display))
|
||||
return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
|
||||
|
||||
dtm_cmd = (struct ta_dtm_shared_memory *)psp->dtm_context.dtm_shared_buf;
|
||||
|
||||
memset(dtm_cmd, 0, sizeof(struct ta_dtm_shared_memory));
|
||||
@@ -113,20 +109,21 @@ enum mod_hdcp_status mod_hdcp_add_display_to_topology(
|
||||
|
||||
psp_dtm_invoke(psp, dtm_cmd->cmd_id);
|
||||
|
||||
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS)
|
||||
if (dtm_cmd->dtm_status != TA_DTM_STATUS__SUCCESS) {
|
||||
display->state = MOD_HDCP_DISPLAY_INACTIVE;
|
||||
return MOD_HDCP_STATUS_UPDATE_TOPOLOGY_FAILURE;
|
||||
}
|
||||
|
||||
display->state = MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
|
||||
HDCP_TOP_ADD_DISPLAY_TRACE(hdcp, display->index);
|
||||
|
||||
return MOD_HDCP_STATUS_SUCCESS;
|
||||
|
||||
return MOD_HDCP_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
enum mod_hdcp_status mod_hdcp_hdcp1_create_session(struct mod_hdcp *hdcp)
|
||||
{
|
||||
|
||||
struct psp_context *psp = hdcp->config.psp.handle;
|
||||
struct mod_hdcp_display *display = get_first_added_display(hdcp);
|
||||
struct mod_hdcp_display *display = get_first_active_display(hdcp);
|
||||
struct ta_hdcp_shared_memory *hdcp_cmd;
|
||||
|
||||
if (!psp->hdcp_context.hdcp_initialized) {
|
||||
@@ -179,7 +176,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_destroy_session(struct mod_hdcp *hdcp)
|
||||
if (is_display_encryption_enabled(
|
||||
&hdcp->displays[i])) {
|
||||
hdcp->displays[i].state =
|
||||
MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
|
||||
MOD_HDCP_DISPLAY_ACTIVE;
|
||||
HDCP_HDCP1_DISABLED_TRACE(hdcp,
|
||||
hdcp->displays[i].index);
|
||||
}
|
||||
@@ -231,7 +228,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_encryption(struct mod_hdcp *hdcp)
|
||||
{
|
||||
struct psp_context *psp = hdcp->config.psp.handle;
|
||||
struct ta_hdcp_shared_memory *hdcp_cmd;
|
||||
struct mod_hdcp_display *display = get_first_added_display(hdcp);
|
||||
struct mod_hdcp_display *display = get_first_active_display(hdcp);
|
||||
|
||||
hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
|
||||
memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
|
||||
@@ -301,8 +298,7 @@ enum mod_hdcp_status mod_hdcp_hdcp1_enable_dp_stream_encryption(struct mod_hdcp
|
||||
|
||||
for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
|
||||
|
||||
if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
|
||||
hdcp->displays[i].adjust.disable)
|
||||
if (hdcp->displays[i].adjust.disable)
|
||||
continue;
|
||||
|
||||
memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
|
||||
@@ -364,7 +360,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp)
|
||||
{
|
||||
struct psp_context *psp = hdcp->config.psp.handle;
|
||||
struct ta_hdcp_shared_memory *hdcp_cmd;
|
||||
struct mod_hdcp_display *display = get_first_added_display(hdcp);
|
||||
struct mod_hdcp_display *display = get_first_active_display(hdcp);
|
||||
|
||||
if (!psp->hdcp_context.hdcp_initialized) {
|
||||
DRM_ERROR("Failed to create hdcp session, HDCP TA is not initialized");
|
||||
@@ -423,7 +419,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_destroy_session(struct mod_hdcp *hdcp)
|
||||
if (is_display_encryption_enabled(
|
||||
&hdcp->displays[i])) {
|
||||
hdcp->displays[i].state =
|
||||
MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED;
|
||||
MOD_HDCP_DISPLAY_ACTIVE;
|
||||
HDCP_HDCP2_DISABLED_TRACE(hdcp,
|
||||
hdcp->displays[i].index);
|
||||
}
|
||||
@@ -662,7 +658,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_enable_encryption(struct mod_hdcp *hdcp)
|
||||
{
|
||||
struct psp_context *psp = hdcp->config.psp.handle;
|
||||
struct ta_hdcp_shared_memory *hdcp_cmd;
|
||||
struct mod_hdcp_display *display = get_first_added_display(hdcp);
|
||||
struct mod_hdcp_display *display = get_first_active_display(hdcp);
|
||||
|
||||
hdcp_cmd = (struct ta_hdcp_shared_memory *)psp->hdcp_context.hdcp_shared_buf;
|
||||
memset(hdcp_cmd, 0, sizeof(struct ta_hdcp_shared_memory));
|
||||
@@ -747,8 +743,7 @@ enum mod_hdcp_status mod_hdcp_hdcp2_enable_dp_stream_encryption(struct mod_hdcp
|
||||
|
||||
|
||||
for (i = 0; i < MAX_NUM_OF_DISPLAYS; i++) {
|
||||
if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED ||
|
||||
hdcp->displays[i].adjust.disable)
|
||||
if (hdcp->displays[i].adjust.disable)
|
||||
continue;
|
||||
hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.display_handle = hdcp->displays[i].index;
|
||||
hdcp_cmd->in_msg.hdcp2_enable_dp_stream_encryption.session_handle = hdcp->auth.id;
|
||||
|
@@ -117,7 +117,6 @@ enum mod_hdcp_operation_mode {
|
||||
enum mod_hdcp_display_state {
|
||||
MOD_HDCP_DISPLAY_INACTIVE = 0,
|
||||
MOD_HDCP_DISPLAY_ACTIVE,
|
||||
MOD_HDCP_DISPLAY_ACTIVE_AND_ADDED,
|
||||
MOD_HDCP_DISPLAY_ENCRYPTION_ENABLED
|
||||
};
|
||||
|
||||
|
@@ -34,8 +34,7 @@ struct dc_info_packet;
|
||||
struct mod_vrr_params;
|
||||
|
||||
void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
struct dc_info_packet *info_packet,
|
||||
bool *use_vsc_sdp_for_colorimetry);
|
||||
struct dc_info_packet *info_packet);
|
||||
|
||||
void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream,
|
||||
struct dc_info_packet *info_packet, int ALLMEnabled, int ALLMValue);
|
||||
|
@@ -130,8 +130,7 @@ enum ColorimetryYCCDP {
|
||||
};
|
||||
|
||||
void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
struct dc_info_packet *info_packet,
|
||||
bool *use_vsc_sdp_for_colorimetry)
|
||||
struct dc_info_packet *info_packet)
|
||||
{
|
||||
unsigned int vsc_packet_revision = vsc_packet_undefined;
|
||||
unsigned int i;
|
||||
@@ -139,11 +138,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
unsigned int colorimetryFormat = 0;
|
||||
bool stereo3dSupport = false;
|
||||
|
||||
/* Initialize first, later if infopacket is valid determine if VSC SDP
|
||||
* should be used to signal colorimetry format and pixel encoding.
|
||||
*/
|
||||
*use_vsc_sdp_for_colorimetry = false;
|
||||
|
||||
if (stream->timing.timing_3d_format != TIMING_3D_FORMAT_NONE && stream->view_format != VIEW_3D_FORMAT_NONE) {
|
||||
vsc_packet_revision = vsc_packet_rev1;
|
||||
stereo3dSupport = true;
|
||||
@@ -153,9 +147,8 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
if (stream->psr_version != 0)
|
||||
vsc_packet_revision = vsc_packet_rev2;
|
||||
|
||||
/* Update to revision 5 for extended colorimetry support for DPCD 1.4+ */
|
||||
if (stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
|
||||
stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED)
|
||||
/* Update to revision 5 for extended colorimetry support */
|
||||
if (stream->use_vsc_sdp_for_colorimetry)
|
||||
vsc_packet_revision = vsc_packet_rev5;
|
||||
|
||||
/* VSC packet not needed based on the features
|
||||
@@ -269,13 +262,6 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
|
||||
info_packet->valid = true;
|
||||
|
||||
/* If we are using VSC SDP revision 05h, use this to signal for
|
||||
* colorimetry format and pixel encoding. HW should later be
|
||||
* programmed to set MSA MISC1 bit 6 to indicate ignore
|
||||
* colorimetry format and pixel encoding in the MSA.
|
||||
*/
|
||||
*use_vsc_sdp_for_colorimetry = true;
|
||||
|
||||
/* Set VSC SDP fields for pixel encoding and colorimetry format from DP 1.3 specs
|
||||
* Data Bytes DB 18~16
|
||||
* Bits 3:0 (Colorimetry Format) | Bits 7:4 (Pixel Encoding)
|
||||
|
在新工单中引用
屏蔽一个用户