Blame view

cmd/zfs.c 3.64 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
   */
  
  #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
bd42a9426   Patrick Delaunay   disk: convert CON...
26
  #if !CONFIG_IS_ENABLED(DOS_PARTITION) && !CONFIG_IS_ENABLED(EFI_PARTITION)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
27
28
29
30
31
32
  #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 ...
33
  static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
34
35
  {
  	char *filename = NULL;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
36
  	int dev;
412045704   Rob Herring   cmd_zfs: use comm...
37
  	int part;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
38
  	ulong addr = 0;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
39
  	disk_partition_t info;
4101f6879   Simon Glass   dm: Drop the bloc...
40
  	struct blk_desc *dev_desc;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
41
42
43
44
45
46
47
48
49
50
51
  	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);
00caae6d4   Simon Glass   env: Rename geten...
52
  	filename = env_get("bootfile");
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
53
54
  	switch (argc) {
  	case 3:
00caae6d4   Simon Glass   env: Rename geten...
55
  		addr_str = env_get("loadaddr");
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
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
  		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;
  	}
e35929e4a   Simon Glass   dm: blk: Rename g...
81
  	part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
412045704   Rob Herring   cmd_zfs: use comm...
82
  	if (part < 0)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
83
  		return 1;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
84

bcce53d04   Simon Glass   dm: block: Rename...
85
  	dev = dev_desc->devnum;
412045704   Rob Herring   cmd_zfs: use comm...
86
87
88
89
  	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...
90

412045704   Rob Herring   cmd_zfs: use comm...
91
92
  	zfs_set_blk_dev(dev_desc, &info);
  	vdev.part_length = info.size;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
93
94
95
96
  
  	memset(&zfile, 0, sizeof(zfile));
  	zfile.device = &vdev;
  	if (zfs_open(&zfile, filename)) {
01adbce2a   Luka Perkov   cmd_zfs: normaliz...
97
98
  		printf("** File not found %s **
  ", filename);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
99
100
101
102
103
104
105
  		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...
106
107
  		printf("** Unable to read \"%s\" from %s %d:%d **
  ",
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
108
109
110
111
112
113
114
115
116
117
118
119
  			   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);
018f53032   Simon Glass   env: Rename commo...
120
  	env_set_hex("filesize", zfile.size);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
121
122
123
124
125
126
127
128
129
130
131
132
133
  
  	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 ...
134
  static int do_zfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
135
136
  {
  	const char *filename = "/";
412045704   Rob Herring   cmd_zfs: use comm...
137
  	int part;
4101f6879   Simon Glass   dm: Drop the bloc...
138
  	struct blk_desc *dev_desc;
412045704   Rob Herring   cmd_zfs: use comm...
139
  	disk_partition_t info;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
140
  	struct device_s vdev;
412045704   Rob Herring   cmd_zfs: use comm...
141
  	if (argc < 2)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
142
  		return cmd_usage(cmdtp);
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
143
144
  	if (argc == 4)
  		filename = argv[3];
e35929e4a   Simon Glass   dm: blk: Rename g...
145
  	part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
412045704   Rob Herring   cmd_zfs: use comm...
146
  	if (part < 0)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
147
  		return 1;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
148

412045704   Rob Herring   cmd_zfs: use comm...
149
150
  	zfs_set_blk_dev(dev_desc, &info);
  	vdev.part_length = info.size;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
  
  	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");