1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2008
4 * Stefan Roese, DENX Software Engineering, sr@denx.de.
5 */
6
7
8/*
9 * UBIFS command support
10 */
11
12#undef DEBUG
13
14#include <common.h>
15#include <config.h>
16#include <command.h>
17#include <log.h>
18#include <ubifs_uboot.h>
19
20static int ubifs_initialized;
21static int ubifs_mounted;
22
23int cmd_ubifs_mount(char *vol_name)
24{
25	int ret;
26
27	debug("Using volume %s\n", vol_name);
28
29	if (ubifs_initialized == 0) {
30		ubifs_init();
31		ubifs_initialized = 1;
32	}
33
34	ret = uboot_ubifs_mount(vol_name);
35	if (ret)
36		return CMD_RET_FAILURE;
37
38	ubifs_mounted = 1;
39
40	return ret;
41}
42
43static int do_ubifs_mount(struct cmd_tbl *cmdtp, int flag, int argc,
44			  char *const argv[])
45{
46	char *vol_name;
47
48	if (argc != 2)
49		return CMD_RET_USAGE;
50
51	vol_name = argv[1];
52
53	return cmd_ubifs_mount(vol_name);
54}
55
56int ubifs_is_mounted(void)
57{
58	return ubifs_mounted;
59}
60
61int cmd_ubifs_umount(void)
62{
63	if (ubifs_initialized == 0) {
64		printf("No UBIFS volume mounted!\n");
65		return CMD_RET_FAILURE;
66	}
67
68	uboot_ubifs_umount();
69	ubifs_mounted = 0;
70	ubifs_initialized = 0;
71
72	return 0;
73}
74
75static int do_ubifs_umount(struct cmd_tbl *cmdtp, int flag, int argc,
76			   char *const argv[])
77{
78	if (argc != 1)
79		return CMD_RET_USAGE;
80
81	return cmd_ubifs_umount();
82}
83
84static int do_ubifs_ls(struct cmd_tbl *cmdtp, int flag, int argc,
85		       char *const argv[])
86{
87	char *filename = "/";
88	int ret;
89
90	if (!ubifs_mounted) {
91		printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
92		return CMD_RET_FAILURE;
93	}
94
95	if (argc == 2)
96		filename = argv[1];
97	debug("Using filename %s\n", filename);
98
99	ret = ubifs_ls(filename);
100	if (ret) {
101		printf("** File not found %s **\n", filename);
102		ret = CMD_RET_FAILURE;
103	}
104
105	return ret;
106}
107
108static int do_ubifs_load(struct cmd_tbl *cmdtp, int flag, int argc,
109			 char *const argv[])
110{
111	char *filename;
112	char *endp;
113	int ret;
114	unsigned long addr;
115	u32 size = 0;
116
117	if (!ubifs_mounted) {
118		printf("UBIFS not mounted, use ubifs mount to mount volume first!\n");
119		return CMD_RET_FAILURE;
120	}
121
122	if (argc < 3)
123		return CMD_RET_USAGE;
124
125	addr = hextoul(argv[1], &endp);
126	if (endp == argv[1])
127		return CMD_RET_USAGE;
128
129	filename = argv[2];
130
131	if (argc == 4) {
132		size = hextoul(argv[3], &endp);
133		if (endp == argv[3])
134			return CMD_RET_USAGE;
135	}
136	debug("Loading file '%s' to address 0x%08lx (size %d)\n", filename, addr, size);
137
138	ret = ubifs_load(filename, addr, size);
139	if (ret) {
140		printf("** File not found %s **\n", filename);
141		ret = CMD_RET_FAILURE;
142	}
143
144	return ret;
145}
146
147U_BOOT_CMD(
148	ubifsmount, 2, 0, do_ubifs_mount,
149	"mount UBIFS volume",
150	"<volume-name>\n"
151	"    - mount 'volume-name' volume"
152);
153
154U_BOOT_CMD(
155	ubifsumount, 1, 0, do_ubifs_umount,
156	"unmount UBIFS volume",
157	"    - unmount current volume"
158);
159
160U_BOOT_CMD(
161	ubifsls, 2, 0, do_ubifs_ls,
162	"list files in a directory",
163	"[directory]\n"
164	"    - list files in a 'directory' (default '/')"
165);
166
167U_BOOT_CMD(
168	ubifsload, 4, 0, do_ubifs_load,
169	"load file from an UBIFS filesystem",
170	"<addr> <filename> [bytes]\n"
171	"    - load file 'filename' to address 'addr'"
172);
173