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

amd/amdgpu: add sched array to IPs with multiple run-queues

This sched array can be passed on to entity creation routine
instead of manually creating such sched array on every context creation.

v2: squash in missing break fix

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

authored by

Nirmoy Das and committed by
Alex Deucher
f880799d 0c88b430

+89 -46
+69 -44
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 74 74 struct amdgpu_ctx *ctx) 75 75 { 76 76 unsigned num_entities = amdgpu_ctx_total_num_entities(); 77 - unsigned i, j, k; 77 + unsigned i, j; 78 78 int r; 79 79 80 80 if (priority < 0 || priority >= DRM_SCHED_PRIORITY_MAX) ··· 121 121 ctx->override_priority = DRM_SCHED_PRIORITY_UNSET; 122 122 123 123 for (i = 0; i < AMDGPU_HW_IP_NUM; ++i) { 124 - struct amdgpu_ring *rings[AMDGPU_MAX_RINGS]; 125 - struct drm_gpu_scheduler *sched_list[AMDGPU_MAX_RINGS]; 126 - unsigned num_rings = 0; 127 - unsigned num_rqs = 0; 124 + struct drm_gpu_scheduler **scheds; 125 + struct drm_gpu_scheduler *sched; 126 + unsigned num_scheds = 0; 128 127 129 128 switch (i) { 130 129 case AMDGPU_HW_IP_GFX: 131 - rings[0] = &adev->gfx.gfx_ring[0]; 132 - num_rings = 1; 130 + scheds = adev->gfx.gfx_sched; 131 + num_scheds = 1; 133 132 break; 134 133 case AMDGPU_HW_IP_COMPUTE: 135 - for (j = 0; j < adev->gfx.num_compute_rings; ++j) 136 - rings[j] = &adev->gfx.compute_ring[j]; 137 - num_rings = adev->gfx.num_compute_rings; 134 + scheds = adev->gfx.compute_sched; 135 + num_scheds = adev->gfx.num_compute_sched; 138 136 break; 139 137 case AMDGPU_HW_IP_DMA: 140 - for (j = 0; j < adev->sdma.num_instances; ++j) 141 - rings[j] = &adev->sdma.instance[j].ring; 142 - num_rings = adev->sdma.num_instances; 138 + scheds = adev->sdma.sdma_sched; 139 + num_scheds = adev->sdma.num_sdma_sched; 143 140 break; 144 141 case AMDGPU_HW_IP_UVD: 145 - rings[0] = &adev->uvd.inst[0].ring; 146 - num_rings = 1; 142 + sched = &adev->uvd.inst[0].ring.sched; 143 + scheds = &sched; 144 + num_scheds = 1; 147 145 break; 148 146 case AMDGPU_HW_IP_VCE: 149 - rings[0] = &adev->vce.ring[0]; 150 - num_rings = 1; 147 + sched = &adev->vce.ring[0].sched; 148 + scheds = &sched; 149 + num_scheds = 1; 151 150 break; 152 151 case AMDGPU_HW_IP_UVD_ENC: 153 - rings[0] = &adev->uvd.inst[0].ring_enc[0]; 154 - num_rings = 1; 152 + sched = &adev->uvd.inst[0].ring_enc[0].sched; 153 + scheds = &sched; 154 + num_scheds = 1; 155 155 break; 156 156 case AMDGPU_HW_IP_VCN_DEC: 157 - for (j = 0; j < adev->vcn.num_vcn_inst; ++j) { 158 - if (adev->vcn.harvest_config & (1 << j)) 159 - continue; 160 - rings[num_rings++] = &adev->vcn.inst[j].ring_dec; 161 - } 157 + scheds = adev->vcn.vcn_dec_sched; 158 + num_scheds = adev->vcn.num_vcn_dec_sched; 162 159 break; 163 160 case AMDGPU_HW_IP_VCN_ENC: 164 - for (j = 0; j < adev->vcn.num_vcn_inst; ++j) { 165 - if (adev->vcn.harvest_config & (1 << j)) 166 - continue; 167 - for (k = 0; k < adev->vcn.num_enc_rings; ++k) 168 - rings[num_rings++] = &adev->vcn.inst[j].ring_enc[k]; 169 - } 161 + scheds = adev->vcn.vcn_enc_sched; 162 + num_scheds = adev->vcn.num_vcn_enc_sched; 170 163 break; 171 164 case AMDGPU_HW_IP_VCN_JPEG: 172 - for (j = 0; j < adev->jpeg.num_jpeg_inst; ++j) { 173 - if (adev->jpeg.harvest_config & (1 << j)) 174 - continue; 175 - rings[num_rings++] = &adev->jpeg.inst[j].ring_dec; 176 - } 165 + scheds = adev->jpeg.jpeg_sched; 166 + num_scheds = adev->jpeg.num_jpeg_sched; 177 167 break; 178 - } 179 - 180 - for (j = 0; j < num_rings; ++j) { 181 - if (!rings[j]->adev) 182 - continue; 183 - 184 - sched_list[num_rqs++] = &rings[j]->sched; 185 168 } 186 169 187 170 for (j = 0; j < amdgpu_ctx_num_entities[i]; ++j) 188 171 r = drm_sched_entity_init(&ctx->entities[i][j].entity, 189 - priority, sched_list, 190 - num_rqs, &ctx->guilty); 172 + priority, scheds, 173 + num_scheds, &ctx->guilty); 191 174 if (r) 192 175 goto error_cleanup_entities; 193 176 } ··· 610 627 611 628 idr_destroy(&mgr->ctx_handles); 612 629 mutex_destroy(&mgr->lock); 630 + } 631 + 632 + void amdgpu_ctx_init_sched(struct amdgpu_device *adev) 633 + { 634 + int i, j; 635 + 636 + for (i = 0; i < adev->gfx.num_gfx_rings; i++) { 637 + adev->gfx.gfx_sched[i] = &adev->gfx.gfx_ring[i].sched; 638 + adev->gfx.num_gfx_sched++; 639 + } 640 + 641 + for (i = 0; i < adev->gfx.num_compute_rings; i++) { 642 + adev->gfx.compute_sched[i] = &adev->gfx.compute_ring[i].sched; 643 + adev->gfx.num_compute_sched++; 644 + } 645 + 646 + for (i = 0; i < adev->sdma.num_instances; i++) { 647 + adev->sdma.sdma_sched[i] = &adev->sdma.instance[i].ring.sched; 648 + adev->sdma.num_sdma_sched++; 649 + } 650 + 651 + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 652 + if (adev->vcn.harvest_config & (1 << i)) 653 + continue; 654 + adev->vcn.vcn_dec_sched[adev->vcn.num_vcn_dec_sched++] = 655 + &adev->vcn.inst[i].ring_dec.sched; 656 + } 657 + 658 + for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 659 + if (adev->vcn.harvest_config & (1 << i)) 660 + continue; 661 + for (j = 0; j < adev->vcn.num_enc_rings; ++j) 662 + adev->vcn.vcn_enc_sched[adev->vcn.num_vcn_enc_sched++] = 663 + &adev->vcn.inst[i].ring_enc[j].sched; 664 + } 665 + 666 + for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 667 + if (adev->jpeg.harvest_config & (1 << i)) 668 + continue; 669 + adev->jpeg.jpeg_sched[adev->jpeg.num_jpeg_sched++] = 670 + &adev->jpeg.inst[i].ring_dec.sched; 671 + } 613 672 }
+3
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h
··· 87 87 long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout); 88 88 void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr); 89 89 90 + void amdgpu_ctx_init_sched(struct amdgpu_device *adev); 91 + 92 + 90 93 #endif
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 3036 3036 adev->gfx.config.max_cu_per_sh, 3037 3037 adev->gfx.cu_info.number); 3038 3038 3039 + amdgpu_ctx_init_sched(adev); 3040 + 3039 3041 adev->accel_working = true; 3040 3042 3041 3043 amdgpu_vm_check_compute_bug(adev);
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
··· 269 269 bool me_fw_write_wait; 270 270 bool cp_fw_write_wait; 271 271 struct amdgpu_ring gfx_ring[AMDGPU_MAX_GFX_RINGS]; 272 + struct drm_gpu_scheduler *gfx_sched[AMDGPU_MAX_GFX_RINGS]; 273 + uint32_t num_gfx_sched; 272 274 unsigned num_gfx_rings; 273 275 struct amdgpu_ring compute_ring[AMDGPU_MAX_COMPUTE_RINGS]; 276 + struct drm_gpu_scheduler *compute_sched[AMDGPU_MAX_COMPUTE_RINGS]; 277 + uint32_t num_compute_sched; 274 278 unsigned num_compute_rings; 275 279 struct amdgpu_irq_src eop_irq; 276 280 struct amdgpu_irq_src priv_reg_irq;
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h
··· 43 43 uint8_t num_jpeg_inst; 44 44 struct amdgpu_jpeg_inst inst[AMDGPU_MAX_JPEG_INSTANCES]; 45 45 struct amdgpu_jpeg_reg internal; 46 + struct drm_gpu_scheduler *jpeg_sched[AMDGPU_MAX_JPEG_INSTANCES]; 47 + uint32_t num_jpeg_sched; 46 48 unsigned harvest_config; 47 49 struct delayed_work idle_work; 48 50 enum amd_powergating_state cur_state;
+2
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
··· 52 52 53 53 struct amdgpu_sdma { 54 54 struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES]; 55 + struct drm_gpu_scheduler *sdma_sched[AMDGPU_MAX_SDMA_INSTANCES]; 56 + uint32_t num_sdma_sched; 55 57 struct amdgpu_irq_src trap_irq; 56 58 struct amdgpu_irq_src illegal_inst_irq; 57 59 struct amdgpu_irq_src ecc_irq;
+7 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
··· 31 31 #define AMDGPU_VCN_MAX_ENC_RINGS 3 32 32 33 33 #define AMDGPU_MAX_VCN_INSTANCES 2 34 + #define AMDGPU_MAX_VCN_ENC_RINGS AMDGPU_VCN_MAX_ENC_RINGS * AMDGPU_MAX_VCN_INSTANCES 34 35 35 36 #define AMDGPU_VCN_HARVEST_VCN0 (1 << 0) 36 37 #define AMDGPU_VCN_HARVEST_VCN1 (1 << 1) ··· 190 189 uint32_t *dpg_sram_curr_addr; 191 190 192 191 uint8_t num_vcn_inst; 193 - struct amdgpu_vcn_inst inst[AMDGPU_MAX_VCN_INSTANCES]; 194 - struct amdgpu_vcn_reg internal; 192 + struct amdgpu_vcn_inst inst[AMDGPU_MAX_VCN_INSTANCES]; 193 + struct amdgpu_vcn_reg internal; 194 + struct drm_gpu_scheduler *vcn_enc_sched[AMDGPU_MAX_VCN_ENC_RINGS]; 195 + struct drm_gpu_scheduler *vcn_dec_sched[AMDGPU_MAX_VCN_INSTANCES]; 196 + uint32_t num_vcn_enc_sched; 197 + uint32_t num_vcn_dec_sched; 195 198 196 199 unsigned harvest_config; 197 200 int (*pause_dpg_mode)(struct amdgpu_device *adev,