diff options
author | Christian König <deathsimple@vodafone.de> | 2013-04-08 06:41:29 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-04-09 10:31:33 -0400 |
commit | f2ba57b5eab8817d86d0f108fdf1878e51dc0a37 (patch) | |
tree | e784f0573069f6341768968fe3d49df6d2c9a534 /drivers/gpu/drm/radeon/radeon_fence.c | |
parent | 4474f3a91f95e3fcc62d97e36f1e8e3392c96ee0 (diff) |
drm/radeon: UVD bringup v8
Just everything needed to decode videos using UVD.
v6: just all the bugfixes and support for R7xx-SI merged in one patch
v7: UVD_CGC_GATE is a write only register, lockup detection fix
v8: split out VRAM fallback changes, remove support for RV770,
add support for HEMLOCK, add buffer sizes checks
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_fence.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 34356252567a..82fe1835ff8c 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -31,9 +31,9 @@ | |||
31 | #include <linux/seq_file.h> | 31 | #include <linux/seq_file.h> |
32 | #include <linux/atomic.h> | 32 | #include <linux/atomic.h> |
33 | #include <linux/wait.h> | 33 | #include <linux/wait.h> |
34 | #include <linux/list.h> | ||
35 | #include <linux/kref.h> | 34 | #include <linux/kref.h> |
36 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/firmware.h> | ||
37 | #include <drm/drmP.h> | 37 | #include <drm/drmP.h> |
38 | #include "radeon_reg.h" | 38 | #include "radeon_reg.h" |
39 | #include "radeon.h" | 39 | #include "radeon.h" |
@@ -767,8 +767,21 @@ int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring) | |||
767 | 767 | ||
768 | radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg); | 768 | radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg); |
769 | if (rdev->wb.use_event || !radeon_ring_supports_scratch_reg(rdev, &rdev->ring[ring])) { | 769 | if (rdev->wb.use_event || !radeon_ring_supports_scratch_reg(rdev, &rdev->ring[ring])) { |
770 | rdev->fence_drv[ring].scratch_reg = 0; | 770 | if (ring != R600_RING_TYPE_UVD_INDEX) { |
771 | index = R600_WB_EVENT_OFFSET + ring * 4; | 771 | rdev->fence_drv[ring].scratch_reg = 0; |
772 | index = R600_WB_EVENT_OFFSET + ring * 4; | ||
773 | rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4]; | ||
774 | rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr + | ||
775 | index; | ||
776 | |||
777 | } else { | ||
778 | /* put fence directly behind firmware */ | ||
779 | rdev->fence_drv[ring].cpu_addr = rdev->uvd.cpu_addr + | ||
780 | rdev->uvd_fw->size; | ||
781 | rdev->fence_drv[ring].gpu_addr = rdev->uvd.gpu_addr + | ||
782 | rdev->uvd_fw->size; | ||
783 | } | ||
784 | |||
772 | } else { | 785 | } else { |
773 | r = radeon_scratch_get(rdev, &rdev->fence_drv[ring].scratch_reg); | 786 | r = radeon_scratch_get(rdev, &rdev->fence_drv[ring].scratch_reg); |
774 | if (r) { | 787 | if (r) { |
@@ -778,9 +791,9 @@ int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring) | |||
778 | index = RADEON_WB_SCRATCH_OFFSET + | 791 | index = RADEON_WB_SCRATCH_OFFSET + |
779 | rdev->fence_drv[ring].scratch_reg - | 792 | rdev->fence_drv[ring].scratch_reg - |
780 | rdev->scratch.reg_base; | 793 | rdev->scratch.reg_base; |
794 | rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4]; | ||
795 | rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr + index; | ||
781 | } | 796 | } |
782 | rdev->fence_drv[ring].cpu_addr = &rdev->wb.wb[index/4]; | ||
783 | rdev->fence_drv[ring].gpu_addr = rdev->wb.gpu_addr + index; | ||
784 | radeon_fence_write(rdev, atomic64_read(&rdev->fence_drv[ring].last_seq), ring); | 797 | radeon_fence_write(rdev, atomic64_read(&rdev->fence_drv[ring].last_seq), ring); |
785 | rdev->fence_drv[ring].initialized = true; | 798 | rdev->fence_drv[ring].initialized = true; |
786 | dev_info(rdev->dev, "fence driver on ring %d use gpu addr 0x%016llx and cpu addr 0x%p\n", | 799 | dev_info(rdev->dev, "fence driver on ring %d use gpu addr 0x%016llx and cpu addr 0x%p\n", |