On 05/30/2017 11:13 AM, Christian König wrote: > Am 30.05.2017 um 16:57 schrieb Deucher, Alexander: >>> -----Original Message----- >>> From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf >>> Of Leo Liu >>> Sent: Monday, May 29, 2017 2:22 PM >>> To: amd-gfx at lists.freedesktop.org >>> Cc: Liu, Leo >>> Subject: [PATCH] drm/amdgpu: Program ring for vce instance 1 at its own >>> register space >>> >>> when harvest part has only instance 1 available >>> >>> Signed-off-by: Leo Liu <leo.liu at amd.com> >>> --- >>> drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 61 >>> +++++++++++++++++++++++++++++++---- >>> 1 file changed, 55 insertions(+), 6 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> index fb08193..77af395 100644 >>> --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c >>> @@ -77,13 +77,26 @@ static int vce_v3_0_set_clockgating_state(void >>> *handle, >>> static uint64_t vce_v3_0_ring_get_rptr(struct amdgpu_ring *ring) >>> { >>> struct amdgpu_device *adev = ring->adev; >>> + u32 v; >>> + >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + mutex_lock(&adev->grbm_idx_mutex); >>> + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); >>> + } >>> >>> if (ring == &adev->vce.ring[0]) >>> - return RREG32(mmVCE_RB_RPTR); >>> + v = RREG32(mmVCE_RB_RPTR); >>> else if (ring == &adev->vce.ring[1]) >>> - return RREG32(mmVCE_RB_RPTR2); >>> + v = RREG32(mmVCE_RB_RPTR2); >>> else >>> - return RREG32(mmVCE_RB_RPTR3); >>> + v = RREG32(mmVCE_RB_RPTR3); >>> + >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + WREG32(mmGRBM_GFX_INDEX, >>> mmGRBM_GFX_INDEX_DEFAULT); >>> + mutex_unlock(&adev->grbm_idx_mutex); >>> + } >>> + >>> + return v; >>> } >>> >>> /** >>> @@ -96,13 +109,26 @@ static uint64_t vce_v3_0_ring_get_rptr(struct >>> amdgpu_ring *ring) >>> static uint64_t vce_v3_0_ring_get_wptr(struct amdgpu_ring *ring) >>> { >>> struct amdgpu_device *adev = ring->adev; >>> + u32 v; >>> + >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + mutex_lock(&adev->grbm_idx_mutex); >>> + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); >>> + } >>> >>> if (ring == &adev->vce.ring[0]) >>> - return RREG32(mmVCE_RB_WPTR); >>> + v = RREG32(mmVCE_RB_WPTR); >>> else if (ring == &adev->vce.ring[1]) >>> - return RREG32(mmVCE_RB_WPTR2); >>> + v = RREG32(mmVCE_RB_WPTR2); >>> else >>> - return RREG32(mmVCE_RB_WPTR3); >>> + v = RREG32(mmVCE_RB_WPTR3); >>> + >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + WREG32(mmGRBM_GFX_INDEX, >>> mmGRBM_GFX_INDEX_DEFAULT); >>> + mutex_unlock(&adev->grbm_idx_mutex); >>> + } >>> + >>> + return v; >>> } >>> >>> /** >>> @@ -116,12 +142,22 @@ static void vce_v3_0_ring_set_wptr(struct >>> amdgpu_ring *ring) >>> { >>> struct amdgpu_device *adev = ring->adev; >>> >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + mutex_lock(&adev->grbm_idx_mutex); >>> + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); >>> + } >>> + >>> if (ring == &adev->vce.ring[0]) >>> WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); >>> else if (ring == &adev->vce.ring[1]) >>> WREG32(mmVCE_RB_WPTR2, lower_32_bits(ring->wptr)); >>> else >>> WREG32(mmVCE_RB_WPTR3, lower_32_bits(ring->wptr)); >>> + >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + WREG32(mmGRBM_GFX_INDEX, >>> mmGRBM_GFX_INDEX_DEFAULT); >>> + mutex_unlock(&adev->grbm_idx_mutex); >>> + } >>> } >>> >>> static void vce_v3_0_override_vce_clock_gating(struct amdgpu_device >>> *adev, bool override) >>> @@ -231,6 +267,14 @@ static int vce_v3_0_start(struct amdgpu_device >>> *adev) >>> struct amdgpu_ring *ring; >>> int idx, r; >>> >>> + /* we need program ring buffer on instance 1 register space domain >>> + when only if instance 1 available, with two instances or >>> instance 0 >>> + we need only program instance 0 regsiter space domain for ring */ >> Please add this comment to the commit message as well. With that fixed: >> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> >> Also, add CC: stable at vger.kernel.org >> >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + mutex_lock(&adev->grbm_idx_mutex); >>> + WREG32(mmGRBM_GFX_INDEX, GET_VCE_INSTANCE(1)); >>> + } > > I would prefer if we always grab the mutex and program > mmGRBM_GFX_INDEX with the not harvested instance. > > This way we don't run into bad surprises any more when we only test on > boards where the second VCE instance is harvested. Okay. the v2 patch will send shortly. Leo > > Christian. > >>> + >>> ring = &adev->vce.ring[0]; >>> WREG32(mmVCE_RB_RPTR, lower_32_bits(ring->wptr)); >>> WREG32(mmVCE_RB_WPTR, lower_32_bits(ring->wptr)); >>> @@ -252,6 +296,11 @@ static int vce_v3_0_start(struct amdgpu_device >>> *adev) >>> WREG32(mmVCE_RB_BASE_HI3, upper_32_bits(ring->gpu_addr)); >>> WREG32(mmVCE_RB_SIZE3, ring->ring_size / 4); >>> >>> + if (adev->vce.harvest_config == AMDGPU_VCE_HARVEST_VCE0) { >>> + WREG32(mmGRBM_GFX_INDEX, >>> mmGRBM_GFX_INDEX_DEFAULT); >>> + mutex_unlock(&adev->grbm_idx_mutex); >>> + } >>> + >>> mutex_lock(&adev->grbm_idx_mutex); >>> for (idx = 0; idx < 2; ++idx) { >>> if (adev->vce.harvest_config & (1 << idx)) >>> -- >>> 2.9.3 >>> >>> _______________________________________________ >>> amd-gfx mailing list >>> amd-gfx at lists.freedesktop.org >>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx at lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx > >