global: Remove unused CONFIG defines
[platform/kernel/u-boot.git] / cmd / fastboot.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2008 - 2009 Windriver, <www.windriver.com>
4  * Author: Tom Rix <Tom.Rix@windriver.com>
5  *
6  * (C) Copyright 2014 Linaro, Ltd.
7  * Rob Herring <robh@kernel.org>
8  */
9 #include <common.h>
10 #include <command.h>
11 #include <console.h>
12 #include <g_dnl.h>
13 #include <fastboot.h>
14 #include <net.h>
15 #include <usb.h>
16 #include <watchdog.h>
17 #include <linux/stringify.h>
18
19 static int do_fastboot_udp(int argc, char *const argv[],
20                            uintptr_t buf_addr, size_t buf_size)
21 {
22         int err;
23
24         if (!CONFIG_IS_ENABLED(UDP_FUNCTION_FASTBOOT)) {
25                 pr_err("Fastboot UDP not enabled\n");
26                 return CMD_RET_FAILURE;
27         }
28
29         err = net_loop(FASTBOOT);
30
31         if (err < 0) {
32                 printf("fastboot udp error: %d\n", err);
33                 return CMD_RET_FAILURE;
34         }
35
36         return CMD_RET_SUCCESS;
37 }
38
39 static int do_fastboot_usb(int argc, char *const argv[],
40                            uintptr_t buf_addr, size_t buf_size)
41 {
42         int controller_index;
43         char *usb_controller;
44         char *endp;
45         int ret;
46
47         if (!CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT)) {
48                 pr_err("Fastboot USB not enabled\n");
49                 return CMD_RET_FAILURE;
50         }
51
52         if (argc < 2)
53                 return CMD_RET_USAGE;
54
55         usb_controller = argv[1];
56         controller_index = simple_strtoul(usb_controller, &endp, 0);
57         if (*endp != '\0') {
58                 pr_err("Error: Wrong USB controller index format\n");
59                 return CMD_RET_FAILURE;
60         }
61
62         ret = usb_gadget_initialize(controller_index);
63         if (ret) {
64                 pr_err("USB init failed: %d\n", ret);
65                 return CMD_RET_FAILURE;
66         }
67
68         g_dnl_clear_detach();
69         ret = g_dnl_register("usb_dnl_fastboot");
70         if (ret)
71                 return ret;
72
73         if (!g_dnl_board_usb_cable_connected()) {
74                 puts("\rUSB cable not detected.\n" \
75                      "Command exit.\n");
76                 ret = CMD_RET_FAILURE;
77                 goto exit;
78         }
79
80         while (1) {
81                 if (g_dnl_detach())
82                         break;
83                 if (ctrlc())
84                         break;
85                 schedule();
86                 usb_gadget_handle_interrupts(controller_index);
87         }
88
89         ret = CMD_RET_SUCCESS;
90
91 exit:
92         usb_gadget_release(controller_index);
93         g_dnl_unregister();
94         g_dnl_clear_detach();
95
96         return ret;
97 }
98
99 static int do_fastboot(struct cmd_tbl *cmdtp, int flag, int argc,
100                        char *const argv[])
101 {
102         uintptr_t buf_addr = (uintptr_t)NULL;
103         size_t buf_size = 0;
104
105         if (argc < 2)
106                 return CMD_RET_USAGE;
107
108         while (argc > 1 && **(argv + 1) == '-') {
109                 char *arg = *++argv;
110
111                 --argc;
112                 while (*++arg) {
113                         switch (*arg) {
114                         case 'l':
115                                 if (--argc <= 0)
116                                         return CMD_RET_USAGE;
117                                 buf_addr = hextoul(*++argv, NULL);
118                                 goto NXTARG;
119
120                         case 's':
121                                 if (--argc <= 0)
122                                         return CMD_RET_USAGE;
123                                 buf_size = hextoul(*++argv, NULL);
124                                 goto NXTARG;
125
126                         default:
127                                 return CMD_RET_USAGE;
128                         }
129                 }
130 NXTARG:
131                 ;
132         }
133
134         /* Handle case when USB controller param is just '-' */
135         if (argc == 1) {
136                 pr_err("Error: Incorrect USB controller index\n");
137                 return CMD_RET_USAGE;
138         }
139
140         fastboot_init((void *)buf_addr, buf_size);
141
142         if (!strcmp(argv[1], "udp"))
143                 return do_fastboot_udp(argc, argv, buf_addr, buf_size);
144
145         if (!strcmp(argv[1], "usb")) {
146                 argv++;
147                 argc--;
148         }
149
150         return do_fastboot_usb(argc, argv, buf_addr, buf_size);
151 }
152
153 U_BOOT_CMD(
154         fastboot, CONFIG_SYS_MAXARGS, 1, do_fastboot,
155         "run as a fastboot usb or udp device",
156         "[-l addr] [-s size] usb <controller> | udp\n"
157         "\taddr - address of buffer used during data transfers ("
158         __stringify(CONFIG_FASTBOOT_BUF_ADDR) ")\n"
159         "\tsize - size of buffer used during data transfers ("
160         __stringify(CONFIG_FASTBOOT_BUF_SIZE) ")"
161 );