[PATCH 1/2] amd/amdgpu/sriov enable onevf mode for ARCTURUS VF
Quan, Evan
Evan.Quan at amd.com
Thu Jan 2 06:18:38 UTC 2020
> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Jack
> Zhang
> Sent: Thursday, January 2, 2020 1:50 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Zhang, Jack (Jian) <Jack.Zhang1 at amd.com>
> Subject: [PATCH 1/2] amd/amdgpu/sriov enable onevf mode for ARCTURUS VF
>
> Before, initialization of smu ip block would be skipped
> for sriov ASICs. But if there's only one VF being used,
> guest driver should be able to dump some HW info such as
> clks, temperature,etc.
>
> To solve this, now after onevf mode is enabled, host
> driver will notify guest. If it's onevf mode, guest will
> do smu hw_init and skip some steps in normal smu hw_init
> flow because host driver has already done it for smu.
>
> With this fix, guest app can talk with smu and dump hw
> information from smu.
>
> v2: refine the logic for pm_enabled.Skip hw_init by not
> changing pm_enabled.
>
> Signed-off-by: Jack Zhang <Jack.Zhang1 at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 3 +-
> drivers/gpu/drm/amd/amdgpu/soc15.c | 3 +-
> drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 94 +++++++++++++++++----
> ---------
> 3 files changed, 56 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 0d842a1..5341905 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -1454,7 +1454,8 @@ static int psp_np_fw_load(struct psp_context *psp)
> || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G
> || ucode->ucode_id ==
> AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL
> || ucode->ucode_id ==
> AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM
> - || ucode->ucode_id ==
> AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM))
> + || ucode->ucode_id ==
> AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM
> + || ucode->ucode_id == AMDGPU_UCODE_ID_SMC))
> /*skip ucode loading in SRIOV VF */
> continue;
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c
> b/drivers/gpu/drm/amd/amdgpu/soc15.c
> index 6129fab..26e1c8c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/soc15.c
> +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c
> @@ -826,8 +826,7 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)
> amdgpu_device_ip_block_add(adev,
> &dce_virtual_ip_block);
> amdgpu_device_ip_block_add(adev, &gfx_v9_0_ip_block);
> amdgpu_device_ip_block_add(adev, &sdma_v4_0_ip_block);
> - if (!amdgpu_sriov_vf(adev))
> - amdgpu_device_ip_block_add(adev,
> &smu_v11_0_ip_block);
> + amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);
>
> if (unlikely(adev->firmware.load_type ==
> AMDGPU_FW_LOAD_DIRECT))
> amdgpu_device_ip_block_add(adev,
> &vcn_v2_5_ip_block);
> diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> index 4ed8bdc..fa17265 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -531,10 +531,14 @@ bool is_support_sw_smu(struct amdgpu_device
> *adev)
> if (adev->asic_type == CHIP_VEGA20)
> return (amdgpu_dpm == 2) ? true : false;
> else if (adev->asic_type >= CHIP_ARCTURUS) {
> - if (amdgpu_sriov_vf(adev))
> - return false;
> - else
> + if (amdgpu_sriov_vf(adev)) {
> + if(amdgpu_sriov_is_pp_one_vf(adev))
> + return true;
> + else
> + return false;
> + } else {
> return true;
> + }
[Quan, Evan] Maybe this can be simplified as below:
if (amdgpu_sriov_vf(adev)&& !amdgpu_sriov_is_pp_one_vf(adev))
return false;
else
return true;
> } else
> return false;
> }
> @@ -1061,20 +1065,19 @@ static int smu_smc_table_hw_init(struct
> smu_context *smu,
> }
>
> /* smu_dump_pptable(smu); */
> + if (!amdgpu_sriov_vf(adev)) {
> + /*
> + * Copy pptable bo in the vram to smc with SMU MSGs such as
> + * SetDriverDramAddr and TransferTableDram2Smu.
> + */
> + ret = smu_write_pptable(smu);
> + if (ret)
> + return ret;
>
> - /*
> - * Copy pptable bo in the vram to smc with SMU MSGs such as
> - * SetDriverDramAddr and TransferTableDram2Smu.
> - */
> - ret = smu_write_pptable(smu);
> - if (ret)
> - return ret;
> -
> - /* issue Run*Btc msg */
> - ret = smu_run_btc(smu);
> - if (ret)
> - return ret;
> -
> + /* issue Run*Btc msg */
> + ret = smu_run_btc(smu);
> + if (ret)
> + return ret;
> ret = smu_feature_set_allowed_mask(smu);
> if (ret)
> return ret;
> @@ -1082,7 +1085,7 @@ static int smu_smc_table_hw_init(struct
> smu_context *smu,
> ret = smu_system_features_control(smu, true);
> if (ret)
> return ret;
> -
> + }
[Quan, Evan] Please check the code style here. It seems the code above does not have the same indentation.
> if (adev->asic_type != CHIP_ARCTURUS) {
> ret = smu_notify_display_change(smu);
> if (ret)
> @@ -1135,8 +1138,9 @@ static int smu_smc_table_hw_init(struct
> smu_context *smu,
> /*
> * Set PMSTATUSLOG table bo address with SetToolsDramAddr MSG for
> tools.
> */
> - ret = smu_set_tool_table_location(smu);
> -
> + if (!amdgpu_sriov_vf(adev)) {
> + ret = smu_set_tool_table_location(smu);
> + }
> if (!smu_is_dpm_running(smu))
> pr_info("dpm has been disabled\n");
>
> @@ -1248,6 +1252,9 @@ static int smu_hw_init(void *handle)
> smu_set_gfx_cgpg(&adev->smu, true);
> }
>
> + if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev))
> + return 0;
> +
> if (!smu->pm_enabled)
> return 0;
>
> @@ -1300,37 +1307,42 @@ static int smu_hw_fini(void *handle)
> struct smu_table_context *table_context = &smu->smu_table;
> int ret = 0;
>
> + if (amdgpu_sriov_vf(adev)&& !amdgpu_sriov_is_pp_one_vf(adev))
> + return 0;
> +
> if (adev->flags & AMD_IS_APU) {
> smu_powergate_sdma(&adev->smu, true);
> smu_powergate_vcn(&adev->smu, true);
> smu_powergate_jpeg(&adev->smu, true);
> }
>
> - ret = smu_stop_thermal_control(smu);
> - if (ret) {
> - pr_warn("Fail to stop thermal control!\n");
> - return ret;
> - }
> -
> - /*
> - * For custom pptable uploading, skip the DPM features
> - * disable process on Navi1x ASICs.
> - * - As the gfx related features are under control of
> - * RLC on those ASICs. RLC reinitialization will be
> - * needed to reenable them. That will cost much more
> - * efforts.
> - *
> - * - SMU firmware can handle the DPM reenablement
> - * properly.
> - */
> - if (!smu->uploading_custom_pp_table ||
> - !((adev->asic_type >= CHIP_NAVI10) &&
> - (adev->asic_type <= CHIP_NAVI12))) {
> - ret = smu_stop_dpms(smu);
> + if (!amdgpu_sriov_vf(adev)){
> + ret = smu_stop_thermal_control(smu);
> if (ret) {
> - pr_warn("Fail to stop Dpms!\n");
> + pr_warn("Fail to stop thermal control!\n");
> return ret;
> }
> +
> + /*
> + * For custom pptable uploading, skip the DPM features
> + * disable process on Navi1x ASICs.
> + * - As the gfx related features are under control of
> + * RLC on those ASICs. RLC reinitialization will be
> + * needed to reenable them. That will cost much more
> + * efforts.
> + *
> + * - SMU firmware can handle the DPM reenablement
> + * properly.
> + */
> + if (!smu->uploading_custom_pp_table ||
> + !((adev->asic_type >= CHIP_NAVI10) &&
> + (adev->asic_type <= CHIP_NAVI12))) {
> + ret = smu_stop_dpms(smu);
> + if (ret) {
> + pr_warn("Fail to stop Dpms!\n");
> + return ret;
> + }
> + }
> }
>
> kfree(table_context->driver_pptable);
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.free
> desktop.org%2Fmailman%2Flistinfo%2Famd-
> gfx&data=02%7C01%7Cevan.quan%40amd.com%7Cfbd41f8689704e60cb8
> f08d78f47aac1%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63713
> 5410346465153&sdata=7xQsqRAFgxZTPkU9v5zEAaWzmKIMA%2FiQyn1wD
> ftSZgQ%3D&reserved=0
More information about the amd-gfx
mailing list