linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU.
@ 2019-02-07 20:09 Eric Anholt
  2019-02-07 20:09 ` [PATCH 2/4] drm/v3d: Add support for V3D v4.2 Eric Anholt
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Eric Anholt @ 2019-02-07 20:09 UTC (permalink / raw)
  To: dri-devel; +Cc: linux-kernel, david.emett, thomas.spurden, Eric Anholt

Signed-off-by: Eric Anholt <eric@anholt.net>
---
 drivers/gpu/drm/v3d/v3d_drv.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 22fff0d3aecd..1f22ce542a04 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -7,9 +7,9 @@
  * This driver supports the Broadcom V3D 3.3 and 4.1 OpenGL ES GPUs.
  * For V3D 2.x support, see the VC4 driver.
  *
- * Currently only single-core rendering using the binner and renderer
- * is supported.  The TFU (texture formatting unit) and V3D 4.x's CSD
- * (compute shader dispatch) are not yet supported.
+ * Currently only single-core rendering using the binner and renderer,
+ * along with TFU (texture formatting unit) rendering is supported.
+ * V3D 4.x's CSD (compute shader dispatch) is not yet supported.
  */
 
 #include <linux/clk.h>
-- 
2.20.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] drm/v3d: Add support for V3D v4.2.
  2019-02-07 20:09 [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Eric Anholt
@ 2019-02-07 20:09 ` Eric Anholt
  2019-02-07 20:10 ` [PATCH 3/4] drm/v3d: Don't change other values in V3D_CTL_MISCCFG Eric Anholt
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Eric Anholt @ 2019-02-07 20:09 UTC (permalink / raw)
  To: dri-devel; +Cc: linux-kernel, david.emett, thomas.spurden, Eric Anholt

No compatible string for it yet, just the version-dependent changes.
They've now tied the hub and the core interrupt lines into a single
interrupt line coming out of the block.  It also turns out I made a
mistake in modeling the V3D v3.3 and v4.1 bridge as a part of V3D
itself -- the bridge is going away in favor of an external reset
controller in a larger HW module.

Signed-off-by: Eric Anholt <eric@anholt.net>
---
 drivers/gpu/drm/v3d/v3d_drv.c | 18 ++++++++++++++----
 drivers/gpu/drm/v3d/v3d_drv.h |  1 +
 drivers/gpu/drm/v3d/v3d_gem.c | 12 +++++++++++-
 drivers/gpu/drm/v3d/v3d_irq.c | 27 +++++++++++++++++++++------
 4 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
index 1f22ce542a04..8b2f156bdd30 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.c
+++ b/drivers/gpu/drm/v3d/v3d_drv.c
@@ -19,6 +19,7 @@
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fb_helper.h>
@@ -496,10 +497,6 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
 	v3d->pdev = pdev;
 	drm = &v3d->drm;
 
-	ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
-	if (ret)
-		goto dev_free;
-
 	ret = map_regs(v3d, &v3d->hub_regs, "hub");
 	if (ret)
 		goto dev_free;
@@ -514,6 +511,19 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
 	v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
 	WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
 
+	if (v3d->ver < 42) {
+		ret = map_regs(v3d, &v3d->bridge_regs, "bridge");
+		if (ret)
+			goto dev_free;
+	} else {
+		v3d->reset = devm_reset_control_get_exclusive(dev, NULL);
+		if (IS_ERR(v3d->reset)) {
+			dev_err(dev, "Failed to get reset control: %ld\n",
+				PTR_ERR(v3d->reset));
+			return PTR_ERR(v3d->reset);
+		}
+	}
+
 	if (v3d->ver < 41) {
 		ret = map_regs(v3d, &v3d->gca_regs, "gca");
 		if (ret)
diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h
index 239b56d76f3e..b5732cf897fe 100644
--- a/drivers/gpu/drm/v3d/v3d_drv.h
+++ b/drivers/gpu/drm/v3d/v3d_drv.h
@@ -48,6 +48,7 @@ struct v3d_dev {
 	void __iomem *bridge_regs;
 	void __iomem *gca_regs;
 	struct clk *clk;
+	struct reset_control *reset;
 
 	/* Virtual and DMA addresses of the single shared page table. */
 	volatile u32 *pt;
diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 803f31467ec1..3ee3ae4d3cac 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -6,6 +6,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/reset.h>
 #include <linux/device.h>
 #include <linux/io.h>
 #include <linux/sched/signal.h>
@@ -69,7 +70,7 @@ v3d_idle_gca(struct v3d_dev *v3d)
 }
 
 static void
-v3d_reset_v3d(struct v3d_dev *v3d)
+v3d_reset_by_bridge(struct v3d_dev *v3d)
 {
 	int version = V3D_BRIDGE_READ(V3D_TOP_GR_BRIDGE_REVISION);
 
@@ -89,6 +90,15 @@ v3d_reset_v3d(struct v3d_dev *v3d)
 				 V3D_TOP_GR_BRIDGE_SW_INIT_1_V3D_CLK_108_SW_INIT);
 		V3D_BRIDGE_WRITE(V3D_TOP_GR_BRIDGE_SW_INIT_1, 0);
 	}
+}
+
+static void
+v3d_reset_v3d(struct v3d_dev *v3d)
+{
+	if (v3d->reset)
+		reset_control_reset(v3d->reset);
+	else
+		v3d_reset_by_bridge(v3d);
 
 	v3d_init_hw_state(v3d);
 }
diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c
index 69338da70ddc..98dd77acf512 100644
--- a/drivers/gpu/drm/v3d/v3d_irq.c
+++ b/drivers/gpu/drm/v3d/v3d_irq.c
@@ -27,6 +27,9 @@
 			    V3D_HUB_INT_MMU_CAP |	\
 			    V3D_HUB_INT_TFUC))
 
+static irqreturn_t
+v3d_hub_irq(int irq, void *arg);
+
 static void
 v3d_overflow_mem_work(struct work_struct *work)
 {
@@ -112,6 +115,12 @@ v3d_irq(int irq, void *arg)
 	if (intsts & V3D_INT_GMPV)
 		dev_err(v3d->dev, "GMP violation\n");
 
+	/* V3D 4.2 wires the hub and core IRQs together, so if we &
+	 * didn't see the common one then check hub for MMU IRQs.
+	 */
+	if (v3d->ver >= 42 && status == IRQ_NONE)
+		return v3d_hub_irq(irq, arg);
+
 	return status;
 }
 
@@ -170,12 +179,18 @@ v3d_irq_init(struct v3d_dev *v3d)
 		V3D_CORE_WRITE(core, V3D_CTL_INT_CLR, V3D_CORE_IRQS);
 	V3D_WRITE(V3D_HUB_INT_CLR, V3D_HUB_IRQS);
 
-	ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 0),
-			       v3d_hub_irq, IRQF_SHARED,
-			       "v3d_hub", v3d);
-	ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 1),
-			       v3d_irq, IRQF_SHARED,
-			       "v3d_core0", v3d);
+	if (v3d->ver <= 41) {
+		ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 0),
+				       v3d_hub_irq, IRQF_SHARED,
+				       "v3d_hub", v3d);
+		ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 1),
+				       v3d_irq, IRQF_SHARED,
+				       "v3d_core0", v3d);
+	} else {
+		ret = devm_request_irq(v3d->dev, platform_get_irq(v3d->pdev, 0),
+				       v3d_irq, IRQF_SHARED,
+				       "v3d", v3d);
+	}
 	if (ret)
 		dev_err(v3d->dev, "IRQ setup failed: %d\n", ret);
 
-- 
2.20.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] drm/v3d: Don't change other values in V3D_CTL_MISCCFG.
  2019-02-07 20:09 [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Eric Anholt
  2019-02-07 20:09 ` [PATCH 2/4] drm/v3d: Add support for V3D v4.2 Eric Anholt
@ 2019-02-07 20:10 ` Eric Anholt
  2019-02-07 20:10 ` [PATCH 4/4] drm/v3d: Make sure the GPU is on when measuring clocks Eric Anholt
  2019-02-11 17:36 ` [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Thomas Spurden
  3 siblings, 0 replies; 6+ messages in thread
From: Eric Anholt @ 2019-02-07 20:10 UTC (permalink / raw)
  To: dri-devel; +Cc: linux-kernel, david.emett, thomas.spurden, Eric Anholt

The register now has another field, QRMAXCNT for how many TMU requests
get serviced before thread switch.  We were accidentally reducing it
from its default of 0x3 (4 requests) to 0x0 (1).

Signed-off-by: Eric Anholt <eric@anholt.net>
---
 drivers/gpu/drm/v3d/v3d_gem.c  | 4 +++-
 drivers/gpu/drm/v3d/v3d_regs.h | 2 ++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c
index 3ee3ae4d3cac..887b4cf7020d 100644
--- a/drivers/gpu/drm/v3d/v3d_gem.c
+++ b/drivers/gpu/drm/v3d/v3d_gem.c
@@ -25,7 +25,9 @@ v3d_init_core(struct v3d_dev *v3d, int core)
 	 * type.  If you want the default behavior, you can still put
 	 * "2" in the indirect texture state's output_type field.
 	 */
-	V3D_CORE_WRITE(core, V3D_CTL_MISCCFG, V3D_MISCCFG_OVRTMUOUT);
+	V3D_CORE_WRITE(core, V3D_CTL_MISCCFG,
+		       V3D_CORE_READ(core, V3D_CTL_MISCCFG) |
+		       V3D_MISCCFG_OVRTMUOUT);
 
 	/* Whenever we flush the L2T cache, we always want to flush
 	 * the whole thing.
diff --git a/drivers/gpu/drm/v3d/v3d_regs.h b/drivers/gpu/drm/v3d/v3d_regs.h
index 6ccdee9d47bd..8e88af237610 100644
--- a/drivers/gpu/drm/v3d/v3d_regs.h
+++ b/drivers/gpu/drm/v3d/v3d_regs.h
@@ -216,6 +216,8 @@
 # define V3D_IDENT2_BCG_INT                            BIT(28)
 
 #define V3D_CTL_MISCCFG                                0x00018
+# define V3D_CTL_MISCCFG_QRMAXCNT_MASK                 V3D_MASK(3, 1)
+# define V3D_CTL_MISCCFG_QRMAXCNT_SHIFT                1
 # define V3D_MISCCFG_OVRTMUOUT                         BIT(0)
 
 #define V3D_CTL_L2CACTL                                0x00020
-- 
2.20.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] drm/v3d: Make sure the GPU is on when measuring clocks.
  2019-02-07 20:09 [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Eric Anholt
  2019-02-07 20:09 ` [PATCH 2/4] drm/v3d: Add support for V3D v4.2 Eric Anholt
  2019-02-07 20:10 ` [PATCH 3/4] drm/v3d: Don't change other values in V3D_CTL_MISCCFG Eric Anholt
@ 2019-02-07 20:10 ` Eric Anholt
  2019-02-11 17:36 ` [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Thomas Spurden
  3 siblings, 0 replies; 6+ messages in thread
From: Eric Anholt @ 2019-02-07 20:10 UTC (permalink / raw)
  To: dri-devel; +Cc: linux-kernel, david.emett, thomas.spurden, Eric Anholt

You'll get garbage measurements if the registers always read back
0xdeadbeef

Signed-off-by: Eric Anholt <eric@anholt.net>
---
 drivers/gpu/drm/v3d/v3d_debugfs.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c
index eb2b2d2f8553..a24af2d2f574 100644
--- a/drivers/gpu/drm/v3d/v3d_debugfs.c
+++ b/drivers/gpu/drm/v3d/v3d_debugfs.c
@@ -187,6 +187,11 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
 	uint32_t cycles;
 	int core = 0;
 	int measure_ms = 1000;
+	int ret;
+
+	ret = pm_runtime_get_sync(v3d->dev);
+	if (ret < 0)
+		return ret;
 
 	if (v3d->ver >= 40) {
 		V3D_CORE_WRITE(core, V3D_V4_PCTR_0_SRC_0_3,
@@ -210,6 +215,9 @@ static int v3d_measure_clock(struct seq_file *m, void *unused)
 		   cycles / (measure_ms * 1000),
 		   (cycles / (measure_ms * 100)) % 10);
 
+	pm_runtime_mark_last_busy(v3d->dev);
+	pm_runtime_put_autosuspend(v3d->dev);
+
 	return 0;
 }
 
-- 
2.20.0.rc1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU.
  2019-02-07 20:09 [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Eric Anholt
                   ` (2 preceding siblings ...)
  2019-02-07 20:10 ` [PATCH 4/4] drm/v3d: Make sure the GPU is on when measuring clocks Eric Anholt
@ 2019-02-11 17:36 ` Thomas Spurden
  2019-02-12 20:04   ` Eric Anholt
  3 siblings, 1 reply; 6+ messages in thread
From: Thomas Spurden @ 2019-02-11 17:36 UTC (permalink / raw)
  To: Eric Anholt; +Cc: dri-devel, linux-kernel, Dave Emett

On Thu, 7 Feb 2019 at 20:10, Eric Anholt <eric@anholt.net> wrote:
>
> Signed-off-by: Eric Anholt <eric@anholt.net>

Reviewed-by: Thomas Spurden <thomas.spurden@broadcom.com>

> ---
>  drivers/gpu/drm/v3d/v3d_drv.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c
> index 22fff0d3aecd..1f22ce542a04 100644
> --- a/drivers/gpu/drm/v3d/v3d_drv.c
> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
> @@ -7,9 +7,9 @@
>   * This driver supports the Broadcom V3D 3.3 and 4.1 OpenGL ES GPUs.
>   * For V3D 2.x support, see the VC4 driver.
>   *
> - * Currently only single-core rendering using the binner and renderer
> - * is supported.  The TFU (texture formatting unit) and V3D 4.x's CSD
> - * (compute shader dispatch) are not yet supported.
> + * Currently only single-core rendering using the binner and renderer,
> + * along with TFU (texture formatting unit) rendering is supported.
> + * V3D 4.x's CSD (compute shader dispatch) is not yet supported.
>   */
>
>  #include <linux/clk.h>
> --
> 2.20.0.rc1
>


-- 
Thomas Spurden

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU.
  2019-02-11 17:36 ` [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Thomas Spurden
@ 2019-02-12 20:04   ` Eric Anholt
  0 siblings, 0 replies; 6+ messages in thread
From: Eric Anholt @ 2019-02-12 20:04 UTC (permalink / raw)
  To: Thomas Spurden; +Cc: dri-devel, linux-kernel, Dave Emett

[-- Attachment #1: Type: text/plain, Size: 290 bytes --]

Thomas Spurden <thomas.spurden@broadcom.com> writes:

> On Thu, 7 Feb 2019 at 20:10, Eric Anholt <eric@anholt.net> wrote:
>>
>> Signed-off-by: Eric Anholt <eric@anholt.net>
>
> Reviewed-by: Thomas Spurden <thomas.spurden@broadcom.com>

Merged this one, will send out respins of the others.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 832 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-02-12 20:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-07 20:09 [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Eric Anholt
2019-02-07 20:09 ` [PATCH 2/4] drm/v3d: Add support for V3D v4.2 Eric Anholt
2019-02-07 20:10 ` [PATCH 3/4] drm/v3d: Don't change other values in V3D_CTL_MISCCFG Eric Anholt
2019-02-07 20:10 ` [PATCH 4/4] drm/v3d: Make sure the GPU is on when measuring clocks Eric Anholt
2019-02-11 17:36 ` [PATCH 1/4] drm/v3d: Update top-level kerneldoc for the addition of TFU Thomas Spurden
2019-02-12 20:04   ` Eric Anholt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).