part: Drop disk_partition_t typedef
[platform/kernel/u-boot.git] / cmd / fat.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2002
4  * Richard Jones, rjones@nexus-tech.net
5  */
6
7 /*
8  * Boot support
9  */
10 #include <common.h>
11 #include <mapmem.h>
12 #include <fat.h>
13 #include <fs.h>
14 #include <asm/cache.h>
15
16 int do_fat_size(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
17 {
18         return do_size(cmdtp, flag, argc, argv, FS_TYPE_FAT);
19 }
20
21 U_BOOT_CMD(
22         fatsize,        4,      0,      do_fat_size,
23         "determine a file's size",
24         "<interface> <dev[:part]> <filename>\n"
25         "    - Find file 'filename' from 'dev' on 'interface'\n"
26         "      and determine its size."
27 );
28
29 int do_fat_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
30 {
31         return do_load(cmdtp, flag, argc, argv, FS_TYPE_FAT);
32 }
33
34
35 U_BOOT_CMD(
36         fatload,        7,      0,      do_fat_fsload,
37         "load binary file from a dos filesystem",
38         "<interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]\n"
39         "    - Load binary file 'filename' from 'dev' on 'interface'\n"
40         "      to address 'addr' from dos filesystem.\n"
41         "      'pos' gives the file position to start loading from.\n"
42         "      If 'pos' is omitted, 0 is used. 'pos' requires 'bytes'.\n"
43         "      'bytes' gives the size to load. If 'bytes' is 0 or omitted,\n"
44         "      the load stops on end of file.\n"
45         "      If either 'pos' or 'bytes' are not aligned to\n"
46         "      ARCH_DMA_MINALIGN then a misaligned buffer warning will\n"
47         "      be printed and performance will suffer for the load."
48 );
49
50 static int do_fat_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
51 {
52         return do_ls(cmdtp, flag, argc, argv, FS_TYPE_FAT);
53 }
54
55 U_BOOT_CMD(
56         fatls,  4,      1,      do_fat_ls,
57         "list files in a directory (default /)",
58         "<interface> [<dev[:part]>] [directory]\n"
59         "    - list files from 'dev' on 'interface' in a 'directory'"
60 );
61
62 static int do_fat_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc,
63                          char * const argv[])
64 {
65         int dev, part;
66         struct blk_desc *dev_desc;
67         struct disk_partition info;
68
69         if (argc < 2) {
70                 printf("usage: fatinfo <interface> [<dev[:part]>]\n");
71                 return 0;
72         }
73
74         part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
75         if (part < 0)
76                 return 1;
77
78         dev = dev_desc->devnum;
79         if (fat_set_blk_dev(dev_desc, &info) != 0) {
80                 printf("\n** Unable to use %s %d:%d for fatinfo **\n",
81                         argv[1], dev, part);
82                 return 1;
83         }
84         return file_fat_detectfs();
85 }
86
87 U_BOOT_CMD(
88         fatinfo,        3,      1,      do_fat_fsinfo,
89         "print information about filesystem",
90         "<interface> [<dev[:part]>]\n"
91         "    - print information about filesystem from 'dev' on 'interface'"
92 );
93
94 #ifdef CONFIG_FAT_WRITE
95 static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
96                 int argc, char * const argv[])
97 {
98         loff_t size;
99         int ret;
100         unsigned long addr;
101         unsigned long count;
102         long offset;
103         struct blk_desc *dev_desc = NULL;
104         struct disk_partition info;
105         int dev = 0;
106         int part = 1;
107         void *buf;
108
109         if (argc < 5)
110                 return cmd_usage(cmdtp);
111
112         part = blk_get_device_part_str(argv[1], argv[2], &dev_desc, &info, 1);
113         if (part < 0)
114                 return 1;
115
116         dev = dev_desc->devnum;
117
118         if (fat_set_blk_dev(dev_desc, &info) != 0) {
119                 printf("\n** Unable to use %s %d:%d for fatwrite **\n",
120                         argv[1], dev, part);
121                 return 1;
122         }
123         addr = simple_strtoul(argv[3], NULL, 16);
124         count = (argc <= 5) ? 0 : simple_strtoul(argv[5], NULL, 16);
125         /* offset should be a hex, but "-1" is allowed */
126         offset = (argc <= 6) ? 0 : simple_strtol(argv[6], NULL, 16);
127
128         buf = map_sysmem(addr, count);
129         ret = file_fat_write(argv[4], buf, offset, count, &size);
130         unmap_sysmem(buf);
131         if (ret < 0) {
132                 printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
133                         argv[4], argv[1], dev, part);
134                 return 1;
135         }
136
137         printf("%llu bytes written\n", size);
138
139         return 0;
140 }
141
142 U_BOOT_CMD(
143         fatwrite,       7,      0,      do_fat_fswrite,
144         "write file into a dos filesystem",
145         "<interface> <dev[:part]> <addr> <filename> [<bytes> [<offset>]]\n"
146         "    - write file 'filename' from the address 'addr' in RAM\n"
147         "      to 'dev' on 'interface'"
148 );
149
150 static int do_fat_rm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
151 {
152         return do_rm(cmdtp, flag, argc, argv, FS_TYPE_FAT);
153 }
154
155 U_BOOT_CMD(
156         fatrm,  4,      1,      do_fat_rm,
157         "delete a file",
158         "<interface> [<dev[:part]>] <filename>\n"
159         "    - delete a file from 'dev' on 'interface'"
160 );
161
162 static int do_fat_mkdir(cmd_tbl_t *cmdtp, int flag, int argc,
163                         char * const argv[])
164 {
165         return do_mkdir(cmdtp, flag, argc, argv, FS_TYPE_FAT);
166 }
167
168 U_BOOT_CMD(
169         fatmkdir,       4,      1,      do_fat_mkdir,
170         "create a directory",
171         "<interface> [<dev[:part]>] <directory>\n"
172         "    - create a directory in 'dev' on 'interface'"
173 );
174 #endif