diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -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) |
