drm/amd/amdgpu: fixing read wrong pf2vf data in SRIOV
commit 9a458402fb69bda886aa6cbe067311b6e3d9c52a upstream. [Why] This fixes 892deb48269c ("drm/amdgpu: Separate vf2pf work item init from virt data exchange"). we should read pf2vf data based at mman.fw_vram_usage_va after gmc sw_init. commit 892deb48269c breaks this logic. [How] calling amdgpu_virt_exchange_data in amdgpu_virt_init_data_exchange to set the right base in the right sequence. v2: call amdgpu_virt_init_data_exchange after gmc sw_init to make data exchange workqueue run v3: clean up the code logic v4: add some comment and make the code more readable Fixes: 892deb48269c ("drm/amdgpu: Separate vf2pf work item init from virt data exchange") Signed-off-by: Jingwen Chen <Jingwen.Chen2@amd.com> Reviewed-by: Horace Chen <horace.chen@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
4bc4b6419e
commit
fda04a0bab
@@ -2224,7 +2224,7 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (amdgpu_sriov_vf(adev))
|
if (amdgpu_sriov_vf(adev))
|
||||||
amdgpu_virt_exchange_data(adev);
|
amdgpu_virt_init_data_exchange(adev);
|
||||||
|
|
||||||
r = amdgpu_ib_pool_init(adev);
|
r = amdgpu_ib_pool_init(adev);
|
||||||
if (r) {
|
if (r) {
|
||||||
|
@@ -584,20 +584,20 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
|
|||||||
adev->virt.fw_reserve.p_vf2pf = NULL;
|
adev->virt.fw_reserve.p_vf2pf = NULL;
|
||||||
adev->virt.vf2pf_update_interval_ms = 0;
|
adev->virt.vf2pf_update_interval_ms = 0;
|
||||||
|
|
||||||
if (adev->bios != NULL) {
|
if (adev->mman.fw_vram_usage_va != NULL) {
|
||||||
adev->virt.vf2pf_update_interval_ms = 2000;
|
/* go through this logic in ip_init and reset to init workqueue*/
|
||||||
|
amdgpu_virt_exchange_data(adev);
|
||||||
|
|
||||||
|
INIT_DELAYED_WORK(&adev->virt.vf2pf_work, amdgpu_virt_update_vf2pf_work_item);
|
||||||
|
schedule_delayed_work(&(adev->virt.vf2pf_work), msecs_to_jiffies(adev->virt.vf2pf_update_interval_ms));
|
||||||
|
} else if (adev->bios != NULL) {
|
||||||
|
/* got through this logic in early init stage to get necessary flags, e.g. rlcg_acc related*/
|
||||||
adev->virt.fw_reserve.p_pf2vf =
|
adev->virt.fw_reserve.p_pf2vf =
|
||||||
(struct amd_sriov_msg_pf2vf_info_header *)
|
(struct amd_sriov_msg_pf2vf_info_header *)
|
||||||
(adev->bios + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));
|
(adev->bios + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));
|
||||||
|
|
||||||
amdgpu_virt_read_pf2vf_data(adev);
|
amdgpu_virt_read_pf2vf_data(adev);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adev->virt.vf2pf_update_interval_ms != 0) {
|
|
||||||
INIT_DELAYED_WORK(&adev->virt.vf2pf_work, amdgpu_virt_update_vf2pf_work_item);
|
|
||||||
schedule_delayed_work(&(adev->virt.vf2pf_work), msecs_to_jiffies(adev->virt.vf2pf_update_interval_ms));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -633,12 +633,6 @@ void amdgpu_virt_exchange_data(struct amdgpu_device *adev)
|
|||||||
if (adev->virt.ras_init_done)
|
if (adev->virt.ras_init_done)
|
||||||
amdgpu_virt_add_bad_page(adev, bp_block_offset, bp_block_size);
|
amdgpu_virt_add_bad_page(adev, bp_block_offset, bp_block_size);
|
||||||
}
|
}
|
||||||
} else if (adev->bios != NULL) {
|
|
||||||
adev->virt.fw_reserve.p_pf2vf =
|
|
||||||
(struct amd_sriov_msg_pf2vf_info_header *)
|
|
||||||
(adev->bios + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));
|
|
||||||
|
|
||||||
amdgpu_virt_read_pf2vf_data(adev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user