diff options
author | Maruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu@amd.com> | 2016-08-30 05:46:36 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-09-12 18:12:16 -0400 |
commit | ea4a8c1d94e98693612b01908076d6133be52c6e (patch) | |
tree | 8e52ea98e91885e6320f0a93b1a85db8151cda39 /drivers/gpu | |
parent | 832c6ef765a6943edeb30db25f33c0a56560c532 (diff) |
drm/amdgpu: add VCE VM mode support
This adds VCE VM mode support from Stoney onwards. Session tracking
is an open issue, yet to be supported.
v2: Fixed warnings from checkpatch.pl
Signed-off-by: Maruthi Bayyavarapu <maruthi.bayyavarapu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | 63 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vid.h | 4 |
2 files changed, 64 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index b083c369accb..a55ddc092a9a 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c | |||
@@ -775,6 +775,39 @@ static int vce_v3_0_set_powergating_state(void *handle, | |||
775 | return vce_v3_0_start(adev); | 775 | return vce_v3_0_start(adev); |
776 | } | 776 | } |
777 | 777 | ||
778 | static void vce_v3_0_ring_emit_ib(struct amdgpu_ring *ring, | ||
779 | struct amdgpu_ib *ib, unsigned int vm_id, bool ctx_switch) | ||
780 | { | ||
781 | amdgpu_ring_write(ring, VCE_CMD_IB_VM); | ||
782 | amdgpu_ring_write(ring, vm_id); | ||
783 | amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); | ||
784 | amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr)); | ||
785 | amdgpu_ring_write(ring, ib->length_dw); | ||
786 | } | ||
787 | |||
788 | static void vce_v3_0_emit_vm_flush(struct amdgpu_ring *ring, | ||
789 | unsigned int vm_id, uint64_t pd_addr) | ||
790 | { | ||
791 | amdgpu_ring_write(ring, VCE_CMD_UPDATE_PTB); | ||
792 | amdgpu_ring_write(ring, vm_id); | ||
793 | amdgpu_ring_write(ring, pd_addr >> 12); | ||
794 | |||
795 | amdgpu_ring_write(ring, VCE_CMD_FLUSH_TLB); | ||
796 | amdgpu_ring_write(ring, vm_id); | ||
797 | amdgpu_ring_write(ring, VCE_CMD_END); | ||
798 | } | ||
799 | |||
800 | static void vce_v3_0_emit_pipeline_sync(struct amdgpu_ring *ring) | ||
801 | { | ||
802 | uint32_t seq = ring->fence_drv.sync_seq; | ||
803 | uint64_t addr = ring->fence_drv.gpu_addr; | ||
804 | |||
805 | amdgpu_ring_write(ring, VCE_CMD_WAIT_GE); | ||
806 | amdgpu_ring_write(ring, lower_32_bits(addr)); | ||
807 | amdgpu_ring_write(ring, upper_32_bits(addr)); | ||
808 | amdgpu_ring_write(ring, seq); | ||
809 | } | ||
810 | |||
778 | const struct amd_ip_funcs vce_v3_0_ip_funcs = { | 811 | const struct amd_ip_funcs vce_v3_0_ip_funcs = { |
779 | .name = "vce_v3_0", | 812 | .name = "vce_v3_0", |
780 | .early_init = vce_v3_0_early_init, | 813 | .early_init = vce_v3_0_early_init, |
@@ -795,7 +828,7 @@ const struct amd_ip_funcs vce_v3_0_ip_funcs = { | |||
795 | .set_powergating_state = vce_v3_0_set_powergating_state, | 828 | .set_powergating_state = vce_v3_0_set_powergating_state, |
796 | }; | 829 | }; |
797 | 830 | ||
798 | static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = { | 831 | static const struct amdgpu_ring_funcs vce_v3_0_ring_phys_funcs = { |
799 | .get_rptr = vce_v3_0_ring_get_rptr, | 832 | .get_rptr = vce_v3_0_ring_get_rptr, |
800 | .get_wptr = vce_v3_0_ring_get_wptr, | 833 | .get_wptr = vce_v3_0_ring_get_wptr, |
801 | .set_wptr = vce_v3_0_ring_set_wptr, | 834 | .set_wptr = vce_v3_0_ring_set_wptr, |
@@ -810,12 +843,36 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = { | |||
810 | .end_use = amdgpu_vce_ring_end_use, | 843 | .end_use = amdgpu_vce_ring_end_use, |
811 | }; | 844 | }; |
812 | 845 | ||
846 | static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { | ||
847 | .get_rptr = vce_v3_0_ring_get_rptr, | ||
848 | .get_wptr = vce_v3_0_ring_get_wptr, | ||
849 | .set_wptr = vce_v3_0_ring_set_wptr, | ||
850 | .parse_cs = NULL, | ||
851 | .emit_ib = vce_v3_0_ring_emit_ib, | ||
852 | .emit_vm_flush = vce_v3_0_emit_vm_flush, | ||
853 | .emit_pipeline_sync = vce_v3_0_emit_pipeline_sync, | ||
854 | .emit_fence = amdgpu_vce_ring_emit_fence, | ||
855 | .test_ring = amdgpu_vce_ring_test_ring, | ||
856 | .test_ib = amdgpu_vce_ring_test_ib, | ||
857 | .insert_nop = amdgpu_ring_insert_nop, | ||
858 | .pad_ib = amdgpu_ring_generic_pad_ib, | ||
859 | .begin_use = amdgpu_vce_ring_begin_use, | ||
860 | .end_use = amdgpu_vce_ring_end_use, | ||
861 | }; | ||
862 | |||
813 | static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev) | 863 | static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev) |
814 | { | 864 | { |
815 | int i; | 865 | int i; |
816 | 866 | ||
817 | for (i = 0; i < adev->vce.num_rings; i++) | 867 | if (adev->asic_type >= CHIP_STONEY) { |
818 | adev->vce.ring[i].funcs = &vce_v3_0_ring_funcs; | 868 | for (i = 0; i < adev->vce.num_rings; i++) |
869 | adev->vce.ring[i].funcs = &vce_v3_0_ring_vm_funcs; | ||
870 | DRM_INFO("VCE enabled in VM mode\n"); | ||
871 | } else { | ||
872 | for (i = 0; i < adev->vce.num_rings; i++) | ||
873 | adev->vce.ring[i].funcs = &vce_v3_0_ring_phys_funcs; | ||
874 | DRM_INFO("VCE enabled in physical mode\n"); | ||
875 | } | ||
819 | } | 876 | } |
820 | 877 | ||
821 | static const struct amdgpu_irq_src_funcs vce_v3_0_irq_funcs = { | 878 | static const struct amdgpu_irq_src_funcs vce_v3_0_irq_funcs = { |
diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h index 062ee1676480..f62b261660d4 100644 --- a/drivers/gpu/drm/amd/amdgpu/vid.h +++ b/drivers/gpu/drm/amd/amdgpu/vid.h | |||
@@ -369,4 +369,8 @@ | |||
369 | #define VCE_CMD_IB_AUTO 0x00000005 | 369 | #define VCE_CMD_IB_AUTO 0x00000005 |
370 | #define VCE_CMD_SEMAPHORE 0x00000006 | 370 | #define VCE_CMD_SEMAPHORE 0x00000006 |
371 | 371 | ||
372 | #define VCE_CMD_IB_VM 0x00000102 | ||
373 | #define VCE_CMD_WAIT_GE 0x00000106 | ||
374 | #define VCE_CMD_UPDATE_PTB 0x00000107 | ||
375 | #define VCE_CMD_FLUSH_TLB 0x00000108 | ||
372 | #endif | 376 | #endif |