Skip to contentSkip to conversation

ARM: dts: tegra20: Add Memory Client reset to VDE

PATCH Applied Dmitry Osipenko 2 participants 7 messages May 20, 2018 – Jul 9, 2018

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/2 ARM: dts: tegra20: Add Memory Client reset to VDE

Hook up Memory Client reset of the Video Decoder to the decoders DT node.

---
 arch/arm/boot/dts/tegra20.dtsi | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
arch/arm/boot/dts/tegra20.dtsi +5 -2
index 983dd5c14794..f9495f12e731 100644
@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 #include <dt-bindings/clock/tegra20-car.h>
 #include <dt-bindings/gpio/tegra-gpio.h>
+#include <dt-bindings/memory/tegra20-mc.h>
 #include <dt-bindings/pinctrl/pinctrl-tegra.h>
 #include <dt-bindings/interrupt-controller/arm-gic.h>
 
@@ -282,7 +283,8 @@
 			     <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; /* SXE interrupt */
 		interrupt-names = "sync-token", "bsev", "sxe";
 		clocks = <&tegra_car TEGRA20_CLK_VDE>;
-		resets = <&tegra_car 61>;
+		reset-names = "vde", "mc";
+		resets = <&tegra_car 61>, <&mc TEGRA20_MC_RESET_VDE>;
 	};
 
 	apbmisc@70000800 {
@@ -593,11 +595,12 @@
 		clock-names = "pclk", "clk32k_in";
 	};
 
-	memory-controller@7000f000 {
+	mc: memory-controller@7000f000 {
 		compatible = "nvidia,tegra20-mc";
 		reg = <0x7000f000 0x024
 		       0x7000f03c 0x3c4>;
 		interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
+		#reset-cells = <1>;
 	};
 
 	iommu@7000f024 {
Signature · 1 line
2.17.0
#1 lore raw

PATCH 1/1 media: staging: tegra-vde: Reset memory client

DMA requests must be blocked before resetting VDE HW, otherwise it is possible to get a memory corruption or a machine hang. Use the reset control provided by the Memory Controller to block DMA before resetting the VDE HW.

---
 drivers/staging/media/tegra-vde/tegra-vde.c | 42 +++++++++++++++++++--
 1 file changed, 38 insertions(+), 4 deletions(-)
drivers/staging/media/tegra-vde/tegra-vde.c +38 -4
index 90177a59b97c..6dd3bf4481be 100644
@@ -73,6 +73,7 @@ struct tegra_vde {
 	struct mutex lock;
 	struct miscdevice miscdev;
 	struct reset_control *rst;
+	struct reset_control *rst_mc;
 	struct gen_pool *iram_pool;
 	struct completion decode_completion;
 	struct clk *clk;
@@ -850,9 +851,23 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
 	 * We rely on the VDE registers reset value, otherwise VDE
 	 * causes bus lockup.
 	 */
+	ret = reset_control_assert(vde->rst_mc);
+	if (ret) {
+		dev_err(dev, "DEC start: Failed to assert MC reset: %d\n",
+			ret);
+		goto put_runtime_pm;
+	}
+
 	ret = reset_control_reset(vde->rst);
 	if (ret) {
-		dev_err(dev, "Failed to reset HW: %d\n", ret);
+		dev_err(dev, "DEC start: Failed to reset HW: %d\n", ret);
+		goto put_runtime_pm;
+	}
+
+	ret = reset_control_deassert(vde->rst_mc);
+	if (ret) {
+		dev_err(dev, "DEC start: Failed to deassert MC reset: %d\n",
+			ret);
 		goto put_runtime_pm;
 	}
 
@@ -880,9 +895,21 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
 		ret = timeout;
 	}
 
-	err = reset_control_assert(vde->rst);
-	if (err)
-		dev_err(dev, "Failed to assert HW reset: %d\n", err);
+	/*
+	 * At first reset memory client to avoid resetting VDE HW in the
+	 * middle of DMA which could result into memory corruption or hang
+	 * the whole system.
+	 */
+	err = reset_control_assert(vde->rst_mc);
+	if (!err) {
+		err = reset_control_assert(vde->rst);
+		if (err)
+			dev_err(dev,
+				"DEC end: Failed to assert HW reset: %d\n",
+				err);
+	} else {
+		dev_err(dev, "DEC end: Failed to assert MC reset: %d\n", err);
+	}
 
 put_runtime_pm:
 	pm_runtime_mark_last_busy(dev);
@@ -1074,6 +1101,13 @@ static int tegra_vde_probe(struct platform_device *pdev)
 		return err;
 	}
 
+	vde->rst_mc = devm_reset_control_get_optional(dev, "mc");
+	if (IS_ERR(vde->rst_mc)) {
+		err = PTR_ERR(vde->rst_mc);
+		dev_err(dev, "Could not get MC reset %d\n", err);
+		return err;
+	}
+
 	irq = platform_get_irq_byname(pdev, "sync-token");
 	if (irq < 0)
 		return irq;
Signature · 1 line
2.17.0
#2 lore raw

Re: [PATCH v1] media: staging: tegra-vde: Reset memory client

Quoted 51 lines · Dmitry Osipenko

DMA requests must be blocked before resetting VDE HW, otherwise it is possible to get a memory corruption or a machine hang. Use the reset control provided by the Memory Controller to block DMA before resetting the VDE HW.

---
 drivers/staging/media/tegra-vde/tegra-vde.c | 42 +++++++++++++++++++--
 1 file changed, 38 insertions(+), 4 deletions(-)
drivers/staging/media/tegra-vde/tegra-vde.c +16 -1
index 90177a59b97c..6dd3bf4481be 100644
@@ -73,6 +73,7 @@ struct tegra_vde {
 	struct mutex lock;
 	struct miscdevice miscdev;
 	struct reset_control *rst;
+	struct reset_control *rst_mc;
 	struct gen_pool *iram_pool;
 	struct completion decode_completion;
 	struct clk *clk;
@@ -850,9 +851,23 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
 	 * We rely on the VDE registers reset value, otherwise VDE
 	 * causes bus lockup.
 	 */
+	ret = reset_control_assert(vde->rst_mc);
+	if (ret) {
+		dev_err(dev, "DEC start: Failed to assert MC reset: %d\n",
+			ret);
+		goto put_runtime_pm;
+	}
+
 	ret = reset_control_reset(vde->rst);
 	if (ret) {
-		dev_err(dev, "Failed to reset HW: %d\n", ret);
+		dev_err(dev, "DEC start: Failed to reset HW: %d\n", ret);
+		goto put_runtime_pm;
+	}
+
+	ret = reset_control_deassert(vde->rst_mc);
+	if (ret) {
+		dev_err(dev, "DEC start: Failed to deassert MC reset: %d\n",
+			ret);
 		goto put_runtime_pm;
 	}
 
@@ -880,9 +895,21 @@ static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde,
 		ret = timeout;
 	}
 

drivers/staging/media/tegra-vde/tegra-vde.c static int tegra_vde_ioctl_decode_h264(struct tegra_vde *vde, · line 904

Quoted 10 lines
drivers/staging/media/tegra-vde/tegra-vde.c +7 -3
-	err = reset_control_assert(vde->rst);
-	if (err)
-		dev_err(dev, "Failed to assert HW reset: %d\n", err);
+	/*
+	 * At first reset memory client to avoid resetting VDE HW in the
+	 * middle of DMA which could result into memory corruption or hang
+	 * the whole system.
+	 */
+	err = reset_control_assert(vde->rst_mc);
+	if (!err) {

It occurred to me that there is no need to skip the HW reset if MC resetting fails. I'll make V2 to change that.

Quoted 26 lines
drivers/staging/media/tegra-vde/tegra-vde.c +15 -0
+		err = reset_control_assert(vde->rst);
+		if (err)
+			dev_err(dev,
+				"DEC end: Failed to assert HW reset: %d\n",
+				err);
+	} else {
+		dev_err(dev, "DEC end: Failed to assert MC reset: %d\n", err);
+	}
 
 put_runtime_pm:
 	pm_runtime_mark_last_busy(dev);
@@ -1074,6 +1101,13 @@ static int tegra_vde_probe(struct platform_device *pdev)
 		return err;
 	}
 
+	vde->rst_mc = devm_reset_control_get_optional(dev, "mc");
+	if (IS_ERR(vde->rst_mc)) {
+		err = PTR_ERR(vde->rst_mc);
+		dev_err(dev, "Could not get MC reset %d\n", err);
+		return err;
+	}
+
 	irq = platform_get_irq_byname(pdev, "sync-token");
 	if (irq < 0)
 		return irq;
#3 lore raw

PATCH 2/2 ARM: dts: tegra30: Add Memory Client reset to VDE

In reply to Dmitry Osipenko

Hook up Memory Client reset of the Video Decoder to the decoders DT node.

---
 arch/arm/boot/dts/tegra30.dtsi | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/boot/dts/tegra30.dtsi +3 -1
index 09087b9c5e26..3300ff976053 100644
@@ -404,7 +404,8 @@
 			     <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>; /* SXE interrupt */
 		interrupt-names = "sync-token", "bsev", "sxe";
 		clocks = <&tegra_car TEGRA30_CLK_VDE>;
-		resets = <&tegra_car 61>;
+		reset-names = "vde", "mc";
+		resets = <&tegra_car 61>, <&mc TEGRA30_MC_RESET_VDE>;
 	};
 
 	apbmisc@70000800 {
@@ -712,6 +713,7 @@
 		interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
 
 		#iommu-cells = <1>;
+		#reset-cells = <1>;
 	};
 
 	fuse@7000f800 {
Signature · 1 line
2.17.0
#4 lore raw

Re: [PATCH v1 2/2] ARM: dts: tegra30: Add Memory Client reset to VDE

Quoted 6 lines · Dmitry Osipenko

Hook up Memory Client reset of the Video Decoder to the decoders DT node.

---
 arch/arm/boot/dts/tegra30.dtsi | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Applied, thanks.

Thierry

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

#6 lore raw
In reply to Dmitry Osipenko
Quoted 6 lines · Dmitry Osipenko

Hook up Memory Client reset of the Video Decoder to the decoders DT node.

---
 arch/arm/boot/dts/tegra20.dtsi | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Applied, thanks.

Thierry

_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel