1 /*
2  * Copyright (C) 2011 Google, Inc.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14 
15 #ifndef __LINUX_PERSISTENT_RAM_H__
16 #define __LINUX_PERSISTENT_RAM_H__
17 
18 #include <linux/device.h>
19 #include <linux/kernel.h>
20 #include <linux/list.h>
21 #include <linux/types.h>
22 
23 struct persistent_ram_buffer;
24 
25 struct persistent_ram_descriptor {
26 	const char	*name;
27 	phys_addr_t	size;
28 };
29 
30 struct persistent_ram {
31 	phys_addr_t	start;
32 	phys_addr_t	size;
33 
34 	int					num_descs;
35 	struct persistent_ram_descriptor	*descs;
36 
37 	struct list_head node;
38 };
39 
40 struct persistent_ram_zone {
41 	struct list_head node;
42 	void *vaddr;
43 	struct persistent_ram_buffer *buffer;
44 	size_t buffer_size;
45 
46 	/* ECC correction */
47 	bool ecc;
48 	char *par_buffer;
49 	char *par_header;
50 	struct rs_control *rs_decoder;
51 	int corrected_bytes;
52 	int bad_blocks;
53 	int ecc_block_size;
54 	int ecc_size;
55 	int ecc_symsize;
56 	int ecc_poly;
57 
58 	char *old_log;
59 	size_t old_log_size;
60 	size_t old_log_footer_size;
61 	bool early;
62 };
63 
64 int persistent_ram_early_init(struct persistent_ram *ram);
65 
66 struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev,
67 		bool ecc);
68 
69 int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,
70 	unsigned int count);
71 
72 size_t persistent_ram_old_size(struct persistent_ram_zone *prz);
73 void *persistent_ram_old(struct persistent_ram_zone *prz);
74 void persistent_ram_free_old(struct persistent_ram_zone *prz);
75 ssize_t persistent_ram_ecc_string(struct persistent_ram_zone *prz,
76 	char *str, size_t len);
77 
78 #endif
79