Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: move VM fields into job

They are the same for all IBs.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
d88bf583 92f25098

+66 -66
+8 -7
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 283 283 int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx); 284 284 /* command emit functions */ 285 285 void (*emit_ib)(struct amdgpu_ring *ring, 286 - struct amdgpu_ib *ib, bool ctx_switch); 286 + struct amdgpu_ib *ib, 287 + unsigned vm_id, bool ctx_switch); 287 288 void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr, 288 289 uint64_t seq, unsigned flags); 289 290 void (*emit_pipeline_sync)(struct amdgpu_ring *ring); ··· 742 741 uint64_t gpu_addr; 743 742 uint32_t *ptr; 744 743 struct amdgpu_user_fence *user; 745 - unsigned vm_id; 746 - uint64_t vm_pd_addr; 747 - uint32_t gds_base, gds_size; 748 - uint32_t gws_base, gws_size; 749 - uint32_t oa_base, oa_size; 750 744 uint32_t flags; 751 745 /* resulting sequence number */ 752 746 uint64_t sequence; ··· 1258 1262 uint32_t num_ibs; 1259 1263 void *owner; 1260 1264 uint64_t ctx; 1265 + unsigned vm_id; 1266 + uint64_t vm_pd_addr; 1267 + uint32_t gds_base, gds_size; 1268 + uint32_t gws_base, gws_size; 1269 + uint32_t oa_base, oa_size; 1261 1270 struct amdgpu_user_fence uf; 1262 1271 }; 1263 1272 #define to_amdgpu_job(sched_job) \ ··· 2222 2221 #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r)) 2223 2222 #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r)) 2224 2223 #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r)) 2225 - #define amdgpu_ring_emit_ib(r, ib, c) (r)->funcs->emit_ib((r), (ib), (c)) 2224 + #define amdgpu_ring_emit_ib(r, ib, vm_id, c) (r)->funcs->emit_ib((r), (ib), (vm_id), (c)) 2226 2225 #define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r)) 2227 2226 #define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr)) 2228 2227 #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
+16 -20
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 473 473 goto error_validate; 474 474 475 475 if (p->bo_list) { 476 + struct amdgpu_bo *gds = p->bo_list->gds_obj; 477 + struct amdgpu_bo *gws = p->bo_list->gws_obj; 478 + struct amdgpu_bo *oa = p->bo_list->oa_obj; 476 479 struct amdgpu_vm *vm = &fpriv->vm; 477 480 unsigned i; 478 481 ··· 483 480 struct amdgpu_bo *bo = p->bo_list->array[i].robj; 484 481 485 482 p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo); 483 + } 484 + 485 + if (gds) { 486 + p->job->gds_base = amdgpu_bo_gpu_offset(gds); 487 + p->job->gds_size = amdgpu_bo_size(gds); 488 + } 489 + if (gws) { 490 + p->job->gws_base = amdgpu_bo_gpu_offset(gws); 491 + p->job->gws_size = amdgpu_bo_size(gws); 492 + } 493 + if (oa) { 494 + p->job->oa_base = amdgpu_bo_gpu_offset(oa); 495 + p->job->oa_size = amdgpu_bo_size(oa); 486 496 } 487 497 } 488 498 ··· 760 744 j++; 761 745 } 762 746 763 - /* add GDS resources to first IB */ 764 - if (parser->bo_list) { 765 - struct amdgpu_bo *gds = parser->bo_list->gds_obj; 766 - struct amdgpu_bo *gws = parser->bo_list->gws_obj; 767 - struct amdgpu_bo *oa = parser->bo_list->oa_obj; 768 - struct amdgpu_ib *ib = &parser->job->ibs[0]; 769 - 770 - if (gds) { 771 - ib->gds_base = amdgpu_bo_gpu_offset(gds); 772 - ib->gds_size = amdgpu_bo_size(gds); 773 - } 774 - if (gws) { 775 - ib->gws_base = amdgpu_bo_gpu_offset(gws); 776 - ib->gws_size = amdgpu_bo_size(gws); 777 - } 778 - if (oa) { 779 - ib->oa_base = amdgpu_bo_gpu_offset(oa); 780 - ib->oa_size = amdgpu_bo_size(oa); 781 - } 782 - } 783 747 /* wrap the last IB with user fence */ 784 748 if (parser->job->uf.bo) { 785 749 struct amdgpu_ib *ib = &parser->job->ibs[parser->job->num_ibs - 1];
+9 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
··· 74 74 ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); 75 75 } 76 76 77 - ib->vm_id = 0; 78 - 79 77 return 0; 80 78 } 81 79 ··· 145 147 return -EINVAL; 146 148 } 147 149 148 - if (vm && !ibs->vm_id) { 150 + if (vm && !job->vm_id) { 149 151 dev_err(adev->dev, "VM IB without ID\n"); 150 152 return -EINVAL; 151 153 } ··· 160 162 patch_offset = amdgpu_ring_init_cond_exec(ring); 161 163 162 164 if (vm) { 163 - r = amdgpu_vm_flush(ring, ib->vm_id, ib->vm_pd_addr, 164 - ib->gds_base, ib->gds_size, 165 - ib->gws_base, ib->gws_size, 166 - ib->oa_base, ib->oa_size); 165 + r = amdgpu_vm_flush(ring, job->vm_id, job->vm_pd_addr, 166 + job->gds_base, job->gds_size, 167 + job->gws_base, job->gws_size, 168 + job->oa_base, job->oa_size); 167 169 if (r) { 168 170 amdgpu_ring_undo(ring); 169 171 return r; ··· 185 187 if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && skip_preamble) 186 188 continue; 187 189 188 - amdgpu_ring_emit_ib(ring, ib, need_ctx_switch); 190 + amdgpu_ring_emit_ib(ring, ib, job ? job->vm_id : 0, 191 + need_ctx_switch); 189 192 need_ctx_switch = false; 190 193 } 191 194 ··· 196 197 r = amdgpu_fence_emit(ring, &hwf); 197 198 if (r) { 198 199 dev_err(adev->dev, "failed to emit fence (%d)\n", r); 199 - if (ib->vm_id) 200 - amdgpu_vm_reset_id(adev, ib->vm_id); 200 + if (job && job->vm_id) 201 + amdgpu_vm_reset_id(adev, job->vm_id); 201 202 amdgpu_ring_undo(ring); 202 203 return r; 203 204 }
+2 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
··· 142 142 143 143 struct fence *fence = amdgpu_sync_get_fence(&job->sync); 144 144 145 - if (fence == NULL && vm && !job->ibs->vm_id) { 145 + if (fence == NULL && vm && !job->vm_id) { 146 146 struct amdgpu_ring *ring = job->ring; 147 - unsigned i, vm_id; 148 - uint64_t vm_pd_addr; 149 147 int r; 150 148 151 149 r = amdgpu_vm_grab_id(vm, ring, &job->sync, 152 150 &job->base.s_fence->base, 153 - &vm_id, &vm_pd_addr); 151 + &job->vm_id, &job->vm_pd_addr); 154 152 if (r) 155 153 DRM_ERROR("Error getting VM ID (%d)\n", r); 156 - else { 157 - for (i = 0; i < job->num_ibs; ++i) { 158 - job->ibs[i].vm_id = vm_id; 159 - job->ibs[i].vm_pd_addr = vm_pd_addr; 160 - } 161 - } 162 154 163 155 fence = amdgpu_sync_get_fence(&job->sync); 164 156 }
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 762 762 * @ib: the IB to execute 763 763 * 764 764 */ 765 - void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, bool ctx_switch) 765 + void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, 766 + unsigned vm_id, bool ctx_switch) 766 767 { 767 768 amdgpu_ring_write(ring, VCE_CMD_IB); 768 769 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
··· 34 34 bool direct, struct fence **fence); 35 35 void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); 36 36 int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); 37 - void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, bool ctx_switch); 37 + void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, 38 + unsigned vm_id, bool ctx_switch); 38 39 void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 39 40 unsigned flags); 40 41 int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
+3 -2
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 210 210 * Schedule an IB in the DMA ring (CIK). 211 211 */ 212 212 static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring, 213 - struct amdgpu_ib *ib, bool ctx_switch) 213 + struct amdgpu_ib *ib, 214 + unsigned vm_id, bool ctx_switch) 214 215 { 215 - u32 extra_bits = ib->vm_id & 0xf; 216 + u32 extra_bits = vm_id & 0xf; 216 217 u32 next_rptr = ring->wptr + 5; 217 218 218 219 while ((next_rptr & 7) != 4)
+6 -4
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 2030 2030 * on the gfx ring for execution by the GPU. 2031 2031 */ 2032 2032 static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, 2033 - struct amdgpu_ib *ib, bool ctx_switch) 2033 + struct amdgpu_ib *ib, 2034 + unsigned vm_id, bool ctx_switch) 2034 2035 { 2035 2036 u32 header, control = 0; 2036 2037 u32 next_rptr = ring->wptr + 5; ··· 2057 2056 else 2058 2057 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); 2059 2058 2060 - control |= ib->length_dw | (ib->vm_id << 24); 2059 + control |= ib->length_dw | (vm_id << 24); 2061 2060 2062 2061 amdgpu_ring_write(ring, header); 2063 2062 amdgpu_ring_write(ring, ··· 2070 2069 } 2071 2070 2072 2071 static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring, 2073 - struct amdgpu_ib *ib, bool ctx_switch) 2072 + struct amdgpu_ib *ib, 2073 + unsigned vm_id, bool ctx_switch) 2074 2074 { 2075 2075 u32 header, control = 0; 2076 2076 u32 next_rptr = ring->wptr + 5; ··· 2086 2084 2087 2085 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); 2088 2086 2089 - control |= ib->length_dw | (ib->vm_id << 24); 2087 + control |= ib->length_dw | (vm_id << 24); 2090 2088 2091 2089 amdgpu_ring_write(ring, header); 2092 2090 amdgpu_ring_write(ring,
+6 -4
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 5646 5646 } 5647 5647 5648 5648 static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring, 5649 - struct amdgpu_ib *ib, bool ctx_switch) 5649 + struct amdgpu_ib *ib, 5650 + unsigned vm_id, bool ctx_switch) 5650 5651 { 5651 5652 u32 header, control = 0; 5652 5653 u32 next_rptr = ring->wptr + 5; ··· 5673 5672 else 5674 5673 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); 5675 5674 5676 - control |= ib->length_dw | (ib->vm_id << 24); 5675 + control |= ib->length_dw | (vm_id << 24); 5677 5676 5678 5677 amdgpu_ring_write(ring, header); 5679 5678 amdgpu_ring_write(ring, ··· 5686 5685 } 5687 5686 5688 5687 static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring, 5689 - struct amdgpu_ib *ib, bool ctx_switch) 5688 + struct amdgpu_ib *ib, 5689 + unsigned vm_id, bool ctx_switch) 5690 5690 { 5691 5691 u32 header, control = 0; 5692 5692 u32 next_rptr = ring->wptr + 5; ··· 5703 5701 5704 5702 header = PACKET3(PACKET3_INDIRECT_BUFFER, 2); 5705 5703 5706 - control |= ib->length_dw | (ib->vm_id << 24); 5704 + control |= ib->length_dw | (vm_id << 24); 5707 5705 5708 5706 amdgpu_ring_write(ring, header); 5709 5707 amdgpu_ring_write(ring,
+3 -2
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 242 242 * Schedule an IB in the DMA ring (VI). 243 243 */ 244 244 static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring, 245 - struct amdgpu_ib *ib, bool ctx_switch) 245 + struct amdgpu_ib *ib, 246 + unsigned vm_id, bool ctx_switch) 246 247 { 247 - u32 vmid = ib->vm_id & 0xf; 248 + u32 vmid = vm_id & 0xf; 248 249 u32 next_rptr = ring->wptr + 5; 249 250 250 251 while ((next_rptr & 7) != 2)
+3 -2
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
··· 400 400 * Schedule an IB in the DMA ring (VI). 401 401 */ 402 402 static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring, 403 - struct amdgpu_ib *ib, bool ctx_switch) 403 + struct amdgpu_ib *ib, 404 + unsigned vm_id, bool ctx_switch) 404 405 { 405 - u32 vmid = ib->vm_id & 0xf; 406 + u32 vmid = vm_id & 0xf; 406 407 u32 next_rptr = ring->wptr + 5; 407 408 408 409 while ((next_rptr & 7) != 2)
+2 -1
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
··· 489 489 * Write ring commands to execute the indirect buffer 490 490 */ 491 491 static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring, 492 - struct amdgpu_ib *ib, bool ctx_switch) 492 + struct amdgpu_ib *ib, 493 + unsigned vm_id, bool ctx_switch) 493 494 { 494 495 amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_BASE, 0)); 495 496 amdgpu_ring_write(ring, ib->gpu_addr);
+2 -1
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
··· 539 539 * Write ring commands to execute the indirect buffer 540 540 */ 541 541 static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring, 542 - struct amdgpu_ib *ib, bool ctx_switch) 542 + struct amdgpu_ib *ib, 543 + unsigned vm_id, bool ctx_switch) 543 544 { 544 545 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0)); 545 546 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
+2 -1
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 631 631 * Write ring commands to execute the indirect buffer 632 632 */ 633 633 static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring, 634 - struct amdgpu_ib *ib, bool ctx_switch) 634 + struct amdgpu_ib *ib, 635 + unsigned vm_id, bool ctx_switch) 635 636 { 636 637 amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0)); 637 638 amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));