1#ifndef _GPXE_NVS_H
2#define _GPXE_NVS_H
3
4/** @file
5 *
6 * Non-volatile storage
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER );
11
12#include <stdint.h>
13
14/** A non-volatile storage device */
15struct nvs_device {
16	/** Word length
17	 *
18	 * This is expressed as the base-2 logarithm of the word
19	 * length in bytes.  A value of 0 therefore translates as
20	 * 8-bit words, and a value of 1 translates as 16-bit words.
21	 */
22	unsigned int word_len_log2;
23	/** Device size (in words) */
24	unsigned int size;
25	/** Data block size (in words)
26	 *
27	 * This is the block size used by the device.  It must be a
28	 * power of two.  Data reads and writes must not cross a block
29	 * boundary.
30	 *
31	 * Many devices allow reads to cross a block boundary, and
32	 * restrict only writes.  For the sake of simplicity, we
33	 * assume that the same restriction applies to both reads and
34	 * writes.
35	 */
36	unsigned int block_size;
37	/** Read data from device
38	 *
39	 * @v nvs		NVS device
40	 * @v address		Address from which to read
41	 * @v data		Data buffer
42	 * @v len		Length of data buffer
43	 * @ret rc		Return status code
44	 *
45	 * Reads may not cross a block boundary.
46	 */
47	int ( * read ) ( struct nvs_device *nvs, unsigned int address,
48			 void *data, size_t len );
49	/** Write data to device
50	 *
51	 * @v nvs		NVS device
52	 * @v address		Address to which to write
53	 * @v data		Data buffer
54	 * @v len		Length of data buffer
55	 * @ret rc		Return status code
56	 *
57	 * Writes may not cross a block boundary.
58	 */
59	int ( * write ) ( struct nvs_device *nvs, unsigned int address,
60			  const void *data, size_t len );
61};
62
63extern int nvs_read ( struct nvs_device *nvs, unsigned int address,
64		      void *data, size_t len );
65extern int nvs_write ( struct nvs_device *nvs, unsigned int address,
66		       const void *data, size_t len );
67
68#endif /* _GPXE_NVS_H */
69