Blame view

env/ext4.c 2.83 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
fd1000b9c   Stuart Longland   common: Add suppo...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   * (c) Copyright 2016 by VRT Technology
   *
   * Author:
   *  Stuart Longland <stuartl@vrt.com.au>
   *
   * Based on FAT environment driver
   * (c) Copyright 2011 by Tigris Elektronik GmbH
   *
   * Author:
   *  Maximilian Schwerin <mvs@tigris.de>
   *
   * and EXT4 filesystem implementation
   * (C) Copyright 2011 - 2012 Samsung Electronics
   * EXT4 filesystem implementation in Uboot by
   * Uma Shankar <uma.shankar@samsung.com>
   * Manjunatha C Achar <a.manjunatha@samsung.com>
fd1000b9c   Stuart Longland   common: Add suppo...
19
20
21
22
23
24
25
26
   */
  
  #include <common.h>
  
  #include <command.h>
  #include <environment.h>
  #include <linux/stddef.h>
  #include <malloc.h>
bd62e2419   Andrej Rosano   common: Fix suppo...
27
  #include <memalign.h>
fd1000b9c   Stuart Longland   common: Add suppo...
28
29
30
31
  #include <search.h>
  #include <errno.h>
  #include <ext4fs.h>
  #include <mmc.h>
fd1000b9c   Stuart Longland   common: Add suppo...
32
  #ifdef CONFIG_CMD_SAVEENV
e5bce247b   Simon Glass   env: Switch over ...
33
  static int env_ext4_save(void)
fd1000b9c   Stuart Longland   common: Add suppo...
34
35
  {
  	env_t	env_new;
bd62e2419   Andrej Rosano   common: Fix suppo...
36
  	struct blk_desc *dev_desc = NULL;
fd1000b9c   Stuart Longland   common: Add suppo...
37
38
39
40
41
42
43
  	disk_partition_t info;
  	int dev, part;
  	int err;
  
  	err = env_export(&env_new);
  	if (err)
  		return err;
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
44
45
46
  	part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE,
  				       CONFIG_ENV_EXT4_DEVICE_AND_PART,
  				       &dev_desc, &info, 1);
fd1000b9c   Stuart Longland   common: Add suppo...
47
48
  	if (part < 0)
  		return 1;
bd62e2419   Andrej Rosano   common: Fix suppo...
49
  	dev = dev_desc->devnum;
fd1000b9c   Stuart Longland   common: Add suppo...
50
51
52
53
54
55
  	ext4fs_set_blk_dev(dev_desc, &info);
  
  	if (!ext4fs_mount(info.size)) {
  		printf("
  ** Unable to use %s %s for saveenv **
  ",
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
56
57
  		       CONFIG_ENV_EXT4_INTERFACE,
  		       CONFIG_ENV_EXT4_DEVICE_AND_PART);
fd1000b9c   Stuart Longland   common: Add suppo...
58
59
  		return 1;
  	}
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
60
61
  	err = ext4fs_write(CONFIG_ENV_EXT4_FILE, (void *)&env_new,
  			   sizeof(env_t));
fd1000b9c   Stuart Longland   common: Add suppo...
62
63
64
65
66
67
  	ext4fs_close();
  
  	if (err == -1) {
  		printf("
  ** Unable to write \"%s\" from %s%d:%d **
  ",
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
68
69
  			CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev,
  			part);
fd1000b9c   Stuart Longland   common: Add suppo...
70
71
72
73
74
75
76
77
  		return 1;
  	}
  
  	puts("done
  ");
  	return 0;
  }
  #endif /* CONFIG_CMD_SAVEENV */
c59519919   Simon Glass   env: Adjust the l...
78
  static int env_ext4_load(void)
fd1000b9c   Stuart Longland   common: Add suppo...
79
80
  {
  	ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE);
bd62e2419   Andrej Rosano   common: Fix suppo...
81
  	struct blk_desc *dev_desc = NULL;
fd1000b9c   Stuart Longland   common: Add suppo...
82
83
84
  	disk_partition_t info;
  	int dev, part;
  	int err;
bd62e2419   Andrej Rosano   common: Fix suppo...
85
  	loff_t off;
fd1000b9c   Stuart Longland   common: Add suppo...
86

95058fbb9   Heinrich Schuchardt   env: mmc/fat/ext4...
87
  #ifdef CONFIG_MMC
26862b4a4   Faiz Abbas   env: mmc/fat/ext4...
88
89
  	if (!strcmp(CONFIG_ENV_EXT4_INTERFACE, "mmc"))
  		mmc_initialize(NULL);
95058fbb9   Heinrich Schuchardt   env: mmc/fat/ext4...
90
  #endif
26862b4a4   Faiz Abbas   env: mmc/fat/ext4...
91

1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
92
93
94
  	part = blk_get_device_part_str(CONFIG_ENV_EXT4_INTERFACE,
  				       CONFIG_ENV_EXT4_DEVICE_AND_PART,
  				       &dev_desc, &info, 1);
fd1000b9c   Stuart Longland   common: Add suppo...
95
96
  	if (part < 0)
  		goto err_env_relocate;
bd62e2419   Andrej Rosano   common: Fix suppo...
97
  	dev = dev_desc->devnum;
fd1000b9c   Stuart Longland   common: Add suppo...
98
99
100
101
102
103
  	ext4fs_set_blk_dev(dev_desc, &info);
  
  	if (!ext4fs_mount(info.size)) {
  		printf("
  ** Unable to use %s %s for loading the env **
  ",
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
104
105
  		       CONFIG_ENV_EXT4_INTERFACE,
  		       CONFIG_ENV_EXT4_DEVICE_AND_PART);
fd1000b9c   Stuart Longland   common: Add suppo...
106
107
  		goto err_env_relocate;
  	}
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
108
109
  	err = ext4_read_file(CONFIG_ENV_EXT4_FILE, buf, 0, CONFIG_ENV_SIZE,
  			     &off);
fd1000b9c   Stuart Longland   common: Add suppo...
110
111
112
113
114
115
  	ext4fs_close();
  
  	if (err == -1) {
  		printf("
  ** Unable to read \"%s\" from %s%d:%d **
  ",
1087a7942   Jorge Ramirez-Ortiz   env: enable acces...
116
117
  			CONFIG_ENV_EXT4_FILE, CONFIG_ENV_EXT4_INTERFACE, dev,
  			part);
fd1000b9c   Stuart Longland   common: Add suppo...
118
119
  		goto err_env_relocate;
  	}
2166ebf78   Simon Goldschmidt   env: make env dri...
120
  	return env_import(buf, 1);
fd1000b9c   Stuart Longland   common: Add suppo...
121
122
  
  err_env_relocate:
c5d548a9f   Yaniv Levinsky   env: common: acce...
123
  	set_default_env(NULL, 0);
c59519919   Simon Glass   env: Adjust the l...
124
125
  
  	return -EIO;
fd1000b9c   Stuart Longland   common: Add suppo...
126
  }
4415f1d1f   Simon Glass   env: Create a loc...
127
128
129
  
  U_BOOT_ENV_LOCATION(ext4) = {
  	.location	= ENVL_EXT4,
ac358beb8   Simon Glass   env: Drop the env...
130
  	ENV_NAME("EXT4")
e5bce247b   Simon Glass   env: Switch over ...
131
132
  	.load		= env_ext4_load,
  	.save		= env_save_ptr(env_ext4_save),
4415f1d1f   Simon Glass   env: Create a loc...
133
  };