aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMaruthi Srinivas Bayyavarapu <Maruthi.Bayyavarapu@amd.com>2016-08-30 05:46:36 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-09-12 18:12:16 -0400
commitea4a8c1d94e98693612b01908076d6133be52c6e (patch)
tree8e52ea98e91885e6320f0a93b1a85db8151cda39 /drivers/gpu
parent832c6ef765a6943edeb30db25f33c0a56560c532 (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.c63
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vid.h4
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
778static 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
788static 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
800static 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
778const struct amd_ip_funcs vce_v3_0_ip_funcs = { 811const 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
798static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = { 831static 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
846static 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
813static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev) 863static 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
821static const struct amdgpu_irq_src_funcs vce_v3_0_irq_funcs = { 878static 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