[PATCH 2/4] drm/amdgpu: add amdgpu_gfx_state_change_set() set gfx power change entry

Liang, Prike Prike.Liang at amd.com
Mon Oct 19 01:41:00 UTC 2020


[AMD Official Use Only - Internal Distribution Only]

> -----Original Message-----
> From: Alex Deucher <alexdeucher at gmail.com>
> Sent: Saturday, October 17, 2020 2:10 AM
> To: Liang, Prike <Prike.Liang at amd.com>
> Cc: amd-gfx list <amd-gfx at lists.freedesktop.org>; Deucher, Alexander
> <Alexander.Deucher at amd.com>; Huang, Ray <Ray.Huang at amd.com>
> Subject: Re: [PATCH 2/4] drm/amdgpu: add amdgpu_gfx_state_change_set()
> set gfx power change entry
>
> On Fri, Oct 16, 2020 at 5:21 AM Prike Liang <Prike.Liang at amd.com> wrote:
> >
> > The new amdgpu_gfx_state_change_set() funtion can support set GFX
> > power change status to D0/D3.
> >
> > Signed-off-by: Prike Liang <Prike.Liang at amd.com>
> > Acked-by: Huang Rui <ray.huang at amd.com>
> > Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
>
> I presume we'll need something similar for renoir?  That can be a follow up
> patch.
[Prike]  Yeah, so I have drafted the invoked function amdgpu_gfx_state_change_set() outside of the powerplay driver for common use. But until now haven't checked s0i3 on the Renoir/Cezanne yet and if needed will be implement it in the Renoir SMU driver.
>
> Alex
>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c           | 20
> ++++++++++++++++++++
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h           |  7 +++++++
> >  drivers/gpu/drm/amd/include/kgd_pp_interface.h    |  1 +
> >  drivers/gpu/drm/amd/powerplay/amd_powerplay.c     | 20
> ++++++++++++++++++++
> >  drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c |  9 +++++++++
> >  drivers/gpu/drm/amd/powerplay/inc/hwmgr.h         |  1 +
> >  drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h      |  3 ++-
> >  7 files changed, 60 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> > index d612033..e1d6c8a 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
> > @@ -789,3 +789,23 @@ void amdgpu_kiq_wreg(struct amdgpu_device
> *adev,
> > uint32_t reg, uint32_t v)
> >  failed_kiq_write:
> >         pr_err("failed to write reg:%x\n", reg);  }
> > +
> > +/* amdgpu_gfx_state_change_set - Handle gfx power state change set
> > + * @adev: amdgpu_device pointer
> > + * @state: gfx power state(1 -eGpuChangeState_D0Entry and 2
> > +-eGpuChangeState_D3Entry)
> > + *
> > + */
> > +
> > +void amdgpu_gfx_state_change_set(struct amdgpu_device *adev, enum
> > +gfx_change_state state) {
> > +
> > +       mutex_lock(&adev->pm.mutex);
> > +
> > +       if (adev->powerplay.pp_funcs &&
> > +           adev->powerplay.pp_funcs->gfx_state_change_set)
> > +                       ((adev)->powerplay.pp_funcs->gfx_state_change_set(
> > +                                       (adev)->powerplay.pp_handle,
> > + state));
> > +
> > +       mutex_unlock(&adev->pm.mutex);
> > +
> > +}
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> > index d43c116..73942b2 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
> > @@ -47,6 +47,12 @@ enum gfx_pipe_priority {
> >         AMDGPU_GFX_PIPE_PRIO_MAX
> >  };
> >
> > +/* Argument for PPSMC_MSG_GpuChangeState */ enum
> gfx_change_state {
> > +       GpuChangeState_D0Entry = 1,
> > +       GpuChangeState_D3Entry,
> > +};
> > +
> >  #define AMDGPU_GFX_QUEUE_PRIORITY_MINIMUM  0  #define
> > AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM  15
> >
> > @@ -387,4 +393,5 @@ int amdgpu_gfx_cp_ecc_error_irq(struct
> amdgpu_device *adev,
> >                                   struct amdgpu_iv_entry *entry);
> > uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg);
> > void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg,
> > uint32_t v);
> > +void amdgpu_gfx_state_change_set(struct amdgpu_device *adev, enum
> > +gfx_change_state state);
> >  #endif
> > diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> > b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> > index a7f92d0..e7b69dd 100644
> > --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> > +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> > @@ -284,6 +284,7 @@ struct amd_pm_funcs {
> >         int (*odn_edit_dpm_table)(void *handle, uint32_t type, long *input,
> uint32_t size);
> >         int (*set_mp1_state)(void *handle, enum pp_mp1_state mp1_state);
> >         int (*smu_i2c_bus_access)(void *handle, bool acquire);
> > +       int (*gfx_state_change_set)(void *handle, uint32_t state);
> >  /* export to DC */
> >         u32 (*get_sclk)(void *handle, bool low);
> >         u32 (*get_mclk)(void *handle, bool low); diff --git
> > a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
> > b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
> > index 7e6dcdf..4f319be 100644
> > --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
> > +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
> > @@ -1321,6 +1321,25 @@ static int pp_set_powergating_by_smu(void
> *handle,
> >         return ret;
> >  }
> >
> > +static int pp_gfx_state_change_set(void *handle, uint32_t state) {
> > +       struct pp_hwmgr *hwmgr = handle;
> > +
> > +       if (!hwmgr || !hwmgr->pm_en)
> > +               return -EINVAL;
> > +
> > +       if (hwmgr->hwmgr_func->gfx_state_change == NULL) {
> > +               pr_info_ratelimited("%s was not implemented.\n", __func__);
> > +               return -EINVAL;
> > +       }
> > +
> > +       mutex_lock(&hwmgr->smu_lock);
> > +       hwmgr->hwmgr_func->gfx_state_change(hwmgr, state);
> > +       mutex_unlock(&hwmgr->smu_lock);
> > +
> > +       return 0;
> > +}
> > +
> >  static int pp_notify_smu_enable_pwe(void *handle)  {
> >         struct pp_hwmgr *hwmgr = handle; @@ -1625,6 +1644,7 @@ static
> > const struct amd_pm_funcs pp_dpm_funcs = {
> >         .switch_power_profile = pp_dpm_switch_power_profile,
> >         .set_clockgating_by_smu = pp_set_clockgating_by_smu,
> >         .set_powergating_by_smu = pp_set_powergating_by_smu,
> > +       .gfx_state_change_set = pp_gfx_state_change_set,
> >         .get_power_profile_mode = pp_get_power_profile_mode,
> >         .set_power_profile_mode = pp_set_power_profile_mode,
> >         .odn_edit_dpm_table = pp_odn_edit_dpm_table, diff --git
> > a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> > b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> > index c9cfe90..3f354da 100644
> > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
> > @@ -319,6 +319,14 @@ static bool smu10_is_gfx_on(struct pp_hwmgr
> *hwmgr)
> >         return false;
> >  }
> >
> > +static int smu10_gfx_state_change(struct pp_hwmgr *hwmgr, uint32_t
> > +state) {
> > +       struct amdgpu_device *adev = hwmgr->adev;
> > +       smum_send_msg_to_smc_with_parameter(hwmgr,
> > +PPSMC_MSG_GpuChangeState, state, NULL);
> > +
> > +       return 0;
> > +}
> > +
> >  static int smu10_disable_gfx_off(struct pp_hwmgr *hwmgr)  {
> >         struct amdgpu_device *adev = hwmgr->adev; @@ -1394,6 +1402,7
> > @@ static const struct pp_hwmgr_func smu10_hwmgr_funcs = {
> >         .get_power_profile_mode = smu10_get_power_profile_mode,
> >         .set_power_profile_mode = smu10_set_power_profile_mode,
> >         .asic_reset = smu10_asic_reset,
> > +       .gfx_state_change = smu10_gfx_state_change,
> >  };
> >
> >  int smu10_init_function_pointers(struct pp_hwmgr *hwmgr) diff --git
> > a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
> > b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
> > index 15ed6cb..2c9580b 100644
> > --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
> > +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
> > @@ -359,6 +359,7 @@ struct pp_hwmgr_func {
> >         int (*set_xgmi_pstate)(struct pp_hwmgr *hwmgr, uint32_t pstate);
> >         int (*disable_power_features_for_compute_performance)(struct
> pp_hwmgr *hwmgr,
> >                                         bool disable);
> > +       int (*gfx_state_change)(struct pp_hwmgr *hwmgr, uint32_t
> > + state);
> >  };
> >
> >  struct pp_table_func {
> > diff --git a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
> > b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
> > index df4677d..4c7e08b 100644
> > --- a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
> > +++ b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h
> > @@ -83,7 +83,8 @@
> >  #define PPSMC_MSG_SetSoftMaxVcn                 0x34
> >  #define PPSMC_MSG_PowerGateMmHub                0x35
> >  #define PPSMC_MSG_SetRccPfcPmeRestoreRegister   0x36
> > -#define PPSMC_Message_Count                     0x37
> > +#define PPSMC_MSG_GpuChangeState                0x37
> > +#define PPSMC_Message_Count                     0x42
> >
> >  typedef uint16_t PPSMC_Result;
> >  typedef int      PPSMC_Msg;
> > --
> > 2.7.4
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx at lists.freedesktop.org
> > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flist
> > s.freedesktop.org%2Fmailman%2Flistinfo%2Famd-
> gfx&data=04%7C01%7CPr
> >
> ike.Liang%40amd.com%7C8dc3fa74b20d4fae604708d871fec9f9%7C3dd8961f
> e4884
> >
> e608e11a82d994e183d%7C0%7C0%7C637384686409368549%7CUnknown%7
> CTWFpbGZsb
> >
> 3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0
> %3D%
> >
> 7C1000&sdata=sB%2FuFIiWFJ5nRsVYfRbfGZYszehIDAlhzZE5Okx4zTk%3
> D&
> > reserved=0


More information about the amd-gfx mailing list