All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gong Qianyu <Qianyu.Gong@nxp.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [Patch V3 2/3] fm: fdt: Move fman ucode fixup to Fman driver code
Date: Mon, 25 Jan 2016 19:37:13 +0800	[thread overview]
Message-ID: <1453721834-7772-2-git-send-email-Qianyu.Gong@nxp.com> (raw)
In-Reply-To: <1453721834-7772-1-git-send-email-Qianyu.Gong@nxp.com>

Both Freescale Layerscape and powerpc/mpc85xx platforms are using
fdt_fixup_fman_firmware() to insert Fman ucode blob into the device
tree. So move the function to driver code.

Signed-off-by: Gong Qianyu <Qianyu.Gong@nxp.com>
---
V3:
 - Remove file changes about "qe.h".
   (Should be put in the first patch of this patchset)
V2:
 - New patch.

 arch/powerpc/cpu/mpc85xx/fdt.c | 125 ++-------------------------------------
 drivers/net/fm/Makefile        |   1 +
 drivers/net/fm/fdt.c           | 129 +++++++++++++++++++++++++++++++++++++++++
 include/fsl_fman.h             |   1 +
 4 files changed, 136 insertions(+), 120 deletions(-)

diff --git a/arch/powerpc/cpu/mpc85xx/fdt.c b/arch/powerpc/cpu/mpc85xx/fdt.c
index 50eef05..ced216c 100644
--- a/arch/powerpc/cpu/mpc85xx/fdt.c
+++ b/arch/powerpc/cpu/mpc85xx/fdt.c
@@ -19,7 +19,9 @@
 #ifdef CONFIG_FSL_ESDHC
 #include <fsl_esdhc.h>
 #endif
-#include <fsl_qe.h>		/* For struct qe_firmware */
+#ifdef CONFIG_SYS_DPAA_FMAN
+#include <fsl_fman.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -488,125 +490,6 @@ static void ft_fixup_qe_snum(void *blob)
 }
 #endif
 
-/**
- * fdt_fixup_fman_firmware -- insert the Fman firmware into the device tree
- *
- * The binding for an Fman firmware node is documented in
- * Documentation/powerpc/dts-bindings/fsl/dpaa/fman.txt.  This node contains
- * the actual Fman firmware binary data.  The operating system is expected to
- * be able to parse the binary data to determine any attributes it needs.
- */
-#ifdef CONFIG_SYS_DPAA_FMAN
-void fdt_fixup_fman_firmware(void *blob)
-{
-	int rc, fmnode, fwnode = -1;
-	uint32_t phandle;
-	struct qe_firmware *fmanfw;
-	const struct qe_header *hdr;
-	unsigned int length;
-	uint32_t crc;
-	const char *p;
-
-	/* The first Fman we find will contain the actual firmware. */
-	fmnode = fdt_node_offset_by_compatible(blob, -1, "fsl,fman");
-	if (fmnode < 0)
-		/* Exit silently if there are no Fman devices */
-		return;
-
-	/* If we already have a firmware node, then also exit silently. */
-	if (fdt_node_offset_by_compatible(blob, -1, "fsl,fman-firmware") > 0)
-		return;
-
-	/* If the environment variable is not set, then exit silently */
-	p = getenv("fman_ucode");
-	if (!p)
-		return;
-
-	fmanfw = (struct qe_firmware *) simple_strtoul(p, NULL, 16);
-	if (!fmanfw)
-		return;
-
-	hdr = &fmanfw->header;
-	length = be32_to_cpu(hdr->length);
-
-	/* Verify the firmware. */
-	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
-		(hdr->magic[2] != 'F')) {
-		printf("Data at %p is not an Fman firmware\n", fmanfw);
-		return;
-	}
-
-	if (length > CONFIG_SYS_QE_FMAN_FW_LENGTH) {
-		printf("Fman firmware at %p is too large (size=%u)\n",
-		       fmanfw, length);
-		return;
-	}
-
-	length -= sizeof(u32);	/* Subtract the size of the CRC */
-	crc = be32_to_cpu(*(u32 *)((void *)fmanfw + length));
-	if (crc != crc32_no_comp(0, (void *)fmanfw, length)) {
-		printf("Fman firmware at %p has invalid CRC\n", fmanfw);
-		return;
-	}
-
-	/* Increase the size of the fdt to make room for the node. */
-	rc = fdt_increase_size(blob, fmanfw->header.length);
-	if (rc < 0) {
-		printf("Unable to make room for Fman firmware: %s\n",
-			fdt_strerror(rc));
-		return;
-	}
-
-	/* Create the firmware node. */
-	fwnode = fdt_add_subnode(blob, fmnode, "fman-firmware");
-	if (fwnode < 0) {
-		char s[64];
-		fdt_get_path(blob, fmnode, s, sizeof(s));
-		printf("Could not add firmware node to %s: %s\n", s,
-		       fdt_strerror(fwnode));
-		return;
-	}
-	rc = fdt_setprop_string(blob, fwnode, "compatible", "fsl,fman-firmware");
-	if (rc < 0) {
-		char s[64];
-		fdt_get_path(blob, fwnode, s, sizeof(s));
-		printf("Could not add compatible property to node %s: %s\n", s,
-		       fdt_strerror(rc));
-		return;
-	}
-	phandle = fdt_create_phandle(blob, fwnode);
-	if (!phandle) {
-		char s[64];
-		fdt_get_path(blob, fwnode, s, sizeof(s));
-		printf("Could not add phandle property to node %s: %s\n", s,
-		       fdt_strerror(rc));
-		return;
-	}
-	rc = fdt_setprop(blob, fwnode, "fsl,firmware", fmanfw, fmanfw->header.length);
-	if (rc < 0) {
-		char s[64];
-		fdt_get_path(blob, fwnode, s, sizeof(s));
-		printf("Could not add firmware property to node %s: %s\n", s,
-		       fdt_strerror(rc));
-		return;
-	}
-
-	/* Find all other Fman nodes and point them to the firmware node. */
-	while ((fmnode = fdt_node_offset_by_compatible(blob, fmnode, "fsl,fman")) > 0) {
-		rc = fdt_setprop_cell(blob, fmnode, "fsl,firmware-phandle", phandle);
-		if (rc < 0) {
-			char s[64];
-			fdt_get_path(blob, fmnode, s, sizeof(s));
-			printf("Could not add pointer property to node %s: %s\n",
-			       s, fdt_strerror(rc));
-			return;
-		}
-	}
-}
-#else
-#define fdt_fixup_fman_firmware(x)
-#endif
-
 #if defined(CONFIG_PPC_P4080)
 static void fdt_fixup_usb(void *fdt)
 {
@@ -752,7 +635,9 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 	ft_fixup_qe_snum(blob);
 #endif
 
+#ifdef CONFIG_SYS_DPAA_FMAN
 	fdt_fixup_fman_firmware(blob);
+#endif
 
 #ifdef CONFIG_SYS_NS16550
 	do_fixup_by_compat_u32(blob, "ns16550",
diff --git a/drivers/net/fm/Makefile b/drivers/net/fm/Makefile
index a3c9f99..493cdc6 100644
--- a/drivers/net/fm/Makefile
+++ b/drivers/net/fm/Makefile
@@ -6,6 +6,7 @@
 
 obj-y += dtsec.o
 obj-y += eth.o
+obj-y += fdt.o
 obj-y += fm.o
 obj-y += init.o
 obj-y += tgec.o
diff --git a/drivers/net/fm/fdt.c b/drivers/net/fm/fdt.c
new file mode 100644
index 0000000..9918d80
--- /dev/null
+++ b/drivers/net/fm/fdt.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2016 Freescale Semiconductor, Inc.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include <asm/io.h>
+#include <fsl_qe.h>	/* For struct qe_firmware */
+
+#ifdef CONFIG_SYS_DPAA_FMAN
+/**
+ * fdt_fixup_fman_firmware -- insert the Fman firmware into the device tree
+ *
+ * The binding for an Fman firmware node is documented in
+ * Documentation/powerpc/dts-bindings/fsl/dpaa/fman.txt.  This node contains
+ * the actual Fman firmware binary data.  The operating system is expected to
+ * be able to parse the binary data to determine any attributes it needs.
+ */
+void fdt_fixup_fman_firmware(void *blob)
+{
+	int rc, fmnode, fwnode = -1;
+	uint32_t phandle;
+	struct qe_firmware *fmanfw;
+	const struct qe_header *hdr;
+	unsigned int length;
+	uint32_t crc;
+	const char *p;
+
+	/* The first Fman we find will contain the actual firmware. */
+	fmnode = fdt_node_offset_by_compatible(blob, -1, "fsl,fman");
+	if (fmnode < 0)
+		/* Exit silently if there are no Fman devices */
+		return;
+
+	/* If we already have a firmware node, then also exit silently. */
+	if (fdt_node_offset_by_compatible(blob, -1, "fsl,fman-firmware") > 0)
+		return;
+
+	/* If the environment variable is not set, then exit silently */
+	p = getenv("fman_ucode");
+	if (!p)
+		return;
+
+	fmanfw = (struct qe_firmware *)simple_strtoul(p, NULL, 16);
+	if (!fmanfw)
+		return;
+
+	hdr = &fmanfw->header;
+	length = fdt32_to_cpu(hdr->length);
+
+	/* Verify the firmware. */
+	if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
+	    (hdr->magic[2] != 'F')) {
+		printf("Data at %p is not an Fman firmware\n", fmanfw);
+		return;
+	}
+
+	if (length > CONFIG_SYS_QE_FMAN_FW_LENGTH) {
+		printf("Fman firmware at %p is too large (size=%u)\n",
+		       fmanfw, length);
+		return;
+	}
+
+	length -= sizeof(u32);	/* Subtract the size of the CRC */
+	crc = fdt32_to_cpu(*(u32 *)((void *)fmanfw + length));
+	if (crc != crc32_no_comp(0, (void *)fmanfw, length)) {
+		printf("Fman firmware at %p has invalid CRC\n", fmanfw);
+		return;
+	}
+
+	length += sizeof(u32);
+
+	/* Increase the size of the fdt to make room for the node. */
+	rc = fdt_increase_size(blob, length);
+	if (rc < 0) {
+		printf("Unable to make room for Fman firmware: %s\n",
+		       fdt_strerror(rc));
+		return;
+	}
+
+	/* Create the firmware node. */
+	fwnode = fdt_add_subnode(blob, fmnode, "fman-firmware");
+	if (fwnode < 0) {
+		char s[64];
+		fdt_get_path(blob, fmnode, s, sizeof(s));
+		printf("Could not add firmware node to %s: %s\n", s,
+		       fdt_strerror(fwnode));
+		return;
+	}
+	rc = fdt_setprop_string(blob, fwnode, "compatible",
+					"fsl,fman-firmware");
+	if (rc < 0) {
+		char s[64];
+		fdt_get_path(blob, fwnode, s, sizeof(s));
+		printf("Could not add compatible property to node %s: %s\n", s,
+		       fdt_strerror(rc));
+		return;
+	}
+	phandle = fdt_create_phandle(blob, fwnode);
+	if (!phandle) {
+		char s[64];
+		fdt_get_path(blob, fwnode, s, sizeof(s));
+		printf("Could not add phandle property to node %s: %s\n", s,
+		       fdt_strerror(rc));
+		return;
+	}
+	rc = fdt_setprop(blob, fwnode, "fsl,firmware", fmanfw, length);
+	if (rc < 0) {
+		char s[64];
+		fdt_get_path(blob, fwnode, s, sizeof(s));
+		printf("Could not add firmware property to node %s: %s\n", s,
+		       fdt_strerror(rc));
+		return;
+	}
+
+	/* Find all other Fman nodes and point them to the firmware node. */
+	while ((fmnode = fdt_node_offset_by_compatible(blob, fmnode,
+		"fsl,fman")) > 0) {
+		rc = fdt_setprop_cell(blob, fmnode, "fsl,firmware-phandle",
+				      phandle);
+		if (rc < 0) {
+			char s[64];
+			fdt_get_path(blob, fmnode, s, sizeof(s));
+			printf("Could not add pointer property to node %s: %s\n",
+			       s, fdt_strerror(rc));
+			return;
+		}
+	}
+}
+#endif
diff --git a/include/fsl_fman.h b/include/fsl_fman.h
index e4b78e9..5fb8fc1 100644
--- a/include/fsl_fman.h
+++ b/include/fsl_fman.h
@@ -462,4 +462,5 @@ typedef struct ccsr_fman {
 	u8			res5[4*1024];
 } ccsr_fman_t;
 
+void fdt_fixup_fman_firmware(void *blob);
 #endif /*__FSL_FMAN_H__*/
-- 
2.1.0.27.g96db324

  reply	other threads:[~2016-01-25 11:37 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-25 11:37 [U-Boot] [Patch V3 1/3] qe: move drivers/qe/qe.h to include/fsl_qe.h Gong Qianyu
2016-01-25 11:37 ` Gong Qianyu [this message]
2016-01-25 17:17   ` [U-Boot] [Patch V3 2/3] fm: fdt: Move fman ucode fixup to Fman driver code Scott Wood
2016-01-26  5:23     ` Qianyu Gong
2016-02-01 16:31       ` york sun
2016-02-08 19:03         ` york sun
2016-02-08 19:18           ` Scott Wood
2016-02-08 19:22             ` york sun
2016-02-08 19:25               ` Scott Wood
2016-02-11 17:39                 ` york sun
2016-02-15  5:44                   ` Qianyu Gong
2016-02-16 21:22                     ` Scott Wood
2016-02-17  4:36                       ` Qianyu Gong
2016-01-25 11:37 ` [U-Boot] [Patch V3 3/3] armv8/fsl-layerscape: fdt: add fixup for Fman ucode Gong Qianyu

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=1453721834-7772-2-git-send-email-Qianyu.Gong@nxp.com \
    --to=qianyu.gong@nxp.com \
    --cc=u-boot@lists.denx.de \
    /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.