1*7134a2d0SRafał Miłecki // SPDX-License-Identifier: GPL-2.0
2*7134a2d0SRafał Miłecki /*
3*7134a2d0SRafał Miłecki * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl>
4*7134a2d0SRafał Miłecki */
5*7134a2d0SRafał Miłecki
6*7134a2d0SRafał Miłecki #include <linux/bcm47xx_nvram.h>
7*7134a2d0SRafał Miłecki #include <linux/mtd/mtd.h>
8*7134a2d0SRafał Miłecki #include <linux/mtd/partitions.h>
9*7134a2d0SRafał Miłecki
10*7134a2d0SRafał Miłecki #include "ofpart_linksys_ns.h"
11*7134a2d0SRafał Miłecki
12*7134a2d0SRafał Miłecki #define NVRAM_BOOT_PART "bootpartition"
13*7134a2d0SRafał Miłecki
ofpart_linksys_ns_bootpartition(void)14*7134a2d0SRafał Miłecki static int ofpart_linksys_ns_bootpartition(void)
15*7134a2d0SRafał Miłecki {
16*7134a2d0SRafał Miłecki char buf[4];
17*7134a2d0SRafał Miłecki int bootpartition;
18*7134a2d0SRafał Miłecki
19*7134a2d0SRafał Miłecki /* Check CFE environment variable */
20*7134a2d0SRafał Miłecki if (bcm47xx_nvram_getenv(NVRAM_BOOT_PART, buf, sizeof(buf)) > 0) {
21*7134a2d0SRafał Miłecki if (!kstrtoint(buf, 0, &bootpartition))
22*7134a2d0SRafał Miłecki return bootpartition;
23*7134a2d0SRafał Miłecki pr_warn("Failed to parse %s value \"%s\"\n", NVRAM_BOOT_PART,
24*7134a2d0SRafał Miłecki buf);
25*7134a2d0SRafał Miłecki } else {
26*7134a2d0SRafał Miłecki pr_warn("Failed to get NVRAM \"%s\"\n", NVRAM_BOOT_PART);
27*7134a2d0SRafał Miłecki }
28*7134a2d0SRafał Miłecki
29*7134a2d0SRafał Miłecki return 0;
30*7134a2d0SRafał Miłecki }
31*7134a2d0SRafał Miłecki
linksys_ns_partitions_post_parse(struct mtd_info * mtd,struct mtd_partition * parts,int nr_parts)32*7134a2d0SRafał Miłecki int linksys_ns_partitions_post_parse(struct mtd_info *mtd,
33*7134a2d0SRafał Miłecki struct mtd_partition *parts,
34*7134a2d0SRafał Miłecki int nr_parts)
35*7134a2d0SRafał Miłecki {
36*7134a2d0SRafał Miłecki int bootpartition = ofpart_linksys_ns_bootpartition();
37*7134a2d0SRafał Miłecki int trx_idx = 0;
38*7134a2d0SRafał Miłecki int i;
39*7134a2d0SRafał Miłecki
40*7134a2d0SRafał Miłecki for (i = 0; i < nr_parts; i++) {
41*7134a2d0SRafał Miłecki if (of_device_is_compatible(parts[i].of_node, "linksys,ns-firmware")) {
42*7134a2d0SRafał Miłecki if (trx_idx++ == bootpartition)
43*7134a2d0SRafał Miłecki parts[i].name = "firmware";
44*7134a2d0SRafał Miłecki else
45*7134a2d0SRafał Miłecki parts[i].name = "backup";
46*7134a2d0SRafał Miłecki }
47*7134a2d0SRafał Miłecki }
48*7134a2d0SRafał Miłecki
49*7134a2d0SRafał Miłecki return 0;
50*7134a2d0SRafał Miłecki }
51