brcm63xx: rename target to bcm63xx
[openwrt/staging/mkresin.git] / target / linux / brcm63xx / patches-4.19 / 121-mtd-bcm63xxpart-move-imagetag-parsing-to-its-own-par.patch
diff --git a/target/linux/brcm63xx/patches-4.19/121-mtd-bcm63xxpart-move-imagetag-parsing-to-its-own-par.patch b/target/linux/brcm63xx/patches-4.19/121-mtd-bcm63xxpart-move-imagetag-parsing-to-its-own-par.patch
deleted file mode 100644 (file)
index 6fd5cbb..0000000
+++ /dev/null
@@ -1,482 +0,0 @@
-From a2b8c7f648e168573905818dbb4cb90ca3957c65 Mon Sep 17 00:00:00 2001
-From: Jonas Gorski <jonas.gorski@gmail.com>
-Date: Wed, 28 Jun 2017 18:29:43 +0200
-Subject: [PATCH] mtd: bcm63xxpart: move imagetag parsing to its own parser
-
-Move the bcm963xx Image Tag parsing into its own partition parser. This
-Allows reusing the parser with different full flash parsers.
-
-While moving it, rename it to bcm963* to better reflect it isn't chip
-but board specific.
-
-Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
----
-I tried to keep the code as-is, to keep the changes as small as
-possible.
-
-One side effect is that the partitions get renumbered, which means any
-root=/dev/mtdblock* will now point to the wrong mtd device. But since
-bcm963xx boards will require these hardcoded in the kernel commandline
-anyway this should b a non issue, as it can be easily updated.
-
-There is no such thing in the mips/bcm63xx defconfig, so nothing to update
-there.
-
- drivers/mtd/Kconfig                   |   1 +
- drivers/mtd/bcm63xxpart.c             | 155 ++----------------------
- drivers/mtd/parsers/Kconfig           |  11 ++
- drivers/mtd/parsers/Makefile          |   1 +
- drivers/mtd/parsers/parser_imagetag.c | 214 ++++++++++++++++++++++++++++++++++
- 5 files changed, 235 insertions(+), 147 deletions(-)
- create mode 100644 drivers/mtd/parsers/parser_imagetag.c
-
---- a/drivers/mtd/Kconfig
-+++ b/drivers/mtd/Kconfig
-@@ -162,6 +162,7 @@ config MTD_BCM63XX_PARTS
-       tristate "BCM63XX CFE partitioning support"
-       depends on BCM63XX || BMIPS_GENERIC || COMPILE_TEST
-       select CRC32
-+      select MTD_PARSER_IMAGETAG
-       help
-         This provides partions parsing for BCM63xx devices with CFE
-         bootloaders.
---- a/drivers/mtd/bcm63xxpart.c
-+++ b/drivers/mtd/bcm63xxpart.c
-@@ -93,51 +93,19 @@ static int bcm63xx_read_nvram(struct mtd
-       return 0;
- }
--static int bcm63xx_read_image_tag(struct mtd_info *master, const char *name,
--      loff_t tag_offset, struct bcm_tag *buf)
--{
--      int ret;
--      size_t retlen;
--      u32 computed_crc;
--
--      ret = mtd_read(master, tag_offset, sizeof(*buf), &retlen, (void *)buf);
--      if (ret)
--              return ret;
--
--      if (retlen != sizeof(*buf))
--              return -EIO;
--
--      computed_crc = crc32_le(IMAGETAG_CRC_START, (u8 *)buf,
--                              offsetof(struct bcm_tag, header_crc));
--      if (computed_crc == buf->header_crc) {
--              STR_NULL_TERMINATE(buf->board_id);
--              STR_NULL_TERMINATE(buf->tag_version);
--
--              pr_info("%s: CFE image tag found at 0x%llx with version %s, board type %s\n",
--                      name, tag_offset, buf->tag_version, buf->board_id);
--
--              return 0;
--      }
--
--      pr_warn("%s: CFE image tag at 0x%llx CRC invalid (expected %08x, actual %08x)\n",
--              name, tag_offset, buf->header_crc, computed_crc);
--      return 1;
--}
-+static const char * const bcm63xx_cfe_part_types[] = {
-+      "bcm963xx-imagetag",
-+      NULL,
-+};
- static int bcm63xx_parse_cfe_nor_partitions(struct mtd_info *master,
-       const struct mtd_partition **pparts, struct bcm963xx_nvram *nvram)
- {
--      /* CFE, NVRAM and global Linux are always present */
--      int nrparts = 3, curpart = 0;
--      struct bcm_tag *buf = NULL;
-       struct mtd_partition *parts;
--      int ret;
--      unsigned int rootfsaddr, kerneladdr, spareaddr;
--      unsigned int rootfslen, kernellen, sparelen, totallen;
-+      int nrparts = 3, curpart = 0;
-       unsigned int cfelen, nvramlen;
-       unsigned int cfe_erasesize;
-       int i;
--      bool rootfs_first = false;
-       cfe_erasesize = max_t(uint32_t, master->erasesize,
-                             BCM963XX_CFE_BLOCK_SIZE);
-@@ -146,83 +114,9 @@ static int bcm63xx_parse_cfe_nor_partiti
-       nvramlen = nvram->psi_size * SZ_1K;
-       nvramlen = roundup(nvramlen, cfe_erasesize);
--      buf = vmalloc(sizeof(struct bcm_tag));
--      if (!buf)
--              return -ENOMEM;
--
--      /* Get the tag */
--      ret = bcm63xx_read_image_tag(master, "rootfs", cfelen, buf);
--      if (!ret) {
--              STR_NULL_TERMINATE(buf->flash_image_start);
--              if (kstrtouint(buf->flash_image_start, 10, &rootfsaddr) ||
--                              rootfsaddr < BCM963XX_EXTENDED_SIZE) {
--                      pr_err("invalid rootfs address: %*ph\n",
--                              (int)sizeof(buf->flash_image_start),
--                              buf->flash_image_start);
--                      goto invalid_tag;
--              }
--
--              STR_NULL_TERMINATE(buf->kernel_address);
--              if (kstrtouint(buf->kernel_address, 10, &kerneladdr) ||
--                              kerneladdr < BCM963XX_EXTENDED_SIZE) {
--                      pr_err("invalid kernel address: %*ph\n",
--                              (int)sizeof(buf->kernel_address),
--                              buf->kernel_address);
--                      goto invalid_tag;
--              }
--
--              STR_NULL_TERMINATE(buf->kernel_length);
--              if (kstrtouint(buf->kernel_length, 10, &kernellen)) {
--                      pr_err("invalid kernel length: %*ph\n",
--                              (int)sizeof(buf->kernel_length),
--                              buf->kernel_length);
--                      goto invalid_tag;
--              }
--
--              STR_NULL_TERMINATE(buf->total_length);
--              if (kstrtouint(buf->total_length, 10, &totallen)) {
--                      pr_err("invalid total length: %*ph\n",
--                              (int)sizeof(buf->total_length),
--                              buf->total_length);
--                      goto invalid_tag;
--              }
--
--              kerneladdr = kerneladdr - BCM963XX_EXTENDED_SIZE;
--              rootfsaddr = rootfsaddr - BCM963XX_EXTENDED_SIZE;
--              spareaddr = roundup(totallen, master->erasesize) + cfelen;
--
--              if (rootfsaddr < kerneladdr) {
--                      /* default Broadcom layout */
--                      rootfslen = kerneladdr - rootfsaddr;
--                      rootfs_first = true;
--              } else {
--                      /* OpenWrt layout */
--                      rootfsaddr = kerneladdr + kernellen;
--                      rootfslen = spareaddr - rootfsaddr;
--              }
--      } else if (ret > 0) {
--invalid_tag:
--              kernellen = 0;
--              rootfslen = 0;
--              rootfsaddr = 0;
--              spareaddr = cfelen;
--      } else {
--              goto out;
--      }
--      sparelen = master->size - spareaddr - nvramlen;
--
--      /* Determine number of partitions */
--      if (rootfslen > 0)
--              nrparts++;
--
--      if (kernellen > 0)
--              nrparts++;
--
-       parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
--      if (!parts) {
--              ret = -ENOMEM;
--              goto out;
--      }
-+      if (!parts)
-+              return -ENOMEM;
-       /* Start building partition list */
-       parts[curpart].name = "CFE";
-@@ -230,30 +124,6 @@ invalid_tag:
-       parts[curpart].size = cfelen;
-       curpart++;
--      if (kernellen > 0) {
--              int kernelpart = curpart;
--
--              if (rootfslen > 0 && rootfs_first)
--                      kernelpart++;
--              parts[kernelpart].name = "kernel";
--              parts[kernelpart].offset = kerneladdr;
--              parts[kernelpart].size = kernellen;
--              curpart++;
--      }
--
--      if (rootfslen > 0) {
--              int rootfspart = curpart;
--
--              if (kernellen > 0 && rootfs_first)
--                      rootfspart--;
--              parts[rootfspart].name = "rootfs";
--              parts[rootfspart].offset = rootfsaddr;
--              parts[rootfspart].size = rootfslen;
--              if (sparelen > 0  && !rootfs_first)
--                      parts[rootfspart].size += sparelen;
--              curpart++;
--      }
--
-       parts[curpart].name = "nvram";
-       parts[curpart].offset = master->size - nvramlen;
-       parts[curpart].size = nvramlen;
-@@ -263,22 +133,13 @@ invalid_tag:
-       parts[curpart].name = "linux";
-       parts[curpart].offset = cfelen;
-       parts[curpart].size = master->size - cfelen - nvramlen;
-+      parts[curpart].types = bcm63xx_cfe_part_types;
-       for (i = 0; i < nrparts; i++)
-               pr_info("Partition %d is %s offset %llx and length %llx\n", i,
-                       parts[i].name, parts[i].offset, parts[i].size);
--      pr_info("Spare partition is offset %x and length %x\n", spareaddr,
--              sparelen);
--
-       *pparts = parts;
--      ret = 0;
--
--out:
--      vfree(buf);
--
--      if (ret)
--              return ret;
-       return nrparts;
- }
---- a/drivers/mtd/parsers/Kconfig
-+++ b/drivers/mtd/parsers/Kconfig
-@@ -1,3 +1,14 @@
-+config MTD_PARSER_IMAGETAG
-+      tristate "Parser for BCM963XX Image Tag format partitions"
-+      depends on BCM63XX || BMIPS || COMPILE_TEST
-+      select CRC32
-+      help
-+        Image Tag is the firmware header used by broadcom on their xDSL line
-+        of devices. It is used to describe the offsets and lengths of kernel
-+        and rootfs partitions.
-+        This driver adds support for parsing a partition with an Image Tag
-+        header and creates up to two partitions, kernel and rootfs.
-+
- config MTD_PARSER_TRX
-       tristate "Parser for TRX format partitions"
-       depends on MTD && (BCM47XX || ARCH_BCM_5301X || COMPILE_TEST)
---- a/drivers/mtd/parsers/Makefile
-+++ b/drivers/mtd/parsers/Makefile
-@@ -1,2 +1,3 @@
-+obj-$(CONFIG_MTD_PARSER_IMAGETAG)     += parser_imagetag.o
- obj-$(CONFIG_MTD_PARSER_TRX)          += parser_trx.o
- obj-$(CONFIG_MTD_SHARPSL_PARTS)               += sharpslpart.o
---- /dev/null
-+++ b/drivers/mtd/parsers/parser_imagetag.c
-@@ -0,0 +1,214 @@
-+/*
-+ * BCM63XX CFE image tag parser
-+ *
-+ * Copyright © 2006-2008  Florian Fainelli <florian@openwrt.org>
-+ *                      Mike Albon <malbon@openwrt.org>
-+ * Copyright © 2009-2010  Daniel Dickinson <openwrt@cshore.neomailbox.net>
-+ * Copyright © 2011-2013  Jonas Gorski <jonas.gorski@gmail.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ */
-+
-+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-+
-+#include <linux/bcm963xx_tag.h>
-+#include <linux/crc32.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sizes.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/partitions.h>
-+
-+/* Ensure strings read from flash structs are null terminated */
-+#define STR_NULL_TERMINATE(x) \
-+      do { char *_str = (x); _str[sizeof(x) - 1] = 0; } while (0)
-+
-+static int bcm963xx_read_imagetag(struct mtd_info *master, const char *name,
-+      loff_t tag_offset, struct bcm_tag *buf)
-+{
-+      int ret;
-+      size_t retlen;
-+      u32 computed_crc;
-+
-+      ret = mtd_read(master, tag_offset, sizeof(*buf), &retlen, (void *)buf);
-+      if (ret)
-+              return ret;
-+
-+      if (retlen != sizeof(*buf))
-+              return -EIO;
-+
-+      computed_crc = crc32_le(IMAGETAG_CRC_START, (u8 *)buf,
-+                              offsetof(struct bcm_tag, header_crc));
-+      if (computed_crc == buf->header_crc) {
-+              STR_NULL_TERMINATE(buf->board_id);
-+              STR_NULL_TERMINATE(buf->tag_version);
-+
-+              pr_info("%s: CFE image tag found at 0x%llx with version %s, board type %s\n",
-+                      name, tag_offset, buf->tag_version, buf->board_id);
-+
-+              return 0;
-+      }
-+
-+      pr_warn("%s: CFE image tag at 0x%llx CRC invalid (expected %08x, actual %08x)\n",
-+              name, tag_offset, buf->header_crc, computed_crc);
-+      return -EINVAL;
-+}
-+
-+static int bcm963xx_parse_imagetag_partitions(struct mtd_info *master,
-+                                      const struct mtd_partition **pparts,
-+                                      struct mtd_part_parser_data *data)
-+{
-+      /* CFE, NVRAM and global Linux are always present */
-+      int nrparts = 0, curpart = 0;
-+      struct bcm_tag *buf = NULL;
-+      struct mtd_partition *parts;
-+      int ret;
-+      unsigned int rootfsaddr, kerneladdr, spareaddr, offset;
-+      unsigned int rootfslen, kernellen, sparelen, totallen;
-+      int i;
-+      bool rootfs_first = false;
-+
-+      buf = vmalloc(sizeof(struct bcm_tag));
-+      if (!buf)
-+              return -ENOMEM;
-+
-+      /* Get the tag */
-+      ret = bcm963xx_read_imagetag(master, "rootfs", 0, buf);
-+      if (!ret) {
-+              STR_NULL_TERMINATE(buf->flash_image_start);
-+              if (kstrtouint(buf->flash_image_start, 10, &rootfsaddr) ||
-+                              rootfsaddr < BCM963XX_EXTENDED_SIZE) {
-+                      pr_err("invalid rootfs address: %*ph\n",
-+                              (int)sizeof(buf->flash_image_start),
-+                              buf->flash_image_start);
-+                      goto out;
-+              }
-+
-+              STR_NULL_TERMINATE(buf->kernel_address);
-+              if (kstrtouint(buf->kernel_address, 10, &kerneladdr) ||
-+                              kerneladdr < BCM963XX_EXTENDED_SIZE) {
-+                      pr_err("invalid kernel address: %*ph\n",
-+                              (int)sizeof(buf->kernel_address),
-+                              buf->kernel_address);
-+                      goto out;
-+              }
-+
-+              STR_NULL_TERMINATE(buf->kernel_length);
-+              if (kstrtouint(buf->kernel_length, 10, &kernellen)) {
-+                      pr_err("invalid kernel length: %*ph\n",
-+                              (int)sizeof(buf->kernel_length),
-+                              buf->kernel_length);
-+                      goto out;
-+              }
-+
-+              STR_NULL_TERMINATE(buf->total_length);
-+              if (kstrtouint(buf->total_length, 10, &totallen)) {
-+                      pr_err("invalid total length: %*ph\n",
-+                              (int)sizeof(buf->total_length),
-+                              buf->total_length);
-+                      goto out;
-+              }
-+
-+              /*
-+               * Addresses are flash absolute, so convert to partition
-+               * relative addresses. Assume either kernel or rootfs will
-+               * directly follow the image tag.
-+               */
-+              if (rootfsaddr < kerneladdr)
-+                      offset = rootfsaddr - sizeof(struct bcm_tag);
-+              else
-+                      offset = kerneladdr - sizeof(struct bcm_tag);
-+
-+              kerneladdr = kerneladdr - offset;
-+              rootfsaddr = rootfsaddr - offset;
-+              spareaddr = roundup(totallen, master->erasesize);
-+
-+              if (rootfsaddr < kerneladdr) {
-+                      /* default Broadcom layout */
-+                      rootfslen = kerneladdr - rootfsaddr;
-+                      rootfs_first = true;
-+              } else {
-+                      /* OpenWrt layout */
-+                      rootfsaddr = kerneladdr + kernellen;
-+                      rootfslen = spareaddr - rootfsaddr;
-+              }
-+      } else {
-+              goto out;
-+      }
-+      sparelen = master->size - spareaddr;
-+
-+      /* Determine number of partitions */
-+      if (rootfslen > 0)
-+              nrparts++;
-+
-+      if (kernellen > 0)
-+              nrparts++;
-+
-+      parts = kzalloc(sizeof(*parts) * nrparts + 10 * nrparts, GFP_KERNEL);
-+      if (!parts) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      /* Start building partition list */
-+      if (kernellen > 0) {
-+              int kernelpart = curpart;
-+
-+              if (rootfslen > 0 && rootfs_first)
-+                      kernelpart++;
-+              parts[kernelpart].name = "kernel";
-+              parts[kernelpart].offset = kerneladdr;
-+              parts[kernelpart].size = kernellen;
-+              curpart++;
-+      }
-+
-+      if (rootfslen > 0) {
-+              int rootfspart = curpart;
-+
-+              if (kernellen > 0 && rootfs_first)
-+                      rootfspart--;
-+              parts[rootfspart].name = "rootfs";
-+              parts[rootfspart].offset = rootfsaddr;
-+              parts[rootfspart].size = rootfslen;
-+              if (sparelen > 0  && !rootfs_first)
-+                      parts[rootfspart].size += sparelen;
-+              curpart++;
-+      }
-+
-+      for (i = 0; i < nrparts; i++)
-+              pr_info("Partition %d is %s offset %llx and length %llx\n", i,
-+                      parts[i].name, parts[i].offset, parts[i].size);
-+
-+      pr_info("Spare partition is offset %x and length %x\n", spareaddr,
-+              sparelen);
-+
-+      *pparts = parts;
-+      ret = 0;
-+
-+out:
-+      vfree(buf);
-+
-+      if (ret)
-+              return ret;
-+
-+      return nrparts;
-+}
-+
-+static struct mtd_part_parser bcm963xx_imagetag_parser = {
-+      .parse_fn = bcm963xx_parse_imagetag_partitions,
-+      .name = "bcm963xx-imagetag",
-+};
-+module_mtd_part_parser(bcm963xx_imagetag_parser);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Daniel Dickinson <openwrt@cshore.neomailbox.net>");
-+MODULE_AUTHOR("Florian Fainelli <florian@openwrt.org>");
-+MODULE_AUTHOR("Mike Albon <malbon@openwrt.org>");
-+MODULE_AUTHOR("Jonas Gorski <jonas.gorski@gmail.com");
-+MODULE_DESCRIPTION("MTD parser for BCM963XX CFE Image Tag partitions");