1/*
2 * NVRAM variable manipulation
3 *
4 * Copyright 2007, Broadcom Corporation
5 * Copyright 2009, OpenWrt.org
6 * All Rights Reserved.
7 *
8 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
9 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
10 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
11 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
12 *
13 */
14
15#ifndef _nvram_h_
16#define _nvram_h_
17
18#include <stdint.h>
19#include <string.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <fcntl.h>
23#include <unistd.h>
24#include <errno.h>
25#include <sys/mman.h>
26#include <sys/stat.h>
27#include <linux/limits.h>
28
29#include "sdinitvals.h"
30
31
32struct nvram_header {
33	uint32_t magic;
34	uint32_t len;
35	uint32_t crc_ver_init;	/* 0:7 crc, 8:15 ver, 16:31 sdram_init */
36	uint32_t config_refresh;	/* 0:15 sdram_config, 16:31 sdram_refresh */
37	uint32_t config_ncdl;	/* ncdl values for memc */
38} __attribute__((__packed__));
39
40struct nvram_tuple {
41	char *name;
42	char *value;
43	struct nvram_tuple *next;
44};
45
46struct nvram_handle {
47	int fd;
48	char *mmap;
49	unsigned int length;
50	unsigned int offset;
51	struct nvram_tuple *nvram_hash[257];
52	struct nvram_tuple *nvram_dead;
53};
54
55typedef struct nvram_handle nvram_handle_t;
56typedef struct nvram_header nvram_header_t;
57typedef struct nvram_tuple  nvram_tuple_t;
58
59
60/* Get nvram header. */
61nvram_header_t * nvram_header(nvram_handle_t *h);
62
63/* Set the value of an NVRAM variable */
64int nvram_set(nvram_handle_t *h, const char *name, const char *value);
65
66/* Get the value of an NVRAM variable. */
67char * nvram_get(nvram_handle_t *h, const char *name);
68
69/* Unset the value of an NVRAM variable. */
70int nvram_unset(nvram_handle_t *h, const char *name);
71
72/* Get all NVRAM variables. */
73nvram_tuple_t * nvram_getall(nvram_handle_t *h);
74
75/* Regenerate NVRAM. */
76int nvram_commit(nvram_handle_t *h);
77
78/* Open NVRAM and obtain a handle. */
79nvram_handle_t * nvram_open(const char *file, int rdonly);
80
81/* Close NVRAM and free memory. */
82int nvram_close(nvram_handle_t *h);
83
84/* Get the value of an NVRAM variable in a safe way, use "" instead of NULL. */
85#define nvram_safe_get(h, name) (nvram_get(h, name) ? : "")
86
87/* Computes a crc8 over the input data. */
88uint8_t hndcrc8 (uint8_t * pdata, uint32_t nbytes, uint8_t crc);
89
90/* Returns the crc value of the nvram. */
91uint8_t nvram_calc_crc(nvram_header_t * nvh);
92
93/* Determine NVRAM device node. */
94char * nvram_find_mtd(void);
95
96/* Copy NVRAM contents to staging file. */
97int nvram_to_staging(void);
98
99/* Copy staging file to NVRAM device. */
100int staging_to_nvram(void);
101
102/* Check NVRAM staging file. */
103char * nvram_find_staging(void);
104
105
106/* Staging file for NVRAM */
107#define NVRAM_STAGING		"/tmp/.nvram"
108#define NVRAM_RO			1
109#define NVRAM_RW			0
110
111/* Helper macros */
112#define NVRAM_ARRAYSIZE(a)	sizeof(a)/sizeof(a[0])
113#define	NVRAM_ROUNDUP(x, y)	((((x)+((y)-1))/(y))*(y))
114
115/* NVRAM constants */
116#define NVRAM_MIN_SPACE			0x8000
117#define NVRAM_MAGIC			0x48534C46	/* 'FLSH' */
118#define NVRAM_VERSION		1
119
120#define NVRAM_CRC_START_POSITION	9 /* magic, len, crc8 to be skipped */
121
122
123#endif /* _nvram_h_ */
124