summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-05-12 11:16:55 +1000
committerDave Airlie <airlied@redhat.com>2016-05-12 11:16:55 +1000
commit7d020672615d09cf6ec42c500f34d70adf6758a9 (patch)
tree9802fd588de854c788a59449233ea42acd107cc0 /drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
parent95306975e9dd38ba2775dd96cb29987ecc7d9360 (diff)
parentb4eeed590deeff13a53db641129f0301d70248f3 (diff)
Merge branch 'drm-next-4.7' of git://people.freedesktop.org/~agd5f/linux into drm-next
More amdgpu fixes for 4.7. Highlights: - enable async pageflips - UVD fixes for polaris - lots of GPUVM fixes - whitespace and code cleanups - misc bug fixes * 'drm-next-4.7' of git://people.freedesktop.org/~agd5f/linux: (32 commits) drm/amd/powerplay: rewrite pp_sw_init to make code readable drm/amdgpu/dce11: fix audio offset for asics with >7 audio pins drm/amdgpu: fix and cleanup user fence handling v2 drm/amdgpu: move VM fields into job drm/amdgpu: move the context from the IBs into the job drm/amdgpu: move context switch handling into common code v2 drm/amdgpu: move preamble IB handling into common code drm/amdgpu/gfx7: fix pipeline sync amdgpu/uvd: separate context buffer from DPB drm/amdgpu: use fence_context to judge ctx switch v2 drm/amd/amdgpu: Added more named DRM info messages for debugging drm/amd/amdgpu: Add name field to amd_ip_funcs (v2) drm/amdgpu: Support DRM_MODE_PAGE_FLIP_ASYNC (v2) drm/amdgpu/dce11: don't share PLLs on Polaris drm/amdgpu: Drop unused parameter for *get_sleep_divider_id_from_clock drm/amdgpu: Simplify calculation in *get_sleep_divider_id_from_clock drm/amdgpu: Use max macro in *get_sleep_divider_id_from_clock drm/amd/powerplay: Use defined constants for minium engine clock drm/amdgpu: add missing licenses on a couple of files drm/amdgpu: fetch cu_info once at init ...
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v8_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/dce_v8_0.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
index 25e6af03c406..c087f930d67e 100644
--- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
@@ -233,10 +233,13 @@ static void dce_v8_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
* surface base address.
*/
static void dce_v8_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];
+ /* flip at hsync for async, default is vsync */
+ WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, async ?
+ GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK : 0);
/* update the primary scanout addresses */
WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
upper_32_bits(crtc_base));
@@ -1999,7 +2002,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
uint32_t fb_format, fb_pitch_pixels;
u32 fb_swap = (GRPH_ENDIAN_NONE << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT);
u32 pipe_config;
- u32 tmp, viewport_w, viewport_h;
+ u32 viewport_w, viewport_h;
int r;
bool bypass_lut = false;
@@ -2135,6 +2138,11 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
dce_v8_0_vga_enable(crtc, false);
+ /* Make sure surface address is updated at vertical blank rather than
+ * horizontal blank
+ */
+ WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, 0);
+
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,
@@ -2182,12 +2190,6 @@ static int dce_v8_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 &= ~GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK;
- WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
-
/* set pageflip to happen only at start of vblank interval (front porch) */
WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3);
@@ -2902,6 +2904,8 @@ static int dce_v8_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;
@@ -3420,6 +3424,7 @@ static int dce_v8_0_set_powergating_state(void *handle,
}
const struct amd_ip_funcs dce_v8_0_ip_funcs = {
+ .name = "dce_v8_0",
.early_init = dce_v8_0_early_init,
.late_init = NULL,
.sw_init = dce_v8_0_sw_init,