Commit 8f95ff28 authored by Eric Yang's avatar Eric Yang Committed by Alex Deucher
Browse files

drm/amd/display: add mechanism to skip DCN init



[Why]
If optimized init is done in FW. DCN init be skipped in driver. This
need to be communicated between driver and fw and maintain backwards
compatibility.

[How]
Use DMUB scratch 0 bit 2 to indicate optimized init done in fw and
use DMUB scatch 4 bit 0 to indicate drive supports the optimized flow
so FW will perform it.

Signed-off-by: default avatarEric Yang <Eric.Yang2@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c04bd16e
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -2681,6 +2681,7 @@ void dc_interrupt_ack(struct dc *dc, enum dc_irq_source src)
	dal_irq_service_ack(dc->res_pool->irqs, src);
}


void dc_set_power_state(
	struct dc *dc,
	enum dc_acpi_cm_power_state power_state)
@@ -2692,9 +2693,6 @@ void dc_set_power_state(
	case DC_ACPI_CM_POWER_STATE_D0:
		dc_resource_state_construct(dc, dc->current_state);

		if (dc->ctx->dmub_srv)
			dc_dmub_srv_wait_phy_init(dc->ctx->dmub_srv);

		dc->hwss.init_hw(dc);

		if (dc->hwss.init_sys_ctx != NULL &&
+8 −20
Original line number Diff line number Diff line
@@ -106,29 +106,17 @@ void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv)
		DC_ERROR("Error waiting for DMUB idle: status=%d\n", status);
}

void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv)
bool dc_dmub_srv_optimized_init_done(struct dc_dmub_srv *dc_dmub_srv)
{
	struct dmub_srv *dmub = dc_dmub_srv->dmub;
	struct dc_context *dc_ctx = dc_dmub_srv->ctx;
	enum dmub_status status;
	struct dmub_srv *dmub;
	union dmub_fw_boot_status status;

	for (;;) {
		/* Wait up to a second for PHY init. */
		status = dmub_srv_wait_for_phy_init(dmub, 1000000);
		if (status == DMUB_STATUS_OK)
			/* Initialization OK */
			break;
	if (!dc_dmub_srv || !dc_dmub_srv->dmub)
		return false;

		DC_ERROR("DMCUB PHY init failed: status=%d\n", status);
		ASSERT(0);
	dmub = dc_dmub_srv->dmub;

		if (status != DMUB_STATUS_TIMEOUT)
			/*
			 * Server likely initialized or we don't have
			 * DMCUB HW support - this won't end.
			 */
			break;
	status = dmub->hw_funcs.get_fw_status(dmub);

		/* Continue spinning so we don't hang the ASIC. */
	}
	return status.bits.optimized_init_done;
}
+2 −0
Original line number Diff line number Diff line
@@ -56,4 +56,6 @@ void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv);

void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv);

bool dc_dmub_srv_optimized_init_done(struct dc_dmub_srv *dc_dmub_srv);

#endif /* _DMUB_DC_SRV_H_ */
+3 −1
Original line number Diff line number Diff line
@@ -1288,7 +1288,9 @@ void dcn10_init_hw(struct dc *dc)
	if (!dcb->funcs->is_accelerated_mode(dcb))
		hws->funcs.disable_vga(dc->hwseq);

	if (!dc_dmub_srv_optimized_init_done(dc->ctx->dmub_srv))
		hws->funcs.bios_golden_init(dc);

	if (dc->ctx->dc_bios->fw_info_valid) {
		res_pool->ref_clocks.xtalin_clock_inKhz =
				dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
+3 −2
Original line number Diff line number Diff line
@@ -264,9 +264,10 @@ struct dmub_srv_hw_funcs {

	bool (*is_hw_init)(struct dmub_srv *dmub);

	bool (*is_phy_init)(struct dmub_srv *dmub);
	void (*enable_dmub_boot_options)(struct dmub_srv *dmub);

	union dmub_fw_boot_status (*get_fw_status)(struct dmub_srv *dmub);

	bool (*is_auto_load_done)(struct dmub_srv *dmub);

	void (*set_gpint)(struct dmub_srv *dmub,
			  union dmub_gpint_data_register reg);
Loading