From: Jordan Crouse <jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
georgi.djakov-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org
Cc: nm-l0cyMroinI0@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
sboyd-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
vireshk-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: [PATCH 8/9] drm/msm/a6xx: Add support for an interconnect path
Date: Mon, 27 Aug 2018 09:11:11 -0600 [thread overview]
Message-ID: <20180827151112.25211-9-jcrouse@codeaurora.org> (raw)
In-Reply-To: <20180827151112.25211-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Add support for setting the OPP defined bandwidth for a given
GPU frequency value for a6xx. On sdm845 even though the GPU
frequency is set by the GMU but the bus bandwidth quota is
set by the CPU.
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 27 +++++++++++++++++++++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 +++++++
drivers/gpu/drm/msm/msm_gpu.h | 3 +++
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index d0dac4c2e3e7..d63eefc7c74d 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -4,6 +4,7 @@
#include <linux/clk.h>
#include <linux/iopoll.h>
#include <linux/pm_opp.h>
+#include <linux/interconnect.h>
#include <soc/qcom/cmd-db.h>
#include "a6xx_gpu.h"
@@ -65,8 +66,15 @@ static bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu)
A6XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_CLK_OFF));
}
-static int a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
+static void a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
{
+ struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
+ struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
+ struct msm_gpu *gpu = &adreno_gpu->base;
+ struct dev_pm_opp *opp;
+ u64 ab, ib;
+ int ret;
+
gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0);
gmu_write(gmu, REG_A6XX_GMU_DCVS_PERF_SETTING,
@@ -82,7 +90,22 @@ static int a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
a6xx_gmu_set_oob(gmu, GMU_OOB_DCVS_SET);
a6xx_gmu_clear_oob(gmu, GMU_OOB_DCVS_SET);
- return gmu_read(gmu, REG_A6XX_GMU_DCVS_RETURN);
+ ret = gmu_read(gmu, REG_A6XX_GMU_DCVS_RETURN);
+ if (ret)
+ dev_err(gmu->dev, "GMU set GPU frequency error: %d\n", ret);
+
+ /* Set the interconnect bandwidth from the CPU */
+ if (IS_ERR_OR_NULL(gpu->icc_path))
+ return;
+
+ opp = dev_pm_opp_find_freq_exact(&gpu->pdev->dev,
+ gmu->gpu_freqs[index], true);
+ if (!IS_ERR_OR_NULL(opp)) {
+ if (!dev_pm_opp_get_interconnect_bw(opp, "port0", &ab, &ib))
+ icc_set(gpu->icc_path, ab, ib);
+
+ dev_pm_opp_put(opp);
+ }
}
static bool a6xx_gmu_check_idle_level(struct a6xx_gmu *gmu)
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index da1363a0c54d..2eace9bf32c7 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -21,6 +21,7 @@
#include <linux/kernel.h>
#include <linux/pm_opp.h>
#include <linux/slab.h>
+#include <linux/interconnect.h>
#include "adreno_gpu.h"
#include "msm_gem.h"
#include "msm_mmu.h"
@@ -694,6 +695,9 @@ static int adreno_get_pwrlevels(struct device *dev,
DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate);
+ /* Check for an interconnect path for the bus */
+ gpu->icc_path = of_icc_get(dev, "port0");
+
return 0;
}
@@ -732,10 +736,13 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
{
+ struct msm_gpu *gpu = &adreno_gpu->base;
unsigned int i;
for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
release_firmware(adreno_gpu->fw[i]);
+ icc_put(gpu->icc_path);
+
msm_gpu_cleanup(&adreno_gpu->base);
}
diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h
index 9122ee6e55e4..9c851d03f344 100644
--- a/drivers/gpu/drm/msm/msm_gpu.h
+++ b/drivers/gpu/drm/msm/msm_gpu.h
@@ -20,6 +20,7 @@
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
+#include <linux/interconnect.h>
#include "msm_drv.h"
#include "msm_fence.h"
@@ -117,6 +118,8 @@ struct msm_gpu {
struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk;
uint32_t fast_rate;
+ struct icc_path *icc_path;
+
/* Hang and Inactivity Detection:
*/
#define DRM_MSM_INACTIVE_PERIOD 66 /* in ms (roughly four frames) */
--
2.18.0
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno
WARNING: multiple messages have this Message-ID (diff)
From: jcrouse@codeaurora.org (Jordan Crouse)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 8/9] drm/msm/a6xx: Add support for an interconnect path
Date: Mon, 27 Aug 2018 09:11:11 -0600 [thread overview]
Message-ID: <20180827151112.25211-9-jcrouse@codeaurora.org> (raw)
In-Reply-To: <20180827151112.25211-1-jcrouse@codeaurora.org>
Add support for setting the OPP defined bandwidth for a given
GPU frequency value for a6xx. On sdm845 even though the GPU
frequency is set by the GMU but the bus bandwidth quota is
set by the CPU.
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
---
drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 27 +++++++++++++++++++++++--
drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 +++++++
drivers/gpu/drm/msm/msm_gpu.h | 3 +++
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index d0dac4c2e3e7..d63eefc7c74d 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -4,6 +4,7 @@
#include <linux/clk.h>
#include <linux/iopoll.h>
#include <linux/pm_opp.h>
+#include <linux/interconnect.h>
#include <soc/qcom/cmd-db.h>
#include "a6xx_gpu.h"
@@ -65,8 +66,15 @@ static bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu)
A6XX_GMU_SPTPRAC_PWR_CLK_STATUS_GX_HM_CLK_OFF));
}
-static int a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
+static void a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
{
+ struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
+ struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
+ struct msm_gpu *gpu = &adreno_gpu->base;
+ struct dev_pm_opp *opp;
+ u64 ab, ib;
+ int ret;
+
gmu_write(gmu, REG_A6XX_GMU_DCVS_ACK_OPTION, 0);
gmu_write(gmu, REG_A6XX_GMU_DCVS_PERF_SETTING,
@@ -82,7 +90,22 @@ static int a6xx_gmu_set_freq(struct a6xx_gmu *gmu, int index)
a6xx_gmu_set_oob(gmu, GMU_OOB_DCVS_SET);
a6xx_gmu_clear_oob(gmu, GMU_OOB_DCVS_SET);
- return gmu_read(gmu, REG_A6XX_GMU_DCVS_RETURN);
+ ret = gmu_read(gmu, REG_A6XX_GMU_DCVS_RETURN);
+ if (ret)
+ dev_err(gmu->dev, "GMU set GPU frequency error: %d\n", ret);
+
+ /* Set the interconnect bandwidth from the CPU */
+ if (IS_ERR_OR_NULL(gpu->icc_path))
+ return;
+
+ opp = dev_pm_opp_find_freq_exact(&gpu->pdev->dev,
+ gmu->gpu_freqs[index], true);
+ if (!IS_ERR_OR_NULL(opp)) {
+ if (!dev_pm_opp_get_interconnect_bw(opp, "port0", &ab, &ib))
+ icc_set(gpu->icc_path, ab, ib);
+
+ dev_pm_opp_put(opp);
+ }
}
static bool a6xx_gmu_check_idle_level(struct a6xx_gmu *gmu)
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index da1363a0c54d..2eace9bf32c7 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -21,6 +21,7 @@
#include <linux/kernel.h>
#include <linux/pm_opp.h>
#include <linux/slab.h>
+#include <linux/interconnect.h>
#include "adreno_gpu.h"
#include "msm_gem.h"
#include "msm_mmu.h"
@@ -694,6 +695,9 @@ static int adreno_get_pwrlevels(struct device *dev,
DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate);
+ /* Check for an interconnect path for the bus */
+ gpu->icc_path = of_icc_get(dev, "port0");
+
return 0;
}
@@ -732,10 +736,13 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,
void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu)
{
+ struct msm_gpu *gpu = &adreno_gpu->base;
unsigned int i;
for (i = 0; i < ARRAY_SIZE(adreno_gpu->info->fw); i++)
release_firmware(adreno_gpu->fw[i]);
+ icc_put(gpu->icc_path);
+
msm_gpu_cleanup(&adreno_gpu->base);
}
diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h
index 9122ee6e55e4..9c851d03f344 100644
--- a/drivers/gpu/drm/msm/msm_gpu.h
+++ b/drivers/gpu/drm/msm/msm_gpu.h
@@ -20,6 +20,7 @@
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
+#include <linux/interconnect.h>
#include "msm_drv.h"
#include "msm_fence.h"
@@ -117,6 +118,8 @@ struct msm_gpu {
struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk;
uint32_t fast_rate;
+ struct icc_path *icc_path;
+
/* Hang and Inactivity Detection:
*/
#define DRM_MSM_INACTIVE_PERIOD 66 /* in ms (roughly four frames) */
--
2.18.0
next prev parent reply other threads:[~2018-08-27 15:11 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-27 15:11 [PATCH 0/9] Add interconnect support + bindings for A630 GPU Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
2018-08-27 15:11 ` [PATCH 2/9] drm/msm/a6xx: Fix PDC register overlap Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
2018-08-27 15:11 ` [PATCH 4/9] dt-bindings: Document qcom,adreno-gmu Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
[not found] ` <20180827151112.25211-1-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-27 15:11 ` [PATCH 1/9] drm/msm/a6xx: rnndb updates for a6xx Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
2018-08-27 15:11 ` [PATCH 3/9] drm/msm/a6xx: Rename gmu phandle to qcom, gmu Jordan Crouse
2018-08-27 15:11 ` [PATCH 3/9] drm/msm/a6xx: Rename gmu phandle to qcom,gmu Jordan Crouse
2018-08-27 15:11 ` [PATCH 5/9] arm64: dts: sdm845: Add gpu and gmu device nodes Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
[not found] ` <20180827151112.25211-6-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-28 10:30 ` Vivek Gautam
2018-08-28 10:30 ` Vivek Gautam
2018-10-10 9:46 ` Viresh Kumar
2018-10-10 9:46 ` Viresh Kumar
2018-10-10 14:29 ` Jordan Crouse
2018-10-10 14:29 ` Jordan Crouse
[not found] ` <20181010142905.GB9977-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-10 14:31 ` Viresh Kumar
2018-10-10 14:31 ` Viresh Kumar
2018-10-10 14:48 ` Jordan Crouse
2018-10-10 14:48 ` [Freedreno] " Jordan Crouse
[not found] ` <20181010144856.GC9977-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-10 14:51 ` Viresh Kumar
2018-10-10 14:51 ` [Freedreno] " Viresh Kumar
2018-10-10 15:10 ` Jordan Crouse
2018-10-10 15:10 ` [Freedreno] " Jordan Crouse
[not found] ` <20181010151006.GD9977-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-11 5:02 ` Viresh Kumar
2018-10-11 5:02 ` [Freedreno] " Viresh Kumar
2018-10-11 14:54 ` Jordan Crouse
2018-10-11 14:54 ` [Freedreno] " Jordan Crouse
[not found] ` <20181011145456.GG9977-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-15 10:03 ` Viresh Kumar
2018-10-15 10:03 ` [Freedreno] " Viresh Kumar
2018-10-15 14:34 ` Jordan Crouse
2018-10-15 14:34 ` [Freedreno] " Jordan Crouse
[not found] ` <20181015143444.GA4751-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-22 10:38 ` Viresh Kumar
2018-10-22 10:38 ` [Freedreno] " Viresh Kumar
2018-10-22 13:20 ` Niklas Cassel
2018-10-22 13:20 ` Niklas Cassel
2018-10-22 14:37 ` Jordan Crouse
2018-10-22 14:37 ` Jordan Crouse
2018-10-22 14:34 ` Jordan Crouse
2018-10-22 14:34 ` Jordan Crouse
2018-10-17 18:28 ` Doug Anderson
2018-10-17 18:28 ` Doug Anderson
2018-08-27 15:11 ` [PATCH 6/9] PM / OPP: dt-bindings: Add opp-interconnect-bw Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
2018-09-27 8:23 ` Georgi Djakov
2018-09-27 8:23 ` Georgi Djakov
[not found] ` <0998a374-6cb0-9218-d2e3-92f8ee9861ed-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2018-10-10 9:59 ` Viresh Kumar
2018-10-10 9:59 ` Viresh Kumar
2018-10-10 14:27 ` Jordan Crouse
2018-10-10 14:27 ` Jordan Crouse
[not found] ` <20181010142723.GA9977-9PYrDHPZ2Orvke4nUoYGnHL1okKdlPRT@public.gmane.org>
2018-10-10 14:29 ` Viresh Kumar
2018-10-10 14:29 ` Viresh Kumar
[not found] ` <20180827151112.25211-7-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-15 14:34 ` Rob Herring
2018-10-15 14:34 ` Rob Herring
2018-10-15 15:12 ` Jordan Crouse
2018-10-15 15:12 ` Jordan Crouse
2018-08-27 15:11 ` [PATCH 7/9] OPP: Add dev_pm_opp_get_interconnect_bw() Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
[not found] ` <20180827151112.25211-8-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-05 6:36 ` Sharat Masetty
2018-10-05 6:36 ` Sharat Masetty
[not found] ` <49858ede-66db-b58f-e586-411896efad4b-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-10-05 17:13 ` Jordan Crouse
2018-10-05 17:13 ` Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse [this message]
2018-08-27 15:11 ` [PATCH 8/9] drm/msm/a6xx: Add support for an interconnect path Jordan Crouse
[not found] ` <20180827151112.25211-9-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-28 1:23 ` kbuild test robot
2018-08-28 1:23 ` kbuild test robot
2018-08-27 15:11 ` [PATCH 9/9] arm64: dts: Add interconnect for the GPU on SDM845 Jordan Crouse
2018-08-27 15:11 ` Jordan Crouse
[not found] ` <20180827151112.25211-10-jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2018-08-28 18:16 ` Jordan Crouse
2018-08-28 18:16 ` [Freedreno] " Jordan Crouse
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180827151112.25211-9-jcrouse@codeaurora.org \
--to=jcrouse-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
--cc=bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
--cc=georgi.djakov-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=nm-l0cyMroinI0@public.gmane.org \
--cc=sboyd-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=vireshk-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.