diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 46 | 
1 files changed, 46 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index a0f48cb9b8f0..7014d5875d5b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -322,3 +322,49 @@ int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev)  	return ret;  } + +union gfx_info { +	struct  atom_gfx_info_v2_4 v24; +}; + +int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev) +{ +	struct amdgpu_mode_info *mode_info = &adev->mode_info; +	int index; +	uint8_t frev, crev; +	uint16_t data_offset; + +	index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, +					    gfx_info); +	if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL, +				   &frev, &crev, &data_offset)) { +		union gfx_info *gfx_info = (union gfx_info *) +			(mode_info->atom_context->bios + data_offset); +		switch (crev) { +		case 4: +			adev->gfx.config.max_shader_engines = gfx_info->v24.gc_num_se; +			adev->gfx.config.max_cu_per_sh = gfx_info->v24.gc_num_cu_per_sh; +			adev->gfx.config.max_sh_per_se = gfx_info->v24.gc_num_sh_per_se; +			adev->gfx.config.max_backends_per_se = gfx_info->v24.gc_num_rb_per_se; +			adev->gfx.config.max_texture_channel_caches = gfx_info->v24.gc_num_tccs; +			adev->gfx.config.max_gprs = le16_to_cpu(gfx_info->v24.gc_num_gprs); +			adev->gfx.config.max_gs_threads = gfx_info->v24.gc_num_max_gs_thds; +			adev->gfx.config.gs_vgt_table_depth = gfx_info->v24.gc_gs_table_depth; +			adev->gfx.config.gs_prim_buffer_depth = +				le16_to_cpu(gfx_info->v24.gc_gsprim_buff_depth); +			adev->gfx.config.double_offchip_lds_buf = +				gfx_info->v24.gc_double_offchip_lds_buffer; +			adev->gfx.cu_info.wave_front_size = gfx_info->v24.gc_wave_size; +			adev->gfx.cu_info.max_waves_per_simd = +				le16_to_cpu(gfx_info->v24.gc_max_waves_per_simd); +			adev->gfx.cu_info.max_scratch_slots_per_cu = +				gfx_info->v24.gc_max_scratch_slots_per_cu; +			adev->gfx.cu_info.lds_size = le16_to_cpu(gfx_info->v24.gc_lds_size); +			return 0; +		default: +			return -EINVAL; +		} + +	} +	return -EINVAL; +} | 
