drm fixes for 5.17-rc2
atomic: - fix CRTC handling during modeset privcy-screen: - honor acpi=off ttm: - build fix for um panel: - add oreientation quirk for 1NetBook OneXPlayer amdgpu: - Proper fix for otg synchronization logic regression - DCN3.01 fixes - Filter out secondary radeon PCI IDs - udelay fixes - Fix a memory leak in an error path msm: - parameter check fixes - put_device balancing - idle/suspend fixes etnaviv: - relax submit size checks vc4: - fix potential deadlock in DSI code ast: - revert 1600x900 mode change -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEEKbZHaGwW9KfbeusDHTzWXnEhr4FAmHzf38ACgkQDHTzWXnE hr4hYQ//VDkavqpF1mATcC1AjuDN8cT1JJaXqS4hkx3MUxqXKsNLBX6pBrYT+WFn nGFyxEiCwqQWuy+QlA7H/U6vZ6Zr9mpWbCV+kA7UdUa8BYrQMOy0A5KYmznA9VOL BmITgga6ubX7ZKgSDop0FVrr3fK2lMbFXckPK9IHZpAJeynSmObZ29mNFMc5w6Vr dVBCcYvJob+OvkJMcfya8znOlHAfRN4y9DuNTv1LY4ZvQzFc36MD9gc5eOhtuEMb Pay+kEeUATgCcR/4rZLItAWVW19KY7aVOvcHyog2h2z2vZKcPyGuB2W1mv4VQxtl HWpbmFP1STkDPvWPkhpfyX1MDYBiIBXVqvTpnAUb3NtSZNC4qWMVkM1ILjnjXkKo EGBYSvxLvMxO13y64nkaTnORUts6BnsNi0+o7sh0AfrNbjJP4pomv659+HSO3vM6 4ANG5z6R0tBBTKmAE7WTVZJM8jp4zq5xOveJ7QvP++iIsHDpBqtLrbfeBCqSZ9Mo XjN9migkJHGg1xsg4YVm7Cr13wB7ltSWxgIb3GjfBd5TsHFBs787s4+S27Zy0ae2 89YOJCOYlRNC38G8yNdPhX/j88kef/9npGblBulIIiauRjd1KQWqeFXra1jKGogI cNevwrxmWwsoMUXsgbqgCR846uqOaUc/4bmKqgerb4PYCZ62DYE= =mom4 -----END PGP SIGNATURE----- Merge tag 'drm-fixes-2022-01-28' of git://anongit.freedesktop.org/drm/drm Pull drm fixes from Dave Airlie: "This week's regular normal fixes. amdgpu and msm make up the bulk of it, with a scattering of fixes elsewhere. atomic: - fix CRTC handling during modeset privcy-screen: - honor acpi=off ttm: - build fix for um panel: - add orientation quirk for 1NetBook OneXPlayer amdgpu: - Proper fix for otg synchronization logic regression - DCN3.01 fixes - Filter out secondary radeon PCI IDs - udelay fixes - Fix a memory leak in an error path msm: - parameter check fixes - put_device balancing - idle/suspend fixes etnaviv: - relax submit size checks vc4: - fix potential deadlock in DSI code ast: - revert 1600x900 mode change" * tag 'drm-fixes-2022-01-28' of git://anongit.freedesktop.org/drm/drm: (25 commits) drm/privacy-screen: honor acpi=off in detect_thinkpad_privacy_screen Revert "drm/ast: Support 1600x900 with 108MHz PCLK" drm/amdgpu/display: Remove t_srx_delay_us. drm/amd/display: Wrap dcn301_calculate_wm_and_dlg for FPU. drm/amd/display: Fix FP start/end for dcn30_internal_validate_bw. drm/amd/display/dc/calcs/dce_calcs: Fix a memleak in calculate_bandwidth() drm/amdgpu/display: use msleep rather than udelay for long delays drm/amdgpu/display: adjust msleep limit in dp_wait_for_training_aux_rd_interval drm/amdgpu: filter out radeon secondary ids as well drm/amd/display: change FIFO reset condition to embedded display only drm/amd/display: Correct MPC split policy for DCN301 drm/amd/display: Fix for otg synchronization logic drm/etnaviv: relax submit size limits drm/msm/gpu: Cancel idle/boost work on suspend drm/msm/gpu: Wait for idle before suspending drm/atomic: Add the crtc to affected crtc only if uapi.enable = true drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable drm/msm/a6xx: Add missing suspend_count increment drm/msm: Fix wrong size calculation drm/msm/dpu: invalid parameter check in dpu_setup_dspp_pcc ...
This commit is contained in:
Коммит
82b550fa99
|
@ -1525,6 +1525,87 @@ static const u16 amdgpu_unsupported_pciidlist[] = {
|
|||
0x99A0,
|
||||
0x99A2,
|
||||
0x99A4,
|
||||
/* radeon secondary ids */
|
||||
0x3171,
|
||||
0x3e70,
|
||||
0x4164,
|
||||
0x4165,
|
||||
0x4166,
|
||||
0x4168,
|
||||
0x4170,
|
||||
0x4171,
|
||||
0x4172,
|
||||
0x4173,
|
||||
0x496e,
|
||||
0x4a69,
|
||||
0x4a6a,
|
||||
0x4a6b,
|
||||
0x4a70,
|
||||
0x4a74,
|
||||
0x4b69,
|
||||
0x4b6b,
|
||||
0x4b6c,
|
||||
0x4c6e,
|
||||
0x4e64,
|
||||
0x4e65,
|
||||
0x4e66,
|
||||
0x4e67,
|
||||
0x4e68,
|
||||
0x4e69,
|
||||
0x4e6a,
|
||||
0x4e71,
|
||||
0x4f73,
|
||||
0x5569,
|
||||
0x556b,
|
||||
0x556d,
|
||||
0x556f,
|
||||
0x5571,
|
||||
0x5854,
|
||||
0x5874,
|
||||
0x5940,
|
||||
0x5941,
|
||||
0x5b72,
|
||||
0x5b73,
|
||||
0x5b74,
|
||||
0x5b75,
|
||||
0x5d44,
|
||||
0x5d45,
|
||||
0x5d6d,
|
||||
0x5d6f,
|
||||
0x5d72,
|
||||
0x5d77,
|
||||
0x5e6b,
|
||||
0x5e6d,
|
||||
0x7120,
|
||||
0x7124,
|
||||
0x7129,
|
||||
0x712e,
|
||||
0x712f,
|
||||
0x7162,
|
||||
0x7163,
|
||||
0x7166,
|
||||
0x7167,
|
||||
0x7172,
|
||||
0x7173,
|
||||
0x71a0,
|
||||
0x71a1,
|
||||
0x71a3,
|
||||
0x71a7,
|
||||
0x71bb,
|
||||
0x71e0,
|
||||
0x71e1,
|
||||
0x71e2,
|
||||
0x71e6,
|
||||
0x71e7,
|
||||
0x71f2,
|
||||
0x7269,
|
||||
0x726b,
|
||||
0x726e,
|
||||
0x72a0,
|
||||
0x72a8,
|
||||
0x72b1,
|
||||
0x72b3,
|
||||
0x793f,
|
||||
};
|
||||
|
||||
static const struct pci_device_id pciidlist[] = {
|
||||
|
|
|
@ -2033,10 +2033,10 @@ static void calculate_bandwidth(
|
|||
kfree(surface_type);
|
||||
free_tiling_mode:
|
||||
kfree(tiling_mode);
|
||||
free_yclk:
|
||||
kfree(yclk);
|
||||
free_sclk:
|
||||
kfree(sclk);
|
||||
free_yclk:
|
||||
kfree(yclk);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
@ -503,7 +503,6 @@ static void dcn_bw_calc_rq_dlg_ttu(
|
|||
//input[in_idx].dout.output_standard;
|
||||
|
||||
/*todo: soc->sr_enter_plus_exit_time??*/
|
||||
dlg_sys_param->t_srx_delay_us = dc->dcn_ip->dcfclk_cstate_latency / v->dcf_clk_deep_sleep;
|
||||
|
||||
dml1_rq_dlg_get_rq_params(dml, rq_param, &input->pipe.src);
|
||||
dml1_extract_rq_regs(dml, rq_regs, rq_param);
|
||||
|
|
|
@ -1404,20 +1404,34 @@ static void program_timing_sync(
|
|||
status->timing_sync_info.master = false;
|
||||
|
||||
}
|
||||
/* remove any other unblanked pipes as they have already been synced */
|
||||
for (j = j + 1; j < group_size; j++) {
|
||||
bool is_blanked;
|
||||
|
||||
if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked)
|
||||
is_blanked =
|
||||
pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp);
|
||||
else
|
||||
is_blanked =
|
||||
pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg);
|
||||
if (!is_blanked) {
|
||||
group_size--;
|
||||
pipe_set[j] = pipe_set[group_size];
|
||||
j--;
|
||||
/* remove any other pipes that are already been synced */
|
||||
if (dc->config.use_pipe_ctx_sync_logic) {
|
||||
/* check pipe's syncd to decide which pipe to be removed */
|
||||
for (j = 1; j < group_size; j++) {
|
||||
if (pipe_set[j]->pipe_idx_syncd == pipe_set[0]->pipe_idx_syncd) {
|
||||
group_size--;
|
||||
pipe_set[j] = pipe_set[group_size];
|
||||
j--;
|
||||
} else
|
||||
/* link slave pipe's syncd with master pipe */
|
||||
pipe_set[j]->pipe_idx_syncd = pipe_set[0]->pipe_idx_syncd;
|
||||
}
|
||||
} else {
|
||||
for (j = j + 1; j < group_size; j++) {
|
||||
bool is_blanked;
|
||||
|
||||
if (pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked)
|
||||
is_blanked =
|
||||
pipe_set[j]->stream_res.opp->funcs->dpg_is_blanked(pipe_set[j]->stream_res.opp);
|
||||
else
|
||||
is_blanked =
|
||||
pipe_set[j]->stream_res.tg->funcs->is_blanked(pipe_set[j]->stream_res.tg);
|
||||
if (!is_blanked) {
|
||||
group_size--;
|
||||
pipe_set[j] = pipe_set[group_size];
|
||||
j--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -202,7 +202,7 @@ void dp_wait_for_training_aux_rd_interval(
|
|||
uint32_t wait_in_micro_secs)
|
||||
{
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
if (wait_in_micro_secs > 16000)
|
||||
if (wait_in_micro_secs > 1000)
|
||||
msleep(wait_in_micro_secs/1000);
|
||||
else
|
||||
udelay(wait_in_micro_secs);
|
||||
|
@ -6935,7 +6935,7 @@ bool dpcd_write_128b_132b_sst_payload_allocation_table(
|
|||
}
|
||||
}
|
||||
retries++;
|
||||
udelay(5000);
|
||||
msleep(5);
|
||||
}
|
||||
|
||||
if (!result && retries == max_retries) {
|
||||
|
@ -6987,7 +6987,7 @@ bool dpcd_poll_for_allocation_change_trigger(struct dc_link *link)
|
|||
break;
|
||||
}
|
||||
|
||||
udelay(5000);
|
||||
msleep(5);
|
||||
}
|
||||
|
||||
if (result == ACT_FAILED) {
|
||||
|
|
|
@ -3217,6 +3217,60 @@ struct hpo_dp_link_encoder *resource_get_hpo_dp_link_enc_for_det_lt(
|
|||
}
|
||||
#endif
|
||||
|
||||
void reset_syncd_pipes_from_disabled_pipes(struct dc *dc,
|
||||
struct dc_state *context)
|
||||
{
|
||||
int i, j;
|
||||
struct pipe_ctx *pipe_ctx_old, *pipe_ctx, *pipe_ctx_syncd;
|
||||
|
||||
/* If pipe backend is reset, need to reset pipe syncd status */
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
pipe_ctx_old = &dc->current_state->res_ctx.pipe_ctx[i];
|
||||
pipe_ctx = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (!pipe_ctx_old->stream)
|
||||
continue;
|
||||
|
||||
if (pipe_ctx_old->top_pipe || pipe_ctx_old->prev_odm_pipe)
|
||||
continue;
|
||||
|
||||
if (!pipe_ctx->stream ||
|
||||
pipe_need_reprogram(pipe_ctx_old, pipe_ctx)) {
|
||||
|
||||
/* Reset all the syncd pipes from the disabled pipe */
|
||||
for (j = 0; j < dc->res_pool->pipe_count; j++) {
|
||||
pipe_ctx_syncd = &context->res_ctx.pipe_ctx[j];
|
||||
if ((GET_PIPE_SYNCD_FROM_PIPE(pipe_ctx_syncd) == pipe_ctx_old->pipe_idx) ||
|
||||
!IS_PIPE_SYNCD_VALID(pipe_ctx_syncd))
|
||||
SET_PIPE_SYNCD_TO_PIPE(pipe_ctx_syncd, j);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void check_syncd_pipes_for_disabled_master_pipe(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
uint8_t disabled_master_pipe_idx)
|
||||
{
|
||||
int i;
|
||||
struct pipe_ctx *pipe_ctx, *pipe_ctx_check;
|
||||
|
||||
pipe_ctx = &context->res_ctx.pipe_ctx[disabled_master_pipe_idx];
|
||||
if ((GET_PIPE_SYNCD_FROM_PIPE(pipe_ctx) != disabled_master_pipe_idx) ||
|
||||
!IS_PIPE_SYNCD_VALID(pipe_ctx))
|
||||
SET_PIPE_SYNCD_TO_PIPE(pipe_ctx, disabled_master_pipe_idx);
|
||||
|
||||
/* for the pipe disabled, check if any slave pipe exists and assert */
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
pipe_ctx_check = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if ((GET_PIPE_SYNCD_FROM_PIPE(pipe_ctx_check) == disabled_master_pipe_idx) &&
|
||||
IS_PIPE_SYNCD_VALID(pipe_ctx_check) && (i != disabled_master_pipe_idx))
|
||||
DC_ERR("DC: Failure: pipe_idx[%d] syncd with disabled master pipe_idx[%d]\n",
|
||||
i, disabled_master_pipe_idx);
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t resource_transmitter_to_phy_idx(const struct dc *dc, enum transmitter transmitter)
|
||||
{
|
||||
/* TODO - get transmitter to phy idx mapping from DMUB */
|
||||
|
|
|
@ -344,6 +344,7 @@ struct dc_config {
|
|||
uint8_t vblank_alignment_max_frame_time_diff;
|
||||
bool is_asymmetric_memory;
|
||||
bool is_single_rank_dimm;
|
||||
bool use_pipe_ctx_sync_logic;
|
||||
};
|
||||
|
||||
enum visual_confirm {
|
||||
|
|
|
@ -1566,6 +1566,10 @@ static enum dc_status apply_single_controller_ctx_to_hw(
|
|||
&pipe_ctx->stream->audio_info);
|
||||
}
|
||||
|
||||
/* make sure no pipes syncd to the pipe being enabled */
|
||||
if (!pipe_ctx->stream->apply_seamless_boot_optimization && dc->config.use_pipe_ctx_sync_logic)
|
||||
check_syncd_pipes_for_disabled_master_pipe(dc, context, pipe_ctx->pipe_idx);
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
/* DCN3.1 FPGA Workaround
|
||||
* Need to enable HPO DP Stream Encoder before setting OTG master enable.
|
||||
|
@ -1604,7 +1608,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(
|
|||
pipe_ctx->stream_res.stream_enc,
|
||||
pipe_ctx->stream_res.tg->inst);
|
||||
|
||||
if (dc_is_dp_signal(pipe_ctx->stream->signal) &&
|
||||
if (dc_is_embedded_signal(pipe_ctx->stream->signal) &&
|
||||
pipe_ctx->stream_res.stream_enc->funcs->reset_fifo)
|
||||
pipe_ctx->stream_res.stream_enc->funcs->reset_fifo(
|
||||
pipe_ctx->stream_res.stream_enc);
|
||||
|
@ -2297,6 +2301,10 @@ enum dc_status dce110_apply_ctx_to_hw(
|
|||
enum dc_status status;
|
||||
int i;
|
||||
|
||||
/* reset syncd pipes from disabled pipes */
|
||||
if (dc->config.use_pipe_ctx_sync_logic)
|
||||
reset_syncd_pipes_from_disabled_pipes(dc, context);
|
||||
|
||||
/* Reset old context */
|
||||
/* look up the targets that have been removed since last commit */
|
||||
hws->funcs.reset_hw_ctx_wrap(dc, context);
|
||||
|
|
|
@ -1878,7 +1878,6 @@ noinline bool dcn30_internal_validate_bw(
|
|||
dc->res_pool->funcs->update_soc_for_wm_a(dc, context);
|
||||
pipe_cnt = dc->res_pool->funcs->populate_dml_pipes(dc, context, pipes, fast_validate);
|
||||
|
||||
DC_FP_START();
|
||||
if (!pipe_cnt) {
|
||||
out = true;
|
||||
goto validate_out;
|
||||
|
@ -2104,7 +2103,6 @@ validate_fail:
|
|||
out = false;
|
||||
|
||||
validate_out:
|
||||
DC_FP_END();
|
||||
return out;
|
||||
}
|
||||
|
||||
|
@ -2306,7 +2304,9 @@ bool dcn30_validate_bandwidth(struct dc *dc,
|
|||
|
||||
BW_VAL_TRACE_COUNT();
|
||||
|
||||
DC_FP_START();
|
||||
out = dcn30_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, fast_validate);
|
||||
DC_FP_END();
|
||||
|
||||
if (pipe_cnt == 0)
|
||||
goto validate_out;
|
||||
|
|
|
@ -686,7 +686,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
|||
.disable_clock_gate = true,
|
||||
.disable_pplib_clock_request = true,
|
||||
.disable_pplib_wm_range = true,
|
||||
.pipe_split_policy = MPC_SPLIT_DYNAMIC,
|
||||
.pipe_split_policy = MPC_SPLIT_AVOID,
|
||||
.force_single_disp_pipe_split = false,
|
||||
.disable_dcc = DCC_ENABLE,
|
||||
.vsr_support = true,
|
||||
|
@ -1380,6 +1380,17 @@ static void set_wm_ranges(
|
|||
pp_smu->nv_funcs.set_wm_ranges(&pp_smu->nv_funcs.pp_smu, &ranges);
|
||||
}
|
||||
|
||||
static void dcn301_calculate_wm_and_dlg(
|
||||
struct dc *dc, struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int pipe_cnt,
|
||||
int vlevel)
|
||||
{
|
||||
DC_FP_START();
|
||||
dcn301_calculate_wm_and_dlg_fp(dc, context, pipes, pipe_cnt, vlevel);
|
||||
DC_FP_END();
|
||||
}
|
||||
|
||||
static struct resource_funcs dcn301_res_pool_funcs = {
|
||||
.destroy = dcn301_destroy_resource_pool,
|
||||
.link_enc_create = dcn301_link_encoder_create,
|
||||
|
|
|
@ -2260,6 +2260,9 @@ static bool dcn31_resource_construct(
|
|||
dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
|
||||
dc->caps.color.mpc.ocsc = 1;
|
||||
|
||||
/* Use pipe context based otg sync logic */
|
||||
dc->config.use_pipe_ctx_sync_logic = true;
|
||||
|
||||
/* read VBIOS LTTPR caps */
|
||||
{
|
||||
if (ctx->dc_bios->funcs->get_lttpr_caps) {
|
||||
|
|
|
@ -1576,8 +1576,6 @@ void dml20_rq_dlg_get_dlg_reg(struct display_mode_lib *mode_lib,
|
|||
dlg_sys_param.total_flip_bytes = get_total_immediate_flip_bytes(mode_lib,
|
||||
e2e_pipe_param,
|
||||
num_pipes);
|
||||
dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency
|
||||
/ dlg_sys_param.deepsleep_dcfclk_mhz; // TODO: Deprecated
|
||||
|
||||
print__dlg_sys_params_st(mode_lib, &dlg_sys_param);
|
||||
|
||||
|
|
|
@ -1577,8 +1577,6 @@ void dml20v2_rq_dlg_get_dlg_reg(struct display_mode_lib *mode_lib,
|
|||
dlg_sys_param.total_flip_bytes = get_total_immediate_flip_bytes(mode_lib,
|
||||
e2e_pipe_param,
|
||||
num_pipes);
|
||||
dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency
|
||||
/ dlg_sys_param.deepsleep_dcfclk_mhz; // TODO: Deprecated
|
||||
|
||||
print__dlg_sys_params_st(mode_lib, &dlg_sys_param);
|
||||
|
||||
|
|
|
@ -1688,8 +1688,6 @@ void dml21_rq_dlg_get_dlg_reg(
|
|||
mode_lib,
|
||||
e2e_pipe_param,
|
||||
num_pipes);
|
||||
dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency
|
||||
/ dlg_sys_param.deepsleep_dcfclk_mhz; // TODO: Deprecated
|
||||
|
||||
print__dlg_sys_params_st(mode_lib, &dlg_sys_param);
|
||||
|
||||
|
|
|
@ -1858,8 +1858,6 @@ void dml30_rq_dlg_get_dlg_reg(struct display_mode_lib *mode_lib,
|
|||
dlg_sys_param.total_flip_bytes = get_total_immediate_flip_bytes(mode_lib,
|
||||
e2e_pipe_param,
|
||||
num_pipes);
|
||||
dlg_sys_param.t_srx_delay_us = mode_lib->ip.dcfclk_cstate_latency
|
||||
/ dlg_sys_param.deepsleep_dcfclk_mhz; // TODO: Deprecated
|
||||
|
||||
print__dlg_sys_params_st(mode_lib, &dlg_sys_param);
|
||||
|
||||
|
|
|
@ -327,7 +327,7 @@ void dcn301_fpu_init_soc_bounding_box(struct bp_soc_bb_info bb_info)
|
|||
dcn3_01_soc.sr_exit_time_us = bb_info.dram_sr_exit_latency_100ns * 10;
|
||||
}
|
||||
|
||||
void dcn301_calculate_wm_and_dlg(struct dc *dc,
|
||||
void dcn301_calculate_wm_and_dlg_fp(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int pipe_cnt,
|
||||
|
|
|
@ -34,7 +34,7 @@ void dcn301_fpu_set_wm_ranges(int i,
|
|||
|
||||
void dcn301_fpu_init_soc_bounding_box(struct bp_soc_bb_info bb_info);
|
||||
|
||||
void dcn301_calculate_wm_and_dlg(struct dc *dc,
|
||||
void dcn301_calculate_wm_and_dlg_fp(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
display_e2e_pipe_params_st *pipes,
|
||||
int pipe_cnt,
|
||||
|
|
|
@ -546,7 +546,6 @@ struct _vcs_dpi_display_dlg_sys_params_st {
|
|||
double t_sr_wm_us;
|
||||
double t_extra_us;
|
||||
double mem_trip_us;
|
||||
double t_srx_delay_us;
|
||||
double deepsleep_dcfclk_mhz;
|
||||
double total_flip_bw;
|
||||
unsigned int total_flip_bytes;
|
||||
|
|
|
@ -141,9 +141,6 @@ void print__dlg_sys_params_st(struct display_mode_lib *mode_lib, const struct _v
|
|||
dml_print("DML_RQ_DLG_CALC: t_urg_wm_us = %3.2f\n", dlg_sys_param->t_urg_wm_us);
|
||||
dml_print("DML_RQ_DLG_CALC: t_sr_wm_us = %3.2f\n", dlg_sys_param->t_sr_wm_us);
|
||||
dml_print("DML_RQ_DLG_CALC: t_extra_us = %3.2f\n", dlg_sys_param->t_extra_us);
|
||||
dml_print(
|
||||
"DML_RQ_DLG_CALC: t_srx_delay_us = %3.2f\n",
|
||||
dlg_sys_param->t_srx_delay_us);
|
||||
dml_print(
|
||||
"DML_RQ_DLG_CALC: deepsleep_dcfclk_mhz = %3.2f\n",
|
||||
dlg_sys_param->deepsleep_dcfclk_mhz);
|
||||
|
|
|
@ -1331,10 +1331,6 @@ void dml1_rq_dlg_get_dlg_params(
|
|||
if (dual_plane)
|
||||
DTRACE("DLG: %s: swath_height_c = %d", __func__, swath_height_c);
|
||||
|
||||
DTRACE(
|
||||
"DLG: %s: t_srx_delay_us = %3.2f",
|
||||
__func__,
|
||||
(double) dlg_sys_param->t_srx_delay_us);
|
||||
DTRACE("DLG: %s: line_time_in_us = %3.2f", __func__, (double) line_time_in_us);
|
||||
DTRACE("DLG: %s: vupdate_offset = %d", __func__, vupdate_offset);
|
||||
DTRACE("DLG: %s: vupdate_width = %d", __func__, vupdate_width);
|
||||
|
|
|
@ -382,6 +382,7 @@ struct pipe_ctx {
|
|||
struct pll_settings pll_settings;
|
||||
|
||||
uint8_t pipe_idx;
|
||||
uint8_t pipe_idx_syncd;
|
||||
|
||||
struct pipe_ctx *top_pipe;
|
||||
struct pipe_ctx *bottom_pipe;
|
||||
|
|
|
@ -34,6 +34,10 @@
|
|||
#define MEMORY_TYPE_HBM 2
|
||||
|
||||
|
||||
#define IS_PIPE_SYNCD_VALID(pipe) ((((pipe)->pipe_idx_syncd) & 0x80)?1:0)
|
||||
#define GET_PIPE_SYNCD_FROM_PIPE(pipe) ((pipe)->pipe_idx_syncd & 0x7F)
|
||||
#define SET_PIPE_SYNCD_TO_PIPE(pipe, pipe_syncd) ((pipe)->pipe_idx_syncd = (0x80 | pipe_syncd))
|
||||
|
||||
enum dce_version resource_parse_asic_id(
|
||||
struct hw_asic_id asic_id);
|
||||
|
||||
|
@ -208,6 +212,13 @@ struct hpo_dp_link_encoder *resource_get_hpo_dp_link_enc_for_det_lt(
|
|||
const struct dc_link *link);
|
||||
#endif
|
||||
|
||||
void reset_syncd_pipes_from_disabled_pipes(struct dc *dc,
|
||||
struct dc_state *context);
|
||||
|
||||
void check_syncd_pipes_for_disabled_master_pipe(struct dc *dc,
|
||||
struct dc_state *context,
|
||||
uint8_t disabled_master_pipe_idx);
|
||||
|
||||
uint8_t resource_transmitter_to_phy_idx(const struct dc *dc, enum transmitter transmitter);
|
||||
|
||||
#endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_RESOURCE_H_ */
|
||||
|
|
|
@ -282,8 +282,6 @@ static const struct ast_vbios_enhtable res_1360x768[] = {
|
|||
};
|
||||
|
||||
static const struct ast_vbios_enhtable res_1600x900[] = {
|
||||
{1800, 1600, 24, 80, 1000, 900, 1, 3, VCLK108, /* 60Hz */
|
||||
(SyncPP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 3, 0x3A },
|
||||
{1760, 1600, 48, 32, 926, 900, 3, 5, VCLK97_75, /* 60Hz CVT RB */
|
||||
(SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo |
|
||||
AST2500PreCatchCRT), 60, 1, 0x3A },
|
||||
|
|
|
@ -1327,8 +1327,10 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
|
|||
|
||||
drm_dbg_atomic(dev, "checking %p\n", state);
|
||||
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
|
||||
requested_crtc |= drm_crtc_mask(crtc);
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
|
||||
if (new_crtc_state->enable)
|
||||
requested_crtc |= drm_crtc_mask(crtc);
|
||||
}
|
||||
|
||||
for_each_oldnew_plane_in_state(state, plane, old_plane_state, new_plane_state, i) {
|
||||
ret = drm_atomic_plane_check(old_plane_state, new_plane_state);
|
||||
|
@ -1377,8 +1379,10 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
|
|||
}
|
||||
}
|
||||
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i)
|
||||
affected_crtc |= drm_crtc_mask(crtc);
|
||||
for_each_new_crtc_in_state(state, crtc, new_crtc_state, i) {
|
||||
if (new_crtc_state->enable)
|
||||
affected_crtc |= drm_crtc_mask(crtc);
|
||||
}
|
||||
|
||||
/*
|
||||
* For commits that allow modesets drivers can add other CRTCs to the
|
||||
|
|
|
@ -115,6 +115,12 @@ static const struct drm_dmi_panel_orientation_data lcd1280x1920_rightside_up = {
|
|||
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
||||
};
|
||||
|
||||
static const struct drm_dmi_panel_orientation_data lcd1600x2560_leftside_up = {
|
||||
.width = 1600,
|
||||
.height = 2560,
|
||||
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id orientation_data[] = {
|
||||
{ /* Acer One 10 (S1003) */
|
||||
.matches = {
|
||||
|
@ -275,6 +281,12 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Default string"),
|
||||
},
|
||||
.driver_data = (void *)&onegx1_pro,
|
||||
}, { /* OneXPlayer */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK TECHNOLOGY CO., LTD."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ONE XPLAYER"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1600x2560_leftside_up,
|
||||
}, { /* Samsung GalaxyBook 10.6 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
|
|
|
@ -33,6 +33,9 @@ static bool __init detect_thinkpad_privacy_screen(void)
|
|||
unsigned long long output;
|
||||
acpi_status status;
|
||||
|
||||
if (acpi_disabled)
|
||||
return false;
|
||||
|
||||
/* Get embedded-controller handle */
|
||||
status = acpi_get_devices("PNP0C09", acpi_set_handle, NULL, &ec_handle);
|
||||
if (ACPI_FAILURE(status) || !ec_handle)
|
||||
|
|
|
@ -469,8 +469,8 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (args->stream_size > SZ_64K || args->nr_relocs > SZ_64K ||
|
||||
args->nr_bos > SZ_64K || args->nr_pmrs > 128) {
|
||||
if (args->stream_size > SZ_128K || args->nr_relocs > SZ_128K ||
|
||||
args->nr_bos > SZ_128K || args->nr_pmrs > 128) {
|
||||
DRM_ERROR("submit arguments out of size limits\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -1560,6 +1560,8 @@ static int a6xx_pm_suspend(struct msm_gpu *gpu)
|
|||
for (i = 0; i < gpu->nr_rings; i++)
|
||||
a6xx_gpu->shadow[i] = 0;
|
||||
|
||||
gpu->suspend_count++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -608,9 +608,27 @@ static int adreno_resume(struct device *dev)
|
|||
return gpu->funcs->pm_resume(gpu);
|
||||
}
|
||||
|
||||
static int active_submits(struct msm_gpu *gpu)
|
||||
{
|
||||
int active_submits;
|
||||
mutex_lock(&gpu->active_lock);
|
||||
active_submits = gpu->active_submits;
|
||||
mutex_unlock(&gpu->active_lock);
|
||||
return active_submits;
|
||||
}
|
||||
|
||||
static int adreno_suspend(struct device *dev)
|
||||
{
|
||||
struct msm_gpu *gpu = dev_to_gpu(dev);
|
||||
int remaining;
|
||||
|
||||
remaining = wait_event_timeout(gpu->retire_event,
|
||||
active_submits(gpu) == 0,
|
||||
msecs_to_jiffies(1000));
|
||||
if (remaining == 0) {
|
||||
dev_err(dev, "Timeout waiting for GPU to suspend\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return gpu->funcs->pm_suspend(gpu);
|
||||
}
|
||||
|
|
|
@ -26,9 +26,16 @@ static void dpu_setup_dspp_pcc(struct dpu_hw_dspp *ctx,
|
|||
struct dpu_hw_pcc_cfg *cfg)
|
||||
{
|
||||
|
||||
u32 base = ctx->cap->sblk->pcc.base;
|
||||
u32 base;
|
||||
|
||||
if (!ctx || !base) {
|
||||
if (!ctx) {
|
||||
DRM_ERROR("invalid ctx %pK\n", ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
base = ctx->cap->sblk->pcc.base;
|
||||
|
||||
if (!base) {
|
||||
DRM_ERROR("invalid ctx %pK pcc base 0x%x\n", ctx, base);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,12 @@ static int dsi_get_phy(struct msm_dsi *msm_dsi)
|
|||
|
||||
of_node_put(phy_node);
|
||||
|
||||
if (!phy_pdev || !msm_dsi->phy) {
|
||||
if (!phy_pdev) {
|
||||
DRM_DEV_ERROR(&pdev->dev, "%s: phy driver is not ready\n", __func__);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
if (!msm_dsi->phy) {
|
||||
put_device(&phy_pdev->dev);
|
||||
DRM_DEV_ERROR(&pdev->dev, "%s: phy driver is not ready\n", __func__);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
|
|
@ -808,12 +808,14 @@ int msm_dsi_phy_enable(struct msm_dsi_phy *phy,
|
|||
struct msm_dsi_phy_clk_request *clk_req,
|
||||
struct msm_dsi_phy_shared_timings *shared_timings)
|
||||
{
|
||||
struct device *dev = &phy->pdev->dev;
|
||||
struct device *dev;
|
||||
int ret;
|
||||
|
||||
if (!phy || !phy->cfg->ops.enable)
|
||||
return -EINVAL;
|
||||
|
||||
dev = &phy->pdev->dev;
|
||||
|
||||
ret = dsi_phy_enable_resource(phy);
|
||||
if (ret) {
|
||||
DRM_DEV_ERROR(dev, "%s: resource enable failed, %d\n",
|
||||
|
|
|
@ -97,10 +97,15 @@ static int msm_hdmi_get_phy(struct hdmi *hdmi)
|
|||
|
||||
of_node_put(phy_node);
|
||||
|
||||
if (!phy_pdev || !hdmi->phy) {
|
||||
if (!phy_pdev) {
|
||||
DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n");
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
if (!hdmi->phy) {
|
||||
DRM_DEV_ERROR(&pdev->dev, "phy driver is not ready\n");
|
||||
put_device(&phy_pdev->dev);
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
hdmi->phy_dev = get_device(&phy_pdev->dev);
|
||||
|
||||
|
|
|
@ -461,7 +461,7 @@ static int msm_init_vram(struct drm_device *dev)
|
|||
of_node_put(node);
|
||||
if (ret)
|
||||
return ret;
|
||||
size = r.end - r.start;
|
||||
size = r.end - r.start + 1;
|
||||
DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);
|
||||
|
||||
/* if we have no IOMMU, then we need to use carveout allocator.
|
||||
|
@ -510,7 +510,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
|
|||
struct msm_drm_private *priv = dev_get_drvdata(dev);
|
||||
struct drm_device *ddev;
|
||||
struct msm_kms *kms;
|
||||
struct msm_mdss *mdss;
|
||||
int ret, i;
|
||||
|
||||
ddev = drm_dev_alloc(drv, dev);
|
||||
|
@ -521,8 +520,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
|
|||
ddev->dev_private = priv;
|
||||
priv->dev = ddev;
|
||||
|
||||
mdss = priv->mdss;
|
||||
|
||||
priv->wq = alloc_ordered_workqueue("msm", 0);
|
||||
priv->hangcheck_period = DRM_MSM_HANGCHECK_DEFAULT_PERIOD;
|
||||
|
||||
|
|
|
@ -703,6 +703,8 @@ static void retire_submits(struct msm_gpu *gpu)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
wake_up_all(&gpu->retire_event);
|
||||
}
|
||||
|
||||
static void retire_worker(struct kthread_work *work)
|
||||
|
@ -848,6 +850,7 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
|
|||
INIT_LIST_HEAD(&gpu->active_list);
|
||||
mutex_init(&gpu->active_lock);
|
||||
mutex_init(&gpu->lock);
|
||||
init_waitqueue_head(&gpu->retire_event);
|
||||
kthread_init_work(&gpu->retire_work, retire_worker);
|
||||
kthread_init_work(&gpu->recover_work, recover_worker);
|
||||
kthread_init_work(&gpu->fault_work, fault_worker);
|
||||
|
|
|
@ -230,6 +230,9 @@ struct msm_gpu {
|
|||
/* work for handling GPU recovery: */
|
||||
struct kthread_work recover_work;
|
||||
|
||||
/** retire_event: notified when submits are retired: */
|
||||
wait_queue_head_t retire_event;
|
||||
|
||||
/* work for handling active-list retiring: */
|
||||
struct kthread_work retire_work;
|
||||
|
||||
|
|
|
@ -133,6 +133,18 @@ void msm_devfreq_init(struct msm_gpu *gpu)
|
|||
CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
static void cancel_idle_work(struct msm_gpu_devfreq *df)
|
||||
{
|
||||
hrtimer_cancel(&df->idle_work.timer);
|
||||
kthread_cancel_work_sync(&df->idle_work.work);
|
||||
}
|
||||
|
||||
static void cancel_boost_work(struct msm_gpu_devfreq *df)
|
||||
{
|
||||
hrtimer_cancel(&df->boost_work.timer);
|
||||
kthread_cancel_work_sync(&df->boost_work.work);
|
||||
}
|
||||
|
||||
void msm_devfreq_cleanup(struct msm_gpu *gpu)
|
||||
{
|
||||
struct msm_gpu_devfreq *df = &gpu->devfreq;
|
||||
|
@ -152,7 +164,12 @@ void msm_devfreq_resume(struct msm_gpu *gpu)
|
|||
|
||||
void msm_devfreq_suspend(struct msm_gpu *gpu)
|
||||
{
|
||||
devfreq_suspend_device(gpu->devfreq.devfreq);
|
||||
struct msm_gpu_devfreq *df = &gpu->devfreq;
|
||||
|
||||
devfreq_suspend_device(df->devfreq);
|
||||
|
||||
cancel_idle_work(df);
|
||||
cancel_boost_work(df);
|
||||
}
|
||||
|
||||
static void msm_devfreq_boost_work(struct kthread_work *work)
|
||||
|
@ -196,7 +213,7 @@ void msm_devfreq_active(struct msm_gpu *gpu)
|
|||
/*
|
||||
* Cancel any pending transition to idle frequency:
|
||||
*/
|
||||
hrtimer_cancel(&df->idle_work.timer);
|
||||
cancel_idle_work(df);
|
||||
|
||||
idle_time = ktime_to_ms(ktime_sub(ktime_get(), df->idle_time));
|
||||
|
||||
|
|
|
@ -1262,7 +1262,6 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
int ret;
|
||||
|
||||
dsi->lanes = device->lanes;
|
||||
dsi->channel = device->channel;
|
||||
|
@ -1297,18 +1296,15 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
|||
return 0;
|
||||
}
|
||||
|
||||
ret = component_add(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
if (ret) {
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return component_add(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
}
|
||||
|
||||
static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
|
||||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
|
||||
component_del(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1686,9 +1682,7 @@ static int vc4_dsi_dev_remove(struct platform_device *pdev)
|
|||
struct device *dev = &pdev->dev;
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
|
||||
component_del(&pdev->dev, &vc4_dsi_ops);
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче