Skip to contentSkip to conversation

memory: brcmstb: dpfe: skip downloading firmware

PATCH In review Markus Mayer 2 participants 4 messages Oct 2, 2017 – Oct 6, 2017

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

cover memory: brcmstb: dpfe: skip downloading firmware

From: Markus Mayer <[email protected]>

This series lets the DPFE driver skip the DPFE firmware download if the DCPU is already running. If it's running by the time Linux comes up, it means the boot loader already downloaded the DPFE firmware.

Markus Mayer (2):
memory: brcmstb: dpfe: introduce is_dcpu_enabled()
memory: brcmstb: dpfe: skip downloading firmware when possible

 drivers/memory/brcmstb_dpfe.c | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)
Signature · 1 line
2.7.4
#1 lore raw

PATCH 1/2 memory: brcmstb: dpfe: introduce is_dcpu_enabled()

From: Markus Mayer <[email protected]>

In order to check whether or not the DCPU is running, we introduce a function called is_dcpu_enabled().

---
 drivers/memory/brcmstb_dpfe.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)
drivers/memory/brcmstb_dpfe.c +15 -6
index 21242c4..3516ee8 100644
@@ -202,17 +202,26 @@ static const u32 dpfe_commands[DPFE_CMD_MAX][MSG_FIELD_MAX] = {
 	},
 };
 
+static bool is_dcpu_enabled(void __iomem *regs)
+{
+	u32 val;
+
+	val = readl_relaxed(regs + REG_DCPU_RESET);
+
+	return !(val & DCPU_RESET_MASK);
+}
+
 static void __disable_dcpu(void __iomem *regs)
 {
 	u32 val;
 
-	/* Check if DCPU is running */
+	if (!is_dcpu_enabled(regs))
+		return;
+
+	/* Put DCPU in reset if it's running. */
 	val = readl_relaxed(regs + REG_DCPU_RESET);
-	if (!(val & DCPU_RESET_MASK)) {
-		/* Put DCPU in reset */
-		val |= (1 << DCPU_RESET_SHIFT);
-		writel_relaxed(val, regs + REG_DCPU_RESET);
-	}
+	val |= (1 << DCPU_RESET_SHIFT);
+	writel_relaxed(val, regs + REG_DCPU_RESET);
 }
 
 static void __enable_dcpu(void __iomem *regs)
Signature · 1 line
2.7.4
#2 lore raw

PATCH 2/2 memory: brcmstb: dpfe: skip downloading firmware when possible

In reply to Markus Mayer

From: Markus Mayer <[email protected]>

We want to skip downloading the DPFE firmware from Linux if it was already downloaded by the boot loader.

The driver now checks if the DCPU is already running and, if so, whether it can process commands. If the DCPU processes commands successfully, the driver skips the firmware download step.

---
 drivers/memory/brcmstb_dpfe.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/memory/brcmstb_dpfe.c +14 -2
index 3516ee8..0a7bdbe 100644
@@ -431,13 +431,25 @@ static int brcmstb_dpfe_download_firmware(struct platform_device *pdev,
 	const void *fw_blob;
 	int ret;
 
+	priv = platform_get_drvdata(pdev);
+
+	/*
+	 * Skip downloading the firmware if the DCPU is already running and
+	 * responding to commands.
+	 */
+	if (is_dcpu_enabled(priv->regs)) {
+		u32 response[MSG_FIELD_MAX];
+
+		ret = __send_command(priv, DPFE_CMD_GET_INFO, response);
+		if (!ret)
+			return 0;
+	}
+
 	ret = request_firmware(&fw, FIRMWARE_NAME, dev);
 	/* request_firmware() prints its own error messages. */
 	if (ret)
 		return ret;
 
-	priv = platform_get_drvdata(pdev);
-
 	ret = __verify_firmware(init, fw);
 	if (ret)
 		return -EFAULT;
Signature · 1 line
2.7.4
#3 lore raw
In reply to Markus Mayer
Quoted 5 lines · Markus Mayer

From: Markus Mayer <[email protected]>

This series lets the DPFE driver skip the DPFE firmware download if the DCPU is already running. If it's running by the time Linux comes up, it means the boot loader already downloaded the DPFE firmware.

Series applied to drivers/next thanks Markus.

Signature · 2 lines
-- 
Florian