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

Commit f30f37de authored by Michel Dänzer's avatar Michel Dänzer Committed by Dave Airlie
Browse files

drm/radeon/kms: Update memory bandwidth requirements in mode_set_base hook.



The hook may change the number of bytes per pixel being scanned out, which
affects the CRTC memory bandwidth requirements. E.g. booting in 8bpp and then
running X in 32bpp would result in the bandwidth requirements being
underestimated for the latter and consequently in CRTC FIFO underruns causing
visible artifacts with 3D intensive workloads.

ATOM changes only compile-tested.

Signed-off-by: default avatarMichel Dänzer <daenzer@vmware.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent e33497aa
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -563,6 +563,10 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
		radeon_fb = to_radeon_framebuffer(old_fb);
		radeon_fb = to_radeon_framebuffer(old_fb);
		radeon_gem_object_unpin(radeon_fb->obj);
		radeon_gem_object_unpin(radeon_fb->obj);
	}
	}

	/* Bytes per pixel may have changed */
	radeon_bandwidth_update(rdev);

	return 0;
	return 0;
}
}


@@ -701,7 +705,6 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
	}
	}
	atombios_overscan_setup(crtc, mode, adjusted_mode);
	atombios_overscan_setup(crtc, mode, adjusted_mode);
	atombios_scaler_setup(crtc);
	atombios_scaler_setup(crtc);
	radeon_bandwidth_update(rdev);
	return 0;
	return 0;
}
}


+4 −3
Original line number Original line Diff line number Diff line
@@ -532,6 +532,10 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
		radeon_fb = to_radeon_framebuffer(old_fb);
		radeon_fb = to_radeon_framebuffer(old_fb);
		radeon_gem_object_unpin(radeon_fb->obj);
		radeon_gem_object_unpin(radeon_fb->obj);
	}
	}

	/* Bytes per pixel may have changed */
	radeon_bandwidth_update(rdev);

	return 0;
	return 0;
}
}


@@ -1015,14 +1019,11 @@ static int radeon_crtc_mode_set(struct drm_crtc *crtc,
				 int x, int y, struct drm_framebuffer *old_fb)
				 int x, int y, struct drm_framebuffer *old_fb)
{
{
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
	struct drm_device *dev = crtc->dev;
	struct radeon_device *rdev = dev->dev_private;


	/* TODO TV */
	/* TODO TV */
	radeon_crtc_set_base(crtc, x, y, old_fb);
	radeon_crtc_set_base(crtc, x, y, old_fb);
	radeon_set_crtc_timing(crtc, adjusted_mode);
	radeon_set_crtc_timing(crtc, adjusted_mode);
	radeon_set_pll(crtc, adjusted_mode);
	radeon_set_pll(crtc, adjusted_mode);
	radeon_bandwidth_update(rdev);
	if (radeon_crtc->crtc_id == 0) {
	if (radeon_crtc->crtc_id == 0) {
		radeon_legacy_rmx_mode_set(crtc, mode, adjusted_mode);
		radeon_legacy_rmx_mode_set(crtc, mode, adjusted_mode);
	} else {
	} else {