xref: /OK3568_Linux_fs/kernel/include/linux/pstore_ram.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
4*4882a593Smuzhiyun  * Copyright (C) 2011 Kees Cook <keescook@chromium.org>
5*4882a593Smuzhiyun  * Copyright (C) 2011 Google, Inc.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef __LINUX_PSTORE_RAM_H__
9*4882a593Smuzhiyun #define __LINUX_PSTORE_RAM_H__
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/compiler.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/init.h>
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/list.h>
16*4882a593Smuzhiyun #include <linux/pstore.h>
17*4882a593Smuzhiyun #include <linux/types.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /*
20*4882a593Smuzhiyun  * Choose whether access to the RAM zone requires locking or not.  If a zone
21*4882a593Smuzhiyun  * can be written to from different CPUs like with ftrace for example, then
22*4882a593Smuzhiyun  * PRZ_FLAG_NO_LOCK is used. For all other cases, locking is required.
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun #define PRZ_FLAG_NO_LOCK	BIT(0)
25*4882a593Smuzhiyun /*
26*4882a593Smuzhiyun  * If a PRZ should only have a single-boot lifetime, this marks it as
27*4882a593Smuzhiyun  * getting wiped after its contents get copied out after boot.
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun #define PRZ_FLAG_ZAP_OLD	BIT(1)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct persistent_ram_buffer;
32*4882a593Smuzhiyun struct rs_control;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun struct persistent_ram_ecc_info {
35*4882a593Smuzhiyun 	int block_size;
36*4882a593Smuzhiyun 	int ecc_size;
37*4882a593Smuzhiyun 	int symsize;
38*4882a593Smuzhiyun 	int poly;
39*4882a593Smuzhiyun 	uint16_t *par;
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /**
43*4882a593Smuzhiyun  * struct persistent_ram_zone - Details of a persistent RAM zone (PRZ)
44*4882a593Smuzhiyun  *                              used as a pstore backend
45*4882a593Smuzhiyun  *
46*4882a593Smuzhiyun  * @paddr:	physical address of the mapped RAM area
47*4882a593Smuzhiyun  * @size:	size of mapping
48*4882a593Smuzhiyun  * @label:	unique name of this PRZ
49*4882a593Smuzhiyun  * @type:	frontend type for this PRZ
50*4882a593Smuzhiyun  * @flags:	holds PRZ_FLAGS_* bits
51*4882a593Smuzhiyun  *
52*4882a593Smuzhiyun  * @buffer_lock:
53*4882a593Smuzhiyun  *	locks access to @buffer "size" bytes and "start" offset
54*4882a593Smuzhiyun  * @buffer:
55*4882a593Smuzhiyun  *	pointer to actual RAM area managed by this PRZ
56*4882a593Smuzhiyun  * @buffer_size:
57*4882a593Smuzhiyun  *	bytes in @buffer->data (not including any trailing ECC bytes)
58*4882a593Smuzhiyun  *
59*4882a593Smuzhiyun  * @par_buffer:
60*4882a593Smuzhiyun  *	pointer into @buffer->data containing ECC bytes for @buffer->data
61*4882a593Smuzhiyun  * @par_header:
62*4882a593Smuzhiyun  *	pointer into @buffer->data containing ECC bytes for @buffer header
63*4882a593Smuzhiyun  *	(i.e. all fields up to @data)
64*4882a593Smuzhiyun  * @rs_decoder:
65*4882a593Smuzhiyun  *	RSLIB instance for doing ECC calculations
66*4882a593Smuzhiyun  * @corrected_bytes:
67*4882a593Smuzhiyun  *	ECC corrected bytes accounting since boot
68*4882a593Smuzhiyun  * @bad_blocks:
69*4882a593Smuzhiyun  *	ECC uncorrectable bytes accounting since boot
70*4882a593Smuzhiyun  * @ecc_info:
71*4882a593Smuzhiyun  *	ECC configuration details
72*4882a593Smuzhiyun  *
73*4882a593Smuzhiyun  * @old_log:
74*4882a593Smuzhiyun  *	saved copy of @buffer->data prior to most recent wipe
75*4882a593Smuzhiyun  * @old_log_size:
76*4882a593Smuzhiyun  *	bytes contained in @old_log
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  */
79*4882a593Smuzhiyun struct persistent_ram_zone {
80*4882a593Smuzhiyun 	phys_addr_t paddr;
81*4882a593Smuzhiyun 	size_t size;
82*4882a593Smuzhiyun 	void *vaddr;
83*4882a593Smuzhiyun 	char *label;
84*4882a593Smuzhiyun 	enum pstore_type_id type;
85*4882a593Smuzhiyun 	u32 flags;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	raw_spinlock_t buffer_lock;
88*4882a593Smuzhiyun 	struct persistent_ram_buffer *buffer;
89*4882a593Smuzhiyun 	size_t buffer_size;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	char *par_buffer;
92*4882a593Smuzhiyun 	char *par_header;
93*4882a593Smuzhiyun 	struct rs_control *rs_decoder;
94*4882a593Smuzhiyun 	int corrected_bytes;
95*4882a593Smuzhiyun 	int bad_blocks;
96*4882a593Smuzhiyun 	struct persistent_ram_ecc_info ecc_info;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	char *old_log;
99*4882a593Smuzhiyun 	size_t old_log_size;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
103*4882a593Smuzhiyun 			u32 sig, struct persistent_ram_ecc_info *ecc_info,
104*4882a593Smuzhiyun 			unsigned int memtype, u32 flags, char *label);
105*4882a593Smuzhiyun void persistent_ram_free(struct persistent_ram_zone *prz);
106*4882a593Smuzhiyun void persistent_ram_zap(struct persistent_ram_zone *prz);
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,
109*4882a593Smuzhiyun 			 unsigned int count);
110*4882a593Smuzhiyun int persistent_ram_write_user(struct persistent_ram_zone *prz,
111*4882a593Smuzhiyun 			      const void __user *s, unsigned int count);
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun void persistent_ram_save_old(struct persistent_ram_zone *prz);
114*4882a593Smuzhiyun size_t persistent_ram_old_size(struct persistent_ram_zone *prz);
115*4882a593Smuzhiyun void *persistent_ram_old(struct persistent_ram_zone *prz);
116*4882a593Smuzhiyun void persistent_ram_free_old(struct persistent_ram_zone *prz);
117*4882a593Smuzhiyun ssize_t persistent_ram_ecc_string(struct persistent_ram_zone *prz,
118*4882a593Smuzhiyun 	char *str, size_t len);
119*4882a593Smuzhiyun #ifdef CONFIG_PSTORE_BOOT_LOG
120*4882a593Smuzhiyun ssize_t ramoops_pstore_read_for_boot_log(struct pstore_record *record);
121*4882a593Smuzhiyun #endif
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /*
124*4882a593Smuzhiyun  * Ramoops platform data
125*4882a593Smuzhiyun  * @mem_size	memory size for ramoops
126*4882a593Smuzhiyun  * @mem_address	physical memory address to contain ramoops
127*4882a593Smuzhiyun  */
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun #define RAMOOPS_FLAG_FTRACE_PER_CPU	BIT(0)
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct ramoops_platform_data {
132*4882a593Smuzhiyun 	unsigned long	mem_size;
133*4882a593Smuzhiyun 	phys_addr_t	mem_address;
134*4882a593Smuzhiyun 	unsigned int	mem_type;
135*4882a593Smuzhiyun 	unsigned long	record_size;
136*4882a593Smuzhiyun 	unsigned long	console_size;
137*4882a593Smuzhiyun 	unsigned long	ftrace_size;
138*4882a593Smuzhiyun 	unsigned long	pmsg_size;
139*4882a593Smuzhiyun #ifdef CONFIG_PSTORE_BOOT_LOG
140*4882a593Smuzhiyun 	unsigned long	boot_log_size;
141*4882a593Smuzhiyun 	unsigned long	max_boot_log_cnt;
142*4882a593Smuzhiyun #endif
143*4882a593Smuzhiyun 	int		max_reason;
144*4882a593Smuzhiyun 	u32		flags;
145*4882a593Smuzhiyun 	struct persistent_ram_ecc_info ecc_info;
146*4882a593Smuzhiyun };
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #endif
149