summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libs/NVRam/include/NVRam.h2
-rw-r--r--libs/NVRam/nvm.c27
-rw-r--r--utils/bcmflash/bcmflash.h1
-rw-r--r--utils/bcmflash/nvm.cpp16
4 files changed, 45 insertions, 1 deletions
diff --git a/libs/NVRam/include/NVRam.h b/libs/NVRam/include/NVRam.h
index 919aeb7..5ec5b5f 100644
--- a/libs/NVRam/include/NVRam.h
+++ b/libs/NVRam/include/NVRam.h
@@ -61,6 +61,8 @@ void NVRam_enableWrites(void);
void NVRam_disable(void);
void NVRam_disableWrites(void);
+uint32_t NVRam_size(void);
+
uint32_t NVRam_crc(const uint8_t *pcDatabuf, // Pointer to data buffer
uint32_t ulDatalen, // Length of data buffer in bytes
uint32_t crc); // Initial value
diff --git a/libs/NVRam/nvm.c b/libs/NVRam/nvm.c
index 1e4d0cb..e3c33ba 100644
--- a/libs/NVRam/nvm.c
+++ b/libs/NVRam/nvm.c
@@ -45,6 +45,8 @@
#include <NVRam.h>
+#define BCM_NVRAM_MAGIC (0x669955AAu)
+
#define ATMEL_AT45DB0X1B_PAGE_POS (9u)
#define ATMEL_AT45DB0X1B_PAGE_SIZE (264u)
#define ATMEL_AT45DB0X1B_ERASE (false)
@@ -90,7 +92,7 @@ static inline uint32_t NVRam_translate(uint32_t address)
}
else
{
- return address;
+ return address;
}
#else
return address;
@@ -323,3 +325,26 @@ void NVRam_write(uint32_t address, uint32_t *buffer, uint32_t words)
}
#endif
}
+
+uint32_t NVRam_size(void)
+{
+ size_t size;
+ uint32_t magic = NVRam_readWord(0);
+
+ if (magic != htonl(BCM_NVRAM_MAGIC))
+ {
+ // Unable to determine the size.
+ return 0;
+ }
+
+ // Scan for the magic wrapping around, starting at 2KB flash size.
+ size = 2u * 1024u;
+ do
+ {
+ size *= 2;
+
+ magic = NVRam_readWord(size);
+ } while (magic != htonl(BCM_NVRAM_MAGIC));
+
+ return size;
+}
diff --git a/utils/bcmflash/bcmflash.h b/utils/bcmflash/bcmflash.h
index 55d71ee..8831040 100644
--- a/utils/bcmflash/bcmflash.h
+++ b/utils/bcmflash/bcmflash.h
@@ -50,6 +50,7 @@
bool bcmflash_nvram_read(const char *name, uint32_t *words, uint32_t num_words);
bool bcmflash_nvram_write(const char *name, void *buffer, size_t len);
+size_t bcmflash_nvram_size(const char *name);
void bcmflash_nvram_unlock(void);
void bcmflash_nvram_recovery(void);
diff --git a/utils/bcmflash/nvm.cpp b/utils/bcmflash/nvm.cpp
index f6e8cb6..af067d8 100644
--- a/utils/bcmflash/nvm.cpp
+++ b/utils/bcmflash/nvm.cpp
@@ -45,6 +45,22 @@
#include <../bcm5719_NVM.h>
#include <NVRam.h>
+#include <bcm5719_eeprom.h>
+
+size_t bcmflash_nvram_size(const char *name)
+{
+ size_t size;
+
+ NVRam_acquireLock();
+
+ NVRam_enable();
+
+ size = NVRam_size();
+
+ NVRam_releaseLock();
+
+ return size;
+}
bool bcmflash_nvram_read(const char *name, uint32_t *words, uint32_t num_words)
{
OpenPOWER on IntegriCloud