[07/26] drm/amd/powerplay: implement pwm1_enable hwmon interface for SMU11

Submitted by Huang, Ray on Feb. 25, 2019, 12:12 p.m.

Details

Message ID 1551096752-18205-8-git-send-email-ray.huang@amd.com
State New
Headers show
Series "Updates for SW SMU driver" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Huang, Ray Feb. 25, 2019, 12:12 p.m.
From: Chengming Gui <Jack.Gui@amd.com>

1, set get_pwm1_enable and set_pwm1_enable functions to call
smu_get_fan_control_mode and smu_set_fan_control_mode for SMU11
2, implement set_fan_control_mode function

v2: add return value in set_fan_control_mode function

Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
Reviewed-by: Huang Rui <ray.huang@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c         | 31 +++++++++++++++++---------
 drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h |  3 +++
 drivers/gpu/drm/amd/powerplay/smu_v11_0.c      | 31 ++++++++++++++++++++++++++
 3 files changed, 55 insertions(+), 10 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
index d40aa39..ac991f9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
@@ -1382,11 +1382,14 @@  static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,
 {
 	struct amdgpu_device *adev = dev_get_drvdata(dev);
 	u32 pwm_mode = 0;
+	if (is_support_sw_smu(adev))
+		pwm_mode = smu_get_fan_control_mode(&adev->smu);
+	else {
+		if (!adev->powerplay.pp_funcs->get_fan_control_mode)
+			return -EINVAL;
 
-	if (!adev->powerplay.pp_funcs->get_fan_control_mode)
-		return -EINVAL;
-
-	pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
+		pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
+	}
 
 	return sprintf(buf, "%i\n", pwm_mode);
 }
@@ -1405,14 +1408,22 @@  static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
 	     (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON))
 		return -EINVAL;
 
-	if (!adev->powerplay.pp_funcs->set_fan_control_mode)
-		return -EINVAL;
+	if (is_support_sw_smu(adev)) {
+		err = kstrtoint(buf, 10, &value);
+		if (err)
+			return err;
 
-	err = kstrtoint(buf, 10, &value);
-	if (err)
-		return err;
+		smu_set_fan_control_mode(&adev->smu, value);
+	} else {
+		if (!adev->powerplay.pp_funcs->set_fan_control_mode)
+			return -EINVAL;
+
+		err = kstrtoint(buf, 10, &value);
+		if (err)
+			return err;
 
-	amdgpu_dpm_set_fan_control_mode(adev, value);
+		amdgpu_dpm_set_fan_control_mode(adev, value);
+	}
 
 	return count;
 }
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
index f94d09d..ef2b807 100644
--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
@@ -533,6 +533,7 @@  struct smu_funcs
 	uint32_t (*get_mclk)(struct smu_context *smu, bool low);
 	int (*get_current_rpm)(struct smu_context *smu, uint32_t *speed);
 	uint32_t (*get_fan_control_mode)(struct smu_context *smu);
+	int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode);
 	int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed);
 	int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed);
 };
@@ -669,6 +670,8 @@  struct smu_funcs
 	((smu)->ppt_funcs->set_cpu_power_state ? (smu)->ppt_funcs->set_cpu_power_state((smu)) : 0)
 #define smu_get_fan_control_mode(smu) \
 	((smu)->funcs->get_fan_control_mode ? (smu)->funcs->get_fan_control_mode((smu)) : 0)
+#define smu_set_fan_control_mode(smu, value) \
+	((smu)->funcs->set_fan_control_mode ? (smu)->funcs->set_fan_control_mode((smu), (value)) : 0)
 #define smu_get_fan_speed_percent(smu, speed) \
 	((smu)->funcs->get_fan_speed_percent ? (smu)->funcs->get_fan_speed_percent((smu), (speed)) : 0)
 #define smu_set_fan_speed_percent(smu, speed) \
diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
index d8917b2..aaa1bd8 100644
--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
+++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
@@ -1833,6 +1833,36 @@  smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
 	return smu_v11_0_set_fan_static_mode(smu, FDO_PWM_MODE_STATIC);
 }
 
+static int
+smu_v11_0_set_fan_control_mode(struct smu_context *smu,
+			       uint32_t mode)
+{
+	int ret = 0;
+	bool start = 1;
+	bool stop  = 0;
+
+	switch (mode) {
+	case AMD_FAN_CTRL_NONE:
+		ret = smu_v11_0_set_fan_speed_percent(smu, 100);
+		break;
+	case AMD_FAN_CTRL_MANUAL:
+		ret = smu_v11_0_smc_fan_control(smu, stop);
+		break;
+	case AMD_FAN_CTRL_AUTO:
+		ret = smu_v11_0_smc_fan_control(smu, start);
+		break;
+	default:
+		break;
+	}
+
+	if (ret) {
+		pr_err("[%s]Set fan control mode failed!");
+		return -EINVAL;
+	}
+
+	return ret;
+}
+
 static const struct smu_funcs smu_v11_0_funcs = {
 	.init_microcode = smu_v11_0_init_microcode,
 	.load_microcode = smu_v11_0_load_microcode,
@@ -1885,6 +1915,7 @@  static const struct smu_funcs smu_v11_0_funcs = {
 	.dpm_set_vce_enable = smu_v11_0_dpm_set_vce_enable,
 	.get_current_rpm = smu_v11_0_get_current_rpm,
 	.get_fan_control_mode = smu_v11_0_get_fan_control_mode,
+	.set_fan_control_mode = smu_v11_0_set_fan_control_mode,
 	.get_fan_speed_percent = smu_v11_0_get_fan_speed_percent,
 	.set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
 };

Comments

On Mon, Feb 25, 2019 at 7:13 AM Huang Rui <ray.huang@amd.com> wrote:
>
> From: Chengming Gui <Jack.Gui@amd.com>
>
> 1, set get_pwm1_enable and set_pwm1_enable functions to call
> smu_get_fan_control_mode and smu_set_fan_control_mode for SMU11
> 2, implement set_fan_control_mode function
>
> v2: add return value in set_fan_control_mode function
>
> Signed-off-by: Chengming Gui <Jack.Gui@amd.com>
> Reviewed-by: Huang Rui <ray.huang@amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c         | 31 +++++++++++++++++---------
>  drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h |  3 +++
>  drivers/gpu/drm/amd/powerplay/smu_v11_0.c      | 31 ++++++++++++++++++++++++++
>  3 files changed, 55 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> index d40aa39..ac991f9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> @@ -1382,11 +1382,14 @@ static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,
>  {
>         struct amdgpu_device *adev = dev_get_drvdata(dev);
>         u32 pwm_mode = 0;
> +       if (is_support_sw_smu(adev))
> +               pwm_mode = smu_get_fan_control_mode(&adev->smu);
> +       else {

If either clause has { }, both should.  E.g.,

if () {
    ...
} else {
    ...
}
With that fixed:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>


> +               if (!adev->powerplay.pp_funcs->get_fan_control_mode)
> +                       return -EINVAL;
>
> -       if (!adev->powerplay.pp_funcs->get_fan_control_mode)
> -               return -EINVAL;
> -
> -       pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
> +               pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);
> +       }
>
>         return sprintf(buf, "%i\n", pwm_mode);
>  }
> @@ -1405,14 +1408,22 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,
>              (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON))
>                 return -EINVAL;
>
> -       if (!adev->powerplay.pp_funcs->set_fan_control_mode)
> -               return -EINVAL;
> +       if (is_support_sw_smu(adev)) {
> +               err = kstrtoint(buf, 10, &value);
> +               if (err)
> +                       return err;
>
> -       err = kstrtoint(buf, 10, &value);
> -       if (err)
> -               return err;
> +               smu_set_fan_control_mode(&adev->smu, value);
> +       } else {
> +               if (!adev->powerplay.pp_funcs->set_fan_control_mode)
> +                       return -EINVAL;
> +
> +               err = kstrtoint(buf, 10, &value);
> +               if (err)
> +                       return err;
>
> -       amdgpu_dpm_set_fan_control_mode(adev, value);
> +               amdgpu_dpm_set_fan_control_mode(adev, value);
> +       }
>
>         return count;
>  }
> diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> index f94d09d..ef2b807 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> @@ -533,6 +533,7 @@ struct smu_funcs
>         uint32_t (*get_mclk)(struct smu_context *smu, bool low);
>         int (*get_current_rpm)(struct smu_context *smu, uint32_t *speed);
>         uint32_t (*get_fan_control_mode)(struct smu_context *smu);
> +       int (*set_fan_control_mode)(struct smu_context *smu, uint32_t mode);
>         int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t *speed);
>         int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t speed);
>  };
> @@ -669,6 +670,8 @@ struct smu_funcs
>         ((smu)->ppt_funcs->set_cpu_power_state ? (smu)->ppt_funcs->set_cpu_power_state((smu)) : 0)
>  #define smu_get_fan_control_mode(smu) \
>         ((smu)->funcs->get_fan_control_mode ? (smu)->funcs->get_fan_control_mode((smu)) : 0)
> +#define smu_set_fan_control_mode(smu, value) \
> +       ((smu)->funcs->set_fan_control_mode ? (smu)->funcs->set_fan_control_mode((smu), (value)) : 0)
>  #define smu_get_fan_speed_percent(smu, speed) \
>         ((smu)->funcs->get_fan_speed_percent ? (smu)->funcs->get_fan_speed_percent((smu), (speed)) : 0)
>  #define smu_set_fan_speed_percent(smu, speed) \
> diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> index d8917b2..aaa1bd8 100644
> --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> @@ -1833,6 +1833,36 @@ smu_v11_0_set_fan_speed_percent(struct smu_context *smu, uint32_t speed)
>         return smu_v11_0_set_fan_static_mode(smu, FDO_PWM_MODE_STATIC);
>  }
>
> +static int
> +smu_v11_0_set_fan_control_mode(struct smu_context *smu,
> +                              uint32_t mode)
> +{
> +       int ret = 0;
> +       bool start = 1;
> +       bool stop  = 0;
> +
> +       switch (mode) {
> +       case AMD_FAN_CTRL_NONE:
> +               ret = smu_v11_0_set_fan_speed_percent(smu, 100);
> +               break;
> +       case AMD_FAN_CTRL_MANUAL:
> +               ret = smu_v11_0_smc_fan_control(smu, stop);
> +               break;
> +       case AMD_FAN_CTRL_AUTO:
> +               ret = smu_v11_0_smc_fan_control(smu, start);
> +               break;
> +       default:
> +               break;
> +       }
> +
> +       if (ret) {
> +               pr_err("[%s]Set fan control mode failed!");
> +               return -EINVAL;
> +       }
> +
> +       return ret;
> +}
> +
>  static const struct smu_funcs smu_v11_0_funcs = {
>         .init_microcode = smu_v11_0_init_microcode,
>         .load_microcode = smu_v11_0_load_microcode,
> @@ -1885,6 +1915,7 @@ static const struct smu_funcs smu_v11_0_funcs = {
>         .dpm_set_vce_enable = smu_v11_0_dpm_set_vce_enable,
>         .get_current_rpm = smu_v11_0_get_current_rpm,
>         .get_fan_control_mode = smu_v11_0_get_fan_control_mode,
> +       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,
>         .get_fan_speed_percent = smu_v11_0_get_fan_speed_percent,
>         .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,
>  };
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> -----Original Message-----

> From: Alex Deucher [mailto:alexdeucher@gmail.com]

> Sent: Tuesday, February 26, 2019 11:59 AM

> To: Huang, Ray <Ray.Huang@amd.com>

> Cc: amd-gfx list <amd-gfx@lists.freedesktop.org>; Gao, Likun

> <Likun.Gao@amd.com>; Wang, Kevin(Yang) <Kevin1.Wang@amd.com>; Gui,

> Jack <Jack.Gui@amd.com>

> Subject: Re: [PATCH 07/26] drm/amd/powerplay: implement pwm1_enable

> hwmon interface for SMU11

> 

> On Mon, Feb 25, 2019 at 7:13 AM Huang Rui <ray.huang@amd.com> wrote:

> >

> > From: Chengming Gui <Jack.Gui@amd.com>

> >

> > 1, set get_pwm1_enable and set_pwm1_enable functions to call

> > smu_get_fan_control_mode and smu_set_fan_control_mode for SMU11

> 2,

> > implement set_fan_control_mode function

> >

> > v2: add return value in set_fan_control_mode function

> >

> > Signed-off-by: Chengming Gui <Jack.Gui@amd.com>

> > Reviewed-by: Huang Rui <ray.huang@amd.com>

> > ---

> >  drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c         | 31

> +++++++++++++++++---------

> >  drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h |  3 +++

> >  drivers/gpu/drm/amd/powerplay/smu_v11_0.c      | 31

> ++++++++++++++++++++++++++

> >  3 files changed, 55 insertions(+), 10 deletions(-)

> >

> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c

> > b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c

> > index d40aa39..ac991f9 100644

> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c

> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c

> > @@ -1382,11 +1382,14 @@ static ssize_t

> > amdgpu_hwmon_get_pwm1_enable(struct device *dev,  {

> >         struct amdgpu_device *adev = dev_get_drvdata(dev);

> >         u32 pwm_mode = 0;

> > +       if (is_support_sw_smu(adev))

> > +               pwm_mode = smu_get_fan_control_mode(&adev->smu);

> > +       else {

> 

> If either clause has { }, both should.  E.g.,

> 

> if () {

>     ...

> } else {

>     ...

> }


Yes, will fix it.

Thanks,
Ray

> With that fixed:

> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> 

> 

> > +               if (!adev->powerplay.pp_funcs->get_fan_control_mode)

> > +                       return -EINVAL;

> >

> > -       if (!adev->powerplay.pp_funcs->get_fan_control_mode)

> > -               return -EINVAL;

> > -

> > -       pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);

> > +               pwm_mode = amdgpu_dpm_get_fan_control_mode(adev);

> > +       }

> >

> >         return sprintf(buf, "%i\n", pwm_mode);  } @@ -1405,14 +1408,22

> > @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,

> >              (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON))

> >                 return -EINVAL;

> >

> > -       if (!adev->powerplay.pp_funcs->set_fan_control_mode)

> > -               return -EINVAL;

> > +       if (is_support_sw_smu(adev)) {

> > +               err = kstrtoint(buf, 10, &value);

> > +               if (err)

> > +                       return err;

> >

> > -       err = kstrtoint(buf, 10, &value);

> > -       if (err)

> > -               return err;

> > +               smu_set_fan_control_mode(&adev->smu, value);

> > +       } else {

> > +               if (!adev->powerplay.pp_funcs->set_fan_control_mode)

> > +                       return -EINVAL;

> > +

> > +               err = kstrtoint(buf, 10, &value);

> > +               if (err)

> > +                       return err;

> >

> > -       amdgpu_dpm_set_fan_control_mode(adev, value);

> > +               amdgpu_dpm_set_fan_control_mode(adev, value);

> > +       }

> >

> >         return count;

> >  }

> > diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

> > b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

> > index f94d09d..ef2b807 100644

> > --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

> > +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h

> > @@ -533,6 +533,7 @@ struct smu_funcs

> >         uint32_t (*get_mclk)(struct smu_context *smu, bool low);

> >         int (*get_current_rpm)(struct smu_context *smu, uint32_t *speed);

> >         uint32_t (*get_fan_control_mode)(struct smu_context *smu);

> > +       int (*set_fan_control_mode)(struct smu_context *smu, uint32_t

> > + mode);

> >         int (*get_fan_speed_percent)(struct smu_context *smu, uint32_t

> *speed);

> >         int (*set_fan_speed_percent)(struct smu_context *smu, uint32_t

> > speed);  }; @@ -669,6 +670,8 @@ struct smu_funcs

> >         ((smu)->ppt_funcs->set_cpu_power_state ?

> > (smu)->ppt_funcs->set_cpu_power_state((smu)) : 0)  #define

> smu_get_fan_control_mode(smu) \

> >         ((smu)->funcs->get_fan_control_mode ?

> > (smu)->funcs->get_fan_control_mode((smu)) : 0)

> > +#define smu_set_fan_control_mode(smu, value) \

> > +       ((smu)->funcs->set_fan_control_mode ?

> > +(smu)->funcs->set_fan_control_mode((smu), (value)) : 0)

> >  #define smu_get_fan_speed_percent(smu, speed) \

> >         ((smu)->funcs->get_fan_speed_percent ?

> > (smu)->funcs->get_fan_speed_percent((smu), (speed)) : 0)  #define

> > smu_set_fan_speed_percent(smu, speed) \ diff --git

> > a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c

> > b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c

> > index d8917b2..aaa1bd8 100644

> > --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c

> > +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c

> > @@ -1833,6 +1833,36 @@ smu_v11_0_set_fan_speed_percent(struct

> smu_context *smu, uint32_t speed)

> >         return smu_v11_0_set_fan_static_mode(smu,

> > FDO_PWM_MODE_STATIC);  }

> >

> > +static int

> > +smu_v11_0_set_fan_control_mode(struct smu_context *smu,

> > +                              uint32_t mode) {

> > +       int ret = 0;

> > +       bool start = 1;

> > +       bool stop  = 0;

> > +

> > +       switch (mode) {

> > +       case AMD_FAN_CTRL_NONE:

> > +               ret = smu_v11_0_set_fan_speed_percent(smu, 100);

> > +               break;

> > +       case AMD_FAN_CTRL_MANUAL:

> > +               ret = smu_v11_0_smc_fan_control(smu, stop);

> > +               break;

> > +       case AMD_FAN_CTRL_AUTO:

> > +               ret = smu_v11_0_smc_fan_control(smu, start);

> > +               break;

> > +       default:

> > +               break;

> > +       }

> > +

> > +       if (ret) {

> > +               pr_err("[%s]Set fan control mode failed!");

> > +               return -EINVAL;

> > +       }

> > +

> > +       return ret;

> > +}

> > +

> >  static const struct smu_funcs smu_v11_0_funcs = {

> >         .init_microcode = smu_v11_0_init_microcode,

> >         .load_microcode = smu_v11_0_load_microcode, @@ -1885,6 +1915,7

> > @@ static const struct smu_funcs smu_v11_0_funcs = {

> >         .dpm_set_vce_enable = smu_v11_0_dpm_set_vce_enable,

> >         .get_current_rpm = smu_v11_0_get_current_rpm,

> >         .get_fan_control_mode = smu_v11_0_get_fan_control_mode,

> > +       .set_fan_control_mode = smu_v11_0_set_fan_control_mode,

> >         .get_fan_speed_percent = smu_v11_0_get_fan_speed_percent,

> >         .set_fan_speed_percent = smu_v11_0_set_fan_speed_percent,  };

> > --

> > 2.7.4

> >

> > _______________________________________________

> > amd-gfx mailing list

> > amd-gfx@lists.freedesktop.org

> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx