Blame view

cmd/zfs.c 3.64 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
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.
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
9
10
11
12
13
14
   */
  
  #include <common.h>
  #include <part.h>
  #include <config.h>
  #include <command.h>
c7694dd48   Simon Glass   env: Move env_set...
15
  #include <env.h>
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
16
17
18
19
20
21
22
23
24
25
  #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
  	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...
51
  	filename = env_get("bootfile");
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
52
53
  	switch (argc) {
  	case 3:
00caae6d4   Simon Glass   env: Rename geten...
54
  		addr_str = env_get("loadaddr");
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
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
  		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...
80
  	part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
412045704   Rob Herring   cmd_zfs: use comm...
81
  	if (part < 0)
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
82
  		return 1;
4d3c95f5e   Jorgen Lundman   zfs: Add ZFS file...
83

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

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

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