diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 22 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 16 |
6 files changed, 30 insertions, 54 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 07ff3b1514f1..1bf36c3542c1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -672,6 +672,7 @@ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | |||
672 | struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub]; | 672 | struct amdgpu_vm_id_manager *id_mgr = &adev->vm_manager.id_mgr[vmhub]; |
673 | struct amdgpu_vm_id *id = &id_mgr->ids[vmid]; | 673 | struct amdgpu_vm_id *id = &id_mgr->ids[vmid]; |
674 | 674 | ||
675 | atomic64_set(&id->owner, 0); | ||
675 | id->gds_base = 0; | 676 | id->gds_base = 0; |
676 | id->gds_size = 0; | 677 | id->gds_size = 0; |
677 | id->gws_base = 0; | 678 | id->gws_base = 0; |
@@ -681,6 +682,26 @@ void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | |||
681 | } | 682 | } |
682 | 683 | ||
683 | /** | 684 | /** |
685 | * amdgpu_vm_reset_all_id - reset VMID to zero | ||
686 | * | ||
687 | * @adev: amdgpu device structure | ||
688 | * | ||
689 | * Reset VMID to force flush on next use | ||
690 | */ | ||
691 | void amdgpu_vm_reset_all_ids(struct amdgpu_device *adev) | ||
692 | { | ||
693 | unsigned i, j; | ||
694 | |||
695 | for (i = 0; i < AMDGPU_MAX_VMHUBS; ++i) { | ||
696 | struct amdgpu_vm_id_manager *id_mgr = | ||
697 | &adev->vm_manager.id_mgr[i]; | ||
698 | |||
699 | for (j = 1; j < id_mgr->num_ids; ++j) | ||
700 | amdgpu_vm_reset_id(adev, i, j); | ||
701 | } | ||
702 | } | ||
703 | |||
704 | /** | ||
684 | * amdgpu_vm_bo_find - find the bo_va for a specific vm & bo | 705 | * amdgpu_vm_bo_find - find the bo_va for a specific vm & bo |
685 | * | 706 | * |
686 | * @vm: requested vm | 707 | * @vm: requested vm |
@@ -2270,7 +2291,6 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev) | |||
2270 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) | 2291 | for (i = 0; i < AMDGPU_MAX_RINGS; ++i) |
2271 | adev->vm_manager.seqno[i] = 0; | 2292 | adev->vm_manager.seqno[i] = 0; |
2272 | 2293 | ||
2273 | |||
2274 | atomic_set(&adev->vm_manager.vm_pte_next_ring, 0); | 2294 | atomic_set(&adev->vm_manager.vm_pte_next_ring, 0); |
2275 | atomic64_set(&adev->vm_manager.client_counter, 0); | 2295 | atomic64_set(&adev->vm_manager.client_counter, 0); |
2276 | spin_lock_init(&adev->vm_manager.prt_lock); | 2296 | spin_lock_init(&adev->vm_manager.prt_lock); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index d97e28b4bdc4..e1d951ece433 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | |||
@@ -204,6 +204,7 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
204 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); | 204 | int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); |
205 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, | 205 | void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vmhub, |
206 | unsigned vmid); | 206 | unsigned vmid); |
207 | void amdgpu_vm_reset_all_ids(struct amdgpu_device *adev); | ||
207 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, | 208 | int amdgpu_vm_update_directories(struct amdgpu_device *adev, |
208 | struct amdgpu_vm *vm); | 209 | struct amdgpu_vm *vm); |
209 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | 210 | int amdgpu_vm_clear_freed(struct amdgpu_device *adev, |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index a572979f186c..d860939152df 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c | |||
@@ -950,10 +950,6 @@ static int gmc_v6_0_suspend(void *handle) | |||
950 | { | 950 | { |
951 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 951 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
952 | 952 | ||
953 | if (adev->vm_manager.enabled) { | ||
954 | gmc_v6_0_vm_fini(adev); | ||
955 | adev->vm_manager.enabled = false; | ||
956 | } | ||
957 | gmc_v6_0_hw_fini(adev); | 953 | gmc_v6_0_hw_fini(adev); |
958 | 954 | ||
959 | return 0; | 955 | return 0; |
@@ -968,16 +964,9 @@ static int gmc_v6_0_resume(void *handle) | |||
968 | if (r) | 964 | if (r) |
969 | return r; | 965 | return r; |
970 | 966 | ||
971 | if (!adev->vm_manager.enabled) { | 967 | amdgpu_vm_reset_all_ids(adev); |
972 | r = gmc_v6_0_vm_init(adev); | ||
973 | if (r) { | ||
974 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
975 | return r; | ||
976 | } | ||
977 | adev->vm_manager.enabled = true; | ||
978 | } | ||
979 | 968 | ||
980 | return r; | 969 | return 0; |
981 | } | 970 | } |
982 | 971 | ||
983 | static bool gmc_v6_0_is_idle(void *handle) | 972 | static bool gmc_v6_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index a9083a16a250..2750e5c23813 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | |||
@@ -1117,10 +1117,6 @@ static int gmc_v7_0_suspend(void *handle) | |||
1117 | { | 1117 | { |
1118 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1118 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1119 | 1119 | ||
1120 | if (adev->vm_manager.enabled) { | ||
1121 | gmc_v7_0_vm_fini(adev); | ||
1122 | adev->vm_manager.enabled = false; | ||
1123 | } | ||
1124 | gmc_v7_0_hw_fini(adev); | 1120 | gmc_v7_0_hw_fini(adev); |
1125 | 1121 | ||
1126 | return 0; | 1122 | return 0; |
@@ -1135,16 +1131,9 @@ static int gmc_v7_0_resume(void *handle) | |||
1135 | if (r) | 1131 | if (r) |
1136 | return r; | 1132 | return r; |
1137 | 1133 | ||
1138 | if (!adev->vm_manager.enabled) { | 1134 | amdgpu_vm_reset_all_ids(adev); |
1139 | r = gmc_v7_0_vm_init(adev); | ||
1140 | if (r) { | ||
1141 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
1142 | return r; | ||
1143 | } | ||
1144 | adev->vm_manager.enabled = true; | ||
1145 | } | ||
1146 | 1135 | ||
1147 | return r; | 1136 | return 0; |
1148 | } | 1137 | } |
1149 | 1138 | ||
1150 | static bool gmc_v7_0_is_idle(void *handle) | 1139 | static bool gmc_v7_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 4ac99784160a..f56b4089ee9f 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | |||
@@ -1209,10 +1209,6 @@ static int gmc_v8_0_suspend(void *handle) | |||
1209 | { | 1209 | { |
1210 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 1210 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
1211 | 1211 | ||
1212 | if (adev->vm_manager.enabled) { | ||
1213 | gmc_v8_0_vm_fini(adev); | ||
1214 | adev->vm_manager.enabled = false; | ||
1215 | } | ||
1216 | gmc_v8_0_hw_fini(adev); | 1212 | gmc_v8_0_hw_fini(adev); |
1217 | 1213 | ||
1218 | return 0; | 1214 | return 0; |
@@ -1227,16 +1223,9 @@ static int gmc_v8_0_resume(void *handle) | |||
1227 | if (r) | 1223 | if (r) |
1228 | return r; | 1224 | return r; |
1229 | 1225 | ||
1230 | if (!adev->vm_manager.enabled) { | 1226 | amdgpu_vm_reset_all_ids(adev); |
1231 | r = gmc_v8_0_vm_init(adev); | ||
1232 | if (r) { | ||
1233 | dev_err(adev->dev, "vm manager initialization failed (%d).\n", r); | ||
1234 | return r; | ||
1235 | } | ||
1236 | adev->vm_manager.enabled = true; | ||
1237 | } | ||
1238 | 1227 | ||
1239 | return r; | 1228 | return 0; |
1240 | } | 1229 | } |
1241 | 1230 | ||
1242 | static bool gmc_v8_0_is_idle(void *handle) | 1231 | static bool gmc_v8_0_is_idle(void *handle) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index dc1e1c1d6b24..f936332a069d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | |||
@@ -791,10 +791,6 @@ static int gmc_v9_0_suspend(void *handle) | |||
791 | { | 791 | { |
792 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 792 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
793 | 793 | ||
794 | if (adev->vm_manager.enabled) { | ||
795 | gmc_v9_0_vm_fini(adev); | ||
796 | adev->vm_manager.enabled = false; | ||
797 | } | ||
798 | gmc_v9_0_hw_fini(adev); | 794 | gmc_v9_0_hw_fini(adev); |
799 | 795 | ||
800 | return 0; | 796 | return 0; |
@@ -809,17 +805,9 @@ static int gmc_v9_0_resume(void *handle) | |||
809 | if (r) | 805 | if (r) |
810 | return r; | 806 | return r; |
811 | 807 | ||
812 | if (!adev->vm_manager.enabled) { | 808 | amdgpu_vm_reset_all_ids(adev); |
813 | r = gmc_v9_0_vm_init(adev); | ||
814 | if (r) { | ||
815 | dev_err(adev->dev, | ||
816 | "vm manager initialization failed (%d).\n", r); | ||
817 | return r; | ||
818 | } | ||
819 | adev->vm_manager.enabled = true; | ||
820 | } | ||
821 | 809 | ||
822 | return r; | 810 | return 0; |
823 | } | 811 | } |
824 | 812 | ||
825 | static bool gmc_v9_0_is_idle(void *handle) | 813 | static bool gmc_v9_0_is_idle(void *handle) |