diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 22 | 
1 files changed, 18 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index f9ffe8ef0cd6..ff8efd0f8fd5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c @@ -71,19 +71,33 @@ int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev)  	struct atom_context *ctx = adev->mode_info.atom_context;  	int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,  						vram_usagebyfirmware); +	struct vram_usagebyfirmware_v2_1 *	firmware_usage; +	uint32_t start_addr, size;  	uint16_t data_offset;  	int usage_bytes = 0;  	if (amdgpu_atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { -		struct vram_usagebyfirmware_v2_1 *firmware_usage = -			(struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset); - +		firmware_usage = (struct vram_usagebyfirmware_v2_1 *)(ctx->bios + data_offset);  		DRM_DEBUG("atom firmware requested %08x %dkb fw %dkb drv\n",  			  le32_to_cpu(firmware_usage->start_address_in_kb),  			  le16_to_cpu(firmware_usage->used_by_firmware_in_kb),  			  le16_to_cpu(firmware_usage->used_by_driver_in_kb)); -		usage_bytes = le16_to_cpu(firmware_usage->used_by_driver_in_kb) * 1024; +		start_addr = le32_to_cpu(firmware_usage->start_address_in_kb); +		size = le16_to_cpu(firmware_usage->used_by_firmware_in_kb); + +		if ((uint32_t)(start_addr & ATOM_VRAM_OPERATION_FLAGS_MASK) == +			(uint32_t)(ATOM_VRAM_BLOCK_SRIOV_MSG_SHARE_RESERVATION << +			ATOM_VRAM_OPERATION_FLAGS_SHIFT)) { +			/* Firmware request VRAM reservation for SR-IOV */ +			adev->fw_vram_usage.start_offset = (start_addr & +				(~ATOM_VRAM_OPERATION_FLAGS_MASK)) << 10; +			adev->fw_vram_usage.size = size << 10; +			/* Use the default scratch size */ +			usage_bytes = 0; +		} else { +			usage_bytes = le16_to_cpu(firmware_usage->used_by_driver_in_kb) << 10; +		}  	}  	ctx->scratch_size_bytes = 0;  	if (usage_bytes == 0) | 
