|
@@ -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)
|