diff options
author | Christian König <christian.koenig@amd.com> | 2016-03-01 07:34:49 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-03-08 11:01:48 -0500 |
commit | cffadc83c7016ba68721affe5da537ead279e2d2 (patch) | |
tree | a022cdc4d4dc83138e8bb3c2b621875c9ba4fc41 | |
parent | 364beb2cc45247e980a097e53d0932e143873333 (diff) |
drm/amdgpu: move the GDS switch into vm flush as well
After all it's an operation on the VMID.
Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 18 |
3 files changed, 21 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 128eba604f97..b6fae4b301d7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
@@ -957,8 +957,10 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
957 | struct amdgpu_sync *sync, struct fence *fence, | 957 | struct amdgpu_sync *sync, struct fence *fence, |
958 | unsigned *vm_id, uint64_t *vm_pd_addr); | 958 | unsigned *vm_id, uint64_t *vm_pd_addr); |
959 | void amdgpu_vm_flush(struct amdgpu_ring *ring, | 959 | void amdgpu_vm_flush(struct amdgpu_ring *ring, |
960 | unsigned vmid, | 960 | unsigned vm_id, uint64_t pd_addr, |
961 | uint64_t pd_addr); | 961 | uint32_t gds_base, uint32_t gds_size, |
962 | uint32_t gws_base, uint32_t gws_size, | ||
963 | uint32_t oa_base, uint32_t oa_size); | ||
962 | uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr); | 964 | uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr); |
963 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, | 965 | int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, |
964 | struct amdgpu_vm *vm); | 966 | struct amdgpu_vm *vm); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 979c445f8096..e63e57e51db7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | |||
@@ -150,13 +150,10 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, | |||
150 | 150 | ||
151 | if (vm) { | 151 | if (vm) { |
152 | /* do context switch */ | 152 | /* do context switch */ |
153 | amdgpu_vm_flush(ring, ib->vm_id, ib->vm_pd_addr); | 153 | amdgpu_vm_flush(ring, ib->vm_id, ib->vm_pd_addr, |
154 | 154 | ib->gds_base, ib->gds_size, | |
155 | if (ring->funcs->emit_gds_switch) | 155 | ib->gws_base, ib->gws_size, |
156 | amdgpu_ring_emit_gds_switch(ring, ib->vm_id, | 156 | ib->oa_base, ib->oa_size); |
157 | ib->gds_base, ib->gds_size, | ||
158 | ib->gws_base, ib->gws_size, | ||
159 | ib->oa_base, ib->oa_size); | ||
160 | 157 | ||
161 | if (ring->funcs->emit_hdp_flush) | 158 | if (ring->funcs->emit_hdp_flush) |
162 | amdgpu_ring_emit_hdp_flush(ring); | 159 | amdgpu_ring_emit_hdp_flush(ring); |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 364db7c45c67..5fab5b25b935 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -241,19 +241,27 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, | |||
241 | * amdgpu_vm_flush - hardware flush the vm | 241 | * amdgpu_vm_flush - hardware flush the vm |
242 | * | 242 | * |
243 | * @ring: ring to use for flush | 243 | * @ring: ring to use for flush |
244 | * @vmid: vmid number to use | 244 | * @vm_id: vmid number to use |
245 | * @pd_addr: address of the page directory | 245 | * @pd_addr: address of the page directory |
246 | * | 246 | * |
247 | * Emit a VM flush when it is necessary. | 247 | * Emit a VM flush when it is necessary. |
248 | */ | 248 | */ |
249 | void amdgpu_vm_flush(struct amdgpu_ring *ring, | 249 | void amdgpu_vm_flush(struct amdgpu_ring *ring, |
250 | unsigned vmid, | 250 | unsigned vm_id, uint64_t pd_addr, |
251 | uint64_t pd_addr) | 251 | uint32_t gds_base, uint32_t gds_size, |
252 | uint32_t gws_base, uint32_t gws_size, | ||
253 | uint32_t oa_base, uint32_t oa_size) | ||
252 | { | 254 | { |
253 | if (pd_addr != AMDGPU_VM_NO_FLUSH) { | 255 | if (pd_addr != AMDGPU_VM_NO_FLUSH) { |
254 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vmid); | 256 | trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id); |
255 | amdgpu_ring_emit_vm_flush(ring, vmid, pd_addr); | 257 | amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr); |
256 | } | 258 | } |
259 | |||
260 | if (ring->funcs->emit_gds_switch) | ||
261 | amdgpu_ring_emit_gds_switch(ring, vm_id, | ||
262 | gds_base, gds_size, | ||
263 | gws_base, gws_size, | ||
264 | oa_base, oa_size); | ||
257 | } | 265 | } |
258 | 266 | ||
259 | /** | 267 | /** |