summaryrefslogtreecommitdiffstats
path: root/cfe/cfe/main/nvram_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'cfe/cfe/main/nvram_subr.c')
-rw-r--r--cfe/cfe/main/nvram_subr.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/cfe/cfe/main/nvram_subr.c b/cfe/cfe/main/nvram_subr.c
new file mode 100644
index 0000000..2c44bca
--- /dev/null
+++ b/cfe/cfe/main/nvram_subr.c
@@ -0,0 +1,300 @@
+/* *********************************************************************
+ * Broadcom Common Firmware Environment (CFE)
+ *
+ * NVRAM subroutines File: nvram_subr.c
+ *
+ * High-level routines to read/write the NVRAM device.
+ *
+ * Author: Mitch Lichtenberg (mpl@broadcom.com)
+ *
+ *********************************************************************
+ *
+ * Copyright 2000,2001,2002,2003
+ * Broadcom Corporation. All rights reserved.
+ *
+ * This software is furnished under license and may be used and
+ * copied only in accordance with the following terms and
+ * conditions. Subject to these conditions, you may download,
+ * copy, install, use, modify and distribute modified or unmodified
+ * copies of this software in source and/or binary form. No title
+ * or ownership is transferred hereby.
+ *
+ * 1) Any source code used, modified or distributed must reproduce
+ * and retain this copyright notice and list of conditions
+ * as they appear in the source file.
+ *
+ * 2) No right is granted to use any trade name, trademark, or
+ * logo of Broadcom Corporation. The "Broadcom Corporation"
+ * name may not be used to endorse or promote products derived
+ * from this software without the prior written permission of
+ * Broadcom Corporation.
+ *
+ * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT
+ * SHALL BROADCOM BE LIABLE FOR ANY DAMAGES WHATSOEVER, AND IN
+ * PARTICULAR, BROADCOM SHALL NOT BE LIABLE FOR DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE), EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ ********************************************************************* */
+
+
+#include "lib_types.h"
+#include "lib_string.h"
+#include "lib_queue.h"
+#include "lib_malloc.h"
+#include "lib_printf.h"
+
+#include "cfe_iocb.h"
+#include "cfe_devfuncs.h"
+#include "cfe_ioctl.h"
+
+#include "cfe_error.h"
+#include "env_subr.h"
+#include "nvram_subr.h"
+#include "cfe.h"
+
+/* *********************************************************************
+ * Globals
+ ********************************************************************* */
+
+static int nvram_handle = -1;
+static nvram_info_t nvram_info;
+static char *nvram_devname = NULL;
+
+/* *********************************************************************
+ * nvram_getinfo(info)
+ *
+ * Obtain information about the NVRAM device from the device
+ * driver. A flash device might only dedicate a single sector
+ * to the environment, so we need to ask the driver first.
+ *
+ * Input parameters:
+ * info - nvram info
+ *
+ * Return value:
+ * 0 if ok
+ * <0 = error code
+ ********************************************************************* */
+
+static int nvram_getinfo(nvram_info_t *info)
+{
+ int retlen;
+
+ if (nvram_handle == -1) return -1;
+
+ cfe_ioctl(nvram_handle,IOCTL_NVRAM_UNLOCK,NULL,0,NULL,0);
+
+ if (cfe_ioctl(nvram_handle,IOCTL_NVRAM_GETINFO,
+ (unsigned char *) info,
+ sizeof(nvram_info_t),
+ &retlen,0) != 0) {
+ return -1;
+ }
+
+ return 0;
+
+}
+
+/* *********************************************************************
+ * nvram_open()
+ *
+ * Open the default NVRAM device and get the information from the
+ * device driver.
+ *
+ * Input parameters:
+ * nothing
+ *
+ * Return value:
+ * 0 if ok
+ * else error code
+ ********************************************************************* */
+
+int nvram_open(void)
+{
+ if (nvram_handle != -1) {
+ nvram_close();
+ }
+
+ if (nvram_devname == NULL) {
+ return CFE_ERR_DEVNOTFOUND;
+ }
+
+ nvram_handle = cfe_open(nvram_devname);
+
+ if (nvram_handle < 0) {
+ return CFE_ERR_DEVNOTFOUND;
+ }
+
+ if (nvram_getinfo(&nvram_info) < 0) {
+ nvram_close();
+ return CFE_ERR_IOERR;
+ }
+
+ return 0;
+}
+
+/* *********************************************************************
+ * nvram_close()
+ *
+ * Close the NVRAM device
+ *
+ * Input parameters:
+ * nothing
+ *
+ * Return value:
+ * 0
+ ********************************************************************* */
+
+int nvram_close(void)
+{
+ if (nvram_handle != -1) {
+ cfe_close(nvram_handle);
+ nvram_handle = -1;
+ }
+
+ return 0;
+}
+
+
+/* *********************************************************************
+ * nvram_getsize()
+ *
+ * Return the total size of the NVRAM device. Note that
+ * this is the total size that is used for the NVRAM functions,
+ * not the size of the underlying media.
+ *
+ * Input parameters:
+ * nothing
+ *
+ * Return value:
+ * size. <0 if error
+ ********************************************************************* */
+
+int nvram_getsize(void)
+{
+ if (nvram_handle < 0) return 0;
+ return nvram_info.nvram_size;
+}
+
+
+/* *********************************************************************
+ * nvram_read(buffer,offset,length)
+ *
+ * Read data from the NVRAM device
+ *
+ * Input parameters:
+ * buffer - destination buffer
+ * offset - offset of data to read
+ * length - number of bytes to read
+ *
+ * Return value:
+ * number of bytes read, or <0 if error occured
+ ********************************************************************* */
+int nvram_read(unsigned char *buffer,int offset,int length)
+{
+ if (nvram_handle == -1) return -1;
+
+ return cfe_readblk(nvram_handle,
+ (cfe_offset_t) (offset+nvram_info.nvram_offset),
+ buffer,
+ length);
+}
+
+/* *********************************************************************
+ * nvram_write(buffer,offset,length)
+ *
+ * Write data to the NVRAM device
+ *
+ * Input parameters:
+ * buffer - source buffer
+ * offset - offset of data to write
+ * length - number of bytes to write
+ *
+ * Return value:
+ * number of bytes written, or -1 if error occured
+ ********************************************************************* */
+int nvram_write(unsigned char *buffer,int offset,int length)
+{
+ if (nvram_handle == -1) return -1;
+
+ return cfe_writeblk(nvram_handle,
+ (cfe_offset_t) (offset+nvram_info.nvram_offset),
+ buffer,
+ length);
+}
+
+
+/* *********************************************************************
+ * nvram_erase()
+ *
+ * Erase the NVRAM device. Not all devices need to be erased,
+ * but flash memory does.
+ *
+ * Input parameters:
+ * nothing
+ *
+ * Return value:
+ * 0 if ok
+ * else error code
+ ********************************************************************* */
+
+int nvram_erase(void)
+{
+ int retlen;
+
+ if (nvram_handle < 0) {
+ return -1;
+ }
+
+ if (nvram_info.nvram_eraseflg == FALSE) return 0;
+
+ if (cfe_ioctl(nvram_handle,IOCTL_NVRAM_ERASE,
+ (unsigned char *) &nvram_info,
+ sizeof(nvram_info_t),
+ &retlen,0) != 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+/* *********************************************************************
+ * cfe_set_envdevice(name)
+ *
+ * Set the environment NVRAM device name
+ *
+ * Input parameters:
+ * name - name of device to use for NVRAM
+ *
+ * Return value:
+ * 0 if ok
+ * else error code
+ ********************************************************************* */
+
+int cfe_set_envdevice(char *name)
+{
+ int res;
+
+ nvram_devname = strdup(name);
+
+ res = nvram_open();
+
+ if (res != 0) {
+ xprintf("!! Could not open NVRAM device %s\n",nvram_devname);
+ return res;
+ }
+
+ nvram_close();
+
+ res = env_load();
+
+ return res;
+}