diff mbox series

[v12,3/4] drm/panfrost: devfreq: Disable devfreq when num_supplies > 1

Message ID 20210421081831.v12.3.I3af068abe30c9c85cabc4486385c52e56527a509@changeid (mailing list archive)
State New, archived
Headers show
Series drm/panfrost: Add support for mt8183 GPU | expand

Commit Message

Nicolas Boichat April 21, 2021, 12:19 a.m. UTC
GPUs with more than a single regulator (e.g. G72 on MT8183) will
require platform-specific handling for devfreq, for 2 reasons:
 1. The opp core (drivers/opp/core.c:_generic_set_opp_regulator)
    does not support multiple regulators, so we'll need custom
    handlers.
 2. Generally, platforms with 2 regulators have platform-specific
    constraints on how the voltages should be set (e.g.
    minimum/maximum voltage difference between them), so we
    should not just create generic handlers that simply
    change the voltages without taking care of those constraints.

Disable devfreq for now on those GPUs.

Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Reviewed-by: Steven Price <steven.price@arm.com>
---

(no changes since v9)

Changes in v9:
 - Explain why devfreq needs to be disabled for GPUs with >1
   regulators.

Changes in v8:
 - Use DRM_DEV_INFO instead of ERROR

Changes in v7:
 - Fix GPU ID in commit message

Changes in v6:
 - devfreq: New change

 drivers/gpu/drm/panfrost/panfrost_devfreq.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Comments

Nicolas Boichat April 21, 2021, 4 a.m. UTC | #1
Argh sorry I messed up the rebase and this doesn't even build...

I'll send v13.

On Wed, Apr 21, 2021 at 8:19 AM Nicolas Boichat <drinkcat@chromium.org> wrote:
>
> GPUs with more than a single regulator (e.g. G72 on MT8183) will
> require platform-specific handling for devfreq, for 2 reasons:
>  1. The opp core (drivers/opp/core.c:_generic_set_opp_regulator)
>     does not support multiple regulators, so we'll need custom
>     handlers.
>  2. Generally, platforms with 2 regulators have platform-specific
>     constraints on how the voltages should be set (e.g.
>     minimum/maximum voltage difference between them), so we
>     should not just create generic handlers that simply
>     change the voltages without taking care of those constraints.
>
> Disable devfreq for now on those GPUs.
>
> Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
> Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> Reviewed-by: Steven Price <steven.price@arm.com>
> ---
>
> (no changes since v9)
>
> Changes in v9:
>  - Explain why devfreq needs to be disabled for GPUs with >1
>    regulators.
>
> Changes in v8:
>  - Use DRM_DEV_INFO instead of ERROR
>
> Changes in v7:
>  - Fix GPU ID in commit message
>
> Changes in v6:
>  - devfreq: New change
>
>  drivers/gpu/drm/panfrost/panfrost_devfreq.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
> index 47d27e54a34f..aca3bb9a12e4 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
> @@ -92,9 +92,19 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
>         struct thermal_cooling_device *cooling;
>         struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
>
> -       ret = devm_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
> -                                        pfdev->comp->num_supplies);
> -       if (ret) {
> +       if (pfdev->comp->num_supplies > 1) {
> +               /*
> +                * GPUs with more than 1 supply require platform-specific handling:
> +                * continue without devfreq
> +                */
> +               DRM_DEV_INFO(dev, "More than 1 supply is not supported yet\n");
> +               return 0;
> +       }
> +
> +       opp_table = dev_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
> +                                             pfdev->comp->num_supplies);
> +       if (IS_ERR(opp_table)) {
> +               ret = PTR_ERR(opp_table);
>                 /* Continue if the optional regulator is missing */
>                 if (ret != -ENODEV) {
>                         DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");
> --
> 2.31.1.368.gbe11c130af-goog
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 47d27e54a34f..aca3bb9a12e4 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -92,9 +92,19 @@  int panfrost_devfreq_init(struct panfrost_device *pfdev)
 	struct thermal_cooling_device *cooling;
 	struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
 
-	ret = devm_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
-					 pfdev->comp->num_supplies);
-	if (ret) {
+	if (pfdev->comp->num_supplies > 1) {
+		/*
+		 * GPUs with more than 1 supply require platform-specific handling:
+		 * continue without devfreq
+		 */
+		DRM_DEV_INFO(dev, "More than 1 supply is not supported yet\n");
+		return 0;
+	}
+
+	opp_table = dev_pm_opp_set_regulators(dev, pfdev->comp->supply_names,
+					      pfdev->comp->num_supplies);
+	if (IS_ERR(opp_table)) {
+		ret = PTR_ERR(opp_table);
 		/* Continue if the optional regulator is missing */
 		if (ret != -ENODEV) {
 			DRM_DEV_ERROR(dev, "Couldn't set OPP regulators\n");