@@ -372,38 +372,70 @@ int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,
372372 return - EINVAL ;
373373}
374374
375+ union gc_info {
376+ struct gc_info_v1_0 v1 ;
377+ struct gc_info_v2_0 v2 ;
378+ };
379+
375380int amdgpu_discovery_get_gfx_info (struct amdgpu_device * adev )
376381{
377382 struct binary_header * bhdr ;
378- struct gc_info_v1_0 * gc_info ;
383+ union gc_info * gc_info ;
379384
380385 if (!adev -> mman .discovery_bin ) {
381386 DRM_ERROR ("ip discovery uninitialized\n" );
382387 return - EINVAL ;
383388 }
384389
385390 bhdr = (struct binary_header * )adev -> mman .discovery_bin ;
386- gc_info = (struct gc_info_v1_0 * )(adev -> mman .discovery_bin +
391+ gc_info = (union gc_info * )(adev -> mman .discovery_bin +
387392 le16_to_cpu (bhdr -> table_list [GC ].offset ));
388-
389- adev -> gfx .config .max_shader_engines = le32_to_cpu (gc_info -> gc_num_se );
390- adev -> gfx .config .max_cu_per_sh = 2 * (le32_to_cpu (gc_info -> gc_num_wgp0_per_sa ) +
391- le32_to_cpu (gc_info -> gc_num_wgp1_per_sa ));
392- adev -> gfx .config .max_sh_per_se = le32_to_cpu (gc_info -> gc_num_sa_per_se );
393- adev -> gfx .config .max_backends_per_se = le32_to_cpu (gc_info -> gc_num_rb_per_se );
394- adev -> gfx .config .max_texture_channel_caches = le32_to_cpu (gc_info -> gc_num_gl2c );
395- adev -> gfx .config .max_gprs = le32_to_cpu (gc_info -> gc_num_gprs );
396- adev -> gfx .config .max_gs_threads = le32_to_cpu (gc_info -> gc_num_max_gs_thds );
397- adev -> gfx .config .gs_vgt_table_depth = le32_to_cpu (gc_info -> gc_gs_table_depth );
398- adev -> gfx .config .gs_prim_buffer_depth = le32_to_cpu (gc_info -> gc_gsprim_buff_depth );
399- adev -> gfx .config .double_offchip_lds_buf = le32_to_cpu (gc_info -> gc_double_offchip_lds_buffer );
400- adev -> gfx .cu_info .wave_front_size = le32_to_cpu (gc_info -> gc_wave_size );
401- adev -> gfx .cu_info .max_waves_per_simd = le32_to_cpu (gc_info -> gc_max_waves_per_simd );
402- adev -> gfx .cu_info .max_scratch_slots_per_cu = le32_to_cpu (gc_info -> gc_max_scratch_slots_per_cu );
403- adev -> gfx .cu_info .lds_size = le32_to_cpu (gc_info -> gc_lds_size );
404- adev -> gfx .config .num_sc_per_sh = le32_to_cpu (gc_info -> gc_num_sc_per_se ) /
405- le32_to_cpu (gc_info -> gc_num_sa_per_se );
406- adev -> gfx .config .num_packer_per_sc = le32_to_cpu (gc_info -> gc_num_packer_per_sc );
407-
393+ switch (gc_info -> v1 .header .version_major ) {
394+ case 1 :
395+ adev -> gfx .config .max_shader_engines = le32_to_cpu (gc_info -> v1 .gc_num_se );
396+ adev -> gfx .config .max_cu_per_sh = 2 * (le32_to_cpu (gc_info -> v1 .gc_num_wgp0_per_sa ) +
397+ le32_to_cpu (gc_info -> v1 .gc_num_wgp1_per_sa ));
398+ adev -> gfx .config .max_sh_per_se = le32_to_cpu (gc_info -> v1 .gc_num_sa_per_se );
399+ adev -> gfx .config .max_backends_per_se = le32_to_cpu (gc_info -> v1 .gc_num_rb_per_se );
400+ adev -> gfx .config .max_texture_channel_caches = le32_to_cpu (gc_info -> v1 .gc_num_gl2c );
401+ adev -> gfx .config .max_gprs = le32_to_cpu (gc_info -> v1 .gc_num_gprs );
402+ adev -> gfx .config .max_gs_threads = le32_to_cpu (gc_info -> v1 .gc_num_max_gs_thds );
403+ adev -> gfx .config .gs_vgt_table_depth = le32_to_cpu (gc_info -> v1 .gc_gs_table_depth );
404+ adev -> gfx .config .gs_prim_buffer_depth = le32_to_cpu (gc_info -> v1 .gc_gsprim_buff_depth );
405+ adev -> gfx .config .double_offchip_lds_buf = le32_to_cpu (gc_info -> v1 .gc_double_offchip_lds_buffer );
406+ adev -> gfx .cu_info .wave_front_size = le32_to_cpu (gc_info -> v1 .gc_wave_size );
407+ adev -> gfx .cu_info .max_waves_per_simd = le32_to_cpu (gc_info -> v1 .gc_max_waves_per_simd );
408+ adev -> gfx .cu_info .max_scratch_slots_per_cu = le32_to_cpu (gc_info -> v1 .gc_max_scratch_slots_per_cu );
409+ adev -> gfx .cu_info .lds_size = le32_to_cpu (gc_info -> v1 .gc_lds_size );
410+ adev -> gfx .config .num_sc_per_sh = le32_to_cpu (gc_info -> v1 .gc_num_sc_per_se ) /
411+ le32_to_cpu (gc_info -> v1 .gc_num_sa_per_se );
412+ adev -> gfx .config .num_packer_per_sc = le32_to_cpu (gc_info -> v1 .gc_num_packer_per_sc );
413+ break ;
414+ case 2 :
415+ adev -> gfx .config .max_shader_engines = le32_to_cpu (gc_info -> v2 .gc_num_se );
416+ adev -> gfx .config .max_cu_per_sh = le32_to_cpu (gc_info -> v2 .gc_num_cu_per_sh );
417+ adev -> gfx .config .max_sh_per_se = le32_to_cpu (gc_info -> v2 .gc_num_sh_per_se );
418+ adev -> gfx .config .max_backends_per_se = le32_to_cpu (gc_info -> v2 .gc_num_rb_per_se );
419+ adev -> gfx .config .max_texture_channel_caches = le32_to_cpu (gc_info -> v2 .gc_num_tccs );
420+ adev -> gfx .config .max_gprs = le32_to_cpu (gc_info -> v2 .gc_num_gprs );
421+ adev -> gfx .config .max_gs_threads = le32_to_cpu (gc_info -> v2 .gc_num_max_gs_thds );
422+ adev -> gfx .config .gs_vgt_table_depth = le32_to_cpu (gc_info -> v2 .gc_gs_table_depth );
423+ adev -> gfx .config .gs_prim_buffer_depth = le32_to_cpu (gc_info -> v2 .gc_gsprim_buff_depth );
424+ adev -> gfx .config .double_offchip_lds_buf = le32_to_cpu (gc_info -> v2 .gc_double_offchip_lds_buffer );
425+ adev -> gfx .cu_info .wave_front_size = le32_to_cpu (gc_info -> v2 .gc_wave_size );
426+ adev -> gfx .cu_info .max_waves_per_simd = le32_to_cpu (gc_info -> v2 .gc_max_waves_per_simd );
427+ adev -> gfx .cu_info .max_scratch_slots_per_cu = le32_to_cpu (gc_info -> v2 .gc_max_scratch_slots_per_cu );
428+ adev -> gfx .cu_info .lds_size = le32_to_cpu (gc_info -> v2 .gc_lds_size );
429+ adev -> gfx .config .num_sc_per_sh = le32_to_cpu (gc_info -> v2 .gc_num_sc_per_se ) /
430+ le32_to_cpu (gc_info -> v2 .gc_num_sh_per_se );
431+ adev -> gfx .config .num_packer_per_sc = le32_to_cpu (gc_info -> v2 .gc_num_packer_per_sc );
432+ break ;
433+ default :
434+ dev_err (adev -> dev ,
435+ "Unhandled GC info table %d.%d\n" ,
436+ gc_info -> v1 .header .version_major ,
437+ gc_info -> v1 .header .version_minor );
438+ return - EINVAL ;
439+ }
408440 return 0 ;
409441}
0 commit comments