blob: 6ab072883d83f2106b6603c0305326cfc78ecf1a [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001From 0a24b51a3264a3f942a75025ea5ff6133c8989b0 Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
3Date: Mon, 8 Mar 2021 10:03:17 +0100
4Subject: [PATCH] firmware: bcm47xx_nvram: add helper checking for NVRAM
5MIME-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8
9This avoids duplicating code doing casting and checking for NVRAM magic.
10
11Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
12Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
13---
14 drivers/firmware/broadcom/bcm47xx_nvram.c | 30 ++++++++++++++---------
15 1 file changed, 18 insertions(+), 12 deletions(-)
16
17--- a/drivers/firmware/broadcom/bcm47xx_nvram.c
18+++ b/drivers/firmware/broadcom/bcm47xx_nvram.c
19@@ -34,14 +34,20 @@ static char nvram_buf[NVRAM_SPACE];
20 static size_t nvram_len;
21 static const u32 nvram_sizes[] = {0x6000, 0x8000, 0xF000, 0x10000};
22
23+/**
24+ * bcm47xx_nvram_is_valid - check for a valid NVRAM at specified memory
25+ */
26+static bool bcm47xx_nvram_is_valid(void __iomem *nvram)
27+{
28+ return ((struct nvram_header *)nvram)->magic == NVRAM_MAGIC;
29+}
30+
31 static u32 find_nvram_size(void __iomem *end)
32 {
33- struct nvram_header __iomem *header;
34 int i;
35
36 for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
37- header = (struct nvram_header *)(end - nvram_sizes[i]);
38- if (header->magic == NVRAM_MAGIC)
39+ if (bcm47xx_nvram_is_valid(end - nvram_sizes[i]))
40 return nvram_sizes[i];
41 }
42
43@@ -55,6 +61,7 @@ static int bcm47xx_nvram_find_and_copy(v
44 {
45 struct nvram_header __iomem *header;
46 size_t flash_size;
47+ size_t offset;
48 u32 size;
49
50 if (nvram_len) {
51@@ -68,31 +75,30 @@ static int bcm47xx_nvram_find_and_copy(v
52 /* Windowed flash access */
53 size = find_nvram_size(flash_start + flash_size);
54 if (size) {
55- header = (struct nvram_header *)(flash_start + flash_size - size);
56+ offset = flash_size - size;
57 goto found;
58 }
59 flash_size <<= 1;
60 }
61
62 /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
63- header = (struct nvram_header *)(flash_start + 4096);
64- if (header->magic == NVRAM_MAGIC) {
65- size = NVRAM_SPACE;
66+
67+ offset = 4096;
68+ if (bcm47xx_nvram_is_valid(flash_start + offset))
69 goto found;
70- }
71
72- header = (struct nvram_header *)(flash_start + 1024);
73- if (header->magic == NVRAM_MAGIC) {
74- size = NVRAM_SPACE;
75+ offset = 1024;
76+ if (bcm47xx_nvram_is_valid(flash_start + offset))
77 goto found;
78- }
79
80 pr_err("no nvram found\n");
81 return -ENXIO;
82
83 found:
84+ header = (struct nvram_header *)(flash_start + offset);
85 __ioread32_copy(nvram_buf, header, sizeof(*header) / 4);
86 nvram_len = ((struct nvram_header *)(nvram_buf))->len;
87+ size = res_size - offset;
88 if (nvram_len > size) {
89 pr_err("The nvram size according to the header seems to be bigger than the partition on flash\n");
90 nvram_len = size;