diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 78 | 
1 files changed, 55 insertions, 23 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index 5bc072220f03..028190d42bb2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -565,10 +565,15 @@ void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)  	}  } +union gc_info { +	struct gc_info_v1_0 v1; +	struct gc_info_v2_0 v2; +}; +  int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)  {  	struct binary_header *bhdr; -	struct gc_info_v1_0 *gc_info; +	union gc_info *gc_info;  	if (!adev->mman.discovery_bin) {  		DRM_ERROR("ip discovery uninitialized\n"); @@ -576,28 +581,55 @@ int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)  	}  	bhdr = (struct binary_header *)adev->mman.discovery_bin; -	gc_info = (struct gc_info_v1_0 *)(adev->mman.discovery_bin + +	gc_info = (union gc_info *)(adev->mman.discovery_bin +  			le16_to_cpu(bhdr->table_list[GC].offset)); - -	adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->gc_num_se); -	adev->gfx.config.max_cu_per_sh = 2 * (le32_to_cpu(gc_info->gc_num_wgp0_per_sa) + -					      le32_to_cpu(gc_info->gc_num_wgp1_per_sa)); -	adev->gfx.config.max_sh_per_se = le32_to_cpu(gc_info->gc_num_sa_per_se); -	adev->gfx.config.max_backends_per_se = le32_to_cpu(gc_info->gc_num_rb_per_se); -	adev->gfx.config.max_texture_channel_caches = le32_to_cpu(gc_info->gc_num_gl2c); -	adev->gfx.config.max_gprs = le32_to_cpu(gc_info->gc_num_gprs); -	adev->gfx.config.max_gs_threads = le32_to_cpu(gc_info->gc_num_max_gs_thds); -	adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gc_info->gc_gs_table_depth); -	adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gc_info->gc_gsprim_buff_depth); -	adev->gfx.config.double_offchip_lds_buf = le32_to_cpu(gc_info->gc_double_offchip_lds_buffer); -	adev->gfx.cu_info.wave_front_size = le32_to_cpu(gc_info->gc_wave_size); -	adev->gfx.cu_info.max_waves_per_simd = le32_to_cpu(gc_info->gc_max_waves_per_simd); -	adev->gfx.cu_info.max_scratch_slots_per_cu = le32_to_cpu(gc_info->gc_max_scratch_slots_per_cu); -	adev->gfx.cu_info.lds_size = le32_to_cpu(gc_info->gc_lds_size); -	adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->gc_num_sc_per_se) / -					 le32_to_cpu(gc_info->gc_num_sa_per_se); -	adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->gc_num_packer_per_sc); - +	switch (gc_info->v1.header.version_major) { +	case 1: +		adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v1.gc_num_se); +		adev->gfx.config.max_cu_per_sh = 2 * (le32_to_cpu(gc_info->v1.gc_num_wgp0_per_sa) + +						      le32_to_cpu(gc_info->v1.gc_num_wgp1_per_sa)); +		adev->gfx.config.max_sh_per_se = le32_to_cpu(gc_info->v1.gc_num_sa_per_se); +		adev->gfx.config.max_backends_per_se = le32_to_cpu(gc_info->v1.gc_num_rb_per_se); +		adev->gfx.config.max_texture_channel_caches = le32_to_cpu(gc_info->v1.gc_num_gl2c); +		adev->gfx.config.max_gprs = le32_to_cpu(gc_info->v1.gc_num_gprs); +		adev->gfx.config.max_gs_threads = le32_to_cpu(gc_info->v1.gc_num_max_gs_thds); +		adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gc_info->v1.gc_gs_table_depth); +		adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gc_info->v1.gc_gsprim_buff_depth); +		adev->gfx.config.double_offchip_lds_buf = le32_to_cpu(gc_info->v1.gc_double_offchip_lds_buffer); +		adev->gfx.cu_info.wave_front_size = le32_to_cpu(gc_info->v1.gc_wave_size); +		adev->gfx.cu_info.max_waves_per_simd = le32_to_cpu(gc_info->v1.gc_max_waves_per_simd); +		adev->gfx.cu_info.max_scratch_slots_per_cu = le32_to_cpu(gc_info->v1.gc_max_scratch_slots_per_cu); +		adev->gfx.cu_info.lds_size = le32_to_cpu(gc_info->v1.gc_lds_size); +		adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->v1.gc_num_sc_per_se) / +			le32_to_cpu(gc_info->v1.gc_num_sa_per_se); +		adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->v1.gc_num_packer_per_sc); +		break; +	case 2: +		adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->v2.gc_num_se); +		adev->gfx.config.max_cu_per_sh = le32_to_cpu(gc_info->v2.gc_num_cu_per_sh); +		adev->gfx.config.max_sh_per_se = le32_to_cpu(gc_info->v2.gc_num_sh_per_se); +		adev->gfx.config.max_backends_per_se = le32_to_cpu(gc_info->v2.gc_num_rb_per_se); +		adev->gfx.config.max_texture_channel_caches = le32_to_cpu(gc_info->v2.gc_num_tccs); +		adev->gfx.config.max_gprs = le32_to_cpu(gc_info->v2.gc_num_gprs); +		adev->gfx.config.max_gs_threads = le32_to_cpu(gc_info->v2.gc_num_max_gs_thds); +		adev->gfx.config.gs_vgt_table_depth = le32_to_cpu(gc_info->v2.gc_gs_table_depth); +		adev->gfx.config.gs_prim_buffer_depth = le32_to_cpu(gc_info->v2.gc_gsprim_buff_depth); +		adev->gfx.config.double_offchip_lds_buf = le32_to_cpu(gc_info->v2.gc_double_offchip_lds_buffer); +		adev->gfx.cu_info.wave_front_size = le32_to_cpu(gc_info->v2.gc_wave_size); +		adev->gfx.cu_info.max_waves_per_simd = le32_to_cpu(gc_info->v2.gc_max_waves_per_simd); +		adev->gfx.cu_info.max_scratch_slots_per_cu = le32_to_cpu(gc_info->v2.gc_max_scratch_slots_per_cu); +		adev->gfx.cu_info.lds_size = le32_to_cpu(gc_info->v2.gc_lds_size); +		adev->gfx.config.num_sc_per_sh = le32_to_cpu(gc_info->v2.gc_num_sc_per_se) / +			le32_to_cpu(gc_info->v2.gc_num_sh_per_se); +		adev->gfx.config.num_packer_per_sc = le32_to_cpu(gc_info->v2.gc_num_packer_per_sc); +		break; +	default: +		dev_err(adev->dev, +			"Unhandled GC info table %d.%d\n", +			gc_info->v1.header.version_major, +			gc_info->v1.header.version_minor); +		return -EINVAL; +	}  	return 0;  } @@ -992,7 +1024,7 @@ static int amdgpu_discovery_set_mes_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &mes_v10_1_ip_block);  		break;  	default: -		break;; +		break;  	}  	return 0;  }  |