lkml.org 
[lkml]   [2015]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 045/122] drm/radeon: disable semaphores for UVD V1 (v2)
    Date
    3.13.11-ckt22 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>

    commit 013ead48a843442e63b9426e3bd5df18ca5d054a upstream.

    Hardware doesn't seem to work correctly, just block userspace in this case.

    v2: add missing defines

    Bugs: https://bugs.freedesktop.org/show_bug.cgi?id=85320

    Signed-off-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/gpu/drm/radeon/radeon_asic.c | 2 +-
    drivers/gpu/drm/radeon/radeon_asic.h | 4 ++++
    drivers/gpu/drm/radeon/rv770d.h | 3 +++
    drivers/gpu/drm/radeon/uvd_v1_0.c | 14 ++------------
    drivers/gpu/drm/radeon/uvd_v2_2.c | 29 +++++++++++++++++++++++++++++
    5 files changed, 39 insertions(+), 13 deletions(-)

    diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c
    index 552edbd..1561634 100644
    --- a/drivers/gpu/drm/radeon/radeon_asic.c
    +++ b/drivers/gpu/drm/radeon/radeon_asic.c
    @@ -1157,7 +1157,7 @@ static struct radeon_asic rs780_asic = {
    static struct radeon_asic_ring rv770_uvd_ring = {
    .ib_execute = &uvd_v1_0_ib_execute,
    .emit_fence = &uvd_v2_2_fence_emit,
    - .emit_semaphore = &uvd_v1_0_semaphore_emit,
    + .emit_semaphore = &uvd_v2_2_semaphore_emit,
    .cs_parse = &radeon_uvd_cs_parse,
    .ring_test = &uvd_v1_0_ring_test,
    .ib_test = &uvd_v1_0_ib_test,
    diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h
    index c9fd97b..8e10643 100644
    --- a/drivers/gpu/drm/radeon/radeon_asic.h
    +++ b/drivers/gpu/drm/radeon/radeon_asic.h
    @@ -813,6 +813,10 @@ void uvd_v1_0_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
    int uvd_v2_2_resume(struct radeon_device *rdev);
    void uvd_v2_2_fence_emit(struct radeon_device *rdev,
    struct radeon_fence *fence);
    +bool uvd_v2_2_semaphore_emit(struct radeon_device *rdev,
    + struct radeon_ring *ring,
    + struct radeon_semaphore *semaphore,
    + bool emit_wait);

    /* uvd v3.1 */
    bool uvd_v3_1_semaphore_emit(struct radeon_device *rdev,
    diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h
    index 1ae2771..68ae189 100644
    --- a/drivers/gpu/drm/radeon/rv770d.h
    +++ b/drivers/gpu/drm/radeon/rv770d.h
    @@ -982,6 +982,9 @@
    ((n) & 0x3FFF) << 16)

    /* UVD */
    +#define UVD_SEMA_ADDR_LOW 0xef00
    +#define UVD_SEMA_ADDR_HIGH 0xef04
    +#define UVD_SEMA_CMD 0xef08
    #define UVD_GPCOM_VCPU_CMD 0xef0c
    #define UVD_GPCOM_VCPU_DATA0 0xef10
    #define UVD_GPCOM_VCPU_DATA1 0xef14
    diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c
    index c310a0a..0fa9009 100644
    --- a/drivers/gpu/drm/radeon/uvd_v1_0.c
    +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c
    @@ -365,18 +365,8 @@ bool uvd_v1_0_semaphore_emit(struct radeon_device *rdev,
    struct radeon_semaphore *semaphore,
    bool emit_wait)
    {
    - uint64_t addr = semaphore->gpu_addr;
    -
    - radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
    - radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
    -
    - radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
    - radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
    -
    - radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
    - radeon_ring_write(ring, emit_wait ? 1 : 0);
    -
    - return true;
    + /* disable semaphores for UVD V1 hardware */
    + return false;
    }

    /**
    diff --git a/drivers/gpu/drm/radeon/uvd_v2_2.c b/drivers/gpu/drm/radeon/uvd_v2_2.c
    index 824550d..207e8cf 100644
    --- a/drivers/gpu/drm/radeon/uvd_v2_2.c
    +++ b/drivers/gpu/drm/radeon/uvd_v2_2.c
    @@ -61,6 +61,35 @@ void uvd_v2_2_fence_emit(struct radeon_device *rdev,
    }

    /**
    + * uvd_v2_2_semaphore_emit - emit semaphore command
    + *
    + * @rdev: radeon_device pointer
    + * @ring: radeon_ring pointer
    + * @semaphore: semaphore to emit commands for
    + * @emit_wait: true if we should emit a wait command
    + *
    + * Emit a semaphore command (either wait or signal) to the UVD ring.
    + */
    +bool uvd_v2_2_semaphore_emit(struct radeon_device *rdev,
    + struct radeon_ring *ring,
    + struct radeon_semaphore *semaphore,
    + bool emit_wait)
    +{
    + uint64_t addr = semaphore->gpu_addr;
    +
    + radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_LOW, 0));
    + radeon_ring_write(ring, (addr >> 3) & 0x000FFFFF);
    +
    + radeon_ring_write(ring, PACKET0(UVD_SEMA_ADDR_HIGH, 0));
    + radeon_ring_write(ring, (addr >> 23) & 0x000FFFFF);
    +
    + radeon_ring_write(ring, PACKET0(UVD_SEMA_CMD, 0));
    + radeon_ring_write(ring, emit_wait ? 1 : 0);
    +
    + return true;
    +}
    +
    +/**
    * uvd_v2_2_resume - memory controller programming
    *
    * @rdev: radeon_device pointer
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-18 01:21    [W:4.019 / U:0.988 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site