Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1409bc6b authored by Roman Li's avatar Roman Li Committed by Alex Deucher
Browse files

drm/amd/display: Fix FBC text console corruption

parent 89fc8d4e
Loading
Loading
Loading
Loading
+54 −13
Original line number Diff line number Diff line
@@ -102,6 +102,43 @@ static uint32_t align_to_chunks_number_per_line(uint32_t pixels)
	return 256 * ((pixels + 255) / 256);
}

static void reset_lb_on_vblank(struct dc_context *ctx)
{
	uint32_t value, frame_count;
	uint32_t retry = 0;
	uint32_t status_pos =
			dm_read_reg(ctx, mmCRTC_STATUS_POSITION);


	/* Only if CRTC is enabled and counter is moving we wait for one frame. */
	if (status_pos != dm_read_reg(ctx, mmCRTC_STATUS_POSITION)) {
		/* Resetting LB on VBlank */
		value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);
		set_reg_field_value(value, 3, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL);
		set_reg_field_value(value, 1, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL2);
		dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value);

		frame_count = dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT);


		for (retry = 100; retry > 0; retry--) {
			if (frame_count != dm_read_reg(ctx, mmCRTC_STATUS_FRAME_COUNT))
				break;
			msleep(1);
		}
		if (!retry)
			dm_error("Frame count did not increase for 100ms.\n");

		/* Resetting LB on VBlank */
		value = dm_read_reg(ctx, mmLB_SYNC_RESET_SEL);
		set_reg_field_value(value, 2, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL);
		set_reg_field_value(value, 0, LB_SYNC_RESET_SEL, LB_SYNC_RESET_SEL2);
		dm_write_reg(ctx, mmLB_SYNC_RESET_SEL, value);

	}

}

static void wait_for_fbc_state_changed(
	struct dce110_compressor *cp110,
	bool enabled)
@@ -232,8 +269,8 @@ void dce110_compressor_disable_fbc(struct compressor *compressor)
{
	struct dce110_compressor *cp110 = TO_DCE110_COMPRESSOR(compressor);

	if (compressor->options.bits.FBC_SUPPORT &&
		dce110_compressor_is_fbc_enabled_in_hw(compressor, NULL)) {
	if (compressor->options.bits.FBC_SUPPORT) {
		if (dce110_compressor_is_fbc_enabled_in_hw(compressor, NULL)) {
			uint32_t reg_data;
			/* Turn off compression */
			reg_data = dm_read_reg(compressor->ctx, mmFBC_CNTL);
@@ -246,6 +283,10 @@ void dce110_compressor_disable_fbc(struct compressor *compressor)

			wait_for_fbc_state_changed(cp110, false);
		}

		/* Sync line buffer  - dce100/110 only*/
		reset_lb_on_vblank(compressor->ctx);
	}
}

bool dce110_compressor_is_fbc_enabled_in_hw(