SUPERH platform development
 help / color / mirror / Atom feed
From: Magnus Damm <magnus.damm@gmail.com>
To: linux-sh@vger.kernel.org
Subject: [PATCH] Gen2 IPMMU and DU prototype
Date: Wed, 30 Sep 2015 14:22:42 +0000	[thread overview]
Message-ID: <20150930142242.25755.81946.sendpatchset@little-apple> (raw)

From: Magnus Damm <damm+renesas@opensource.se>

Here is a simple hack to enable the IPMMU on R-Car Gen2.

The VGA port on r8a7790 Lager may be driven by the DU
and the IPMMU via the modetest utility to output some
test image.

Actually the r8a7790 DU device is connected to the
IPMMU using two separate uTLBs, but the DU driver
is currently supporting all DU instances using a
single device. To make testing easily the r8a7790 DU
driver code is with this patch hacked to just cover
a single DU instance with a single IPMMU uTLB.

The map/umap debug printk() will show you if the IPMMU
is used or not. Another way could be to XOR the physical
address in the map routine to adjust the test image.

Several sources have told me that the DU on Lager is not
working as expected. With this hack (with or without IPMMU)
at least the VGA output seems fine. So it would be good
to look into HDMI and LVDS as well as unmodified VGA
support for the DU on the Lager board.

Also, we need to figure out how to modify the DU driver
to support multiple uTLBs.

Not for upstream merge.

Not-Yet-Signed-off-by: Magnus Damm <damm+renesas@opensource.se>
---

 arch/arm/boot/dts/r8a7790.dtsi        |    3 ++-
 arch/arm/boot/dts/r8a7791.dtsi        |    3 ++-
 arch/arm/mm/dma-mapping.c             |    4 ++--
 drivers/gpu/drm/rcar-du/rcar_du_drv.c |    6 +++---
 drivers/iommu/ipmmu-vmsa.c            |    8 ++++++--
 drivers/of/device.c                   |    6 +++---
 6 files changed, 18 insertions(+), 12 deletions(-)

--- 0001/arch/arm/boot/dts/r8a7790.dtsi
+++ work/arch/arm/boot/dts/r8a7790.dtsi	2015-09-29 15:04:37.540513000 +0900
@@ -882,6 +882,7 @@
 			 <&mstp7_clks R8A7790_CLK_LVDS0>,
 			 <&mstp7_clks R8A7790_CLK_LVDS1>;
 		clock-names = "du.0", "du.1", "du.2", "lvds.0", "lvds.1";
+		iommus = <&ipmmu_mx 15>;
 		status = "disabled";
 
 		ports {
@@ -1805,7 +1806,7 @@
 		interrupts = <0 222 IRQ_TYPE_LEVEL_HIGH>,
 			     <0 221 IRQ_TYPE_LEVEL_HIGH>;
 		#iommu-cells = <1>;
-		status = "disabled";
+		status = "okay";
 	};
 
 	ipmmu_rt: mmu@ffc80000 {
--- 0001/arch/arm/boot/dts/r8a7791.dtsi
+++ work/arch/arm/boot/dts/r8a7791.dtsi	2015-09-29 14:15:26.610513000 +0900
@@ -919,6 +919,7 @@
 			 <&mstp7_clks R8A7791_CLK_DU1>,
 			 <&mstp7_clks R8A7791_CLK_LVDS0>;
 		clock-names = "du.0", "du.1", "lvds.0";
+		iommus = <&ipmmu_mx 15>;
 		status = "disabled";
 
 		ports {
@@ -1618,7 +1619,7 @@
 		interrupts = <0 222 IRQ_TYPE_LEVEL_HIGH>,
 			     <0 221 IRQ_TYPE_LEVEL_HIGH>;
 		#iommu-cells = <1>;
-		status = "disabled";
+		status = "okay";
 	};
 
 	ipmmu_rt: mmu@ffc80000 {
--- 0001/arch/arm/mm/dma-mapping.c
+++ work/arch/arm/mm/dma-mapping.c	2015-09-29 14:58:51.150513000 +0900
@@ -1998,7 +1998,7 @@ static int __arm_iommu_attach_device(str
 	kref_get(&mapping->kref);
 	to_dma_iommu_mapping(dev) = mapping;
 
-	pr_debug("Attached IOMMU controller to %s device.\n", dev_name(dev));
+	pr_info("Attached IOMMU controller to %s device.\n", dev_name(dev));
 	return 0;
 }
 
@@ -2043,7 +2043,7 @@ static void __arm_iommu_detach_device(st
 	kref_put(&mapping->kref, release_iommu_mapping);
 	to_dma_iommu_mapping(dev) = NULL;
 
-	pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
+	pr_info("Detached IOMMU controller from %s device.\n", dev_name(dev));
 }
 
 /**
--- 0001/drivers/gpu/drm/rcar-du/rcar_du_drv.c
+++ work/drivers/gpu/drm/rcar-du/rcar_du_drv.c	2015-09-29 15:05:31.520513000 +0900
@@ -60,13 +60,13 @@ static const struct rcar_du_device_info
 	.features = RCAR_DU_FEATURE_CRTC_IRQ_CLOCK
 		  | RCAR_DU_FEATURE_EXT_CTRL_REGS,
 	.quirks = RCAR_DU_QUIRK_ALIGN_128B | RCAR_DU_QUIRK_LVDS_LANES,
-	.num_crtcs = 3,
+	.num_crtcs = 2,
 	.routes = {
 		/* R8A7790 has one RGB output, two LVDS outputs and one
 		 * (currently unsupported) TCON output.
 		 */
 		[RCAR_DU_OUTPUT_DPAD0] = {
-			.possible_crtcs = BIT(2) | BIT(1) | BIT(0),
+			.possible_crtcs = BIT(1) | BIT(0),
 			.encoder_type = DRM_MODE_ENCODER_NONE,
 			.port = 0,
 		},
@@ -76,7 +76,7 @@ static const struct rcar_du_device_info
 			.port = 1,
 		},
 		[RCAR_DU_OUTPUT_LVDS1] = {
-			.possible_crtcs = BIT(2) | BIT(1),
+			.possible_crtcs = BIT(1),
 			.encoder_type = DRM_MODE_ENCODER_LVDS,
 			.port = 2,
 		},
--- 0001/drivers/iommu/ipmmu-vmsa.c
+++ work/drivers/iommu/ipmmu-vmsa.c	2015-09-29 15:12:31.610513000 +0900
@@ -7,7 +7,7 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; version 2 of the License.
  */
-
+#define DEBUG
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
 #include <linux/err.h>
@@ -544,9 +544,11 @@ static int ipmmu_map(struct iommu_domain
 {
 	struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
 
+	printk("xxx map 0x%08lx <-> %pad %zu\n", iova, &paddr, size);
+
 	if (!domain)
 		return -ENODEV;
-
+	
 	return domain->iop->map(domain->iop, iova, paddr, size, prot);
 }
 
@@ -555,6 +557,8 @@ static size_t ipmmu_unmap(struct iommu_d
 {
 	struct ipmmu_vmsa_domain *domain = to_vmsa_domain(io_domain);
 
+	printk("xxx unmap 0x%08lx %zu\n", iova, size);
+
 	return domain->iop->unmap(domain->iop, iova, size);
 }
 
--- 0001/drivers/of/device.c
+++ work/drivers/of/device.c	2015-09-29 15:00:10.680513000 +0900
@@ -124,7 +124,7 @@ void of_dma_configure(struct device *dev
 			dev_err(dev, "Adjusted size 0x%llx invalid\n", size);
 			return;
 		}
-		dev_dbg(dev, "dma_pfn_offset(%#08lx)\n", offset);
+		dev_info(dev, "dma_pfn_offset(%#08lx)\n", offset);
 	}
 
 	dev->dma_pfn_offset = offset;
@@ -139,11 +139,11 @@ void of_dma_configure(struct device *dev
 			     DMA_BIT_MASK(ilog2(dma_addr + size)));
 
 	coherent = of_dma_is_coherent(np);
-	dev_dbg(dev, "device is%sdma coherent\n",
+	dev_info(dev, "device is%sdma coherent\n",
 		coherent ? " " : " not ");
 
 	iommu = of_iommu_configure(dev, np);
-	dev_dbg(dev, "device is%sbehind an iommu\n",
+	dev_info(dev, "device is%sbehind an iommu\n",
 		iommu ? " " : " not ");
 
 	arch_setup_dma_ops(dev, dma_addr, size, iommu, coherent);

             reply	other threads:[~2015-09-30 14:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-30 14:22 Magnus Damm [this message]
2015-10-01 14:30 ` [PATCH] Gen2 IPMMU and DU prototype Laurent Pinchart
2015-10-02  3:12 ` Magnus Damm
2015-10-02  8:13 ` Laurent Pinchart

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=20150930142242.25755.81946.sendpatchset@little-apple \
    --to=magnus.damm@gmail.com \
    --cc=linux-sh@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox