Blame view

common/cmd_zfs.c 3.63 KB
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
1
2
3
4
5
6
7
8
  /*
   *
   * ZFS filesystem porting to Uboot by
   * Jorgen Lundman <lundman at lundman.net>
   *
   * zfsfs support
   * made from existing GRUB Sources by Sun, GNU and others.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
9
   * SPDX-License-Identifier:	GPL-2.0+
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
   */
  
  #include <common.h>
  #include <part.h>
  #include <config.h>
  #include <command.h>
  #include <image.h>
  #include <linux/ctype.h>
  #include <asm/byteorder.h>
  #include <zfs_common.h>
  #include <linux/stat.h>
  #include <malloc.h>
  
  #if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
  #include <usb.h>
  #endif
  
  #if !defined(CONFIG_DOS_PARTITION) && !defined(CONFIG_EFI_PARTITION)
  #error DOS or EFI partition support must be selected
  #endif
  
  #define DOS_PART_MAGIC_OFFSET	0x1fe
  #define DOS_FS_TYPE_OFFSET	0x36
  #define DOS_FS32_TYPE_OFFSET	0x52
af8d1d3f7   Stefan Roese   ZFS: Fix compile ...
34
  static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
35
36
  {
  	char *filename = NULL;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
37
  	int dev;
412045704   Rob Herring   cmd_zfs: use comm...
38
  	int part;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
39
  	ulong addr = 0;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
40
  	disk_partition_t info;
412045704   Rob Herring   cmd_zfs: use comm...
41
  	block_dev_desc_t *dev_desc;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
42
43
44
45
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
71
72
73
74
75
76
77
78
79
80
81
  	char buf[12];
  	unsigned long count;
  	const char *addr_str;
  	struct zfs_file zfile;
  	struct device_s vdev;
  
  	if (argc < 3)
  		return CMD_RET_USAGE;
  
  	count = 0;
  	addr = simple_strtoul(argv[3], NULL, 16);
  	filename = getenv("bootfile");
  	switch (argc) {
  	case 3:
  		addr_str = getenv("loadaddr");
  		if (addr_str != NULL)
  			addr = simple_strtoul(addr_str, NULL, 16);
  		else
  			addr = CONFIG_SYS_LOAD_ADDR;
  
  		break;
  	case 4:
  		break;
  	case 5:
  		filename = argv[4];
  		break;
  	case 6:
  		filename = argv[4];
  		count = simple_strtoul(argv[5], NULL, 16);
  		break;
  
  	default:
  		return cmd_usage(cmdtp);
  	}
  
  	if (!filename) {
  		puts("** No boot file defined **
  ");
  		return 1;
  	}
10a37fd7a   Stephen Warren   disk: get_device_...
82
  	part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
412045704   Rob Herring   cmd_zfs: use comm...
83
  	if (part < 0)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
84
  		return 1;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
85

412045704   Rob Herring   cmd_zfs: use comm...
86
87
88
89
90
  	dev = dev_desc->dev;
  	printf("Loading file \"%s\" from %s device %d%c%c
  ",
  		filename, argv[1], dev,
  		part ? ':' : ' ', part ? part + '0' : ' ');
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
91

412045704   Rob Herring   cmd_zfs: use comm...
92
93
  	zfs_set_blk_dev(dev_desc, &info);
  	vdev.part_length = info.size;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
94
95
96
97
  
  	memset(&zfile, 0, sizeof(zfile));
  	zfile.device = &vdev;
  	if (zfs_open(&zfile, filename)) {
01adbce2a   Luka Perkov   cmd_zfs: normaliz...
98
99
  		printf("** File not found %s **
  ", filename);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
100
101
102
103
104
105
106
  		return 1;
  	}
  
  	if ((count < zfile.size) && (count != 0))
  		zfile.size = (uint64_t)count;
  
  	if (zfs_read(&zfile, (char *)addr, zfile.size) != zfile.size) {
412045704   Rob Herring   cmd_zfs: use comm...
107
108
  		printf("** Unable to read \"%s\" from %s %d:%d **
  ",
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
109
110
111
112
113
114
115
116
117
118
119
120
  			   filename, argv[1], dev, part);
  		zfs_close(&zfile);
  		return 1;
  	}
  
  	zfs_close(&zfile);
  
  	/* Loading ok, update default load address */
  	load_addr = addr;
  
  	printf("%llu bytes read
  ", zfile.size);
41ef372c1   Simon Glass   common: Use new n...
121
  	setenv_hex("filesize", zfile.size);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
122
123
124
125
126
127
128
129
130
131
132
133
134
  
  	return 0;
  }
  
  
  int zfs_print(const char *entry, const struct zfs_dirhook_info *data)
  {
  	printf("%s %s
  ",
  		   data->dir ? "<DIR> " : "		 ",
  		   entry);
  	return 0; /* 0 continue, 1 stop */
  }
af8d1d3f7   Stefan Roese   ZFS: Fix compile ...
135
  static int do_zfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
136
137
  {
  	const char *filename = "/";
412045704   Rob Herring   cmd_zfs: use comm...
138
139
140
  	int part;
  	block_dev_desc_t *dev_desc;
  	disk_partition_t info;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
141
  	struct device_s vdev;
412045704   Rob Herring   cmd_zfs: use comm...
142
  	if (argc < 2)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
143
  		return cmd_usage(cmdtp);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
144
145
  	if (argc == 4)
  		filename = argv[3];
10a37fd7a   Stephen Warren   disk: get_device_...
146
  	part = get_device_and_partition(argv[1], argv[2], &dev_desc, &info, 1);
412045704   Rob Herring   cmd_zfs: use comm...
147
  	if (part < 0)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
148
  		return 1;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
149

412045704   Rob Herring   cmd_zfs: use comm...
150
151
  	zfs_set_blk_dev(dev_desc, &info);
  	vdev.part_length = info.size;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  
  	zfs_ls(&vdev, filename,
  		   zfs_print);
  
  	return 0;
  }
  
  
  U_BOOT_CMD(zfsls, 4, 1, do_zfs_ls,
  		   "list files in a directory (default /)",
  		   "<interface> <dev[:part]> [directory]
  "
  		   "	  - list files from 'dev' on 'interface' in a '/DATASET/@/$dir/'");
  
  U_BOOT_CMD(zfsload, 6, 0, do_zfs_load,
  		   "load binary file from a ZFS filesystem",
  		   "<interface> <dev[:part]> [addr] [filename] [bytes]
  "
  		   "	  - load binary file '/DATASET/@/$dir/$file' from 'dev' on 'interface'
  "
  		   "		 to address 'addr' from ZFS filesystem");