Blame view

env/ubi.c 4.75 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
2b74433f3   Joe Hershberger   env: Add support ...
2
3
4
  /*
   * (c) Copyright 2012 by National Instruments,
   *        Joe Hershberger <joe.hershberger@ni.com>
2b74433f3   Joe Hershberger   env: Add support ...
5
6
7
8
9
   */
  
  #include <common.h>
  
  #include <command.h>
0ac7d722e   Simon Glass   env: Move get/set...
10
  #include <env.h>
f3998fdc4   Simon Glass   env: Rename envir...
11
  #include <env_internal.h>
2b74433f3   Joe Hershberger   env: Add support ...
12
13
  #include <errno.h>
  #include <malloc.h>
cf92e05c0   Simon Glass   Move ALLOC_CACHE_...
14
  #include <memalign.h>
2b74433f3   Joe Hershberger   env: Add support ...
15
16
17
  #include <search.h>
  #include <ubi_uboot.h>
  #undef crc32
985186d1f   Hamish Guthrie   env: ubi: support...
18
19
20
21
22
23
24
25
  #define _QUOTE(x) #x
  #define QUOTE(x) _QUOTE(x)
  
  #if (CONFIG_ENV_UBI_VID_OFFSET == 0)
   #define UBI_VID_OFFSET NULL
  #else
   #define UBI_VID_OFFSET QUOTE(CONFIG_ENV_UBI_VID_OFFSET)
  #endif
2b74433f3   Joe Hershberger   env: Add support ...
26
  DECLARE_GLOBAL_DATA_PTR;
2b74433f3   Joe Hershberger   env: Add support ...
27
  #ifdef CONFIG_CMD_SAVEENV
785881f77   Joe Hershberger   env: Add redundan...
28
  #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
e5bce247b   Simon Glass   env: Switch over ...
29
  static int env_ubi_save(void)
785881f77   Joe Hershberger   env: Add redundan...
30
31
  {
  	ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
7ce1526ed   Marek Vasut   env: Add env_expo...
32
  	int ret;
785881f77   Joe Hershberger   env: Add redundan...
33

7ce1526ed   Marek Vasut   env: Add env_expo...
34
35
36
  	ret = env_export(env_new);
  	if (ret)
  		return ret;
785881f77   Joe Hershberger   env: Add redundan...
37

985186d1f   Hamish Guthrie   env: ubi: support...
38
  	if (ubi_part(CONFIG_ENV_UBI_PART, UBI_VID_OFFSET)) {
785881f77   Joe Hershberger   env: Add redundan...
39
40
41
42
43
44
  		printf("
  ** Cannot find mtd partition \"%s\"
  ",
  		       CONFIG_ENV_UBI_PART);
  		return 1;
  	}
203e94f6c   Simon Glass   env: Add an enum ...
45
  	if (gd->env_valid == ENV_VALID) {
785881f77   Joe Hershberger   env: Add redundan...
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  		puts("Writing to redundant UBI... ");
  		if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME_REDUND,
  				     (void *)env_new, CONFIG_ENV_SIZE)) {
  			printf("
  ** Unable to write env to %s:%s **
  ",
  			       CONFIG_ENV_UBI_PART,
  			       CONFIG_ENV_UBI_VOLUME_REDUND);
  			return 1;
  		}
  	} else {
  		puts("Writing to UBI... ");
  		if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME,
  				     (void *)env_new, CONFIG_ENV_SIZE)) {
  			printf("
  ** Unable to write env to %s:%s **
  ",
  			       CONFIG_ENV_UBI_PART,
  			       CONFIG_ENV_UBI_VOLUME);
  			return 1;
  		}
  	}
  
  	puts("done
  ");
203e94f6c   Simon Glass   env: Add an enum ...
71
  	gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND;
785881f77   Joe Hershberger   env: Add redundan...
72
73
74
75
  
  	return 0;
  }
  #else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
e5bce247b   Simon Glass   env: Switch over ...
76
  static int env_ubi_save(void)
2b74433f3   Joe Hershberger   env: Add support ...
77
78
  {
  	ALLOC_CACHE_ALIGN_BUFFER(env_t, env_new, 1);
7ce1526ed   Marek Vasut   env: Add env_expo...
79
  	int ret;
2b74433f3   Joe Hershberger   env: Add support ...
80

7ce1526ed   Marek Vasut   env: Add env_expo...
81
82
83
  	ret = env_export(env_new);
  	if (ret)
  		return ret;
2b74433f3   Joe Hershberger   env: Add support ...
84

985186d1f   Hamish Guthrie   env: ubi: support...
85
  	if (ubi_part(CONFIG_ENV_UBI_PART, UBI_VID_OFFSET)) {
2b74433f3   Joe Hershberger   env: Add support ...
86
87
88
89
90
91
  		printf("
  ** Cannot find mtd partition \"%s\"
  ",
  		       CONFIG_ENV_UBI_PART);
  		return 1;
  	}
2b74433f3   Joe Hershberger   env: Add support ...
92
93
94
95
96
97
98
99
100
101
102
103
104
  	if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME, (void *)env_new,
  			     CONFIG_ENV_SIZE)) {
  		printf("
  ** Unable to write env to %s:%s **
  ",
  		       CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
  		return 1;
  	}
  
  	puts("done
  ");
  	return 0;
  }
785881f77   Joe Hershberger   env: Add redundan...
105
  #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */
2b74433f3   Joe Hershberger   env: Add support ...
106
  #endif /* CONFIG_CMD_SAVEENV */
785881f77   Joe Hershberger   env: Add redundan...
107
  #ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT
c59519919   Simon Glass   env: Adjust the l...
108
  static int env_ubi_load(void)
785881f77   Joe Hershberger   env: Add redundan...
109
110
111
  {
  	ALLOC_CACHE_ALIGN_BUFFER(char, env1_buf, CONFIG_ENV_SIZE);
  	ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE);
31f044bd9   Simon Goldschmidt   env: move more co...
112
  	int read1_fail, read2_fail;
9d364af23   Fiach Antaw   env: Switch env_n...
113
  	env_t *tmp_env1, *tmp_env2;
785881f77   Joe Hershberger   env: Add redundan...
114

c1f51e0f3   Marcin Niestroj   common: env_ubi: ...
115
116
117
118
119
120
121
122
123
124
  	/*
  	 * In case we have restarted u-boot there is a chance that buffer
  	 * contains old environment (from the previous boot).
  	 * If UBI volume is zero size, ubi_volume_read() doesn't modify the
  	 * buffer.
  	 * We need to clear buffer manually here, so the invalid CRC will
  	 * cause setting default environment as expected.
  	 */
  	memset(env1_buf, 0x0, CONFIG_ENV_SIZE);
  	memset(env2_buf, 0x0, CONFIG_ENV_SIZE);
785881f77   Joe Hershberger   env: Add redundan...
125
126
  	tmp_env1 = (env_t *)env1_buf;
  	tmp_env2 = (env_t *)env2_buf;
985186d1f   Hamish Guthrie   env: ubi: support...
127
  	if (ubi_part(CONFIG_ENV_UBI_PART, UBI_VID_OFFSET)) {
785881f77   Joe Hershberger   env: Add redundan...
128
129
130
131
  		printf("
  ** Cannot find mtd partition \"%s\"
  ",
  		       CONFIG_ENV_UBI_PART);
0ac7d722e   Simon Glass   env: Move get/set...
132
  		env_set_default(NULL, 0);
c59519919   Simon Glass   env: Adjust the l...
133
  		return -EIO;
785881f77   Joe Hershberger   env: Add redundan...
134
  	}
31f044bd9   Simon Goldschmidt   env: move more co...
135
136
137
  	read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1,
  				     CONFIG_ENV_SIZE);
  	if (read1_fail)
785881f77   Joe Hershberger   env: Add redundan...
138
139
140
141
  		printf("
  ** Unable to read env from %s:%s **
  ",
  		       CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
785881f77   Joe Hershberger   env: Add redundan...
142

31f044bd9   Simon Goldschmidt   env: move more co...
143
144
145
  	read2_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME_REDUND,
  				     (void *)tmp_env2, CONFIG_ENV_SIZE);
  	if (read2_fail)
785881f77   Joe Hershberger   env: Add redundan...
146
147
148
149
  		printf("
  ** Unable to read redundant env from %s:%s **
  ",
  		       CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
785881f77   Joe Hershberger   env: Add redundan...
150

31f044bd9   Simon Goldschmidt   env: move more co...
151
152
  	return env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
  							 read2_fail);
785881f77   Joe Hershberger   env: Add redundan...
153
154
  }
  #else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
c59519919   Simon Glass   env: Adjust the l...
155
  static int env_ubi_load(void)
2b74433f3   Joe Hershberger   env: Add support ...
156
157
  {
  	ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
c1f51e0f3   Marcin Niestroj   common: env_ubi: ...
158
159
160
161
162
163
164
165
166
  	/*
  	 * In case we have restarted u-boot there is a chance that buffer
  	 * contains old environment (from the previous boot).
  	 * If UBI volume is zero size, ubi_volume_read() doesn't modify the
  	 * buffer.
  	 * We need to clear buffer manually here, so the invalid CRC will
  	 * cause setting default environment as expected.
  	 */
  	memset(buf, 0x0, CONFIG_ENV_SIZE);
985186d1f   Hamish Guthrie   env: ubi: support...
167
  	if (ubi_part(CONFIG_ENV_UBI_PART, UBI_VID_OFFSET)) {
2b74433f3   Joe Hershberger   env: Add support ...
168
169
170
171
  		printf("
  ** Cannot find mtd partition \"%s\"
  ",
  		       CONFIG_ENV_UBI_PART);
0ac7d722e   Simon Glass   env: Move get/set...
172
  		env_set_default(NULL, 0);
c59519919   Simon Glass   env: Adjust the l...
173
  		return -EIO;
2b74433f3   Joe Hershberger   env: Add support ...
174
  	}
a7c06cd3a   Kevin Smith   env_ubi.c: Correc...
175
  	if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, buf, CONFIG_ENV_SIZE)) {
2b74433f3   Joe Hershberger   env: Add support ...
176
177
178
179
  		printf("
  ** Unable to read env from %s:%s **
  ",
  		       CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
0ac7d722e   Simon Glass   env: Move get/set...
180
  		env_set_default(NULL, 0);
c59519919   Simon Glass   env: Adjust the l...
181
  		return -EIO;
2b74433f3   Joe Hershberger   env: Add support ...
182
  	}
2166ebf78   Simon Goldschmidt   env: make env dri...
183
  	return env_import(buf, 1);
2b74433f3   Joe Hershberger   env: Add support ...
184
  }
785881f77   Joe Hershberger   env: Add redundan...
185
  #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */
4415f1d1f   Simon Glass   env: Create a loc...
186
187
188
  
  U_BOOT_ENV_LOCATION(ubi) = {
  	.location	= ENVL_UBI,
344ca7950   Marek Vasut   env: ubi: Add mis...
189
  	ENV_NAME("UBI")
e5bce247b   Simon Glass   env: Switch over ...
190
191
  	.load		= env_ubi_load,
  	.save		= env_save_ptr(env_ubi_save),
4415f1d1f   Simon Glass   env: Create a loc...
192
  };