@@ -135,9 +135,11 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
135135 idr_init (& adev -> mes .queue_id_idr );
136136 ida_init (& adev -> mes .doorbell_ida );
137137 spin_lock_init (& adev -> mes .queue_id_lock );
138- spin_lock_init (& adev -> mes .ring_lock );
139138 mutex_init (& adev -> mes .mutex_hidden );
140139
140+ for (i = 0 ; i < AMDGPU_MAX_MES_PIPES ; i ++ )
141+ spin_lock_init (& adev -> mes .ring_lock [i ]);
142+
141143 adev -> mes .total_max_queue = AMDGPU_FENCE_MES_QUEUE_ID_MASK ;
142144 adev -> mes .vmid_mask_mmhub = 0xffffff00 ;
143145 adev -> mes .vmid_mask_gfxhub = 0xffffff00 ;
@@ -163,36 +165,38 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
163165 adev -> mes .sdma_hqd_mask [i ] = 0xfc ;
164166 }
165167
166- r = amdgpu_device_wb_get (adev , & adev -> mes .sch_ctx_offs );
167- if (r ) {
168- dev_err (adev -> dev ,
169- "(%d) ring trail_fence_offs wb alloc failed\n" , r );
170- goto error_ids ;
171- }
172- adev -> mes .sch_ctx_gpu_addr =
173- adev -> wb .gpu_addr + (adev -> mes .sch_ctx_offs * 4 );
174- adev -> mes .sch_ctx_ptr =
175- (uint64_t * )& adev -> wb .wb [adev -> mes .sch_ctx_offs ];
168+ for (i = 0 ; i < AMDGPU_MAX_MES_PIPES ; i ++ ) {
169+ r = amdgpu_device_wb_get (adev , & adev -> mes .sch_ctx_offs [i ]);
170+ if (r ) {
171+ dev_err (adev -> dev ,
172+ "(%d) ring trail_fence_offs wb alloc failed\n" ,
173+ r );
174+ goto error ;
175+ }
176+ adev -> mes .sch_ctx_gpu_addr [i ] =
177+ adev -> wb .gpu_addr + (adev -> mes .sch_ctx_offs [i ] * 4 );
178+ adev -> mes .sch_ctx_ptr [i ] =
179+ (uint64_t * )& adev -> wb .wb [adev -> mes .sch_ctx_offs [i ]];
176180
177- r = amdgpu_device_wb_get (adev , & adev -> mes .query_status_fence_offs );
178- if (r ) {
179- amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs );
180- dev_err (adev -> dev ,
181- "(%d) query_status_fence_offs wb alloc failed\n" , r );
182- goto error_ids ;
181+ r = amdgpu_device_wb_get (adev ,
182+ & adev -> mes .query_status_fence_offs [i ]);
183+ if (r ) {
184+ dev_err (adev -> dev ,
185+ "(%d) query_status_fence_offs wb alloc failed\n" ,
186+ r );
187+ goto error ;
188+ }
189+ adev -> mes .query_status_fence_gpu_addr [i ] = adev -> wb .gpu_addr +
190+ (adev -> mes .query_status_fence_offs [i ] * 4 );
191+ adev -> mes .query_status_fence_ptr [i ] =
192+ (uint64_t * )& adev -> wb .wb [adev -> mes .query_status_fence_offs [i ]];
183193 }
184- adev -> mes .query_status_fence_gpu_addr =
185- adev -> wb .gpu_addr + (adev -> mes .query_status_fence_offs * 4 );
186- adev -> mes .query_status_fence_ptr =
187- (uint64_t * )& adev -> wb .wb [adev -> mes .query_status_fence_offs ];
188194
189195 r = amdgpu_device_wb_get (adev , & adev -> mes .read_val_offs );
190196 if (r ) {
191- amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs );
192- amdgpu_device_wb_free (adev , adev -> mes .query_status_fence_offs );
193197 dev_err (adev -> dev ,
194198 "(%d) read_val_offs alloc failed\n" , r );
195- goto error_ids ;
199+ goto error ;
196200 }
197201 adev -> mes .read_val_gpu_addr =
198202 adev -> wb .gpu_addr + (adev -> mes .read_val_offs * 4 );
@@ -212,10 +216,16 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
212216error_doorbell :
213217 amdgpu_mes_doorbell_free (adev );
214218error :
215- amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs );
216- amdgpu_device_wb_free (adev , adev -> mes .query_status_fence_offs );
217- amdgpu_device_wb_free (adev , adev -> mes .read_val_offs );
218- error_ids :
219+ for (i = 0 ; i < AMDGPU_MAX_MES_PIPES ; i ++ ) {
220+ if (adev -> mes .sch_ctx_ptr [i ])
221+ amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs [i ]);
222+ if (adev -> mes .query_status_fence_ptr [i ])
223+ amdgpu_device_wb_free (adev ,
224+ adev -> mes .query_status_fence_offs [i ]);
225+ }
226+ if (adev -> mes .read_val_ptr )
227+ amdgpu_device_wb_free (adev , adev -> mes .read_val_offs );
228+
219229 idr_destroy (& adev -> mes .pasid_idr );
220230 idr_destroy (& adev -> mes .gang_id_idr );
221231 idr_destroy (& adev -> mes .queue_id_idr );
@@ -226,13 +236,22 @@ int amdgpu_mes_init(struct amdgpu_device *adev)
226236
227237void amdgpu_mes_fini (struct amdgpu_device * adev )
228238{
239+ int i ;
240+
229241 amdgpu_bo_free_kernel (& adev -> mes .event_log_gpu_obj ,
230242 & adev -> mes .event_log_gpu_addr ,
231243 & adev -> mes .event_log_cpu_addr );
232244
233- amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs );
234- amdgpu_device_wb_free (adev , adev -> mes .query_status_fence_offs );
235- amdgpu_device_wb_free (adev , adev -> mes .read_val_offs );
245+ for (i = 0 ; i < AMDGPU_MAX_MES_PIPES ; i ++ ) {
246+ if (adev -> mes .sch_ctx_ptr [i ])
247+ amdgpu_device_wb_free (adev , adev -> mes .sch_ctx_offs [i ]);
248+ if (adev -> mes .query_status_fence_ptr [i ])
249+ amdgpu_device_wb_free (adev ,
250+ adev -> mes .query_status_fence_offs [i ]);
251+ }
252+ if (adev -> mes .read_val_ptr )
253+ amdgpu_device_wb_free (adev , adev -> mes .read_val_offs );
254+
236255 amdgpu_mes_doorbell_free (adev );
237256
238257 idr_destroy (& adev -> mes .pasid_idr );
@@ -1499,7 +1518,7 @@ int amdgpu_mes_init_microcode(struct amdgpu_device *adev, int pipe)
14991518
15001519 amdgpu_ucode_ip_version_decode (adev , GC_HWIP , ucode_prefix ,
15011520 sizeof (ucode_prefix ));
1502- if (adev -> enable_uni_mes && pipe == AMDGPU_MES_SCHED_PIPE ) {
1521+ if (adev -> enable_uni_mes ) {
15031522 snprintf (fw_name , sizeof (fw_name ),
15041523 "amdgpu/%s_uni_mes.bin" , ucode_prefix );
15051524 } else if (amdgpu_ip_version (adev , GC_HWIP , 0 ) >= IP_VERSION (11 , 0 , 0 ) &&
0 commit comments