> -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf > Of Michel Dänzer > Sent: Thursday, October 27, 2016 4:51 AM > To: amd-gfx at lists.freedesktop.org > Subject: [PATCH 3/3] drm/amdgpu: Only update the CUR_SIZE register when > necessary > > From: Michel Dänzer <michel.daenzer at amd.com> > > Normally only necessary when the cursor size changes. > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> For the series: Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > drivers/gpu/drm/amd/amdgpu/dce_v10_0.c | 22 +++++++++++++++------- > drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 22 +++++++++++++++------- > drivers/gpu/drm/amd/amdgpu/dce_v6_0.c | 18 ++++++++++++++---- > drivers/gpu/drm/amd/amdgpu/dce_v8_0.c | 20 +++++++++++++++----- > 4 files changed, 59 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c > b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c > index e3550e9..1d86a47 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c > @@ -2512,8 +2512,6 @@ static int dce_v10_0_cursor_move_locked(struct > drm_crtc *crtc, > > WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | > y); > WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin > << 16) | yorigin); > - WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > - ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc- > >cursor_height - 1)); > > return 0; > } > @@ -2539,6 +2537,7 @@ static int dce_v10_0_crtc_cursor_set2(struct > drm_crtc *crtc, > int32_t hot_y) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > struct drm_gem_object *obj; > struct amdgpu_bo *aobj; > int ret; > @@ -2579,9 +2578,7 @@ static int dce_v10_0_crtc_cursor_set2(struct > drm_crtc *crtc, > > dce_v10_0_lock_cursor(crtc, true); > > - if (width != amdgpu_crtc->cursor_width || > - height != amdgpu_crtc->cursor_height || > - hot_x != amdgpu_crtc->cursor_hot_x || > + if (hot_x != amdgpu_crtc->cursor_hot_x || > hot_y != amdgpu_crtc->cursor_hot_y) { > int x, y; > > @@ -2590,12 +2587,18 @@ static int dce_v10_0_crtc_cursor_set2(struct > drm_crtc *crtc, > > dce_v10_0_cursor_move_locked(crtc, x, y); > > - amdgpu_crtc->cursor_width = width; > - amdgpu_crtc->cursor_height = height; > amdgpu_crtc->cursor_hot_x = hot_x; > amdgpu_crtc->cursor_hot_y = hot_y; > } > > + if (width != amdgpu_crtc->cursor_width || > + height != amdgpu_crtc->cursor_height) { > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (width - 1) << 16 | (height - 1)); > + amdgpu_crtc->cursor_width = width; > + amdgpu_crtc->cursor_height = height; > + } > + > dce_v10_0_show_cursor(crtc); > dce_v10_0_lock_cursor(crtc, false); > > @@ -2617,6 +2620,7 @@ unpin: > static void dce_v10_0_cursor_reset(struct drm_crtc *crtc) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > > if (amdgpu_crtc->cursor_bo) { > dce_v10_0_lock_cursor(crtc, true); > @@ -2624,6 +2628,10 @@ static void dce_v10_0_cursor_reset(struct > drm_crtc *crtc) > dce_v10_0_cursor_move_locked(crtc, amdgpu_crtc- > >cursor_x, > amdgpu_crtc->cursor_y); > > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (amdgpu_crtc->cursor_width - 1) << 16 | > + (amdgpu_crtc->cursor_height - 1)); > + > dce_v10_0_show_cursor(crtc); > > dce_v10_0_lock_cursor(crtc, false); > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c > b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c > index 6d6d0fd..fd6ca57 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c > @@ -2528,8 +2528,6 @@ static int dce_v11_0_cursor_move_locked(struct > drm_crtc *crtc, > > WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | > y); > WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin > << 16) | yorigin); > - WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > - ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc- > >cursor_height - 1)); > > return 0; > } > @@ -2555,6 +2553,7 @@ static int dce_v11_0_crtc_cursor_set2(struct > drm_crtc *crtc, > int32_t hot_y) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > struct drm_gem_object *obj; > struct amdgpu_bo *aobj; > int ret; > @@ -2595,9 +2594,7 @@ static int dce_v11_0_crtc_cursor_set2(struct > drm_crtc *crtc, > > dce_v11_0_lock_cursor(crtc, true); > > - if (width != amdgpu_crtc->cursor_width || > - height != amdgpu_crtc->cursor_height || > - hot_x != amdgpu_crtc->cursor_hot_x || > + if (hot_x != amdgpu_crtc->cursor_hot_x || > hot_y != amdgpu_crtc->cursor_hot_y) { > int x, y; > > @@ -2606,12 +2603,18 @@ static int dce_v11_0_crtc_cursor_set2(struct > drm_crtc *crtc, > > dce_v11_0_cursor_move_locked(crtc, x, y); > > - amdgpu_crtc->cursor_width = width; > - amdgpu_crtc->cursor_height = height; > amdgpu_crtc->cursor_hot_x = hot_x; > amdgpu_crtc->cursor_hot_y = hot_y; > } > > + if (width != amdgpu_crtc->cursor_width || > + height != amdgpu_crtc->cursor_height) { > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (width - 1) << 16 | (height - 1)); > + amdgpu_crtc->cursor_width = width; > + amdgpu_crtc->cursor_height = height; > + } > + > dce_v11_0_show_cursor(crtc); > dce_v11_0_lock_cursor(crtc, false); > > @@ -2633,6 +2636,7 @@ unpin: > static void dce_v11_0_cursor_reset(struct drm_crtc *crtc) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > > if (amdgpu_crtc->cursor_bo) { > dce_v11_0_lock_cursor(crtc, true); > @@ -2640,6 +2644,10 @@ static void dce_v11_0_cursor_reset(struct > drm_crtc *crtc) > dce_v11_0_cursor_move_locked(crtc, amdgpu_crtc- > >cursor_x, > amdgpu_crtc->cursor_y); > > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (amdgpu_crtc->cursor_width - 1) << 16 | > + (amdgpu_crtc->cursor_height - 1)); > + > dce_v11_0_show_cursor(crtc); > > dce_v11_0_lock_cursor(crtc, false); > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c > b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c > index 4794848..03c8529 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c > @@ -1853,8 +1853,6 @@ static int dce_v6_0_cursor_move_locked(struct > drm_crtc *crtc, > struct amdgpu_device *adev = crtc->dev->dev_private; > int xorigin = 0, yorigin = 0; > > - int w = amdgpu_crtc->cursor_width; > - > amdgpu_crtc->cursor_x = x; > amdgpu_crtc->cursor_y = y; > > @@ -1874,8 +1872,6 @@ static int dce_v6_0_cursor_move_locked(struct > drm_crtc *crtc, > > WREG32(EVERGREEN_CUR_POSITION + amdgpu_crtc->crtc_offset, > (x << 16) | y); > WREG32(EVERGREEN_CUR_HOT_SPOT + amdgpu_crtc->crtc_offset, > (xorigin << 16) | yorigin); > - WREG32(EVERGREEN_CUR_SIZE + amdgpu_crtc->crtc_offset, > - ((w - 1) << 16) | (amdgpu_crtc->cursor_height - 1)); > > return 0; > } > @@ -1901,6 +1897,7 @@ static int dce_v6_0_crtc_cursor_set2(struct > drm_crtc *crtc, > int32_t hot_y) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > struct drm_gem_object *obj; > struct amdgpu_bo *aobj; > int ret; > @@ -1958,6 +1955,14 @@ static int dce_v6_0_crtc_cursor_set2(struct > drm_crtc *crtc, > amdgpu_crtc->cursor_hot_y = hot_y; > } > > + if (width != amdgpu_crtc->cursor_width || > + height != amdgpu_crtc->cursor_height) { > + WREG32(EVERGREEN_CUR_SIZE + amdgpu_crtc- > >crtc_offset, > + (width - 1) << 16 | (height - 1)); > + amdgpu_crtc->cursor_width = width; > + amdgpu_crtc->cursor_height = height; > + } > + > dce_v6_0_show_cursor(crtc); > dce_v6_0_lock_cursor(crtc, false); > > @@ -1979,6 +1984,7 @@ unpin: > static void dce_v6_0_cursor_reset(struct drm_crtc *crtc) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > > if (amdgpu_crtc->cursor_bo) { > dce_v6_0_lock_cursor(crtc, true); > @@ -1986,6 +1992,10 @@ static void dce_v6_0_cursor_reset(struct drm_crtc > *crtc) > dce_v6_0_cursor_move_locked(crtc, amdgpu_crtc- > >cursor_x, > amdgpu_crtc->cursor_y); > > + WREG32(EVERGREEN_CUR_SIZE + amdgpu_crtc- > >crtc_offset, > + (amdgpu_crtc->cursor_width - 1) << 16 | > + (amdgpu_crtc->cursor_height - 1)); > + > dce_v6_0_show_cursor(crtc); > dce_v6_0_lock_cursor(crtc, false); > } > diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c > b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c > index c557d92..d89ea8a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c > +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c > @@ -2363,8 +2363,6 @@ static int dce_v8_0_cursor_move_locked(struct > drm_crtc *crtc, > > WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | > y); > WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin > << 16) | yorigin); > - WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > - ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc- > >cursor_height - 1)); > > return 0; > } > @@ -2390,6 +2388,7 @@ static int dce_v8_0_crtc_cursor_set2(struct > drm_crtc *crtc, > int32_t hot_y) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > struct drm_gem_object *obj; > struct amdgpu_bo *aobj; > int ret; > @@ -2430,9 +2429,7 @@ static int dce_v8_0_crtc_cursor_set2(struct > drm_crtc *crtc, > > dce_v8_0_lock_cursor(crtc, true); > > - if (width != amdgpu_crtc->cursor_width || > - height != amdgpu_crtc->cursor_height || > - hot_x != amdgpu_crtc->cursor_hot_x || > + if (hot_x != amdgpu_crtc->cursor_hot_x || > hot_y != amdgpu_crtc->cursor_hot_y) { > int x, y; > > @@ -2447,6 +2444,14 @@ static int dce_v8_0_crtc_cursor_set2(struct > drm_crtc *crtc, > amdgpu_crtc->cursor_hot_y = hot_y; > } > > + if (width != amdgpu_crtc->cursor_width || > + height != amdgpu_crtc->cursor_height) { > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (width - 1) << 16 | (height - 1)); > + amdgpu_crtc->cursor_width = width; > + amdgpu_crtc->cursor_height = height; > + } > + > dce_v8_0_show_cursor(crtc); > dce_v8_0_lock_cursor(crtc, false); > > @@ -2468,6 +2473,7 @@ unpin: > static void dce_v8_0_cursor_reset(struct drm_crtc *crtc) > { > struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); > + struct amdgpu_device *adev = crtc->dev->dev_private; > > if (amdgpu_crtc->cursor_bo) { > dce_v8_0_lock_cursor(crtc, true); > @@ -2475,6 +2481,10 @@ static void dce_v8_0_cursor_reset(struct drm_crtc > *crtc) > dce_v8_0_cursor_move_locked(crtc, amdgpu_crtc- > >cursor_x, > amdgpu_crtc->cursor_y); > > + WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, > + (amdgpu_crtc->cursor_width - 1) << 16 | > + (amdgpu_crtc->cursor_height - 1)); > + > dce_v8_0_show_cursor(crtc); > > dce_v8_0_lock_cursor(crtc, false); > -- > 2.10.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx