drm/amdgpu:add fw-vram-usage for atomfirmware
authorMonk Liu <Monk.Liu@amd.com>
Tue, 31 Oct 2017 11:45:11 +0000 (19:45 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 2 Nov 2017 03:31:12 +0000 (23:31 -0400)
otherwise PF & VF exchange is broken

Signed-off-by: Monk Liu <Monk.Liu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c

index f9ffe8ef0cd60a85ae4180f66727f791e8679622..ff8efd0f8fd54f7c3ef2db1e03cb4b0666d42002 100644 (file)
@@ -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)