1/*
2 * (c) Copyright 2011 by Tigris Elektronik GmbH
3 *
4 * Author:
5 *  Maximilian Schwerin <mvs@tigris.de>
6 *
7 * SPDX-License-Identifier:	GPL-2.0+
8 */
9
10#include <common.h>
11
12#include <command.h>
13#include <environment.h>
14#include <linux/stddef.h>
15#include <malloc.h>
16#include <search.h>
17#include <errno.h>
18#include <ext4fs.h>
19
20char *env_name_spec = "EXT4";
21
22env_t *env_ptr;
23
24DECLARE_GLOBAL_DATA_PTR;
25
26int env_init(void)
27{
28	/* use default */
29	gd->env_addr = (ulong)&default_environment[0];
30	gd->env_valid = 1;
31
32	return 0;
33}
34
35#ifdef CONFIG_CMD_SAVEENV
36int saveenv(void)
37{
38	env_t	env_new;
39	ssize_t	len;
40	char	*res;
41	block_dev_desc_t *dev_desc = NULL;
42	int dev = EXT4_ENV_DEVICE;
43	int part = EXT4_ENV_PART;
44	int err;
45
46	res = (char *)&env_new.data;
47	len = hexport_r(&env_htab, '\0', 0, &res, ENV_SIZE, 0, NULL);
48	if (len < 0) {
49		error("Cannot export environment: errno = %d\n", errno);
50		return 1;
51	}
52
53	dev_desc = get_dev(EXT4_ENV_INTERFACE, dev);
54	if (dev_desc == NULL) {
55		printf("Failed to find %s%d\n",
56			EXT4_ENV_INTERFACE, dev);
57		return 1;
58	}
59
60	err = ext4_register_device(dev_desc, part);
61	if (err) {
62		printf("Failed to register %s%d:%d\n",
63			EXT4_ENV_INTERFACE, dev, part);
64		return 1;
65	}
66
67	env_new.crc = crc32(0, env_new.data, ENV_SIZE);
68	err = ext4fs_write(EXT4_ENV_FILE, (void *)&env_new, sizeof(env_t));
69	ext4fs_close();
70	if (err == -1) {
71		printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
72			EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part);
73		return 1;
74	}
75
76	puts("done\n");
77	return 0;
78}
79#endif /* CONFIG_CMD_SAVEENV */
80
81void env_relocate_spec(void)
82{
83	char buf[CONFIG_ENV_SIZE];
84	block_dev_desc_t *dev_desc = NULL;
85	int dev = EXT4_ENV_DEVICE;
86	int part = EXT4_ENV_PART;
87	int err;
88
89	dev_desc = get_dev(EXT4_ENV_INTERFACE, dev);
90	if (dev_desc == NULL) {
91		printf("Failed to find %s%d\n",
92			EXT4_ENV_INTERFACE, dev);
93		set_default_env(NULL);
94		return;
95	}
96
97	err = ext4_register_device(dev_desc, part);
98	if (err) {
99		printf("Failed to register %s%d:%d\n",
100			EXT4_ENV_INTERFACE, dev, part);
101		set_default_env(NULL);
102		return;
103	}
104
105	err = ext4_read_file(EXT4_ENV_FILE, (uchar *)&buf, 0, CONFIG_ENV_SIZE);
106	ext4fs_close();
107
108	if (err == -1) {
109		printf("\n** Unable to read \"%s\" from %s%d:%d **\n",
110			EXT4_ENV_FILE, EXT4_ENV_INTERFACE, dev, part);
111		set_default_env(NULL);
112		return;
113	}
114
115	env_import(buf, 1);
116}
117