|
@@ -302,10 +302,17 @@ static void dce_v11_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
|
|
|
* surface base address.
|
|
|
*/
|
|
|
static void dce_v11_0_page_flip(struct amdgpu_device *adev,
|
|
|
- int crtc_id, u64 crtc_base)
|
|
|
+ int crtc_id, u64 crtc_base, bool async)
|
|
|
{
|
|
|
struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
|
|
|
+ u32 tmp;
|
|
|
|
|
|
+ /* flip at hsync for async, default is vsync */
|
|
|
+ /* use UPDATE_IMMEDIATE_EN instead for async? */
|
|
|
+ tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
|
|
|
+ tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
|
|
|
+ GRPH_SURFACE_UPDATE_H_RETRACE_EN, async ? 1 : 0);
|
|
|
+ WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
|
|
|
/* update the scanout addresses */
|
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
|
upper_32_bits(crtc_base));
|
|
@@ -2185,6 +2192,14 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
|
|
|
dce_v11_0_vga_enable(crtc, false);
|
|
|
|
|
|
+ /* Make sure surface address is updated at vertical blank rather than
|
|
|
+ * horizontal blank
|
|
|
+ */
|
|
|
+ tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
|
|
|
+ tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
|
|
|
+ GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
|
|
|
+ WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
|
|
|
+
|
|
|
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
|
upper_32_bits(fb_location));
|
|
|
WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
|
|
@@ -2235,13 +2250,6 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
|
|
|
WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
|
|
|
(viewport_w << 16) | viewport_h);
|
|
|
|
|
|
- /* pageflip setup */
|
|
|
- /* make sure flip is at vb rather than hb */
|
|
|
- tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
|
|
|
- tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
|
|
|
- GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
|
|
|
- WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
|
|
|
-
|
|
|
/* set pageflip to happen only at start of vblank interval (front porch) */
|
|
|
WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3);
|
|
|
|
|
@@ -3042,6 +3050,8 @@ static int dce_v11_0_sw_init(void *handle)
|
|
|
|
|
|
adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
|
|
|
|
|
|
+ adev->ddev->mode_config.async_page_flip = true;
|
|
|
+
|
|
|
adev->ddev->mode_config.max_width = 16384;
|
|
|
adev->ddev->mode_config.max_height = 16384;
|
|
|
|