* [PATCH v3 00/14] Add regulator devfreq support to Panfrost
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Hi,
This serie cleans and adds regulator support to Panfrost devfreq.
This is mostly based on comment for the freshly introduced lima
devfreq.
We need to add regulator support because on Allwinner the GPU OPP
table defines both frequencies and voltages.
First patches [01-07] should not change the actual behavior
and introduce a proper panfrost_devfreq struct.
Regards,
Clément
Changes since v2:
- Collect Alyssa Rosenzweig reviewed-by tags
- Fix opp_set_regulator before adding opp_table (introduce in v2)
- Call err_fini in case opp_add_table failed
Changes since v1:
- Collect Steven Price reviewed-by tags
- Fix spinlock comment
- Drop OPP clock-name path
- Drop device_property_test patch
- Add rename error labels patch
Clément Péron (14):
drm/panfrost: avoid static declaration
drm/panfrost: clean headers in devfreq
drm/panfrost: don't use pfdevfreq.busy_count to know if hw is idle
drm/panfrost: introduce panfrost_devfreq struct
drm/panfrost: use spinlock instead of atomic
drm/panfrost: properly handle error in probe
drm/panfrost: rename error labels in device_init
drm/panfrost: move devfreq_init()/fini() in device
drm/panfrost: dynamically alloc regulators
drm/panfrost: add regulators to devfreq
arm64: defconfig: Enable devfreq cooling device
arm64: dts: allwinner: h6: Add cooling map for GPU
[DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
[DO NOT MERGE] arm64: dts: allwinner: force GPU regulator to be always
.../dts/allwinner/sun50i-h6-beelink-gs1.dts | 1 +
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 102 ++++++++++
arch/arm64/configs/defconfig | 1 +
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 175 ++++++++++++------
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 30 ++-
drivers/gpu/drm/panfrost/panfrost_device.c | 61 +++---
drivers/gpu/drm/panfrost/panfrost_device.h | 14 +-
drivers/gpu/drm/panfrost/panfrost_drv.c | 15 +-
drivers/gpu/drm/panfrost/panfrost_job.c | 10 +-
9 files changed, 296 insertions(+), 113 deletions(-)
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread
* [PATCH v3 01/14] drm/panfrost: avoid static declaration
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
This declaration can be avoided so change it.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 38 ++++++++++-----------
1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 413987038fbf..1b560b903ea6 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -14,7 +14,24 @@
#include "panfrost_gpu.h"
#include "panfrost_regs.h"
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev);
+static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
+{
+ ktime_t now;
+ ktime_t last;
+
+ if (!pfdev->devfreq.devfreq)
+ return;
+
+ now = ktime_get();
+ last = pfdev->devfreq.time_last_update;
+
+ if (atomic_read(&pfdev->devfreq.busy_count) > 0)
+ pfdev->devfreq.busy_time += ktime_sub(now, last);
+ else
+ pfdev->devfreq.idle_time += ktime_sub(now, last);
+
+ pfdev->devfreq.time_last_update = now;
+}
static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
u32 flags)
@@ -139,25 +156,6 @@ void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
devfreq_suspend_device(pfdev->devfreq.devfreq);
}
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
-{
- ktime_t now;
- ktime_t last;
-
- if (!pfdev->devfreq.devfreq)
- return;
-
- now = ktime_get();
- last = pfdev->devfreq.time_last_update;
-
- if (atomic_read(&pfdev->devfreq.busy_count) > 0)
- pfdev->devfreq.busy_time += ktime_sub(now, last);
- else
- pfdev->devfreq.idle_time += ktime_sub(now, last);
-
- pfdev->devfreq.time_last_update = now;
-}
-
void panfrost_devfreq_record_busy(struct panfrost_device *pfdev)
{
panfrost_devfreq_update_utilization(pfdev);
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 01/14] drm/panfrost: avoid static declaration
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
This declaration can be avoided so change it.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 38 ++++++++++-----------
1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 413987038fbf..1b560b903ea6 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -14,7 +14,24 @@
#include "panfrost_gpu.h"
#include "panfrost_regs.h"
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev);
+static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
+{
+ ktime_t now;
+ ktime_t last;
+
+ if (!pfdev->devfreq.devfreq)
+ return;
+
+ now = ktime_get();
+ last = pfdev->devfreq.time_last_update;
+
+ if (atomic_read(&pfdev->devfreq.busy_count) > 0)
+ pfdev->devfreq.busy_time += ktime_sub(now, last);
+ else
+ pfdev->devfreq.idle_time += ktime_sub(now, last);
+
+ pfdev->devfreq.time_last_update = now;
+}
static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
u32 flags)
@@ -139,25 +156,6 @@ void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
devfreq_suspend_device(pfdev->devfreq.devfreq);
}
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
-{
- ktime_t now;
- ktime_t last;
-
- if (!pfdev->devfreq.devfreq)
- return;
-
- now = ktime_get();
- last = pfdev->devfreq.time_last_update;
-
- if (atomic_read(&pfdev->devfreq.busy_count) > 0)
- pfdev->devfreq.busy_time += ktime_sub(now, last);
- else
- pfdev->devfreq.idle_time += ktime_sub(now, last);
-
- pfdev->devfreq.time_last_update = now;
-}
-
void panfrost_devfreq_record_busy(struct panfrost_device *pfdev)
{
panfrost_devfreq_update_utilization(pfdev);
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 02/14] drm/panfrost: clean headers in devfreq
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Don't include not required headers and sort them.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 1b560b903ea6..df7b71da9a84 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -1,18 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright 2019 Collabora ltd. */
+
+#include <linux/clk.h>
#include <linux/devfreq.h>
#include <linux/devfreq_cooling.h>
#include <linux/platform_device.h>
#include <linux/pm_opp.h>
-#include <linux/clk.h>
-#include <linux/regulator/consumer.h>
#include "panfrost_device.h"
#include "panfrost_devfreq.h"
-#include "panfrost_features.h"
-#include "panfrost_issues.h"
-#include "panfrost_gpu.h"
-#include "panfrost_regs.h"
static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
{
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 02/14] drm/panfrost: clean headers in devfreq
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Don't include not required headers and sort them.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 1b560b903ea6..df7b71da9a84 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -1,18 +1,14 @@
// SPDX-License-Identifier: GPL-2.0
/* Copyright 2019 Collabora ltd. */
+
+#include <linux/clk.h>
#include <linux/devfreq.h>
#include <linux/devfreq_cooling.h>
#include <linux/platform_device.h>
#include <linux/pm_opp.h>
-#include <linux/clk.h>
-#include <linux/regulator/consumer.h>
#include "panfrost_device.h"
#include "panfrost_devfreq.h"
-#include "panfrost_features.h"
-#include "panfrost_issues.h"
-#include "panfrost_gpu.h"
-#include "panfrost_regs.h"
static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
{
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 03/14] drm/panfrost: don't use pfdevfreq.busy_count to know if hw is idle
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
This use devfreq variable that will be lock with spinlock in future
patches. We should either introduce a function to access this one
but as devfreq is optional let's just remove it.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_job.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
index 7914b1570841..63e32a9f2749 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -581,10 +581,6 @@ int panfrost_job_is_idle(struct panfrost_device *pfdev)
struct panfrost_job_slot *js = pfdev->js;
int i;
- /* Check whether the hardware is idle */
- if (atomic_read(&pfdev->devfreq.busy_count))
- return false;
-
for (i = 0; i < NUM_JOB_SLOTS; i++) {
/* If there are any jobs in the HW queue, we're not idle */
if (atomic_read(&js->queue[i].sched.hw_rq_count))
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 03/14] drm/panfrost: don't use pfdevfreq.busy_count to know if hw is idle
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
This use devfreq variable that will be lock with spinlock in future
patches. We should either introduce a function to access this one
but as devfreq is optional let's just remove it.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_job.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
index 7914b1570841..63e32a9f2749 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -581,10 +581,6 @@ int panfrost_job_is_idle(struct panfrost_device *pfdev)
struct panfrost_job_slot *js = pfdev->js;
int i;
- /* Check whether the hardware is idle */
- if (atomic_read(&pfdev->devfreq.busy_count))
- return false;
-
for (i = 0; i < NUM_JOB_SLOTS; i++) {
/* If there are any jobs in the HW queue, we're not idle */
if (atomic_read(&js->queue[i].sched.hw_rq_count))
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 04/14] drm/panfrost: introduce panfrost_devfreq struct
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Introduce a proper panfrost_devfreq to deal with devfreq variables.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 76 ++++++++++++---------
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 20 +++++-
drivers/gpu/drm/panfrost/panfrost_device.h | 11 +--
drivers/gpu/drm/panfrost/panfrost_job.c | 6 +-
4 files changed, 66 insertions(+), 47 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index df7b71da9a84..962550363391 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -10,23 +10,23 @@
#include "panfrost_device.h"
#include "panfrost_devfreq.h"
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
+static void panfrost_devfreq_update_utilization(struct panfrost_devfreq *pfdevfreq)
{
ktime_t now;
ktime_t last;
- if (!pfdev->devfreq.devfreq)
+ if (!pfdevfreq->devfreq)
return;
now = ktime_get();
- last = pfdev->devfreq.time_last_update;
+ last = pfdevfreq->time_last_update;
- if (atomic_read(&pfdev->devfreq.busy_count) > 0)
- pfdev->devfreq.busy_time += ktime_sub(now, last);
+ if (atomic_read(&pfdevfreq->busy_count) > 0)
+ pfdevfreq->busy_time += ktime_sub(now, last);
else
- pfdev->devfreq.idle_time += ktime_sub(now, last);
+ pfdevfreq->idle_time += ktime_sub(now, last);
- pfdev->devfreq.time_last_update = now;
+ pfdevfreq->time_last_update = now;
}
static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
@@ -47,30 +47,31 @@ static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
return 0;
}
-static void panfrost_devfreq_reset(struct panfrost_device *pfdev)
+static void panfrost_devfreq_reset(struct panfrost_devfreq *pfdevfreq)
{
- pfdev->devfreq.busy_time = 0;
- pfdev->devfreq.idle_time = 0;
- pfdev->devfreq.time_last_update = ktime_get();
+ pfdevfreq->busy_time = 0;
+ pfdevfreq->idle_time = 0;
+ pfdevfreq->time_last_update = ktime_get();
}
static int panfrost_devfreq_get_dev_status(struct device *dev,
struct devfreq_dev_status *status)
{
struct panfrost_device *pfdev = dev_get_drvdata(dev);
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
- panfrost_devfreq_update_utilization(pfdev);
+ panfrost_devfreq_update_utilization(pfdevfreq);
status->current_frequency = clk_get_rate(pfdev->clock);
- status->total_time = ktime_to_ns(ktime_add(pfdev->devfreq.busy_time,
- pfdev->devfreq.idle_time));
+ status->total_time = ktime_to_ns(ktime_add(pfdevfreq->busy_time,
+ pfdevfreq->idle_time));
- status->busy_time = ktime_to_ns(pfdev->devfreq.busy_time);
+ status->busy_time = ktime_to_ns(pfdevfreq->busy_time);
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
- dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n", status->busy_time,
- status->total_time,
+ dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n",
+ status->busy_time, status->total_time,
status->busy_time / (status->total_time / 100),
status->current_frequency / 1000 / 1000);
@@ -91,6 +92,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
struct device *dev = &pfdev->pdev->dev;
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
ret = dev_pm_opp_of_add_table(dev);
if (ret == -ENODEV) /* Optional, continue without devfreq */
@@ -98,7 +100,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
else if (ret)
return ret;
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
cur_freq = clk_get_rate(pfdev->clock);
@@ -116,53 +118,59 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
dev_pm_opp_of_remove_table(dev);
return PTR_ERR(devfreq);
}
- pfdev->devfreq.devfreq = devfreq;
+ pfdevfreq->devfreq = devfreq;
cooling = of_devfreq_cooling_register(dev->of_node, devfreq);
if (IS_ERR(cooling))
DRM_DEV_INFO(dev, "Failed to register cooling device\n");
else
- pfdev->devfreq.cooling = cooling;
+ pfdevfreq->cooling = cooling;
return 0;
}
void panfrost_devfreq_fini(struct panfrost_device *pfdev)
{
- if (pfdev->devfreq.cooling)
- devfreq_cooling_unregister(pfdev->devfreq.cooling);
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (pfdevfreq->cooling)
+ devfreq_cooling_unregister(pfdevfreq->cooling);
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
{
- if (!pfdev->devfreq.devfreq)
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (!pfdevfreq->devfreq)
return;
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
- devfreq_resume_device(pfdev->devfreq.devfreq);
+ devfreq_resume_device(pfdevfreq->devfreq);
}
void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
{
- if (!pfdev->devfreq.devfreq)
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (!pfdevfreq->devfreq)
return;
- devfreq_suspend_device(pfdev->devfreq.devfreq);
+ devfreq_suspend_device(pfdevfreq->devfreq);
}
-void panfrost_devfreq_record_busy(struct panfrost_device *pfdev)
+void panfrost_devfreq_record_busy(struct panfrost_devfreq *pfdevfreq)
{
- panfrost_devfreq_update_utilization(pfdev);
- atomic_inc(&pfdev->devfreq.busy_count);
+ panfrost_devfreq_update_utilization(pfdevfreq);
+ atomic_inc(&pfdevfreq->busy_count);
}
-void panfrost_devfreq_record_idle(struct panfrost_device *pfdev)
+void panfrost_devfreq_record_idle(struct panfrost_devfreq *pfdevfreq)
{
int count;
- panfrost_devfreq_update_utilization(pfdev);
- count = atomic_dec_if_positive(&pfdev->devfreq.busy_count);
+ panfrost_devfreq_update_utilization(pfdevfreq);
+ count = atomic_dec_if_positive(&pfdevfreq->busy_count);
WARN_ON(count < 0);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 0611beffc8d0..0697f8d5aa34 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -4,13 +4,29 @@
#ifndef __PANFROST_DEVFREQ_H__
#define __PANFROST_DEVFREQ_H__
+#include <linux/ktime.h>
+
+struct devfreq;
+struct thermal_cooling_device;
+
+struct panfrost_device;
+
+struct panfrost_devfreq {
+ struct devfreq *devfreq;
+ struct thermal_cooling_device *cooling;
+ ktime_t busy_time;
+ ktime_t idle_time;
+ ktime_t time_last_update;
+ atomic_t busy_count;
+};
+
int panfrost_devfreq_init(struct panfrost_device *pfdev);
void panfrost_devfreq_fini(struct panfrost_device *pfdev);
void panfrost_devfreq_resume(struct panfrost_device *pfdev);
void panfrost_devfreq_suspend(struct panfrost_device *pfdev);
-void panfrost_devfreq_record_busy(struct panfrost_device *pfdev);
-void panfrost_devfreq_record_idle(struct panfrost_device *pfdev);
+void panfrost_devfreq_record_busy(struct panfrost_devfreq *devfreq);
+void panfrost_devfreq_record_idle(struct panfrost_devfreq *devfreq);
#endif /* __PANFROST_DEVFREQ_H__ */
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
index c30c719a8059..2efa59c9d1c5 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
@@ -13,6 +13,8 @@
#include <drm/drm_mm.h>
#include <drm/gpu_scheduler.h>
+#include "panfrost_devfreq.h"
+
struct panfrost_device;
struct panfrost_mmu;
struct panfrost_job_slot;
@@ -107,14 +109,7 @@ struct panfrost_device {
struct list_head shrinker_list;
struct shrinker shrinker;
- struct {
- struct devfreq *devfreq;
- struct thermal_cooling_device *cooling;
- ktime_t busy_time;
- ktime_t idle_time;
- ktime_t time_last_update;
- atomic_t busy_count;
- } devfreq;
+ struct panfrost_devfreq pfdevfreq;
};
struct panfrost_mmu {
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
index 63e32a9f2749..a67f3eac6a58 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -155,7 +155,7 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
}
cfg = panfrost_mmu_as_get(pfdev, &job->file_priv->mmu);
- panfrost_devfreq_record_busy(pfdev);
+ panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
job_write(pfdev, JS_HEAD_NEXT_LO(js), jc_head & 0xFFFFFFFF);
job_write(pfdev, JS_HEAD_NEXT_HI(js), jc_head >> 32);
@@ -415,7 +415,7 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
}
spin_unlock_irqrestore(&pfdev->js->job_lock, flags);
- panfrost_devfreq_record_idle(pfdev);
+ panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
panfrost_device_reset(pfdev);
for (i = 0; i < NUM_JOB_SLOTS; i++)
@@ -478,7 +478,7 @@ static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
pfdev->jobs[j] = NULL;
panfrost_mmu_as_put(pfdev, &job->file_priv->mmu);
- panfrost_devfreq_record_idle(pfdev);
+ panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
dma_fence_signal_locked(job->done_fence);
pm_runtime_put_autosuspend(pfdev->dev);
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 04/14] drm/panfrost: introduce panfrost_devfreq struct
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Introduce a proper panfrost_devfreq to deal with devfreq variables.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 76 ++++++++++++---------
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 20 +++++-
drivers/gpu/drm/panfrost/panfrost_device.h | 11 +--
drivers/gpu/drm/panfrost/panfrost_job.c | 6 +-
4 files changed, 66 insertions(+), 47 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index df7b71da9a84..962550363391 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -10,23 +10,23 @@
#include "panfrost_device.h"
#include "panfrost_devfreq.h"
-static void panfrost_devfreq_update_utilization(struct panfrost_device *pfdev)
+static void panfrost_devfreq_update_utilization(struct panfrost_devfreq *pfdevfreq)
{
ktime_t now;
ktime_t last;
- if (!pfdev->devfreq.devfreq)
+ if (!pfdevfreq->devfreq)
return;
now = ktime_get();
- last = pfdev->devfreq.time_last_update;
+ last = pfdevfreq->time_last_update;
- if (atomic_read(&pfdev->devfreq.busy_count) > 0)
- pfdev->devfreq.busy_time += ktime_sub(now, last);
+ if (atomic_read(&pfdevfreq->busy_count) > 0)
+ pfdevfreq->busy_time += ktime_sub(now, last);
else
- pfdev->devfreq.idle_time += ktime_sub(now, last);
+ pfdevfreq->idle_time += ktime_sub(now, last);
- pfdev->devfreq.time_last_update = now;
+ pfdevfreq->time_last_update = now;
}
static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
@@ -47,30 +47,31 @@ static int panfrost_devfreq_target(struct device *dev, unsigned long *freq,
return 0;
}
-static void panfrost_devfreq_reset(struct panfrost_device *pfdev)
+static void panfrost_devfreq_reset(struct panfrost_devfreq *pfdevfreq)
{
- pfdev->devfreq.busy_time = 0;
- pfdev->devfreq.idle_time = 0;
- pfdev->devfreq.time_last_update = ktime_get();
+ pfdevfreq->busy_time = 0;
+ pfdevfreq->idle_time = 0;
+ pfdevfreq->time_last_update = ktime_get();
}
static int panfrost_devfreq_get_dev_status(struct device *dev,
struct devfreq_dev_status *status)
{
struct panfrost_device *pfdev = dev_get_drvdata(dev);
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
- panfrost_devfreq_update_utilization(pfdev);
+ panfrost_devfreq_update_utilization(pfdevfreq);
status->current_frequency = clk_get_rate(pfdev->clock);
- status->total_time = ktime_to_ns(ktime_add(pfdev->devfreq.busy_time,
- pfdev->devfreq.idle_time));
+ status->total_time = ktime_to_ns(ktime_add(pfdevfreq->busy_time,
+ pfdevfreq->idle_time));
- status->busy_time = ktime_to_ns(pfdev->devfreq.busy_time);
+ status->busy_time = ktime_to_ns(pfdevfreq->busy_time);
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
- dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n", status->busy_time,
- status->total_time,
+ dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n",
+ status->busy_time, status->total_time,
status->busy_time / (status->total_time / 100),
status->current_frequency / 1000 / 1000);
@@ -91,6 +92,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
struct device *dev = &pfdev->pdev->dev;
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
ret = dev_pm_opp_of_add_table(dev);
if (ret == -ENODEV) /* Optional, continue without devfreq */
@@ -98,7 +100,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
else if (ret)
return ret;
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
cur_freq = clk_get_rate(pfdev->clock);
@@ -116,53 +118,59 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
dev_pm_opp_of_remove_table(dev);
return PTR_ERR(devfreq);
}
- pfdev->devfreq.devfreq = devfreq;
+ pfdevfreq->devfreq = devfreq;
cooling = of_devfreq_cooling_register(dev->of_node, devfreq);
if (IS_ERR(cooling))
DRM_DEV_INFO(dev, "Failed to register cooling device\n");
else
- pfdev->devfreq.cooling = cooling;
+ pfdevfreq->cooling = cooling;
return 0;
}
void panfrost_devfreq_fini(struct panfrost_device *pfdev)
{
- if (pfdev->devfreq.cooling)
- devfreq_cooling_unregister(pfdev->devfreq.cooling);
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (pfdevfreq->cooling)
+ devfreq_cooling_unregister(pfdevfreq->cooling);
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
{
- if (!pfdev->devfreq.devfreq)
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (!pfdevfreq->devfreq)
return;
- panfrost_devfreq_reset(pfdev);
+ panfrost_devfreq_reset(pfdevfreq);
- devfreq_resume_device(pfdev->devfreq.devfreq);
+ devfreq_resume_device(pfdevfreq->devfreq);
}
void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
{
- if (!pfdev->devfreq.devfreq)
+ struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+
+ if (!pfdevfreq->devfreq)
return;
- devfreq_suspend_device(pfdev->devfreq.devfreq);
+ devfreq_suspend_device(pfdevfreq->devfreq);
}
-void panfrost_devfreq_record_busy(struct panfrost_device *pfdev)
+void panfrost_devfreq_record_busy(struct panfrost_devfreq *pfdevfreq)
{
- panfrost_devfreq_update_utilization(pfdev);
- atomic_inc(&pfdev->devfreq.busy_count);
+ panfrost_devfreq_update_utilization(pfdevfreq);
+ atomic_inc(&pfdevfreq->busy_count);
}
-void panfrost_devfreq_record_idle(struct panfrost_device *pfdev)
+void panfrost_devfreq_record_idle(struct panfrost_devfreq *pfdevfreq)
{
int count;
- panfrost_devfreq_update_utilization(pfdev);
- count = atomic_dec_if_positive(&pfdev->devfreq.busy_count);
+ panfrost_devfreq_update_utilization(pfdevfreq);
+ count = atomic_dec_if_positive(&pfdevfreq->busy_count);
WARN_ON(count < 0);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 0611beffc8d0..0697f8d5aa34 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -4,13 +4,29 @@
#ifndef __PANFROST_DEVFREQ_H__
#define __PANFROST_DEVFREQ_H__
+#include <linux/ktime.h>
+
+struct devfreq;
+struct thermal_cooling_device;
+
+struct panfrost_device;
+
+struct panfrost_devfreq {
+ struct devfreq *devfreq;
+ struct thermal_cooling_device *cooling;
+ ktime_t busy_time;
+ ktime_t idle_time;
+ ktime_t time_last_update;
+ atomic_t busy_count;
+};
+
int panfrost_devfreq_init(struct panfrost_device *pfdev);
void panfrost_devfreq_fini(struct panfrost_device *pfdev);
void panfrost_devfreq_resume(struct panfrost_device *pfdev);
void panfrost_devfreq_suspend(struct panfrost_device *pfdev);
-void panfrost_devfreq_record_busy(struct panfrost_device *pfdev);
-void panfrost_devfreq_record_idle(struct panfrost_device *pfdev);
+void panfrost_devfreq_record_busy(struct panfrost_devfreq *devfreq);
+void panfrost_devfreq_record_idle(struct panfrost_devfreq *devfreq);
#endif /* __PANFROST_DEVFREQ_H__ */
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
index c30c719a8059..2efa59c9d1c5 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
@@ -13,6 +13,8 @@
#include <drm/drm_mm.h>
#include <drm/gpu_scheduler.h>
+#include "panfrost_devfreq.h"
+
struct panfrost_device;
struct panfrost_mmu;
struct panfrost_job_slot;
@@ -107,14 +109,7 @@ struct panfrost_device {
struct list_head shrinker_list;
struct shrinker shrinker;
- struct {
- struct devfreq *devfreq;
- struct thermal_cooling_device *cooling;
- ktime_t busy_time;
- ktime_t idle_time;
- ktime_t time_last_update;
- atomic_t busy_count;
- } devfreq;
+ struct panfrost_devfreq pfdevfreq;
};
struct panfrost_mmu {
diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
index 63e32a9f2749..a67f3eac6a58 100644
--- a/drivers/gpu/drm/panfrost/panfrost_job.c
+++ b/drivers/gpu/drm/panfrost/panfrost_job.c
@@ -155,7 +155,7 @@ static void panfrost_job_hw_submit(struct panfrost_job *job, int js)
}
cfg = panfrost_mmu_as_get(pfdev, &job->file_priv->mmu);
- panfrost_devfreq_record_busy(pfdev);
+ panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
job_write(pfdev, JS_HEAD_NEXT_LO(js), jc_head & 0xFFFFFFFF);
job_write(pfdev, JS_HEAD_NEXT_HI(js), jc_head >> 32);
@@ -415,7 +415,7 @@ static void panfrost_job_timedout(struct drm_sched_job *sched_job)
}
spin_unlock_irqrestore(&pfdev->js->job_lock, flags);
- panfrost_devfreq_record_idle(pfdev);
+ panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
panfrost_device_reset(pfdev);
for (i = 0; i < NUM_JOB_SLOTS; i++)
@@ -478,7 +478,7 @@ static irqreturn_t panfrost_job_irq_handler(int irq, void *data)
pfdev->jobs[j] = NULL;
panfrost_mmu_as_put(pfdev, &job->file_priv->mmu);
- panfrost_devfreq_record_idle(pfdev);
+ panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
dma_fence_signal_locked(job->done_fence);
pm_runtime_put_autosuspend(pfdev->dev);
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 05/14] drm/panfrost: use spinlock instead of atomic
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Convert busy_count to a simple int protected by spinlock.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 43 +++++++++++++++------
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 9 ++++-
2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 962550363391..78753cfb59fb 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -12,16 +12,12 @@
static void panfrost_devfreq_update_utilization(struct panfrost_devfreq *pfdevfreq)
{
- ktime_t now;
- ktime_t last;
-
- if (!pfdevfreq->devfreq)
- return;
+ ktime_t now, last;
now = ktime_get();
last = pfdevfreq->time_last_update;
- if (atomic_read(&pfdevfreq->busy_count) > 0)
+ if (pfdevfreq->busy_count > 0)
pfdevfreq->busy_time += ktime_sub(now, last);
else
pfdevfreq->idle_time += ktime_sub(now, last);
@@ -59,10 +55,14 @@ static int panfrost_devfreq_get_dev_status(struct device *dev,
{
struct panfrost_device *pfdev = dev_get_drvdata(dev);
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+ unsigned long irqflags;
+
+ status->current_frequency = clk_get_rate(pfdev->clock);
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
panfrost_devfreq_update_utilization(pfdevfreq);
- status->current_frequency = clk_get_rate(pfdev->clock);
status->total_time = ktime_to_ns(ktime_add(pfdevfreq->busy_time,
pfdevfreq->idle_time));
@@ -70,6 +70,8 @@ static int panfrost_devfreq_get_dev_status(struct device *dev,
panfrost_devfreq_reset(pfdevfreq);
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
+
dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n",
status->busy_time, status->total_time,
status->busy_time / (status->total_time / 100),
@@ -100,6 +102,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
else if (ret)
return ret;
+ spin_lock_init(&pfdevfreq->lock);
+
panfrost_devfreq_reset(pfdevfreq);
cur_freq = clk_get_rate(pfdev->clock);
@@ -162,15 +166,32 @@ void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
void panfrost_devfreq_record_busy(struct panfrost_devfreq *pfdevfreq)
{
+ unsigned long irqflags;
+
+ if (!pfdevfreq->devfreq)
+ return;
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
+
panfrost_devfreq_update_utilization(pfdevfreq);
- atomic_inc(&pfdevfreq->busy_count);
+
+ pfdevfreq->busy_count++;
+
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
}
void panfrost_devfreq_record_idle(struct panfrost_devfreq *pfdevfreq)
{
- int count;
+ unsigned long irqflags;
+
+ if (!pfdevfreq->devfreq)
+ return;
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
panfrost_devfreq_update_utilization(pfdevfreq);
- count = atomic_dec_if_positive(&pfdevfreq->busy_count);
- WARN_ON(count < 0);
+
+ WARN_ON(--pfdevfreq->busy_count < 0);
+
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 0697f8d5aa34..3392df1020be 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -4,6 +4,7 @@
#ifndef __PANFROST_DEVFREQ_H__
#define __PANFROST_DEVFREQ_H__
+#include <linux/spinlock.h>
#include <linux/ktime.h>
struct devfreq;
@@ -14,10 +15,16 @@ struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+
ktime_t busy_time;
ktime_t idle_time;
ktime_t time_last_update;
- atomic_t busy_count;
+ int busy_count;
+ /*
+ * Protect busy_time, idle_time, time_last_update and busy_count
+ * because these can be updated concurrently between multiple jobs.
+ */
+ spinlock_t lock;
};
int panfrost_devfreq_init(struct panfrost_device *pfdev);
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 05/14] drm/panfrost: use spinlock instead of atomic
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Convert busy_count to a simple int protected by spinlock.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 43 +++++++++++++++------
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 9 ++++-
2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 962550363391..78753cfb59fb 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -12,16 +12,12 @@
static void panfrost_devfreq_update_utilization(struct panfrost_devfreq *pfdevfreq)
{
- ktime_t now;
- ktime_t last;
-
- if (!pfdevfreq->devfreq)
- return;
+ ktime_t now, last;
now = ktime_get();
last = pfdevfreq->time_last_update;
- if (atomic_read(&pfdevfreq->busy_count) > 0)
+ if (pfdevfreq->busy_count > 0)
pfdevfreq->busy_time += ktime_sub(now, last);
else
pfdevfreq->idle_time += ktime_sub(now, last);
@@ -59,10 +55,14 @@ static int panfrost_devfreq_get_dev_status(struct device *dev,
{
struct panfrost_device *pfdev = dev_get_drvdata(dev);
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+ unsigned long irqflags;
+
+ status->current_frequency = clk_get_rate(pfdev->clock);
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
panfrost_devfreq_update_utilization(pfdevfreq);
- status->current_frequency = clk_get_rate(pfdev->clock);
status->total_time = ktime_to_ns(ktime_add(pfdevfreq->busy_time,
pfdevfreq->idle_time));
@@ -70,6 +70,8 @@ static int panfrost_devfreq_get_dev_status(struct device *dev,
panfrost_devfreq_reset(pfdevfreq);
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
+
dev_dbg(pfdev->dev, "busy %lu total %lu %lu %% freq %lu MHz\n",
status->busy_time, status->total_time,
status->busy_time / (status->total_time / 100),
@@ -100,6 +102,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
else if (ret)
return ret;
+ spin_lock_init(&pfdevfreq->lock);
+
panfrost_devfreq_reset(pfdevfreq);
cur_freq = clk_get_rate(pfdev->clock);
@@ -162,15 +166,32 @@ void panfrost_devfreq_suspend(struct panfrost_device *pfdev)
void panfrost_devfreq_record_busy(struct panfrost_devfreq *pfdevfreq)
{
+ unsigned long irqflags;
+
+ if (!pfdevfreq->devfreq)
+ return;
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
+
panfrost_devfreq_update_utilization(pfdevfreq);
- atomic_inc(&pfdevfreq->busy_count);
+
+ pfdevfreq->busy_count++;
+
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
}
void panfrost_devfreq_record_idle(struct panfrost_devfreq *pfdevfreq)
{
- int count;
+ unsigned long irqflags;
+
+ if (!pfdevfreq->devfreq)
+ return;
+
+ spin_lock_irqsave(&pfdevfreq->lock, irqflags);
panfrost_devfreq_update_utilization(pfdevfreq);
- count = atomic_dec_if_positive(&pfdevfreq->busy_count);
- WARN_ON(count < 0);
+
+ WARN_ON(--pfdevfreq->busy_count < 0);
+
+ spin_unlock_irqrestore(&pfdevfreq->lock, irqflags);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 0697f8d5aa34..3392df1020be 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -4,6 +4,7 @@
#ifndef __PANFROST_DEVFREQ_H__
#define __PANFROST_DEVFREQ_H__
+#include <linux/spinlock.h>
#include <linux/ktime.h>
struct devfreq;
@@ -14,10 +15,16 @@ struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+
ktime_t busy_time;
ktime_t idle_time;
ktime_t time_last_update;
- atomic_t busy_count;
+ int busy_count;
+ /*
+ * Protect busy_time, idle_time, time_last_update and busy_count
+ * because these can be updated concurrently between multiple jobs.
+ */
+ spinlock_t lock;
};
int panfrost_devfreq_init(struct panfrost_device *pfdev);
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 06/14] drm/panfrost: properly handle error in probe
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Introduce a boolean to know if opp table has been added.
With this, we can call panfrost_devfreq_fini() in case of error
and release what has been initialised.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 25 ++++++++++++++++-----
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 1 +
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 78753cfb59fb..d9007f44b772 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -101,6 +101,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
return 0;
else if (ret)
return ret;
+ pfdevfreq->opp_of_table_added = true;
spin_lock_init(&pfdevfreq->lock);
@@ -109,8 +110,10 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
cur_freq = clk_get_rate(pfdev->clock);
opp = devfreq_recommended_opp(dev, &cur_freq, 0);
- if (IS_ERR(opp))
- return PTR_ERR(opp);
+ if (IS_ERR(opp)) {
+ ret = PTR_ERR(opp);
+ goto err_fini;
+ }
panfrost_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp);
@@ -119,8 +122,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
if (IS_ERR(devfreq)) {
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
- dev_pm_opp_of_remove_table(dev);
- return PTR_ERR(devfreq);
+ ret = PTR_ERR(devfreq);
+ goto err_fini;
}
pfdevfreq->devfreq = devfreq;
@@ -131,15 +134,25 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
pfdevfreq->cooling = cooling;
return 0;
+
+err_fini:
+ panfrost_devfreq_fini(pfdev);
+ return ret;
}
void panfrost_devfreq_fini(struct panfrost_device *pfdev)
{
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
- if (pfdevfreq->cooling)
+ if (pfdevfreq->cooling) {
devfreq_cooling_unregister(pfdevfreq->cooling);
- dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
+ pfdevfreq->cooling = NULL;
+ }
+
+ if (pfdevfreq->opp_of_table_added) {
+ dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
+ pfdevfreq->opp_of_table_added = false;
+ }
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 3392df1020be..210269944687 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -15,6 +15,7 @@ struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+ bool opp_of_table_added;
ktime_t busy_time;
ktime_t idle_time;
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 06/14] drm/panfrost: properly handle error in probe
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Introduce a boolean to know if opp table has been added.
With this, we can call panfrost_devfreq_fini() in case of error
and release what has been initialised.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 25 ++++++++++++++++-----
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 1 +
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index 78753cfb59fb..d9007f44b772 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -101,6 +101,7 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
return 0;
else if (ret)
return ret;
+ pfdevfreq->opp_of_table_added = true;
spin_lock_init(&pfdevfreq->lock);
@@ -109,8 +110,10 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
cur_freq = clk_get_rate(pfdev->clock);
opp = devfreq_recommended_opp(dev, &cur_freq, 0);
- if (IS_ERR(opp))
- return PTR_ERR(opp);
+ if (IS_ERR(opp)) {
+ ret = PTR_ERR(opp);
+ goto err_fini;
+ }
panfrost_devfreq_profile.initial_freq = cur_freq;
dev_pm_opp_put(opp);
@@ -119,8 +122,8 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
DEVFREQ_GOV_SIMPLE_ONDEMAND, NULL);
if (IS_ERR(devfreq)) {
DRM_DEV_ERROR(dev, "Couldn't initialize GPU devfreq\n");
- dev_pm_opp_of_remove_table(dev);
- return PTR_ERR(devfreq);
+ ret = PTR_ERR(devfreq);
+ goto err_fini;
}
pfdevfreq->devfreq = devfreq;
@@ -131,15 +134,25 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
pfdevfreq->cooling = cooling;
return 0;
+
+err_fini:
+ panfrost_devfreq_fini(pfdev);
+ return ret;
}
void panfrost_devfreq_fini(struct panfrost_device *pfdev)
{
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
- if (pfdevfreq->cooling)
+ if (pfdevfreq->cooling) {
devfreq_cooling_unregister(pfdevfreq->cooling);
- dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
+ pfdevfreq->cooling = NULL;
+ }
+
+ if (pfdevfreq->opp_of_table_added) {
+ dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
+ pfdevfreq->opp_of_table_added = false;
+ }
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 3392df1020be..210269944687 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -15,6 +15,7 @@ struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
struct thermal_cooling_device *cooling;
+ bool opp_of_table_added;
ktime_t busy_time;
ktime_t idle_time;
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 07/14] drm/panfrost: rename error labels in device_init
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Rename goto labels in device_init it will be easier to maintain.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 30 +++++++++++-----------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 8136babd3ba9..cc16d102b275 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -215,57 +215,57 @@ int panfrost_device_init(struct panfrost_device *pfdev)
err = panfrost_regulator_init(pfdev);
if (err) {
dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto err_out0;
+ goto out_clk;
}
err = panfrost_reset_init(pfdev);
if (err) {
dev_err(pfdev->dev, "reset init failed %d\n", err);
- goto err_out1;
+ goto out_regulator;
}
err = panfrost_pm_domain_init(pfdev);
if (err)
- goto err_out2;
+ goto out_reset;
res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0);
pfdev->iomem = devm_ioremap_resource(pfdev->dev, res);
if (IS_ERR(pfdev->iomem)) {
dev_err(pfdev->dev, "failed to ioremap iomem\n");
err = PTR_ERR(pfdev->iomem);
- goto err_out3;
+ goto out_pm_domain;
}
err = panfrost_gpu_init(pfdev);
if (err)
- goto err_out3;
+ goto out_pm_domain;
err = panfrost_mmu_init(pfdev);
if (err)
- goto err_out4;
+ goto out_gpu;
err = panfrost_job_init(pfdev);
if (err)
- goto err_out5;
+ goto out_mmu;
err = panfrost_perfcnt_init(pfdev);
if (err)
- goto err_out6;
+ goto out_job;
return 0;
-err_out6:
+out_job:
panfrost_job_fini(pfdev);
-err_out5:
+out_mmu:
panfrost_mmu_fini(pfdev);
-err_out4:
+out_gpu:
panfrost_gpu_fini(pfdev);
-err_out3:
+out_pm_domain:
panfrost_pm_domain_fini(pfdev);
-err_out2:
+out_reset:
panfrost_reset_fini(pfdev);
-err_out1:
+out_regulator:
panfrost_regulator_fini(pfdev);
-err_out0:
+out_clk:
panfrost_clk_fini(pfdev);
return err;
}
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 07/14] drm/panfrost: rename error labels in device_init
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Rename goto labels in device_init it will be easier to maintain.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 30 +++++++++++-----------
1 file changed, 15 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 8136babd3ba9..cc16d102b275 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -215,57 +215,57 @@ int panfrost_device_init(struct panfrost_device *pfdev)
err = panfrost_regulator_init(pfdev);
if (err) {
dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto err_out0;
+ goto out_clk;
}
err = panfrost_reset_init(pfdev);
if (err) {
dev_err(pfdev->dev, "reset init failed %d\n", err);
- goto err_out1;
+ goto out_regulator;
}
err = panfrost_pm_domain_init(pfdev);
if (err)
- goto err_out2;
+ goto out_reset;
res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0);
pfdev->iomem = devm_ioremap_resource(pfdev->dev, res);
if (IS_ERR(pfdev->iomem)) {
dev_err(pfdev->dev, "failed to ioremap iomem\n");
err = PTR_ERR(pfdev->iomem);
- goto err_out3;
+ goto out_pm_domain;
}
err = panfrost_gpu_init(pfdev);
if (err)
- goto err_out3;
+ goto out_pm_domain;
err = panfrost_mmu_init(pfdev);
if (err)
- goto err_out4;
+ goto out_gpu;
err = panfrost_job_init(pfdev);
if (err)
- goto err_out5;
+ goto out_mmu;
err = panfrost_perfcnt_init(pfdev);
if (err)
- goto err_out6;
+ goto out_job;
return 0;
-err_out6:
+out_job:
panfrost_job_fini(pfdev);
-err_out5:
+out_mmu:
panfrost_mmu_fini(pfdev);
-err_out4:
+out_gpu:
panfrost_gpu_fini(pfdev);
-err_out3:
+out_pm_domain:
panfrost_pm_domain_fini(pfdev);
-err_out2:
+out_reset:
panfrost_reset_fini(pfdev);
-err_out1:
+out_regulator:
panfrost_regulator_fini(pfdev);
-err_out0:
+out_clk:
panfrost_clk_fini(pfdev);
return err;
}
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [PATCH v3 07/14] drm/panfrost: rename error labels in device_init
2020-07-09 14:03 ` Clément Péron
@ 2020-07-10 9:05 ` Steven Price
-1 siblings, 0 replies; 40+ messages in thread
From: Steven Price @ 2020-07-10 9:05 UTC (permalink / raw)
To: Clément Péron, Rob Herring, Tomeu Vizoso,
Alyssa Rosenzweig, Viresh Kumar, Nishanth Menon, Stephen Boyd,
Maxime Ripard, Chen-Yu Tsai
Cc: dri-devel, linux-kernel
On 09/07/2020 15:03, Clément Péron wrote:
> Rename goto labels in device_init it will be easier to maintain.
>
> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
Nice clean up, thanks. As you noted this needs rebasing as the
"regulator init" message has gone.
Reviewed-by: Steven Price <steven.price@arm.com>
> ---
> drivers/gpu/drm/panfrost/panfrost_device.c | 30 +++++++++++-----------
> 1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
> index 8136babd3ba9..cc16d102b275 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_device.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_device.c
> @@ -215,57 +215,57 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> err = panfrost_regulator_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "regulator init failed %d\n", err);
> - goto err_out0;
> + goto out_clk;
> }
>
> err = panfrost_reset_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "reset init failed %d\n", err);
> - goto err_out1;
> + goto out_regulator;
> }
>
> err = panfrost_pm_domain_init(pfdev);
> if (err)
> - goto err_out2;
> + goto out_reset;
>
> res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0);
> pfdev->iomem = devm_ioremap_resource(pfdev->dev, res);
> if (IS_ERR(pfdev->iomem)) {
> dev_err(pfdev->dev, "failed to ioremap iomem\n");
> err = PTR_ERR(pfdev->iomem);
> - goto err_out3;
> + goto out_pm_domain;
> }
>
> err = panfrost_gpu_init(pfdev);
> if (err)
> - goto err_out3;
> + goto out_pm_domain;
>
> err = panfrost_mmu_init(pfdev);
> if (err)
> - goto err_out4;
> + goto out_gpu;
>
> err = panfrost_job_init(pfdev);
> if (err)
> - goto err_out5;
> + goto out_mmu;
>
> err = panfrost_perfcnt_init(pfdev);
> if (err)
> - goto err_out6;
> + goto out_job;
>
> return 0;
> -err_out6:
> +out_job:
> panfrost_job_fini(pfdev);
> -err_out5:
> +out_mmu:
> panfrost_mmu_fini(pfdev);
> -err_out4:
> +out_gpu:
> panfrost_gpu_fini(pfdev);
> -err_out3:
> +out_pm_domain:
> panfrost_pm_domain_fini(pfdev);
> -err_out2:
> +out_reset:
> panfrost_reset_fini(pfdev);
> -err_out1:
> +out_regulator:
> panfrost_regulator_fini(pfdev);
> -err_out0:
> +out_clk:
> panfrost_clk_fini(pfdev);
> return err;
> }
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 07/14] drm/panfrost: rename error labels in device_init
@ 2020-07-10 9:05 ` Steven Price
0 siblings, 0 replies; 40+ messages in thread
From: Steven Price @ 2020-07-10 9:05 UTC (permalink / raw)
To: Clément Péron, Rob Herring, Tomeu Vizoso,
Alyssa Rosenzweig, Viresh Kumar, Nishanth Menon, Stephen Boyd,
Maxime Ripard, Chen-Yu Tsai
Cc: linux-kernel, dri-devel
On 09/07/2020 15:03, Clément Péron wrote:
> Rename goto labels in device_init it will be easier to maintain.
>
> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
Nice clean up, thanks. As you noted this needs rebasing as the
"regulator init" message has gone.
Reviewed-by: Steven Price <steven.price@arm.com>
> ---
> drivers/gpu/drm/panfrost/panfrost_device.c | 30 +++++++++++-----------
> 1 file changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
> index 8136babd3ba9..cc16d102b275 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_device.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_device.c
> @@ -215,57 +215,57 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> err = panfrost_regulator_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "regulator init failed %d\n", err);
> - goto err_out0;
> + goto out_clk;
> }
>
> err = panfrost_reset_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "reset init failed %d\n", err);
> - goto err_out1;
> + goto out_regulator;
> }
>
> err = panfrost_pm_domain_init(pfdev);
> if (err)
> - goto err_out2;
> + goto out_reset;
>
> res = platform_get_resource(pfdev->pdev, IORESOURCE_MEM, 0);
> pfdev->iomem = devm_ioremap_resource(pfdev->dev, res);
> if (IS_ERR(pfdev->iomem)) {
> dev_err(pfdev->dev, "failed to ioremap iomem\n");
> err = PTR_ERR(pfdev->iomem);
> - goto err_out3;
> + goto out_pm_domain;
> }
>
> err = panfrost_gpu_init(pfdev);
> if (err)
> - goto err_out3;
> + goto out_pm_domain;
>
> err = panfrost_mmu_init(pfdev);
> if (err)
> - goto err_out4;
> + goto out_gpu;
>
> err = panfrost_job_init(pfdev);
> if (err)
> - goto err_out5;
> + goto out_mmu;
>
> err = panfrost_perfcnt_init(pfdev);
> if (err)
> - goto err_out6;
> + goto out_job;
>
> return 0;
> -err_out6:
> +out_job:
> panfrost_job_fini(pfdev);
> -err_out5:
> +out_mmu:
> panfrost_mmu_fini(pfdev);
> -err_out4:
> +out_gpu:
> panfrost_gpu_fini(pfdev);
> -err_out3:
> +out_pm_domain:
> panfrost_pm_domain_fini(pfdev);
> -err_out2:
> +out_reset:
> panfrost_reset_fini(pfdev);
> -err_out1:
> +out_regulator:
> panfrost_regulator_fini(pfdev);
> -err_out0:
> +out_clk:
> panfrost_clk_fini(pfdev);
> return err;
> }
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread
* [PATCH v3 08/14] drm/panfrost: move devfreq_init()/fini() in device
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Later we will introduce devfreq probing regulator if they
are present. As regulator should be probe only one time we
need to get this logic in the device_init().
panfrost_device is already taking care of devfreq_resume()
and devfreq_suspend(), so it's not totally illogic to move
the devfreq_init() and devfreq_fini() here.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 12 +++++++++++-
drivers/gpu/drm/panfrost/panfrost_drv.c | 15 ++-------------
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index cc16d102b275..464da1646398 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -212,10 +212,17 @@ int panfrost_device_init(struct panfrost_device *pfdev)
return err;
}
+ err = panfrost_devfreq_init(pfdev);
+ if (err) {
+ if (err != -EPROBE_DEFER)
+ dev_err(pfdev->dev, "devfreq init failed %d\n", err);
+ goto out_clk;
+ }
+
err = panfrost_regulator_init(pfdev);
if (err) {
dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto out_clk;
+ goto out_devfreq;
}
err = panfrost_reset_init(pfdev);
@@ -265,6 +272,8 @@ int panfrost_device_init(struct panfrost_device *pfdev)
panfrost_reset_fini(pfdev);
out_regulator:
panfrost_regulator_fini(pfdev);
+out_devfreq:
+ panfrost_devfreq_fini(pfdev);
out_clk:
panfrost_clk_fini(pfdev);
return err;
@@ -278,6 +287,7 @@ void panfrost_device_fini(struct panfrost_device *pfdev)
panfrost_gpu_fini(pfdev);
panfrost_pm_domain_fini(pfdev);
panfrost_reset_fini(pfdev);
+ panfrost_devfreq_fini(pfdev);
panfrost_regulator_fini(pfdev);
panfrost_clk_fini(pfdev);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
index 882fecc33fdb..4dda68689015 100644
--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
+++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
@@ -14,7 +14,6 @@
#include <drm/drm_utils.h>
#include "panfrost_device.h"
-#include "panfrost_devfreq.h"
#include "panfrost_gem.h"
#include "panfrost_mmu.h"
#include "panfrost_job.h"
@@ -606,13 +605,6 @@ static int panfrost_probe(struct platform_device *pdev)
goto err_out0;
}
- err = panfrost_devfreq_init(pfdev);
- if (err) {
- if (err != -EPROBE_DEFER)
- dev_err(&pdev->dev, "Fatal error during devfreq init\n");
- goto err_out1;
- }
-
pm_runtime_set_active(pfdev->dev);
pm_runtime_mark_last_busy(pfdev->dev);
pm_runtime_enable(pfdev->dev);
@@ -625,16 +617,14 @@ static int panfrost_probe(struct platform_device *pdev)
*/
err = drm_dev_register(ddev, 0);
if (err < 0)
- goto err_out2;
+ goto err_out1;
panfrost_gem_shrinker_init(ddev);
return 0;
-err_out2:
- pm_runtime_disable(pfdev->dev);
- panfrost_devfreq_fini(pfdev);
err_out1:
+ pm_runtime_disable(pfdev->dev);
panfrost_device_fini(pfdev);
err_out0:
drm_dev_put(ddev);
@@ -650,7 +640,6 @@ static int panfrost_remove(struct platform_device *pdev)
panfrost_gem_shrinker_cleanup(ddev);
pm_runtime_get_sync(pfdev->dev);
- panfrost_devfreq_fini(pfdev);
panfrost_device_fini(pfdev);
pm_runtime_put_sync_suspend(pfdev->dev);
pm_runtime_disable(pfdev->dev);
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 08/14] drm/panfrost: move devfreq_init()/fini() in device
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Later we will introduce devfreq probing regulator if they
are present. As regulator should be probe only one time we
need to get this logic in the device_init().
panfrost_device is already taking care of devfreq_resume()
and devfreq_suspend(), so it's not totally illogic to move
the devfreq_init() and devfreq_fini() here.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 12 +++++++++++-
drivers/gpu/drm/panfrost/panfrost_drv.c | 15 ++-------------
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index cc16d102b275..464da1646398 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -212,10 +212,17 @@ int panfrost_device_init(struct panfrost_device *pfdev)
return err;
}
+ err = panfrost_devfreq_init(pfdev);
+ if (err) {
+ if (err != -EPROBE_DEFER)
+ dev_err(pfdev->dev, "devfreq init failed %d\n", err);
+ goto out_clk;
+ }
+
err = panfrost_regulator_init(pfdev);
if (err) {
dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto out_clk;
+ goto out_devfreq;
}
err = panfrost_reset_init(pfdev);
@@ -265,6 +272,8 @@ int panfrost_device_init(struct panfrost_device *pfdev)
panfrost_reset_fini(pfdev);
out_regulator:
panfrost_regulator_fini(pfdev);
+out_devfreq:
+ panfrost_devfreq_fini(pfdev);
out_clk:
panfrost_clk_fini(pfdev);
return err;
@@ -278,6 +287,7 @@ void panfrost_device_fini(struct panfrost_device *pfdev)
panfrost_gpu_fini(pfdev);
panfrost_pm_domain_fini(pfdev);
panfrost_reset_fini(pfdev);
+ panfrost_devfreq_fini(pfdev);
panfrost_regulator_fini(pfdev);
panfrost_clk_fini(pfdev);
}
diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
index 882fecc33fdb..4dda68689015 100644
--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
+++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
@@ -14,7 +14,6 @@
#include <drm/drm_utils.h>
#include "panfrost_device.h"
-#include "panfrost_devfreq.h"
#include "panfrost_gem.h"
#include "panfrost_mmu.h"
#include "panfrost_job.h"
@@ -606,13 +605,6 @@ static int panfrost_probe(struct platform_device *pdev)
goto err_out0;
}
- err = panfrost_devfreq_init(pfdev);
- if (err) {
- if (err != -EPROBE_DEFER)
- dev_err(&pdev->dev, "Fatal error during devfreq init\n");
- goto err_out1;
- }
-
pm_runtime_set_active(pfdev->dev);
pm_runtime_mark_last_busy(pfdev->dev);
pm_runtime_enable(pfdev->dev);
@@ -625,16 +617,14 @@ static int panfrost_probe(struct platform_device *pdev)
*/
err = drm_dev_register(ddev, 0);
if (err < 0)
- goto err_out2;
+ goto err_out1;
panfrost_gem_shrinker_init(ddev);
return 0;
-err_out2:
- pm_runtime_disable(pfdev->dev);
- panfrost_devfreq_fini(pfdev);
err_out1:
+ pm_runtime_disable(pfdev->dev);
panfrost_device_fini(pfdev);
err_out0:
drm_dev_put(ddev);
@@ -650,7 +640,6 @@ static int panfrost_remove(struct platform_device *pdev)
panfrost_gem_shrinker_cleanup(ddev);
pm_runtime_get_sync(pfdev->dev);
- panfrost_devfreq_fini(pfdev);
panfrost_device_fini(pfdev);
pm_runtime_put_sync_suspend(pfdev->dev);
pm_runtime_disable(pfdev->dev);
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [PATCH v3 08/14] drm/panfrost: move devfreq_init()/fini() in device
2020-07-09 14:03 ` Clément Péron
@ 2020-07-10 9:05 ` Steven Price
-1 siblings, 0 replies; 40+ messages in thread
From: Steven Price @ 2020-07-10 9:05 UTC (permalink / raw)
To: Clément Péron, Rob Herring, Tomeu Vizoso,
Alyssa Rosenzweig, Viresh Kumar, Nishanth Menon, Stephen Boyd,
Maxime Ripard, Chen-Yu Tsai
Cc: dri-devel, linux-kernel
On 09/07/2020 15:03, Clément Péron wrote:
> Later we will introduce devfreq probing regulator if they
> are present. As regulator should be probe only one time we
> need to get this logic in the device_init().
>
> panfrost_device is already taking care of devfreq_resume()
> and devfreq_suspend(), so it's not totally illogic to move
> the devfreq_init() and devfreq_fini() here.
>
> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
Reviewed-by: Steven Price <steven.price@arm.com>
> ---
> drivers/gpu/drm/panfrost/panfrost_device.c | 12 +++++++++++-
> drivers/gpu/drm/panfrost/panfrost_drv.c | 15 ++-------------
> 2 files changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
> index cc16d102b275..464da1646398 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_device.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_device.c
> @@ -212,10 +212,17 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> return err;
> }
>
> + err = panfrost_devfreq_init(pfdev);
> + if (err) {
> + if (err != -EPROBE_DEFER)
> + dev_err(pfdev->dev, "devfreq init failed %d\n", err);
> + goto out_clk;
> + }
> +
> err = panfrost_regulator_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "regulator init failed %d\n", err);
> - goto out_clk;
> + goto out_devfreq;
> }
>
> err = panfrost_reset_init(pfdev);
> @@ -265,6 +272,8 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> panfrost_reset_fini(pfdev);
> out_regulator:
> panfrost_regulator_fini(pfdev);
> +out_devfreq:
> + panfrost_devfreq_fini(pfdev);
> out_clk:
> panfrost_clk_fini(pfdev);
> return err;
> @@ -278,6 +287,7 @@ void panfrost_device_fini(struct panfrost_device *pfdev)
> panfrost_gpu_fini(pfdev);
> panfrost_pm_domain_fini(pfdev);
> panfrost_reset_fini(pfdev);
> + panfrost_devfreq_fini(pfdev);
> panfrost_regulator_fini(pfdev);
> panfrost_clk_fini(pfdev);
> }
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index 882fecc33fdb..4dda68689015 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -14,7 +14,6 @@
> #include <drm/drm_utils.h>
>
> #include "panfrost_device.h"
> -#include "panfrost_devfreq.h"
> #include "panfrost_gem.h"
> #include "panfrost_mmu.h"
> #include "panfrost_job.h"
> @@ -606,13 +605,6 @@ static int panfrost_probe(struct platform_device *pdev)
> goto err_out0;
> }
>
> - err = panfrost_devfreq_init(pfdev);
> - if (err) {
> - if (err != -EPROBE_DEFER)
> - dev_err(&pdev->dev, "Fatal error during devfreq init\n");
> - goto err_out1;
> - }
> -
> pm_runtime_set_active(pfdev->dev);
> pm_runtime_mark_last_busy(pfdev->dev);
> pm_runtime_enable(pfdev->dev);
> @@ -625,16 +617,14 @@ static int panfrost_probe(struct platform_device *pdev)
> */
> err = drm_dev_register(ddev, 0);
> if (err < 0)
> - goto err_out2;
> + goto err_out1;
>
> panfrost_gem_shrinker_init(ddev);
>
> return 0;
>
> -err_out2:
> - pm_runtime_disable(pfdev->dev);
> - panfrost_devfreq_fini(pfdev);
> err_out1:
> + pm_runtime_disable(pfdev->dev);
> panfrost_device_fini(pfdev);
> err_out0:
> drm_dev_put(ddev);
> @@ -650,7 +640,6 @@ static int panfrost_remove(struct platform_device *pdev)
> panfrost_gem_shrinker_cleanup(ddev);
>
> pm_runtime_get_sync(pfdev->dev);
> - panfrost_devfreq_fini(pfdev);
> panfrost_device_fini(pfdev);
> pm_runtime_put_sync_suspend(pfdev->dev);
> pm_runtime_disable(pfdev->dev);
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 08/14] drm/panfrost: move devfreq_init()/fini() in device
@ 2020-07-10 9:05 ` Steven Price
0 siblings, 0 replies; 40+ messages in thread
From: Steven Price @ 2020-07-10 9:05 UTC (permalink / raw)
To: Clément Péron, Rob Herring, Tomeu Vizoso,
Alyssa Rosenzweig, Viresh Kumar, Nishanth Menon, Stephen Boyd,
Maxime Ripard, Chen-Yu Tsai
Cc: linux-kernel, dri-devel
On 09/07/2020 15:03, Clément Péron wrote:
> Later we will introduce devfreq probing regulator if they
> are present. As regulator should be probe only one time we
> need to get this logic in the device_init().
>
> panfrost_device is already taking care of devfreq_resume()
> and devfreq_suspend(), so it's not totally illogic to move
> the devfreq_init() and devfreq_fini() here.
>
> Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
Reviewed-by: Steven Price <steven.price@arm.com>
> ---
> drivers/gpu/drm/panfrost/panfrost_device.c | 12 +++++++++++-
> drivers/gpu/drm/panfrost/panfrost_drv.c | 15 ++-------------
> 2 files changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
> index cc16d102b275..464da1646398 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_device.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_device.c
> @@ -212,10 +212,17 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> return err;
> }
>
> + err = panfrost_devfreq_init(pfdev);
> + if (err) {
> + if (err != -EPROBE_DEFER)
> + dev_err(pfdev->dev, "devfreq init failed %d\n", err);
> + goto out_clk;
> + }
> +
> err = panfrost_regulator_init(pfdev);
> if (err) {
> dev_err(pfdev->dev, "regulator init failed %d\n", err);
> - goto out_clk;
> + goto out_devfreq;
> }
>
> err = panfrost_reset_init(pfdev);
> @@ -265,6 +272,8 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> panfrost_reset_fini(pfdev);
> out_regulator:
> panfrost_regulator_fini(pfdev);
> +out_devfreq:
> + panfrost_devfreq_fini(pfdev);
> out_clk:
> panfrost_clk_fini(pfdev);
> return err;
> @@ -278,6 +287,7 @@ void panfrost_device_fini(struct panfrost_device *pfdev)
> panfrost_gpu_fini(pfdev);
> panfrost_pm_domain_fini(pfdev);
> panfrost_reset_fini(pfdev);
> + panfrost_devfreq_fini(pfdev);
> panfrost_regulator_fini(pfdev);
> panfrost_clk_fini(pfdev);
> }
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index 882fecc33fdb..4dda68689015 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -14,7 +14,6 @@
> #include <drm/drm_utils.h>
>
> #include "panfrost_device.h"
> -#include "panfrost_devfreq.h"
> #include "panfrost_gem.h"
> #include "panfrost_mmu.h"
> #include "panfrost_job.h"
> @@ -606,13 +605,6 @@ static int panfrost_probe(struct platform_device *pdev)
> goto err_out0;
> }
>
> - err = panfrost_devfreq_init(pfdev);
> - if (err) {
> - if (err != -EPROBE_DEFER)
> - dev_err(&pdev->dev, "Fatal error during devfreq init\n");
> - goto err_out1;
> - }
> -
> pm_runtime_set_active(pfdev->dev);
> pm_runtime_mark_last_busy(pfdev->dev);
> pm_runtime_enable(pfdev->dev);
> @@ -625,16 +617,14 @@ static int panfrost_probe(struct platform_device *pdev)
> */
> err = drm_dev_register(ddev, 0);
> if (err < 0)
> - goto err_out2;
> + goto err_out1;
>
> panfrost_gem_shrinker_init(ddev);
>
> return 0;
>
> -err_out2:
> - pm_runtime_disable(pfdev->dev);
> - panfrost_devfreq_fini(pfdev);
> err_out1:
> + pm_runtime_disable(pfdev->dev);
> panfrost_device_fini(pfdev);
> err_out0:
> drm_dev_put(ddev);
> @@ -650,7 +640,6 @@ static int panfrost_remove(struct platform_device *pdev)
> panfrost_gem_shrinker_cleanup(ddev);
>
> pm_runtime_get_sync(pfdev->dev);
> - panfrost_devfreq_fini(pfdev);
> panfrost_device_fini(pfdev);
> pm_runtime_put_sync_suspend(pfdev->dev);
> pm_runtime_disable(pfdev->dev);
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread
* [PATCH v3 09/14] drm/panfrost: dynamically alloc regulators
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
We will later introduce regulators managed by OPP.
Only alloc regulators when it's needed. This also help use
to release the regulators only when they are allocated.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 14 +++++++++-----
drivers/gpu/drm/panfrost/panfrost_device.h | 3 +--
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 464da1646398..0b0fb45aee82 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -90,9 +90,11 @@ static int panfrost_regulator_init(struct panfrost_device *pfdev)
{
int ret, i;
- if (WARN(pfdev->comp->num_supplies > ARRAY_SIZE(pfdev->regulators),
- "Too many supplies in compatible structure.\n"))
- return -EINVAL;
+ pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies,
+ sizeof(*pfdev->regulators),
+ GFP_KERNEL);
+ if (!pfdev->regulators)
+ return -ENOMEM;
for (i = 0; i < pfdev->comp->num_supplies; i++)
pfdev->regulators[i].supply = pfdev->comp->supply_names[i];
@@ -117,8 +119,10 @@ static int panfrost_regulator_init(struct panfrost_device *pfdev)
static void panfrost_regulator_fini(struct panfrost_device *pfdev)
{
- regulator_bulk_disable(pfdev->comp->num_supplies,
- pfdev->regulators);
+ if (!pfdev->regulators)
+ return;
+
+ regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators);
}
static void panfrost_pm_domain_fini(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
index 2efa59c9d1c5..953f7536a773 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
@@ -22,7 +22,6 @@ struct panfrost_job;
struct panfrost_perfcnt;
#define NUM_JOB_SLOTS 3
-#define MAX_REGULATORS 2
#define MAX_PM_DOMAINS 3
struct panfrost_features {
@@ -81,7 +80,7 @@ struct panfrost_device {
void __iomem *iomem;
struct clk *clock;
struct clk *bus_clock;
- struct regulator_bulk_data regulators[MAX_REGULATORS];
+ struct regulator_bulk_data *regulators;
struct reset_control *rstc;
/* pm_domains for devices with more than one. */
struct device *pm_domain_devs[MAX_PM_DOMAINS];
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 09/14] drm/panfrost: dynamically alloc regulators
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
We will later introduce regulators managed by OPP.
Only alloc regulators when it's needed. This also help use
to release the regulators only when they are allocated.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_device.c | 14 +++++++++-----
drivers/gpu/drm/panfrost/panfrost_device.h | 3 +--
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 464da1646398..0b0fb45aee82 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -90,9 +90,11 @@ static int panfrost_regulator_init(struct panfrost_device *pfdev)
{
int ret, i;
- if (WARN(pfdev->comp->num_supplies > ARRAY_SIZE(pfdev->regulators),
- "Too many supplies in compatible structure.\n"))
- return -EINVAL;
+ pfdev->regulators = devm_kcalloc(pfdev->dev, pfdev->comp->num_supplies,
+ sizeof(*pfdev->regulators),
+ GFP_KERNEL);
+ if (!pfdev->regulators)
+ return -ENOMEM;
for (i = 0; i < pfdev->comp->num_supplies; i++)
pfdev->regulators[i].supply = pfdev->comp->supply_names[i];
@@ -117,8 +119,10 @@ static int panfrost_regulator_init(struct panfrost_device *pfdev)
static void panfrost_regulator_fini(struct panfrost_device *pfdev)
{
- regulator_bulk_disable(pfdev->comp->num_supplies,
- pfdev->regulators);
+ if (!pfdev->regulators)
+ return;
+
+ regulator_bulk_disable(pfdev->comp->num_supplies, pfdev->regulators);
}
static void panfrost_pm_domain_fini(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
index 2efa59c9d1c5..953f7536a773 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.h
+++ b/drivers/gpu/drm/panfrost/panfrost_device.h
@@ -22,7 +22,6 @@ struct panfrost_job;
struct panfrost_perfcnt;
#define NUM_JOB_SLOTS 3
-#define MAX_REGULATORS 2
#define MAX_PM_DOMAINS 3
struct panfrost_features {
@@ -81,7 +80,7 @@ struct panfrost_device {
void __iomem *iomem;
struct clk *clock;
struct clk *bus_clock;
- struct regulator_bulk_data regulators[MAX_REGULATORS];
+ struct regulator_bulk_data *regulators;
struct reset_control *rstc;
/* pm_domains for devices with more than one. */
struct device *pm_domain_devs[MAX_PM_DOMAINS];
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 10/14] drm/panfrost: add regulators to devfreq
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Some OPP tables specify voltage for each frequency. Devfreq can
handle these regulators but they should be get only 1 time to avoid
issue and know who is in charge.
If OPP table is probe don't init regulator.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 29 ++++++++++++++++++---
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 2 ++
drivers/gpu/drm/panfrost/panfrost_device.c | 11 +++++---
3 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index d9007f44b772..8ab025d0035f 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -93,14 +93,30 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
unsigned long cur_freq;
struct device *dev = &pfdev->pdev->dev;
struct devfreq *devfreq;
+ struct opp_table *opp_table;
struct thermal_cooling_device *cooling;
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+ 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");
+ goto err_fini;
+ }
+ } else {
+ pfdevfreq->regulators_opp_table = opp_table;
+ }
+
ret = dev_pm_opp_of_add_table(dev);
- if (ret == -ENODEV) /* Optional, continue without devfreq */
- return 0;
- else if (ret)
- return ret;
+ if (ret) {
+ /* Optional, continue without devfreq */
+ if (ret == -ENODEV)
+ ret = 0;
+ goto err_fini;
+ }
pfdevfreq->opp_of_table_added = true;
spin_lock_init(&pfdevfreq->lock);
@@ -153,6 +169,11 @@ void panfrost_devfreq_fini(struct panfrost_device *pfdev)
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
pfdevfreq->opp_of_table_added = false;
}
+
+ if (pfdevfreq->regulators_opp_table) {
+ dev_pm_opp_put_regulators(pfdevfreq->regulators_opp_table);
+ pfdevfreq->regulators_opp_table = NULL;
+ }
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 210269944687..db6ea48e21f9 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -8,12 +8,14 @@
#include <linux/ktime.h>
struct devfreq;
+struct opp_table;
struct thermal_cooling_device;
struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
+ struct opp_table *regulators_opp_table;
struct thermal_cooling_device *cooling;
bool opp_of_table_added;
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 0b0fb45aee82..1b5fc9221828 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -223,10 +223,13 @@ int panfrost_device_init(struct panfrost_device *pfdev)
goto out_clk;
}
- err = panfrost_regulator_init(pfdev);
- if (err) {
- dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto out_devfreq;
+ /* OPP will handle regulators */
+ if (!pfdev->pfdevfreq.opp_of_table_added) {
+ err = panfrost_regulator_init(pfdev);
+ if (err) {
+ dev_err(pfdev->dev, "regulator init failed %d\n", err);
+ goto out_devfreq;
+ }
}
err = panfrost_reset_init(pfdev);
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 10/14] drm/panfrost: add regulators to devfreq
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Some OPP tables specify voltage for each frequency. Devfreq can
handle these regulators but they should be get only 1 time to avoid
issue and know who is in charge.
If OPP table is probe don't init regulator.
Reviewed-by: Steven Price <steven.price@arm.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
drivers/gpu/drm/panfrost/panfrost_devfreq.c | 29 ++++++++++++++++++---
drivers/gpu/drm/panfrost/panfrost_devfreq.h | 2 ++
drivers/gpu/drm/panfrost/panfrost_device.c | 11 +++++---
3 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.c b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
index d9007f44b772..8ab025d0035f 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.c
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.c
@@ -93,14 +93,30 @@ int panfrost_devfreq_init(struct panfrost_device *pfdev)
unsigned long cur_freq;
struct device *dev = &pfdev->pdev->dev;
struct devfreq *devfreq;
+ struct opp_table *opp_table;
struct thermal_cooling_device *cooling;
struct panfrost_devfreq *pfdevfreq = &pfdev->pfdevfreq;
+ 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");
+ goto err_fini;
+ }
+ } else {
+ pfdevfreq->regulators_opp_table = opp_table;
+ }
+
ret = dev_pm_opp_of_add_table(dev);
- if (ret == -ENODEV) /* Optional, continue without devfreq */
- return 0;
- else if (ret)
- return ret;
+ if (ret) {
+ /* Optional, continue without devfreq */
+ if (ret == -ENODEV)
+ ret = 0;
+ goto err_fini;
+ }
pfdevfreq->opp_of_table_added = true;
spin_lock_init(&pfdevfreq->lock);
@@ -153,6 +169,11 @@ void panfrost_devfreq_fini(struct panfrost_device *pfdev)
dev_pm_opp_of_remove_table(&pfdev->pdev->dev);
pfdevfreq->opp_of_table_added = false;
}
+
+ if (pfdevfreq->regulators_opp_table) {
+ dev_pm_opp_put_regulators(pfdevfreq->regulators_opp_table);
+ pfdevfreq->regulators_opp_table = NULL;
+ }
}
void panfrost_devfreq_resume(struct panfrost_device *pfdev)
diff --git a/drivers/gpu/drm/panfrost/panfrost_devfreq.h b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
index 210269944687..db6ea48e21f9 100644
--- a/drivers/gpu/drm/panfrost/panfrost_devfreq.h
+++ b/drivers/gpu/drm/panfrost/panfrost_devfreq.h
@@ -8,12 +8,14 @@
#include <linux/ktime.h>
struct devfreq;
+struct opp_table;
struct thermal_cooling_device;
struct panfrost_device;
struct panfrost_devfreq {
struct devfreq *devfreq;
+ struct opp_table *regulators_opp_table;
struct thermal_cooling_device *cooling;
bool opp_of_table_added;
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
index 0b0fb45aee82..1b5fc9221828 100644
--- a/drivers/gpu/drm/panfrost/panfrost_device.c
+++ b/drivers/gpu/drm/panfrost/panfrost_device.c
@@ -223,10 +223,13 @@ int panfrost_device_init(struct panfrost_device *pfdev)
goto out_clk;
}
- err = panfrost_regulator_init(pfdev);
- if (err) {
- dev_err(pfdev->dev, "regulator init failed %d\n", err);
- goto out_devfreq;
+ /* OPP will handle regulators */
+ if (!pfdev->pfdevfreq.opp_of_table_added) {
+ err = panfrost_regulator_init(pfdev);
+ if (err) {
+ dev_err(pfdev->dev, "regulator init failed %d\n", err);
+ goto out_devfreq;
+ }
}
err = panfrost_reset_init(pfdev);
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 11/14] arm64: defconfig: Enable devfreq cooling device
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Devfreq cooling device framework is used in Panfrost
to throttle GPU in order to regulate its temperature.
Enable this driver for ARM64 SoC.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/configs/defconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 883e8bace3ed..1b7f9ffdc314 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -501,6 +501,7 @@ CONFIG_SENSORS_INA2XX=m
CONFIG_SENSORS_INA3221=m
CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
CONFIG_CPU_THERMAL=y
+CONFIG_DEVFREQ_THERMAL=y
CONFIG_THERMAL_EMULATION=y
CONFIG_QORIQ_THERMAL=m
CONFIG_SUN8I_THERMAL=y
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 11/14] arm64: defconfig: Enable devfreq cooling device
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Devfreq cooling device framework is used in Panfrost
to throttle GPU in order to regulate its temperature.
Enable this driver for ARM64 SoC.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/configs/defconfig | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig
index 883e8bace3ed..1b7f9ffdc314 100644
--- a/arch/arm64/configs/defconfig
+++ b/arch/arm64/configs/defconfig
@@ -501,6 +501,7 @@ CONFIG_SENSORS_INA2XX=m
CONFIG_SENSORS_INA3221=m
CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
CONFIG_CPU_THERMAL=y
+CONFIG_DEVFREQ_THERMAL=y
CONFIG_THERMAL_EMULATION=y
CONFIG_QORIQ_THERMAL=m
CONFIG_SUN8I_THERMAL=y
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 12/14] arm64: dts: allwinner: h6: Add cooling map for GPU
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Add a simple cooling map for the GPU.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 22 ++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
index 78b1361dfbb9..8f514a2169aa 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
@@ -174,6 +174,7 @@ gpu: gpu@1800000 {
clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
clock-names = "core", "bus";
resets = <&ccu RST_BUS_GPU>;
+ #cooling-cells = <2>;
status = "disabled";
};
@@ -1012,6 +1013,27 @@ gpu-thermal {
polling-delay-passive = <0>;
polling-delay = <0>;
thermal-sensors = <&ths 1>;
+
+ trips {
+ gpu_alert: gpu-alert {
+ temperature = <85000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+
+ gpu-crit {
+ temperature = <100000>;
+ hysteresis = <0>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&gpu_alert>;
+ cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+ };
};
};
};
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 12/14] arm64: dts: allwinner: h6: Add cooling map for GPU
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Add a simple cooling map for the GPU.
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 22 ++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
index 78b1361dfbb9..8f514a2169aa 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
@@ -174,6 +174,7 @@ gpu: gpu@1800000 {
clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
clock-names = "core", "bus";
resets = <&ccu RST_BUS_GPU>;
+ #cooling-cells = <2>;
status = "disabled";
};
@@ -1012,6 +1013,27 @@ gpu-thermal {
polling-delay-passive = <0>;
polling-delay = <0>;
thermal-sensors = <&ths 1>;
+
+ trips {
+ gpu_alert: gpu-alert {
+ temperature = <85000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+
+ gpu-crit {
+ temperature = <100000>;
+ hysteresis = <0>;
+ type = "critical";
+ };
+ };
+
+ cooling-maps {
+ map0 {
+ trip = <&gpu_alert>;
+ cooling-device = <&gpu THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
+ };
+ };
};
};
};
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Add an Operating Performance Points table for the GPU to
enable Dynamic Voltage & Frequency Scaling on the H6.
The voltage range is set with minival voltage set to the target
and the maximal voltage set to 1.2V. This allow DVFS framework to
work properly on board with fixed regulator.
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
index 8f514a2169aa..a69f9e09a829 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
@@ -174,6 +174,7 @@ gpu: gpu@1800000 {
clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
clock-names = "core", "bus";
resets = <&ccu RST_BUS_GPU>;
+ operating-points-v2 = <&gpu_opp_table>;
#cooling-cells = <2>;
status = "disabled";
};
@@ -1036,4 +1037,83 @@ map0 {
};
};
};
+
+ gpu_opp_table: gpu-opp-table {
+ compatible = "operating-points-v2";
+
+ opp@216000000 {
+ opp-hz = /bits/ 64 <216000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@264000000 {
+ opp-hz = /bits/ 64 <264000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@312000000 {
+ opp-hz = /bits/ 64 <312000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@336000000 {
+ opp-hz = /bits/ 64 <336000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@360000000 {
+ opp-hz = /bits/ 64 <360000000>;
+ opp-microvolt = <820000 820000 1200000>;
+ };
+
+ opp@384000000 {
+ opp-hz = /bits/ 64 <384000000>;
+ opp-microvolt = <830000 830000 1200000>;
+ };
+
+ opp@408000000 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <840000 840000 1200000>;
+ };
+
+ opp@420000000 {
+ opp-hz = /bits/ 64 <420000000>;
+ opp-microvolt = <850000 850000 1200000>;
+ };
+
+ opp@432000000 {
+ opp-hz = /bits/ 64 <432000000>;
+ opp-microvolt = <860000 860000 1200000>;
+ };
+
+ opp@456000000 {
+ opp-hz = /bits/ 64 <456000000>;
+ opp-microvolt = <870000 870000 1200000>;
+ };
+
+ opp@504000000 {
+ opp-hz = /bits/ 64 <504000000>;
+ opp-microvolt = <890000 890000 1200000>;
+ };
+
+ opp@540000000 {
+ opp-hz = /bits/ 64 <540000000>;
+ opp-microvolt = <910000 910000 1200000>;
+ };
+
+ opp@576000000 {
+ opp-hz = /bits/ 64 <576000000>;
+ opp-microvolt = <930000 930000 1200000>;
+ };
+
+ opp@624000000 {
+ opp-hz = /bits/ 64 <624000000>;
+ opp-microvolt = <950000 950000 1200000>;
+ };
+
+ opp@756000000 {
+ opp-hz = /bits/ 64 <756000000>;
+ opp-microvolt = <1040000 1040000 1200000>;
+ };
+ };
};
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Add an Operating Performance Points table for the GPU to
enable Dynamic Voltage & Frequency Scaling on the H6.
The voltage range is set with minival voltage set to the target
and the maximal voltage set to 1.2V. This allow DVFS framework to
work properly on board with fixed regulator.
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
index 8f514a2169aa..a69f9e09a829 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
@@ -174,6 +174,7 @@ gpu: gpu@1800000 {
clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
clock-names = "core", "bus";
resets = <&ccu RST_BUS_GPU>;
+ operating-points-v2 = <&gpu_opp_table>;
#cooling-cells = <2>;
status = "disabled";
};
@@ -1036,4 +1037,83 @@ map0 {
};
};
};
+
+ gpu_opp_table: gpu-opp-table {
+ compatible = "operating-points-v2";
+
+ opp@216000000 {
+ opp-hz = /bits/ 64 <216000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@264000000 {
+ opp-hz = /bits/ 64 <264000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@312000000 {
+ opp-hz = /bits/ 64 <312000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@336000000 {
+ opp-hz = /bits/ 64 <336000000>;
+ opp-microvolt = <810000 810000 1200000>;
+ };
+
+ opp@360000000 {
+ opp-hz = /bits/ 64 <360000000>;
+ opp-microvolt = <820000 820000 1200000>;
+ };
+
+ opp@384000000 {
+ opp-hz = /bits/ 64 <384000000>;
+ opp-microvolt = <830000 830000 1200000>;
+ };
+
+ opp@408000000 {
+ opp-hz = /bits/ 64 <408000000>;
+ opp-microvolt = <840000 840000 1200000>;
+ };
+
+ opp@420000000 {
+ opp-hz = /bits/ 64 <420000000>;
+ opp-microvolt = <850000 850000 1200000>;
+ };
+
+ opp@432000000 {
+ opp-hz = /bits/ 64 <432000000>;
+ opp-microvolt = <860000 860000 1200000>;
+ };
+
+ opp@456000000 {
+ opp-hz = /bits/ 64 <456000000>;
+ opp-microvolt = <870000 870000 1200000>;
+ };
+
+ opp@504000000 {
+ opp-hz = /bits/ 64 <504000000>;
+ opp-microvolt = <890000 890000 1200000>;
+ };
+
+ opp@540000000 {
+ opp-hz = /bits/ 64 <540000000>;
+ opp-microvolt = <910000 910000 1200000>;
+ };
+
+ opp@576000000 {
+ opp-hz = /bits/ 64 <576000000>;
+ opp-microvolt = <930000 930000 1200000>;
+ };
+
+ opp@624000000 {
+ opp-hz = /bits/ 64 <624000000>;
+ opp-microvolt = <950000 950000 1200000>;
+ };
+
+ opp@756000000 {
+ opp-hz = /bits/ 64 <756000000>;
+ opp-microvolt = <1040000 1040000 1200000>;
+ };
+ };
};
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
2020-07-09 14:03 ` Clément Péron
@ 2020-07-10 13:45 ` Piotr Oniszczuk
-1 siblings, 0 replies; 40+ messages in thread
From: Piotr Oniszczuk @ 2020-07-10 13:45 UTC (permalink / raw)
To: Clément Péron
Cc: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard, wens,
linux-kernel, dri-devel
> Wiadomość napisana przez Clément Péron <peron.clem@gmail.com> w dniu 09.07.2020, o godz. 16:03:
>
> Add an Operating Performance Points table for the GPU to
> enable Dynamic Voltage & Frequency Scaling on the H6.
>
> The voltage range is set with minival voltage set to the target
> and the maximal voltage set to 1.2V. This allow DVFS framework to
> work properly on board with fixed regulator.
>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
> ---
> arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> index 8f514a2169aa..a69f9e09a829 100644
> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> @@ -174,6 +174,7 @@ gpu: gpu@1800000 {
> clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
> clock-names = "core", "bus";
> resets = <&ccu RST_BUS_GPU>;
> + operating-points-v2 = <&gpu_opp_table>;
> #cooling-cells = <2>;
> status = "disabled";
> };
> @@ -1036,4 +1037,83 @@ map0 {
> };
> };
> };
> +
> + gpu_opp_table: gpu-opp-table {
> + compatible = "operating-points-v2";
> +
> + opp@216000000 {
> + opp-hz = /bits/ 64 <216000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@264000000 {
> + opp-hz = /bits/ 64 <264000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@312000000 {
> + opp-hz = /bits/ 64 <312000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@336000000 {
> + opp-hz = /bits/ 64 <336000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@360000000 {
> + opp-hz = /bits/ 64 <360000000>;
> + opp-microvolt = <820000 820000 1200000>;
> + };
> +
> + opp@384000000 {
> + opp-hz = /bits/ 64 <384000000>;
> + opp-microvolt = <830000 830000 1200000>;
> + };
> +
> + opp@408000000 {
> + opp-hz = /bits/ 64 <408000000>;
> + opp-microvolt = <840000 840000 1200000>;
> + };
> +
> + opp@420000000 {
> + opp-hz = /bits/ 64 <420000000>;
> + opp-microvolt = <850000 850000 1200000>;
> + };
> +
> + opp@432000000 {
> + opp-hz = /bits/ 64 <432000000>;
> + opp-microvolt = <860000 860000 1200000>;
> + };
> +
> + opp@456000000 {
> + opp-hz = /bits/ 64 <456000000>;
> + opp-microvolt = <870000 870000 1200000>;
> + };
> +
> + opp@504000000 {
> + opp-hz = /bits/ 64 <504000000>;
> + opp-microvolt = <890000 890000 1200000>;
> + };
> +
> + opp@540000000 {
> + opp-hz = /bits/ 64 <540000000>;
> + opp-microvolt = <910000 910000 1200000>;
> + };
> +
> + opp@576000000 {
> + opp-hz = /bits/ 64 <576000000>;
> + opp-microvolt = <930000 930000 1200000>;
> + };
> +
> + opp@624000000 {
> + opp-hz = /bits/ 64 <624000000>;
> + opp-microvolt = <950000 950000 1200000>;
> + };
> +
> + opp@756000000 {
> + opp-hz = /bits/ 64 <756000000>;
> + opp-microvolt = <1040000 1040000 1200000>;
> + };
> + };
> };
Clement,
I gave run for v3 on H6 GS1 TVbox and what i discovered:
1. I have frequent hard hangs if DVFS is enabled (hard reset required),
2. hangs seems to be related to operating points changing - as limiting OPP table to any single entry (tested on 5 highest OPP ) makes my GS1 stable working,
3. hang seems to be exactly related to OPP changes as having OPP table even with just 2 entries already gives hangs,
4. tunings with <regulator-ramp-delay> makes no difference (tested with 0, 2500 and 25000). Also increasing <regulator-enable-ramp-delay> 2 times up (to 64000) makes no change.
Now I have 2 hypothesis:
a. issue is SW related: software operations in DVFS are somehow "unsafe" at touching hardware (is it possible we have i.e. concurrency issue here?);
b. issue is HW related: i.e. in steep-up OPP, time between sending change Vdd-gpu command to HW for increasing Vdd and sending command to HW for increasing GPU freq is too short.
To investigate further I done following test: limit OPP table to 4 entries+all 4 entries have the same Vdd.
If this test will pass the we know issue is b\.
If it will fail - then issue is a\.
And on my GS1 this test fails....so for me issue is a\ likely….
let me know how i can help!
br
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
@ 2020-07-10 13:45 ` Piotr Oniszczuk
0 siblings, 0 replies; 40+ messages in thread
From: Piotr Oniszczuk @ 2020-07-10 13:45 UTC (permalink / raw)
To: Clément Péron
Cc: Nishanth Menon, Tomeu Vizoso, Stephen Boyd, Viresh Kumar,
dri-devel, linux-kernel, Steven Price, wens, Alyssa Rosenzweig
> Wiadomość napisana przez Clément Péron <peron.clem@gmail.com> w dniu 09.07.2020, o godz. 16:03:
>
> Add an Operating Performance Points table for the GPU to
> enable Dynamic Voltage & Frequency Scaling on the H6.
>
> The voltage range is set with minival voltage set to the target
> and the maximal voltage set to 1.2V. This allow DVFS framework to
> work properly on board with fixed regulator.
>
> Signed-off-by: Clément Péron <peron.clem@gmail.com>
> ---
> arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
> 1 file changed, 80 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> index 8f514a2169aa..a69f9e09a829 100644
> --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> @@ -174,6 +174,7 @@ gpu: gpu@1800000 {
> clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
> clock-names = "core", "bus";
> resets = <&ccu RST_BUS_GPU>;
> + operating-points-v2 = <&gpu_opp_table>;
> #cooling-cells = <2>;
> status = "disabled";
> };
> @@ -1036,4 +1037,83 @@ map0 {
> };
> };
> };
> +
> + gpu_opp_table: gpu-opp-table {
> + compatible = "operating-points-v2";
> +
> + opp@216000000 {
> + opp-hz = /bits/ 64 <216000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@264000000 {
> + opp-hz = /bits/ 64 <264000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@312000000 {
> + opp-hz = /bits/ 64 <312000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@336000000 {
> + opp-hz = /bits/ 64 <336000000>;
> + opp-microvolt = <810000 810000 1200000>;
> + };
> +
> + opp@360000000 {
> + opp-hz = /bits/ 64 <360000000>;
> + opp-microvolt = <820000 820000 1200000>;
> + };
> +
> + opp@384000000 {
> + opp-hz = /bits/ 64 <384000000>;
> + opp-microvolt = <830000 830000 1200000>;
> + };
> +
> + opp@408000000 {
> + opp-hz = /bits/ 64 <408000000>;
> + opp-microvolt = <840000 840000 1200000>;
> + };
> +
> + opp@420000000 {
> + opp-hz = /bits/ 64 <420000000>;
> + opp-microvolt = <850000 850000 1200000>;
> + };
> +
> + opp@432000000 {
> + opp-hz = /bits/ 64 <432000000>;
> + opp-microvolt = <860000 860000 1200000>;
> + };
> +
> + opp@456000000 {
> + opp-hz = /bits/ 64 <456000000>;
> + opp-microvolt = <870000 870000 1200000>;
> + };
> +
> + opp@504000000 {
> + opp-hz = /bits/ 64 <504000000>;
> + opp-microvolt = <890000 890000 1200000>;
> + };
> +
> + opp@540000000 {
> + opp-hz = /bits/ 64 <540000000>;
> + opp-microvolt = <910000 910000 1200000>;
> + };
> +
> + opp@576000000 {
> + opp-hz = /bits/ 64 <576000000>;
> + opp-microvolt = <930000 930000 1200000>;
> + };
> +
> + opp@624000000 {
> + opp-hz = /bits/ 64 <624000000>;
> + opp-microvolt = <950000 950000 1200000>;
> + };
> +
> + opp@756000000 {
> + opp-hz = /bits/ 64 <756000000>;
> + opp-microvolt = <1040000 1040000 1200000>;
> + };
> + };
> };
Clement,
I gave run for v3 on H6 GS1 TVbox and what i discovered:
1. I have frequent hard hangs if DVFS is enabled (hard reset required),
2. hangs seems to be related to operating points changing - as limiting OPP table to any single entry (tested on 5 highest OPP ) makes my GS1 stable working,
3. hang seems to be exactly related to OPP changes as having OPP table even with just 2 entries already gives hangs,
4. tunings with <regulator-ramp-delay> makes no difference (tested with 0, 2500 and 25000). Also increasing <regulator-enable-ramp-delay> 2 times up (to 64000) makes no change.
Now I have 2 hypothesis:
a. issue is SW related: software operations in DVFS are somehow "unsafe" at touching hardware (is it possible we have i.e. concurrency issue here?);
b. issue is HW related: i.e. in steep-up OPP, time between sending change Vdd-gpu command to HW for increasing Vdd and sending command to HW for increasing GPU freq is too short.
To investigate further I done following test: limit OPP table to 4 entries+all 4 entries have the same Vdd.
If this test will pass the we know issue is b\.
If it will fail - then issue is a\.
And on my GS1 this test fails....so for me issue is a\ likely….
let me know how i can help!
br
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
2020-07-10 13:45 ` Piotr Oniszczuk
@ 2020-07-10 13:50 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-10 13:50 UTC (permalink / raw)
To: Piotr Oniszczuk
Cc: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard, wens,
linux-kernel, dri-devel, linux-sunxi
Hi,
On Fri, 10 Jul 2020 at 15:45, Piotr Oniszczuk <piotr.oniszczuk@gmail.com> wrote:
>
>
>
> > Wiadomość napisana przez Clément Péron <peron.clem@gmail.com> w dniu 09.07.2020, o godz. 16:03:
> >
> > Add an Operating Performance Points table for the GPU to
> > enable Dynamic Voltage & Frequency Scaling on the H6.
> >
> > The voltage range is set with minival voltage set to the target
> > and the maximal voltage set to 1.2V. This allow DVFS framework to
> > work properly on board with fixed regulator.
> >
> > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > ---
> > arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
> > 1 file changed, 80 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > index 8f514a2169aa..a69f9e09a829 100644
> > --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > @@ -174,6 +174,7 @@ gpu: gpu@1800000 {
> > clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
> > clock-names = "core", "bus";
> > resets = <&ccu RST_BUS_GPU>;
> > + operating-points-v2 = <&gpu_opp_table>;
> > #cooling-cells = <2>;
> > status = "disabled";
> > };
> > @@ -1036,4 +1037,83 @@ map0 {
> > };
> > };
> > };
> > +
> > + gpu_opp_table: gpu-opp-table {
> > + compatible = "operating-points-v2";
> > +
> > + opp@216000000 {
> > + opp-hz = /bits/ 64 <216000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@264000000 {
> > + opp-hz = /bits/ 64 <264000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@312000000 {
> > + opp-hz = /bits/ 64 <312000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@336000000 {
> > + opp-hz = /bits/ 64 <336000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@360000000 {
> > + opp-hz = /bits/ 64 <360000000>;
> > + opp-microvolt = <820000 820000 1200000>;
> > + };
> > +
> > + opp@384000000 {
> > + opp-hz = /bits/ 64 <384000000>;
> > + opp-microvolt = <830000 830000 1200000>;
> > + };
> > +
> > + opp@408000000 {
> > + opp-hz = /bits/ 64 <408000000>;
> > + opp-microvolt = <840000 840000 1200000>;
> > + };
> > +
> > + opp@420000000 {
> > + opp-hz = /bits/ 64 <420000000>;
> > + opp-microvolt = <850000 850000 1200000>;
> > + };
> > +
> > + opp@432000000 {
> > + opp-hz = /bits/ 64 <432000000>;
> > + opp-microvolt = <860000 860000 1200000>;
> > + };
> > +
> > + opp@456000000 {
> > + opp-hz = /bits/ 64 <456000000>;
> > + opp-microvolt = <870000 870000 1200000>;
> > + };
> > +
> > + opp@504000000 {
> > + opp-hz = /bits/ 64 <504000000>;
> > + opp-microvolt = <890000 890000 1200000>;
> > + };
> > +
> > + opp@540000000 {
> > + opp-hz = /bits/ 64 <540000000>;
> > + opp-microvolt = <910000 910000 1200000>;
> > + };
> > +
> > + opp@576000000 {
> > + opp-hz = /bits/ 64 <576000000>;
> > + opp-microvolt = <930000 930000 1200000>;
> > + };
> > +
> > + opp@624000000 {
> > + opp-hz = /bits/ 64 <624000000>;
> > + opp-microvolt = <950000 950000 1200000>;
> > + };
> > +
> > + opp@756000000 {
> > + opp-hz = /bits/ 64 <756000000>;
> > + opp-microvolt = <1040000 1040000 1200000>;
> > + };
> > + };
> > };
>
> Clement,
>
> I gave run for v3 on H6 GS1 TVbox and what i discovered:
>
> 1. I have frequent hard hangs if DVFS is enabled (hard reset required),
>
> 2. hangs seems to be related to operating points changing - as limiting OPP table to any single entry (tested on 5 highest OPP ) makes my GS1 stable working,
>
> 3. hang seems to be exactly related to OPP changes as having OPP table even with just 2 entries already gives hangs,
>
> 4. tunings with <regulator-ramp-delay> makes no difference (tested with 0, 2500 and 25000). Also increasing <regulator-enable-ramp-delay> 2 times up (to 64000) makes no change.
>
> Now I have 2 hypothesis:
>
> a. issue is SW related: software operations in DVFS are somehow "unsafe" at touching hardware (is it possible we have i.e. concurrency issue here?);
>
> b. issue is HW related: i.e. in steep-up OPP, time between sending change Vdd-gpu command to HW for increasing Vdd and sending command to HW for increasing GPU freq is too short.
>
> To investigate further I done following test: limit OPP table to 4 entries+all 4 entries have the same Vdd.
>
> If this test will pass the we know issue is b\.
> If it will fail - then issue is a\.
>
> And on my GS1 this test fails....so for me issue is a\ likely….
>
> let me know how i can help!
Yes it definitely helps, thanks !
+CC linux-sunxi
If someone wants to have a look at the sunxi-ng clk driver.
Regards,
Clement
>
> br
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 13/14] [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
@ 2020-07-10 13:50 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-10 13:50 UTC (permalink / raw)
To: Piotr Oniszczuk
Cc: Nishanth Menon, Tomeu Vizoso, Stephen Boyd, Viresh Kumar,
dri-devel, linux-sunxi, linux-kernel, Steven Price, wens,
Alyssa Rosenzweig
Hi,
On Fri, 10 Jul 2020 at 15:45, Piotr Oniszczuk <piotr.oniszczuk@gmail.com> wrote:
>
>
>
> > Wiadomość napisana przez Clément Péron <peron.clem@gmail.com> w dniu 09.07.2020, o godz. 16:03:
> >
> > Add an Operating Performance Points table for the GPU to
> > enable Dynamic Voltage & Frequency Scaling on the H6.
> >
> > The voltage range is set with minival voltage set to the target
> > and the maximal voltage set to 1.2V. This allow DVFS framework to
> > work properly on board with fixed regulator.
> >
> > Signed-off-by: Clément Péron <peron.clem@gmail.com>
> > ---
> > arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 80 ++++++++++++++++++++
> > 1 file changed, 80 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > index 8f514a2169aa..a69f9e09a829 100644
> > --- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > +++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi
> > @@ -174,6 +174,7 @@ gpu: gpu@1800000 {
> > clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>;
> > clock-names = "core", "bus";
> > resets = <&ccu RST_BUS_GPU>;
> > + operating-points-v2 = <&gpu_opp_table>;
> > #cooling-cells = <2>;
> > status = "disabled";
> > };
> > @@ -1036,4 +1037,83 @@ map0 {
> > };
> > };
> > };
> > +
> > + gpu_opp_table: gpu-opp-table {
> > + compatible = "operating-points-v2";
> > +
> > + opp@216000000 {
> > + opp-hz = /bits/ 64 <216000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@264000000 {
> > + opp-hz = /bits/ 64 <264000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@312000000 {
> > + opp-hz = /bits/ 64 <312000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@336000000 {
> > + opp-hz = /bits/ 64 <336000000>;
> > + opp-microvolt = <810000 810000 1200000>;
> > + };
> > +
> > + opp@360000000 {
> > + opp-hz = /bits/ 64 <360000000>;
> > + opp-microvolt = <820000 820000 1200000>;
> > + };
> > +
> > + opp@384000000 {
> > + opp-hz = /bits/ 64 <384000000>;
> > + opp-microvolt = <830000 830000 1200000>;
> > + };
> > +
> > + opp@408000000 {
> > + opp-hz = /bits/ 64 <408000000>;
> > + opp-microvolt = <840000 840000 1200000>;
> > + };
> > +
> > + opp@420000000 {
> > + opp-hz = /bits/ 64 <420000000>;
> > + opp-microvolt = <850000 850000 1200000>;
> > + };
> > +
> > + opp@432000000 {
> > + opp-hz = /bits/ 64 <432000000>;
> > + opp-microvolt = <860000 860000 1200000>;
> > + };
> > +
> > + opp@456000000 {
> > + opp-hz = /bits/ 64 <456000000>;
> > + opp-microvolt = <870000 870000 1200000>;
> > + };
> > +
> > + opp@504000000 {
> > + opp-hz = /bits/ 64 <504000000>;
> > + opp-microvolt = <890000 890000 1200000>;
> > + };
> > +
> > + opp@540000000 {
> > + opp-hz = /bits/ 64 <540000000>;
> > + opp-microvolt = <910000 910000 1200000>;
> > + };
> > +
> > + opp@576000000 {
> > + opp-hz = /bits/ 64 <576000000>;
> > + opp-microvolt = <930000 930000 1200000>;
> > + };
> > +
> > + opp@624000000 {
> > + opp-hz = /bits/ 64 <624000000>;
> > + opp-microvolt = <950000 950000 1200000>;
> > + };
> > +
> > + opp@756000000 {
> > + opp-hz = /bits/ 64 <756000000>;
> > + opp-microvolt = <1040000 1040000 1200000>;
> > + };
> > + };
> > };
>
> Clement,
>
> I gave run for v3 on H6 GS1 TVbox and what i discovered:
>
> 1. I have frequent hard hangs if DVFS is enabled (hard reset required),
>
> 2. hangs seems to be related to operating points changing - as limiting OPP table to any single entry (tested on 5 highest OPP ) makes my GS1 stable working,
>
> 3. hang seems to be exactly related to OPP changes as having OPP table even with just 2 entries already gives hangs,
>
> 4. tunings with <regulator-ramp-delay> makes no difference (tested with 0, 2500 and 25000). Also increasing <regulator-enable-ramp-delay> 2 times up (to 64000) makes no change.
>
> Now I have 2 hypothesis:
>
> a. issue is SW related: software operations in DVFS are somehow "unsafe" at touching hardware (is it possible we have i.e. concurrency issue here?);
>
> b. issue is HW related: i.e. in steep-up OPP, time between sending change Vdd-gpu command to HW for increasing Vdd and sending command to HW for increasing GPU freq is too short.
>
> To investigate further I done following test: limit OPP table to 4 entries+all 4 entries have the same Vdd.
>
> If this test will pass the we know issue is b\.
> If it will fail - then issue is a\.
>
> And on my GS1 this test fails....so for me issue is a\ likely….
>
> let me know how i can help!
Yes it definitely helps, thanks !
+CC linux-sunxi
If someone wants to have a look at the sunxi-ng clk driver.
Regards,
Clement
>
> br
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread
* [PATCH v3 14/14] [DO NOT MERGE] arm64: dts: allwinner: force GPU regulator to be always
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:03 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel, Clément Péron
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
index 3f7ceeb1a767..14257f7476b8 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
@@ -245,6 +245,7 @@ reg_dcdca: dcdca {
};
reg_dcdcc: dcdcc {
+ regulator-always-on;
regulator-enable-ramp-delay = <32000>;
regulator-min-microvolt = <810000>;
regulator-max-microvolt = <1080000>;
--
2.25.1
^ permalink raw reply related [flat|nested] 40+ messages in thread
* [PATCH v3 14/14] [DO NOT MERGE] arm64: dts: allwinner: force GPU regulator to be always
@ 2020-07-09 14:03 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:03 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: Clément Péron, linux-kernel, dri-devel
Signed-off-by: Clément Péron <peron.clem@gmail.com>
---
arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
index 3f7ceeb1a767..14257f7476b8 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-beelink-gs1.dts
@@ -245,6 +245,7 @@ reg_dcdca: dcdca {
};
reg_dcdcc: dcdcc {
+ regulator-always-on;
regulator-enable-ramp-delay = <32000>;
regulator-min-microvolt = <810000>;
regulator-max-microvolt = <1080000>;
--
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 40+ messages in thread
* Re: [PATCH v3 00/14] Add regulator devfreq support to Panfrost
2020-07-09 14:03 ` Clément Péron
@ 2020-07-09 14:19 ` Clément Péron
-1 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:19 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: dri-devel, linux-kernel
Hi,
On Thu, 9 Jul 2020 at 16:03, Clément Péron <peron.clem@gmail.com> wrote:
>
> Hi,
>
> This serie cleans and adds regulator support to Panfrost devfreq.
> This is mostly based on comment for the freshly introduced lima
> devfreq.
>
> We need to add regulator support because on Allwinner the GPU OPP
> table defines both frequencies and voltages.
>
> First patches [01-07] should not change the actual behavior
> and introduce a proper panfrost_devfreq struct.
Just saw that some changes have been made and pushed to 5.8-rc4.
I will push a v4 up to date.
Regards,
Clement
>
> Regards,
> Clément
>
> Changes since v2:
> - Collect Alyssa Rosenzweig reviewed-by tags
> - Fix opp_set_regulator before adding opp_table (introduce in v2)
> - Call err_fini in case opp_add_table failed
>
> Changes since v1:
> - Collect Steven Price reviewed-by tags
> - Fix spinlock comment
> - Drop OPP clock-name path
> - Drop device_property_test patch
> - Add rename error labels patch
>
>
> Clément Péron (14):
> drm/panfrost: avoid static declaration
> drm/panfrost: clean headers in devfreq
> drm/panfrost: don't use pfdevfreq.busy_count to know if hw is idle
> drm/panfrost: introduce panfrost_devfreq struct
> drm/panfrost: use spinlock instead of atomic
> drm/panfrost: properly handle error in probe
> drm/panfrost: rename error labels in device_init
> drm/panfrost: move devfreq_init()/fini() in device
> drm/panfrost: dynamically alloc regulators
> drm/panfrost: add regulators to devfreq
> arm64: defconfig: Enable devfreq cooling device
> arm64: dts: allwinner: h6: Add cooling map for GPU
> [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
> [DO NOT MERGE] arm64: dts: allwinner: force GPU regulator to be always
>
> .../dts/allwinner/sun50i-h6-beelink-gs1.dts | 1 +
> arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 102 ++++++++++
> arch/arm64/configs/defconfig | 1 +
> drivers/gpu/drm/panfrost/panfrost_devfreq.c | 175 ++++++++++++------
> drivers/gpu/drm/panfrost/panfrost_devfreq.h | 30 ++-
> drivers/gpu/drm/panfrost/panfrost_device.c | 61 +++---
> drivers/gpu/drm/panfrost/panfrost_device.h | 14 +-
> drivers/gpu/drm/panfrost/panfrost_drv.c | 15 +-
> drivers/gpu/drm/panfrost/panfrost_job.c | 10 +-
> 9 files changed, 296 insertions(+), 113 deletions(-)
>
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [PATCH v3 00/14] Add regulator devfreq support to Panfrost
@ 2020-07-09 14:19 ` Clément Péron
0 siblings, 0 replies; 40+ messages in thread
From: Clément Péron @ 2020-07-09 14:19 UTC (permalink / raw)
To: Rob Herring, Tomeu Vizoso, Steven Price, Alyssa Rosenzweig,
Viresh Kumar, Nishanth Menon, Stephen Boyd, Maxime Ripard,
Chen-Yu Tsai
Cc: linux-kernel, dri-devel
Hi,
On Thu, 9 Jul 2020 at 16:03, Clément Péron <peron.clem@gmail.com> wrote:
>
> Hi,
>
> This serie cleans and adds regulator support to Panfrost devfreq.
> This is mostly based on comment for the freshly introduced lima
> devfreq.
>
> We need to add regulator support because on Allwinner the GPU OPP
> table defines both frequencies and voltages.
>
> First patches [01-07] should not change the actual behavior
> and introduce a proper panfrost_devfreq struct.
Just saw that some changes have been made and pushed to 5.8-rc4.
I will push a v4 up to date.
Regards,
Clement
>
> Regards,
> Clément
>
> Changes since v2:
> - Collect Alyssa Rosenzweig reviewed-by tags
> - Fix opp_set_regulator before adding opp_table (introduce in v2)
> - Call err_fini in case opp_add_table failed
>
> Changes since v1:
> - Collect Steven Price reviewed-by tags
> - Fix spinlock comment
> - Drop OPP clock-name path
> - Drop device_property_test patch
> - Add rename error labels patch
>
>
> Clément Péron (14):
> drm/panfrost: avoid static declaration
> drm/panfrost: clean headers in devfreq
> drm/panfrost: don't use pfdevfreq.busy_count to know if hw is idle
> drm/panfrost: introduce panfrost_devfreq struct
> drm/panfrost: use spinlock instead of atomic
> drm/panfrost: properly handle error in probe
> drm/panfrost: rename error labels in device_init
> drm/panfrost: move devfreq_init()/fini() in device
> drm/panfrost: dynamically alloc regulators
> drm/panfrost: add regulators to devfreq
> arm64: defconfig: Enable devfreq cooling device
> arm64: dts: allwinner: h6: Add cooling map for GPU
> [DO NOT MERGE] arm64: dts: allwinner: h6: Add GPU OPP table
> [DO NOT MERGE] arm64: dts: allwinner: force GPU regulator to be always
>
> .../dts/allwinner/sun50i-h6-beelink-gs1.dts | 1 +
> arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 102 ++++++++++
> arch/arm64/configs/defconfig | 1 +
> drivers/gpu/drm/panfrost/panfrost_devfreq.c | 175 ++++++++++++------
> drivers/gpu/drm/panfrost/panfrost_devfreq.h | 30 ++-
> drivers/gpu/drm/panfrost/panfrost_device.c | 61 +++---
> drivers/gpu/drm/panfrost/panfrost_device.h | 14 +-
> drivers/gpu/drm/panfrost/panfrost_drv.c | 15 +-
> drivers/gpu/drm/panfrost/panfrost_job.c | 10 +-
> 9 files changed, 296 insertions(+), 113 deletions(-)
>
> --
> 2.25.1
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 40+ messages in thread